@cr1ms0n/pi-subagent 0.8.9 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +24 -0
- package/README.md +130 -569
- package/README.zh-CN.md +132 -0
- package/docs/ARCHITECTURE.md +56 -13
- package/docs/COST-ACCOUNTING.md +116 -66
- package/docs/DEVELOPMENT.md +124 -0
- package/docs/PLAN.md +2 -0
- package/docs/REFERENCE.md +436 -0
- package/docs/RELEASING.md +135 -16
- package/docs/ROADMAP.md +2 -0
- package/docs/SECURITY.md +52 -16
- package/docs/UX.md +158 -141
- package/package.json +10 -2
- package/skills/subagent/SKILL.md +82 -49
- package/src/backends/pi.ts +164 -94
- package/src/child-preflight.ts +166 -0
- package/src/config.ts +254 -252
- package/src/dispatch-preflight.ts +87 -0
- package/src/dispatch-routing.ts +56 -0
- package/src/extension.ts +366 -158
- package/src/format.ts +436 -365
- package/src/jev-router.ts +1032 -0
- package/src/orchestrator.ts +75 -19
- package/src/persistence.ts +643 -335
- package/src/policy.ts +120 -89
- package/src/process-lock.ts +730 -687
- package/src/protocol.ts +320 -290
- package/src/registry.ts +730 -632
- package/src/routing-policy.ts +276 -0
- package/src/routing-types.ts +217 -0
- package/src/runner.ts +1299 -850
- package/src/schema.ts +10 -10
- package/src/startup-check.ts +481 -0
- package/src/types.ts +208 -198
- package/src/usage.ts +316 -274
- package/src/model-policy.ts +0 -169
package/docs/SECURITY.md
CHANGED
|
@@ -6,11 +6,11 @@ and can use tools according to their capability profile.
|
|
|
6
6
|
|
|
7
7
|
## What subagents can do
|
|
8
8
|
|
|
9
|
-
| Profile |
|
|
10
|
-
|
|
11
|
-
| `explore` |
|
|
12
|
-
| `review` |
|
|
13
|
-
| `general` |
|
|
9
|
+
| Profile | Finalized tools | Writes? |
|
|
10
|
+
|---------|-----------------|---------|
|
|
11
|
+
| `explore` | Jev-chosen subset of locally permitted read-only candidates, plus available Pi context tools | No project-file writes |
|
|
12
|
+
| `review` | Same as explore | No project-file writes |
|
|
13
|
+
| `general` | Jev-chosen subset of the full available locally permitted catalog, plus available Pi context tools | Yes if write-capable tools are selected |
|
|
14
14
|
|
|
15
15
|
Parallel mode defaults to `explore` to avoid concurrent shared writes.
|
|
16
16
|
|
|
@@ -20,7 +20,16 @@ Parallel mode defaults to `explore` to avoid concurrent shared writes.
|
|
|
20
20
|
an explore/review profile. Pi context-management tools (`new_context`,
|
|
21
21
|
`get_context_remaining`, `history`, `notes`) are an explicit control-plane
|
|
22
22
|
exception: they may update continuity notes/window state but cannot access
|
|
23
|
-
the project write tools.
|
|
23
|
+
the project write tools. The finalized tools reach the child as Pi's `--tools`
|
|
24
|
+
allowlist (`--no-tools` when empty), and the selector's answer is re-validated
|
|
25
|
+
locally: unknown, unavailable or unsafe choices cannot launch broader
|
|
26
|
+
capability, and an empty selection never becomes "all tools". Pi 0.86.0 is the
|
|
27
|
+
verified baseline for built-in, extension and late-registered tool enforcement;
|
|
28
|
+
a host that cannot honor the allowlist is refused rather than silently weakened.
|
|
29
|
+
Before the real task prompt, a package-local startup check verifies the routing
|
|
30
|
+
bootstrap command source and has the child acknowledge the exact selected model
|
|
31
|
+
and tool names; a mismatch aborts as a capability diagnostic and is never fixed
|
|
32
|
+
by widening tools, switching models or approving project trust.
|
|
24
33
|
2. **Parallel writers** require `isolation: "worktree"`, distinct `cwd` values,
|
|
25
34
|
or an explicit `allow_shared_writes: true` opt-in.
|
|
26
35
|
3. **Depth is capped** (`maxDepth`, default 2). Nested children at the ceiling do
|
|
@@ -41,22 +50,47 @@ Parallel mode defaults to `explore` to avoid concurrent shared writes.
|
|
|
41
50
|
(RPC mode). Extension UI dialogs raised inside a child are auto-cancelled so
|
|
42
51
|
they can never hang a run — which also means a child can never obtain
|
|
43
52
|
interactive consent. Prefer restricted tools for async/background runs.
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
53
|
+
7. **Steering messages** (`action: "steer"` and the overlay `s` key) inject text
|
|
54
|
+
into a running child's conversation with user-level authority. Anything that
|
|
55
|
+
can call the subagent tool can steer any live run in the same session.
|
|
56
|
+
8. **Process cleanup.** On POSIX, children run in their own process group so tree
|
|
48
57
|
kills work for ordinary descendants. Parent (re)start reaps orphans recorded
|
|
49
58
|
under `~/.pi/subagent-locks/runs/` so resume cannot race a still-alive writer.
|
|
50
59
|
Grandchildren that call `setsid()` can still escape a simple process-group kill.
|
|
51
|
-
|
|
60
|
+
9. **Resume exclusivity.** Direct resume takes a durable per-session file lock;
|
|
52
61
|
concurrent parents cannot append to the same child session.
|
|
53
|
-
|
|
62
|
+
10. **Profiles are tool-selection policy, not a sandbox.** Children inherit
|
|
54
63
|
`$HOME`, SSH/cloud credentials, network access, and the parent filesystem.
|
|
55
64
|
Git worktrees only isolate the checkout. For untrusted tasks, use an outer
|
|
56
65
|
container/cgroup/network policy.
|
|
57
|
-
|
|
58
|
-
turn; orphans may spend money the ledger never sees.
|
|
59
|
-
|
|
66
|
+
11. **`max_cost` is accounting, not a hard provider gate.** Usage arrives after a
|
|
67
|
+
turn; orphans may spend money the ledger never sees. It caps provider-reported
|
|
68
|
+
execution cost only: TypeSafe reports routing tokens, not currency, so selector
|
|
69
|
+
cost is unreported and outside `max_cost`. Combine with provider account
|
|
70
|
+
budgets for hard spend limits.
|
|
71
|
+
|
|
72
|
+
## Routing disclosure and credentials
|
|
73
|
+
|
|
74
|
+
Jev routing sends a minimal projection to TypeSafe: the current delegated task
|
|
75
|
+
text, the configured candidate model IDs and your per-model descriptions,
|
|
76
|
+
eligible candidate tool names and descriptions, and necessary constraints
|
|
77
|
+
(profile, requested thinking, whether structured output is needed). It does not
|
|
78
|
+
upload repository files, conversation history, full system prompts, persona text
|
|
79
|
+
or tool parameter schemas, and does not read them in the background. Resume, fork
|
|
80
|
+
and synthesis select from the new task instruction rather than the assembled
|
|
81
|
+
transcript. Task text and model descriptions are user content and can themselves
|
|
82
|
+
contain secrets; there is no guaranteed redaction.
|
|
83
|
+
|
|
84
|
+
Version `0.10.0` reads the TypeSafe credential from `jevRouting.apiKey` in the private user-level `~/.pi/subagent.json`. This is plaintext storage: restrict file access and protect editor backups and synchronized copies. Same-user processes, including children with filesystem access, may read it. Profiles and worktrees do not protect this file from those processes.
|
|
85
|
+
|
|
86
|
+
The transport sends the key only as an `Authorization` header to the fixed official HTTPS endpoint, with redirects disabled. It does not automatically copy the key into prompts, selector JSON bodies, argv, child manifests, logs, receipts or results. Never serialize or log the complete routing configuration. Rotate any credential pasted into a transcript or shared in conversation.
|
|
87
|
+
|
|
88
|
+
Published npm `0.9.0` uses the older environment-based mechanism. In `0.10.0`, `apiKeyEnv` is rejected with manual migration guidance and no environment fallback. Unrelated `PI_SUBAGENT_*` runtime settings remain supported.
|
|
89
|
+
|
|
90
|
+
New extension-managed dispatch is Pi-only. A `backend: "codex"` or
|
|
91
|
+
`backend: "claude"` new task is rejected before any selector or provider work,
|
|
92
|
+
including a backend inherited from agent frontmatter, rather than silently
|
|
93
|
+
switched to Pi. Existing native-backend runs stay manageable.
|
|
60
94
|
|
|
61
95
|
## Trust and project cwd
|
|
62
96
|
|
|
@@ -72,7 +106,9 @@ duplicate output paths across parallel workers.
|
|
|
72
106
|
## Named agent files
|
|
73
107
|
|
|
74
108
|
Agent files (`.pi/agents/`, `.agents/agents/`, global agent dir) inject their
|
|
75
|
-
body into the child's system prompt and set
|
|
109
|
+
body into the child's system prompt and set persona, thinking and budget
|
|
110
|
+
defaults. Model and tool selection come from Jev routing; a legacy
|
|
111
|
+
`model`/`fallback_models` in frontmatter is ignored. A
|
|
76
112
|
project-level agent file shapes subagent behavior the same way project
|
|
77
113
|
extensions and skills do — review them like code when working in untrusted
|
|
78
114
|
repositories. Mitigations: capability profiles still fail closed (an agent
|
package/docs/UX.md
CHANGED
|
@@ -1,141 +1,158 @@
|
|
|
1
|
-
# pi-subagent UX
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
The standalone pi-subagent provides rich TUI support for monitoring, inspecting, and interacting with isolated subagent runs (single and parallel modes): inline streaming blocks, a terse footer, an ambient widget for background runs, batched completion notifications, mid-run steering, a worktree apply loop, and the `/subagents` inspector. UI logic is kept independent from `runner`/`registry` via small structural adapters (`SubagentAdapter`).
|
|
5
|
-
|
|
6
|
-
## Design principles
|
|
7
|
-
|
|
8
|
-
1. **Pi's tool shell owns state signaling.** The Box wrapper paints
|
|
9
|
-
`toolPendingBg` / `toolSuccessBg` / `toolErrorBg`, so inline blocks do not
|
|
10
|
-
repeat state words or draw their own success/error framing.
|
|
11
|
-
2. **Cost is a per-run attribute, not a competing ledger.** Dollar cost appears
|
|
12
|
-
inside the run's own result block; the parent/children/combined ledger is
|
|
13
|
-
available on demand via `/subagent-cost`, in `status` tool output, and in the
|
|
14
|
-
`/subagents` overlay header. The footer never shows cost.
|
|
15
|
-
3. **Fixed-height, mutate-in-place progress.** Streaming blocks keep a stable
|
|
16
|
-
shape (stats line + one `⎿ activity` line; parallel adds one line per task)
|
|
17
|
-
and the same component identity is reused across partial renders.
|
|
18
|
-
4. **Trailing-edge streaming flush.** Structural updates (state transition, new
|
|
19
|
-
session id, billed turn) emit immediately; live-text bursts coalesce with a
|
|
20
|
-
deferred flush so the last update of a burst always lands.
|
|
21
|
-
|
|
22
|
-
## Surfaces
|
|
23
|
-
|
|
24
|
-
### Inline tool block (foreground runs)
|
|
25
|
-
- `renderCall` is exactly one line: `subagent <task preview>` (or
|
|
26
|
-
`N parallel tasks — first task…`, `wait a1b2c3d4`, `… · background`).
|
|
27
|
-
- `renderResult` while streaming (fixed shape, spinner animates via wall-clock
|
|
28
|
-
frame; Pi's working indicator drives repaints):
|
|
29
|
-
```
|
|
30
|
-
⠹ ↻3 · 12.4k tok · 8s
|
|
31
|
-
⎿ reading src/auth/middleware.ts…
|
|
32
|
-
```
|
|
33
|
-
- Terminal single run:
|
|
34
|
-
```
|
|
35
|
-
↻8 · 33.8k tok · $0.012 · 12s
|
|
36
|
-
⎿ Found 5 middleware call sites…
|
|
37
|
-
→ /tmp/report.md
|
|
38
|
-
```
|
|
39
|
-
- Parallel: one line per task with a themed state glyph
|
|
40
|
-
(`◌ queued · ⠹ running · ✓ done · ✗ failed · ◐ partial · − cancelled · ◷ timeout`),
|
|
41
|
-
per-task stats, and a one-line tail (live activity or first output line).
|
|
42
|
-
- Expanded (Ctrl+O / `app.tools.expand`): full task output capped with a dim
|
|
43
|
-
`… +N lines` trailer pointing at the artifact/child session.
|
|
44
|
-
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
###
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
-
|
|
82
|
-
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
###
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
1
|
+
# pi-subagent UX
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
The standalone pi-subagent provides rich TUI support for monitoring, inspecting, and interacting with isolated subagent runs (single and parallel modes): inline streaming blocks, a terse footer, an ambient widget for background runs, batched completion notifications, mid-run steering, a worktree apply loop, and the `/subagents` inspector. UI logic is kept independent from `runner`/`registry` via small structural adapters (`SubagentAdapter`).
|
|
5
|
+
|
|
6
|
+
## Design principles
|
|
7
|
+
|
|
8
|
+
1. **Pi's tool shell owns state signaling.** The Box wrapper paints
|
|
9
|
+
`toolPendingBg` / `toolSuccessBg` / `toolErrorBg`, so inline blocks do not
|
|
10
|
+
repeat state words or draw their own success/error framing.
|
|
11
|
+
2. **Cost is a per-run attribute, not a competing ledger.** Dollar cost appears
|
|
12
|
+
inside the run's own result block; the parent/children/combined ledger is
|
|
13
|
+
available on demand via `/subagent-cost`, in `status` tool output, and in the
|
|
14
|
+
`/subagents` overlay header. The footer never shows cost.
|
|
15
|
+
3. **Fixed-height, mutate-in-place progress.** Streaming blocks keep a stable
|
|
16
|
+
shape (stats line + one `⎿ activity` line; parallel adds one line per task)
|
|
17
|
+
and the same component identity is reused across partial renders.
|
|
18
|
+
4. **Trailing-edge streaming flush.** Structural updates (state transition, new
|
|
19
|
+
session id, billed turn) emit immediately; live-text bursts coalesce with a
|
|
20
|
+
deferred flush so the last update of a burst always lands.
|
|
21
|
+
|
|
22
|
+
## Surfaces
|
|
23
|
+
|
|
24
|
+
### Inline tool block (foreground runs)
|
|
25
|
+
- `renderCall` is exactly one line: `subagent <task preview>` (or
|
|
26
|
+
`N parallel tasks — first task…`, `wait a1b2c3d4`, `… · background`).
|
|
27
|
+
- `renderResult` while streaming (fixed shape, spinner animates via wall-clock
|
|
28
|
+
frame; Pi's working indicator drives repaints):
|
|
29
|
+
```
|
|
30
|
+
⠹ ↻3 · 12.4k tok · 8s
|
|
31
|
+
⎿ reading src/auth/middleware.ts…
|
|
32
|
+
```
|
|
33
|
+
- Terminal single run:
|
|
34
|
+
```
|
|
35
|
+
↻8 · 33.8k tok · $0.012 · 12s
|
|
36
|
+
⎿ Found 5 middleware call sites…
|
|
37
|
+
→ /tmp/report.md
|
|
38
|
+
```
|
|
39
|
+
- Parallel: one line per task with a themed state glyph
|
|
40
|
+
(`◌ queued · ⠹ running · ✓ done · ✗ failed · ◐ partial · − cancelled · ◷ timeout`),
|
|
41
|
+
per-task stats, and a one-line tail (live activity or first output line).
|
|
42
|
+
- Expanded (Ctrl+O / `app.tools.expand`): full task output capped with a dim
|
|
43
|
+
`… +N lines` trailer pointing at the artifact/child session.
|
|
44
|
+
- Expanded detail adds one bounded route line for Jev-routed runs: selected
|
|
45
|
+
execution model, selected tools (plus locally added control-plane tools),
|
|
46
|
+
selector version, confidence, outcome and selection latency. Legacy runs
|
|
47
|
+
simply have no route line.
|
|
48
|
+
- Durations freeze at `endedAt`; running durations tick at render time.
|
|
49
|
+
- Reliability annotations render inline: `[attempt 2]` during a same-model
|
|
50
|
+
retry, `[stalled 2m]` while the stall watchdog is flagging silence, and
|
|
51
|
+
`◐ wrapped up` on budget-stopped runs that concluded gracefully.
|
|
52
|
+
|
|
53
|
+
### Footer status
|
|
54
|
+
Terse and actionable only: `⚙ 2 running · 1 ready · /subagents`. Cleared when
|
|
55
|
+
nothing is running or ready. No cost — Pi's footer already shows session cost.
|
|
56
|
+
|
|
57
|
+
### Ambient widget (background runs only)
|
|
58
|
+
An above-editor widget renders while `async: true` runs are live — foreground
|
|
59
|
+
runs already render inline as the tool result, so they never appear here
|
|
60
|
+
(avoids double-render):
|
|
61
|
+
|
|
62
|
+
```
|
|
63
|
+
● Subagents
|
|
64
|
+
├─ ⠼ Audit deps · ↻4 · 18k tok · 41s
|
|
65
|
+
│ ⎿ checking license headers…
|
|
66
|
+
└─ ◌ License scan · 12s
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
Cleared when the last background run settles. Spinner and elapsed animate on
|
|
70
|
+
a 250ms interval that exists only while background runs are live.
|
|
71
|
+
|
|
72
|
+
### Completion notifications (background runs only)
|
|
73
|
+
When an async run reaches a terminal state, a `steer` message (custom type
|
|
74
|
+
`subagent-completion`) is queued for the parent LLM before its next LLM call,
|
|
75
|
+
so it can react without polling. The human sees a themed compact box (state
|
|
76
|
+
glyph, label, stats, one-line preview, artifact pointers); the LLM sees plain
|
|
77
|
+
text with run ids and a `wait { id }` pointer.
|
|
78
|
+
|
|
79
|
+
- Successes within a short window batch into one message (no fanout spam);
|
|
80
|
+
failures bypass batching and flush immediately, carrying held successes.
|
|
81
|
+
- A `wait` that already delivered the run suppresses the redundant
|
|
82
|
+
notification (delivered-state is re-checked at flush time).
|
|
83
|
+
|
|
84
|
+
### `/subagents` overlay
|
|
85
|
+
- Header: title + running/ready counters + full usage ledger + rule.
|
|
86
|
+
- List: two lines per run — glyph/id/state/stats, then the task preview.
|
|
87
|
+
Selection cursor `▶`, animated spinner for live runs.
|
|
88
|
+
- Detail: run stats, summary, then per-task sections (glyph, label,
|
|
89
|
+
model/selector route/profile/thinking, usage, pointers, transcript/final
|
|
90
|
+
output/errors), scrollable with ↑↓/j/k and PageUp/PageDown.
|
|
91
|
+
- Actions: `c` cancel, `s` steer (prompts for a message, injects it into the
|
|
92
|
+
running child), `d` dismiss, `r` resume, `o` output pointers, `a` apply a
|
|
93
|
+
finished run's changed worktree into the main checkout (confirm dialog),
|
|
94
|
+
`x` discard worktree + branch (confirm dialog), Enter drill-down,
|
|
95
|
+
Esc/b back, Esc/q close.
|
|
96
|
+
- Live transcript (`t` on a **running** run's detail): tails the child's
|
|
97
|
+
session file (`sessionDir/<…sessionId…>.jsonl`) on a 500ms poll while the
|
|
98
|
+
pane is visible — compact role/tool lines, auto-follow unless you scroll
|
|
99
|
+
up (which pauses follow). No RPC reads; hidden/finished runs never poll.
|
|
100
|
+
Missing file shows “waiting for child session…”. `s` steering still works
|
|
101
|
+
from the same pane so observe → steer stays on one surface.
|
|
102
|
+
|
|
103
|
+
### `/subagent-cost`
|
|
104
|
+
Prints the root/subagents/routing/combined ledger once, on demand. Routing
|
|
105
|
+
tokens appear as their own category and their currency as unreported; the known
|
|
106
|
+
dollar totals exclude that unreported selector spend.
|
|
107
|
+
|
|
108
|
+
### Mid-run steering
|
|
109
|
+
Children run in Pi RPC mode, so their stdin stays open as a command channel.
|
|
110
|
+
`action: "steer"` (or `s` in the overlay) queues a message that is delivered
|
|
111
|
+
after the child's current assistant turn, before its next LLM call — course
|
|
112
|
+
correction without cancel + retry. Parallel runs steer one task via `index`.
|
|
113
|
+
|
|
114
|
+
### Worktree loop
|
|
115
|
+
Finished runs with changed worktrees support `diff` / `apply` / `discard`
|
|
116
|
+
actions (tool) and `a` / `x` keys (overlay). `apply` lands the worktree's
|
|
117
|
+
combined patch (committed + uncommitted + untracked vs base) onto the main
|
|
118
|
+
checkout as **uncommitted working-tree changes** via `git apply --3way`; it
|
|
119
|
+
never commits and never deletes the worktree. `discard` is the explicit
|
|
120
|
+
cleanup step and always confirms first.
|
|
121
|
+
|
|
122
|
+
### Parallel fan-in
|
|
123
|
+
`synthesis: "<instruction>"` on a parallel run asks for one read-only child
|
|
124
|
+
after all tasks settle that folds their outputs into a single brief, delivered
|
|
125
|
+
first in the result. It is best effort and deferred: its route is selected only
|
|
126
|
+
when aggregation is actually needed after the workers finish, so it never blocks
|
|
127
|
+
worker launch. A selector or child failure keeps the raw worker outputs, their
|
|
128
|
+
usage and a bounded `Optional synthesis blocked: …` diagnostic instead of
|
|
129
|
+
discarding or re-routing them.
|
|
130
|
+
|
|
131
|
+
### Plan results (tool output, not TUI)
|
|
132
|
+
`action:"plan"` returns the resolved model/tools and the selector usage it
|
|
133
|
+
incurred, and states that a later dispatch selects again. It starts no child and
|
|
134
|
+
creates no run entry, so plan never adds an overlay row or ambient widget. A
|
|
135
|
+
plan whose optional synthesis selection fails still returns the valid worker plan
|
|
136
|
+
and labels only that synthetic stage blocked with its diagnostic.
|
|
137
|
+
|
|
138
|
+
## States
|
|
139
|
+
- **Queued/Running**: spinner + live stats + activity tail from live text.
|
|
140
|
+
- **Completed/Partial/Failed/Cancelled/Timeout/Lost**: state glyph, frozen
|
|
141
|
+
duration, usage summary, output pointers; failures show the error message.
|
|
142
|
+
- **Delivered vs Undelivered**: footer/overlay track pending delivery.
|
|
143
|
+
- **Notification**: one per terminal transition to avoid spam.
|
|
144
|
+
|
|
145
|
+
## Integration Notes
|
|
146
|
+
- Extension wires via `ctx.ui.custom((tui, theme, kb, done) => createSubagentsOverlay(tui, theme, adapter, done), {overlay: true})`.
|
|
147
|
+
- Adapter provides getActiveRuns/getCompletedRuns/cancelRun etc. without tight coupling.
|
|
148
|
+
- Inline renderers reuse `context.lastComponent` (a `LineBlock`) so the row keeps
|
|
149
|
+
a stable component identity across partial renders.
|
|
150
|
+
- Streamed tool updates separate LLM-facing `content` (compact status string)
|
|
151
|
+
from render-facing `details` (state, usage, live-text tail, run timing).
|
|
152
|
+
- Tests combine pure UI models with a headless Pi extension harness: format
|
|
153
|
+
helpers, block layouts (collapsed/streaming/terminal/parallel), navigation,
|
|
154
|
+
truncation (ANSI-safe via `visibleWidth`), ready state, lifecycle/disposal.
|
|
155
|
+
- Follows Pi TUI guidelines (render(width), handleInput, invalidate,
|
|
156
|
+
requestRender, dispose). The overlay owns a single animation interval.
|
|
157
|
+
|
|
158
|
+
See ARCHITECTURE.md for ownership boundaries. All rendering respects terminal width and ANSI safety.
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cr1ms0n/pi-subagent",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Community fork of Luke Parke's pi-subagent with
|
|
3
|
+
"version": "0.10.0",
|
|
4
|
+
"description": "Community fork of Luke Parke's pi-subagent with Jev model/tool routing and verified Pi child capabilities",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"author": "Luke Parke",
|
|
@@ -10,6 +10,13 @@
|
|
|
10
10
|
"cr1ms0n (fork maintainer)"
|
|
11
11
|
],
|
|
12
12
|
"homepage": "https://www.npmjs.com/package/@cr1ms0n/pi-subagent",
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git+https://github.com/awoaCrim/pi-smart-subagents.git"
|
|
16
|
+
},
|
|
17
|
+
"bugs": {
|
|
18
|
+
"url": "https://github.com/awoaCrim/pi-smart-subagents/issues"
|
|
19
|
+
},
|
|
13
20
|
"keywords": [
|
|
14
21
|
"pi-package",
|
|
15
22
|
"pi",
|
|
@@ -31,6 +38,7 @@
|
|
|
31
38
|
"skills",
|
|
32
39
|
"docs",
|
|
33
40
|
"README.md",
|
|
41
|
+
"README.zh-CN.md",
|
|
34
42
|
"CHANGELOG.md",
|
|
35
43
|
"LICENSE"
|
|
36
44
|
],
|