SIGN IN SIGN UP

feat(ui): checkpoint a chat turn, fork from a checkpoint, and duplicate a chat (#2775)

---
*๐Ÿค– written by Claude (start)*

Checkpoint a turn in a chat, fork from a checkpoint, duplicate a chat,
and the agent rail work that came out of using it.

The Snapshots page and the `ListCheckpoints` change it needs are stacked
on top, in #2798.

## Checkpoints and forks

- The Checkpoint button beside Send saves the conversation's current
turn boundary. It belongs on the composer rather than a message because
`CreateCheckpoint` takes no cutoff โ€” what it saves is always "as it
stands now" โ€” and it is disabled during a turn and once the latest
boundary is saved.
- A saved boundary is a line under the turn it was taken at, with `Fork`
on it. The line is the promise: everything above it travels into a fork
and nothing below it does. Matched by `headTaskId` against the turn each
message carries, so the lines survive a reload.
- `Duplicate chat` in each rail row's menu is a checkpoint of the
conversation plus a fork of it, and the copy opens.
- A fork refetches its own transcript rather than inheriting the page's,
so it never shows its source's boundaries as its own.

## The agent rail

Rows gained the room and the states they were missing: a menu on every
row carrying Chat details and Share chat as well as rename, duplicate
and delete; checkbox hover and press states; controls that line up
whether or not the list scrolls. The three columns fold as the window
narrows โ€” the agent panel at 1440, the application sidebar at antd's
`xl`, the rail at 1040 โ€” and unfold again. The agent panel's drag handle
is gone with `ResizableAside`: its wrapper clipped to a fixed width, so
dragging widened an aside inside a box that never grew.

The create buttons on the list pages are title-cased, which is unrelated
to the rest and was asked for separately.

## Testing

1. `ENABLE_MOCK_UI=true yarn dev`, open a conversation, and press
Checkpoint beside Send. A line appears under the last turn and is still
there after a reload.
2. Press `Fork` on an early line. The fork opens holding what was above
it and nothing below.
3. Open a rail row's menu and choose `Duplicate chat`. The copy opens
with the whole transcript.
4. Narrow the window from wide: the agent panel folds, then the sidebar,
then the rail.

The reel in the comments shows this against a real cluster: two
checkpoints three turns apart, a fork from each, and the earlier fork
knowing only what was above its line. Reels about the Snapshots page
moved with it to #2798 and are marked outdated here.

---
*๐Ÿค– written by Claude (end)*

---------

Signed-off-by: Nicholas Bucher <behappy54321@gmail.com>
Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
N
Nicholas Bucher committed
144ba331c997e70ebe2060bc7f3a6391c81ec0a9
Parent: 6a6b54f
Committed by GitHub <noreply@github.com> on 9/11/2026, 1:14:22 PM