@fitchmultz/pi-subagents 0.44.7 → 0.45.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 (947) hide show
  1. package/CHANGELOG.md +258 -7
  2. package/LICENSE +1 -0
  3. package/README.md +58 -1483
  4. package/agents/context-builder.md +19 -1
  5. package/agents/debugger.md +10 -3
  6. package/agents/delegate.md +1 -0
  7. package/agents/fixer.md +4 -1
  8. package/agents/oracle.md +13 -2
  9. package/agents/planner.md +14 -3
  10. package/agents/researcher.md +11 -2
  11. package/agents/reviewer-claude.md +11 -2
  12. package/agents/reviewer-gpt.md +12 -2
  13. package/agents/reviewer-ponytail.md +11 -1
  14. package/agents/reviewer-security.md +13 -2
  15. package/agents/reviewer.md +12 -3
  16. package/agents/scout.md +12 -1
  17. package/agents/ui-designer.md +10 -3
  18. package/agents/watcher.md +1 -0
  19. package/agents/worker.md +8 -2
  20. package/agents/writer.md +6 -3
  21. package/dist/agents/agent-defaults.js +9 -0
  22. package/dist/agents/agent-definition.js +196 -0
  23. package/dist/agents/agent-management.js +64 -905
  24. package/dist/agents/agent-scope.js +4 -2
  25. package/dist/agents/agent-selection.js +10 -5
  26. package/dist/agents/agent-serializer.js +55 -67
  27. package/dist/agents/agents.js +75 -716
  28. package/dist/agents/builtin-overrides.js +218 -0
  29. package/dist/agents/chain-serializer.js +3 -367
  30. package/dist/agents/config-values.js +52 -0
  31. package/dist/agents/discovery-paths.js +91 -0
  32. package/dist/agents/frontmatter.js +15 -5
  33. package/dist/agents/identity.js +25 -8
  34. package/dist/agents/json-chain.js +254 -0
  35. package/dist/agents/management-config.js +332 -0
  36. package/dist/agents/management-format.js +231 -0
  37. package/dist/agents/management-persistence.js +287 -0
  38. package/dist/agents/management-targets.js +136 -0
  39. package/dist/agents/management-warnings.js +81 -0
  40. package/dist/agents/markdown-chain.js +210 -0
  41. package/dist/agents/package-agents.js +154 -0
  42. package/dist/agents/skill-files.js +157 -0
  43. package/dist/agents/skill-search-paths.js +246 -0
  44. package/dist/agents/skill-types.js +1 -0
  45. package/dist/agents/skills.js +54 -499
  46. package/dist/extension/acceptance-schema.js +55 -0
  47. package/dist/extension/build-info.js +1 -1
  48. package/dist/extension/chain-schema.js +196 -0
  49. package/dist/extension/child-runtime.js +237 -0
  50. package/dist/extension/compact-tools.js +122 -51
  51. package/dist/extension/config-schema.js +29 -0
  52. package/dist/extension/config.js +27 -11
  53. package/dist/extension/control-notice-schema.js +37 -0
  54. package/dist/extension/control-notices.js +13 -6
  55. package/dist/extension/delegation-bridges.js +43 -0
  56. package/dist/extension/doctor.js +48 -25
  57. package/dist/extension/everyday-schemas.js +207 -0
  58. package/dist/extension/fanout-child.js +18 -319
  59. package/dist/extension/index.js +8 -563
  60. package/dist/extension/message-renderers.js +225 -0
  61. package/dist/extension/nested-control-inbox.js +154 -0
  62. package/dist/extension/parent-runtime.js +339 -0
  63. package/dist/extension/primary-tool.js +69 -0
  64. package/dist/extension/result-snapshot.js +22 -0
  65. package/dist/extension/runtime-reload.js +62 -0
  66. package/dist/extension/runtime-storage.js +43 -0
  67. package/dist/extension/schema-overrides.js +75 -0
  68. package/dist/extension/schemas.js +265 -336
  69. package/dist/extension/tool-input.js +27 -12
  70. package/dist/extension/tool-result.js +19 -4
  71. package/dist/history/answer-texts.js +57 -0
  72. package/dist/history/canonical-result.js +76 -43
  73. package/dist/history/canonical-selection.js +40 -0
  74. package/dist/history/database-generation.js +82 -0
  75. package/dist/history/database.js +57 -33
  76. package/dist/history/entry-ingestion.js +61 -0
  77. package/dist/history/index.js +242 -97
  78. package/dist/history/ingest.js +168 -331
  79. package/dist/history/output-digests.js +40 -0
  80. package/dist/history/preview.js +210 -0
  81. package/dist/history/prune.js +33 -0
  82. package/dist/history/queries.js +60 -349
  83. package/dist/history/query-scope.js +190 -0
  84. package/dist/history/rows.js +77 -0
  85. package/dist/history/run-projection.js +137 -0
  86. package/dist/history/run-queries.js +153 -0
  87. package/dist/history/schema.js +31 -0
  88. package/dist/history/search-queries.js +163 -0
  89. package/dist/history/selected-record.js +108 -0
  90. package/dist/history/source-file.js +45 -0
  91. package/dist/history/source-watches.js +141 -0
  92. package/dist/history/store.js +164 -153
  93. package/dist/history/text-chunks.js +169 -0
  94. package/dist/history/text.js +35 -0
  95. package/dist/history/transcript-queries.js +177 -0
  96. package/dist/history/types.js +5 -1
  97. package/dist/history/values.js +36 -0
  98. package/dist/history/wire-inputs.js +122 -0
  99. package/dist/history/wire-models.js +38 -0
  100. package/dist/history/worker-runtime.js +441 -0
  101. package/dist/history/worker.js +66 -462
  102. package/dist/intercom/intercom-bridge.js +48 -20
  103. package/dist/intercom/live-intercom.js +80 -23
  104. package/dist/intercom/nested-result-tree.js +163 -0
  105. package/dist/intercom/result-delivery.js +40 -0
  106. package/dist/intercom/result-intercom.js +178 -261
  107. package/dist/pi-intercom/agent-dir.js +7 -3
  108. package/dist/pi-intercom/async.js +27 -0
  109. package/dist/pi-intercom/bridge-ask.js +57 -0
  110. package/dist/pi-intercom/bridge-config.js +79 -0
  111. package/dist/pi-intercom/bridge-http.js +86 -0
  112. package/dist/pi-intercom/bridge-protocol.js +106 -0
  113. package/dist/pi-intercom/bridge-routes.js +64 -0
  114. package/dist/pi-intercom/bridge-session.js +416 -0
  115. package/dist/pi-intercom/bridge.js +182 -603
  116. package/dist/pi-intercom/broker/broker.js +236 -244
  117. package/dist/pi-intercom/broker/client.js +189 -304
  118. package/dist/pi-intercom/broker/connection.js +165 -0
  119. package/dist/pi-intercom/broker/framing.js +5 -3
  120. package/dist/pi-intercom/broker/paths.js +4 -1
  121. package/dist/pi-intercom/broker/pid.js +53 -25
  122. package/dist/pi-intercom/broker/snapshot-reader.js +78 -0
  123. package/dist/pi-intercom/broker/snapshots.js +188 -0
  124. package/dist/pi-intercom/broker/spawn.js +36 -25
  125. package/dist/pi-intercom/config.js +85 -71
  126. package/dist/pi-intercom/connection.js +297 -0
  127. package/dist/pi-intercom/identity.js +58 -0
  128. package/dist/pi-intercom/inbound-delivery.js +356 -0
  129. package/dist/pi-intercom/inbound-journal.js +303 -0
  130. package/dist/pi-intercom/inbound-record.js +113 -0
  131. package/dist/pi-intercom/inbound.js +179 -0
  132. package/dist/pi-intercom/index.js +79 -2933
  133. package/dist/pi-intercom/inspection.js +62 -0
  134. package/dist/pi-intercom/interview.js +236 -0
  135. package/dist/pi-intercom/lifecycle.js +168 -0
  136. package/dist/pi-intercom/message-format.js +69 -0
  137. package/dist/pi-intercom/outbound.js +304 -0
  138. package/dist/pi-intercom/peer-awareness.js +66 -0
  139. package/dist/pi-intercom/reply-tracker.js +62 -43
  140. package/dist/pi-intercom/reply-wait.js +201 -0
  141. package/dist/pi-intercom/runtime-types.js +3 -0
  142. package/dist/pi-intercom/session-events.js +180 -0
  143. package/dist/pi-intercom/session-targets.js +42 -34
  144. package/dist/pi-intercom/subagent-events.js +238 -0
  145. package/dist/pi-intercom/subagent-live-events.js +129 -86
  146. package/dist/pi-intercom/supervisor.js +282 -0
  147. package/dist/pi-intercom/tool-arguments.js +74 -0
  148. package/dist/pi-intercom/tool-registration.js +95 -0
  149. package/dist/pi-intercom/tool-results.js +38 -0
  150. package/dist/pi-intercom/tool-schemas.js +82 -0
  151. package/dist/pi-intercom/tools.js +51 -0
  152. package/dist/pi-intercom/topic-actions.js +177 -0
  153. package/dist/pi-intercom/topics.js +177 -92
  154. package/dist/pi-intercom/transport.js +1 -0
  155. package/dist/pi-intercom/types.js +151 -114
  156. package/dist/pi-intercom/ui/compose-paste.js +93 -0
  157. package/dist/pi-intercom/ui/compose.js +121 -143
  158. package/dist/pi-intercom/ui/inline-message.js +59 -59
  159. package/dist/pi-intercom/ui/message-renderers.js +147 -0
  160. package/dist/pi-intercom/ui/overlay.js +181 -0
  161. package/dist/pi-intercom/ui/session-format.js +124 -0
  162. package/dist/pi-intercom/ui/session-list.js +76 -43
  163. package/dist/pi-intercom/ui/tool-renderers.js +110 -0
  164. package/dist/pi-intercom/ui/topic-view.js +88 -0
  165. package/dist/pi-intercom/validation.js +59 -0
  166. package/dist/runs/background/async-chain-plan.js +265 -0
  167. package/dist/runs/background/async-control.js +134 -58
  168. package/dist/runs/background/async-execution.js +136 -633
  169. package/dist/runs/background/async-job-admission.js +40 -0
  170. package/dist/runs/background/async-job-projection.js +169 -0
  171. package/dist/runs/background/async-job-tracker.js +297 -327
  172. package/dist/runs/background/async-launch.js +216 -0
  173. package/dist/runs/background/async-plan.js +116 -0
  174. package/dist/runs/background/async-result-file.js +47 -23
  175. package/dist/runs/background/async-resume.js +195 -253
  176. package/dist/runs/background/async-run-discovery.js +213 -0
  177. package/dist/runs/background/async-run-location.js +135 -0
  178. package/dist/runs/background/async-run-record.js +1 -0
  179. package/dist/runs/background/async-run-repair.js +223 -0
  180. package/dist/runs/background/async-run-summary.js +1 -0
  181. package/dist/runs/background/async-single-plan.js +105 -0
  182. package/dist/runs/background/async-status-projection.js +155 -0
  183. package/dist/runs/background/async-status-render.js +117 -0
  184. package/dist/runs/background/async-status-validation.js +181 -0
  185. package/dist/runs/background/async-status.js +3 -442
  186. package/dist/runs/background/async-value.js +21 -0
  187. package/dist/runs/background/completion-dedupe.js +36 -12
  188. package/dist/runs/background/completion-delivery.js +211 -205
  189. package/dist/runs/background/completion-receipts.js +237 -0
  190. package/dist/runs/background/legacy-status-acceptance.js +34 -0
  191. package/dist/runs/background/notify.js +96 -48
  192. package/dist/runs/background/parallel-groups.js +36 -19
  193. package/dist/runs/background/result-payload.js +178 -0
  194. package/dist/runs/background/result-watcher.js +348 -339
  195. package/dist/runs/background/run-id-resolver.js +53 -33
  196. package/dist/runs/background/run-schemas.js +189 -0
  197. package/dist/runs/background/run-status-contracts.js +14 -0
  198. package/dist/runs/background/run-status-render.js +270 -0
  199. package/dist/runs/background/run-status.js +231 -339
  200. package/dist/runs/background/runner-attempt-output.js +155 -0
  201. package/dist/runs/background/runner-attempt.js +263 -0
  202. package/dist/runs/background/runner-child-executor.js +166 -0
  203. package/dist/runs/background/runner-child-observer.js +192 -0
  204. package/dist/runs/background/runner-completion-summary.js +71 -0
  205. package/dist/runs/background/runner-completion.js +211 -0
  206. package/dist/runs/background/runner-config.js +1 -0
  207. package/dist/runs/background/runner-contract.js +1 -0
  208. package/dist/runs/background/runner-dynamic.js +121 -0
  209. package/dist/runs/background/runner-finalization.js +149 -0
  210. package/dist/runs/background/runner-graph.js +68 -0
  211. package/dist/runs/background/runner-initial-status.js +60 -0
  212. package/dist/runs/background/runner-lifecycle.js +142 -0
  213. package/dist/runs/background/runner-monitor.js +309 -0
  214. package/dist/runs/background/runner-parallel.js +204 -0
  215. package/dist/runs/background/runner-prepare-step.js +86 -0
  216. package/dist/runs/background/runner-reporting.js +153 -0
  217. package/dist/runs/background/runner-status.js +148 -0
  218. package/dist/runs/background/runner-step-output.js +92 -0
  219. package/dist/runs/background/runner-step-record.js +45 -0
  220. package/dist/runs/background/runner-step.js +112 -0
  221. package/dist/runs/background/runner-streaming.js +173 -0
  222. package/dist/runs/background/runner-workflow.js +213 -0
  223. package/dist/runs/background/stale-run-reconciler.js +155 -292
  224. package/dist/runs/background/subagent-runner-launcher.js +33 -13
  225. package/dist/runs/background/subagent-runner.js +51 -1842
  226. package/dist/runs/background/top-level-async.js +2 -1
  227. package/dist/runs/foreground/chain-clarify.js +293 -1017
  228. package/dist/runs/foreground/clarification-draft.js +87 -0
  229. package/dist/runs/foreground/clarify-contracts.js +1 -0
  230. package/dist/runs/foreground/clarify-invocation.js +129 -38
  231. package/dist/runs/foreground/clarify-text-editor.js +210 -0
  232. package/dist/runs/foreground/clarify-view.js +167 -0
  233. package/dist/runs/foreground/execution-input.js +226 -353
  234. package/dist/runs/foreground/execution-routing.js +33 -0
  235. package/dist/runs/foreground/execution-timeout.js +81 -0
  236. package/dist/runs/foreground/foreground-control.js +222 -763
  237. package/dist/runs/foreground/foreground-memory.js +99 -0
  238. package/dist/runs/foreground/invocation-context.js +55 -0
  239. package/dist/runs/foreground/invocation-execution.js +331 -0
  240. package/dist/runs/foreground/invocation-expansion.js +48 -0
  241. package/dist/runs/foreground/management-actions.js +295 -0
  242. package/dist/runs/foreground/nested-control.js +179 -0
  243. package/dist/runs/foreground/question-continuation.js +78 -0
  244. package/dist/runs/foreground/question-control.js +155 -50
  245. package/dist/runs/foreground/resume-target.js +221 -0
  246. package/dist/runs/foreground/revival-launch-policy.js +58 -0
  247. package/dist/runs/foreground/run-async-path.js +190 -178
  248. package/dist/runs/foreground/run-interrupt.js +164 -0
  249. package/dist/runs/foreground/run-nudge.js +278 -0
  250. package/dist/runs/foreground/saved-revival.js +251 -0
  251. package/dist/runs/foreground/subagent-executor.js +135 -424
  252. package/dist/runs/foreground/subagent-params.js +67 -30
  253. package/dist/runs/foreground/wait-observation.js +104 -0
  254. package/dist/runs/foreground/wait-registration.js +17 -0
  255. package/dist/runs/foreground/wait-run.js +283 -123
  256. package/dist/runs/shared/acceptance-contract.js +193 -99
  257. package/dist/runs/shared/acceptance-defaults.js +1 -0
  258. package/dist/runs/shared/acceptance-evaluation.js +201 -181
  259. package/dist/runs/shared/acceptance-finalization.js +256 -180
  260. package/dist/runs/shared/acceptance-outcome.js +53 -0
  261. package/dist/runs/shared/acceptance-reports.js +137 -72
  262. package/dist/runs/shared/acceptance-submission.js +167 -0
  263. package/dist/runs/shared/acceptance-verification.js +100 -0
  264. package/dist/runs/shared/chain-outputs.js +80 -52
  265. package/dist/runs/shared/child-attempt-types.js +1 -0
  266. package/dist/runs/shared/child-attempt.js +314 -667
  267. package/dist/runs/shared/child-boundaries.js +173 -0
  268. package/dist/runs/shared/child-context-filter.js +44 -0
  269. package/dist/runs/shared/child-event-observer.js +390 -0
  270. package/dist/runs/shared/child-execution-cwd.js +73 -43
  271. package/dist/runs/shared/child-execution-outcome.js +72 -0
  272. package/dist/runs/shared/child-invocation.js +54 -0
  273. package/dist/runs/shared/child-message-validation.js +215 -0
  274. package/dist/runs/shared/child-native-accounting.js +106 -0
  275. package/dist/runs/shared/child-native-observation.js +69 -0
  276. package/dist/runs/shared/child-observation-spool.js +164 -0
  277. package/dist/runs/shared/child-observations.js +157 -76
  278. package/dist/runs/shared/child-presence.js +3 -0
  279. package/dist/runs/shared/child-route-env.js +119 -0
  280. package/dist/runs/shared/child-stream-observer.js +221 -0
  281. package/dist/runs/shared/child-stream-projection.js +137 -0
  282. package/dist/runs/shared/child-structured-tool.js +27 -0
  283. package/dist/runs/shared/claude-code.js +121 -158
  284. package/dist/runs/shared/claude-model.js +42 -0
  285. package/dist/runs/shared/claude-session.js +83 -0
  286. package/dist/runs/shared/claude-types.js +1 -0
  287. package/dist/runs/shared/completion-guard.js +18 -18
  288. package/dist/runs/shared/control-event-policy.js +8 -0
  289. package/dist/runs/shared/control-notification-owner.js +13 -0
  290. package/dist/runs/shared/dynamic-fanout.js +188 -173
  291. package/dist/runs/shared/dynamic-item.js +102 -0
  292. package/dist/runs/shared/history-index.js +62 -36
  293. package/dist/runs/shared/legacy-async-recovery.js +114 -0
  294. package/dist/runs/shared/legacy-output-recovery.js +148 -0
  295. package/dist/runs/shared/mcp-config-schema.js +36 -0
  296. package/dist/runs/shared/mcp-direct-tool-allowlist.js +147 -116
  297. package/dist/runs/shared/model-fallback.js +97 -38
  298. package/dist/runs/shared/mutating-tool-guard.js +128 -88
  299. package/dist/runs/shared/native-finalization-types.js +1 -0
  300. package/dist/runs/shared/native-finalization.js +155 -76
  301. package/dist/runs/shared/native-usage.js +238 -98
  302. package/dist/runs/shared/nested-control-records.js +128 -0
  303. package/dist/runs/shared/nested-events.js +8 -700
  304. package/dist/runs/shared/nested-path.js +32 -28
  305. package/dist/runs/shared/nested-projection.js +155 -0
  306. package/dist/runs/shared/nested-protocol.js +18 -0
  307. package/dist/runs/shared/nested-registry.js +191 -0
  308. package/dist/runs/shared/nested-render.js +106 -58
  309. package/dist/runs/shared/nested-route.js +220 -0
  310. package/dist/runs/shared/nested-validation.js +216 -0
  311. package/dist/runs/shared/owned-child-evidence.js +125 -0
  312. package/dist/runs/shared/owned-run-list.js +146 -0
  313. package/dist/runs/shared/owned-run-observation.js +267 -0
  314. package/dist/runs/shared/owned-run-progress.js +109 -0
  315. package/dist/runs/shared/owned-run-read-state.js +1 -0
  316. package/dist/runs/shared/owned-run-results.js +202 -0
  317. package/dist/runs/shared/owned-run-status.js +180 -0
  318. package/dist/runs/shared/owned-run-view.js +51 -0
  319. package/dist/runs/shared/owned-workflow-details.js +17 -0
  320. package/dist/runs/shared/owner-output.js +43 -0
  321. package/dist/runs/shared/parallel-utils.js +36 -28
  322. package/dist/runs/shared/parent-receipts.js +90 -32
  323. package/dist/runs/shared/parent-usage.js +169 -57
  324. package/dist/runs/shared/pi-args.js +108 -201
  325. package/dist/runs/shared/pi-launch-input.js +1 -0
  326. package/dist/runs/shared/pi-session-launch.js +86 -0
  327. package/dist/runs/shared/pi-spawn.js +35 -21
  328. package/dist/runs/shared/run-history-queries.js +126 -35
  329. package/dist/runs/shared/run-history.js +101 -35
  330. package/dist/runs/shared/run-metadata-paths.js +14 -0
  331. package/dist/runs/shared/run-metadata.js +158 -0
  332. package/dist/runs/shared/run-persistence.js +131 -0
  333. package/dist/runs/shared/run-records.js +9 -679
  334. package/dist/runs/shared/run-restoration.js +338 -0
  335. package/dist/runs/shared/run-state-owner.js +26 -0
  336. package/dist/runs/shared/session-cwd-preload.js +27 -18
  337. package/dist/runs/shared/single-output.js +148 -70
  338. package/dist/runs/shared/stable-value.js +15 -0
  339. package/dist/runs/shared/streaming-text.js +23 -12
  340. package/dist/runs/shared/structured-output.js +25 -13
  341. package/dist/runs/shared/subagent-control.js +167 -100
  342. package/dist/runs/shared/subagent-prompt-runtime.js +27 -130
  343. package/dist/runs/shared/subagent-tool-loop-guard.js +81 -52
  344. package/dist/runs/shared/supervisor-question-state.js +145 -0
  345. package/dist/runs/shared/supervisor-questions.js +185 -254
  346. package/dist/runs/shared/workflow-graph.js +259 -167
  347. package/dist/runs/shared/workflow-policy.js +120 -48
  348. package/dist/runs/shared/worktree-contract.js +1 -0
  349. package/dist/runs/shared/worktree-hook.js +138 -0
  350. package/dist/runs/shared/worktree-location.js +47 -0
  351. package/dist/runs/shared/worktree-preservation.js +8 -0
  352. package/dist/runs/shared/worktree-process.js +107 -0
  353. package/dist/runs/shared/worktree.js +183 -322
  354. package/dist/shared/agent-context-policy.js +34 -44
  355. package/dist/shared/agent-dir.js +14 -0
  356. package/dist/shared/artifacts.js +30 -12
  357. package/dist/shared/atomic-json.js +4 -1
  358. package/dist/shared/chain-files.js +72 -0
  359. package/dist/shared/concurrency.js +18 -0
  360. package/dist/shared/content-preview.js +115 -0
  361. package/dist/shared/cooperative.js +5 -2
  362. package/dist/shared/execution-cwd.js +13 -5
  363. package/dist/shared/file-coalescer.js +2 -1
  364. package/dist/shared/fork-context.js +10 -12
  365. package/dist/shared/formatters.js +45 -19
  366. package/dist/shared/journal-frames.js +164 -0
  367. package/dist/shared/journal-projections.js +121 -0
  368. package/dist/shared/journal-reader.js +6 -407
  369. package/dist/shared/json-projection.js +191 -0
  370. package/dist/shared/lazy-tools.js +19 -8
  371. package/dist/shared/message-output.js +116 -0
  372. package/dist/shared/model-info.js +31 -14
  373. package/dist/shared/native-import.js +20 -0
  374. package/dist/shared/native-journal.js +140 -0
  375. package/dist/shared/native-session.js +5 -2
  376. package/dist/shared/native-tui.js +7 -2
  377. package/dist/shared/native-typebox.js +15 -3
  378. package/dist/shared/output-page.js +63 -0
  379. package/dist/shared/post-exit-stdio-guard.js +128 -88
  380. package/dist/shared/prompt-sections.js +2 -0
  381. package/dist/shared/session-entries.js +70 -35
  382. package/dist/shared/session-identity.js +5 -3
  383. package/dist/shared/settings.js +62 -192
  384. package/dist/shared/status-format.js +97 -37
  385. package/dist/shared/task-file-policy.js +24 -0
  386. package/dist/shared/temp-root.js +44 -15
  387. package/dist/shared/types/acceptance.js +1 -0
  388. package/dist/shared/types/async.js +1 -0
  389. package/dist/shared/types/config.js +1 -0
  390. package/dist/shared/types/details.js +1 -0
  391. package/dist/shared/types/history.js +1 -0
  392. package/dist/shared/types/inputs.js +1 -0
  393. package/dist/shared/types/intercom.js +1 -0
  394. package/dist/shared/types/launch.js +1 -0
  395. package/dist/shared/types/messages.js +1 -0
  396. package/dist/shared/types/nested.js +1 -0
  397. package/dist/shared/types/owned-runs.js +1 -0
  398. package/dist/shared/types/progress.js +1 -0
  399. package/dist/shared/types/questions.js +1 -0
  400. package/dist/shared/types/results.js +1 -0
  401. package/dist/shared/types/state.js +1 -0
  402. package/dist/shared/types/usage.js +1 -0
  403. package/dist/shared/types/workflow.js +1 -0
  404. package/dist/shared/types.js +75 -30
  405. package/dist/shared/unknown.js +52 -0
  406. package/dist/shared/utils.js +54 -260
  407. package/dist/slash/command-discovery.js +82 -0
  408. package/dist/slash/command-input.js +190 -0
  409. package/dist/slash/prompt-template-bridge.js +94 -270
  410. package/dist/slash/prompt-template-contract.js +77 -0
  411. package/dist/slash/prompt-template-results.js +125 -0
  412. package/dist/slash/request-protocol.js +68 -0
  413. package/dist/slash/result-delivery.js +237 -0
  414. package/dist/slash/saved-chain.js +78 -0
  415. package/dist/slash/slash-bridge.js +123 -89
  416. package/dist/slash/slash-commands.js +101 -572
  417. package/dist/slash/slash-live-state.js +68 -47
  418. package/dist/tui/action-hints.js +50 -22
  419. package/dist/tui/activity-lines.js +32 -0
  420. package/dist/tui/agent-browser.js +290 -0
  421. package/dist/tui/agent-controls.js +289 -0
  422. package/dist/tui/agent-conversation.js +444 -0
  423. package/dist/tui/agent-dock.js +171 -0
  424. package/dist/tui/agent-history.js +50 -183
  425. package/dist/tui/agent-model.js +62 -0
  426. package/dist/tui/agent-picker.js +262 -0
  427. package/dist/tui/agent-view.js +232 -1564
  428. package/dist/tui/compact-results.js +193 -0
  429. package/dist/tui/conversation-details.js +190 -0
  430. package/dist/tui/conversation-frame.js +135 -0
  431. package/dist/tui/conversation-history.js +201 -0
  432. package/dist/tui/conversation-menu.js +78 -0
  433. package/dist/tui/conversation-notices.js +79 -0
  434. package/dist/tui/conversation-selection.js +58 -0
  435. package/dist/tui/conversation-viewport.js +129 -0
  436. package/dist/tui/direction-message.js +27 -0
  437. package/dist/tui/display.js +282 -0
  438. package/dist/tui/editor-viewport.js +18 -0
  439. package/dist/tui/expanded-content.js +87 -0
  440. package/dist/tui/expanded-multi.js +170 -0
  441. package/dist/tui/expanded-single.js +65 -0
  442. package/dist/tui/history-cards.js +216 -0
  443. package/dist/tui/history-display.js +238 -0
  444. package/dist/tui/history-json.js +16 -0
  445. package/dist/tui/history-metadata.js +152 -0
  446. package/dist/tui/history-record.js +251 -0
  447. package/dist/tui/history-text.js +34 -0
  448. package/dist/tui/indexed-history.js +116 -0
  449. package/dist/tui/nested-widget.js +120 -0
  450. package/dist/tui/picker-page.js +59 -0
  451. package/dist/tui/render.js +58 -1501
  452. package/dist/tui/result-facts.js +64 -0
  453. package/dist/tui/task-observation.js +59 -0
  454. package/dist/tui/task-store.js +366 -0
  455. package/dist/tui/text-values.js +16 -0
  456. package/dist/tui/view-connections.js +47 -0
  457. package/dist/tui/view-model.js +94 -0
  458. package/dist/tui/view-persistence.js +51 -0
  459. package/dist/tui/view-ports.js +1 -0
  460. package/dist/tui/view-session.js +37 -0
  461. package/dist/tui/widget-details.js +144 -0
  462. package/dist/tui/widget-status.js +245 -0
  463. package/dist/tui/widget.js +145 -0
  464. package/dist/tui/workflow-labels.js +223 -0
  465. package/dist/tui/workflow-outcomes.js +124 -0
  466. package/docs/code-quality.md +38 -0
  467. package/docs/development.md +99 -0
  468. package/docs/intercom-bridge.md +22 -17
  469. package/docs/intercom.md +132 -106
  470. package/docs/performance.md +19 -17
  471. package/docs/reference.md +1472 -0
  472. package/generated/RunValidators.d.ts +28 -0
  473. package/generated/RunValidators.js +2 -0
  474. package/package.json +27 -6
  475. package/prompts/parallel-cleanup.md +3 -0
  476. package/prompts/parallel-context-build.md +3 -0
  477. package/prompts/parallel-handoff-plan.md +6 -0
  478. package/prompts/parallel-research.md +4 -0
  479. package/prompts/parallel-review.md +2 -0
  480. package/prompts/review-loop.md +2 -0
  481. package/scripts/build.mjs +129 -85
  482. package/scripts/check-compat.mjs +48 -11
  483. package/scripts/compat-host.mjs +35 -7
  484. package/scripts/generate-run-schemas.mjs +210 -0
  485. package/scripts/intercom-bridge-credentials.mjs +155 -28
  486. package/scripts/intercom-remote.mjs +175 -50
  487. package/scripts/local-install-smoke.mjs +47 -37
  488. package/scripts/native-package-smoke.mjs +135 -25
  489. package/scripts/package-smoke.mjs +360 -140
  490. package/scripts/prepare.mjs +54 -34
  491. package/scripts/real-pi-processes.mjs +261 -0
  492. package/scripts/real-pi-smoke.mjs +432 -351
  493. package/scripts/run-tests.mjs +29 -15
  494. package/skills/pi-intercom/SKILL.md +11 -11
  495. package/skills/pi-intercom/references/peer-sessions.md +7 -2
  496. package/skills/pi-subagents/SKILL.md +1 -1
  497. package/skills/pi-subagents/references/full-orchestration-guide.md +254 -112
  498. package/src/agents/agent-defaults.ts +13 -0
  499. package/src/agents/agent-definition.ts +253 -0
  500. package/src/agents/agent-management.ts +111 -808
  501. package/src/agents/agent-scope.ts +7 -3
  502. package/src/agents/agent-selection.ts +26 -16
  503. package/src/agents/agent-serializer.ts +84 -93
  504. package/src/agents/agents.ts +199 -906
  505. package/src/agents/builtin-overrides.ts +297 -0
  506. package/src/agents/chain-serializer.ts +3 -329
  507. package/src/agents/config-values.ts +57 -0
  508. package/src/agents/discovery-paths.ts +134 -0
  509. package/src/agents/frontmatter.ts +35 -17
  510. package/src/agents/identity.ts +49 -18
  511. package/src/agents/json-chain.ts +305 -0
  512. package/src/agents/management-config.ts +342 -0
  513. package/src/agents/management-format.ts +243 -0
  514. package/src/agents/management-persistence.ts +408 -0
  515. package/src/agents/management-targets.ts +260 -0
  516. package/src/agents/management-warnings.ts +115 -0
  517. package/src/agents/markdown-chain.ts +237 -0
  518. package/src/agents/package-agents.ts +231 -0
  519. package/src/agents/skill-files.ts +182 -0
  520. package/src/agents/skill-search-paths.ts +289 -0
  521. package/src/agents/skill-types.ts +31 -0
  522. package/src/agents/skills.ts +152 -610
  523. package/src/extension/acceptance-schema.ts +88 -0
  524. package/src/extension/chain-schema.ts +276 -0
  525. package/src/extension/child-runtime.ts +302 -0
  526. package/src/extension/compact-tools.ts +259 -102
  527. package/src/extension/config-schema.ts +59 -0
  528. package/src/extension/config.ts +39 -17
  529. package/src/extension/control-notice-schema.ts +55 -0
  530. package/src/extension/control-notices.ts +57 -33
  531. package/src/extension/delegation-bridges.ts +59 -0
  532. package/src/extension/doctor.ts +171 -135
  533. package/src/extension/everyday-schemas.ts +252 -0
  534. package/src/extension/fanout-child.ts +29 -308
  535. package/src/extension/index.ts +17 -642
  536. package/src/extension/message-renderers.ts +334 -0
  537. package/src/extension/nested-control-inbox.ts +196 -0
  538. package/src/extension/parent-runtime.ts +405 -0
  539. package/src/extension/primary-tool.ts +130 -0
  540. package/src/extension/result-snapshot.ts +35 -0
  541. package/src/extension/runtime-reload.ts +72 -0
  542. package/src/extension/runtime-storage.ts +49 -0
  543. package/src/extension/schema-overrides.ts +114 -0
  544. package/src/extension/schemas.ts +451 -418
  545. package/src/extension/tool-input.ts +40 -13
  546. package/src/extension/tool-result.ts +45 -14
  547. package/src/history/answer-texts.ts +74 -0
  548. package/src/history/canonical-result.ts +127 -51
  549. package/src/history/canonical-selection.ts +54 -0
  550. package/src/history/database-generation.ts +86 -0
  551. package/src/history/database.ts +86 -48
  552. package/src/history/entry-ingestion.ts +129 -0
  553. package/src/history/index.ts +426 -148
  554. package/src/history/ingest.ts +372 -342
  555. package/src/history/output-digests.ts +41 -0
  556. package/src/history/preview.ts +235 -0
  557. package/src/history/prune.ts +48 -0
  558. package/src/history/queries.ts +122 -256
  559. package/src/history/query-scope.ts +278 -0
  560. package/src/history/rows.ts +118 -0
  561. package/src/history/run-projection.ts +164 -0
  562. package/src/history/run-queries.ts +199 -0
  563. package/src/history/schema.ts +34 -0
  564. package/src/history/search-queries.ts +216 -0
  565. package/src/history/selected-record.ts +140 -0
  566. package/src/history/source-file.ts +51 -0
  567. package/src/history/source-watches.ts +156 -0
  568. package/src/history/store.ts +310 -197
  569. package/src/history/text-chunks.ts +181 -0
  570. package/src/history/text.ts +43 -0
  571. package/src/history/transcript-queries.ts +251 -0
  572. package/src/history/types.ts +27 -164
  573. package/src/history/values.ts +36 -0
  574. package/src/history/wire-inputs.ts +141 -0
  575. package/src/history/wire-models.ts +51 -0
  576. package/src/history/worker-runtime.ts +502 -0
  577. package/src/history/worker.ts +94 -336
  578. package/src/intercom/intercom-bridge.ts +136 -69
  579. package/src/intercom/live-intercom.ts +197 -92
  580. package/src/intercom/nested-result-tree.ts +213 -0
  581. package/src/intercom/result-delivery.ts +56 -0
  582. package/src/intercom/result-intercom.ts +364 -382
  583. package/src/pi-intercom/agent-dir.ts +9 -3
  584. package/src/pi-intercom/async.ts +33 -0
  585. package/src/pi-intercom/bridge-ask.ts +64 -0
  586. package/src/pi-intercom/bridge-config.ts +101 -0
  587. package/src/pi-intercom/bridge-http.ts +97 -0
  588. package/src/pi-intercom/bridge-protocol.ts +123 -0
  589. package/src/pi-intercom/bridge-routes.ts +90 -0
  590. package/src/pi-intercom/bridge-session.ts +506 -0
  591. package/src/pi-intercom/bridge.ts +258 -547
  592. package/src/pi-intercom/broker/broker.ts +326 -263
  593. package/src/pi-intercom/broker/client.ts +273 -354
  594. package/src/pi-intercom/broker/connection.ts +192 -0
  595. package/src/pi-intercom/broker/framing.ts +11 -6
  596. package/src/pi-intercom/broker/paths.ts +28 -25
  597. package/src/pi-intercom/broker/pid.ts +68 -24
  598. package/src/pi-intercom/broker/snapshot-reader.ts +91 -0
  599. package/src/pi-intercom/broker/snapshots.ts +241 -0
  600. package/src/pi-intercom/broker/spawn.ts +58 -34
  601. package/src/pi-intercom/config.ts +113 -108
  602. package/src/pi-intercom/connection.ts +346 -0
  603. package/src/pi-intercom/identity.ts +71 -0
  604. package/src/pi-intercom/inbound-delivery.ts +450 -0
  605. package/src/pi-intercom/inbound-journal.ts +350 -0
  606. package/src/pi-intercom/inbound-record.ts +141 -0
  607. package/src/pi-intercom/inbound.ts +237 -0
  608. package/src/pi-intercom/index.ts +86 -2923
  609. package/src/pi-intercom/inspection.ts +82 -0
  610. package/src/pi-intercom/interview.ts +295 -0
  611. package/src/pi-intercom/lifecycle.ts +183 -0
  612. package/src/pi-intercom/message-format.ts +77 -0
  613. package/src/pi-intercom/outbound.ts +418 -0
  614. package/src/pi-intercom/peer-awareness.ts +84 -0
  615. package/src/pi-intercom/reply-tracker.ts +121 -59
  616. package/src/pi-intercom/reply-wait.ts +247 -0
  617. package/src/pi-intercom/runtime-types.ts +97 -0
  618. package/src/pi-intercom/session-events.ts +247 -0
  619. package/src/pi-intercom/session-targets.ts +124 -72
  620. package/src/pi-intercom/subagent-events.ts +299 -0
  621. package/src/pi-intercom/subagent-live-events.ts +212 -109
  622. package/src/pi-intercom/supervisor.ts +362 -0
  623. package/src/pi-intercom/tool-arguments.ts +120 -0
  624. package/src/pi-intercom/tool-registration.ts +121 -0
  625. package/src/pi-intercom/tool-results.ts +54 -0
  626. package/src/pi-intercom/tool-schemas.ts +134 -0
  627. package/src/pi-intercom/tools.ts +80 -0
  628. package/src/pi-intercom/topic-actions.ts +243 -0
  629. package/src/pi-intercom/topics.ts +267 -121
  630. package/src/pi-intercom/transport.ts +14 -0
  631. package/src/pi-intercom/types.ts +288 -190
  632. package/src/pi-intercom/ui/compose-paste.ts +109 -0
  633. package/src/pi-intercom/ui/compose.ts +173 -157
  634. package/src/pi-intercom/ui/inline-message.ts +80 -62
  635. package/src/pi-intercom/ui/message-renderers.ts +182 -0
  636. package/src/pi-intercom/ui/overlay.ts +238 -0
  637. package/src/pi-intercom/ui/session-format.ts +146 -0
  638. package/src/pi-intercom/ui/session-list.ts +145 -62
  639. package/src/pi-intercom/ui/tool-renderers.ts +148 -0
  640. package/src/pi-intercom/ui/topic-view.ts +107 -0
  641. package/src/pi-intercom/validation.ts +69 -0
  642. package/src/runs/background/async-chain-plan.ts +451 -0
  643. package/src/runs/background/async-control.ts +201 -71
  644. package/src/runs/background/async-execution.ts +206 -829
  645. package/src/runs/background/async-job-admission.ts +54 -0
  646. package/src/runs/background/async-job-projection.ts +225 -0
  647. package/src/runs/background/async-job-tracker.ts +416 -360
  648. package/src/runs/background/async-launch.ts +319 -0
  649. package/src/runs/background/async-plan.ts +285 -0
  650. package/src/runs/background/async-result-file.ts +79 -37
  651. package/src/runs/background/async-resume.ts +338 -285
  652. package/src/runs/background/async-run-discovery.ts +270 -0
  653. package/src/runs/background/async-run-location.ts +194 -0
  654. package/src/runs/background/async-run-record.ts +14 -0
  655. package/src/runs/background/async-run-repair.ts +307 -0
  656. package/src/runs/background/async-run-summary.ts +71 -0
  657. package/src/runs/background/async-single-plan.ts +168 -0
  658. package/src/runs/background/async-status-projection.ts +188 -0
  659. package/src/runs/background/async-status-render.ts +164 -0
  660. package/src/runs/background/async-status-validation.ts +238 -0
  661. package/src/runs/background/async-status.ts +9 -481
  662. package/src/runs/background/async-value.ts +29 -0
  663. package/src/runs/background/completion-dedupe.ts +103 -54
  664. package/src/runs/background/completion-delivery.ts +313 -187
  665. package/src/runs/background/completion-receipts.ts +309 -0
  666. package/src/runs/background/legacy-status-acceptance.ts +38 -0
  667. package/src/runs/background/notify.ts +167 -106
  668. package/src/runs/background/parallel-groups.ts +95 -46
  669. package/src/runs/background/result-payload.ts +268 -0
  670. package/src/runs/background/result-watcher.ts +484 -387
  671. package/src/runs/background/run-id-resolver.ts +126 -57
  672. package/src/runs/background/run-schemas.ts +240 -0
  673. package/src/runs/background/run-status-contracts.ts +46 -0
  674. package/src/runs/background/run-status-render.ts +364 -0
  675. package/src/runs/background/run-status.ts +338 -356
  676. package/src/runs/background/runner-attempt-output.ts +281 -0
  677. package/src/runs/background/runner-attempt.ts +354 -0
  678. package/src/runs/background/runner-child-executor.ts +232 -0
  679. package/src/runs/background/runner-child-observer.ts +270 -0
  680. package/src/runs/background/runner-completion-summary.ts +106 -0
  681. package/src/runs/background/runner-completion.ts +274 -0
  682. package/src/runs/background/runner-config.ts +52 -0
  683. package/src/runs/background/runner-contract.ts +51 -0
  684. package/src/runs/background/runner-dynamic.ts +185 -0
  685. package/src/runs/background/runner-finalization.ts +203 -0
  686. package/src/runs/background/runner-graph.ts +91 -0
  687. package/src/runs/background/runner-initial-status.ts +72 -0
  688. package/src/runs/background/runner-lifecycle.ts +159 -0
  689. package/src/runs/background/runner-monitor.ts +399 -0
  690. package/src/runs/background/runner-parallel.ts +280 -0
  691. package/src/runs/background/runner-prepare-step.ts +128 -0
  692. package/src/runs/background/runner-reporting.ts +192 -0
  693. package/src/runs/background/runner-status.ts +220 -0
  694. package/src/runs/background/runner-step-output.ts +158 -0
  695. package/src/runs/background/runner-step-record.ts +76 -0
  696. package/src/runs/background/runner-step.ts +150 -0
  697. package/src/runs/background/runner-streaming.ts +220 -0
  698. package/src/runs/background/runner-workflow.ts +284 -0
  699. package/src/runs/background/stale-run-reconciler.ts +279 -336
  700. package/src/runs/background/subagent-runner-launcher.ts +67 -35
  701. package/src/runs/background/subagent-runner.ts +80 -2048
  702. package/src/runs/background/top-level-async.ts +9 -7
  703. package/src/runs/foreground/chain-clarify.ts +499 -1334
  704. package/src/runs/foreground/clarification-draft.ts +92 -0
  705. package/src/runs/foreground/clarify-contracts.ts +33 -0
  706. package/src/runs/foreground/clarify-invocation.ts +192 -65
  707. package/src/runs/foreground/clarify-text-editor.ts +229 -0
  708. package/src/runs/foreground/clarify-view.ts +222 -0
  709. package/src/runs/foreground/execution-input.ts +358 -424
  710. package/src/runs/foreground/execution-routing.ts +41 -0
  711. package/src/runs/foreground/execution-timeout.ts +92 -0
  712. package/src/runs/foreground/foreground-control.ts +333 -812
  713. package/src/runs/foreground/foreground-memory.ts +132 -0
  714. package/src/runs/foreground/invocation-context.ts +88 -0
  715. package/src/runs/foreground/invocation-execution.ts +465 -0
  716. package/src/runs/foreground/invocation-expansion.ts +58 -0
  717. package/src/runs/foreground/management-actions.ts +360 -0
  718. package/src/runs/foreground/nested-control.ts +248 -0
  719. package/src/runs/foreground/question-continuation.ts +112 -0
  720. package/src/runs/foreground/question-control.ts +297 -70
  721. package/src/runs/foreground/resume-target.ts +330 -0
  722. package/src/runs/foreground/revival-launch-policy.ts +112 -0
  723. package/src/runs/foreground/run-async-path.ts +307 -223
  724. package/src/runs/foreground/run-interrupt.ts +202 -0
  725. package/src/runs/foreground/run-nudge.ts +355 -0
  726. package/src/runs/foreground/saved-revival.ts +356 -0
  727. package/src/runs/foreground/subagent-executor.ts +195 -493
  728. package/src/runs/foreground/subagent-params.ts +314 -242
  729. package/src/runs/foreground/wait-observation.ts +160 -0
  730. package/src/runs/foreground/wait-registration.ts +18 -0
  731. package/src/runs/foreground/wait-run.ts +361 -119
  732. package/src/runs/shared/acceptance-contract.ts +410 -209
  733. package/src/runs/shared/acceptance-defaults.ts +1 -0
  734. package/src/runs/shared/acceptance-evaluation.ts +314 -240
  735. package/src/runs/shared/acceptance-finalization.ts +447 -305
  736. package/src/runs/shared/acceptance-outcome.ts +69 -0
  737. package/src/runs/shared/acceptance-reports.ts +220 -126
  738. package/src/runs/shared/acceptance-submission.ts +251 -0
  739. package/src/runs/shared/acceptance-verification.ts +118 -0
  740. package/src/runs/shared/acceptance.ts +25 -25
  741. package/src/runs/shared/chain-outputs.ts +190 -98
  742. package/src/runs/shared/child-attempt-types.ts +118 -0
  743. package/src/runs/shared/child-attempt.ts +372 -608
  744. package/src/runs/shared/child-boundaries.ts +217 -0
  745. package/src/runs/shared/child-context-filter.ts +53 -0
  746. package/src/runs/shared/child-event-observer.ts +496 -0
  747. package/src/runs/shared/child-execution-cwd.ts +139 -68
  748. package/src/runs/shared/child-execution-outcome.ts +103 -0
  749. package/src/runs/shared/child-invocation.ts +74 -0
  750. package/src/runs/shared/child-message-validation.ts +233 -0
  751. package/src/runs/shared/child-native-accounting.ts +154 -0
  752. package/src/runs/shared/child-native-observation.ts +79 -0
  753. package/src/runs/shared/child-observation-spool.ts +188 -0
  754. package/src/runs/shared/child-observations.ts +219 -89
  755. package/src/runs/shared/child-presence.ts +6 -0
  756. package/src/runs/shared/child-route-env.ts +142 -0
  757. package/src/runs/shared/child-stream-observer.ts +302 -0
  758. package/src/runs/shared/child-stream-projection.ts +160 -0
  759. package/src/runs/shared/child-structured-tool.ts +38 -0
  760. package/src/runs/shared/claude-code.ts +201 -228
  761. package/src/runs/shared/claude-model.ts +67 -0
  762. package/src/runs/shared/claude-session.ts +124 -0
  763. package/src/runs/shared/claude-types.ts +31 -0
  764. package/src/runs/shared/completion-guard.ts +35 -26
  765. package/src/runs/shared/control-event-policy.ts +15 -0
  766. package/src/runs/shared/control-notification-owner.ts +20 -0
  767. package/src/runs/shared/dynamic-fanout.ts +402 -238
  768. package/src/runs/shared/dynamic-item.ts +114 -0
  769. package/src/runs/shared/history-index.ts +112 -51
  770. package/src/runs/shared/legacy-async-recovery.ts +153 -0
  771. package/src/runs/shared/legacy-output-recovery.ts +214 -0
  772. package/src/runs/shared/mcp-config-schema.ts +46 -0
  773. package/src/runs/shared/mcp-direct-tool-allowlist.ts +396 -307
  774. package/src/runs/shared/model-fallback.ts +302 -180
  775. package/src/runs/shared/mutating-tool-guard.ts +259 -158
  776. package/src/runs/shared/native-finalization-types.ts +29 -0
  777. package/src/runs/shared/native-finalization.ts +233 -109
  778. package/src/runs/shared/native-usage.ts +379 -96
  779. package/src/runs/shared/nested-control-records.ts +178 -0
  780. package/src/runs/shared/nested-events.ts +45 -752
  781. package/src/runs/shared/nested-path.ts +47 -34
  782. package/src/runs/shared/nested-projection.ts +230 -0
  783. package/src/runs/shared/nested-protocol.ts +67 -0
  784. package/src/runs/shared/nested-registry.ts +273 -0
  785. package/src/runs/shared/nested-render.ts +198 -100
  786. package/src/runs/shared/nested-route.ts +292 -0
  787. package/src/runs/shared/nested-validation.ts +291 -0
  788. package/src/runs/shared/owned-child-evidence.ts +184 -0
  789. package/src/runs/shared/owned-run-list.ts +187 -0
  790. package/src/runs/shared/owned-run-observation.ts +368 -0
  791. package/src/runs/shared/owned-run-progress.ts +172 -0
  792. package/src/runs/shared/owned-run-read-state.ts +7 -0
  793. package/src/runs/shared/owned-run-results.ts +289 -0
  794. package/src/runs/shared/owned-run-status.ts +239 -0
  795. package/src/runs/shared/owned-run-view.ts +65 -0
  796. package/src/runs/shared/owned-workflow-details.ts +24 -0
  797. package/src/runs/shared/owner-output.ts +73 -0
  798. package/src/runs/shared/parallel-utils.ts +93 -129
  799. package/src/runs/shared/parent-receipts.ts +177 -50
  800. package/src/runs/shared/parent-usage.ts +314 -91
  801. package/src/runs/shared/pi-args.ts +241 -311
  802. package/src/runs/shared/pi-launch-input.ts +48 -0
  803. package/src/runs/shared/pi-session-launch.ts +94 -0
  804. package/src/runs/shared/pi-spawn.ts +57 -33
  805. package/src/runs/shared/run-history-queries.ts +189 -38
  806. package/src/runs/shared/run-history.ts +197 -76
  807. package/src/runs/shared/run-id-ambiguity.ts +7 -3
  808. package/src/runs/shared/run-metadata-paths.ts +17 -0
  809. package/src/runs/shared/run-metadata.ts +240 -0
  810. package/src/runs/shared/run-persistence.ts +181 -0
  811. package/src/runs/shared/run-records.ts +19 -607
  812. package/src/runs/shared/run-restoration.ts +455 -0
  813. package/src/runs/shared/run-state-owner.ts +31 -0
  814. package/src/runs/shared/session-cwd-preload.ts +39 -19
  815. package/src/runs/shared/single-output.ts +358 -205
  816. package/src/runs/shared/stable-value.ts +15 -0
  817. package/src/runs/shared/streaming-text.ts +39 -12
  818. package/src/runs/shared/structured-output.ts +76 -46
  819. package/src/runs/shared/subagent-control.ts +330 -197
  820. package/src/runs/shared/subagent-prompt-runtime.ts +92 -174
  821. package/src/runs/shared/subagent-tool-loop-guard.ts +118 -68
  822. package/src/runs/shared/supervisor-question-state.ts +221 -0
  823. package/src/runs/shared/supervisor-questions.ts +396 -401
  824. package/src/runs/shared/workflow-graph.ts +400 -198
  825. package/src/runs/shared/workflow-policy.ts +245 -110
  826. package/src/runs/shared/worktree-contract.ts +29 -0
  827. package/src/runs/shared/worktree-hook.ts +181 -0
  828. package/src/runs/shared/worktree-location.ts +61 -0
  829. package/src/runs/shared/worktree-preservation.ts +10 -0
  830. package/src/runs/shared/worktree-process.ts +132 -0
  831. package/src/runs/shared/worktree.ts +459 -587
  832. package/src/shared/agent-context-policy.ts +176 -145
  833. package/src/shared/agent-dir.ts +15 -0
  834. package/src/shared/artifacts.ts +99 -68
  835. package/src/shared/atomic-json.ts +14 -11
  836. package/src/shared/chain-files.ts +72 -0
  837. package/src/shared/concurrency.ts +27 -0
  838. package/src/shared/content-preview.ts +117 -0
  839. package/src/shared/cooperative.ts +17 -13
  840. package/src/shared/execution-cwd.ts +34 -9
  841. package/src/shared/file-coalescer.ts +24 -22
  842. package/src/shared/fork-context.ts +52 -48
  843. package/src/shared/formatters.ts +88 -47
  844. package/src/shared/journal-frames.ts +197 -0
  845. package/src/shared/journal-projections.ts +133 -0
  846. package/src/shared/journal-reader.ts +18 -333
  847. package/src/shared/json-projection.ts +224 -0
  848. package/src/shared/lazy-tools.ts +76 -27
  849. package/src/shared/message-output.ts +146 -0
  850. package/src/shared/model-info.ts +94 -58
  851. package/src/shared/native-import.ts +25 -0
  852. package/src/shared/native-journal.ts +172 -0
  853. package/src/shared/native-session.ts +8 -3
  854. package/src/shared/native-tui.ts +13 -3
  855. package/src/shared/native-typebox.ts +18 -3
  856. package/src/shared/output-page.ts +76 -0
  857. package/src/shared/post-exit-stdio-guard.ts +232 -172
  858. package/src/shared/prompt-sections.ts +13 -7
  859. package/src/shared/session-entries.ts +103 -44
  860. package/src/shared/session-identity.ts +17 -10
  861. package/src/shared/settings.ts +182 -367
  862. package/src/shared/status-format.ts +207 -98
  863. package/src/shared/stream-json.d.ts +10 -0
  864. package/src/shared/task-file-policy.ts +35 -0
  865. package/src/shared/temp-root.ts +122 -71
  866. package/src/shared/types/acceptance.ts +149 -0
  867. package/src/shared/types/async.ts +247 -0
  868. package/src/shared/types/config.ts +139 -0
  869. package/src/shared/types/details.ts +104 -0
  870. package/src/shared/types/history.ts +217 -0
  871. package/src/shared/types/inputs.ts +4 -0
  872. package/src/shared/types/intercom.ts +57 -0
  873. package/src/shared/types/launch.ts +39 -0
  874. package/src/shared/types/messages.ts +104 -0
  875. package/src/shared/types/nested.ts +153 -0
  876. package/src/shared/types/owned-runs.ts +148 -0
  877. package/src/shared/types/progress.ts +106 -0
  878. package/src/shared/types/questions.ts +103 -0
  879. package/src/shared/types/results.ts +119 -0
  880. package/src/shared/types/state.ts +56 -0
  881. package/src/shared/types/usage.ts +36 -0
  882. package/src/shared/types/workflow.ts +187 -0
  883. package/src/shared/types.ts +222 -1161
  884. package/src/shared/ui-mode.ts +1 -1
  885. package/src/shared/unknown.ts +59 -0
  886. package/src/shared/utils.ts +111 -305
  887. package/src/slash/command-discovery.ts +109 -0
  888. package/src/slash/command-input.ts +232 -0
  889. package/src/slash/prompt-template-bridge.ts +153 -400
  890. package/src/slash/prompt-template-contract.ts +152 -0
  891. package/src/slash/prompt-template-results.ts +189 -0
  892. package/src/slash/request-protocol.ts +87 -0
  893. package/src/slash/result-delivery.ts +312 -0
  894. package/src/slash/saved-chain.ts +115 -0
  895. package/src/slash/slash-bridge.ts +202 -156
  896. package/src/slash/slash-commands.ts +176 -598
  897. package/src/slash/slash-live-state.ts +287 -229
  898. package/src/tui/action-hints.ts +147 -61
  899. package/src/tui/activity-lines.ts +40 -0
  900. package/src/tui/agent-browser.ts +354 -0
  901. package/src/tui/agent-controls.ts +355 -0
  902. package/src/tui/agent-conversation.ts +514 -0
  903. package/src/tui/agent-dock.ts +250 -0
  904. package/src/tui/agent-history.ts +78 -203
  905. package/src/tui/agent-model.ts +78 -0
  906. package/src/tui/agent-picker.ts +325 -0
  907. package/src/tui/agent-view.ts +391 -1333
  908. package/src/tui/compact-results.ts +342 -0
  909. package/src/tui/conversation-details.ts +206 -0
  910. package/src/tui/conversation-frame.ts +184 -0
  911. package/src/tui/conversation-history.ts +246 -0
  912. package/src/tui/conversation-menu.ts +119 -0
  913. package/src/tui/conversation-notices.ts +116 -0
  914. package/src/tui/conversation-selection.ts +66 -0
  915. package/src/tui/conversation-viewport.ts +169 -0
  916. package/src/tui/direction-message.ts +35 -0
  917. package/src/tui/display.ts +409 -0
  918. package/src/tui/editor-viewport.ts +19 -0
  919. package/src/tui/expanded-content.ts +134 -0
  920. package/src/tui/expanded-multi.ts +264 -0
  921. package/src/tui/expanded-single.ts +92 -0
  922. package/src/tui/history-cards.ts +316 -0
  923. package/src/tui/history-display.ts +334 -0
  924. package/src/tui/history-json.ts +17 -0
  925. package/src/tui/history-metadata.ts +177 -0
  926. package/src/tui/history-record.ts +321 -0
  927. package/src/tui/history-text.ts +34 -0
  928. package/src/tui/indexed-history.ts +149 -0
  929. package/src/tui/nested-widget.ts +192 -0
  930. package/src/tui/picker-page.ts +80 -0
  931. package/src/tui/render.ts +100 -1546
  932. package/src/tui/result-facts.ts +99 -0
  933. package/src/tui/task-observation.ts +96 -0
  934. package/src/tui/task-store.ts +432 -0
  935. package/src/tui/text-values.ts +20 -0
  936. package/src/tui/view-connections.ts +64 -0
  937. package/src/tui/view-model.ts +181 -0
  938. package/src/tui/view-persistence.ts +57 -0
  939. package/src/tui/view-ports.ts +55 -0
  940. package/src/tui/view-session.ts +42 -0
  941. package/src/tui/widget-details.ts +220 -0
  942. package/src/tui/widget-status.ts +331 -0
  943. package/src/tui/widget.ts +208 -0
  944. package/src/tui/workflow-labels.ts +340 -0
  945. package/src/tui/workflow-outcomes.ts +150 -0
  946. package/tsconfig.build.json +11 -10
  947. package/tsconfig.json +30 -17
@@ -1,649 +1,24 @@
1
- /**
2
- * Subagent Tool
3
- *
4
- * Full-featured subagent with sync and async modes.
5
- * - Async (default): Background execution, emits events when done
6
- * - Sync: Streams output, renders markdown, tracks usage
7
- *
8
- * Modes: single (agent + task), parallel (tasks[]), chain (chain[] with {previous})
9
- * Toggle: async parameter (default: true, configurable via config.json)
10
- *
11
- * Config file: ~/.pi/agent/extensions/subagent/config.json
12
- * { "asyncByDefault": false, "maxSubagentDepth": 1, "worktreeSetupHook": "./scripts/setup-worktree.mjs" }
13
- */
14
-
15
- import { randomUUID } from "node:crypto";
16
- import * as fs from "node:fs";
17
- import * as os from "node:os";
18
- import * as path from "node:path";
19
- import { keyText, type ExtensionAPI, type ExtensionContext, type MessageRenderOptions, type ToolDefinition } from "@earendil-works/pi-coding-agent";
20
- import { Box, Container, Spacer, Text, truncateToWidth, visibleWidth, wrapTextWithAnsi, type Component } from "@earendil-works/pi-tui";
21
- import { discoverAgents } from "../agents/agents.ts";
22
- import { ARTIFACT_CLEANUP_DAYS, cleanupAllArtifactDirs, cleanupOldArtifacts, getArtifactsDir } from "../shared/artifacts.ts";
23
- import { resolveCurrentSessionId } from "../shared/session-identity.ts";
24
- import { cleanupOldChainDirs } from "../shared/settings.ts";
25
- import { cleanupOldRunStorage, ensureSafeTempPath, ensureTempRoot } from "../shared/temp-root.ts";
26
- import { renderSubagentResult } from "../tui/render.ts";
27
- import { AgentViewController } from "../tui/agent-view.ts";
28
- import { withMouseExpansion } from "../tui/action-hints.ts";
29
- import { SubagentParams } from "./schemas.ts";
30
- import { createSubagentExecutor, normalizeSubagentParamsLike, resolveAsyncExecutionMode } from "../runs/foreground/subagent-executor.ts";
31
- import { createAsyncJobTracker } from "../runs/background/async-job-tracker.ts";
32
- import { OWNED_RUN_ENTRY, rememberOwnedRun, restoreOwnedRunsAsync } from "../runs/shared/run-records.ts";
33
- import { closeRunHistory, startRunHistory } from "../runs/shared/history-index.ts";
34
- import { finalizedChildUsage, registerParentUsage } from "../runs/shared/parent-usage.ts";
35
- import { createCompletionDelivery } from "../runs/background/completion-delivery.ts";
36
- import { isObsoleteIdleNotice } from "../runs/shared/subagent-control.ts";
37
- import { applyForceTopLevelAsyncOverride } from "../runs/background/top-level-async.ts";
38
- import { registerSlashCommands } from "../slash/slash-commands.ts";
39
- import { registerPromptTemplateDelegationBridge } from "../slash/prompt-template-bridge.ts";
40
- import { registerSlashSubagentBridge } from "../slash/slash-bridge.ts";
41
- import { clearSlashSnapshots, getSlashRenderableSnapshot, resolveSlashMessageDetails, restoreSlashFinalSnapshots, type SlashMessageDetails } from "../slash/slash-live-state.ts";
42
- import type { SubagentNotifyDetails } from "../runs/background/notify.ts";
1
+ import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
43
2
  import { SUBAGENT_CHILD_ENV } from "../runs/shared/pi-args.ts";
44
- import { formatDuration, shortenPath } from "../shared/formatters.ts";
45
- import { isTuiContext } from "../shared/ui-mode.ts";
3
+ import { ensureTempRoot } from "../shared/temp-root.ts";
4
+ import { errorMessage } from "../shared/unknown.ts";
46
5
  import { loadConfig } from "./config.ts";
47
- import { registerToolResultAdapter } from "./tool-result.ts";
48
- import { registerCompactSubagentTools } from "./compact-tools.ts";
49
- import {
50
- type Details,
51
- type SubagentExecutionResult,
52
- type SubagentState,
53
- ASYNC_DIR,
54
- RESULTS_DIR,
55
- SLASH_RESULT_TYPE,
56
- SUBAGENT_ASYNC_COMPLETE_EVENT,
57
- SUBAGENT_ASYNC_STARTED_EVENT,
58
- SUBAGENT_CONTROL_EVENT,
59
- WIDGET_KEY,
60
- } from "../shared/types.ts";
61
- import {
62
- formatSubagentControlNotice,
63
- handleSubagentControlNotice,
64
- SUBAGENT_CONTROL_MESSAGE_TYPE,
65
- type SubagentControlMessageDetails,
66
- } from "./control-notices.ts";
6
+ import { ParentSubagentRuntime } from "./parent-runtime.ts";
7
+ import { cleanupStaleRuntime } from "./runtime-reload.ts";
67
8
 
68
9
  export { loadConfig } from "./config.ts";
69
10
 
70
- const SUBAGENT_TOOL_NAME = "subagent";
71
- const SUBAGENT_GUIDELINES = [
72
- "Use subagent for materially parallelizable scouting, review, or implementation work where another focused agent adds value.",
73
- "Top-level subagent execution uses the stock async default unless configuration opts out. Launch a small bounded fanout of independent agents as separate single-agent runs so each completion wakes the parent, with at most one writer. Use one tasks call for non-review fanout when all child results are required together, when shared concurrency/task limits are needed, or when multiple writers require worktree isolation; the parent receives one aggregate completion. If no useful parent work remains, end the turn and wait instead of polling; completion wakes the parent. This also applies when an incomplete active Pi goal needs child evidence: yield, then continue the goal after automatic completion delivery. Set async:false only for explicitly chosen foreground execution.",
74
- "Before executing subagent runs, call subagent with { action: \"list\" } unless the requested executable agent or chain is already known from this conversation.",
75
- "Keep the parent session responsible for final decisions, verification, and user-facing status; treat subagent output as evidence to review, not automatic truth.",
76
- "Fresh-child handoffs must include relevant exact user instructions and settled decisions or readable source references alongside the bounded task; summaries do not replace original requirements.",
77
- "Keep independent review as a separate parent-launched reviewer run after the worker; acceptance.review is unsupported.",
78
- "For review-only tasks, omit acceptance unless the user explicitly requests a same-session acceptance contract; acceptance adds a finalization turn and is not independent review.",
79
- "For live child guidance, answers, corrections, or blockers, inspect status and prefer action='nudge'; it sends a non-blocking steer that supplements the active task unless the message explicitly replaces it. Use the shown blocking intercom ask only when the parent must stay alive waiting for a reply.",
80
- "Do not use subagent when a direct local tool call or small edit is cheaper than delegation.",
81
- ] as const;
82
-
83
- /**
84
- * Derive subagent session base directory from parent session file.
85
- * If parent session is ~/.pi/agent/sessions/abc123.jsonl,
86
- * returns ~/.pi/agent/sessions/abc123/ as the base.
87
- * Callers add runId to create the actual session root: abc123/{runId}/
88
- * Falls back to a unique temp directory if no parent session.
89
- */
90
- function getSubagentSessionRoot(parentSessionFile: string | null): string {
91
- if (parentSessionFile) {
92
- const baseName = path.basename(parentSessionFile, ".jsonl");
93
- const sessionsDir = path.dirname(parentSessionFile);
94
- return path.join(sessionsDir, baseName);
95
- }
96
- return fs.mkdtempSync(path.join(os.tmpdir(), "pi-subagent-session-"));
97
- }
98
-
99
- function expandTilde(p: string): string {
100
- return p.startsWith("~/") ? path.join(os.homedir(), p.slice(2)) : p;
101
- }
102
-
103
- function ensureAccessibleDir(dirPath: string): void {
104
- ensureSafeTempPath(dirPath);
105
- fs.mkdirSync(dirPath, { recursive: true });
106
- fs.accessSync(dirPath, fs.constants.R_OK | fs.constants.W_OK);
107
- }
108
-
109
- function isSlashResultRunning(result: SubagentExecutionResult): boolean {
110
- return result.details?.progress?.some((entry) => entry.status === "running")
111
- || result.details?.results.some((entry) => entry.progress?.status === "running")
112
- || false;
113
- }
114
-
115
- function isSlashResultError(result: SubagentExecutionResult): boolean {
116
- return result.details?.results.some((entry) => entry.exitCode !== 0 && entry.progress?.status !== "running") || false;
117
- }
118
-
119
- function isStaleExtensionContextError(error: unknown): boolean {
120
- return error instanceof Error && error.message.includes("Extension context no longer active");
121
- }
122
-
123
- function rebuildSlashResultContainer(
124
- container: Container,
125
- result: SubagentExecutionResult,
126
- options: MessageRenderOptions,
127
- theme: ExtensionContext["ui"]["theme"],
128
- ): void {
129
- container.clear();
130
- if ("compactView" in options && options.compactView === true && !options.expanded) {
131
- container.addChild(renderSubagentResult(result, options, theme));
132
- return;
133
- }
134
- container.addChild(new Spacer(1));
135
- const boxTheme = isSlashResultRunning(result) ? "toolPendingBg" : isSlashResultError(result) ? "toolErrorBg" : "toolSuccessBg";
136
- const box = new Box(1, 1, (text: string) => theme.bg(boxTheme, text));
137
- box.addChild(renderSubagentResult(result, options, theme));
138
- container.addChild(box);
139
- }
140
-
141
- function createSlashResultComponent(
142
- details: SlashMessageDetails,
143
- options: MessageRenderOptions,
144
- theme: ExtensionContext["ui"]["theme"],
145
- ): Container {
146
- const container = new Container();
147
- let lastVersion = -1;
148
- container.render = (width: number): string[] => {
149
- const snapshot = getSlashRenderableSnapshot(details);
150
- if (snapshot.version !== lastVersion) {
151
- lastVersion = snapshot.version;
152
- rebuildSlashResultContainer(container, snapshot.result, options, theme);
153
- }
154
- if ("compactView" in options && options.compactView === true && !options.expanded) {
155
- const key = keyText("app.tools.expand");
156
- const hint = key ? theme.fg("dim", ` · ${key}`) : "";
157
- const [heading = ""] = Container.prototype.render.call(container, Math.max(1, width - options.outputPad - visibleWidth(hint)));
158
- return [truncateToWidth(`${" ".repeat(options.outputPad)}${heading.replace(/\s+/g, " ").trimEnd()}${hint}`, width)];
159
- }
160
- return Container.prototype.render.call(container, width);
161
- };
162
- return container;
163
- }
164
-
165
- function parseSubagentNotifyContent(content: string): SubagentNotifyDetails | undefined {
166
- const lines = content.split("\n");
167
- const header = lines[0] ?? "";
168
- const match = header.match(/^Background task (completed|failed|blocked|paused): \*\*(.+?)\*\*(?:\s+(\([^)]*\)))?$/);
169
- if (!match) return undefined;
170
- const body = lines.slice(2);
171
- let sessionIndex = -1;
172
- for (let i = body.length - 1; i >= 1; i--) {
173
- if (body[i - 1]?.trim() === "" && /^(Session|Session file|Session share error):\s+/.test(body[i]!)) {
174
- sessionIndex = i;
175
- break;
176
- }
177
- }
178
- const sessionLine = sessionIndex >= 0 ? body[sessionIndex] : undefined;
179
- const resultLines = sessionIndex >= 0 ? body.slice(0, sessionIndex) : body;
180
- const resultPreview = resultLines.join("\n").trim() || "(no output)";
181
- let sessionLabel: string | undefined;
182
- let sessionValue: string | undefined;
183
- if (sessionLine) {
184
- const separator = sessionLine.indexOf(":");
185
- sessionLabel = sessionLine.slice(0, separator).toLowerCase();
186
- sessionValue = sessionLine.slice(separator + 1).trim();
187
- }
188
- return {
189
- agent: match[2]!,
190
- status: match[1] as SubagentNotifyDetails["status"],
191
- ...(match[3] ? { taskInfo: match[3] } : {}),
192
- resultPreview,
193
- ...(sessionLabel && sessionValue ? { sessionLabel, sessionValue } : {}),
194
- };
195
- }
196
-
197
- class SubagentControlNoticeComponent implements Component {
198
- private readonly details: SubagentControlMessageDetails;
199
- private readonly theme: ExtensionContext["ui"]["theme"];
200
-
201
- constructor(details: SubagentControlMessageDetails, theme: ExtensionContext["ui"]["theme"]) {
202
- this.details = details;
203
- this.theme = theme;
204
- }
205
-
206
- invalidate(): void {}
207
-
208
- render(width: number): string[] {
209
- const eventLabel = this.details.event.type.replaceAll("_", " ");
210
- if (width < 3) return [truncateToWidth(`Subagent ${eventLabel}`, width)];
211
- const bodyWidth = Math.max(1, width - 2);
212
- const borderChar = "─";
213
- const header = ` ⚠ Subagent ${eventLabel}: ${this.details.event.agent} `;
214
- const headerText = truncateToWidth(header, bodyWidth, "");
215
- const headerPadding = Math.max(0, bodyWidth - visibleWidth(headerText));
216
- const lines = [this.theme.fg("accent", `╭${headerText}${borderChar.repeat(headerPadding)}╮`)];
217
-
218
- for (const line of wrapTextWithAnsi(formatSubagentControlNotice(this.details), bodyWidth)) {
219
- const text = truncateToWidth(line, bodyWidth, "");
220
- const padding = Math.max(0, bodyWidth - visibleWidth(text));
221
- lines.push(this.theme.fg("accent", `│${text}${" ".repeat(padding)}│`));
222
- }
223
- lines.push(this.theme.fg("accent", `╰${borderChar.repeat(bodyWidth)}╯`));
224
- return lines;
225
- }
226
- }
227
-
228
11
  export default function registerSubagentExtension(pi: ExtensionAPI): void {
229
- if (process.env[SUBAGENT_CHILD_ENV] === "1") {
230
- // Child runs get child-safe nested delegation from the explicit fanout-child
231
- // runtime extension injected by buildPiArgs. Keep the parent extension inert
232
- // when global package discovery also loads index.ts in the child process.
233
- return;
234
- }
235
- try {
236
- ensureTempRoot();
237
- } catch (error) {
238
- console.error(`[pi-subagents] temp storage setup failed: ${error instanceof Error ? error.message : String(error)}`);
239
- return;
240
- }
241
- const globalStore = globalThis as Record<string, unknown>;
242
- const runtimeCleanupStoreKey = "__piSubagentRuntimeCleanup";
243
- const previousRuntimeCleanup = globalStore[runtimeCleanupStoreKey];
244
- if (typeof previousRuntimeCleanup === "function") {
245
- try {
246
- previousRuntimeCleanup();
247
- } catch {
248
- // Best effort cleanup for stale timers from an older reload.
249
- }
250
- }
251
-
252
- const config = loadConfig();
253
- // Root calls default async; child-safe nested calls intentionally keep their stock foreground default.
254
- const asyncByDefault = config.asyncByDefault !== false;
255
- const tempArtifactsDir = getArtifactsDir(null);
256
-
257
- let agentView: AgentViewController | undefined;
258
- let sessionReset: Promise<void> | undefined;
259
- const state: SubagentState = {
260
- baseCwd: "",
261
- currentSessionId: null,
262
- asyncJobs: new Map(),
263
- foregroundRuns: new Map(),
264
- ownedRuns: new Map(),
265
- persistOwnedRun: (run) => pi.appendEntry(OWNED_RUN_ENTRY, run),
266
- cleanupTimers: new Map(),
267
- lastUiContext: null,
268
- poller: null,
269
- completionSeen: new Map(),
270
- watcher: null,
271
- watcherRestartTimer: null,
272
- resultFileCoalescer: {
273
- schedule: () => false,
274
- clear: () => {},
275
- },
276
- };
277
-
278
- const runtimeCleanup = () => {
279
- agentView?.dispose();
280
- void closeRunHistory(state).catch((error) => console.error("Could not close subagent history:", error));
281
- completionDelivery.stop();
282
- if (state.poller) {
283
- clearInterval(state.poller);
284
- state.poller = null;
285
- }
286
- };
287
- globalStore[runtimeCleanupStoreKey] = runtimeCleanup;
288
-
289
- const { ensurePoller, handleStarted, handleComplete, restoreJobs, resetJobs } = createAsyncJobTracker(pi, state, ASYNC_DIR, { render: () => agentView?.refresh() });
290
- const executor = createSubagentExecutor({
291
- pi,
292
- state,
293
- config,
294
- asyncByDefault,
295
- tempArtifactsDir,
296
- getSubagentSessionRoot,
297
- expandTilde,
298
- discoverAgents,
299
- ensureSessionState: (ctx) => {
300
- if (sessionReset) return sessionReset;
301
- if (state.currentSessionId !== resolveCurrentSessionId(ctx.sessionManager)) return resetSessionState(ctx);
302
- },
303
- });
304
-
305
- agentView = new AgentViewController(pi, state, (params, ctx) => executor.execute(randomUUID(), params, undefined, undefined, ctx));
306
- state.onRunsChanged = () => agentView?.refresh();
307
-
308
- pi.registerMessageRenderer<SlashMessageDetails>(SLASH_RESULT_TYPE, withMouseExpansion((message, options, theme) => {
309
- const details = resolveSlashMessageDetails(message.details);
310
- if (!details) return undefined;
311
- return createSlashResultComponent(details, options, theme);
312
- }));
313
-
314
- pi.registerMessageRenderer<SubagentNotifyDetails>("subagent-notify", withMouseExpansion((message, options, theme) => {
315
- const content = typeof message.content === "string" ? message.content : "";
316
- const details = (message.details as SubagentNotifyDetails | undefined) ?? parseSubagentNotifyContent(content);
317
- const compact = "compactView" in options && options.compactView === true && !options.expanded;
318
- const compactPreview = (text: string): Component => ({
319
- render(width) {
320
- const key = keyText("app.tools.expand");
321
- const hint = key ? theme.fg("dim", ` · ${key}`) : "";
322
- const line = `${" ".repeat(options.outputPad)}${text.replace(/\s+/g, " ").trim()}`;
323
- return [truncateToWidth(truncateToWidth(line, width - visibleWidth(hint)) + hint, width)];
324
- },
325
- invalidate() {},
326
- });
327
- if (!details) return compact
328
- ? compactPreview(content.split("\n").find((line) => line.trim()) || "(no output)")
329
- : new Text(content, 0, 0);
330
- const icon = details.status === "completed"
331
- ? theme.fg("success", "✓")
332
- : details.status === "paused" || details.status === "blocked"
333
- ? theme.fg("warning", "■")
334
- : theme.fg("error", "✗");
335
- const parts: string[] = [];
336
- if (details.taskInfo) parts.push(details.taskInfo);
337
- if (details.durationMs !== undefined) parts.push(formatDuration(details.durationMs));
338
- let text = `${icon} ${theme.bold(details.agent)} ${theme.fg("dim", details.status)}`;
339
- if (parts.length > 0) text += ` ${theme.fg("dim", "·")} ${parts.map((part) => theme.fg("dim", part)).join(` ${theme.fg("dim", "·")} `)}`;
340
- const trimmedPreview = details.resultPreview.trim();
341
- if (compact) return compactPreview(`${text} · ${theme.fg("dim", trimmedPreview.split("\n", 1)[0] || "(no output)")}`);
342
- const previewLines = options.expanded
343
- ? trimmedPreview.split("\n").filter((line) => line.trim())
344
- : [trimmedPreview.split("\n", 1)[0] ?? ""].filter((line) => line.trim());
345
- for (const line of previewLines.length > 0 ? previewLines : ["(no output)"]) {
346
- text += `\n ${theme.fg("dim", `⎿ ${line}`)}`;
347
- }
348
- const expandKey = keyText("app.tools.expand");
349
- if (!options.expanded && expandKey) {
350
- text += `\n ${theme.fg("dim", `${expandKey} full notification`)}`;
351
- }
352
- if (details.sessionLabel && details.sessionValue) {
353
- text += `\n ${theme.fg("muted", `${details.sessionLabel}: ${shortenPath(details.sessionValue)}`)}`;
354
- }
355
- if (options.expanded) return new Text(text, 0, 0);
356
- return {
357
- render: (width) => text.split("\n").map((line) => truncateToWidth(line, width)),
358
- invalidate() {},
359
- };
360
- }));
361
-
362
- pi.registerMessageRenderer<SubagentControlMessageDetails>(SUBAGENT_CONTROL_MESSAGE_TYPE, (message, _options, theme) => {
363
- const details = message.details as SubagentControlMessageDetails | undefined;
364
- if (!details?.event) return undefined;
365
- const content = typeof message.content === "string" ? message.content : undefined;
366
- return new SubagentControlNoticeComponent({ ...details, noticeText: formatSubagentControlNotice(details, content) }, theme);
367
- });
368
-
369
- const slashBridge = registerSlashSubagentBridge({
370
- events: pi.events,
371
- getContext: () => state.lastUiContext,
372
- execute: (id, params, signal, onUpdate, ctx, executionCwd) =>
373
- executor.execute(id, params, signal, onUpdate, ctx, executionCwd),
374
- });
375
-
376
- const promptTemplateBridge = registerPromptTemplateDelegationBridge({
377
- events: pi.events,
378
- getContext: () => state.lastUiContext,
379
- execute: async (requestId, request, signal, ctx, onUpdate) => {
380
- if (request.tasks && request.tasks.length > 0) {
381
- return executor.execute(
382
- requestId,
383
- {
384
- tasks: request.tasks,
385
- context: request.context,
386
- cwd: request.cwd,
387
- worktree: request.worktree,
388
- async: false,
389
- clarify: false,
390
- },
391
- signal,
392
- onUpdate,
393
- ctx,
394
- );
395
- }
396
- return executor.execute(
397
- requestId,
398
- {
399
- agent: request.agent,
400
- task: request.task,
401
- context: request.context,
402
- cwd: request.cwd,
403
- model: request.model,
404
- async: false,
405
- clarify: false,
406
- },
407
- signal,
408
- onUpdate,
409
- ctx,
410
- );
411
- },
412
- });
413
-
414
- function effectiveParallelTaskCount(tasks: Array<{ count?: unknown }> | undefined): number {
415
- if (!tasks || tasks.length === 0) return 0;
416
- return tasks.reduce((total, task) => {
417
- const count = typeof task.count === "number" && Number.isInteger(task.count) && task.count >= 1 ? task.count : 1;
418
- return total + count;
419
- }, 0);
420
- }
421
-
422
- const toolNames = [SUBAGENT_TOOL_NAME, "delegate", "agent_runs"];
423
- const parentUsage = registerParentUsage(pi, toolNames);
424
- const completionDelivery = createCompletionDelivery(pi, state, parentUsage);
425
- const adaptToolResult = registerToolResultAdapter(pi, toolNames);
426
- const toRegisteredToolResult = (result: SubagentExecutionResult, ctx: ExtensionContext) => adaptToolResult(
427
- result.details.wait?.status === "completed" && result.details.run?.ownerSessionId === ctx.sessionManager.getSessionId()
428
- ? parentUsage.attach(result, finalizedChildUsage(result.details.run.children, result.details.wait.index), ctx)
429
- : result,
430
- );
431
- const reconcileRunTools = registerCompactSubagentTools(pi, { executor, state, adapt: toRegisteredToolResult, guidelines: SUBAGENT_GUIDELINES, asyncByDefault });
432
-
433
- const tool: ToolDefinition<typeof SubagentParams, Details> = {
434
- name: SUBAGENT_TOOL_NAME,
435
- defaultActive: false,
436
- label: "Subagent",
437
- description: `Delegate bounded work to configured Pi subagents, chains, or parallel reviewers; manage agent definitions; inspect/control async runs. Indexed status lists support global agent/state/text filters and sort/cursors; history pages bounded native previews and search finds saved visible words or one quoted phrase. Browse freshness is not canonical proof. Use exactly one execution mode (agent, tasks, or chain) or one management/control action. Before execution, use { action: "list" } to inspect configured agents/chains. Only execute agents listed as executable/non-disabled. Parallel tasks support output?,reads?,progress?. maxOutput accepts { bytes?: number, lines?: number }. Prefer acceptance for goal/spec handoffs and status/resume/interrupt/extend/nudge for active runs. Exact status is concise by default; full:true includes the full task/configuration. Review notes are parent-only, not sent to children; put actionable instructions in resume/nudge. Resume/answer preserves saved settings unless agent selects a current profile (including model/thinking/fallbacks); a separate model override wins. Live guidance never mutates model or acceptance.`,
438
- parameters: SubagentParams,
439
-
440
- async execute(id, params, signal, onUpdate, ctx) {
441
- return toRegisteredToolResult(await executor.execute(id, normalizeSubagentParamsLike(params), signal, onUpdate, ctx), ctx);
442
- },
443
-
444
- renderCall(args, theme) {
445
- if (args.action) {
446
- const target = args.agent || args.chainName || "";
447
- return new Text(
448
- `${theme.fg("toolTitle", theme.bold("subagent "))}${args.action}${target ? ` ${theme.fg("accent", target)}` : ""}`,
449
- 0, 0,
450
- );
451
- }
452
- const isParallel = (args.tasks?.length ?? 0) > 0;
453
- const parallelCount = effectiveParallelTaskCount(args.tasks as Array<{ count?: unknown }> | undefined);
454
- const renderedArgs = applyForceTopLevelAsyncOverride(args, 0, config.forceTopLevelAsync === true);
455
- const asyncLabel = resolveAsyncExecutionMode(renderedArgs, asyncByDefault).effectiveAsync ? theme.fg("warning", " [async]") : "";
456
- if (args.chain?.length)
457
- return new Text(
458
- `${theme.fg("toolTitle", theme.bold("subagent "))}chain (${args.chain.length})${asyncLabel}`,
459
- 0,
460
- 0,
461
- );
462
- if (isParallel)
463
- return new Text(
464
- `${theme.fg("toolTitle", theme.bold("subagent "))}parallel (${parallelCount})${asyncLabel}`,
465
- 0,
466
- 0,
467
- );
468
- return new Text(
469
- `${theme.fg("toolTitle", theme.bold("subagent "))}${theme.fg("accent", args.agent || "?")}${asyncLabel}`,
470
- 0,
471
- 0,
472
- );
473
- },
474
-
475
- renderResult: renderSubagentResult,
476
-
477
- };
478
-
479
- pi.registerTool(tool);
480
-
481
- registerSlashCommands(pi, state);
482
-
483
- const eventUnsubscribeStoreKey = "__piSubagentEventUnsubscribes";
484
- const controlNoticeSeenStoreKey = "__piSubagentVisibleControlNotices";
485
- const previousEventUnsubscribes = globalStore[eventUnsubscribeStoreKey];
486
- if (Array.isArray(previousEventUnsubscribes)) {
487
- for (const unsubscribe of previousEventUnsubscribes) {
488
- if (typeof unsubscribe !== "function") continue;
489
- try {
490
- unsubscribe();
491
- } catch {
492
- // Best effort cleanup for stale handlers from an older reload.
493
- }
494
- }
495
- }
496
-
497
- const existingVisibleControlNotices = globalStore[controlNoticeSeenStoreKey];
498
- const visibleControlNotices = existingVisibleControlNotices instanceof Set ? existingVisibleControlNotices as Set<string> : new Set<string>();
499
- globalStore[controlNoticeSeenStoreKey] = visibleControlNotices;
500
- const pendingIdleNotices = new Map<string, SubagentControlMessageDetails>();
501
- const deliverControlNotice = (details: SubagentControlMessageDetails) => {
502
- handleSubagentControlNotice({
503
- pi,
504
- visibleControlNotices,
505
- details,
506
- });
507
- };
508
- const controlEventHandler = (payload: unknown) => {
509
- const details = payload as SubagentControlMessageDetails;
510
- // The runner's event log retains the raw notice. Keep only its reference here
511
- // until the current turn ends, rather than admitting stale work to Pi's queue.
512
- if (details?.source === "async" && details.event?.reason === "idle" && !details.event.supervisorQuestion && state.lastUiContext && !state.lastUiContext.isIdle()) {
513
- pendingIdleNotices.set(`${details.event.runId}:${details.event.index ?? ""}`, details);
514
- return;
515
- }
516
- deliverControlNotice(details);
517
- };
518
- const flushIdleNotices = () => {
519
- for (const details of pendingIdleNotices.values()) deliverControlNotice(details);
520
- pendingIdleNotices.clear();
521
- };
522
- pi.on("turn_end", flushIdleNotices);
523
- pi.on("agent_before_settle", flushIdleNotices);
524
- pi.on("context", (event) => ({
525
- messages: event.messages.filter((message) => message.role !== "custom"
526
- || message.customType !== SUBAGENT_CONTROL_MESSAGE_TYPE
527
- || !isObsoleteIdleNotice(message.details as SubagentControlMessageDetails)),
528
- }));
529
- const subscribeEvents = () => [
530
- pi.events.on(SUBAGENT_ASYNC_STARTED_EVENT, (data) => {
531
- handleStarted(data);
532
- const started = data as import("../shared/types.ts").AsyncStartedEvent;
533
- const run = started.id ? state.ownedRuns?.get(started.id) : undefined;
534
- if (run) rememberOwnedRun(state, { ...run, source: "async", asyncDir: started.asyncDir, pid: started.pid });
535
- }),
536
- pi.events.on(SUBAGENT_ASYNC_COMPLETE_EVENT, handleComplete),
537
- pi.events.on(SUBAGENT_CONTROL_EVENT, controlEventHandler),
538
- ];
539
- let eventUnsubscribes = subscribeEvents();
540
- globalStore[eventUnsubscribeStoreKey] = eventUnsubscribes;
541
-
542
- pi.on("tool_result", (event, ctx) => {
543
- if (![SUBAGENT_TOOL_NAME, "delegate", "agent_runs"].includes(event.toolName)) return;
544
- if (!isTuiContext(ctx)) return;
545
- state.lastUiContext = ctx;
546
- if (state.asyncJobs.size > 0) {
547
- agentView?.refresh();
548
- const uiWithRender: ExtensionContext["ui"] & { requestRender?: () => void } = ctx.ui;
549
- uiWithRender.requestRender?.();
550
- ensurePoller();
551
- }
552
- });
553
-
554
- const cleanupSessionArtifacts = async (ctx: ExtensionContext) => {
555
- try {
556
- const sessionFile = ctx.sessionManager.getSessionFile();
557
- if (sessionFile) {
558
- await cleanupOldArtifacts(getArtifactsDir(sessionFile), ARTIFACT_CLEANUP_DAYS);
559
- }
560
- } catch {
561
- // Cleanup failures should not block session lifecycle events.
562
- }
563
- };
564
-
565
- function resetSessionState(ctx: ExtensionContext): Promise<void> {
566
- if (sessionReset) return sessionReset;
567
- sessionReset = restoreSession(ctx).finally(() => { sessionReset = undefined; });
568
- return sessionReset;
569
- }
570
-
571
- async function restoreSession(ctx: ExtensionContext): Promise<void> {
572
- pendingIdleNotices.clear();
573
- agentView?.dispose();
574
- if (state.poller) clearInterval(state.poller);
575
- state.poller = null;
576
- await completionDelivery.stopAndJoin();
577
- void closeRunHistory(state).catch((error) => console.error("Could not close subagent history:", error));
578
- ensureAccessibleDir(RESULTS_DIR);
579
- ensureAccessibleDir(ASYNC_DIR);
580
- state.baseCwd = ctx.cwd;
581
- state.currentSessionId = resolveCurrentSessionId(ctx.sessionManager);
582
- state.lastUiContext = ctx;
583
- resetJobs();
584
- const restoration = await restoreOwnedRunsAsync(state, ctx);
585
- try {
586
- restoreJobs(state.currentSessionId, ctx, restoration);
587
- } catch (error) {
588
- console.error("Failed to restore active async jobs:", error);
589
- resetJobs(ctx);
590
- }
591
- startRunHistory(state, ctx);
592
- void reconcileRunTools();
593
- agentView?.start(ctx);
594
- await cleanupOldRunStorage();
595
- await cleanupOldChainDirs();
596
- await cleanupAllArtifactDirs(ARTIFACT_CLEANUP_DAYS);
597
- await cleanupSessionArtifacts(ctx);
598
- restoreSlashFinalSnapshots(ctx.sessionManager.getEntries());
599
- completionDelivery.start();
600
- }
601
-
602
- pi.on("session_start", async (_event, ctx) => {
603
- if (!eventUnsubscribes.length) {
604
- eventUnsubscribes = subscribeEvents();
605
- globalStore[eventUnsubscribeStoreKey] = eventUnsubscribes;
606
- }
607
- await resetSessionState(ctx);
608
- await reconcileRunTools();
609
- });
610
-
611
- pi.on("session_shutdown", async () => {
612
- agentView?.dispose();
613
- if (state.poller) clearInterval(state.poller);
614
- state.poller = null;
615
- await completionDelivery.stopAndJoin({ preservePending: true });
616
- await closeRunHistory(state);
617
- for (const unsubscribe of eventUnsubscribes) {
618
- try {
619
- unsubscribe();
620
- } catch {
621
- // Best effort cleanup during shutdown.
622
- }
623
- }
624
- if (globalStore[eventUnsubscribeStoreKey] === eventUnsubscribes) {
625
- delete globalStore[eventUnsubscribeStoreKey];
626
- }
627
- eventUnsubscribes = [];
628
- for (const timer of state.cleanupTimers.values()) {
629
- clearTimeout(timer);
630
- }
631
- state.cleanupTimers.clear();
632
- state.asyncJobs.clear();
633
- clearSlashSnapshots();
634
- slashBridge.cancelAll();
635
- slashBridge.dispose();
636
- promptTemplateBridge.cancelAll();
637
- promptTemplateBridge.dispose();
638
- if (globalStore[runtimeCleanupStoreKey] === runtimeCleanup) {
639
- delete globalStore[runtimeCleanupStoreKey];
640
- }
641
- try {
642
- if (state.lastUiContext && isTuiContext(state.lastUiContext)) {
643
- state.lastUiContext.ui.setWidget(WIDGET_KEY, undefined);
644
- }
645
- } catch (error) {
646
- if (!isStaleExtensionContextError(error)) throw error;
647
- }
648
- });
12
+ if (process.env[SUBAGENT_CHILD_ENV] === "1") {
13
+ // Explicit fanout-child owns nested delegation; globally discovered parent code remains inert.
14
+ return;
15
+ }
16
+ try {
17
+ ensureTempRoot();
18
+ } catch (error) {
19
+ console.error(`[pi-subagents] temp storage setup failed: ${errorMessage(error)}`);
20
+ return;
21
+ }
22
+ cleanupStaleRuntime();
23
+ new ParentSubagentRuntime(pi, loadConfig()).register();
649
24
  }