Skip to content

feat(app): add message timeline navigation strip - #41135

Closed
GoldenStain wants to merge 1 commit into
anomalyco:devfrom
GoldenStain:timeline-message-nav
Closed

GoldenStain wants to merge 1 commit into
anomalyco:devfrom
GoldenStain:timeline-message-nav

Conversation

@GoldenStain

Copy link
Copy Markdown

Issue for this PR

Refs #32999 — message navigation in the session view. This implements the compact variant: a DeepSeek-web style bead strip instead of a full sidebar.

Type of change

  • New feature

What does this PR do?

Long sessions are painful to move around in: the only options are manual scrolling or the fork dialog. This adds a vertical strip of small beads at the edge of the timeline, one per user message. Clicking a bead jumps to that message through the same code path as keyboard message navigation and #message-... links.

Details:

  • MessageTimelineNav renders at the inline-end edge of the timeline (logical CSS, so it flips sides in RTL), hidden via a container query when the panel is too narrow to fit it.
  • The bead at the reading line is highlighted while scrolling. An explicit jump locks the highlight until you scroll. Hovering a bead shows the message text preview plus time (same data source as the fork dialog).
  • Beads shrink when there are too many to fit; the strip scrolls internally and keeps the active bead in view.
  • New general setting preloadTimelineHistory (default on): messages are paginated (first page ~20, then 200/page), so the app keeps loading older pages in the background when a session opens. This lets the strip cover every user message instead of only the loaded ones. Turning it off leaves the strip limited to loaded messages, matching fork-dialog behavior.

How did you verify your code works?

  • Unit tests for the pure picking/layout logic (13 cases).
  • New Playwright smoke spec (session-timeline-nav.spec.ts) against the mock server: strip renders the expected beads in order, clicking jumps (#message-... hash, target row position, active bead), and the preload path requests older pages. Passes locally.
  • Against a real serve backend with a session containing ~94 user messages: all beads appear once preloading finishes, jumps land on the right message, the active bead follows, and the strip flips correctly under forced RTL.
  • bun run typecheck (app + e2e), the unit suite, and oxlint are clean.

Screenshots / recordings

LTR, full history loaded:

ltr

After clicking an older bead:

jump

RTL:

rtl

Checklist

  • I have tested my changes locally
  • I have not included unrelated changes in this PR

Render a vertical strip of bead buttons at the edge of the session
timeline, one per visible user message, similar to the conversation
navigator in other chat UIs. Clicking a bead jumps the timeline to
that message using the same path as keyboard message navigation.
The bead under the reading line stays highlighted while scrolling,
and an explicit jump locks the highlight until the user scrolls.

- new MessageTimelineNav component (beads, hover preview + time,
  active tracking, internal scroll when beads overflow)
- new general setting preloadTimelineHistory (default on) that loads
  older message pages in the background so the strip covers the
  entire session
- localized nav labels in all app locales
- e2e smoke coverage for rendering, jumping, and preloading
@GoldenStain

Copy link
Copy Markdown
Author

Knock knock

@github-actions

github-actions Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Automated PR Cleanup

Thank you for contributing to opencode.

Due to the high volume of PRs from users and AI agents, we periodically close older PRs using automated criteria so maintainers can focus review time on the most active and community-supported contributions.

This PR was closed because it matched the following cleanup criteria:

  • The PR was created more than 1 month ago
  • The PR had fewer than 2 positive reactions
  • Positive reactions are counted as thumbs-up, heart, celebration, or rocket reactions on the PR

PRs created within the last month are not affected by this cleanup.

If you believe this PR was closed incorrectly, or if you are still actively working on it, please leave a comment explaining why it should be reopened. A maintainer can review and reopen it if appropriate.

Thanks again for taking the time to contribute.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant