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>
Determine the slot from the worktree's position in workmux list rather
than probing ports. Keeps the port-in-use safety check. Removes unused
find_port helper.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Split a 33% width shell pane on the right, using the worktree
directory from pane 0 so it starts in the correct path.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Extract inline create dialog into its own component. Wrap both dialogs
in forms so Enter submits, and autofocus the confirm button in
ConfirmDialog so Enter triggers confirm instead of cancel.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Start PostgreSQL (owned by postgres user) in entrypoint.sh with a unix
socket in /tmp so the agent can use DATABASE_URL=postgres:///windmill?host=/tmp
for sqlx migrations and cargo check.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add Dockerfile.sandbox with sudo, writable passwd/shadow, and
entrypoint that registers dynamic UIDs for full root access inside container
- Remove playwright MCP server (npx not available in sandbox)
- Move sandbox host_commands/image config to global workmux config
- Remove git from host_commands to prevent infinite fork bomb via shims
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Dismiss the confirmation dialog as soon as the user confirms instead
of waiting for the API call. Show the item grayed out with
pointer-events disabled while deletion is in progress. Auto-select
the previous (or next) worktree when the selected one is removed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Start a detached tmux session if none exists, so worktree
operations don't fail when tmux hasn't been started yet.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Show an × button on hover for non-main worktrees. Replace the
boolean showConfirmRemove with a removeBranch string so the
confirm dialog works from both sidebar and top bar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add "Agent (skip permissions)" profile that runs claude with
--dangerously-skip-permissions. Filter worktrees without a tmux
window from the sidebar list instead of showing a disabled entry.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Support "agent-only" and "full" profiles when creating worktrees.
Agent-only skips default pane commands, kills extra panes, and starts
only claude. Full uses the default workmux pane layout. Profile is
selected via a centered dialog in the frontend.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Check mux status before attempting terminal connection. Worktrees
without a tmux window (mux !== "✓") show an informational message
instead of failing with "can't find window".
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Instead of spawning with hardcoded 120x30 on WebSocket open, wait for
the client's first resize message with real fitted dimensions. Fixes
terminal not taking full width/height since script+pipes PTY can't be
resized after creation.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>