@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/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 | Default tools | Writes? |
10
- |---------|---------------|---------|
11
- | `explore` | `read`, `grep`, `find`, `ls` (+ safe extras and Pi context tools) | No project-file writes |
12
- | `review` | same as explore | No project-file writes |
13
- | `general` | inherited active tools (+ Pi context tools) | Yes if `bash`/`edit`/`write` are active |
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
- 11. **Steering messages** (`action: "steer"` and the overlay `s` key) inject text
45
- into a running child's conversation with user-level authority. Anything that
46
- can call the subagent tool can steer any live run in the same session.
47
- 7. **Process cleanup.** On POSIX, children run in their own process group so tree
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
- 8. **Resume exclusivity.** Direct resume takes a durable per-session file lock;
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
- 9. **Profiles are tool-selection policy, not a sandbox.** Children inherit
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
- 10. **`max_cost` is accounting, not a hard provider gate.** Usage arrives after a
58
- turn; orphans may spend money the ledger never sees. Combine with provider
59
- account budgets for hard spend limits.
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 its model/tools/budgets. A
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
- - Durations freeze at `endedAt`; running durations tick at render time.
45
- - Reliability annotations render inline: `[attempt 2]` during a retry,
46
- `[stalled 2m]` while the stall watchdog is flagging silence, and
47
- `◐ wrapped up` on budget-stopped runs that concluded gracefully.
48
-
49
- ### Footer status
50
- Terse and actionable only: `⚙ 2 running · 1 ready · /subagents`. Cleared when
51
- nothing is running or ready. No cost Pi's footer already shows session cost.
52
-
53
- ### Ambient widget (background runs only)
54
- An above-editor widget renders while `async: true` runs are live foreground
55
- runs already render inline as the tool result, so they never appear here
56
- (avoids double-render):
57
-
58
- ```
59
- Subagents
60
- ├─ ⠼ Audit deps · ↻4 · 18k tok · 41s
61
- │ ⎿ checking license headers…
62
- └─ ◌ License scan · 12s
63
- ```
64
-
65
- Cleared when the last background run settles. Spinner and elapsed animate on
66
- a 250ms interval that exists only while background runs are live.
67
-
68
- ### Completion notifications (background runs only)
69
- When an async run reaches a terminal state, a `steer` message (custom type
70
- `subagent-completion`) is queued for the parent LLM before its next LLM call,
71
- so it can react without polling. The human sees a themed compact box (state
72
- glyph, label, stats, one-line preview, artifact pointers); the LLM sees plain
73
- text with run ids and a `wait { id }` pointer.
74
-
75
- - Successes within a short window batch into one message (no fanout spam);
76
- failures bypass batching and flush immediately, carrying held successes.
77
- - A `wait` that already delivered the run suppresses the redundant
78
- notification (delivered-state is re-checked at flush time).
79
-
80
- ### `/subagents` overlay
81
- - Header: title + running/ready counters + full usage ledger + rule.
82
- - List: two lines per run — glyph/id/state/stats, then the task preview.
83
- Selection cursor `▶`, animated spinner for live runs.
84
- - Detail: run stats, summary, then per-task sections (glyph, label,
85
- model/profile/thinking, usage, pointers, transcript/final output/errors),
86
- scrollable with ↑↓/j/k and PageUp/PageDown.
87
- - Actions: `c` cancel, `s` steer (prompts for a message, injects it into the
88
- running child), `d` dismiss, `r` resume, `o` output pointers, `a` apply a
89
- finished run's changed worktree into the main checkout (confirm dialog),
90
- `x` discard worktree + branch (confirm dialog), Enter drill-down,
91
- Esc/b back, Esc/q close.
92
- - Live transcript (`t` on a **running** run's detail): tails the child's
93
- session file (`sessionDir/<…sessionId…>.jsonl`) on a 500ms poll while the
94
- pane is visible compact role/tool lines, auto-follow unless you scroll
95
- up (which pauses follow). No RPC reads; hidden/finished runs never poll.
96
- Missing file shows “waiting for child session…”. `s` steering still works
97
- from the same pane so observe steer stays on one surface.
98
-
99
- ### `/subagent-cost`
100
- Prints the root/subagents/combined ledger once, on demand.
101
-
102
- ### Mid-run steering
103
- Children run in Pi RPC mode, so their stdin stays open as a command channel.
104
- `action: "steer"` (or `s` in the overlay) queues a message that is delivered
105
- after the child's current assistant turn, before its next LLM call course
106
- correction without cancel + retry. Parallel runs steer one task via `index`.
107
-
108
- ### Worktree loop
109
- Finished runs with changed worktrees support `diff` / `apply` / `discard`
110
- actions (tool) and `a` / `x` keys (overlay). `apply` lands the worktree's
111
- combined patch (committed + uncommitted + untracked vs base) onto the main
112
- checkout as **uncommitted working-tree changes** via `git apply --3way`; it
113
- never commits and never deletes the worktree. `discard` is the explicit
114
- cleanup step and always confirms first.
115
-
116
- ### Parallel fan-in
117
- `synthesis: "<instruction>"` on a parallel run spawns one read-only child
118
- after all tasks settle that folds their outputs into a single brief, delivered
119
- first in the result. Synthesis failures degrade silently to raw results.
120
-
121
- ## States
122
- - **Queued/Running**: spinner + live stats + activity tail from live text.
123
- - **Completed/Partial/Failed/Cancelled/Timeout/Lost**: state glyph, frozen
124
- duration, usage summary, output pointers; failures show the error message.
125
- - **Delivered vs Undelivered**: footer/overlay track pending delivery.
126
- - **Notification**: one per terminal transition to avoid spam.
127
-
128
- ## Integration Notes
129
- - Extension wires via `ctx.ui.custom((tui, theme, kb, done) => createSubagentsOverlay(tui, theme, adapter, done), {overlay: true})`.
130
- - Adapter provides getActiveRuns/getCompletedRuns/cancelRun etc. without tight coupling.
131
- - Inline renderers reuse `context.lastComponent` (a `LineBlock`) so the row keeps
132
- a stable component identity across partial renders.
133
- - Streamed tool updates separate LLM-facing `content` (compact status string)
134
- from render-facing `details` (state, usage, live-text tail, run timing).
135
- - Tests combine pure UI models with a headless Pi extension harness: format
136
- helpers, block layouts (collapsed/streaming/terminal/parallel), navigation,
137
- truncation (ANSI-safe via `visibleWidth`), ready state, lifecycle/disposal.
138
- - Follows Pi TUI guidelines (render(width), handleInput, invalidate,
139
- requestRender, dispose). The overlay owns a single animation interval.
140
-
141
- See ARCHITECTURE.md for ownership boundaries. All rendering respects terminal width and ANSI safety.
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.8.9",
4
- "description": "Community fork of Luke Parke's pi-subagent with explicit model policy and model visibility for Pi",
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
  ],