Commit graph

920 commits

Author SHA1 Message Date
Bryan Helmkamp
ec7fc8d5a2 Add arc preview command for Daytona sandbox preview URLs
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>
2026-03-10 11:55:47 -04:00
Bryan Helmkamp
98de349f20 Add vnc test 2026-03-10 11:32:09 -04:00
Bryan Helmkamp
9644e2614e Add golden-gate demo 2026-03-10 11:32:02 -04:00
Bryan Helmkamp
7e441145be Remove pre-specified image from imagegen-openai 2026-03-10 11:31:47 -04:00
Bryan Helmkamp
74a0b89ca1 Fix imagegen script dying before error handling on API failures
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>
2026-03-10 10:24:13 -04:00
Bryan Helmkamp
ad8a91388d Switch imagegen to OpenAI gpt-image-1 and add imagegen-openai demo
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>
2026-03-10 10:22:44 -04:00
Bryan Helmkamp
1dcad0529a Split ~/.arc/logs/ into logs/ and runs/
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>
2026-03-10 09:40:03 -04:00
Bryan Helmkamp
54ecae9586 Write per-run tracing logs to cli.log inside each run directory
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>
2026-03-10 09:30:00 -04:00
Bryan Helmkamp
ae5bdd4446 Hide arc ps subcommand from help output
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 09:22:19 -04:00
Bryan Helmkamp
9ae9e7b0b6 Simplify imagegen workflow 2026-03-10 09:18:01 -04:00
Bryan Helmkamp
53e218926f Print full ~/... paths for assets instead of sandbox-relative paths
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 09:14:24 -04:00
Bryan Helmkamp
1263637211 Replace install_playwright command node with Playwright MCP server
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>
2026-03-10 09:02:55 -04:00
Bryan Helmkamp
5883b71efd Print captured asset paths after workflow run output
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>
2026-03-10 09:01:52 -04:00
Bryan Helmkamp
1552ea4380 Fix playwright install command in web-game-demo workflow
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>
2026-03-10 08:56:25 -04:00
Bryan Helmkamp
5515c11aad Add GitHub App check to arc doctor for all builds, validate private key
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>
2026-03-10 08:55:14 -04:00
Bryan Helmkamp
9feb2c699b Add develop-web-game skill and verification workflow
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>
2026-03-10 08:41:12 -04:00
Bryan Helmkamp
03ac5bc6ac Hide llm, exec, and parse commands from CLI help output
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 08:25:49 -04:00
Bryan Helmkamp
ea73e40070 Gate server-only doctor checks behind #[cfg(feature = "server")]
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>
2026-03-10 08:23:48 -04:00
Bryan Helmkamp
3a7f5cdb6c Fix unused_assignments warning in run_from_branch
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>
2026-03-10 08:20:24 -04:00
Bryan Helmkamp
7a18faa712 Fall back to localhost for sandbox MCP transport on local sandboxes
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>
2026-03-10 08:14:37 -04:00
Bryan Helmkamp
2079677e50 Move standalone vs. server mode content to Note callout at top of quick start
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 08:13:46 -04:00
Bryan Helmkamp
ca124638ae Document MCP sandbox transport and workflow-level MCP configuration
- 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>
2026-03-10 08:10:05 -04:00
Bryan Helmkamp
878eccb58e Add Status column and Sprites provider to environments docs
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-10 08:09:52 -04:00
Bryan Helmkamp
08461fe603 Add MCP server support to workflow engine and Playwright demo workflow
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>
2026-03-10 08:05:12 -04:00
Bryan Helmkamp
d426eebf1a Add sandbox MCP transport for running MCP servers inside Daytona sandboxes
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>
2026-03-10 02:09:04 -04:00
Bryan Helmkamp
2e1015241e Add DaytonaSandbox::computer_use() and browser screenshot integration test
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>
2026-03-10 01:54:14 -04:00
Bryan Helmkamp
fef76409e5 Update docs for arc cp, arc pr create, arc system df, worktree mode, and draft PR default
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:45:26 -04:00
Bryan Helmkamp
30eb9493d7 Promote arc cp, arc pr create, and arc system df to changelog heroes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:40:18 -04:00
Bryan Helmkamp
38ab017c69 Update 2026-03-09 changelog with project config, arc cp, and new CLI commands
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-10 00:38:44 -04:00
Bryan Helmkamp
281beb9528 Simplify quick start to standalone mode and add server deployment stub
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>
2026-03-10 00:29:47 -04:00
Bryan Helmkamp
a38f5f3995 Add under-development warnings to feature-flagged docs pages
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>
2026-03-10 00:20:07 -04:00
Bryan Helmkamp
a0a43611b7 Gate arc-exe behind exedev feature flag
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>
2026-03-10 00:08:09 -04:00
Bryan Helmkamp
3302cb1991 Set default-members to arc-cli so bare cargo build skips server crates
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>
2026-03-09 23:59:50 -04:00
Bryan Helmkamp
e776fb9bb1 Disable server feature by default in arc-cli
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>
2026-03-09 23:52:49 -04:00
Bryan Helmkamp
11414c15b2 Add arc-config crate and make arc-api optional via server feature flag
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>
2026-03-09 23:50:41 -04:00
Bryan Helmkamp
1adc580e43 Remove export prefix from .env.example for standard dotenv format
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 23:46:44 -04:00
Bryan Helmkamp
53d1943ee5 Fix deadlock and missed event in retro agent session
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>
2026-03-09 22:54:27 -04:00
Bryan Helmkamp
b4045ffc3c Fix PR body rendering bugs found in PR #15 code review
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>
2026-03-09 22:53:05 -04:00
Bryan Helmkamp
1846846e72 Apply rustfmt formatting and add missing newlines at end of files
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 22:42:37 -04:00
Bryan Helmkamp
1d0cfb8250 Fix 4 safety bugs in arc system prune found in PR #14 code review
- 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>
2026-03-09 22:41:14 -04:00
Bryan Helmkamp
832c48ce5b Improve fatal error display with colored output and workflow suggestions
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>
2026-03-09 19:29:01 -04:00
Bryan Helmkamp
9db3af8fc6 Move pushed branch and PR URL output to end-of-run summary
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 19:29:01 -04:00
Bryan Helmkamp
6158525151 Disable retros project-wide in arc.toml
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 19:29:01 -04:00
Bryan Helmkamp
d61d06356e Add retro setting to project config to disable retros project-wide
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>
2026-03-09 19:29:01 -04:00
Bryan Helmkamp
45ccdcee57 Add hello workflow as a minimal hello world example
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-09 19:29:01 -04:00
Bryan Helmkamp
967ec77e72 Rename implement-and-simplify workflow to implement
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>
2026-03-09 19:29:01 -04:00
Bryan Helmkamp
9f86d55c74 Add workflow name resolution for arc run via project config
`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>
2026-03-09 19:29:00 -04:00
arc-1e68f1[bot]
9e37e3781d Plan: Capture retro agent session artifacts (#16)
* arc(01KKA4QR49XGY9Q12STJ1FP5NK): toolchain (success)

Arc-Run: 01KKA4QR49XGY9Q12STJ1FP5NK
Arc-Completed: 2
Arc-Checkpoint: 0a616fa7672723af64754a893fc3ed42cacdcb50

* arc(01KKA4QR49XGY9Q12STJ1FP5NK): preflight_compile (success)

Arc-Run: 01KKA4QR49XGY9Q12STJ1FP5NK
Arc-Completed: 3
Arc-Checkpoint: fb89baa538b1c164ca6df514412aa54d33446d54

* arc(01KKA4QR49XGY9Q12STJ1FP5NK): preflight_lint (success)

Arc-Run: 01KKA4QR49XGY9Q12STJ1FP5NK
Arc-Completed: 4
Arc-Checkpoint: baa5b36b28d0a4cf775a5280530170878a92cb89

* arc(01KKA4QR49XGY9Q12STJ1FP5NK): implement (success)

Arc-Run: 01KKA4QR49XGY9Q12STJ1FP5NK
Arc-Completed: 5
Arc-Checkpoint: eda1f9e3f979c36927edc5af6babc8eecc38411c

* arc(01KKA4QR49XGY9Q12STJ1FP5NK): simplify (success)

Arc-Run: 01KKA4QR49XGY9Q12STJ1FP5NK
Arc-Completed: 6
Arc-Checkpoint: d7da8a2f8b410252de34588c7f191eb1687ed7e0

* arc(01KKA4QR49XGY9Q12STJ1FP5NK): verify (success)

Arc-Run: 01KKA4QR49XGY9Q12STJ1FP5NK
Arc-Completed: 7
Arc-Checkpoint: 96eacc9ed8f736a9879e3a71db6d590076f7c1b8

---------

Co-authored-by: arc <arc@local>
2026-03-09 17:06:21 -04:00
arc-1e68f1[bot]
234a0b340b Improve auto-PR body (#15)
* arc(01KKA1C8TC89GDRHJ6ZP4SNQDA): toolchain (success)

Arc-Run: 01KKA1C8TC89GDRHJ6ZP4SNQDA
Arc-Completed: 2
Arc-Checkpoint: 498faecda2dc4e1af5ca3928309c3259b07b391f

* arc(01KKA1C8TC89GDRHJ6ZP4SNQDA): preflight_compile (success)

Arc-Run: 01KKA1C8TC89GDRHJ6ZP4SNQDA
Arc-Completed: 3
Arc-Checkpoint: 7a4a66e785c31d1daa85916579bb4da6e41c3ccd

* arc(01KKA1C8TC89GDRHJ6ZP4SNQDA): preflight_lint (fail)

Arc-Run: 01KKA1C8TC89GDRHJ6ZP4SNQDA
Arc-Completed: 4
Arc-Checkpoint: 2125ff48cf4bc9e134f2c8daaae10d5f21408f6b

* arc(01KKA1C8TC89GDRHJ6ZP4SNQDA): fix_lints (success)

Arc-Run: 01KKA1C8TC89GDRHJ6ZP4SNQDA
Arc-Completed: 5
Arc-Checkpoint: ad003c4332d4143730eee21a5176bd374ca28860

* arc(01KKA1C8TC89GDRHJ6ZP4SNQDA): preflight_lint (success)

Arc-Run: 01KKA1C8TC89GDRHJ6ZP4SNQDA
Arc-Completed: 6
Arc-Checkpoint: 16c2539fc7fe5c2323464ebd50d84e809492dbdc

* arc(01KKA1C8TC89GDRHJ6ZP4SNQDA): implement (success)

Arc-Run: 01KKA1C8TC89GDRHJ6ZP4SNQDA
Arc-Completed: 7
Arc-Checkpoint: 07d0b619eee31bddd70565815c27b96cd0a1c7ca

* arc(01KKA1C8TC89GDRHJ6ZP4SNQDA): simplify (success)

Arc-Run: 01KKA1C8TC89GDRHJ6ZP4SNQDA
Arc-Completed: 8
Arc-Checkpoint: 8a60dfa4af1fb6cb339dc4ef46d911b5b23a7e17

* arc(01KKA1C8TC89GDRHJ6ZP4SNQDA): verify (success)

Arc-Run: 01KKA1C8TC89GDRHJ6ZP4SNQDA
Arc-Completed: 9
Arc-Checkpoint: 85cb349c21739879c2517215b3201567a4d92ea4

---------

Co-authored-by: arc <arc@local>
2026-03-09 16:38:44 -04:00
arc-1e68f1[bot]
d432d370c0 Improve arc system prune (#14)
* arc(01KKA1A9ZHFMWM3T9VC6HBWJ19): toolchain (success)

Arc-Run: 01KKA1A9ZHFMWM3T9VC6HBWJ19
Arc-Completed: 2
Arc-Checkpoint: a38cd3755e5a5ad6a406e3557665c3ea6ba06cc7

* arc(01KKA1A9ZHFMWM3T9VC6HBWJ19): preflight_compile (success)

Arc-Run: 01KKA1A9ZHFMWM3T9VC6HBWJ19
Arc-Completed: 3
Arc-Checkpoint: 62150d0142e04fad46092b85e5942ac1979da51b

* arc(01KKA1A9ZHFMWM3T9VC6HBWJ19): preflight_lint (fail)

Arc-Run: 01KKA1A9ZHFMWM3T9VC6HBWJ19
Arc-Completed: 4
Arc-Checkpoint: 2a213ceb22392e2dd1e00c4e66912ed57f0972af

* arc(01KKA1A9ZHFMWM3T9VC6HBWJ19): fix_lints (success)

Arc-Run: 01KKA1A9ZHFMWM3T9VC6HBWJ19
Arc-Completed: 5
Arc-Checkpoint: e9d720a9e2288664ebea475c4a1445532fde3ed9

* arc(01KKA1A9ZHFMWM3T9VC6HBWJ19): preflight_lint (success)

Arc-Run: 01KKA1A9ZHFMWM3T9VC6HBWJ19
Arc-Completed: 6
Arc-Checkpoint: 8ef9490d981389c374970e0374ef48198fb19829

* arc(01KKA1A9ZHFMWM3T9VC6HBWJ19): implement (success)

Arc-Run: 01KKA1A9ZHFMWM3T9VC6HBWJ19
Arc-Completed: 7
Arc-Checkpoint: 063ba4fe9554c6e0d16aaad40c4ffc7badbd0511

* arc(01KKA1A9ZHFMWM3T9VC6HBWJ19): simplify (success)

Arc-Run: 01KKA1A9ZHFMWM3T9VC6HBWJ19
Arc-Completed: 8
Arc-Checkpoint: 4c1319c2a2d7c818faa460413e7993c93d30750f

* arc(01KKA1A9ZHFMWM3T9VC6HBWJ19): verify (success)

Arc-Run: 01KKA1A9ZHFMWM3T9VC6HBWJ19
Arc-Completed: 9
Arc-Checkpoint: a01dd1e93b231415be85a1925f90b6fedf1844fc

---------

Co-authored-by: arc <arc@local>
2026-03-09 16:38:35 -04:00