pi-cockpit
Agent cockpit for Pi: a list-mode status stack (live teammates + todo plan) pinned above the editor, plus a Starship-style footer. Renders only via public extension APIs (setWidget/setFooter).
Package details
Install pi-cockpit from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-cockpit- Package
pi-cockpit- Version
0.5.1- Published
- Jul 30, 2026
- Downloads
- 778/mo · 778/wk
- Author
- dyw1234
- License
- MIT
- Types
- extension, theme
- Size
- 190 KB
- Dependencies
- 0 dependencies · 5 peers
Pi manifest JSON
{
"extensions": [
"./src/extension/index.ts"
],
"themes": [
"./themes"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
pi-cockpit
A list-mode agent cockpit for Pi: a status stack pinned above the editor showing live teammates and the current todo plan, plus a Starship-style footer. Everything is drawn through Pi's public extension APIs only (setWidget / setFooter) — no core patches.
It is the third plugin of the pi-maestro-flow project (alongside pi-maestro-flow and pi-maestro-teammate). Since pi-maestro-flow@0.6.1 it is an exact-pinned dependency of pi-maestro-flow — installed together and auto-registered into Pi's settings.packages on postinstall — but it also installs and runs standalone. Current version: 0.4.0.
┌─ AGENTS · 2 running ─────────────────────────────┐ ← setWidget(aboveEditor)
│ ⠋ explorer #a1f3c2 map auth read routes.ts │
│ ⠋ explorer #b9e014 trace jwt read jwt.ts │
├─ TODO · 1/4 ─────────────────────────────────────┤
│ 01 ✓ map auth entrypoints │
│ 02 ⠋ trace jwt verify │
│ 03 · implement refresh │
│ 04 · add tests │
└──────────────────────────────────────────────────┘
> dispatch a goal… ← editor (Pi native)
pi/stream-70b · ctx [████░░░░] 42% · $0.52 · 01:23 ← setFooter
Install
pi-cockpit comes automatically with the orchestration layer — installing pi-maestro-flow pulls pi-cockpit and registers it into settings.packages on postinstall, no manual setup required. To use it on its own:
pi install npm:pi-cockpit # standalone from npm
# or, for one run:
pi -e ./packages/pi-cockpit
What it shows
- AGENTS — every running teammate as a table row (status spinner · role · id · label · live tail), sorted running-first. Completed/failed agents show their total duration. Collapses to a one-line
N agents runningsummary in compact mode. - TODO — the active plan as numbered rows with four states (done ✓ / in-progress spinner / blocked ! / pending ·). Collapses to a segmented progress bar + current step + percent.
- Footer —
provider/model · context gauge · ↑in ↓out · $cost · elapsed · git branch.bash_bgbackground-job state lives on a dedicated second footer row so it no longer competes with the primary line. - Thinking timer — while the model is thinking, the folded thinking row shows a spinner and running elapsed time; when the run ends, it settles to the actual duration (e.g.
thoughts · 8.4s). - Quiet mode — compresses the seven built-in tool calls (read/bash/edit/write/grep/find/ls) into single-line ✓/✗/⋯ summaries and folds thinking blocks. Two glyph sets available:
check(✓/✗/⋯) anddot(●/○/◌). Toggle with/cockpit quiet; turning off requires/reloadto restore native tool renderers.
Toggle each block between list and compact with /cockpit.
Data sources (and the dependency this implies)
| Block | Source | Available on bare Pi? |
|---|---|---|
| AGENTS | pi.events channels teammate:started / teammate:message / teammate:complete, broadcast by pi-maestro-teammate |
No — without that extension no events fire, the block stays hidden |
| TODO | the todo-state snapshot the pi-maestro-flow todo tool persists after every mutation (re-read on each tool_execution_end and on session_start) |
No — without the todo tool the block stays hidden |
| Footer | ctx.model, ctx.getContextUsage(), session usage totals, footerData.getGitBranch() |
Yes |
So on a stock Pi (no teammate / no todo tool) the extension loads without error, the status stack renders nothing, and only the footer appears. The roster is self-accumulated from event deltas — teammates already running before the extension loads are not back-filled (the teammate extension broadcasts deltas, never a full roster). The todo list is back-filled on session_start from the persisted snapshot.
This is the whole coupling story: cockpit has no package dependency on pi-maestro-flow and only a peer dependency on pi-maestro-teammate. It observes the other two plugins through public channels alone — teammate's event broadcasts for AGENTS, and the todo-state snapshot flow's todo tool persists for TODO. Remove either source and the matching block simply hides; the footer always remains.
Configuration
~/.pi/agent/cockpit.json (created on first run):
{
"enabled": true,
"quietMode": false,
"quietSymbols": "check",
"agentsMode": "list",
"todoMode": "list",
"todoExpanded": false,
"hideNativeAgents": true,
"icons": { "mode": "auto" },
"theme": ""
}
quietMode: whentrue, compresses built-in tool rendering and folds thinking blocks.quietSymbols:"check"(✓/✗/⋯) or"dot"(●/○/◌) lifecycle glyphs for quiet tool rows.agentsMode/todoMode:"list"or"compact".todoExpanded: whentrue, expands the todo widget by default.hideNativeAgents: whentrue, clears the teammate extension's ownteammate-agentswidget (it draws a similar list below the editor) so the two don't duplicate. On by default.icons.mode:"auto"(detect Nerd Font),"nerd", or"ascii".theme: named theme override; empty string follows the Pi session theme.
Commands
/cockpit— opens an overlay to toggleenabled,agentsMode,todoMode,quietMode, andhideNativeAgents./cockpit quiettoggles quiet mode directly;/cockpit bgshows background jobs./theme— switch theme with live preview;/theme <name>applies directly. Pi ships no standalone theme command; cockpit provides one.
Terminal feasibility — what this design deliberately does NOT do
The original mockup was a browser page; a terminal is an ANSI stream with no DOM, no CSS, no focus, no hover. Four mockup effects are out of scope here, with replacements:
| Mockup effect | Why it can't work in a TUI | Replacement |
|---|---|---|
Input-focus "power-up" glow (:has(:focus)) |
no focus pseudo-class; render(width) can't see focus |
the stack's header dot turns accent-green while an agent is running |
| Hover-to-expand chips/rows | no hover in a terminal | list mode shows everything; compact mode is one line; /cockpit toggles |
| Scanlines / logo light-up animation | no overlay/animation layer | a braille spinner frame, advanced on each redraw |
| In-stream thinking-collapse / edit progress bar / colored bash stdout | built-in message & built-in tool rendering is not replaceable by extensions (renderCall/renderResult only apply to tools you register) |
the conversation stream is left to Pi's native renderer — it is context, not a cockpit deliverable |
Local development
cd packages/pi-cockpit
node --test --experimental-transform-types tests/agents-store.test.ts tests/todo-store.test.ts tests/render.test.ts tests/footer.test.ts
../../node_modules/.bin/tsc -p tsconfig.json # type-check (uses the monorepo root's tsc + types)
The package lives inside the pi-maestro-flow monorepo under packages/ so it resolves @earendil-works/* types from the root node_modules. It is also an exact-pinned dependency of pi-maestro-flow and ships as its own npm package (pi-cockpit).
License
MIT