Add ~/windmill-ee-private mount to sandbox extra_mounts (needed for
.git access) and remove ArrowLeft/ArrowRight agent-switching keydown
handler from CreateWorktreeDialog.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- run.sh builds frontend then serves in production mode
- Persist AGENT in .env.local and show it in worktree list
- Add preview proxy config so production mode routes API/WS correctly
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Persist profile to .env.local on worktree creation and display it
(full, agent-only, agent-yolo) in the worktree list.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Single script to start both backend and frontend with prefixed logs.
Updated README with dev.sh usage and keyboard shortcut reference.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Cmd+Up/Down to switch worktrees, Cmd+K to create new, Cmd+D to remove.
xterm.js passthrough ensures shortcuts bubble up from terminal. Shortcut
hints displayed in a fixed panel at the bottom of the sidebar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Agent now knows pane 1 is backend (cargo) and pane 2 is frontend (npm),
so "check backend logs" maps directly to the right capture-pane command.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Install @openai/codex in Dockerfile.sandbox
- Pass developer_instructions via -c flag with proper shell escaping
- Use --yolo flag for sandbox profile (container is the sandbox)
- Mount ~/.codex into container via workmux extra_mounts config
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add agent selector (Claude/Codex) to the create worktree dialog,
orthogonal to the profile choice. Selection is persisted alongside
the profile default.
Backend builds the appropriate command per agent: codex uses
--full-auto for sandbox, claude uses --dangerously-skip-permissions
with --append-system-prompt.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Consume proc.exited promise to prevent zombie socat processes
- Use container name prefix filter instead of ancestor (matches
containers from older image builds)
- Improve polling logs to show retry count and waiting state
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Persist the selected profile to localStorage when checked, and
preselect it on subsequent dialog opens.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Change backend start command to use PORT= instead of --port flag and
cargo watch for auto-reload. Install cargo-watch in sandbox container.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The sqlx-cli install populates /opt/cargo/registry as root. Add
chmod -R a+rwX after the install so the sandbox user can write
to the registry when building.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When a worktree runs inside a Docker sandbox, its ports are only
reachable via the container's bridge IP. socat forwards host ports to
the container so the browser (over SSH) can reach them.
- New socat.ts module manages forwarding lifecycle (start/stop/reconcile)
- Polls for container after creation (non-blocking, up to 30s)
- Kills orphaned socat on startup before re-establishing forwards
- Cleans up on worktree removal and SIGINT/SIGTERM
- Extract readEnvLocal to env.ts to break circular import
- Change isPortListening to HTTP fetch (avoids socat false positives)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace Debian's Node 18 with NodeSource Node 22. Run npm install and
generate-backend-client in the entrypoint so the frontend is ready.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The sandbox entrypoint now runs `sqlx migrate run` after creating the
database so that sqlx compile-time query checks work immediately. Also
makes /opt/cargo world-writable so arbitrary-UID sandbox users can write
to the cargo git cache and registry.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Read .env.local from the worktree to get port assignments and build a
system prompt informing Claude of backend/frontend ports and startup
commands. For sandbox profiles, double-escape quotes to survive the
extra shell layer inside the container.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>