Adiu Agents
Supervise CLI coding agents from VS Code. Launch an agent in any folder, watch it work, answer
its questions, and review what it changed — with the same supervision whether it runs as an
OpenAI-compatible JSON stream, an opencode server, or a plain CLI process.

Why another agent UI
Agent CLIs are good at the work and bad at being watched: one terminal per task, scrollback you
cannot search, no idea which of the six windows needs you, and a session that dies with the SSH
connection. Adiu Agents keeps the harness exactly as it is — the omp / opencode / custom binary
you already run — and adds the missing layer around it:
- a panel that answers "which agent needs me?" — per folder, per agent, with state, model,
tokens and cost;
- a detail tab per agent — transcript, live terminal, follow-ups, interrupt, and the diff of
what changed in the folder;
- a detached shim — the harness survives window reloads and dropped SSH connections;
- one place for endpoints — base URL, model and TLS per endpoint, keys in VS Code's secret
storage, never in
settings.json.
Features
|
|
| Multi-agent panel |
Every agent grouped by folder, with a live state indicator, model, elapsed time and token/cost counters. |
| Agent detail tab |
Streaming transcript (messages, tool calls, reasoning), folder identity, harness and endpoint, one-click actions. |
| Real terminal |
An xterm.js terminal bound to the same pty the harness runs in — type into the agent's process, not a copy of it. |
| Terminal grid |
Alternative, tmux-backed grid of panes for terminal-first users, with the same launch environment. |
| Follow-ups |
Send another prompt into a running session, or interrupt the current turn. |
| Survives reloads |
A small detached shim holds the harness and its unix socket; reload the window, reconnect SSH, re-attach. |
| Any OpenAI-compatible endpoint |
LiteLLM, vLLM, OpenAI, OpenRouter, an in-house gateway: base URL, optional CA bundle, per-endpoint default model. |
| Any harness |
omp-json, opencode-server, or generic (any command that accepts a prompt and a model flag). |
| Change review |
git status plus a working-tree diff of the agent's folder, rendered in the detail tab. |
| Reproducible launches |
"Copy launch command" gives you the exact command line and environment to run it yourself. |
| Discovery |
If the environment already knows an endpoint (OPENAI_BASE_URL, a deployment module), the extension offers it instead of asking. |

Install
Marketplace — search for Adiu Agents (adiu.adiu-agents) in the Extensions view.
From a VSIX
code --install-extension adiu-agents-<version>.vsix
Requirements:
- VS Code 1.85 or newer;
- at least one agent harness binary (
omp, opencode, or your own);
- an OpenAI-compatible endpoint and its key;
- optional:
tmux for the terminal grid;
- optional: the embedded terminal — see Platform notes.
Quick start
- Add an endpoint —
Adiu Agents: Add / edit endpoint. Name, base URL, optional CA bundle and
default model. The API key goes to the secret storage when asked; it is never written to
settings.json. Use Adiu Agents: Test endpoint to check reachability and model listing.
- Add a harness —
Adiu Agents: Add / edit harness. Give it a name, a kind (omp-json,
opencode-server, generic) and the binary to run.
- Launch — right-click a folder in the Explorer → Launch agent (or the command palette),
pick endpoint, harness and model. The agent appears in the Adiu Agents activity-bar panel.
- Watch and steer — open the agent detail tab for the transcript, the terminal, follow-ups, and
the diff. Kill or interrupt from the panel at any time.
Concepts
Agent = one harness process, started in one folder, against one endpoint and model. Its state is
derived from the harness's own event stream, not from heuristics:
| State |
Meaning |
starting |
process spawned, no event yet |
working |
the harness is producing events |
waiting-input |
the harness asked a question and is blocked on you |
done |
the turn or session finished cleanly |
error |
the harness exited non-zero |
cancelled |
you killed or interrupted it |
detached |
the window is gone; the shim (and the harness) are still alive |
Shim = the detached process that owns the harness and a unix socket. It keeps running when the
VS Code window closes, streams events into events.jsonl, caps the log file, and reconnects on
demand. Restarting the window does not restart the agent.
Harness kinds
| Kind |
Runs |
Notes |
omp-json |
omp --mode json … |
Structured event stream, resumable sessions (-r), embedded terminal can attach to the session. |
opencode-server |
opencode serve --port 0 |
Session lives in the HTTP server; the terminal attaches while the server runs. |
generic |
your command with --model <…> |
Streams are read from the process output; optional log file to tail as transcript. |
Endpoints and model routing
adiuAgents.endpoints is a non-secret list; the key lives in the VS Code secret storage, keyed by
endpoint id. A launch passes the endpoint to the harness through the standard environment
(OPENAI_BASE_URL, OPENAI_API_KEY, SSL_CERT_FILE when a CA is configured), for the lifetime of
that process only.
{
"adiuAgents.endpoints": [
{
"id": "local-gateway",
"name": "Lab gateway",
"baseUrl": "https://llm.example.org/v1",
"caPath": "/etc/ssl/certs/lab-root.pem",
"defaultModel": "qwen3-coder"
}
]
}
Harnesses are configured the same way — bin, kind, modelArg, modelPrefix, extraArgs,
extraEnv, logFile:
{
"adiuAgents.harnesses": [
{ "id": "omp", "name": "omp", "kind": "omp-json", "bin": "omp", "modelPrefix": "adiu" },
{ "id": "oc", "name": "opencode", "kind": "opencode-server", "bin": "opencode" },
{ "id": "mine", "name": "my agent", "kind": "generic", "bin": "my-agent", "modelArg": "--model" }
]
}
Settings
| Setting |
Default |
Purpose |
adiuAgents.endpoints |
[] |
Endpoint definitions (never the key). |
adiuAgents.harnesses |
[] |
Harness definitions. |
adiuAgents.defaultEndpoint |
"" |
Pre-selected endpoint in the launch picker. |
adiuAgents.defaultHarness |
"" |
Pre-selected harness in the launch picker. |
adiuAgents.defaultModel |
"" |
Pre-filled model. |
adiuAgents.pollMs |
2000 |
Status polling interval. |
adiuAgents.maxAgents |
16 |
Maximum concurrently supervised agents. |
adiuAgents.transcriptKeep |
400 |
Transcript events rendered in the detail tab. |
adiuAgents.logCapBytes |
2097152 |
Cap of the captured harness log (ring-truncated to half). |
adiuAgents.lightIdleAfterSec |
90 |
After this long without events a working agent is flagged as possibly stalled. |
adiuAgents.statusDir |
"" |
State root; empty = per-window workspace storage. Point it at a shared path to see identical agents from several windows. |
adiuAgents.suggestFromEnv |
true |
Offer an endpoint discovered from the environment. |
Architecture
The extension host never owns the harness: it starts a shim, the shim spawns the harness, and
both keep running independently of the window. UI state comes from the status files the shim writes,
so a reloaded window rebuilds the panel from disk.
Everything except the embedded terminal is pure JavaScript and runs on any platform VS Code runs on.
The embedded terminal uses node-pty, a native module, so a
package can only carry the binary built on the machine that packaged it — the published VSIX ships
linux-x64. On other platforms the terminal actions report that the module could not be loaded;
the terminal grid, transcripts, follow-ups, interrupt, change review and supervision keep working.
Security and privacy
- No telemetry, no analytics, no network calls of its own: the extension only talks to the endpoints
you configure, and every request is made by your harness.
- API keys are stored in VS Code's secret storage; they are handed to a child process through
its environment for the lifetime of that process and are scrubbed from captured logs.
- Agent state (status JSON, events, stdout) lives under the workspace storage path, or wherever
adiuAgents.statusDir points.
- The extension declares
untrustedWorkspaces: false: it launches processes and reads the
environment, which untrusted-folder restrictions exist to prevent.
Development
npm install
npm run build # esbuild -> dist/extension.js, dist/shim.js (+ vendored node-pty)
npm run typecheck # tsc --noEmit
npm test # unit suite (real ptys, fake harnesses)
npm run package:linux-x64 # VSIX for linux-x64
npm run package:universal # VSIX for any platform (terminal unavailable off linux-x64)
Packaging runs scripts/embed-media.mjs, which writes README.packaged.md with the images of
media/ inlined as data URIs and hands that file to vsce --readme-path. The listing therefore
never depends on the repository being publicly readable, and this README.md keeps plain relative
paths for GitLab.
Layout: src/extension.ts (activation, panel, detail tab, commands), src/supervisor.ts (agent
lifecycle and status), src/shim.ts (detached harness owner and socket protocol), src/tui.ts
(pty + transcript plumbing), src/grid.ts (tmux grid), media/ (webviews, icons, branding).
License
MIT © 2026 Adiu