@vitos-pizza/vitos-pizza 0.1.0 → 0.2.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.
Files changed (259) hide show
  1. package/AGENTS.md +158 -158
  2. package/CHANGELOG.md +42 -24
  3. package/LICENSE +21 -21
  4. package/README.md +237 -234
  5. package/assets/logo.svg +28 -28
  6. package/node_modules/@vitos-pizza/agent-mode/extensions/index.ts +138 -117
  7. package/node_modules/@vitos-pizza/agent-mode/package.json +3 -3
  8. package/node_modules/@vitos-pizza/agent-mode/src/apply-mode.ts +60 -60
  9. package/node_modules/@vitos-pizza/agent-mode/src/mode-events.ts +102 -102
  10. package/node_modules/@vitos-pizza/agent-mode/src/modes.ts +43 -43
  11. package/node_modules/@vitos-pizza/agent-mode/src/plan-instructions.ts +85 -44
  12. package/node_modules/@vitos-pizza/agent-mode/tests/apply-mode.test.ts +36 -36
  13. package/node_modules/@vitos-pizza/agent-mode/tests/mode-events.test.ts +22 -22
  14. package/node_modules/@vitos-pizza/agent-mode/tests/modes.test.ts +38 -38
  15. package/node_modules/@vitos-pizza/agent-mode/tests/plan-instructions.test.ts +68 -45
  16. package/node_modules/@vitos-pizza/agent-mode/tsconfig.json +13 -13
  17. package/node_modules/@vitos-pizza/agent-mode/vitest.config.ts +8 -8
  18. package/node_modules/@vitos-pizza/keybindings/extensions/index.ts +104 -104
  19. package/node_modules/@vitos-pizza/keybindings/package.json +1 -1
  20. package/node_modules/@vitos-pizza/keybindings/presets/shortcuts.json +3 -3
  21. package/node_modules/@vitos-pizza/keybindings/src/bind.ts +57 -57
  22. package/node_modules/@vitos-pizza/keybindings/src/config.ts +84 -84
  23. package/node_modules/@vitos-pizza/keybindings/src/registry.ts +43 -43
  24. package/node_modules/@vitos-pizza/keybindings/src/types.ts +54 -54
  25. package/node_modules/@vitos-pizza/keybindings/tests/config.test.ts +83 -83
  26. package/node_modules/@vitos-pizza/keybindings/tests/registry.test.ts +142 -142
  27. package/node_modules/@vitos-pizza/keybindings/tsconfig.json +13 -13
  28. package/node_modules/@vitos-pizza/keybindings/vitest.config.ts +8 -8
  29. package/node_modules/@vitos-pizza/permission-system/extensions/index.ts +162 -162
  30. package/node_modules/@vitos-pizza/permission-system/package.json +2 -2
  31. package/node_modules/@vitos-pizza/permission-system/src/bash/matcher.ts +54 -51
  32. package/node_modules/@vitos-pizza/permission-system/src/bash/parser.ts +40 -40
  33. package/node_modules/@vitos-pizza/permission-system/src/config-paths.ts +23 -23
  34. package/node_modules/@vitos-pizza/permission-system/src/detect-preset-mode.ts +61 -61
  35. package/node_modules/@vitos-pizza/permission-system/src/expand-home.ts +12 -12
  36. package/node_modules/@vitos-pizza/permission-system/src/forwarding/forwarder.ts +224 -224
  37. package/node_modules/@vitos-pizza/permission-system/src/forwarding/subagent-registry.ts +61 -61
  38. package/node_modules/@vitos-pizza/permission-system/src/gates/path-utils.ts +66 -66
  39. package/node_modules/@vitos-pizza/permission-system/src/gates/pipeline.ts +151 -155
  40. package/node_modules/@vitos-pizza/permission-system/src/handlers/before-agent-start.ts +86 -65
  41. package/node_modules/@vitos-pizza/permission-system/src/handlers/skill-input.ts +1 -1
  42. package/node_modules/@vitos-pizza/permission-system/src/handlers/tool-call-gate.ts +204 -199
  43. package/node_modules/@vitos-pizza/permission-system/src/mode-api.ts +44 -44
  44. package/node_modules/@vitos-pizza/permission-system/src/permission-evaluator.ts +233 -216
  45. package/node_modules/@vitos-pizza/permission-system/src/permission-session.ts +62 -62
  46. package/node_modules/@vitos-pizza/permission-system/src/policy-loader.ts +211 -211
  47. package/node_modules/@vitos-pizza/permission-system/src/sanitizers/skill-prompt.ts +99 -99
  48. package/node_modules/@vitos-pizza/permission-system/src/sanitizers/system-prompt.ts +221 -221
  49. package/node_modules/@vitos-pizza/permission-system/src/service.ts +66 -66
  50. package/node_modules/@vitos-pizza/permission-system/src/session-approvals.ts +4 -1
  51. package/node_modules/@vitos-pizza/permission-system/src/types.ts +80 -80
  52. package/node_modules/@vitos-pizza/permission-system/src/ui/approval-summary.ts +43 -43
  53. package/node_modules/@vitos-pizza/permission-system/src/ui/config-modal.ts +36 -36
  54. package/node_modules/@vitos-pizza/permission-system/src/ui/permission-dialog.ts +52 -52
  55. package/node_modules/@vitos-pizza/permission-system/src/wildcard-matcher.ts +81 -81
  56. package/node_modules/@vitos-pizza/permission-system/src/yaml-frontmatter.ts +84 -84
  57. package/node_modules/@vitos-pizza/permission-system/src/yolo/runtime-api.ts +49 -49
  58. package/node_modules/@vitos-pizza/permission-system/tests/bash-parser.test.ts +32 -32
  59. package/node_modules/@vitos-pizza/permission-system/tests/before-agent-start.test.ts +61 -0
  60. package/node_modules/@vitos-pizza/permission-system/tests/detect-preset-mode.test.ts +68 -68
  61. package/node_modules/@vitos-pizza/permission-system/tests/forwarder.test.ts +55 -55
  62. package/node_modules/@vitos-pizza/permission-system/tests/gates.test.ts +170 -61
  63. package/node_modules/@vitos-pizza/permission-system/tests/path-utils.test.ts +68 -68
  64. package/node_modules/@vitos-pizza/permission-system/tests/permission-evaluator.test.ts +82 -55
  65. package/node_modules/@vitos-pizza/permission-system/tests/policy-loader.test.ts +25 -25
  66. package/node_modules/@vitos-pizza/permission-system/tests/system-prompt-sanitizer.test.ts +22 -22
  67. package/node_modules/@vitos-pizza/permission-system/tests/wildcard-matcher.test.ts +27 -27
  68. package/node_modules/@vitos-pizza/permission-system/tsconfig.json +13 -13
  69. package/node_modules/@vitos-pizza/permission-system/vitest.config.ts +8 -8
  70. package/node_modules/@vitos-pizza/question/package.json +1 -1
  71. package/node_modules/@vitos-pizza/question/src/question-ui.ts +5 -1
  72. package/node_modules/@vitos-pizza/question/src/register-tool.ts +1 -4
  73. package/node_modules/@vitos-pizza/question/tests/question-ui-width-cache.test.ts +45 -0
  74. package/node_modules/@vitos-pizza/question/tests/register-tool-render.test.ts +48 -45
  75. package/node_modules/@vitos-pizza/session-title/extensions/index.ts +137 -137
  76. package/node_modules/@vitos-pizza/session-title/package.json +3 -3
  77. package/node_modules/@vitos-pizza/session-title/src/build-title-prompt.ts +16 -16
  78. package/node_modules/@vitos-pizza/session-title/src/extract-title-context.ts +55 -55
  79. package/node_modules/@vitos-pizza/session-title/src/fast-rules.ts +48 -48
  80. package/node_modules/@vitos-pizza/session-title/src/load-settings.ts +70 -70
  81. package/node_modules/@vitos-pizza/session-title/src/normalize-title.ts +20 -20
  82. package/node_modules/@vitos-pizza/session-title/src/parse-title-response.ts +6 -6
  83. package/node_modules/@vitos-pizza/session-title/src/resolve-title-model.ts +33 -33
  84. package/node_modules/@vitos-pizza/session-title/src/schedule-title-job.ts +53 -53
  85. package/node_modules/@vitos-pizza/session-title/src/should-schedule.ts +30 -30
  86. package/node_modules/@vitos-pizza/session-title/src/title-agent.ts +60 -60
  87. package/node_modules/@vitos-pizza/session-title/src/truncate-input.ts +10 -10
  88. package/node_modules/@vitos-pizza/session-title/src/types.ts +29 -29
  89. package/node_modules/@vitos-pizza/session-title/tests/build-title-prompt.test.ts +34 -34
  90. package/node_modules/@vitos-pizza/session-title/tests/extension.test.ts +198 -198
  91. package/node_modules/@vitos-pizza/session-title/tests/extract-title-context.test.ts +48 -48
  92. package/node_modules/@vitos-pizza/session-title/tests/fast-rules.test.ts +43 -43
  93. package/node_modules/@vitos-pizza/session-title/tests/parse-title-response.test.ts +34 -34
  94. package/node_modules/@vitos-pizza/session-title/tests/should-schedule.test.ts +30 -30
  95. package/node_modules/@vitos-pizza/session-title/tests/title-agent.test.ts +154 -154
  96. package/node_modules/@vitos-pizza/session-title/tests/truncate-input.test.ts +15 -15
  97. package/node_modules/@vitos-pizza/session-title/tsconfig.json +13 -13
  98. package/node_modules/@vitos-pizza/session-title/vitest.config.ts +8 -8
  99. package/node_modules/@vitos-pizza/subagents/agents/planner.md +46 -43
  100. package/node_modules/@vitos-pizza/subagents/agents/scout.md +40 -40
  101. package/node_modules/@vitos-pizza/subagents/agents/title.md +13 -13
  102. package/node_modules/@vitos-pizza/subagents/agents/worker.md +36 -36
  103. package/node_modules/@vitos-pizza/subagents/extensions/index.ts +164 -164
  104. package/node_modules/@vitos-pizza/subagents/package.json +1 -1
  105. package/node_modules/@vitos-pizza/subagents/skills/subagents/SKILL.md +86 -80
  106. package/node_modules/@vitos-pizza/subagents/src/agents.ts +166 -166
  107. package/node_modules/@vitos-pizza/subagents/src/async/job-tracker.ts +71 -71
  108. package/node_modules/@vitos-pizza/subagents/src/async/spawn-async.ts +220 -220
  109. package/node_modules/@vitos-pizza/subagents/src/async/storage.ts +57 -57
  110. package/node_modules/@vitos-pizza/subagents/src/env.ts +4 -4
  111. package/node_modules/@vitos-pizza/subagents/src/execute-subagent.ts +285 -285
  112. package/node_modules/@vitos-pizza/subagents/src/progress.ts +187 -187
  113. package/node_modules/@vitos-pizza/subagents/src/render-animation.ts +40 -40
  114. package/node_modules/@vitos-pizza/subagents/src/render.ts +428 -428
  115. package/node_modules/@vitos-pizza/subagents/src/rpc/channels.ts +21 -21
  116. package/node_modules/@vitos-pizza/subagents/src/rpc/client.ts +144 -144
  117. package/node_modules/@vitos-pizza/subagents/src/rpc/server.ts +11 -11
  118. package/node_modules/@vitos-pizza/subagents/src/run-agent.ts +313 -313
  119. package/node_modules/@vitos-pizza/subagents/src/runtime.ts +102 -102
  120. package/node_modules/@vitos-pizza/subagents/src/schema.ts +62 -62
  121. package/node_modules/@vitos-pizza/subagents/src/spawn.ts +104 -104
  122. package/node_modules/@vitos-pizza/subagents/src/types.ts +92 -92
  123. package/node_modules/@vitos-pizza/subagents/src/utils.ts +100 -100
  124. package/node_modules/@vitos-pizza/subagents/src/wait.ts +159 -159
  125. package/node_modules/@vitos-pizza/subagents/tests/agents.test.ts +19 -19
  126. package/node_modules/@vitos-pizza/subagents/tests/execute-subagent.test.ts +96 -96
  127. package/node_modules/@vitos-pizza/subagents/tests/extension.test.ts +42 -42
  128. package/node_modules/@vitos-pizza/subagents/tests/progress.test.ts +206 -206
  129. package/node_modules/@vitos-pizza/subagents/tests/rpc.test.ts +74 -74
  130. package/node_modules/@vitos-pizza/subagents/tsconfig.json +13 -13
  131. package/node_modules/@vitos-pizza/subagents/vitest.config.ts +8 -8
  132. package/node_modules/@vitos-pizza/ui-enhancements/package.json +1 -1
  133. package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/agent-mode-badge.ts +60 -60
  134. package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/border-status.ts +14 -1
  135. package/node_modules/@vitos-pizza/ui-enhancements/src/chrome/resize-recovery.ts +63 -0
  136. package/node_modules/@vitos-pizza/ui-enhancements/tests/agent-mode-badge.test.ts +35 -35
  137. package/node_modules/@vitos-pizza/ui-enhancements/tests/resize-recovery.test.ts +135 -0
  138. package/node_modules/@vitos-pizza/websearch/package.json +1 -1
  139. package/node_modules/node-addon-api/tools/conversion.js +0 -0
  140. package/node_modules/node-gyp-build/bin.js +0 -0
  141. package/node_modules/node-gyp-build/build-test.js +0 -0
  142. package/node_modules/node-gyp-build/optional.js +0 -0
  143. package/package.json +11 -9
  144. package/packages/agent-mode/extensions/index.ts +138 -117
  145. package/packages/agent-mode/package.json +3 -3
  146. package/packages/agent-mode/src/apply-mode.ts +60 -60
  147. package/packages/agent-mode/src/mode-events.ts +102 -102
  148. package/packages/agent-mode/src/modes.ts +43 -43
  149. package/packages/agent-mode/src/plan-instructions.ts +85 -44
  150. package/packages/agent-mode/tsconfig.json +13 -13
  151. package/packages/agent-mode/vitest.config.ts +8 -8
  152. package/packages/keybindings/extensions/index.ts +104 -104
  153. package/packages/keybindings/package.json +1 -1
  154. package/packages/keybindings/presets/shortcuts.json +3 -3
  155. package/packages/keybindings/src/bind.ts +57 -57
  156. package/packages/keybindings/src/config.ts +84 -84
  157. package/packages/keybindings/src/registry.ts +43 -43
  158. package/packages/keybindings/src/types.ts +54 -54
  159. package/packages/keybindings/tsconfig.json +13 -13
  160. package/packages/keybindings/vitest.config.ts +8 -8
  161. package/packages/permission-system/extensions/index.ts +162 -162
  162. package/packages/permission-system/node_modules/web-tree-sitter/debug/tree-sitter.wasm +0 -0
  163. package/packages/permission-system/node_modules/web-tree-sitter/tree-sitter.wasm +0 -0
  164. package/packages/permission-system/package.json +2 -2
  165. package/packages/permission-system/src/bash/matcher.ts +54 -51
  166. package/packages/permission-system/src/bash/parser.ts +40 -40
  167. package/packages/permission-system/src/config-paths.ts +23 -23
  168. package/packages/permission-system/src/detect-preset-mode.ts +61 -61
  169. package/packages/permission-system/src/expand-home.ts +12 -12
  170. package/packages/permission-system/src/forwarding/forwarder.ts +224 -224
  171. package/packages/permission-system/src/forwarding/subagent-registry.ts +61 -61
  172. package/packages/permission-system/src/gates/path-utils.ts +66 -66
  173. package/packages/permission-system/src/gates/pipeline.ts +151 -155
  174. package/packages/permission-system/src/handlers/before-agent-start.ts +86 -65
  175. package/packages/permission-system/src/handlers/skill-input.ts +1 -1
  176. package/packages/permission-system/src/handlers/tool-call-gate.ts +204 -199
  177. package/packages/permission-system/src/mode-api.ts +44 -44
  178. package/packages/permission-system/src/permission-evaluator.ts +233 -216
  179. package/packages/permission-system/src/permission-session.ts +62 -62
  180. package/packages/permission-system/src/policy-loader.ts +211 -211
  181. package/packages/permission-system/src/sanitizers/skill-prompt.ts +99 -99
  182. package/packages/permission-system/src/sanitizers/system-prompt.ts +221 -221
  183. package/packages/permission-system/src/service.ts +66 -66
  184. package/packages/permission-system/src/session-approvals.ts +4 -1
  185. package/packages/permission-system/src/types.ts +80 -80
  186. package/packages/permission-system/src/ui/approval-summary.ts +43 -43
  187. package/packages/permission-system/src/ui/config-modal.ts +36 -36
  188. package/packages/permission-system/src/ui/permission-dialog.ts +52 -52
  189. package/packages/permission-system/src/wildcard-matcher.ts +81 -81
  190. package/packages/permission-system/src/yaml-frontmatter.ts +84 -84
  191. package/packages/permission-system/src/yolo/runtime-api.ts +49 -49
  192. package/packages/permission-system/tsconfig.json +13 -13
  193. package/packages/permission-system/vitest.config.ts +8 -8
  194. package/packages/question/package.json +1 -1
  195. package/packages/question/src/question-ui.ts +5 -1
  196. package/packages/question/src/register-tool.ts +1 -4
  197. package/packages/session-title/extensions/index.ts +137 -137
  198. package/packages/session-title/package.json +3 -3
  199. package/packages/session-title/src/build-title-prompt.ts +16 -16
  200. package/packages/session-title/src/extract-title-context.ts +55 -55
  201. package/packages/session-title/src/fast-rules.ts +48 -48
  202. package/packages/session-title/src/load-settings.ts +70 -70
  203. package/packages/session-title/src/normalize-title.ts +20 -20
  204. package/packages/session-title/src/parse-title-response.ts +6 -6
  205. package/packages/session-title/src/resolve-title-model.ts +33 -33
  206. package/packages/session-title/src/schedule-title-job.ts +53 -53
  207. package/packages/session-title/src/should-schedule.ts +30 -30
  208. package/packages/session-title/src/title-agent.ts +60 -60
  209. package/packages/session-title/src/truncate-input.ts +10 -10
  210. package/packages/session-title/src/types.ts +29 -29
  211. package/packages/session-title/tsconfig.json +13 -13
  212. package/packages/session-title/vitest.config.ts +8 -8
  213. package/packages/subagents/agents/planner.md +46 -43
  214. package/packages/subagents/agents/scout.md +40 -40
  215. package/packages/subagents/agents/title.md +13 -13
  216. package/packages/subagents/agents/worker.md +36 -36
  217. package/packages/subagents/extensions/index.ts +164 -164
  218. package/packages/subagents/package.json +1 -1
  219. package/packages/subagents/skills/subagents/SKILL.md +86 -80
  220. package/packages/subagents/src/agents.ts +166 -166
  221. package/packages/subagents/src/async/job-tracker.ts +71 -71
  222. package/packages/subagents/src/async/spawn-async.ts +220 -220
  223. package/packages/subagents/src/async/storage.ts +57 -57
  224. package/packages/subagents/src/env.ts +4 -4
  225. package/packages/subagents/src/execute-subagent.ts +285 -285
  226. package/packages/subagents/src/progress.ts +187 -187
  227. package/packages/subagents/src/render-animation.ts +40 -40
  228. package/packages/subagents/src/render.ts +428 -428
  229. package/packages/subagents/src/rpc/channels.ts +21 -21
  230. package/packages/subagents/src/rpc/client.ts +144 -144
  231. package/packages/subagents/src/rpc/server.ts +11 -11
  232. package/packages/subagents/src/run-agent.ts +313 -313
  233. package/packages/subagents/src/runtime.ts +102 -102
  234. package/packages/subagents/src/schema.ts +62 -62
  235. package/packages/subagents/src/spawn.ts +104 -104
  236. package/packages/subagents/src/types.ts +92 -92
  237. package/packages/subagents/src/utils.ts +100 -100
  238. package/packages/subagents/src/wait.ts +159 -159
  239. package/packages/subagents/tsconfig.json +13 -13
  240. package/packages/subagents/vitest.config.ts +8 -8
  241. package/packages/todoist/extensions/index.ts +163 -0
  242. package/packages/todoist/package.json +34 -0
  243. package/packages/todoist/src/events.ts +7 -0
  244. package/packages/todoist/src/silent-render.ts +8 -0
  245. package/packages/todoist/src/state.ts +147 -0
  246. package/packages/todoist/src/tools.ts +175 -0
  247. package/packages/todoist/src/types.ts +34 -0
  248. package/packages/todoist/src/widget.ts +109 -0
  249. package/packages/todoist/tsconfig.json +13 -0
  250. package/packages/todoist/vitest.config.ts +8 -0
  251. package/packages/ui-enhancements/package.json +1 -1
  252. package/packages/ui-enhancements/src/chrome/agent-mode-badge.ts +60 -60
  253. package/packages/ui-enhancements/src/chrome/border-status.ts +14 -1
  254. package/packages/ui-enhancements/src/chrome/resize-recovery.ts +63 -0
  255. package/packages/websearch/package.json +1 -1
  256. package/scripts/sync-pi-manifest.mjs +1 -1
  257. package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.cjs +0 -2988
  258. package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.wasm +0 -0
  259. package/packages/permission-system/node_modules/web-tree-sitter/lib/tree-sitter.wasm.map +0 -1
@@ -1,164 +1,164 @@
1
- /**
2
- * @vitos-pizza/subagents — subprocess subagent delegation for Vito's Pizzeria.
3
- */
4
-
5
- import type {
6
- ExtensionAPI,
7
- ExtensionContext,
8
- } from "@earendil-works/pi-coding-agent";
9
- import { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from "../src/env.ts";
10
- import { createSubagentRuntime } from "../src/runtime.ts";
11
- import type { SubagentRuntime } from "../src/runtime.ts";
12
- import { SUBAGENTS_READY } from "../src/rpc/channels.ts";
13
- import { startSubagentRpcServer } from "../src/rpc/client.ts";
14
- import {
15
- clearSubagentResultAnimation,
16
- ensureSubagentResultAnimation,
17
- } from "../src/render-animation.ts";
18
- import {
19
- renderSubagentCall,
20
- renderSubagentResult,
21
- subagentResultIsRunning,
22
- renderWaitCall,
23
- renderWaitResult,
24
- } from "../src/render.ts";
25
- import { SubagentParams, WaitParams } from "../src/schema.ts";
26
- import type { ExecuteSubagentInput, WaitInput } from "../src/types.ts";
27
-
28
- export interface SubagentsTestHarness {
29
- handlers: {
30
- session_start?: (event: unknown, ctx: ExtensionContext) => void;
31
- session_shutdown?: (event: unknown, ctx: ExtensionContext) => void;
32
- };
33
- runtime?: SubagentRuntime;
34
- }
35
-
36
- export function registerSubagents(
37
- pi: ExtensionAPI,
38
- ): SubagentsTestHarness {
39
- const handlers: SubagentsTestHarness["handlers"] = {};
40
- let currentCtx: ExtensionContext | null = null;
41
- let rpcDispose: (() => void) | null = null;
42
-
43
- const runtime = createSubagentRuntime({
44
- getContext: () => currentCtx,
45
- events: pi.events,
46
- }) as SubagentRuntime & { _restore(sessionFile: string | null): void };
47
-
48
- pi.registerTool({
49
- name: "subagent",
50
- label: "Subagent",
51
- description:
52
- "Delegate tasks to specialized subagents. Modes: single (agent+task), parallel (tasks[]), chain (chain[] with {previous}). Use async:true for background runs.",
53
- parameters: SubagentParams,
54
- async execute(_toolCallId, params, signal, onUpdate, ctx) {
55
- currentCtx = ctx;
56
- return runtime.execute(params as ExecuteSubagentInput, {
57
- signal,
58
- onUpdate: onUpdate
59
- ? (partial) => onUpdate(partial)
60
- : undefined,
61
- });
62
- },
63
- renderCall(args, theme) {
64
- return renderSubagentCall(args as Record<string, unknown>, theme);
65
- },
66
- renderResult(result, options, theme, context) {
67
- if (subagentResultIsRunning(
68
- result as {
69
- content: Array<{ type: string; text?: string }>;
70
- details?: import("../src/types.ts").SubagentDetails;
71
- },
72
- options,
73
- )) {
74
- ensureSubagentResultAnimation(context);
75
- } else {
76
- clearSubagentResultAnimation(context);
77
- }
78
- return renderSubagentResult(
79
- result as {
80
- content: Array<{ type: string; text?: string }>;
81
- details?: import("../src/types.ts").SubagentDetails;
82
- },
83
- options,
84
- theme,
85
- context,
86
- );
87
- },
88
- });
89
-
90
- pi.registerTool({
91
- name: "wait",
92
- label: "Wait",
93
- description:
94
- "Block until background subagent runs finish. Default returns when the first run completes; use all:true to wait for every active run.",
95
- parameters: WaitParams,
96
- async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
97
- currentCtx = ctx;
98
- const outcome = await runtime.wait(params as WaitInput);
99
- const summaries = outcome.completed.map((run) => {
100
- const status = run.state;
101
- const output = run.finalOutput ?? "(no output)";
102
- return `- ${run.id} [${run.agents.join(", ")}] ${status}: ${output}`;
103
- });
104
- const header = outcome.timedOut
105
- ? `Wait timed out (${outcome.activeRemaining} still active).`
106
- : `Wait complete (${outcome.completed.length} run(s)).`;
107
- return {
108
- content: [
109
- {
110
- type: "text",
111
- text: `${header}\n${summaries.join("\n") || "(none)"}`,
112
- },
113
- ],
114
- details: outcome,
115
- };
116
- },
117
- renderCall(args, theme) {
118
- return renderWaitCall(args as Record<string, unknown>, theme);
119
- },
120
- renderResult(result, _options, theme) {
121
- return renderWaitResult(
122
- result as { content: Array<{ type: string; text?: string }> },
123
- theme,
124
- );
125
- },
126
- });
127
-
128
- handlers.session_start = (_event, ctx) => {
129
- currentCtx = ctx;
130
- if (!process.env[SUBAGENT_CHILD_ENV]) {
131
- const sessionId = ctx.sessionManager.getSessionId?.();
132
- if (sessionId) {
133
- process.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;
134
- }
135
- }
136
- const sessionFile = ctx.sessionManager.getSessionFile?.() ?? null;
137
- (runtime as SubagentRuntime & { _restore(sessionFile: string | null): void })._restore(
138
- sessionFile,
139
- );
140
- rpcDispose?.();
141
- rpcDispose = startSubagentRpcServer(pi.events, runtime);
142
- pi.events.emit(SUBAGENTS_READY, { version: 1 });
143
- };
144
-
145
- pi.on("session_start", handlers.session_start);
146
-
147
- handlers.session_shutdown = () => {
148
- delete process.env[SUBAGENT_PARENT_SESSION_ENV];
149
- rpcDispose?.();
150
- rpcDispose = null;
151
- currentCtx = null;
152
- };
153
-
154
- pi.on("session_shutdown", handlers.session_shutdown);
155
-
156
- return { handlers, runtime };
157
- }
158
-
159
- export default function subagentsExtension(pi: ExtensionAPI) {
160
- if (process.env[SUBAGENT_CHILD_ENV] === "1") {
161
- return;
162
- }
163
- registerSubagents(pi);
164
- }
1
+ /**
2
+ * @vitos-pizza/subagents — subprocess subagent delegation for Vito's Pizzeria.
3
+ */
4
+
5
+ import type {
6
+ ExtensionAPI,
7
+ ExtensionContext,
8
+ } from "@earendil-works/pi-coding-agent";
9
+ import { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV } from "../src/env.ts";
10
+ import { createSubagentRuntime } from "../src/runtime.ts";
11
+ import type { SubagentRuntime } from "../src/runtime.ts";
12
+ import { SUBAGENTS_READY } from "../src/rpc/channels.ts";
13
+ import { startSubagentRpcServer } from "../src/rpc/client.ts";
14
+ import {
15
+ clearSubagentResultAnimation,
16
+ ensureSubagentResultAnimation,
17
+ } from "../src/render-animation.ts";
18
+ import {
19
+ renderSubagentCall,
20
+ renderSubagentResult,
21
+ subagentResultIsRunning,
22
+ renderWaitCall,
23
+ renderWaitResult,
24
+ } from "../src/render.ts";
25
+ import { SubagentParams, WaitParams } from "../src/schema.ts";
26
+ import type { ExecuteSubagentInput, WaitInput } from "../src/types.ts";
27
+
28
+ export interface SubagentsTestHarness {
29
+ handlers: {
30
+ session_start?: (event: unknown, ctx: ExtensionContext) => void;
31
+ session_shutdown?: (event: unknown, ctx: ExtensionContext) => void;
32
+ };
33
+ runtime?: SubagentRuntime;
34
+ }
35
+
36
+ export function registerSubagents(
37
+ pi: ExtensionAPI,
38
+ ): SubagentsTestHarness {
39
+ const handlers: SubagentsTestHarness["handlers"] = {};
40
+ let currentCtx: ExtensionContext | null = null;
41
+ let rpcDispose: (() => void) | null = null;
42
+
43
+ const runtime = createSubagentRuntime({
44
+ getContext: () => currentCtx,
45
+ events: pi.events,
46
+ }) as SubagentRuntime & { _restore(sessionFile: string | null): void };
47
+
48
+ pi.registerTool({
49
+ name: "subagent",
50
+ label: "Subagent",
51
+ description:
52
+ "Delegate tasks to specialized subagents. Modes: single (agent+task), parallel (tasks[]), chain (chain[] with {previous}). Use async:true for background runs.",
53
+ parameters: SubagentParams,
54
+ async execute(_toolCallId, params, signal, onUpdate, ctx) {
55
+ currentCtx = ctx;
56
+ return runtime.execute(params as ExecuteSubagentInput, {
57
+ signal,
58
+ onUpdate: onUpdate
59
+ ? (partial) => onUpdate(partial)
60
+ : undefined,
61
+ });
62
+ },
63
+ renderCall(args, theme) {
64
+ return renderSubagentCall(args as Record<string, unknown>, theme);
65
+ },
66
+ renderResult(result, options, theme, context) {
67
+ if (subagentResultIsRunning(
68
+ result as {
69
+ content: Array<{ type: string; text?: string }>;
70
+ details?: import("../src/types.ts").SubagentDetails;
71
+ },
72
+ options,
73
+ )) {
74
+ ensureSubagentResultAnimation(context);
75
+ } else {
76
+ clearSubagentResultAnimation(context);
77
+ }
78
+ return renderSubagentResult(
79
+ result as {
80
+ content: Array<{ type: string; text?: string }>;
81
+ details?: import("../src/types.ts").SubagentDetails;
82
+ },
83
+ options,
84
+ theme,
85
+ context,
86
+ );
87
+ },
88
+ });
89
+
90
+ pi.registerTool({
91
+ name: "wait",
92
+ label: "Wait",
93
+ description:
94
+ "Block until background subagent runs finish. Default returns when the first run completes; use all:true to wait for every active run.",
95
+ parameters: WaitParams,
96
+ async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
97
+ currentCtx = ctx;
98
+ const outcome = await runtime.wait(params as WaitInput);
99
+ const summaries = outcome.completed.map((run) => {
100
+ const status = run.state;
101
+ const output = run.finalOutput ?? "(no output)";
102
+ return `- ${run.id} [${run.agents.join(", ")}] ${status}: ${output}`;
103
+ });
104
+ const header = outcome.timedOut
105
+ ? `Wait timed out (${outcome.activeRemaining} still active).`
106
+ : `Wait complete (${outcome.completed.length} run(s)).`;
107
+ return {
108
+ content: [
109
+ {
110
+ type: "text",
111
+ text: `${header}\n${summaries.join("\n") || "(none)"}`,
112
+ },
113
+ ],
114
+ details: outcome,
115
+ };
116
+ },
117
+ renderCall(args, theme) {
118
+ return renderWaitCall(args as Record<string, unknown>, theme);
119
+ },
120
+ renderResult(result, _options, theme) {
121
+ return renderWaitResult(
122
+ result as { content: Array<{ type: string; text?: string }> },
123
+ theme,
124
+ );
125
+ },
126
+ });
127
+
128
+ handlers.session_start = (_event, ctx) => {
129
+ currentCtx = ctx;
130
+ if (!process.env[SUBAGENT_CHILD_ENV]) {
131
+ const sessionId = ctx.sessionManager.getSessionId?.();
132
+ if (sessionId) {
133
+ process.env[SUBAGENT_PARENT_SESSION_ENV] = sessionId;
134
+ }
135
+ }
136
+ const sessionFile = ctx.sessionManager.getSessionFile?.() ?? null;
137
+ (runtime as SubagentRuntime & { _restore(sessionFile: string | null): void })._restore(
138
+ sessionFile,
139
+ );
140
+ rpcDispose?.();
141
+ rpcDispose = startSubagentRpcServer(pi.events, runtime);
142
+ pi.events.emit(SUBAGENTS_READY, { version: 1 });
143
+ };
144
+
145
+ pi.on("session_start", handlers.session_start);
146
+
147
+ handlers.session_shutdown = () => {
148
+ delete process.env[SUBAGENT_PARENT_SESSION_ENV];
149
+ rpcDispose?.();
150
+ rpcDispose = null;
151
+ currentCtx = null;
152
+ };
153
+
154
+ pi.on("session_shutdown", handlers.session_shutdown);
155
+
156
+ return { handlers, runtime };
157
+ }
158
+
159
+ export default function subagentsExtension(pi: ExtensionAPI) {
160
+ if (process.env[SUBAGENT_CHILD_ENV] === "1") {
161
+ return;
162
+ }
163
+ registerSubagents(pi);
164
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vitos-pizza/subagents",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Subagent delegation for Vito's Pizzeria Pi distribution",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,80 +1,86 @@
1
- ---
2
- name: subagents
3
- description: Delegate exploration, planning, and implementation to Vito's Pizzeria subagents (scout, planner, worker).
4
- ---
5
-
6
- # Subagents (Vito's Pizzeria)
7
-
8
- Use the `subagent` tool to delegate work to focused child agents with isolated context.
9
-
10
- ## Agent modes
11
-
12
- Vito's Pizzeria uses three modes via `/mode` or `F6`:
13
-
14
- | Mode | When to use |
15
- |------|-------------|
16
- | **agent** | Default balanced work |
17
- | **plan** | Read-only explorationscout planner, `question` for clarification |
18
- | **execute** | Full implementation after plan is approved |
19
-
20
- In **plan** mode the main agent cannot write/edit/bash. Delegate with subagents:
21
-
22
- ```
23
- scout → planner → (user confirms) → switch to execute → worker
24
- ```
25
-
26
- ## Built-in agents
27
-
28
- | Agent | Use when |
29
- |-------|----------|
30
- | `scout` | Fast codebase recon; returns compressed context |
31
- | `planner` | Turn context + requirements into an implementation plan |
32
- | `worker` | Execute an approved plan with narrow, correct edits |
33
- | `title` | Generate short session titles (used by `@vitos-pizza/session-title`) |
34
-
35
- ## Typical workflow
36
-
37
- ```
38
- scout → planner → worker
39
- ```
40
-
41
- ### Chain (one tool call)
42
-
43
- ```json
44
- {
45
- "chain": [
46
- { "agent": "scout", "task": "Map the auth module and key entry points" },
47
- { "agent": "planner", "task": "Create a plan based on {previous}" },
48
- { "agent": "worker", "task": "Implement the plan from {previous}" }
49
- ]
50
- }
51
- ```
52
-
53
- ### Parallel
54
-
55
- ```json
56
- {
57
- "tasks": [
58
- { "agent": "scout", "task": "Scan packages/subagents" },
59
- { "agent": "scout", "task": "Scan packages/permission-system" }
60
- ]
61
- }
62
- ```
63
-
64
- ### Async + wait
65
-
66
- Start work in the background, then block until it finishes:
67
-
68
- ```json
69
- { "agent": "worker", "task": "...", "async": true }
70
- ```
71
-
72
- ```json
73
- { "id": "<runId>" }
74
- ```
75
-
76
- via the `wait` tool.
77
-
78
- ## External modules
79
-
80
- Other Vito's Pizzeria extensions can request subagent runs via `pi.events` RPC (`subagents:rpc:run`). Import helpers from `@vitos-pizza/subagents/rpc/client` if needed.
1
+ ---
2
+ name: subagents
3
+ description: Delegate exploration, planning, and implementation to Vito's Pizzeria subagents (scout, planner, worker).
4
+ ---
5
+
6
+ # Subagents (Vito's Pizzeria)
7
+
8
+ Use the `subagent` tool to delegate work to focused child agents with isolated context.
9
+
10
+ ## Agent modes
11
+
12
+ Vito's Pizzeria uses three modes via `/mode` or `F6`:
13
+
14
+ | Mode | When to use |
15
+ |------|-------------|
16
+ | **agent** | Default balanced work |
17
+ | **plan** | Read-only planningplanner (+ optional scout), `question` for clarification; optional short **Next** footer |
18
+ | **execute** | Full implementation after plan is approved |
19
+
20
+ In **plan** mode the main agent cannot write/edit/bash. Delegate with subagents. Scout is optional — use it only when codebase recon is needed; otherwise call planner directly. When recon spans independent areas, run multiple scouts in parallel (`tasks: [...]`) then planner:
21
+
22
+ ```
23
+ [optional scout(s)] planner → (user confirms) → switch to execute → worker
24
+ ```
25
+
26
+ ## Built-in agents
27
+
28
+ | Agent | Use when |
29
+ |-------|----------|
30
+ | `scout` | Fast codebase recon; returns compressed context |
31
+ | `planner` | Turn context + requirements into an implementation plan |
32
+ | `worker` | Execute an approved plan with narrow, correct edits |
33
+ | `title` | Generate short session titles (used by `@vitos-pizza/session-title`) |
34
+
35
+ ## Typical workflow
36
+
37
+ ```
38
+ [optional scout →] planner → worker
39
+ ```
40
+
41
+ ### Planner only (enough context)
42
+
43
+ ```json
44
+ { "agent": "planner", "task": "Create an implementation plan for ..." }
45
+ ```
46
+
47
+ ### Chain with scout (when recon is needed)
48
+
49
+ ```json
50
+ {
51
+ "chain": [
52
+ { "agent": "scout", "task": "Map the auth module and key entry points" },
53
+ { "agent": "planner", "task": "Create a plan based on {previous}" },
54
+ { "agent": "worker", "task": "Implement the plan from {previous}" }
55
+ ]
56
+ }
57
+ ```
58
+
59
+ ### Parallel
60
+
61
+ ```json
62
+ {
63
+ "tasks": [
64
+ { "agent": "scout", "task": "Scan packages/subagents" },
65
+ { "agent": "scout", "task": "Scan packages/permission-system" }
66
+ ]
67
+ }
68
+ ```
69
+
70
+ ### Async + wait
71
+
72
+ Start work in the background, then block until it finishes:
73
+
74
+ ```json
75
+ { "agent": "worker", "task": "...", "async": true }
76
+ ```
77
+
78
+ ```json
79
+ { "id": "<runId>" }
80
+ ```
81
+
82
+ via the `wait` tool.
83
+
84
+ ## External modules
85
+
86
+ Other Vito's Pizzeria extensions can request subagent runs via `pi.events` RPC (`subagents:rpc:run`). Import helpers from `@vitos-pizza/subagents/rpc/client` if needed.