billion-context-pi-subagents
acp_delegate sub-agent tools for the Pi coding agent — split out of billion-context-pi (#612).
Package details
Install billion-context-pi-subagents from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:billion-context-pi-subagents- Package
billion-context-pi-subagents- Version
0.1.1- Published
- Oct 6, 2026
- Downloads
- 532/mo · 532/wk
- Author
- ranxianglei
- License
- MIT
- Types
- extension
- Size
- 1.8 MB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./dist/index.js"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
billion-context-pi-subagents
acp_delegate sub-agent tools for the Pi coding agent — split out of billion-context-pi (#612). Hand a self-contained task to a fresh pi process running in a clean context; the result comes back as a file path, keeping your main session lean.
Relationship to the other packages
| Package | Role |
|---|---|
| billion-context-pi | Context compression (compress / decompress / search_context / acp_status) |
| billion-context-pi-subagents (this) | Sub-agent delegation (acp_delegate* + fleet inspector) |
| billion-context | Multi-host proxy launcher (opencode/omp/…) — no code sharing with this package; its "subagent" support tracks opencode-native task sessions only |
billion-context-pi bundles this package. Since the split (#612), billion-context-pi pins this package as an exact devDependency and inlines it into its dist at build time (the same mechanism it uses for acp-kernel). If you use billion-context-pi you already have acp_delegate — do not install this package separately. If both end up loaded, the standalone copy detects the bundled copy at session start and stands down automatically (no duplicate tools or prompt sections).
Install this package directly only if you want delegation without billion-context-pi: the delegate children then rely on Pi's native context management instead of ACP compression, and the /acp-subagents command is not available.
When the two run together they coexist in one Pi process: same acp.json convention (each reads only its own keys) and same log file (~/.pi/acp.log).
Install
billion-context-pi users: skip this — it is already bundled. This install is only for standalone use without billion-context-pi:
pi install npm:billion-context-pi-subagents
No configuration needed — delegates are enabled by default. Restart Pi after installing.
⚠️ v0.1.x has no auto-update. Standalone installs must be upgraded manually (
pi install npm:billion-context-pi-subagents@latestor re-install). The copy bundled inside billion-context-pi updates with billion-context-pi releases.
Model-facing tools
| Tool | What it does |
|---|---|
acp_delegate |
Spawn a clean-context sub-agent for a task (review / research / implement / plan / advise) |
acp_delegate_wait |
Block until a delegate run finishes (returns its result; times out otherwise) |
acp_delegate_cancel |
Cancel a running delegate by runId |
Roles
Five built-in roles, each with a system prompt and a soft tool guardrail:
| Role | Tools | Best for |
|---|---|---|
reviewer |
read, bash, grep, find, ls + ACP | Read-only code review (bugs, risks, file:line) |
researcher |
read, bash, grep, find, ls + ACP | Read-only codebase investigation |
worker |
read, edit, write, bash | Make code changes |
planner |
read, bash, grep, find, ls + ACP | Analyze + propose a step-by-step plan |
oracle |
read, bash, grep, find, ls + ACP | Answer questions / advise |
Read-only roles receive a restricted tool allowlist plus ACP context tools so they can manage their own context. This prevents accidental file modifications, but bash can bypass it — it is a guardrail, not a security boundary. Worker runs on Pi's full default toolset (any loaded extension or custom tools stay available).
Execution model
- Interactive (TUI) & RPC modes:
async:true(default) runs the child in the background; a short completion notification is injected into the chat when it finishes — unless the model already read the result file after the run finished (detected via thereadtool or a bash command referencing the file), in which case the notification is skipped: the model already has the result, so re-injecting it would only waste context. Setdelegate: { notifyIfRead: "always" }inacp.jsonto restore always-inject. - Print / JSON modes (
pi -p, SDK):async:trueauto-downgrades to synchronous — the result returns as the tool result in the same turn. - Failures are loud, never silent. A failed run (nonzero exit, spawn error, watchdog timeout) injects a
FAILED ⚠️notification carrying a short error excerpt. If a notification cannot be delivered at all, a recovery notice is attached to the next delegate notification or tool result. - Result delivery: the full delegate output is saved to
$TMPDIR/acp-delegate/<runId>.out; the tool result and notification carry only the task title + file path (no preview) — usereadfor the details. - Live visibility (TUI): async runs show a status widget below the editor and a footer line with cumulative token/cost usage.
/acp-fleet(or thectrl+alt+dshortcut) opens the interactive fleet inspector: live list + transcript overlay. Disabled automatically in RPC/print/JSON. - Resumable runs: a run can be resumed from its saved session (
.session.jsonlnext to the result file) — earlier tool calls are restored instead of replayed.
Configuration
Same file convention as billion-context-pi: ~/.pi/acp.json (global) and <project>/.pi/acp.json (project overrides global). This package reads only the keys below; all other keys in the same file belong to other packages and are ignored here.
{ "delegate": false }
or object form:
{
"delegate": {
"enabled": true,
"maxDepth": 2,
"maxConcurrent": 3,
"syncTimeoutMinutes": 5,
"idleTimeoutMinutes": 5,
"asyncTimeoutMinutes": 30,
"thinkingLevel": "medium",
"notifyIfRead": "skip",
"displayUsage": "separate",
"forceEnable": false,
"fleetShortcut": "ctrl+alt+d",
"agents": {
"reviewer": { "model": "anthropic/claude-sonnet-4-5", "thinkingLevel": "high" },
"worker": { "model": "zhipu/glm-4.7" }
}
}
}
| Key | Type | Default | Meaning |
|---|---|---|---|
delegate |
boolean | object |
enabled | Master switch. false removes the three tools, the system-prompt section and the fleet shortcut (new session required). |
delegate.enabled |
boolean | true |
Same as above, object form. |
delegate.forceEnable |
boolean | false |
Keep acp_delegate active even when a project-scope pi-subagents install would otherwise stand it down (#415). Env PI_ACP_DELEGATE_FORCE_ENABLE=true/false overrides. |
delegate.displayUsage |
"separate" | "merged" |
"separate" |
"separate": delegate tokens tracked outside the main session totals (own footer block). "merged": folded into the tool-result usage field. Legacy flat alias: top-level "displayUsage". |
delegate.maxDepth |
number | 2 |
Max nesting depth (main → child → grandchild). 1 = no nested delegation. Propagated to children via PI_ACP_DELEGATE_MAX_DEPTH. Env override: PI_ACP_DELEGATE_MAX_DEPTH. |
delegate.syncTimeoutMinutes |
number | null | 5 |
Hard timeout for synchronous delegates. 0/null disables. Env: PI_ACP_DELEGATE_SYNC_TIMEOUT_MINUTES. |
delegate.idleTimeoutMinutes |
number | null | 5 |
Idle watchdog for async delegates (kill when no output). 0/null disables (warns — hung children must then be cancelled manually via acp_delegate_cancel). Env: PI_ACP_DELEGATE_IDLE_TIMEOUT_MINUTES. |
delegate.asyncTimeoutMinutes |
number | null | 30 |
Hard time limit for async delegates. 0/null disables. Env: PI_ACP_DELEGATE_ASYNC_TIMEOUT_MINUTES. |
delegate.maxConcurrent |
number | unlimited | Cap on concurrent background delegates (1 = strict serial; extras queue). Invalid values fall back to unlimited with a warning. Env: PI_ACP_DELEGATE_MAX_CONCURRENT. |
delegate.thinkingLevel |
string | unset | Global default thinking level (off|minimal|low|medium|high|xhigh|max). Priority: per-call > role > global > Pi default. |
delegate.agents |
object | unset | Per-role defaults: { "<role>": { "model": "provider/id", "thinkingLevel": "…" } }. Invalid models fall back to the parent model with a warning (never fail). |
delegate.notifyIfRead |
"skip" | "always" |
"skip" |
Skip the completion notification when the model already read the result file after the run finished. |
delegate.fleetShortcut |
string | "ctrl+alt+d" |
TUI shortcut for the fleet inspector. "" disables keyboard registration (/acp-fleet still works). Moved off ctrl+alt+f, which pi-subagents also claims (#412). |
delegatePrompt |
string | null | built-in | Replace (string) or remove (null) the ACP_DELEGATE NOTIFICATIONS system-prompt appendix. |
debug |
boolean | false |
Debug-level events in ~/.pi/acp.log (shared with billion-context-pi). Env ACP_DEBUG=1 too. |
Invalid values never fail the session — they warn in ~/.pi/acp.log and fall back to defaults. Precedence: env > project acp.json > global acp.json > default.
A change to any delegate.* key takes effect on a new session (tools register at session start).
Using your own sub-agent instead
If you also run pi-subagents (or similar), two overlapping sub-agent systems make the model's choice noisier. Detection happens at session start:
- Project-scope install (
<cwd>/.pi/npm/node_modules/pi-subagentsor<cwd>/.pi/extensions/pi-subagents) →acp_delegatestands down automatically for that project (tools, shortcut and prompt section skipped); a reminder points at/acp-subagents(from billion-context-pi) so the third-party agents still get ACP compression. - User-scope-only install (
~/.pi/npm, user extensions dir) →acp_delegatestays active; a warning is logged instead. - Keep both anyway:
{ "delegate": { "forceEnable": true } }. - Drop this package entirely:
pi remove npm:billion-context-pi-subagents.
Pi's --exclude-tools acp_delegate,acp_delegate_wait,acp_delegate_cancel is not a substitute for delegate: false: it hides the tools but the model still receives the ACP_DELEGATE NOTIFICATIONS section describing tools it cannot call.
Host support
Built for Pi (@earendil-works/pi-coding-agent >= 0.83). On hosts without Pi's buildContextEntries() session API (e.g. OMP), nothing is registered and a warning is printed once per process; Pi-compatible forks can opt in with PI_ACP_FORK_HOST=1 (same contract as billion-context-pi's docs/host-adapter.md).
Logging
Writes to the shared ACP log ~/.pi/acp.log (override with ACP_LOG_FILE), same format as billion-context-pi:
tail -f ~/.pi/acp.log # watch the session live
grep '\[error\]' ~/.pi/acp.log # surface every recorded failure
Delegate lifecycle events (spawn/done/fail/cancel, stand-down decisions, config warnings) are always-on; debug: true adds verbose diagnostics.
License
MIT.