From e762a30e89dd5bb7bf5f59012cd431e9d7980c76 Mon Sep 17 00:00:00 2001 From: Brian Love Date: Tue, 19 May 2026 12:38:54 -0700 Subject: [PATCH 1/2] feat(chat)!: remove per-message checkpoint marker; flatten chat-message rendering MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The chat library no longer ships a built-in time-travel UI on individual assistant messages. The bare gutter dot was undiscoverable, the rewind-vs-refresh distinction was invisible to most users, and the LangGraph-specific concept leaked into the UI for a feature only power users used. Refresh (in the actions bar) covers the universal 'redo this turn' intent that every chat UI exposes. Removals: - chat-checkpoint-marker primitive (component + spec + public-api export) - chat-message inputs: checkpointId, checkpointActive - chat-message outputs: replayRequested, forkRequested - chat-message gutter/layout/main wrapper DOM and CSS — template is now flat (bubble + citations + controls) - replayRequested/forkRequested outputs on chat, chat-sidebar, chat-popup compositions and their forwarding - demo-shell onTimelineReplay/onTimelineFork handlers + the bindings in embed-mode/popup-mode/sidebar-mode Kept: - AgentWithHistory contract + agent.history Signal — adapter authors can still expose checkpoint state - agent.replayFromCheckpoint / forkFromCheckpoint methods on the runtime contract — consumers can build their own time-travel UI - ChatTimelineSliderComponent standalone primitive — explicit opt-in surface for consumers who want a time-travel UI Side benefit: the chat-message layout flattens significantly. No more flex row with gutter (14px) + main; messages are simple block-level containers. Fixes the long-standing alignment glitch where the gutter dot floated ~16px above the first line of bubble text. Co-Authored-By: Claude Sonnet 4.6 --- .../src/app/modes/embed-mode.component.ts | 2 - .../src/app/modes/popup-mode.component.ts | 2 - .../src/app/modes/sidebar-mode.component.ts | 2 - .../src/app/shell/demo-shell.component.html | 2 - .../src/app/shell/demo-shell.component.ts | 12 -- libs/a2ui/package.json | 2 +- libs/ag-ui/package.json | 2 +- libs/chat/package.json | 2 +- .../chat-popup/chat-popup.component.ts | 6 +- .../chat-sidebar/chat-sidebar.component.ts | 5 - .../chat-sidenav/chat-sidenav.component.ts | 20 --- .../lib/compositions/chat/chat.component.ts | 17 --- .../chat-checkpoint-marker.component.spec.ts | 65 ---------- .../chat-checkpoint-marker.component.ts | 122 ------------------ .../chat-message.component.spec.ts | 53 -------- .../chat-message/chat-message.component.ts | 64 ++------- .../src/lib/styles/chat-message.styles.ts | 27 +--- libs/chat/src/public-api.ts | 1 - libs/langgraph/package.json | 2 +- libs/licensing/package.json | 2 +- libs/render/package.json | 2 +- libs/telemetry/package.json | 2 +- 22 files changed, 24 insertions(+), 390 deletions(-) delete mode 100644 libs/chat/src/lib/primitives/chat-checkpoint-marker/chat-checkpoint-marker.component.spec.ts delete mode 100644 libs/chat/src/lib/primitives/chat-checkpoint-marker/chat-checkpoint-marker.component.ts diff --git a/examples/chat/angular/src/app/modes/embed-mode.component.ts b/examples/chat/angular/src/app/modes/embed-mode.component.ts index a66a13c3..7a157b6c 100644 --- a/examples/chat/angular/src/app/modes/embed-mode.component.ts +++ b/examples/chat/angular/src/app/modes/embed-mode.component.ts @@ -17,8 +17,6 @@ import { WelcomeSuggestionsComponent } from './welcome-suggestions.component'; [modelOptions]="shell.modelOptions()" [selectedModel]="shell.model()" (selectedModelChange)="shell.onModelChange($event)" - (replayRequested)="shell.onTimelineReplay($event)" - (forkRequested)="shell.onTimelineFork($event)" > diff --git a/examples/chat/angular/src/app/modes/popup-mode.component.ts b/examples/chat/angular/src/app/modes/popup-mode.component.ts index 2274f149..25208dce 100644 --- a/examples/chat/angular/src/app/modes/popup-mode.component.ts +++ b/examples/chat/angular/src/app/modes/popup-mode.component.ts @@ -23,8 +23,6 @@ import { WelcomeSuggestionsComponent } from './welcome-suggestions.component'; [selectedModel]="shell.model()" [showModelPicker]="false" (selectedModelChange)="shell.onModelChange($event)" - (replayRequested)="shell.onTimelineReplay($event)" - (forkRequested)="shell.onTimelineFork($event)" > diff --git a/examples/chat/angular/src/app/modes/sidebar-mode.component.ts b/examples/chat/angular/src/app/modes/sidebar-mode.component.ts index f631e09e..0ea3b0ec 100644 --- a/examples/chat/angular/src/app/modes/sidebar-mode.component.ts +++ b/examples/chat/angular/src/app/modes/sidebar-mode.component.ts @@ -20,8 +20,6 @@ import { WelcomeSuggestionsComponent } from './welcome-suggestions.component'; [open]="true" [pushContent]="true" (selectedModelChange)="shell.onModelChange($event)" - (replayRequested)="shell.onTimelineReplay($event)" - (forkRequested)="shell.onTimelineFork($event)" > {{ shell.currentThreadTitle() }}