Live updates and streaming diffs beta
Two things, with different statuses. Pages that follow a bean's progress as it happens are live today. Watching an agent's edit arrive line by line, before it commits, works only in benchmark races so far.
| Part | What it is | Status |
|---|---|---|
| Live updates | The web app follows engine events and logs without a reload. | live |
| Streaming diffs | A bean's working change, while the agent is still writing it. | beta in races only, planned for repositories |
A. What updates live today live
Pages that follow something in progress show a small Live pill (or "Connecting…" while the connection opens). New events arrive over Server-Sent Events, so you never press refresh to watch a bean get checked.
| Where | What follows live |
|---|---|
| Changes tab | The list of beans, their states and counts. |
| A bean's page | Its journey: pushes, checks, verdicts, landing, validation, decisions. |
| Actions run page | The job log streams while the job runs and follows the end; scroll up and it stops following until you press Follow. The run's header and job graph refresh every few seconds while it runs. |
| Automation run page | The same run view: the job log streams while the automation runs. |
| Repository home (Ask view) | Growing now and what happened follow the engine's events. |
Other pages are read when you open them, so reload to see a change: Settings, People, History and the Actions run list. If the connection drops, a page falls back to refreshing when you return to the tab, and reads the missed events again when it reconnects.
B. Streaming diffs beta
A bean's journey on the Ask view can show its change arriving while the agent writes it: the file it changed last stays open and follows the hunk it just edited. Beans being written show a writing mark in the stalk list.
src/truncate.ts export function truncate(text: string, max: number) { - return text.slice(0, max); + if (text.length <= max) return text; + return text.slice(0, max - 1) + '…';
How it works, in three lines
- After an edit (or every few seconds, for agents that give no signal), the agent's driver sends only what changed since the last snapshot, usually one file's patch of a few hundred bytes. Secrets are redacted before it leaves the machine and again on arrival.
- A Durable Object per run, beside the engine's, holds the latest snapshot per bean. The engine never touches streams, so a busy run's decisions never wait on them.
- Viewers get a summary of every bean and full patches only for the beans they have open. Streams never enter the event log; when the agent commits, the committed diff replaces the stream.
A snapshot is the working copy at that moment, so you see edits arrive in chunks, not keystrokes: an agent that writes each file in one go appears rather than streams. The two designs and why the second replaced the first are in docs/claude-17-streaming-diffs.md.
Sources
- docs/claude-17-streaming-diffs.md
- Screenshots
- packages/web/README.md (live updates, client data)