@zichuanlan/pi-subagents-lite
A streamlined Pi subagent runtime with FleetView, live conversations, and JSON agent profiles.
Package details
Install @zichuanlan/pi-subagents-lite from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:@zichuanlan/pi-subagents-lite- Package
@zichuanlan/pi-subagents-lite- Version
0.2.0- Published
- Jul 19, 2026
- Downloads
- 82/mo · 82/wk
- Author
- zichuanlan
- License
- MIT
- Types
- extension
- Size
- 252.5 KB
- Dependencies
- 1 dependency · 3 peers
Pi manifest JSON
{
"extensions": [
"./src/index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
@zichuanlan/pi-subagents-lite
A streamlined Pi subagent package focused on execution and observability.
This fork keeps the parts needed to launch and monitor child agents—foreground/background execution, queues, FleetView, live conversations, steering, stopping, resuming, notifications, context inheritance, and transcripts—while removing unrelated orchestration subsystems.
Forked from @tintinweb/pi-subagents v0.14.2. See FORK_NOTES.md for the exact boundary.
Scope
Retained
- Foreground and background child agents
- Configurable background concurrency and queueing
subagent,get_subagent_result, andsteer_subagenttools/agentsmanagement UI- Above-editor activity widget
- FleetView below the editor
- Live conversation viewer with inline steer and stop
- Session resume within the current Pi session
- Smart/group/async completion notifications
- Optional parent-context inheritance
- Per-agent output transcripts
- Custom agent types
- Lifecycle events for observation
- Minimal headless lifecycle bridge for waiting and shutdown
Removed
- Scheduled/cron agents
- Persistent agent memory
- Dedicated skill preloading
- Git worktree isolation
- Cross-extension spawn/stop RPC
- Enabled-model/model-scope enforcement
The package does not provide a sandbox. Child agents run with the same local-user privileges as Pi and can use every tool granted by their profile and active permission policy.
Install
Local development install:
pi install /home/lan/workspace/pi-subagents-lite
Pi records local package paths without copying them, so source edits are picked up after restarting or reloading Pi.
Pi 0.80.10 accepts a bare local path here; it does not accept npm-style file:/home/... package specs.
After publishing to an npm scope you control:
pi install npm:@zichuanlan/pi-subagents-lite
The repository can live anywhere, including a WSL path. Publishing depends on npm authentication and ownership of the package scope, not on the filesystem location.
Tools
subagent
subagent({
subagent_type: "Explore",
prompt: "Find the authentication flow and report the critical files.",
description: "Trace auth flow",
run_in_background: true
})
Important parameters:
| Parameter | Meaning |
|---|---|
subagent_type |
Built-in or configured agent name |
prompt |
Self-contained task for the child |
description |
Short UI label |
model |
Optional provider/modelId or fuzzy model name |
thinking |
off, minimal, low, medium, high, xhigh, or max |
max_turns |
Optional positive turn limit |
run_in_background |
Return an agent ID immediately |
inherit_context |
Fork the parent conversation into the child |
isolated |
Disable extensions, MCP tools, and skill resources for the run |
resume |
Continue an existing current-session child agent |
A value pinned in an agent JSON profile takes precedence over the same tool-call parameter. Tool-call parameters fill profile gaps.
get_subagent_result
get_subagent_result({
agent_id: "<id>",
wait: true,
verbose: true
})
verbose: true includes the recorded child conversation when its session is still available.
steer_subagent
steer_subagent({
agent_id: "<id>",
message: "Stop exploring tests and focus on the production path."
})
The message is delivered after the child's current tool execution.
UI
Run /agents to inspect configured agent types, open running/completed conversations, and change operational settings.
FleetView appears below the editor while agents are available:
- At an empty prompt, press
↓or←to focus the fleet. - Use
↑/↓to select an agent. - Press
Enterto open its live conversation. - In the conversation viewer, press
Enterto compose a steer message. - Press
x, thenxagain, to stop a running agent. - Press
Escto return.
The above-editor widget defaults to background agents only, avoiding duplicate foreground output. Set widgetMode to all, background, or off.
Configuration model
Operational settings and agent runtime profiles use JSON. Markdown files contain prompt bodies.
JSON locations
| Priority | Path | Purpose |
|---|---|---|
| Higher | <cwd>/.pi/subagents.json |
Project overrides |
| Lower | ~/.pi/agent/subagents.json |
Global defaults |
Top-level operational fields use project-over-global replacement. agents profiles merge field-by-field by agent name, with project fields winning.
Example:
{
"maxConcurrent": 4,
"defaultMaxTurns": 0,
"graceTurns": 3,
"defaultJoinMode": "smart",
"fleetView": true,
"widgetMode": "background",
"outputTranscript": true,
"agents": {
"reviewer": {
"displayName": "Reviewer",
"description": "Read-only implementation reviewer",
"model": "sonnet",
"thinking": "high",
"maxTurns": 30,
"tools": ["read", "grep", "find", "bash", "ext:mcp/search"],
"extensions": ["mcp"],
"excludeExtensions": ["pi-notify"],
"disallowedTools": ["write", "edit"],
"promptMode": "replace",
"inheritContext": false,
"runInBackground": true,
"isolated": false,
"outputTranscript": true,
"enabled": true
}
}
}
Operational fields
| Field | Accepted values | Default |
|---|---|---|
maxConcurrent |
Integer 1..1024 |
4 |
defaultMaxTurns |
Integer 0..10000; 0 means unlimited |
Unlimited |
graceTurns |
Integer 1..1000 |
Runtime default |
defaultJoinMode |
async, group, smart |
smart |
fleetView |
Boolean | true |
widgetMode |
all, background, off |
background |
outputTranscript |
Boolean | true |
agents |
Object keyed by agent name | {} |
Agent profile fields
| Field | Type | Purpose |
|---|---|---|
displayName |
String | UI label |
description |
String | Tool-description guidance |
model |
String | Model pin or fuzzy model name |
thinking |
String | Thinking level |
maxTurns |
Non-negative integer | Profile-level turn policy; 0 is unlimited |
tools |
"all", "none", or string array |
Built-in and extension-tool allowlist |
extensions |
Boolean or string array | Which extensions load |
excludeExtensions |
String array | Extension denylist; exclusion wins |
disallowedTools |
String array | Final tool denylist |
promptMode |
replace or append |
Standalone prompt or parent-prompt twin |
inheritContext |
Boolean | Default conversation inheritance |
runInBackground |
Boolean | Default execution mode |
isolated |
Boolean | Built-in tools only; no extensions/skills |
outputTranscript |
Boolean | Per-agent transcript override |
enabled |
Boolean | Show or disable the agent type |
Tool selectors
tools accepts built-in names such as read, grep, find, bash, edit, and write.
Extension tools use selectors:
ext:mcpexposes all tools registered by themcpextension.ext:mcp/searchexposes only thesearchtool frommcp."*"inside an array means all built-in tools and (unless narrowed byext:) all tools from loaded extensions.
An explicit array without * is closed: only the listed built-ins and listed ext: tools reach the child. extensions controls loading/handlers; tools controls what reaches the child model.
Prompt Markdown
Prompt discovery order, highest first:
<cwd>/.pi/agents/<name>.md<cwd>/.agents/agents/<name>.md~/.pi/agent/agents/<name>.md- Embedded default prompt, when applicable
Example .pi/agents/reviewer.md:
You are a read-only implementation reviewer.
Report correctness, security, lifecycle, and configuration findings in priority order.
Include exact file paths and line references. Do not edit files.
The filename is the agent name. A Markdown file can override an embedded prompt such as Explore.md or Plan.md.
Legacy YAML frontmatter from the upstream package is still parsed as a migration fallback, but new configuration should use subagents.json. When both are present, JSON profile fields win and the Markdown body remains the prompt.
Built-in agents (lite roster)
Split only when tool/write boundaries differ. Checklists (security, debug, verify) merge into prompts — see docs/AGENT_ROSTER.md.
| Type | Display | Tools | Turns | Use when |
|---|---|---|---|---|
Explore |
Explore | read/grep/find/ls |
~8 | Local files/symbols/paths only |
Research |
Research | local read-only + web_search/fetch_content/get_search_content |
~10 | Docs, versions, external APIs, OSS samples |
Plan |
Plan | read-only (+ optional pi-lens via JSON) | ~12 | Implementation design, not coding |
Review |
Review | read/grep/find/ls |
~10 | Correctness + security findings |
general-purpose |
Implement | all built-ins, isolated | ~14 | Only write/edit/shell for one task |
Dispatch: locate → Explore · docs/web → Research · design → Plan · audit → Review · mutate → general-purpose.
Do not default every task to general-purpose. Debug/verify/security are not separate agents in lite; they are phases/checklists inside Implement or Review.
Config + docs you should keep in sync
| Layer | Path | Owns |
|---|---|---|
| Runtime policy | ~/.pi/agent/subagents.json or <cwd>/.pi/subagents.json |
tools, extensions, model, maxTurns, isolated |
| Prompt body | ~/.pi/agent/agents/<Name>.md or project .pi/agents/ |
persona, checklists, output shape |
| Merge rules | docs/AGENT_ROSTER.md |
what to split vs merge |
Create a JSON profile with the same name to override runtime fields. Create a Markdown file with the same name to override the prompt body. Set enabled: false in JSON to disable a type.
Single-level efficiency rules
- Children never inherit nested-agent tools (
subagent,get_subagent_result,steer_subagent) or parent workflow tools (trellis_subagent,todo,advisor, goal tools,memory,skill_manage). - An explicit
tools: [...]list is a closed allowlist: only named built-ins andext:<extension>/<tool>selectors surface. Loading an extension for handlers does not auto-expose its tools. tools: noneexposes no tools.tools: "*"/tools: "all"is the open policy for all built-ins plus loaded extension tools (minus hard denials).- Defaults use
promptMode: replaceand do not inherit the parent conversation unlessinherit_contextis set per call. - Soft turn-limit wrap-up asks for current evidence immediately; default grace is 1 turn.
Permission compatibility
Each child prompt includes:
<active_agent name="reviewer"/>
Permission extensions can use that identity to apply agent-specific policies. After child extensions bind, this package re-applies only the intersection of:
- the agent's configured allowlist, and
- the tools that remain active after policy binding.
This prevents extension binding from re-enabling tools that a permission policy disabled.
Observation events
The extension emits observation events on pi.events:
subagents:createdsubagents:startedsubagents:completedsubagents:failedsubagents:steeredsubagents:compactedsubagents:settings_loadedsubagents:settings_changed
These events are informational. Cross-extension spawning and stopping are intentionally not provided.
Development
npm install
npm run lint
npm run typecheck
npm test
npm run build
npm pack --dry-run
The package entry remains src/index.ts; Pi loads TypeScript extensions directly.
License and attribution
MIT licensed. Original implementation copyright remains with tintinweb. This fork preserves the upstream license and records its removals and compatibility changes in FORK_NOTES.md.