Co-authored-by: codegirl007 <codegirl-007@users.noreply.github.com>
3.2 KiB
Agentbox
This is a local technical spike for a programmable graphical Linux environment. It proves that a controller can launch an ordinary GUI process headlessly, observe pixels and logs, inject keyboard and mouse input, drive the application through a replaceable agent, record a trace, and shut the environment down.
The default agent is deterministic and requires no API credentials. One optional OpenAI Responses adapter demonstrates screenshot + text model control. This is still a local spike, not a cloud control plane or production sandbox. See the architecture decision for the choices and security boundary.
Requirements
- Linux
- Go 1.22 or newer
- Docker Engine with a running daemon
- permission to use Docker without an interactive
sudoprompt
No X server, window manager, or C compiler is required on the host; those dependencies are built into the container image.
One-command demo
From this directory:
make demo
That one command:
- builds the
agentboxCLI and mover executable; - creates a restricted Xvfb/Openbox environment;
- stages and launches the executable;
- runs the deterministic observe/press/wait/release/observe loop;
- records screenshots, actions, decisions, logs, and final status;
- stops and removes the environment, including on failure or interruption.
The equivalent explicit commands are:
make build demo-binary
./agentbox run ./examples/mover \
--task "Launch the application, move the character to the right, and describe what happened."
Flags can appear before or after the path.
Run a private executable
Pass a prebuilt Linux executable:
./agentbox run ./path/to/application --task "Open the menu and click Settings."
For a directory, add agentbox.json:
{
"command": "game",
"args": ["--windowed"],
"env": {"EXAMPLE": "value"},
"window_title": "My Game"
}
The command is resolved relative to the manifest. The current runtime is Debian-based, so dynamically linked executables must have compatible libraries.
Model agent
The model adapter is opt-in:
export OPENAI_API_KEY="..."
./agentbox run ./path/to/application \
--task "Move the character right and report the result." \
--agent openai \
--model gpt-5
Each request contains the task, current screenshot, previous actions, step
history, and recent application logs. Strict structured output allows one
backend-neutral input action or completion. Use --max-steps to bound a run.
The environment itself still has no network access.
Runs and inspection
./agentbox runs
./agentbox inspect <run-id>
Each run writes:
.agentbox/runs/<run-id>/
├── run.json
├── actions.jsonl
├── steps.jsonl
├── screenshots/
│ ├── 0001.png
│ └── ...
├── stdout.log
└── stderr.log
run.json has schema_version: "1" plus task, application, agent, timestamps,
status, and step count. steps.jsonl records each observation reference, agent
message, and action. actions.jsonl is a compact action-only stream.
Original environment proof
The visual centroid test from Phase 1 remains available:
make phase1
Development checks
make test
go vet ./...