Commit graph

3301 commits

Author SHA1 Message Date
Fabro
d7376d3acc fabro(01KR436AT33XSQRJ8MDTA02HNX): nap (failed)
Fabro-Run: 01KR436AT33XSQRJ8MDTA02HNX
Fabro-Completed: 2
Fabro-Checkpoint: 6d4e09d82e

⚒️ Generated with [Fabro](https://fabro.sh)
2026-05-08 15:33:35 +00:00
Bryan Helmkamp
893903ee04
fix(events): expose stage interrupt events in transcript
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.
2026-05-08 08:22:12 -07:00
Bryan Helmkamp
e47e738e8b
feat(web): add Run Events page to run sidebar
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>
2026-05-08 08:18:52 -07:00
Bryan Helmkamp
9c80d38db5
fix(llm): round-trip OpenAI reasoning statelessly
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.
2026-05-08 08:07:32 -07:00
Bryan Helmkamp
b75ebbf4da
feat(web): remove Watch/Steer card buttons and Steer modal
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>
2026-05-08 08:01:40 -07:00
Bryan Helmkamp
9b9ebdf50b
feat(web): migrate to generated API client
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.
2026-05-08 07:44:33 -07:00
Bryan Helmkamp
86ce3d05b8
fix(web): keep in-flight stages visible on the billing table
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>
2026-05-08 07:44:33 -07:00
Bryan Helmkamp
7c0ff8861f
feat(web): add Delete action to archived run actions menu
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>
2026-05-08 07:44:33 -07:00
Bryan Helmkamp
9d59f4d8d0
feat(web): add Artifacts page to run sidebar
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>
2026-05-08 07:44:33 -07:00
Bryan Helmkamp
d84e7a28ef
feat(workflows): add interview workflow
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.
2026-05-08 07:44:33 -07:00
Bryan Helmkamp
5ed9e9134f
feat(workflows): add sleeper interrupt workflow 2026-05-08 07:44:33 -07:00
fabro-releases[bot]
0ef1203da4 Bump version to 0.227.0-nightly.0 2026-05-08 09:46:45 +00:00
Bryan Helmkamp
77e5d06c4a
feat(web): hide stages with no billing usage
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.
2026-05-07 22:50:48 -07:00
Bryan Helmkamp
64a6eafe97
fix(web): keep run detail tabs anchored on billing tab
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.
2026-05-07 22:49:26 -07:00
Bryan Helmkamp
b170a6dead
feat(web): render sub-second durations in milliseconds
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>
2026-05-07 22:46:38 -07:00
Bryan Helmkamp
1182025c4c
feat(web): refine run stage metric column
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>
2026-05-07 22:40:55 -07:00
Bryan Helmkamp
be908cd0d5
style(web): drop redundant when/tool labels in tool group accordion
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>
2026-05-07 22:39:21 -07:00
Bryan Helmkamp
927ed419f7
feat(web): wire steer bar to interrupt and steer APIs
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>
2026-05-07 22:38:18 -07:00
Bryan Helmkamp
7034266dc9
feat(web): always show workflow breadcrumb on run detail
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>
2026-05-07 22:20:00 -07:00
Bryan Helmkamp
49c1263c8a
feat(web): sync runs page filters and view to URL params
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>
2026-05-07 22:16:10 -07:00
Bryan Helmkamp
6290b5a3f8
style(web): drop redundant tool labels in tool group details panel
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 22:11:27 -07:00
Bryan Helmkamp
befb2e00ec
feat(runs): merge command output streams
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.
2026-05-07 22:07:13 -07:00
Bryan Helmkamp
23cb211cce
feat(runs): surface diff summary counts
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.
2026-05-07 17:34:32 -07:00
Bryan Helmkamp
de26face0f
feat(web): collapse consecutive same-tool calls into one event row
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>
2026-05-07 17:05:13 -07:00
Bryan Helmkamp
ebf9bc7ed0
refactor(web): replace Graph tab with a Graph Source sidebar page
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>
2026-05-07 16:36:20 -07:00
Bryan Helmkamp
6e979ef85a
feat(web): add hover tooltip with absolute datetime on event timestamps
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>
2026-05-07 16:30:19 -07:00
Bryan Helmkamp
c464b4cca2
style(web): suppress sandbox_gone degraded banner on run files page
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>
2026-05-07 16:24:53 -07:00
Bryan Helmkamp
0aceebbd9e
feat(web): render command stages with a Logs tab showing real stdout/stderr
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>
2026-05-07 16:21:56 -07:00
Bryan Helmkamp
858caf7434
style(web): show errored tool calls with red Error label, not red pill
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 16:16:16 -07:00
Bryan Helmkamp
7f659df9ac
feat(web): add icons next to token and duration metrics in events feed
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>
2026-05-07 16:14:39 -07:00
Bryan Helmkamp
089f6befe8
feat(web): show LLM model name in stage view toolbar
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>
2026-05-07 16:11:09 -07:00
Bryan Helmkamp
9e54643a7e
fix(server): hide synthetic start node from billing rollup
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>
2026-05-07 16:09:26 -07:00
Bryan Helmkamp
094ebe164a
feat(web): add Send interrupt and Send steering actions to the run menu
Some checks are pending
Rust / Format (push) Waiting to run
Rust / Clippy (push) Waiting to run
Rust / Generated Docs (push) Waiting to run
Rust / Test (Linux) (push) Waiting to run
Rust / Test (macOS) (push) Waiting to run
TypeScript / Typecheck (push) Waiting to run
TypeScript / Test (push) Waiting to run
TypeScript / Build (push) Waiting to run
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>
2026-05-07 14:26:10 -07:00
Bryan Helmkamp
525233f94a
feat(web): unify steer and interview into a bottom-attached run dock
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>
2026-05-07 14:14:12 -07:00
Bryan Helmkamp
427a24d145
feat(web): add a sticky steer bar at the bottom of run views
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>
2026-05-07 14:07:58 -07:00
Bryan Helmkamp
1b9920e9e5
feat(web): split repo, workflow, and created columns in runs list
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>
2026-05-07 14:03:20 -07:00
Bryan Helmkamp
5daa07152a
feat(web): make debug events clickable with a JSON detail panel
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>
2026-05-07 13:52:08 -07:00
Bryan Helmkamp
2ea8e20f51
feat(web): time stage transcript events from the stage's own start
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>
2026-05-07 13:46:21 -07:00
Bryan Helmkamp
257d0de444
feat(web): populate Debug tab with category filter and event rows
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>
2026-05-07 13:40:12 -07:00
Bryan Helmkamp
bdd109597f
style(web): always format event row durations in seconds
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:30:02 -07:00
Bryan Helmkamp
2e3a71862c
style(web): increase stage event row padding and split token counts
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>
2026-05-07 13:28:53 -07:00
Bryan Helmkamp
d078170553
style(web): match event row right padding to left for symmetric gutters
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:26:12 -07:00
Bryan Helmkamp
84c3cca3c8
style(web): extend event row hover highlight to full column width
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:24:54 -07:00
Bryan Helmkamp
657ed98feb
style(web): extend stage toolbar border and details panel to right viewport edge
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:22:08 -07:00
Bryan Helmkamp
337f52883a
feat(web): show duration and token counts on stage event rows
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>
2026-05-07 13:15:49 -07:00
Bryan Helmkamp
9020e2e058
style(web): extend run tab bar underline to viewport edges
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-07 13:05:26 -07:00
Bryan Helmkamp
b158185091
feat(web): add Transcript/Debug toggle to run stages toolbar
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>
2026-05-07 13:03:09 -07:00
Bryan Helmkamp
34dc99963a
feat(web): add search and event-type filter to run stages tab
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>
2026-05-07 13:00:16 -07:00
Bryan Helmkamp
e6e6c0b5f8
feat(web): pretty-print and syntax-highlight tool input/result JSON
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>
2026-05-07 11:49:24 -07:00
Bryan Helmkamp
036ee0472f
feat(web): render markdown for system and agent event details
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>
2026-05-07 11:46:13 -07:00