Provides CLI access to preview URLs for ports exposed by Daytona sandboxes.
Supports standard (URL + token + curl), signed (self-contained URL), and
--open (browser launch) modes.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove --fail-with-body from curl so the response body (including error
JSON) is always captured. Previously, set -e killed the script at the
curl line on non-2xx responses before the error-checking code could run,
leaving the agent with an opaque exit code 22 and no actionable message.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace Gemini API with OpenAI /v1/images/generations endpoint in the
imagegen script. Remove unsupported response_format parameter (gpt-image-1
returns b64_json by default). Add standalone imagegen-openai workflow for
testing image generation independently.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Per-run data now lives in ~/.arc/runs/ while daily CLI log files
stay in ~/.arc/logs/. Renames: logs_root → run_dir (RunConfig field,
Handler trait param, all handlers), logs_dir → run_dir (CLI arg,
local variables), default_logs_base → default_runs_base (path fn).
Adds DB migration 002 to rename workflow_runs.logs_dir → run_dir.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Adds a switchable tracing layer that writes to ~/.arc/logs/{run-dir}/cli.log,
so all diagnostic info for a run is co-located with its other artifacts instead
of buried in the shared daily log file.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The Playwright MCP server provides a browser_install tool, so we can
drop the separate command node and let the agent install the browser
via MCP instead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Display collected assets in an "=== Assets ===" section after the run
result, so users can see which files were captured without digging
through the logs directory.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use npx directly instead of npm install, which fails due to the repo's
workspace:* protocol in package.json.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The GitHub App check was gated behind #[cfg(feature = "server")] so it
never ran in CLI-only builds. It also only checked whether env vars were
set, not whether the key could actually sign JWTs.
- Move GithubAppStatus and check_github_app out of the server feature gate
- Try sign_app_jwt to validate the private key, catching corrupt keys
- Show app_id and slug in doctor output
- Keep server-only fields (client_id, client_secret, webhook_secret)
behind #[cfg(feature = "server")]
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Port the OpenAI Codex develop-web-game skill (Playwright-based game dev
loop) into skills/develop-web-game/ with paths adapted for Arc's
workspace-relative skill discovery. Add a web-game-demo workflow that
verifies the skill and its asset files (playwright client script,
action payloads JSON) are properly discovered and accessible in a
Daytona sandbox.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Arc API, Arc Web, GitHub App, and cryptographic key checks are only
relevant when the server feature is enabled. Without this gate, `arc
doctor` showed misleading connectivity errors for services that cannot
even be started.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Return worktree_path from the match expression instead of mutating
a pre-initialized variable.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When the sandbox does not support preview URLs (e.g., local sandbox),
fall back to http://localhost:{port} instead of erroring. This makes
the sandbox MCP transport work transparently on both local and remote
(Daytona) sandboxes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- docs/agents/mcp.mdx: Remove pre-release warning. Add sandbox transport
docs alongside stdio and HTTP. Restructure configuration section to
cover both cli.toml and run config TOML. Replace filesystem example
with Playwright browser automation example.
- docs/execution/run-configuration.mdx: Add [mcp_servers] section with
field reference for all three transport types. Add to full example.
- docs/reference/cli-configuration.mdx: Add sandbox transport subsection.
Cross-reference workflow-level MCP config.
- docs/integrations/daytona.mdx: Add MCP sandbox transport to feature table.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Wire MCP server configs from workflow TOML into agent sessions so
MCP tools are available to agent stages during workflow runs.
Changes:
- run_config.rs: add mcp_servers HashMap to WorkflowRunConfig
- backend.rs: AgentApiBackend.with_mcp_servers() passes configs to SessionConfig
- run.rs: extract mcp_servers from RunConfig and pass to backend
- demo/mod.rs: add default mcp_servers field to struct literals
New workflow: arc/workflows/playwright-demo/
- Runs on Daytona with daytona-medium snapshot
- Configures Playwright MCP as a sandbox transport (port 3100)
- Agent browses Hacker News, takes screenshots at each step
- asset_globs captures screenshots/** into logs directory
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Adds McpTransport::Sandbox variant that starts an MCP server inside the
sandbox, waits for it to listen, gets a Daytona preview URL, and rewrites
to HTTP transport for the MCP client connection.
Key changes:
- Sandbox trait: add get_preview_url(port) for authenticated port access
- DaytonaSandbox: implement get_preview_url via Daytona SDK preview links
- McpTransport::Sandbox: new variant with command, port, env fields
- Session: resolve_sandbox_mcp_servers() starts servers and rewrites to HTTP
- Integration test: end-to-end Playwright MCP in Daytona - navigates to
example.com and verifies "Example Domain" in accessibility snapshot
Config example:
[mcp_servers.playwright]
type = "sandbox"
command = ["npx", "@playwright/mcp@latest", "--port", "3100", "--headless"]
port = 3100
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Expose the Daytona SDK's ComputerUseService through DaytonaSandbox so
callers can start the virtual desktop, take screenshots, and interact
with mouse/keyboard programmatically.
The new integration test validates the full flow: start the desktop
environment, launch Chromium on DISPLAY=:0, and capture a screenshot
of example.com via the Computer Use API.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove API server and web frontend instructions from quick start, replacing
them with a note about standalone vs. server mode. Add under-development
warning to API overview. Add server deployment stub page to Guides.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Warn users that exe.dev and devcontainer features are under active
development and may require special build flags.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Exe sandbox variant, its config field, and all arc_exe usage in
arc-workflows are now behind #[cfg(feature = "exedev")]. Default CLI
builds skip arc-exe and openssh entirely. arc-api enables exedev since
its demo module constructs full SandboxConfig structs.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
cargo build / cargo build --release now only compiles arc-cli and its
transitive deps, skipping arc-api, arc-slack, arc-db, arc-types, sqlx,
axum, etc. Use --workspace to build everything.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
CLI-only builds no longer pull in arc-api and its heavy server
dependencies (axum, tower, hyper, sqlx, arc-db, arc-types) unless
the server feature is explicitly enabled.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Centralizes config types (ServerConfig, CliConfig, expand_tilde) into a
new arc-config crate. Makes arc-api an optional dependency of arc-cli
behind a default-on "server" feature flag, so CLI-only builds skip heavy
server deps (axum, tower, hyper, sqlx, arc-db, arc-types).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Drop session before awaiting event_writer_handle to close the
broadcast channel, preventing a deadlock where the spawned task
waits for senders to drop while session is still alive.
Move subscribe() before initialize() so the SessionStarted event
is captured in retro_session.jsonl.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Use 4-backtick fences for plan section to prevent LLM-generated
triple backticks from breaking the markdown. Fix singular/plural
grammar for stage, node, and edge counts.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Reject negative durations in parse_duration (i64 -> u64) to prevent
future cutoff that would delete everything
- Remove orphans flag from has_explicit_filters since --orphans is
additive, not restrictive, and shouldn't disable the 24h staleness guard
- Use parsed label_filters instead of raw args.filter.label so malformed
labels that get silently dropped don't incorrectly disable staleness
- Replace derived Serialize with custom impl delegating to Display for
RunStatus, fixing JSON serialization (was producing null/tagged objects
instead of flat strings)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show colored "error:" prefix with cause chain for all CLI errors. When a
workflow name isn't found in a project with arc.toml, list available
workflows and suggest the closest match using Levenshtein distance.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Users can now set `[arc] retro = false` in arc.toml instead of passing
`--no-retro` on every `arc run` invocation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rename directory and adopt workflow.{toml,dot} convention so
`arc run implement` resolves via project config.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
`arc run my-workflow` now resolves to `{arc_root}/workflows/my-workflow/workflow.toml`
when an arc.toml project config exists. Args with file extensions are passed through
unchanged, and missing workflows fall back to the literal arg.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>