- 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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
- 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>
- 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>
- 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>
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>
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>
- 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>
- 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>
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>
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>
- 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>
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>
- Add stub scripts for clone-substack (validate-*.sh, fix-fmt.sh)
- Update runner to cd into dot file directory so relative script
paths resolve correctly
- Add weight=10 to transition-patterns approve edge to avoid
review→fix loop in dry-run (mock LLM has no routing directives)
35/36 pass dry-run. clone-substack hits dry-run's hard 10-visit
safety limit on its implement loop — expected for complex looping
workflows with mock LLMs.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Add pagination params to /verifications endpoint
- Rename operationIds: listVerificationCategories, retrieveVerificationControl
- Merge VerificationStatus and EvaluationResult into unified VerificationResult enum
- Rename ControlDetail.description to rationale to avoid ambiguity
- Add 400 error response to POST /insights/execute
- Add GET /insights/queries/{id} endpoint with 404 handling
- Type ExecuteQueryResponse.rows items with oneOf instead of empty schema
- Make SavedQuery.updated_at required, default to created_at for unmodified queries
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Extract all 29 full digraph workflows from docs into test/docs/ with
an extraction script, assemble 7 snippet DOTs from reference pages,
and add a runner script for validate/dry-run/haiku/full phases.
Docs fixes:
- definition-of-done: replace multi-word condition values with
underscored equivalents (parser doesn't support spaces), make
safe-default edges unconditional for fallback coverage
- semantic-port: make fallback edges unconditional on fetch/analyze
nodes so validator doesn't reject all-conditional-edge nodes
All 36 DOTs pass `arc validate`.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Consolidates the duplicated RunListItem-to-RunItem mapping from runs.tsx,
workflow-runs.tsx, and run-detail.tsx into a single mapRunListItem function
in data/runs.ts. Also unifies the status-to-label mapping into a shared
columnNames record and fixes the O(n²) find-by-id loop in the runs loader.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace raw TOML / UI-oriented SettingGroup responses with structured
JSON that mirrors the Rust config types (WorkflowRunConfig, ServerConfig).
- Add Serialize derives to all config types in arc-workflows and arc-api
- Add manual Serialize impl for DaytonaNetwork enum
- Update OpenAPI spec: /runs/{id}/configuration returns RunConfiguration,
/settings returns ServerConfiguration, WorkflowDetail.config is now
RunConfiguration object instead of TOML string
- Remove SettingGroup/SettingField/SettingFieldType schemas
- Update demo handlers to construct and serialize real config structs
- Regenerate TypeScript client
- Simplify settings page to JSON display, update run-configuration and
workflow-definition pages to show JSON
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The API was returning human-readable strings like "2h ago" and "in 4 hours"
instead of real timestamps. The frontend now formats these for display using
timeAgo() and a new timeUntil() helper.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Regenerate TypeScript Axios client from updated OpenAPI spec. Update all
frontend route loaders to access nested field paths: repository.name,
workflow.slug, pull_request?.number, timings?.elapsed_secs,
sandbox?.id, model.id, run.id, run.title, usage.input_tokens, etc.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Update all struct constructions in demo data and server handlers to match
the new nested sub-schemas. Fix aggregate usage handler to use
AggregateUsageTotals wrapper, ModelReference, and TokenUsage. Update
test assertions from flat field paths to nested paths.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add 17 new sub-schemas (ModelReference, WorkflowReference, RunReference,
RepositoryReference, CategoryReference, TokenUsage, CodeLocation, RunError,
RunPullRequest, RunTimings, SandboxResources, RunSandbox, RunQuestion,
AggregateUsageTotals, WorkflowSchedule, WorkflowLastRun, UsageStageRef)
and restructure 11 existing schemas to use them, improving evolvability
by grouping related fields into nested objects.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Extract millis_u64 and save_json/load_json to shared crate root, replacing
identical copies in engine, parallel, human, conclusion, manifest,
checkpoint, and retro modules
- Remove exists() pre-checks before Manifest::load and Conclusion::load
in CLI runs scanner (TOCTOU anti-pattern)
- Merge duplicate cancel_run match arms for Queued/Starting/Running
- Change Conclusion.status from String to StageStatus enum
- Extract RunFilterArgs shared struct from RunsListArgs/RunsPruneArgs
- Replace hand-rolled formatDuration with formatDurationMs wrapper over
existing formatDurationSecs
- Extract duplicated ToolRow/ToolBlock components to shared tool-use.tsx
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduces a strongly typed Fidelity enum (Full, Truncate, Compact,
SummaryLow, SummaryMedium, SummaryHigh) with Display/FromStr for
string roundtripping and a degraded() method for checkpoint resume.
Updates all consumers: resolve_fidelity, build_preamble, PreambleTransform,
FidelityValidRule, and Context::fidelity() accessor now use the enum.
Invalid fidelity strings in DOT attributes are rejected at parse boundaries
rather than silently falling through to a default at usage sites.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Introduces context/keys.rs with 24 static constants, 4 prefix constants, and
4 helper functions for dynamic keys. Adds 6 typed accessor methods on Context
(run_id, fidelity, preamble, thread_id, node_visit_count, current_node_id).
Replaces all bare string literals across 13 files with constants/accessors.
Fixes bug in manager_loop.rs where "internal.node_visit" was read instead of
"internal.node_visit_count".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace ad-hoc serde_json::Value construction/parsing with typed Manifest
and RunFinal structs, matching the pattern used by Checkpoint and Retro.
This gives compile-time guarantees for field access and eliminates
stringly-typed indexing.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Capture chrono::Utc::now() once in start_run so the stored ManagedRun
and the StartRunResponse return the same created_at. Move the identical
ts() timestamp-parsing helper from 4 demo submodules to the parent scope.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Enrich the entire OpenAPI spec with descriptions, examples, format
annotations, extracted parameters, discriminated unions, and richer
response schemas — matching the patterns already established for
Sessions.
Structural changes:
- Extract CancelRunResponse and SteerRunResponse from inline schemas
- Change POST /runs/{id}/steer from 200 to 202 (async fire-and-forget)
- Split StageTurn into discriminated union (SystemStageTurn,
AssistantStageTurn, ToolStageTurn) with oneOf + discriminator
- Add status + created_at to StartRunResponse
- Add created_at to RunListItem and RunStatusResponse
- Add created_at + updated_at to SavedQuery
- Add format: date-time on RetroListItem.timestamp
- Extract 7 new reusable parameters (StageId, QuestionId, WorkflowName,
VerificationSlug, InsightQueryId, ProjectId, CheckpointFilter)
- Enrich existing RunId, PageLimit, PageOffset parameters
- Add descriptions + examples to all ~66 schemas and ~200+ properties
- Add operation descriptions to all ~35 endpoints
Rust handler updates:
- Change ManagedRun.created_at from Instant to chrono::DateTime<Utc>
- Populate new fields in StartRunResponse, RunStatusResponse
- Use new StageTurn discriminated union variants in demo data
- Update demo data timestamps to use DateTime<Utc>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Each SSE frame now includes a sequential numeric id: field. Clients can
reconnect with the Last-Event-ID header to resume the stream after the
last received event, skipping already-processed events.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add updated_at to CreateSessionResponse for consistency with SessionListItem/SessionDetail
- Add format: uuid to session ID fields and parameter across the OpenAPI spec
- Remove SessionEvent discriminated union and SessionEvent* wrapper schemas that conflated
SSE transport-level event names with JSON data payload fields
- Update demo data to use proper UUIDs instead of string IDs
- Add uuid dependency to arc-types crate
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Delete unused files (run-logs.tsx, welcome/), remove unused mock data
and functions from data modules, un-export internal types, replace array
index keys with stable identifiers, fix label/htmlFor association, add
role+onKeyDown to click-intercepting div, and convert anchor to button
in settings sidebar nav.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add created_at to AssistantTurn and ToolTurn schemas (matching UserTurn)
- Document SSE event types (assistant_turn, tool_turn, done, error) with
SessionEvent discriminated union schema
- Add title and model to CreateSessionResponse
- Add model and last_message_preview to SessionListItem
- Update demo data with timestamps, model, and preview fields
- Regenerate TypeScript API client
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the third attractor spec layer from both single-model and
multi-model variants, keeping just unified-llm and agent-loop.
Add workflow diagram SVGs with dark mode support.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Single-model and multi-model variants showing spec checklist audit,
triage, fix, and verify loops.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Mintlify requires all referenced files under docs/, so consolidate to a
single copy and eliminate the symlink and the copy step in the generate
script.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Refactor SessionTurn into discriminated union (UserTurn, AssistantTurn, ToolTurn)
using oneOf + discriminator so invalid states are unrepresentable
- Add format: date-time to all timestamp fields for proper codegen types
- Rename CreateSessionRequest.prompt to .content for consistency with SendMessageRequest
- Change sendSessionMessage from 200 to 202 (async processing via SSE)
- Extract inline response to SendMessageResponse schema
- Add updated_at to SessionListItem for sort-by-activity support
- Extract SessionId parameter to components/parameters (DRY)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>