From a19067a66592580b3b5886a58e0e0518e20ff52a Mon Sep 17 00:00:00 2001 From: Ian Gulliver Date: Thu, 15 Oct 2026 17:46:41 -0700 Subject: [PATCH] Add per-snapshot review link and snapshot picker to Reviews tab --- docs/operations.md | 6 +++--- web/dist/reviews.js | 35 +++++++++++++++++++++++++++-------- web/dist/reviews.js.map | 2 +- web/dist/state.js | 10 ++++++++++ web/dist/state.js.map | 2 +- web/dist/task.js | 10 +++++----- web/dist/task.js.map | 2 +- web/src/reviews.ts | 35 +++++++++++++++++++++++++++-------- web/src/state.ts | 13 +++++++++++++ web/src/task.ts | 10 +++++----- web/style.css | 12 ++++++++++++ 11 files changed, 105 insertions(+), 32 deletions(-) diff --git a/docs/operations.md b/docs/operations.md index b7d4e28..da97310 100644 --- a/docs/operations.md +++ b/docs/operations.md @@ -226,7 +226,7 @@ Merging or discarding a task stops new snapshots for it, waits for one in progre `GET /api/tasks/{taskId}/changes?snapshot=` reports a snapshot instead of the live worktree: its `tree` is the snapshot's tree, and `base` is the merge-base of the snapshot's commit and the default branch, or with `step=true` the previous snapshot's tree (the snapshot commit's parent for snapshot 1). It reads the stored shas, so it works only while the task is active and its refs keep the objects; `since` with `snapshot` is a 400. `GET /api/tasks/{taskId}/diff` takes that `base` and `tree` as usual. -The transcript is the timeline. The UI learns a task's snapshots from the `snapshot.created` events in its transcript (`snapshots` in `web/src/state.ts`). A snapshot is a point between the agent's events, not part of one, so each gets its own row in the transcript, a divider reading `snapshot #n` (its trigger and time in the tooltip), placed where its `snapshot.created` event falls in the task's event order: just after the turn end it belongs to (after the triggering text for an old `message` snapshot). A snapshot row ends the current group of tool calls, so calls after it start a new group. The row's **changes** button pins the snapshot (`state.pinned`, cleared when the selected task changes) and switches the right pane to the Changes tab; its **fork** button forks it (see "Forking") and points the right pane at the new task. Pinned, the Changes header reads `snapshot · ·