Commit graph

638 commits

Author SHA1 Message Date
Bryan Helmkamp
73d2d7918c Add --mode standalone|server CLI support for arc models list
Commands can now delegate to a running Arc API server instead of
executing in-process. Adds ExecutionMode, ServerDefaults, and
ClientTlsConfig to cli.toml parsing with CLI flag > config > default
precedence. The models list command fetches from GET /models when in
server mode, with mTLS client certificate auth when [server.tls] is
configured.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 11:03:55 -05:00
Bryan Helmkamp
2eae4224e1 Add marketing homepage with Tailwind CSS and brand colors
Sets up Tailwind v4 via @tailwindcss/vite, adds the full brand palette
(teal, navy, ice, mint, amber, coral) as custom theme tokens, and builds
a complete homepage with hero, feature grid, code examples, verification
section, multi-model section, observability, "Why Arc", and CTAs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 11:03:27 -05:00
Bryan Helmkamp
a15425762e Move Models API, Verification API, and streaming logs into accordion sections
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 11:02:03 -05:00
Bryan Helmkamp
5877d203ed Move Structured API schemas into API accordion section
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 11:00:57 -05:00
Bryan Helmkamp
19008842a6 Move Retro detail API into accordion section
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 11:00:30 -05:00
Bryan Helmkamp
7de04c9d1b Use Accordion-based More section in changelog entries
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:59:56 -05:00
Bryan Helmkamp
0b459a99a5 Add changelog entries for March 6-7, 2026
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:58:06 -05:00
Bryan Helmkamp
c1630b5a21 Restructure ModelInfo into nested shape with new fields
Replaces flat ModelInfo fields with nested sub-structs (ModelLimits,
ModelFeatures, ModelCosts) and adds family, training, and
cache_input_cost_per_mtok fields to enrich the model catalog.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:44:25 -05:00
Bryan Helmkamp
5415b2db7c Add VS Code integration and Devcontainers stub pages
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:41:01 -05:00
Bryan Helmkamp
4a95fac48f Remove unnecessary Vec allocation in debug log
HashMap::keys() already implements Debug, no need to collect into a Vec.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:38:01 -05:00
Bryan Helmkamp
8d60411e49 Add Integrations and Deployment stub pages to docs sidebar
Add Integrations group (GitHub, Daytona, Slack, exe.dev, Brave Search)
to Documentation tab above Reference. Replace generic Deployment page
with platform-specific stubs (Railway, Render, Fly.io, Digital Ocean)
in the Guides tab.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:37:28 -05:00
Bryan Helmkamp
4cefad86eb Fix sub-workflow context diff leaking child internals into parent
Filter engine-internal keys (internal.*, graph.*, thread.*, current*)
from the context diff returned by SubWorkflowHandler, preventing child
run state from overwriting parent values. Pass the parent's preamble
into the child context so child workflows have awareness of what the
parent already accomplished.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:31:50 -05:00
Bryan Helmkamp
cef888177c Move Deployment below Example Workflows in Guides sidebar
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:22:06 -05:00
Bryan Helmkamp
a4764adb4e Simplify JWT auth description in OpenAPI spec
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:21:34 -05:00
Bryan Helmkamp
f5588fcee2 Add Models to API sidebar and simplify JWT auth description
- Add GET /models endpoint to API Reference sidebar
- Replace verbose JWT claim details with link to Authentication guide
- Split advanced-setup into server-configuration, deployment, and troubleshooting pages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:21:20 -05:00
Bryan Helmkamp
b6c549e1fc Simplify list_models: pass ModelInfo directly to paginated_response
ModelInfo already derives Serialize with matching field names, so the
manual json!({...}) mapping was redundant. Matches the pattern used by
every other paginated handler in demo/mod.rs.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:16:36 -05:00
Bryan Helmkamp
116046502c Add GET /models endpoint returning paginated LLM catalog
Exposes the embedded model catalog (same data as `arc models list`) via
a new authenticated API endpoint so the web UI can display available models.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:12:21 -05:00
Bryan Helmkamp
0eeaf4cb79 Add Logs Directory reference page to docs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:08:42 -05:00
Bryan Helmkamp
31ebd12c17 Add Astro marketing website with React integration
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:03:33 -05:00
Bryan Helmkamp
131b71aea9 Update docs tutorials, examples, and add sub-workflow tutorial
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-07 10:01:53 -05:00
Bryan Helmkamp
72c1e0759f Rename verification API: categories → criteria, separate controls endpoints
Restructure the verification API from a flat `/verifications` namespace to
`/verification/criteria` and `/verification/controls` as distinct resources.
Singularize the run sub-resource path to `/runs/{id}/verification`.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 09:49:18 -05:00
Bryan Helmkamp
9607d38381 Add exe.dev sandbox provider to docs (beta)
Document the new exe.dev cloud VM sandbox provider across
environments, sandboxing, and advanced-setup pages. Includes
beta warning callout, provider tables, and troubleshooting.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 09:47:32 -05:00
Bryan Helmkamp
9b481fb6c0 Move warning callouts to bottom of changelog pages
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 09:47:24 -05:00
Bryan Helmkamp
ce80cb6101 Extract outcome and failure_reason from LLM routing directives
The extract_status_fields function recognized "outcome" as a field for
detecting status JSON objects but never read its value — LLM responses
like {"outcome": "fail", "failure_reason": "tests failed"} were silently
ignored and the outcome was always Success.

Now extract_status_fields reads the outcome field to set the node status
and failure_reason to populate the failure detail. Also adds a fallback:
if no routing directives are found in the response text, the handler
reads status.json from the sandbox CWD (written by agents that prefer
file output over inline JSON). Response text always takes priority.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 09:38:16 -05:00
Bryan Helmkamp
5df7e178ac Add SandboxProvider::Exe for exe.dev VM sandboxes
New `arc-exe` crate that runs agent tool operations inside ephemeral
exe.dev VMs via SSH. Uses two SSH connections: a management plane
(`ssh exe.dev`) for VM lifecycle and a data plane (`ssh vmname.exe.xyz`)
for command execution and file I/O.

Includes SshRunner trait with MockSshRunner for unit tests and
OpensshRunner for real SSH, with raw_mode for the exe.dev management
plane's custom command handler.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 09:18:00 -05:00
Bryan Helmkamp
a67c1be788 docs 2026-03-07 03:55:17 -05:00
Bryan Helmkamp
c82fdf81d6 Add gpt-5.3-codex-spark to model catalog
OpenAI's Codex Spark is a smaller, faster codex derivative on Cerebras
hardware (1000 tok/s, 128K context, text-only, no pricing yet).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 03:46:58 -05:00
Bryan Helmkamp
98066669b3 Fix turn/tool-call counts always showing 0 in non-TTY mode
The active_stages map was only populated inside a TTY renderer guard,
so Plain mode never tracked counts. Move counters to a separate
stage_counts map that is always populated regardless of renderer.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 03:33:19 -05:00
Bryan Helmkamp
b2f8a55b8f Fix push credentials for public repos in Daytona sandbox
resolve_clone_credentials was short-circuiting for public repos,
returning no token. This broke git push from the sandbox since push
requires authentication regardless of repo visibility. Always generate
an installation access token.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 03:20:53 -05:00
Bryan Helmkamp
4d9b0828c1 Fix ensure_cli for Daytona: rootless Node.js install, better errors
- Replace apt-get/NodeSource install (requires root) with direct Node.js
  binary download to ~/.local (works as non-root daytona user)
- Run node install + npm install in single shell so PATH persists
- Add ~/.local/bin to PATH in env file and version check
- Fall back to stdout for error details when stderr is empty (Daytona
  always returns empty stderr)
- Add e2e assertion that cli_stdout.log is written during poll
- Verified on Daytona with haiku: ensure_cli installs in 2s, full
  workflow succeeds

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 02:01:47 -05:00
Bryan Helmkamp
50aaf22f8c Auto-install agent CLIs in sandboxes when missing
AgentCliBackend now detects missing CLIs at runtime and installs them
on-demand (including Node.js via NodeSource if needed), removing the
need for custom Dockerfiles that pre-install CLI tools.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 01:44:14 -05:00
Bryan Helmkamp
bb48b0d33b Centralize model defaults in catalog, upgrade OpenAI default to gpt-5.4
Remove hardcoded default_model_for_provider() from arc-workflows and
default_model() from arc-agent, delegating both to the catalog via
arc_llm::catalog::default_model_for_provider(). Add claude-sonnet-4-6
to catalog and move "sonnet"/"claude-sonnet" aliases to it.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 00:59:28 -05:00
Bryan Helmkamp
378c3eb3e3 Stream CLI stdout/stderr to stage logs during poll
Sync cli_stdout.log and cli_stderr.log to stage_dir each poll iteration
so there is visibility into what the CLI agent is doing before it finishes.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-07 00:58:40 -05:00
Bryan Helmkamp
552e7d7636 Use setsid to detach CLI process, touch emitter during poll
Daytona's POST /process/execute blocks until all descendant processes
exit. The backgrounded claude process kept the API hanging, causing a
60-second HTTP timeout. Using setsid creates a new session so the child
is fully detached — the API now returns in ~200ms.

Also touch the event emitter during the poll loop to prevent the stall
watchdog from killing the stage while waiting for claude to finish.

Falls back gracefully on macOS where setsid isn't available (not needed
since the local exec implementation doesn't wait for grandchildren).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 23:36:00 -05:00
Bryan Helmkamp
92f7524ed0 Refine changelog: stricter hero bar, new categories, month grouping
Apply the changelog guide across all entries: demote incremental
changes (endpoints, flags, syntax options) from hero sections to
categorized accordion footers (API, CLI, Workflows, Fixes,
Improvements). Combine related hero sections (e.g. three hook types
into one). Add "## More" heading above accordion sections. Group
sidebar navigation by month.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 21:54:53 -05:00
Bryan Helmkamp
e1ce471cbe Adopt Linear-style progressive disclosure in changelog
Wrap fixes, improvements, and API changes in Accordion components
so the hero features stay prominent and details are expandable.
Add a changelog writing guide documenting the editorial approach.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 20:55:29 -05:00
Bryan Helmkamp
e532842a3b CLI backend: background+poll to avoid HTTP proxy timeouts on Daytona
Daytona's POST /process/execute is synchronous and blocks until the
command finishes. Long-running CLI agent sessions (claude, codex, gemini)
cause HTTP proxy timeouts. Replace the single blocking exec_command with
a background launch + poll pattern:

- Generate UUID-based temp file paths to avoid collisions between
  concurrent CLI nodes
- Disable sandbox auto-stop before launching (new Sandbox trait method)
- Launch command in background, capture PID
- Poll every 5s for exit code file
- Read stdout/stderr from temp files after completion
- Cleanup temp files

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 19:52:13 -05:00
Bryan Helmkamp
4e0f990484 Push run branch to origin after each Daytona checkpoint
When a workflow runs on a Daytona sandbox, commits on the run branch
are lost when the sandbox is deleted. This pushes the run branch to
origin after each checkpoint so the full commit history is preserved.

- Upgrade GitHub App token permission from contents:read to contents:write
- Add refresh_push_credentials to Sandbox trait (default no-op)
- Store origin URL on DaytonaSandbox and configure push credentials after clone
- Implement refresh_push_credentials on DaytonaSandbox to rotate expiring tokens
- Add git_push_remote helper, called after each remote GitCheckpoint
- Add e2e test verifying the branch appears on GitHub after push

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 19:38:53 -05:00
Bryan Helmkamp
4aa5aae691 Fix duplicate .env vars on re-setup, capture GitHub App slug
Replace append-based .env writing with mergeEnv() that upserts keys,
preventing duplicates when setup runs multiple times. Capture the GitHub
App slug from the manifest API response and persist it in TOML config
so we can construct installation URLs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 19:28:00 -05:00
Bryan Helmkamp
bec07c2218 CLI backend: forward API keys via env file, add --verbose for claude, log stdout/stderr on failure
- Write provider API key to /tmp/arc_cli_env.sh and source it before
  running the CLI tool (Daytona exec API doesn't support env vars)
- Add --verbose flag to claude command (required with -p + stream-json)
- Log cli_stdout.log and cli_stderr.log on failure for debugging
- Fall back to stdout in error message when stderr is empty

Known limitation: CLI backend on Daytona times out for long-running
claude sessions due to Daytona proxy execute API timeout.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 17:45:38 -05:00
Bryan Helmkamp
de2458c518 Forward provider API keys to sandbox, wire up Daytona env vars, improve CLI error logging
- Collect provider API key env vars and pass them to sandbox exec_command
  so CLI tools can authenticate in the sandbox environment
- Wire up previously-ignored env_vars parameter in DaytonaSandbox, explicitly
  set all ExecuteCommandOptions fields (catches new fields at compile time)
- Write stdout/stderr logs on CLI failure, fall back to stdout in error detail

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 17:01:09 -05:00
Bryan Helmkamp
adc70b6cef Filter preamble noise: exclude meta nodes, blank context values, empty sections
- Skip start/exit nodes from all preamble modes (compact, summary high/medium/low)
- Exclude blank-string context values (e.g. failure_class: "") from context sections
- Emit section headers lazily so they don't appear when all content is filtered
- Exclude meta nodes from summary:high pipeline progress counts

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 16:38:24 -05:00
Bryan Helmkamp
a039d54817 Skip writing empty diff.patch and final.patch files
Add !patch.is_empty() guards so per-node diff.patch and top-level
final.patch are only written when there are actual code changes.
Eliminates noise from empty patch files.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 16:30:44 -05:00
Bryan Helmkamp
9f6da0748c Restore backend-demo CLI mode with Daytona snapshot that installs claude
The run.toml specifies a Dockerfile with node:22 + @anthropic-ai/claude-code
so the Daytona sandbox has the claude CLI available for backend="cli" testing.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 16:27:30 -05:00
Bryan Helmkamp
181aecc301 Improve CLI backend error message, parallel test runner, fix backend-demo
- CLI backend: show last 500 chars of stderr (not first), and include
  the command itself when stderr is empty (e.g. exit code 127)
- Test runner: add PARALLEL env var for concurrent execution
- backend-demo.dot: use API backend since claude CLI isn't in sandbox

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 16:17:45 -05:00
Bryan Helmkamp
e4f953acfc Simplify retro filtering: typed smoothness, remove double serialization
- Use SmoothnessRating enum instead of String for smoothness filter param
- Remove duplicate default_page_limit(), reuse pub fn from server module
- Replace Json(json!(detail)) with Json(detail) to avoid double serialization

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 16:07:51 -05:00
Bryan Helmkamp
36ab4c6992 Add typed RetroDetail schema and filtering to retros API
Replace untyped JSON blob on /runs/{id}/retro with a structured RetroDetail
schema mirroring the Rust Retro type. Add workflow and smoothness filter
parameters to /retros. Document optionality of smoothness and total_cost fields.
Convert demo handler from inline JSON to typed structs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 15:54:17 -05:00
Bryan Helmkamp
942f717eb4 Fix GitHub App repo visibility check: treat 401/403 as private
The is_repo_public function called GET /repos/{owner}/{repo} with
the App JWT, but GitHub returns 401 for App JWTs on the repos
endpoint (they need an installation token). Previously this 401
was treated as an auth error, failing sandbox init.

Now 401 and 403 are treated like 404: assume private and proceed
to create an installation access token, which has the right perms.

Also add preflight phase to the DOT test runner.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 15:44:00 -05:00
Bryan Helmkamp
a58bebff8b Fix 9 OpenAPI review items for run internals, workflows, and configuration
- Define typed RunCheckpoint schema replacing untyped object on checkpoint endpoint
- Rename WorkflowDetail.title to name for consistency with WorkflowListItem
- Make RunConfiguration.goal optional (only version and graph required)
- Add optional requestBody (StartWorkflowRunRequest) to startWorkflowRun
- Remove dead tools field from SystemStageTurn and AssistantStageTurn
- Add cancelled to StageStatus enum
- Document HookDefinition field-to-type mapping
- Add oneOf type to DaytonaConfiguration.network (string enum or allow_list object)
- Document stages pagination cardinality (bounded by graph size, typically <20)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 15:31:54 -05:00
Bryan Helmkamp
72c0c8e257 Fix 10 OpenAPI review items for HITL, run outputs, and verifications
Addresses agreed items from the openapi-hitl-and-run-outputs review:
rename retrieveRunDiff operationId, add 409s to steer/preview, bound
expires_in_secs, add selected_option_keys for multi-select end-to-end,
document skip/na semantics, add slug and require type on
RunVerificationControl, require file on CodeLocation, and remove the
checkpoint "all" sentinel in favor of omitting the parameter.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-06 15:13:06 -05:00