Commit graph

473 commits

Author SHA1 Message Date
Bryan Helmkamp
fb577b1fcb
fix(web): add bottom padding inside terminal frame
Give the terminal wrapper pb-3 so the active console no longer hugs
the bottom edge of the bordered frame.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 17:12:47 -04:00
Bryan Helmkamp
61ab94195e
feat(sandbox): copy Docker exec access command 2026-05-09 17:05:46 -04:00
Bryan Helmkamp
160c21c8b1
fix(web): rename run "Diff" tab back to "Files Changed"
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 16:53:47 -04:00
Bryan Helmkamp
872c81bdc7
fix(web): stop terminal bottom row from being clipped
The xterm.js renderer cell height is fontSize (13) × lineHeight (1.45)
= 18.85px — non-integer. FitAddon proposes N rows where
N × cellHeight <= available height, but sub-pixel rounding in the
renderer (and font-load timing on first paint) lets the Nth row
extend past the wrapper's content edge, so the last visible line
gets half-clipped.

Reserve one row of buffer in the fit calculation (proposed.rows - 1)
so xterm is never asked to render right up to the bottom edge. The
re-fit on document.fonts.ready stays in place; sendResize now reads
terminal.cols/rows directly so the server sees the same dimensions
xterm actually uses.

Trade-off: ~18px less visible terminal area. The alternative is
switching to an integer cell height (e.g. lineHeight 18/13), which
we can revisit if the lost row matters.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 16:53:33 -04:00
Bryan Helmkamp
01f33e6d50
refactor(web): polish terminal tab chrome and theme
- Replace heading + status badge with a single status pill that folds in the sandbox provider
- Make Reconnect an icon-only button with tooltip; keep SSH labeled
- Darken the terminal canvas and brighten the ANSI palette for higher contrast
- Trim the static gap above the steer-bar dock from 0.5rem to 0.25rem

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 16:41:49 -04:00
Bryan Helmkamp
0de07bbfec
refactor(web): rename Files Changed tab to Diff and reorder before Terminal
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 16:41:41 -04:00
Bryan Helmkamp
0f30150264
fix(web): show empty state on Billing tab when no models were used
Runs with only non-billable stages rendered as a header + empty body
+ all-dashes "Total" row, which looked broken. Show the existing
EmptyState panel ("No model usage") instead, keeping the original
"No stages yet" message for runs that haven't started executing.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 16:41:28 -04:00
Bryan Helmkamp
39d8e65547
fix(web): tighten terminal dock spacing 2026-05-09 16:22:19 -04:00
Bryan Helmkamp
bf6bd670ce
fix(web): keep terminal clear of steer bar 2026-05-09 16:21:04 -04:00
Bryan Helmkamp
db3f348fab
feat(runs): add sandbox terminal
Expose a run-scoped websocket terminal for Docker and Daytona sandboxes, and add the web terminal route so sandbox-backed runs can be inspected interactively from the run detail page.
2026-05-09 16:06:04 -04:00
Bryan Helmkamp
237318f13f
Merge remote-tracking branch 'origin/main' 2026-05-09 15:40:18 -04:00
Bryan Helmkamp
65c8a12cce
Merge remote-tracking branch 'origin/main' 2026-05-09 15:39:44 -04:00
Bryan Helmkamp
6cfed82654
refactor(run-files): rename diff selection picker 2026-05-09 15:33:54 -04:00
Bryan Helmkamp
705ea0268a
refactor(run-files): extract commit picker options 2026-05-09 15:33:19 -04:00
Bryan Helmkamp
67decad7b5
feat(billing): project live stage token usage
Store live per-stage token counts on StageProjection, carry typed billing model identity through agent.message events, and derive billing rollups from the projection so in-flight stages can report usage before terminal events arrive.
2026-05-09 15:25:51 -04:00
Bryan Helmkamp
010828ae7a
Add run commit diff picker 2026-05-09 14:49:15 -04:00
Bryan Helmkamp
bfb633ba6e
fix(run-files): refresh patch diffs when scope changes 2026-05-09 14:00:34 -04:00
Bryan Helmkamp
6cc669e6be
feat(run-files): make diff scope a dropdown next to file count
Replaces the All/Uncommitted/Committed pill toggle with a Listbox
dropdown and moves it next to the "N files changed" header so the
filter sits with the count it modifies.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 13:23:49 -04:00
Bryan Helmkamp
447b94da6d
feat(run-files): add sandbox diff scopes
Add committed, uncommitted, and all scope handling for run files with source reporting for sandbox and final patch responses.

Wire the run files page to persist scope in the URL and cache each scope independently.
2026-05-09 13:00:14 -04:00
Bryan Helmkamp
7b013cef7f
feat(web): inline-edit run titles in the run header
Click the title (or its hover-revealed pencil) to swap it for an input;
Enter or blur saves via PATCH /runs/{id}, Esc reverts. Trims whitespace,
no-ops blank or unchanged values, and surfaces server validation errors
through the existing toast system. The board and breadcrumb refresh from
the same SWR cache after a successful save.
2026-05-09 11:54:41 -04:00
Bryan Helmkamp
48545f4a7d
Merge remote-tracking branch 'origin/main' 2026-05-09 11:43:59 -04:00
Bryan Helmkamp
8ad14faa17
refactor(integrations): make chat integrations Slack-only 2026-05-09 11:43:16 -04:00
Bryan Helmkamp
697dc1294f
feat(runs): support explicit run titles
Persist resolved run titles on creation, expose title update events, and add the run title PATCH API. Regenerate API clients and refresh web/server invalidation so title changes are reflected across run detail and board views.
2026-05-09 11:18:12 -04:00
Bryan Helmkamp
1ff30ea03c
Merge remote-tracking branch 'origin/main' 2026-05-09 11:05:15 -04:00
Bryan Helmkamp
2a8884883a
refactor(workflow): remove local worktree mode
Make local sandbox execution direct by removing the public worktree mode and in-place controls from CLI, config, run state, API surfaces, docs, and UI. Keep worktree support only for internal parallel-node isolation.
2026-05-09 11:04:23 -04:00
Bryan Helmkamp
5b0b1efdc2
fix(workflow): ignore deprecated project directory
Project workflows now resolve from the discovered .fabro directory instead of honoring project.directory. Keep the legacy field parse-only while removing it from resolved settings and API/client shapes.
2026-05-09 10:55:56 -04:00
Bryan Helmkamp
dae5ea4c80
feat(web): add demo-only Start tab to app shell nav
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-09 10:55:25 -04:00
Bryan Helmkamp
5fc9157017
refactor(workflow): remove retro stage (#230)
## Summary

Removes Fabro's automatic retro generation stage so workflow runs go
directly from execution to finalization and optional PR creation. This
drops the retro-specific crate, events, projection fields, config/API
knobs, and user-facing docs in favor of the existing durable run
observability surfaces.

## What Changed

- Deleted the `fabro-retro` crate and the workflow `retro` pipeline
phase, with finalization now consuming `Executed` state directly.
- Removed retro configuration and API surface area, including
`--no-retro`, `[run.execution].retros`, manifest `no_retro`,
`features.retros`, and run projection `retro*` fields.
- Retired typed `retro.*` events while keeping historical event logs
readable by deserializing retired retro event names as `Unknown`.
- Stopped appending retro sections to generated PR bodies and updated
docs, marketing copy, screenshots, and navigation to point users toward
observability/event-stream inspection.

## Testing

Not run during PR creation; this branch already contained the
implementation commit.

---

[![Compound
Engineering](https://img.shields.io/badge/Compound_Engineering-6366f1)](https://github.com/EveryInc/compound-engineering-plugin)
🤖 Generated with GPT-5 (unknown context, reasoning unspecified) via
[Codex](https://openai.com/codex)
2026-05-09 10:18:20 -04:00
Bryan Helmkamp
2f21917b6e
Merge remote-tracking branch 'origin/main' 2026-05-08 23:29:12 -04:00
Bryan Helmkamp
6719a3cdac
refactor: simplify reviewed run cleanup
Reuse shared PR chip rendering, persist runtime stage handlers from events, and remove duplicated lifecycle/delete helpers found during review.
2026-05-08 23:29:08 -04:00
Bryan Helmkamp
822e02d70c
fix(web): avoid mocking interview mutations 2026-05-08 22:56:46 -04:00
Bryan Helmkamp
9ff7521efa
fix(web): isolate run detail test mocks 2026-05-08 22:54:13 -04:00
Bryan Helmkamp
d3e33ce32c
feat(runs): own sandbox lifecycle
Create run-owned sandbox lifecycle operations so terminal runs stop by default, resumes attach and start persisted sandboxes, and run deletion deletes or hands off provider resources according to preserve settings.
2026-05-08 18:38:08 -07:00
Bryan Helmkamp
cf5fdd8712
feat(web): render inline Markdown in run titles
Add InlineMarkdown component that tokenizes titles via marked's
Lexer.lexInline and renders code, strong, and em. Block syntax, links,
images, and raw HTML degrade to safe text — no dangerouslySetInnerHTML.

Applied to the run detail h2 heading and the run list row titles. Title
metadata, search, and the API/server data model are unchanged.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 18:30:51 -07:00
Bryan Helmkamp
f656aecd63
fix(web): nudge run files sidebar 2px left to align with content
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 18:16:45 -07:00
Bryan Helmkamp
083028b1fd
fix(web): make run files sidebar tree blend into the page
Make the file tree's background transparent and zero out its inline
padding so the tree sits flush on the page instead of inside a styled
sidebar surface.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 18:14:08 -07:00
Bryan Helmkamp
dbe3676fad
feat(web): remove changed-files filter from run files sidebar
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 18:04:45 -07:00
Bryan Helmkamp
1a43cf5abc
feat(api): expose stage handlers on run stages
Populate RunStage.handler from workflow graph metadata and use it for the run stages renderer instead of inferring from activity events.
2026-05-08 13:36:02 -07:00
Bryan Helmkamp
0b29dbe6d8
feat(runs): link stored pull requests 2026-05-08 13:17:08 -07:00
Bryan Helmkamp
12b475d692
fix(web): rename stage Transcript toggle to Thread
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 12:34:49 -07:00
Bryan Helmkamp
5b908c84c1
feat(web): show PR icon and number on run cards only when a PR exists
Drop the always-on branch/PR icon to the left of the repo name on the
runs board. When the run has a PR, render a right-aligned PR icon plus
"#number" on the top row, colored to match the column status. Move
additions/deletions to a dedicated bottom row that renders only when at
least one value is present and non-zero.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 12:34:04 -07:00
Bryan Helmkamp
e3f312776f
fix(web): drop owner prefix from repo name in run cards
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 11:51:36 -07:00
Bryan Helmkamp
4d33daf14e
fix(web): render prompt.completed in stage Transcript
Prompt-shape stages (prompt, fan_in) only emit `prompt.completed` for
their response, so the Transcript tab showed the input but never the
output. Add the event to STAGE_ACTIVITY_EVENT_TYPES and to the
eventsToActivity reducer, suppressing it when a prior agent.message
already streamed the same content (agent stages).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 09:57:45 -07:00
Bryan Helmkamp
b0dfd6b3b4
fix(api): type interview answer submissions
Replace the loose interview answer request payload with a discriminated OpenAPI union so generated clients enforce the wire contract. Surface structured HTTP error details in the web client and update browser, CLI, and server answer submission paths to use the typed variants.
2026-05-08 09:18:35 -07:00
Bryan Helmkamp
025f41dddd
feat(web): add Profile page to user menu
Surfaces session info from useAuthMe (name, avatar, username, email,
IdP issuer/subject, profile URL) on a new /profile route, structured as
Basics + Identity panels matching the Settings page layout. Adds a
Profile link to the desktop dropdown and mobile menu.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 08:33:11 -07:00
Bryan Helmkamp
da805fae0e
fix(web): avoid duplicate action dividers 2026-05-08 08:30:44 -07:00
Bryan Helmkamp
82a01c50dd
feat(web): default unrecognized stage types to Debug renderer
Human/interview stages had no renderer and silently fell back to the
empty agent transcript. Stages without an explicit renderer now show
the Debug view (with the event-type filter and search) and no mode
picker.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-08 08:28:47 -07:00
Bryan Helmkamp
261811f79b
fix(web): focus steer bar from actions menu 2026-05-08 08:28:37 -07: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