aio-terminal
v0.9.0
Published
All-in-one AI terminal manager — a persistent conductor that delegates each task to the AI worker best suited for it, using the CLIs/subscriptions you already have (Claude Code, Codex CLI, Gemini CLI, Kimi Code CLI) plus cheap APIs (DeepSeek, Gemini API).
Maintainers
Readme
aio-terminal
aio is a master-agent terminal REPL: a persistent manager you converse
with, which delegates each task to the cheapest worker agent that can do it
well, using the CLIs/subscriptions you already pay for (Claude Code, OpenAI
Codex CLI, Gemini CLI, Kimi Code CLI) plus cheap APIs (DeepSeek, Gemini API).
It's not a
one-shot dispatcher — it narrates who it's using, relays and synthesizes
their results, and keeps conversation context across turns, the way a
conductor manages a team rather than just routing a call.
$ aio
aio manager — your persistent AI conductor. Type /help for commands, /agents to see your team.
(manager runs on deepseek)
you › translate "good evening" to Chinese
manager › 晚上好 (wǎn shàng hǎo)
you › write a python script that renames all files in a folder to kebab-case
manager › Handing this to codex — needs real code and file-system logic.
⇢ codex working...
manager › Here's the script — it splits the extension, converts the rest to
lowercase kebab-case, and avoids collisions:
```python
...
```
— via codex
you › now make it handle spaces too
manager › The current version already turns spaces into hyphens (via the
regex step) — want me to also cover unicode accents, or is this good?Install
npm i -g aio-terminalFirst-run setup
aio has nothing of its own to log in to — it uses the CLIs and keys you already have.
Already using Claude Code, Codex, or Kimi? Nothing to set up. aio detects
claude, codex, kimi on PATH and uses their own logins. gemini also
needs GEMINI_API_KEY.
No CLI yet? Add a cheap DeepSeek key. Either works, and env wins if both are set:
export DEEPSEEK_API_KEY="sk-..." # in ~/.zshrc or ~/.bashrcor run aio setup and paste the key when prompted — it's saved to
~/.config/aio/config.json under "keys". The file is written with
owner-only permissions (0600).
The first time you run aio with no workers detected, it runs this setup
automatically.
Check: aio status probes every detected worker with a real request.
A couple of gotchas:
- Env vars set with a bare
exportin one terminal tab don't exist in other tabs — put them in the rc file instead. - Kimi has no read-only sandbox, so a delegated edit task will edit files.
Usage
Default mode — opens the manager REPL:
aioManager REPL slash commands
| Command | What it does |
|---|---|
| /agents | Table of detected workers, cost labels, and cached ✅/❌ |
| /use <worker> | Pin all delegation to <worker> until /use auto |
| /use auto | Unpin — let the manager choose again |
| /compare <task> | Fan the same task out to every available worker concurrently, print each answer, then the manager synthesizes which is best (Perplexity-style multi-model compare) |
| /open <worker> | Full interactive handoff to that worker's own CLI (stdio inherited); returns to the manager REPL on exit |
| /status | Live-probe every detected backend with a real request |
| /help | List these commands |
| exit / quit | Leave the REPL |
The manager can also start a compare on its own — just ask in plain language ("run this past all the workers", "get everyone's take", "compare them side by side") and it fans the task out in one turn rather than delegating serially.
v1: one-shot mode
One-shot mode — triage picks a backend, prints the answer to stdout:
aio "capital of France? one word"Piped stdin also runs one-shot mode:
echo "summarize this changelog" | aioForce a specific backend, skipping triage:
aio -m claude "review this diff for bugs" # one-shot on the forced backend
aio -m codex # interactive, no triage
aio -m ds "2+2? one word" # ds = deepseekCheck which backends are configured and reachable right now:
aio statusBackend setup
| Backend | Needs | Kind |
|----------|-----------------------------------------|------|
| claude | claude CLI on PATH (Claude Code) | cli |
| codex | codex CLI on PATH (OpenAI Codex CLI) | cli |
| gemini | gemini CLI on PATH + GEMINI_API_KEY | cli |
| kimi | kimi CLI on PATH (Kimi Code CLI), logged in | cli |
| deepseek | DEEPSEEK_API_KEY env var | api |
Two things about kimi specifically: it has no read-only sandbox mode, so a
delegated task that asks it to edit files will edit them; and /open kimi
opens its TUI empty, because kimi takes no positional prompt — retype the
task there.
Only detected backends are shown/used. Optional overrides go in
~/.config/aio/config.json:
{
"backends": {
"gemini": { "model": "gemini-2.5-flash", "enabled": true },
"claude": { "model": "haiku" }
},
"keys": {
"deepseek": "sk-..."
}
}Keys in the file are only used when the matching env var isn't already set.
Which backend manages
The manager is the agent you actually talk to: it holds the thread, picks the
worker, and synthesizes what comes back. So it takes the best detected
backend, not the cheapest — claude → codex → kimi → gemini → deepseek. Cheapness
belongs in the workers, where the long calls happen.
If the manager's backend hits a usage or rate limit mid-session, aio steps down to the next one and says so, rather than failing the turn.
Set AIO_ASCII=1 if your terminal has no emoji font — worker mascots fall
back to plain dots.
Note on the name
There's an unrelated aio-cli package (Adobe I/O CLI) that also installs an
aio binary. If you already have Adobe's aio installed globally, installing
aio-terminal will collide on the binary name — uninstall one or the other,
or install this one to a project-local node_modules/.bin instead of
globally.
License
MIT
