Backend changes:
- Add timestamps to log lines: [2026-01-30T12:32:45.123Z] <line>
- stdout.log and stderr.log get timestamps per line
- combined.log includes [stdout]/[stderr] prefix after timestamp
- Add strip_timestamps query param to GET /process/{id}/logs
- Use time crate with RFC3339 format for timestamps
Frontend changes:
- Add Processes tab to inspector debug panel
- Show list of processes with status badges (running/stopped/killed)
- Click to expand and view logs
- Log viewer options:
- Select stream: combined, stdout, stderr
- Toggle strip_timestamps
- Refresh logs button
- Action buttons: stop (SIGTERM), kill (SIGKILL), delete
- Auto-refresh process list every 5 seconds
API Endpoints:
- POST /v1/process - Start a new process
- GET /v1/process - List all processes
- GET /v1/process/{id} - Get process details
- POST /v1/process/{id}/stop - Stop a process (SIGTERM)
- POST /v1/process/{id}/kill - Kill a process (SIGKILL)
- DELETE /v1/process/{id} - Delete a process and clean up logs
- GET /v1/process/{id}/logs - Read process logs (supports tail, follow via SSE)
Features:
- Log files written to ~/.local/share/sandbox-agent/processes/{id}/
- stdout.log, stderr.log, combined.log
- Process state persisted to state.json for server restart survival
- Status tracking: starting, running, stopped (with exit_code), killed
- Real-time log streaming via SSE with follow=true query param
- Environment variables and working directory support
Cleanup rules:
- Process exits naturally → logs preserved
- DELETE endpoint → logs removed
## Summary
- Add Node.js build stage to all release Dockerfiles to build the inspector frontend
- Copy pre-built inspector assets into Rust build stages so they get embedded in binaries
- Remove `SANDBOX_AGENT_SKIP_INSPECTOR=1` from all Dockerfiles and the release workflow
## Test plan
- [ ] Build linux-x86_64 locally: `docker/release/build.sh x86_64-unknown-linux-musl`
- [ ] Run the binary and verify inspector is embedded (should show "inspector ui available")
- [ ] Access the inspector UI at http://localhost:2468/ui/🤖 Generated with [Claude Code](https://claude.ai/code)
The npm CLI platform packages were being published without binaries
because publishNpmCli() wasn't downloading them from R2 first.
- Add downloadFromReleases() helper to utils.ts
- Update publishNpmCli() to download platform binaries before publish
- Add sdks/cli/platforms/*/bin/ to .gitignore
- daytona.ts (default): Installs sandbox-agent at runtime. Faster to
start but installs on each run. Use for quick testing.
- daytona-with-snapshot.ts: Builds custom image with sandbox-agent
pre-installed. Slow first run (~2-3 min) but fast subsequent runs.
Use for repeated development.
Run with: pnpm start (default) or pnpm start:snapshot
- Fix install URL from latest to 0.1.3
- Add 180s timeout for sandbox creation
- Add autoStopInterval: 0 to prevent auto-stop
- Add log message explaining first run may be slow
* feat: add Claude adapter improvements for HITL support
- Add question and permission handling for Claude sessions
- Add Claude sender channel for interactive communication
- Add stream event and control request handling
- Update agent compatibility documentation
* fix: restore Claude HITL streaming input and permission handling
- Add streaming_input field to SpawnOptions for Claude stdin streaming
- Enable --input-format stream-json, --permission-prompt-tool stdio flags
- Pipe stdin for Claude (not just Codex) in spawn_streaming
- Update Claude capabilities: permissions, questions, tool_calls, tool_results, streaming_deltas
- Fix permission mode normalization to respect user's choice instead of forcing bypass
- Add acceptEdits permission mode support
- Add libc dependency for is_running_as_root check