Session view
The screen where a run comes alive. A structured timeline grammar plus a side rail of surfaces for the browser, terminal, files, diffs, agents, editors, and workpieces.
The session view at /session/:id is where you watch and steer a run. It renders
the canonical event log through a consistent visual grammar, and hosts the panes
that show the run’s environment.
The timeline grammar
Nothing in the timeline is raw JSON. Every step renders as a purpose-built card or row, so a run reads like a structured narrative:
| Element | What it shows |
|---|---|
| Work-entry row | A tool call: icon, heading, a preview, a status, and an expandable body with the full output. |
| Reasoning disclosure | A collapsible thinking segment, with a shimmer while it streams. |
| Context-recall fold | The receipts for a turn: which skills, playbooks, memory, and knowledge were pulled in, folded behind a summary like “5 memory, 7 knowledge, 1 playbook”. |
| Plan and todo cards | A proposed plan or checklist, rendered as a disclosure. |
| Approval cards | A gateway or provider-native permission request, with Approve and Deny wired to the approval lane through an optimistic pending-to-resolved transition. |
| Question card | A provider-native question that blocks the turn until answered. It is not a new user message or run. |
| Context-window meter | A slim ring meter for the turn’s context usage, with a hover detail of percent and used versus maximum tokens. |
| Per-file diff | A unified diff with a changed-files index and line stats, drawn only from patches recorded in the step payload. |
| Git chip | A compact owner/name:branch badge for the run’s bound repositories. |
| Queue and status pills | Pending input, background work, and sync state. |
| Provider status banner | A slim notice when the selected engine is not in the ready set. |
| Failure banner | A quiet, one-line thread-level error when a run fails to start or crashes. |
| Artifact card | A published artifact, shown after the answer text. |
Within a turn the order is deliberate: the work happens first, the answer comes after. Repeated tool calls fold together while preserving their identity, so a long run stays scannable.
The side rail
The right side of the session is one rail with seven surfaces. A surface chooser offers five of them (Browser, Terminal, Files, Diff, Agents); the rail also carries Editor and Workspace tabs:
Browser
The sandbox desktop over noVNC (Xvfb, XFCE, x11vnc, noVNC), bridged through
the authenticated /api/desktop-proxy so the preview token never reaches
the browser. For runs that drive a GUI.
Terminal
The run’s command steps stream as $ command lines with their captured
output. While the thread is live, an interactive shell attaches to the
thread’s sandbox PTY over WS /api/runs/:id/terminal, so you type into the
same filesystem the agent works in.
Files
A streaming list of the files and artifacts the run produces, with file-kind badges.
Diff
Unified diffs drawn from real recorded patches. Available only when a real patch exists.
Agents
Status rows for nested subagent runs; clicking a row opens a per-agent slide-over pane. Child sessions queue as serial turns on the thread, never in parallel.
Editor
A tab strip of every file the run touched, over an honest detail view: the real body when the engine mirrored it, never fabricated source.
Workspace
Bounded workpiece editors for a document, spreadsheet, presentation, or PDF, read-only for a produced artifact or live with save and export.
Live updates and recovery
The session subscribes to a single thread-scoped SSE stream. On reconnect it receives a fresh durable snapshot rather than replaying from zero, so a flaky network resyncs cleanly. If the backend restarts under a live run, restart reconciliation re-probes the sandbox and streams the interim events back with a heartbeat. See Events and streaming and Sandboxes.