vessel
vessel is a PTY-based runtime for spawning, controlling, and observing interactive terminal agents over a Unix socket.
It is designed for AI orchestrators, test harnesses, and automation systems that need real terminal semantics (not just stdout pipes).

What vessel is (and is not)
- Is: local control plane for interactive worker processes (
spawn,send,wait,snapshot,events,attach,view). - Is: good for multi-agent workflows, TUI testing, and reproducible terminal automation.
- Is not: container runtime, distributed scheduler, or durable job queue.
Requirements
- Linux with Unix sockets + PTY support
- Rust 1.85+ (for building from source)
tmux(optional, only forvessel view)
Install
Quick start (2 minutes)
# 1) Spawn a worker shell
# 2) Send a command (+ Enter)
# 3) Wait for expected output, then inspect the virtual screen
# 4) Clean up (SIGTERM by default; use --force for hard kill)
# 5) Stop server when done
Mental model
Agent = PTY process + transcript ring + virtual screen
Server = owns all agent state, listens on Unix socket
Client = stateless CLI sending JSON requests
View = tmux dashboard; panes run read-only attach streams
Key implications:
snapshotreflects current terminal state (best for assertions).tail/dumpreflect transcript bytes (useful for logs/streaming).- State is in-memory in the server process (no persistence across server restart).
Core command map
Lifecycle
Input/output
Synchronization and assertions
Streaming and observability
One-off command execution
Recording and replay scaffolding
Orchestration patterns
Spawn dependencies:
# Wait for setup to exit before starting app
# Wait for output from another agent before spawning
Recommended cleanup for automation:
Output formats for automation
Many commands support --format text|json|pretty.
text: compact, pipe-friendlyjson: structured envelope ({"<key>": ..., "advice": [...]})pretty: human-oriented terminal output
Example:
|
Server behavior
- Server auto-starts for most regular commands.
eventsandsubscribedo not auto-start (they expect an existing server/session).- Default socket path:
/run/user/$UID/vessel.sock(fallback/tmp/vessel-$UID.sock). - Override with
VESSEL_SOCKETor--socket.
Troubleshooting
If you hit stale socket/session issues:
||
Notes:
killsends SIGTERM by default; some interactive shells ignore it. Use--forcefor deterministic teardown.- For TUI inspection, prefer
snapshotorattach --readonlyover plaintail.
Development
Relevant docs:
AGENTS.md- contributor + agent workflowdocs/testing.md- testing approach and scenarios