Skip to content

Add a conversation contents drawer for navigating long chats #1026

Description

@paullizer

Summary

Add a right-side conversation contents drawer that indexes user messages and lets users jump directly to earlier points in a long chat without manually scrolling through the full transcript.

User Value

Long conversations are difficult to scan and revisit. User prompts already act as natural section headings: exposing them as a compact contents list makes it much faster to find a topic, compare earlier decisions, or resume work from a specific turn.

Proposed Behavior

  • Add a compact contents control to the chat interface that opens a right-side drawer or off-canvas panel.
  • Build the contents list from user messages only, in conversation order. Assistant, system, tool, and transient status messages are not listed.
  • Derive each entry label from the first meaningful plain-text line of the user message, normalize whitespace, and truncate it to a stable display length. Provide an accessible fallback label for messages without usable text.
  • Selecting an entry scrolls its source message into view, moves keyboard focus appropriately, and briefly highlights the destination without changing conversation data.
  • Indicate the entry nearest the current viewport so users retain their location while scrolling.
  • Rebuild the index when switching conversations and update it when a new user message is committed, messages are loaded, or the active timeline changes.
  • Use a persistent side drawer on viewports where space allows and an off-canvas experience on smaller screens. The drawer must not cover the composer or conflict with existing sidebars, citation panels, or message actions.
  • Render labels as text, not HTML, so message content cannot inject markup into the navigation UI.

Acceptance Criteria

  • The chat interface exposes an accessible control for opening and closing the conversation contents drawer.
  • The drawer lists each persisted user message in chronological order and does not list assistant, system, tool, or temporary messages.
  • Each entry has a concise, readable, plain-text label with safe truncation and a fallback for attachment-only, image-only, or otherwise non-text prompts.
  • Selecting an entry reliably scrolls to the matching message and gives users a visible destination cue.
  • The active or nearest entry updates as the user moves through the conversation without causing scroll loops or noticeable lag.
  • Sending a new prompt updates the index, and switching conversations clears all entries and state from the previous conversation.
  • Long labels and large conversations do not overflow controls, shift the chat layout, or make the drawer unresponsive.
  • Desktop, tablet, and mobile layouts remain usable; the message composer and existing panels are not obscured.
  • The drawer supports keyboard operation, sensible focus management, screen-reader labels, and Escape-to-close behavior where applicable.
  • Client-side rendering uses safe text APIs and never inserts user-authored message content as HTML.
  • UI tests cover filtering by role, ordering, navigation, active-entry tracking, live updates, conversation switching, long text, non-text prompts, keyboard behavior, and responsive layouts.

Notes

  • The first implementation should use user messages as the table-of-contents landmarks; grouping, search, generated summaries, and assistant-message entries can be considered separately.
  • The index can be derived from message data already authorized and loaded by the chat experience; avoid introducing a second source of truth unless message pagination requires a lightweight server-provided index.
  • Relevant implementation areas include the chat template, static/js/chat/chat-messages.js, chat state/conversation switching modules, and existing local Bootstrap off-canvas patterns.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    Status
    Pending Assignment

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions