Emit agent.interrupt.injected when run interrupts reach active agent sessions, persist the stage/session fields, and refresh/render those rows in the Transcript tab.
Introduces /runs/:id/events showing all events for a run with the same
look as the stage Debug tab — toolbar with category filter and search,
plus a row-by-row list with an expandable details panel. Extracts the
shared event-list primitives from run-stages.tsx into a new
event-debug.tsx module so both views stay in sync.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Always request encrypted reasoning content for Responses API requests with store:false so GPT-5.5 reasoning items can be sent back on later turns without relying on server-side item persistence.
The Steer modal was replaced by the steer bar on the run detail page,
so the per-card Watch and Steer actions are no longer needed.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Expand the OpenAPI contract for frontend auth and workflow routes, regenerate the TypeScript Axios client, and route web API calls through generated client classes while preserving SSE and install exceptions.
The hide-non-billable filter introduced in 77e5d06c4 also hid actively
running stages because they haven't accrued tokens or spend yet. Exempt
in-flight rows from the filter so live stages stay visible while users
are watching the run.
Updates the two RunBilling unit tests that were asserting the
pre-77e5d06c4 behavior of showing completed non-LLM rows.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mirrors `fabro rm RUN_ID`. Surfaces a Delete item in the run detail
Actions menu for archived runs, opens a Headless UI ConfirmDialog,
calls DELETE /api/v1/runs/{id}, invalidates the boards.runs cache,
and navigates back to /runs on success.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Lists captured artifacts grouped by stage and retry, with per-file
download links that stream from the existing artifact download endpoint.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Add a progressive human interview workflow and teach human gates to honor explicit question_type values so the workflow can exercise yes/no, confirmation, multiple-choice, multi-select, and freeform prompts before summarizing the answers.
The per-stage table on the run billing page now skips rows that
have zero tokens and zero spend, since they add noise without
information. Footer totals stay server-authoritative and are
unaffected.
The billing route lacked the wide layout handle, so the parent app-shell
shrank to max-w-5xl and the shared tab strip drifted toward the center
when switching to Billing. Mark the route wide and constrain the tables
themselves to the previous width so they stay centered.
Tool and command durations under 1s now render as e.g. 321ms instead
of 0.3s, matching how short steps actually feel.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Render sub-second tool/command durations in milliseconds (e.g. 321ms)
instead of 0.3s. Round token counts to whole k/M. Wrap assistant token
metric in a tooltip showing the input/output breakdown. Allow Tooltip
labels to be arbitrary React nodes.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The accordion row already shows elapsed/duration and the group header
already names the tool, so the When and Tool fields inside the expanded
event detail are redundant. Keep them for the standalone single-event
panel.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The bottom steer bar now actually calls the run APIs: Send posts a
steering message and Interrupt fires immediately as a button (not a
toggle). The Actions menu drops the redundant "Steer" item and its
modal composer; "Send interrupt" still fires immediately and "Send
steering…" still focuses the bar.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The workflow breadcrumb was previously demo-mode-only. Render it in
all modes and point it at the runs list filtered by that workflow,
which is now honored via URL params.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Search query, repo, workflow, created-time, archived toggle, and
columns/list view are now read from and written to URL search params,
so the selected state survives reloads and is shareable. Defaults are
omitted from the URL to keep links clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Route command stderr into stdout at execution time and expose a single output log across events, projections, API clients, and the web UI. Keep replay compatibility for older command.completed events that still contain split stdout/stderr fields.
Compute cheap diff stats on checkpoint and terminal events, roll them into run summaries, and use them for the Files Changed tab badge without fetching full file diffs.
Successful tool calls of the same tool that run back-to-back (e.g., five
Bash curls to the same endpoint) now collapse into a single Tool group row
labelled "Bash x5", summing durations and using the first call's start
time. Errored calls and tool-name boundaries break the run, so distinct
work is never hidden. Clicking the group opens a panel that lists each
child with its input preview and per-call duration; an inline accordion
reveals the full Tool use / Tool result for one child at a time.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The Graph tab duplicated the Overview's diagram. Drop it and the
/runs/:id/graph route, and move the DOT source view to a dedicated
/runs/:id/source page reachable from the sidebar.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces native title attribute with a portal-based Tooltip component on
the events-feed elapsed times and the run header's last-event timestamp,
showing the full datetime (e.g. "04/24/2026, 1:23:40 PM") on hover.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The "Showing final patch only" banner fired for every finished run whose
sandbox had been reaped, which is the normal post-run state and just
adds noise. Other degraded reasons (provider_unsupported,
sandbox_unreachable) still show their banners.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Command nodes now show a "Logs" tab (in place of "Transcript") that fetches
the actual stdout/stderr bytes via the stage log endpoint, rather than the
blob:// refs carried in command.completed events. Exit code and duration
sit on the right side of the toolbar alongside the tab toggle. Agent stages
are unchanged.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Tool/command rows show a clock icon next to the duration; agent rows
show a tokens icon next to the input/output token count. Adds left
padding between the metric column and the elapsed timestamp column so
the two values read as separate fields.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Extracts the model from `stage.prompt`, `agent.session.activated`, and
`agent.cli.started` events that the stage already loads, and renders it
on the right side of the events toolbar with a CpuChipIcon.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The billing rollup filtered out the synthetic exit handler but left
start visible, so the billing tab showed an asymmetric pair. Both are
no-op workflow boundary handlers and shouldn't appear as billable
stages.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds two new items to the run-detail Actions dropdown, always
present and disabled when unavailable. Send interrupt is wired to
POST /api/v1/runs/{id}/interrupt and gated on running status. Send
steering… focuses the bottom-dock steer textarea via a new
forwardRef handle on SteerBar; gated on running status with no
pending questions. Bumps the separator after the new pair to render
whenever any later group exists.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replaces the two floating overlays with a single full-width bottom
panel that's always present on every run-detail tab and renders
either the InterviewDock (when there are pending questions) or the
SteerBar (otherwise). The dock has a top border and bg-page so it
sits flat against the page above instead of floating with a gradient.
Strips the outer fixed/gradient/rounded wrappers from both
InterviewDock and SteerBar so they render as inline content inside
the new dock. SteerBar gets a max-w-4xl centered form, an outlined
textarea field, and a new Interrupt checkbox button (with a visible
amber-fill checkbox indicator) between the input and Send. Send and
Interrupt aren't wired to the steer API yet.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a single-row text input + Send button that pins to the viewport
bottom on every run-detail tab as a placeholder for the future
steering composer (will replace the modal). Renders mutually
exclusive with InterviewDock: the dock takes precedence on blocked
runs with pending questions, otherwise the steer bar shows. Reuses
the existing --fabro-interview-dock-clearance variable so consumers
that already pad for the dock pick up the steer bar's clearance too.
Send is intentionally a no-op for now until the steering API is
swapped over from the modal.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Promote repo to its own column instead of sharing space with the
goal, add a workflow-slug column, and add a relative creation-time
column (with the ISO timestamp on hover) so the list view exposes
the same identifying info the board cards already show.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Promotes DebugRow to a button with the same padding and hover/selected
chrome as the transcript rows, and opens a side panel showing the
event name as the header and the full EventEnvelope JSON, pretty-
printed and syntax-highlighted via highlightJson. Refactors the panel
chrome into a shared DetailsPanel so EventDetailsPanel and the new
DebugEventDetailsPanel both reuse the slide-out animation, header,
and Esc-to-close behavior.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
The Transcript view is filtered to a single stage, so measure each
event's elapsed time from that stage's started_at instead of the
run's created_at. The previous behavior folded the run's
initialization wait (sandbox build, clone, devcontainer setup) into
every per-stage timestamp. Falls back to RunSummary.start_time and
then created_at for stages or runs that never ran.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Generalize the kind filter into a reusable multi-select and use it for
both Transcript (fixed kinds) and Debug (event-name-prefix categories).
Debug rows show a category pill, the full event name, and elapsed time.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bumps the row's vertical padding from py-1.5 to py-2.5 so the hover
and selected highlight band is taller and the rows breathe more, and
shows Agent token counts as input / output rather than a single total.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a metric column on the run stages Transcript view: token totals
for Agent messages (from agent.message billing.input_tokens +
output_tokens), and elapsed time for Tool calls (computed from the
paired started/completed timestamps) and Command runs (from
command.completed.duration_ms). Also tightens the column top padding
so the toolbar reads with balanced breathing on each side, and lets
the toolbar underline extend across the row in line with the run-tab
underline pattern.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds a segmented toggle to the left of the type filter. Transcript
keeps the existing transcript view; Debug renders a blank panel for
now and hides the kind filter, search, count, and any open detail
panel so they don't suggest controls that aren't wired up yet.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Mirrors the toolbar pattern from the run logs view so users can narrow
down stage events by kind (System, Agent, Tool, Command) or by free-text
search across event content. Filter state persists across stage
selection; the open detail panel still resets per stage.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Replace the plain CodeBlock for tool input and result with a JsonBlock
that parses the value, re-stringifies with indent 2, and applies a
small regex-based syntax highlighter (keys, strings, numbers,
booleans, null get distinct theme colors). Non-JSON results — file
contents from Read, error strings — fall through to plain text when
JSON.parse fails. No new dependencies.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Bring back the Marked-based renderer for system prompt and assistant
message bodies in the event details panel so headings, lists, inline
code, and fenced blocks render as formatted prose instead of a single
preformatted block. Tool input/result and command scripts continue to
render as fixed-width code since they're JSON/shell. Same URL/HTML
sanitization policy as the prior markdown integration: protocol-
relative and non-http(s)/mailto links are rewritten to empty hrefs,
and raw HTML tokens are dropped.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>