Skip to content

feat(chat,langgraph): nav v2 — thread drawer + checkpoint marker primitives#241

Merged
blove merged 10 commits into
mainfrom
claude/nav-v2-lib-primitives
May 11, 2026
Merged

feat(chat,langgraph): nav v2 — thread drawer + checkpoint marker primitives#241
blove merged 10 commits into
mainfrom
claude/nav-v2-lib-primitives

Conversation

@blove
Copy link
Copy Markdown
Contributor

@blove blove commented May 11, 2026

Summary

  • Adds two new lib primitives: chat-thread-drawer (slide-in left-edge container with push/overlay modes + scrim) and chat-checkpoint-marker (10px gutter dot with hover/focus Rewind/Fork pill).
  • Extends chat-thread-list default item template with optional updatedAt → relative-time line.
  • Extends chat-message with optional [checkpointId] input mounting a marker in a 14px left gutter; replay/fork outputs bubble.
  • Adds agent.messageCheckpoints() to the LangGraph adapter — ReadonlyMap<messageId, checkpointId> computed from history.

Together these primitives enable the threads + checkpoints nav v2 design. They are independently usable; follow-up PR will wire them into the canonical chat demo.

Test plan

  • nx test chat green for new specs (chat-checkpoint-marker, chat-thread-drawer, chat-thread-list extensions, chat-message gutter)
  • nx test langgraph green for new computeMessageCheckpoints tests
  • nx build chat + nx build langgraph green
  • CI green

Generated with Claude Code

blove added 7 commits May 11, 2026 08:42
Renders a 10px dot in a 14px gutter slot, with a hover/focus pill
exposing Rewind + Fork actions. Replaces the right-side timeline
slider as the primary time-travel surface for inline use in
chat-message gutters.
Slide-in container at left viewport edge, hosting projected
content (typically chat-thread-list). Two modes: push (no scrim;
host page reflows by setting padding-left on its main column)
and overlay (scrim closes on click). Escape key closes.
…lative time

Extends the Thread type with an optional updatedAt epoch-ms field.
When present, the default item template renders a second line with
a relative-time label (just now / 5 min ago / 2 hr ago / 3 day ago).
Existing templateRef projection still wins when provided, so
back-compat is preserved.
New optional [checkpointId] input mounts a chat-checkpoint-marker
in a left gutter (14px). Bubbles replayRequested + forkRequested
as message-level outputs so consumers can wire to time-travel
handlers. Gutter collapses to zero width when checkpointId is
unset — back-compat preserved for non-time-travel consumers.
Reactive ReadonlyMap<messageId, checkpointId> computed from
history(). Each AIMessage pairs with the most recent checkpoint
where it is the tail message. Consumed by chat-message gutter
markers to anchor inline time-travel actions on each assistant
turn.
@vercel
Copy link
Copy Markdown

vercel Bot commented May 11, 2026

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cacheplane Ready Ready Preview, Comment May 11, 2026 4:49pm

Request Review

Three lint errors flagged by CI on PR #241:
- chat-thread-drawer scrim was a <div> with a (click) and no key
  handler / focus support. Change to <button type="button"
  aria-label="Close conversations"> so the close action is keyboard-
  reachable and screen-reader announced.
- chat-thread-list default item template used \`!= null\`; the lib's
  Angular template lint config enforces \`!==\`. Switch to \`!== undefined\`
  since updatedAt is typed \`number | undefined\` (never null).
- agent-with-history.ts had an unused <S = unknown> generic that
  triggered no-unused-vars. The neighboring Agent doesn't take a
  generic parameter — drop S.
@blove blove merged commit 7962eb7 into main May 11, 2026
14 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant