Commit Graph
25 Commits
Author SHA1 Message Date
Gabriel Brown 76886621b5 feat(worker): ClaudeCodeAdapter runs claude -p stream-json in the per-user box 2026-07-11 10:35:56 -04:00
Gabriel Brown c9ee2e6cde refactor(worker): delete per-job OpenCode container path, host_port split, and dead docker helpers
Claude-Session: https://claude.ai/code/session_01ScyZ1NhfN84LAnHpwhfEQk
2026-07-11 10:26:58 -04:00
Gabriel Brown ff0425cf4b feat(worker): OpenCodeAdapter runs opencode in the per-user box (no side container) 2026-07-11 10:07:58 -04:00
Gabriel Brown 949a036d13 fix(worker): surface nonzero-exit agent turns as failed even when text streamed 2026-07-11 10:07:14 -04:00
Gabriel Brown e5bba720b4 refactor(worker): move Codex turn logic into CodexAdapter behind AgentRuntime 2026-07-11 02:53:26 -04:00
Gabriel Brown c1e816741d fix(worker): marked-command survives tail-exec; kill script excludes itself 2026-07-10 18:53:00 -04:00
Gabriel Brown bab87cc2d0 feat(worker): in-box process-group marker + kill helpers for agent turns 2026-07-10 18:53:00 -04:00
Gabriel Brown 38431155b2 refactor(worker): extract AgentRuntime interface, shared provider helpers, and adapter registry 2026-07-10 18:28:41 -04:00
Gabriel Brown ac68484059 fix(worker): make cancellation teardown failure-safe 2026-07-10 18:04:40 -04:00
Gabriel Brown 8af33fc9e0 fix(worker): always release stopped workspaces 2026-07-10 17:35:33 -04:00
Gabriel Brown c4d0f5219a fix(terminal): use real TTY exec and resize 2026-07-10 17:21:52 -04:00
Gabriel Brown 57c175aecd fix(worker): contain workspace paths against symlinks 2026-07-10 17:11:00 -04:00
Gabriel Brown 0b5a2c0411 fix(worker): ensure reconciled boxes before acquire 2026-07-10 17:04:41 -04:00
Gabriel Brown 284f7ea52b fix(worker): serialize box failure and idle reaping 2026-07-10 17:00:22 -04:00
Gabriel Brown 9e7a8722f3 fix(worker): make user-box lifecycle concurrency-safe 2026-07-10 16:54:55 -04:00
Gabriel Brown daec4d6dfa fix(worker): make workspace cleanup layout-aware 2026-07-10 15:55:11 -04:00
Gabriel Brown 65aae85369 Update formatting on worker
Build and Push Spoon Images / quality (push) Successful in 1m27s
Build and Push Spoon Images / build-images (push) Successful in 7m13s
2026-06-24 08:40:52 -04:00
Gabriel Brown c1263b2e69 Worker: interactive terminal WebSocket bridge (PTY in workspace container)
- attachTerminalServer() upgrades /jobs/:id/terminal WS connections, verifying a
  short-lived job-scoped HMAC token (verifyTerminalToken) so the browser never
  holds the worker secret
- Bridges the socket to a bash PTY via dockerode exec (Tty) in a persistent
  per-job shell container (spoon-agent-term-<id>) mounting the workspace; binary
  frames = stdin, JSON text frames = resize; idle containers reaped after 30m
- New env: SPOON_AGENT_TERMINAL_IMAGE/SECRET/IDLE_MS (secret falls back to the
  shared worker internal token)
2026-06-24 08:16:39 -04:00
Gabriel Brown 40a6dd78e4 Fix worker image missing docker CLI; harden spawn-failure handling
Build and Push Spoon Images / quality (push) Successful in 1m47s
Build and Push Spoon Images / build-images (push) Successful in 6m33s
Root cause of the prod empty-response: the spoon-agent-worker image shipped
without a docker CLI binary, so it could never launch the codex job container.
On Debian trixie (the bun base) 'docker.io' + --no-install-recommends installs
the daemon package but omits the client (split into 'docker-cli'), leaving no
'docker' on PATH. execa('docker', ...) hit ENOENT, and with reject:false that
resolves with exitCode undefined -> coerced to 0 -> looked like a successful
empty run -> 'Codex completed without producing an assistant response'.

- agent-worker.Dockerfile: drop docker.io, install the official static docker
  CLI client pinned to 29.5.3 (matches the host daemon) to /usr/local/bin/docker
- runtime/docker.ts: normalizeRunResult() so a spawn failure (exitCode null) is
  always a non-zero exit carrying the real reason, never a silent empty success
- tests: cover the spawn-failure and normal-result paths
2026-06-24 06:31:17 -04:00
Gabriel Brown 9643cb197b Fix agent empty-response in prod: workdir mount, image freshness, error surfacing
- Pin codex@0.142.0 + opencode-ai@1.17.9 in the job image (was @latest,
  causing dev/prod drift)
- Worker now s the job image once per process so prod stops
  running a stale Codex
- Surface Codex error/turn.failed events instead of swallowing them, so the
  real failure reason is reported rather than 'no assistant response'
- Harden the Codex JSON parser to also handle the legacy msg-wrapped shape
- Fix the docker-in-docker workdir: bind-mount identical host:container path
  and set SPOON_AGENT_HOST_WORKDIR (named volume can't be mounted by sibling
  job containers)
- Add docs/compose.prod.yml as a documented reference deployment
2026-06-24 05:38:35 -04:00
Gabriel Brown 30a17196f5 fix worker forreal
Build and Push Spoon Images / quality (push) Successful in 1m45s
Build and Push Spoon Images / build-images (push) Successful in 7m35s
2026-06-23 21:38:41 -04:00
Gabriel Brown c3d265d428 Fix worker 2026-06-23 20:35:01 -04:00
Gabriel Brown a6f7ea7f78 Clean up old stuff & fix ui errors
Build and Push Spoon Images / quality (push) Successful in 2m22s
Build and Push Spoon Images / build-images (push) Successful in 23m10s
2026-06-23 14:57:05 -04:00
Gabriel Brown fe72fc2957 Add features & update project 2026-06-23 01:46:08 -04:00
Gabriel Brown 7e7bec56d5 Add way for infisical to switch accounts when signed into wrong account
Build and Push Next App / quality (push) Successful in 1m34s
Build and Push Next App / build-next (push) Successful in 4m11s
2026-06-22 13:14:25 -04:00