Commit graph

71 commits

Author SHA1 Message Date
Bryan Helmkamp
79d97ebb5c Fix stale labels, grammar, and comments from sandbox rename
- Fix display label `image:` → `name:` for SnapshotPulling/SnapshotPulled
  in format_event_detail
- Fix grammar: "an Sandbox" → "a Sandbox" in README and parallel.rs
- Fix typo: "sandboxs" → "sandboxes" in parallel.rs
- Update remaining "execution environment" comments to "sandbox"

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-02 11:43:34 -05:00
Bryan Helmkamp
e938d3395a Throw Response from apiJson so API 404s render as 404 pages
apiJson was throwing a plain Error on non-ok responses, which React
Router always treated as a 500. Now throws a Response with the actual
status code so API 404s surface as proper 404 error pages.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-02 11:05:34 -05:00
Bryan Helmkamp
fcba787cd5 Add styled 404 and 500 error pages matching Arc design system
Replace the unstyled error boundary with themed pages: teal gradient
number for 404, coral for 500, centered on the atmospheric background
with action buttons and a collapsible stack trace in dev mode.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-02 11:04:04 -05:00
Bryan Helmkamp
49364b0843 Add demo API server and wire React app to fetch from API
Expand the OpenAPI spec from 11 to 39 endpoints covering Runs, Workflows,
Verifications, Retros, Sessions, Insights, Settings, and Projects with ~45
schemas. Add `--demo` flag to `arc serve` that serves static demo data for
all endpoints (auth disabled, read-only). Non-demo mode returns 501 for new
endpoints while existing run handlers continue working.

Regenerate the TypeScript API client and add `apiJson` helper. Wire all 19
React route files with server-side loaders that fetch from the API and map
snake_case responses to camelCase UI types. Mock data kept as fallback.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-02 09:39:53 -05:00
Bryan Helmkamp
331dad98ec Rename Pipeline to Workflow in frontend
- routes/pipelines.tsx → routes/runs.tsx, component Pipelines → Runs
- Update route config to point to runs.tsx
- Retro.pipeline_name → workflow_name in data and all display components
- Table header "Pipeline" → "Workflow" in retros list

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-02 00:09:15 -05:00
Bryan Helmkamp
1aca8231bc Add Terminal dropdown button to run detail page
Adds a sandboxId field to RunItem and a Terminal dropdown on the run
detail page with "Web Terminal" (links to Daytona proxy) and
"Connect with SSH" options. Uses existing Headless UI Menu pattern.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 23:01:15 -05:00
Bryan Helmkamp
726ab184dc Add cursor: pointer to all click targets site-wide
Add a global CSS base rule for interactive elements (buttons, links,
selects, summary, ARIA roles) and add cursor-pointer to clickable
table rows. Remove now-redundant per-element cursor-pointer classes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 22:36:21 -05:00
Bryan Helmkamp
ae72cd059d Add verification control detail page with clickable catalog rows
Adds /verifications/:slug route with detail page showing control
description, stat cards, evaluation history, recent runs, checks/examples,
and sibling navigation. Makes verification catalog rows fully clickable.
Fixes dark mode hydration mismatch with suppressHydrationWarning.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 22:25:00 -05:00
Bryan Helmkamp
4a0fc63d5a Add generated Axios API client package (@qltysh/arc-api-client)
Replace openapi-typescript types-only output with a full TypeScript Axios
client generated by openapi-generator-cli. The generated code is committed
so IDE support works without running codegen. arc-web consumes the client
via bun workspaces.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 22:03:38 -05:00
Bryan Helmkamp
1334a952af Add spec-first OpenAPI for arc-api with generated types
- Create openapi/arc-api.yaml as source of truth for all API endpoints
- Add arc-types crate with build.rs using typify to generate Rust structs
  from the spec's component schemas
- Refactor server.rs to use generated types instead of hand-written ones
- Add route coverage conformance test validating router matches spec
- Add openapi-typescript to arc-web for TypeScript type generation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 21:43:49 -05:00
Bryan Helmkamp
b15a526b0a Add darker logotype variant for light mode
The existing gradient logo (#c4dede-#495669) was designed for dark
backgrounds. Adds logotype-light.svg with the same paths but a
deeper gradient (#2a6b6b-#1c2a3a) for better contrast on white,
and swaps the src based on the current theme.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 19:37:15 -05:00
Bryan Helmkamp
e515368838 Link ARC logo to /start instead of /workflows
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 19:33:02 -05:00
Bryan Helmkamp
3b8a0c3af2 Fix light mode colors for diff views and charts
The .light CSS variable overrides were defined before the :root dark
defaults, so equal-specificity source-order caused the dark values to
always win. Move .light overrides after each :root block so they
correctly take effect.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 19:12:13 -05:00
Bryan Helmkamp
2ed164d190 Add light mode support with theme toggle
Introduce semantic CSS custom properties (page, panel, fg, line, overlay,
etc.) that swap values via .light/.dark class on <html>. An inline script
reads localStorage / prefers-color-scheme before first paint to prevent
flash-of-wrong-theme.

- ThemeProvider + useTheme hook in app/lib/theme.tsx
- Sun/Moon toggle in desktop nav and mobile menu
- .light overrides for all semantic tokens, accent colors (WCAG AA on
  white), atmosphere gradient, @pierre/diffs surfaces, and chart variables
- Migrated ~30 files from hardcoded color classes to semantic tokens
- GraphViz diagrams use getGraphTheme() for light/dark hex maps
- Chart gridlines and axis labels use CSS custom properties
- Workflow card colors reference CSS vars for automatic theme switching
- Pierre diffs switch between pierre-dark and pierre-light themes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 18:06:45 -05:00
Bryan Helmkamp
f53cc746dc Add split/unified and background toggles to diff headers
Inject per-file toggle controls into the Pierre diff header bar via
renderHeaderMetadata. Each file gets independent split/unified and
background on/off state using the Pierre icon style.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 17:43:57 -05:00
Bryan Helmkamp
375a833733 Add Steer button and inline comment forms to diff view
Hover any line in a diff hunk to see a "Steer" button on the right side.
Clicking opens an inline comment form; submitted comments persist as
read-only annotations. Uses onLineEnter/onLineLeave with absolute overlay
positioning to place the button at the row's right edge.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 17:16:27 -05:00
Bryan Helmkamp
706413ec65 Add verifications catalog page and per-run verifications tab
Verifications catalog (/verifications) shows all verification criteria
organized by category with search, mode filter, and grouped/list toggle.
Each criterion has a unique icon, type badge, mode badge, and evaluation
sparkline. List view adds F1 accuracy, pass@1, and category columns.

Per-run verifications tab (/runs/:id/verifications) shows the same
criteria with pass/fail status for a specific run.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 16:31:47 -05:00
Bryan Helmkamp
73b00f047b Add per-run retrospectives with LLM-powered retro agent
After each pipeline run, auto-derive stats from the checkpoint (stages,
retries, cost, files touched) then run an Opus agent session that
explores progress.ndjson to produce qualitative analysis: smoothness
rating, intent, outcome, learnings, friction points, and open items.

Backend:
- retro.rs: data model, save/load, derive_retro(), extract_stage_durations()
- retro_agent.rs: post-pipeline agent session with submit_retro tool
- cli/run.rs: hook retro generation after final.json, before engine_result?
- server.rs: GET /pipelines/{id}/retro endpoint, auto-derive on completion

Frontend:
- data/retros.ts: TS types + mock data + smoothness color config
- routes/retros.tsx: list page with smoothness badges
- routes/run-retro.tsx: detail view (stats, intent, stages, learnings)
- routes.ts + run-detail.tsx: wire up retro route and tab

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 15:46:02 -05:00
Bryan Helmkamp
6d2f362cd2 Add toolbar to files changed page with checkpoint picker and diff stats
Adds a toolbar above the diffs with a checkpoint dropdown (defaulting
to "All changes"), a GitHub-style +/- diff stat indicator with colored
blocks, and a settings cog button.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-01 15:42:55 -05:00
Bryan Helmkamp
ae8faad1b2 Fix cross-browser SVG animation for running graph node
Replace CSS @keyframes animation with native SVG <animate> elements
for the pulsing glow on running nodes. CSS animations on SVG
presentation attributes (fill, stroke) are unreliable across browsers.
SVG SMIL animations work consistently in Chrome, Safari, and Firefox.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-01 15:11:57 -05:00
Bryan Helmkamp
e05abeaacf Render run graph as interactive SVG with animated running node
Replace DOT source code view with rendered SVG visualization using
viz.js. Running stages pulse with a teal glow animation, completed
stages are tinted green, and the graph supports pan/zoom/direction
controls matching the workflow diagram page.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-01 15:06:01 -05:00
Bryan Helmkamp
162318a230 Improve retros and usage UI: search, filters, layout tweaks
- Add search bar and smoothness dropdown filter to retros list
- Replace Cost column with Frictions count on retros list
- Make retro table rows fully clickable
- Move Retro tab before Usage tab in run detail
- Move Stage Breakdown below Open Items on retro page
- Add per-model breakdown table to usage page with 3 models

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-01 15:02:12 -05:00
Bryan Helmkamp
d95ad80029 Add /insights/new page for creating queries via LLM or templates
Convert insights route to a parent layout with sidebar and two children:
- index route (insights-editor) with the existing SQL editor
- /insights/new with LLM input, template cards, and SQL link

Also fix wide layout detection in app-shell to check all matched routes
instead of only the last match.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 13:49:58 -05:00
Bryan Helmkamp
810e8b4227 Add Insights page with SQL workbench UI
SQL query editor with line numbers, saved queries sidebar, history,
SQL AI dialog, chart/table results toggle, and query stats bar.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 13:38:25 -05:00
Bryan Helmkamp
a338f8a064 Add expandable check status rows and pending question text to Run cards
Replace simple CI dot indicators with rich check status data model
(CheckRun[] with per-check name, status, duration). Cards in Verify
and Merge columns show a full-width expandable status row with summary
icon and text. Clicking reveals individual check results. Pending
column cards now display the human-in-the-loop question above the
Answer Question button.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 12:53:56 -05:00
Bryan Helmkamp
7f921fb82a Add drag-and-drop sortable Run cards on Runs page
Uses @dnd-kit to make cards reorderable within their column (board view)
and group (list view). Prevents accidental navigation on drag release.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 11:16:31 -05:00
Bryan Helmkamp
3912cab183 Improve settings page with sidebar nav, section icons, and accent colors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 11:16:24 -05:00
Bryan Helmkamp
6d22a6c622 Rename arc-attractor crate to arc-workflows
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 03:05:43 -05:00
Bryan Helmkamp
4f9891427f Add hover copy button and date to session messages
Show a clipboard icon on hover below user prompts (with date)
and at the end of assistant sequences (not before tool calls).
Icon-only button, no label text.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-01 03:01:56 -05:00
Bryan Helmkamp
d2234fed8f Add model label and prompt input to session pages
Show model name (e.g. Opus 4.6) right-aligned in the session
header bar. Add a pinned text input with send button at the
bottom of each session for continuing the conversation.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:29:25 -05:00
Bryan Helmkamp
b5d8ad1494 Add columns/list toggle on Runs page and Settings page mockup
Runs: add a view toggle (columns vs list) with collapsible
status-grouped sections in list view.

Settings: populate with grouped panels (General, Git & VCS,
Compute, Notifications, Security) containing key/value fields
with text inputs, selects, and toggles. Hide redundant header.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:24:22 -05:00
Bryan Helmkamp
9b1bab7561 Add Arc logo icon next to heading on /start page
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:13:25 -05:00
Bryan Helmkamp
e054a853dd Replace fixed starter cards with expandable category menus on /start
Three category pills (Build, Review, Fix) expand into overlay panels
with prompt options, similar to Claude.ai's starter prompt pattern.
Panel renders over the pills directly below the textarea.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:11:34 -05:00
Bryan Helmkamp
2eebb00ab1 Add Start page, session chat UI, and filtering across arc-web
- /start page with AI prompt textarea, project/branch pickers, and starter workflow cards
- /sessions/:id page with chat conversation UI (user/assistant/tool turns with progressive disclosure)
- Session sidebar with grouped history (Today, Yesterday, Previous 7 days)
- Start nav tab with sparkles icon added to app shell
- Scheduled workflows with schedule badges and pause buttons on /workflows
- Trigger filter dropdown (All/Scheduled/Manual) on /workflows
- Search bar and repository filter dropdown on /runs kanban board

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 23:07:19 -05:00
Bryan Helmkamp
6d869aa8da Add asymmetric JWT service-to-service auth between arc-web and arc-attractor
Ed25519 asymmetric JWT: arc-web signs with private key, arc-attractor verifies
with public key. Adds AuthenticatedService axum extractor to all routes, jose
dependency for TypeScript signing, and key generation script.

Startup behavior: ARC_JWT_PUBLIC_KEY set → enforce JWT auth; not set +
ARC_INSECURE_DISABLE_AUTHENTICATION=true → allow unauthenticated; neither →
refuse to start with clear error.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 18:05:49 -05:00
Bryan Helmkamp
d37d2c8f49 Add run configuration and graph sub-pages under /runs/:id
Sidebar "Run Configuration" and "Workflow Graph" links now navigate to
/runs/:id/configuration and /runs/:id/graph instead of away to the
workflow detail page. Extracts CollapsibleFile into a shared component.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-28 17:17:19 -05:00
Bryan Helmkamp
ea89a62768 Link Arc logo to /workflows page
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-28 17:12:52 -05:00
Bryan Helmkamp
1418c976df Standardize border radius to rounded-md across all route components
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-28 17:12:05 -05:00
Bryan Helmkamp
1b32e1592c Add consistent rounded-md corners to file diff containers
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-28 17:07:26 -05:00
Bryan Helmkamp
043a5e2ef0 Add stage ID to stages URL for addressable stage navigation
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-28 16:59:26 -05:00
Bryan Helmkamp
73d205ca13 Add collapsible headers with line counts to File components
Wrap each File in a CollapsibleFile that restores the expand/collapse
toggle and right-aligned line/loc counts. TOML defaults to collapsed.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-28 16:53:02 -05:00
Bryan Helmkamp
615a3a2dbf Replace direct Shiki usage with @pierre/diffs File component
Use the File component from @pierre/diffs/react instead of manually
creating a Shiki highlighter instance. Register the custom DOT grammar
via attachResolvedLanguages and drop the direct shiki dependency.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-28 16:49:43 -05:00
Bryan Helmkamp
664dc91bf5 Dynamically color special DOT nodes by shape in applyTheme
Add colorSpecialNodes() that injects fill/border/font colors based on
node shape (teal for Mdiamond/Msquare, amber for hexagon/diamond),
removing the need to hardcode colors in workflow DOT data.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-28 16:45:29 -05:00
Bryan Helmkamp
854f637b60 Render stages tab as agent session with compact tool call rows
Replace stage list with single-stage agent session view showing
system prompt, assistant messages, and grouped tool calls. Tool
call/result pairs are combined into compact expandable rows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 16:23:53 -05:00
Bryan Helmkamp
cb98825d0b Add run detail sub-tabs: stages, usage, overview with diagram
- Add Usage tab with token/cost/runtime table per stage
- Add Stages tab with expandable event timeline per stage
- Add Overview tab with left sidebar (stages, workflow links) and
  interactive DOT diagram with zoom/pan/direction controls
- Style DOT subgraph labels and borders for dark theme
- Remove PR number and CI status from run detail header
- Add Open PR button to run detail header

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 16:15:05 -05:00
Bryan Helmkamp
51d58a904c Brand diff theme and reorganize run detail tabs
- Add CSS variable overrides for @pierre/diffs to match brand palette:
  navy backgrounds, mint additions, coral deletions, JetBrains Mono font
- Replace Logs tab with Overview tab as the new index route
- Move Stages to /stages sub-route
- Clean up unused imports from run-files-changed

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 15:56:43 -05:00
Bryan Helmkamp
edf52a7c9f Add breadcrumbs, run detail tabs, and split diff view
- Add breadcrumbs to workflow detail (Workflows / title) and run detail
  (Runs / workflow / title) pages for navigation context
- Add workflow field to run data model linking runs to workflows
- Add run detail sub-route placeholders (stages, files changed, logs)
- Add split diff view on files changed tab using @pierre/diffs with
  example file diffs and wide layout
- Add shiki syntax highlighting styles and app shell wide mode support

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 15:50:17 -05:00
Bryan Helmkamp
b2cf623007 Lighten button styles, add Run button, and widen runs page
- Restyle Create Workflow split button to lightweight border/mint style
- Add "Run" icon button to workflow detail header
- Remove max-width constraint for wide pages so runs board uses full width
- Remove unused nav items (Start, Insights)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 15:30:31 -05:00
Bryan Helmkamp
d980b6de12 Add collapsible code blocks and run workflow button to workflow detail
Code blocks are now expandable/collapsible with a chevron toggle, line
count, and LOC count in the header. TOML defaults collapsed, DOT
expanded. Workflow detail header gets a circular play button and
max-w-prose on the description for readability.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 15:27:01 -05:00
Bryan Helmkamp
b218c6b280 Add syntax-highlighted DOT graph display below TOML config
Add a custom Shiki TextMate grammar for GraphViz DOT files (converted
from vscode-graphviz) and display each workflow's DOT graph source
below the TOML configuration on the definition tab.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 15:07:26 -05:00