Commit graph

3107 commits

Author SHA1 Message Date
Bryan Helmkamp
90dc528c99 Add shadow commits for Docker and Daytona (feature parity)
- Change GitCheckpointMode::Remote to Remote(PathBuf) so both variants
  carry a repo path for MetadataStore shadow commits
- Unify init_run and shadow write logic to work with either Host or
  Remote mode, eliminating Host-only gates
- Add trailers (Arc-Run, Arc-Completed, Arc-Checkpoint) to remote
  checkpoint commits via write_file + git commit -F to avoid shell
  escaping issues with multi-line messages
- Wire up meta_branch for Daytona in run.rs (was only set for worktree)
- Fix sandbox name collisions by adding random hex suffix
- Fix pre-existing build_router() test compilation errors from JWT auth
- Add E2E tests for Host shadow branch and Daytona shadow branch

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 21:45:48 -05:00
Bryan Helmkamp
77b7bf7481 Support unquoted bare string values in DOT parser (e.g., gpt-5.2)
Add a bare_string parser that accepts values containing hyphens and
dots like gpt-5.2-codex-spark and gemini-3-flash-preview. These are
common in kilroy DOT files for model names but were previously rejected
by arc's strict identifier parser.

All 14 kilroy DOT files now parse successfully.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 18:09:38 -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
88f2fa245b Add kilroy DOT files and parsing compatibility tests
Copy 14 DOT workflow files from the kilroy project and add tests proving
arc can parse them. 11 files parse successfully, exercising features
including subgraphs, fan-out/fan-in, conditional routing, goal gates,
model stylesheets, and large 40+ node workflows.

3 batch test files (batch_*.dot) document a parser gap: arc requires
quoted values for strings with hyphens/dots (e.g., "gpt-5.2") while
kilroy's parser accepts them unquoted.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 18:05:34 -05:00
Bryan Helmkamp
2a82a4e147 Change default_max_retry from 50 to 3
Aligns with the kilroy implementation of the Attractor spec. A default
of 50 retries is far too aggressive for most workflows.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 18:02:30 -05:00
Bryan Helmkamp
1b26702f95 Add guardrail tests and fix config hygiene across provider system
- Add Provider::ALL constant for iterating all variants in tests
- Add catalog guardrail tests: every provider has models, provider strings
  round-trip, as_str round-trips through from_str
- Add arc-agent guardrail tests: every default_model exists in catalog,
  profile context_window matches catalog for default models
- Fix context window drift: profiles now look up catalog instead of
  hardcoding sizes, with conservative fallbacks for unknown models
- Add #[serde(deny_unknown_fields)] to config structs so typos like
  [lmm] instead of [llm] produce parse errors
- Extract DEFAULT_BASE_URL constant in OpenAI adapter

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 17:51:31 -05:00
Bryan Helmkamp
8adbf79b12 Add 3 lint rules: all_conditional_edges, orphan_custom_outcome, condition_eval
- all_conditional_edges (ERROR): fires when a node has outgoing edges but
  all are conditional with no unconditional fallback, preventing silent
  fall-through to arbitrary edge selection.
- orphan_custom_outcome (WARNING): fires when outcome-based routing lacks
  an unconditional fallback edge, catching typos in outcome values.
- Enhanced condition_syntax rule to also validate via parse_condition(),
  catching malformed expressions that pass static checks (e.g. empty key).
- Updated integration test graph to use unconditional fallback edge.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 17:51:15 -05:00
Bryan Helmkamp
631971d211 Return infrastructure errors as Err from ScriptHandler
Spawn failures (binary not found) and timeouts are infrastructure issues,
not domain failures. Return them as Err(AttractorError::Handler(...)) so
the engine can distinguish them from script exit-code failures and
potentially retry.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 17:34:01 -05:00
Bryan Helmkamp
aa0be8f379 Remove brittle built_in_rules count test
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 17:29:17 -05:00
Bryan Helmkamp
6f512c665d Fix built_in_rules count test after adding reserved keyword rule
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 17:28:32 -05:00
Bryan Helmkamp
cbb94ae9b2 Add Inception Labs (Mercury) provider
Register Inception Labs' Mercury diffusion LLM as a new provider using
the OpenAI-compatible adapter at api.inceptionlabs.ai. Adds mercury and
mercury-coder to the model catalog and wires up all exhaustive match
arms across arc-llm, arc-agent, and arc-attractor.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-28 17:25:37 -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
1245106cea Add reserved keyword node ID lint rule
Warn when DOT reserved keywords (graph, digraph, subgraph, node, edge,
strict, if) are used as node IDs since they cause silent routing failures.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-28 17:16:24 -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
2d79362750 Unify ullm, arc-agent, arc-attractor into single arc binary
Three separate binaries are replaced by a single `arc` CLI with subcommands:
  arc llm prompt/models, arc agent, arc run, arc validate, arc serve

Extract public CLI modules (arc_llm::cli, arc_agent::cli::AgentArgs/run_with_args)
so the new arc-cli crate can dispatch to each library. Integration tests migrate
to crates/arc-cli/tests/cli.rs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-02-28 17:09:30 -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
0f9606e9e3 Write final.patch (base_sha → HEAD) to logs_root after pipeline completes
Per-stage diff.patch files only capture incremental changes between
checkpoints. This adds a comprehensive final.patch covering all changes
from the run's base SHA to the final HEAD, written to logs_root for all
execution environments. Especially important for Daytona where the
sandbox is destroyed after the run.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 15:15:40 -05:00
Bryan Helmkamp
9ef45204f6 Add git checkpointing for Docker and Daytona execution environments
Git checkpoint commits (stage-level snapshots, diff.patch, GitCheckpoint
events) previously only ran for Local execution. This extends support to
Docker (bind-mount uses host git, same as Local) and Daytona (runs git
commands remotely via exec_command).

- Add GitCheckpointMode enum (Host/Remote) replacing RunConfig.work_dir
- Extract git_checkpoint_host/git_diff_host helpers from inline code
- Add git_checkpoint_remote/git_diff_remote using exec_command
- Enable git_clean check for Docker alongside Local
- Add setup_daytona_git to create run branch in remote sandbox
- Switch Daytona wrap_bash_command from quote-escaping to base64 encoding
  (matches TypeScript/Python/Ruby Daytona SDKs, avoids nested quote issues)
- Add e2e tests for both Host mode and Remote mode (Daytona, live-tested)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 15:08:22 -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
Bryan Helmkamp
bc1b5d54ab Add run detail page, link run cards, and custom workflow icon colors
- Add id field to RunItem and assign IDs to all mock runs
- Create run detail page at /runs/:id with status, changes, PR, CI info
- Link run cards in both /runs kanban board and /workflows/:name/runs list
- Add per-workflow icon color with tinted border on workflow cards

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:53:14 -05:00
Bryan Helmkamp
62c401336f Fix background gradient repeating on tall pages
Use background-attachment: fixed so the radial gradients stay anchored
to the viewport instead of tiling with the document height.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:33:11 -05:00
Bryan Helmkamp
343977d467 Add diagram controls: direction toggle, zoom, fit-to-window, drag-to-pan
- Toggle between left-to-right and top-to-bottom layout
- Zoom in/out with stepped controls
- Fit-to-window button (dashed square icon) resets zoom and pan
- Click-and-drag to pan the diagram
- Strip graph title from rendered SVG at render time

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:32:12 -05:00
Bryan Helmkamp
82060ec6e0 Add status filter, workflow icons, diagram, and UI polish
- Add status dropdown filter to workflow runs list
- Replace play button with per-workflow icons (wrench, code, sync, rocket)
- Move run button to right side as circular play icon
- Expand workflow card link target to cover icon, name, filename, status
- Render fix_build DOT pipeline diagram using @viz-js/viz

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:23:30 -05:00
Bryan Helmkamp
434c9e61f1 Update Cargo.lock for ulid dependency
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:22:24 -05:00
Bryan Helmkamp
4572012bc3 Use ULID instead of UUID for run IDs
ULIDs are lexicographically sortable by creation time, making log
directories and run lists naturally ordered without extra metadata.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:16:52 -05:00
Bryan Helmkamp
53ae30dfd4 Collapse pipeline_id and run_id into single run_id
Make RunConfig.run_id required (String instead of Option<String>) so the
caller always provides the ID. This eliminates the duplicate UUID that
was generated: one in the HTTP server / CLI and a second inside the
engine fallback.

Also fixes a bug in preamble.rs where context key "run_id" was read but
the engine stores it as "internal.run_id", so the run ID always showed
as "unknown" in preambles.

Renames PipelineStarted.id to PipelineStarted.run_id for consistency.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:15:25 -05:00
Bryan Helmkamp
300a12a4eb Refine workflow runs list: grid layout, search, CI dots, spacing
Use CSS grid with subgrid for guaranteed column alignment. Remove repo
name, add PR icon, move duration next to status, show CI as dot next
to PR number, add typeahead search. Reverse sort (Merge first).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 14:10:50 -05:00
Bryan Helmkamp
0600b2ab59 Extract shared run data, add list view for workflow runs tab
Shared data module at data/runs.ts powers both the kanban board
(/runs) and the vertical list view (/workflows/:name/runs). List view
shows status dot, repo, title, diff stats, CI badge, comments, and
elapsed time in a compact row format.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:58:40 -05:00
Bryan Helmkamp
093eecdb6e Convert workflow detail tabs to nested routes
Definition at /workflows/:name, Diagram at /workflows/:name/diagram,
Runs at /workflows/:name/runs. Detail page is now a layout with Outlet.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:56:13 -05:00
Bryan Helmkamp
4dac57685c Add workflow detail page with tabs at /workflows/:name
Detail page shows title, filename, description, and horizontal tabs
for Definition, Diagram, and Runs. Workflow names in the list are now
links to their detail pages.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:50:06 -05:00
Bryan Helmkamp
00c470297b Add workflow list cards to Workflows page
Four mock workflows with play button, name, filename, last run
status, and actions menu.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:36:16 -05:00
Bryan Helmkamp
31918b5736 Add Workflows tab, rename Workflow Runs to Runs
Workflows tab sits between Start and Runs with a stack icon.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:32:32 -05:00
Bryan Helmkamp
6839df2690 Use PlayIcon instead of PlayCircleIcon for Workflow Runs nav
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:18:16 -05:00
Bryan Helmkamp
2c70e87630 Add icons to top nav items
Rocket for Start, play circle for Workflow Runs, chart bar for
Insights, gear for Settings.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:17:43 -05:00
Bryan Helmkamp
0d95c27325 Rename Pipeline Runs to Workflow Runs, change URL to /runs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:16:45 -05:00
Bryan Helmkamp
248f8ae7fc Add Insights tab and server-side route
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:10:50 -05:00
Bryan Helmkamp
01bd717a3b Move CI badges to action row, add elapsed times to Verify/Merge cards
CI status badges now sit alongside action buttons instead of in the
metadata row. All cards now show elapsed time. Stale items (3d) get
amber warning color.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:10:20 -05:00
Bryan Helmkamp
ab88043288 Color-code Resolve button with teal-500 accent
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:05:32 -05:00
Bryan Helmkamp
4dfe86545f Switch sans-serif font from Inter to Geist
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-28 13:04:16 -05:00