sandbox-agent/Cargo.toml
Nathan Flurry ac0a22cd07 feat: add PTY/terminal session support to Process Manager API
Add Docker-style terminal support with -t (TTY) and -i (interactive) flags:

Backend (Rust):
- Add portable-pty dependency for PTY allocation on Unix
- Extend StartProcessRequest with tty, interactive, and terminalSize options
- Add PTY process spawning with TERM=xterm-256color
- Add WebSocket endpoint for bidirectional terminal I/O
- Add terminal resize endpoint (POST /process/:id/resize)
- Add terminal input endpoint (POST /process/:id/input)
- Support base64-encoded binary input
- Process info now includes tty, interactive, and terminalSize fields
- Terminal output is logged to combined.log for persistence

Frontend (Inspector UI):
- Add @xterm/xterm and addons for terminal rendering
- Create Terminal component with xterm.js integration
- Add tabbed view (Terminal/Logs) for PTY processes
- Terminal auto-connects via WebSocket when process is expanded
- Support terminal resize with ResizeObserver
- Show PTY badge on processes with TTY enabled
- Graceful handling of process exit and disconnection

API:
- GET /v1/process/:id/terminal - WebSocket for terminal I/O
- POST /v1/process/:id/resize - Resize terminal (cols, rows)
- POST /v1/process/:id/input - Write data to terminal

WebSocket protocol:
- type: 'data' - Terminal output (server -> client)
- type: 'input' - Terminal input (client -> server)
- type: 'resize' - Resize request (client -> server)
- type: 'exit' - Process exited (server -> client)
- type: 'error' - Error message (server -> client)
2026-01-30 13:13:16 -08:00

84 lines
2.4 KiB
TOML

[workspace]
resolver = "2"
members = ["server/packages/*"]
[workspace.package]
version = "0.1.0"
edition = "2021"
authors = [ "Rivet Gaming, LLC <developer@rivet.gg>" ]
license = "Apache-2.0"
repository = "https://github.com/rivet-dev/sandbox-agent"
description = "Universal API for automatic coding agents in sandboxes. Supprots Claude Code, Codex, OpenCode, and Amp."
[workspace.dependencies]
# Internal crates
sandbox-agent = { version = "0.1.0", path = "server/packages/sandbox-agent" }
sandbox-agent-error = { version = "0.1.0", path = "server/packages/error" }
sandbox-agent-agent-management = { version = "0.1.0", path = "server/packages/agent-management" }
sandbox-agent-agent-credentials = { version = "0.1.0", path = "server/packages/agent-credentials" }
sandbox-agent-universal-agent-schema = { version = "0.1.0", path = "server/packages/universal-agent-schema" }
sandbox-agent-extracted-agent-schemas = { version = "0.1.0", path = "server/packages/extracted-agent-schemas" }
# Serialization
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
# Error handling
thiserror = "1.0"
# Schema generation
schemars = "0.8"
utoipa = { version = "4.2", features = ["axum_extras"] }
# Web framework
axum = "0.7"
tower = { version = "0.5", features = ["util"] }
tower-http = { version = "0.5", features = ["cors", "trace"] }
# Async runtime
tokio = { version = "1.36", features = ["macros", "rt-multi-thread", "signal", "time", "io-util", "sync"] }
tokio-stream = { version = "0.1", features = ["sync"] }
tokio-tungstenite = "0.21"
futures = "0.3"
# HTTP client
reqwest = { version = "0.11", features = ["blocking", "json", "rustls-tls", "stream"] }
# CLI
clap = { version = "4.5", features = ["derive"] }
# Logging
tracing = "0.1"
tracing-logfmt = "0.3"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
# Time/date
time = { version = "0.3", features = ["parsing", "formatting"] }
chrono = { version = "0.4", features = ["serde"] }
# Filesystem/paths
dirs = "5.0"
tempfile = "3.10"
# Archive handling
flate2 = "1.0"
tar = "0.4"
zip = { version = "0.6", default-features = false, features = ["deflate"] }
# Misc
url = "2.5"
regress = "0.10"
include_dir = "0.7"
base64 = "0.21"
# PTY support
portable-pty = "0.8"
# Code generation (build deps)
typify = "0.4"
prettyplease = "0.2"
syn = "2.0"
# Testing
http-body-util = "0.1"
insta = { version = "1.41", features = ["yaml"] }