@fitchmultz/pi-subagents 0.44.7 → 0.46.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 (955) hide show
  1. package/CHANGELOG.md +264 -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 +89 -0
  111. package/dist/pi-intercom/bridge-http.js +86 -0
  112. package/dist/pi-intercom/bridge-launch-policy.js +88 -0
  113. package/dist/pi-intercom/bridge-launch.js +217 -0
  114. package/dist/pi-intercom/bridge-protocol.js +106 -0
  115. package/dist/pi-intercom/bridge-routes.js +72 -0
  116. package/dist/pi-intercom/bridge-rpc-process.js +264 -0
  117. package/dist/pi-intercom/bridge-session.js +420 -0
  118. package/dist/pi-intercom/bridge.js +221 -606
  119. package/dist/pi-intercom/broker/broker.js +236 -244
  120. package/dist/pi-intercom/broker/client.js +189 -304
  121. package/dist/pi-intercom/broker/connection.js +165 -0
  122. package/dist/pi-intercom/broker/framing.js +5 -3
  123. package/dist/pi-intercom/broker/paths.js +4 -1
  124. package/dist/pi-intercom/broker/pid.js +53 -25
  125. package/dist/pi-intercom/broker/snapshot-reader.js +78 -0
  126. package/dist/pi-intercom/broker/snapshots.js +188 -0
  127. package/dist/pi-intercom/broker/spawn.js +36 -25
  128. package/dist/pi-intercom/config.js +85 -71
  129. package/dist/pi-intercom/connection.js +297 -0
  130. package/dist/pi-intercom/identity.js +58 -0
  131. package/dist/pi-intercom/inbound-delivery.js +356 -0
  132. package/dist/pi-intercom/inbound-journal.js +303 -0
  133. package/dist/pi-intercom/inbound-record.js +113 -0
  134. package/dist/pi-intercom/inbound.js +179 -0
  135. package/dist/pi-intercom/index.js +79 -2933
  136. package/dist/pi-intercom/inspection.js +62 -0
  137. package/dist/pi-intercom/interview.js +236 -0
  138. package/dist/pi-intercom/lifecycle.js +168 -0
  139. package/dist/pi-intercom/message-format.js +69 -0
  140. package/dist/pi-intercom/outbound.js +304 -0
  141. package/dist/pi-intercom/peer-awareness.js +66 -0
  142. package/dist/pi-intercom/reply-tracker.js +62 -43
  143. package/dist/pi-intercom/reply-wait.js +201 -0
  144. package/dist/pi-intercom/runtime-types.js +3 -0
  145. package/dist/pi-intercom/session-events.js +180 -0
  146. package/dist/pi-intercom/session-targets.js +42 -34
  147. package/dist/pi-intercom/subagent-events.js +238 -0
  148. package/dist/pi-intercom/subagent-live-events.js +129 -86
  149. package/dist/pi-intercom/supervisor.js +282 -0
  150. package/dist/pi-intercom/tool-arguments.js +74 -0
  151. package/dist/pi-intercom/tool-registration.js +95 -0
  152. package/dist/pi-intercom/tool-results.js +38 -0
  153. package/dist/pi-intercom/tool-schemas.js +82 -0
  154. package/dist/pi-intercom/tools.js +51 -0
  155. package/dist/pi-intercom/topic-actions.js +177 -0
  156. package/dist/pi-intercom/topics.js +177 -92
  157. package/dist/pi-intercom/transport.js +1 -0
  158. package/dist/pi-intercom/types.js +151 -114
  159. package/dist/pi-intercom/ui/compose-paste.js +93 -0
  160. package/dist/pi-intercom/ui/compose.js +121 -143
  161. package/dist/pi-intercom/ui/inline-message.js +59 -59
  162. package/dist/pi-intercom/ui/message-renderers.js +147 -0
  163. package/dist/pi-intercom/ui/overlay.js +181 -0
  164. package/dist/pi-intercom/ui/session-format.js +124 -0
  165. package/dist/pi-intercom/ui/session-list.js +76 -43
  166. package/dist/pi-intercom/ui/tool-renderers.js +110 -0
  167. package/dist/pi-intercom/ui/topic-view.js +88 -0
  168. package/dist/pi-intercom/validation.js +59 -0
  169. package/dist/runs/background/async-chain-plan.js +265 -0
  170. package/dist/runs/background/async-control.js +134 -58
  171. package/dist/runs/background/async-execution.js +136 -633
  172. package/dist/runs/background/async-job-admission.js +40 -0
  173. package/dist/runs/background/async-job-projection.js +169 -0
  174. package/dist/runs/background/async-job-tracker.js +297 -327
  175. package/dist/runs/background/async-launch.js +216 -0
  176. package/dist/runs/background/async-plan.js +116 -0
  177. package/dist/runs/background/async-result-file.js +47 -23
  178. package/dist/runs/background/async-resume.js +195 -253
  179. package/dist/runs/background/async-run-discovery.js +213 -0
  180. package/dist/runs/background/async-run-location.js +135 -0
  181. package/dist/runs/background/async-run-record.js +1 -0
  182. package/dist/runs/background/async-run-repair.js +223 -0
  183. package/dist/runs/background/async-run-summary.js +1 -0
  184. package/dist/runs/background/async-single-plan.js +105 -0
  185. package/dist/runs/background/async-status-projection.js +155 -0
  186. package/dist/runs/background/async-status-render.js +117 -0
  187. package/dist/runs/background/async-status-validation.js +181 -0
  188. package/dist/runs/background/async-status.js +3 -442
  189. package/dist/runs/background/async-value.js +21 -0
  190. package/dist/runs/background/completion-dedupe.js +36 -12
  191. package/dist/runs/background/completion-delivery.js +211 -205
  192. package/dist/runs/background/completion-receipts.js +237 -0
  193. package/dist/runs/background/legacy-status-acceptance.js +34 -0
  194. package/dist/runs/background/notify.js +96 -48
  195. package/dist/runs/background/parallel-groups.js +36 -19
  196. package/dist/runs/background/result-payload.js +178 -0
  197. package/dist/runs/background/result-watcher.js +348 -339
  198. package/dist/runs/background/run-id-resolver.js +53 -33
  199. package/dist/runs/background/run-schemas.js +189 -0
  200. package/dist/runs/background/run-status-contracts.js +14 -0
  201. package/dist/runs/background/run-status-render.js +270 -0
  202. package/dist/runs/background/run-status.js +231 -339
  203. package/dist/runs/background/runner-attempt-output.js +155 -0
  204. package/dist/runs/background/runner-attempt.js +263 -0
  205. package/dist/runs/background/runner-child-executor.js +166 -0
  206. package/dist/runs/background/runner-child-observer.js +192 -0
  207. package/dist/runs/background/runner-completion-summary.js +71 -0
  208. package/dist/runs/background/runner-completion.js +211 -0
  209. package/dist/runs/background/runner-config.js +1 -0
  210. package/dist/runs/background/runner-contract.js +1 -0
  211. package/dist/runs/background/runner-dynamic.js +121 -0
  212. package/dist/runs/background/runner-finalization.js +149 -0
  213. package/dist/runs/background/runner-graph.js +68 -0
  214. package/dist/runs/background/runner-initial-status.js +60 -0
  215. package/dist/runs/background/runner-lifecycle.js +142 -0
  216. package/dist/runs/background/runner-monitor.js +309 -0
  217. package/dist/runs/background/runner-parallel.js +204 -0
  218. package/dist/runs/background/runner-prepare-step.js +86 -0
  219. package/dist/runs/background/runner-reporting.js +153 -0
  220. package/dist/runs/background/runner-status.js +148 -0
  221. package/dist/runs/background/runner-step-output.js +92 -0
  222. package/dist/runs/background/runner-step-record.js +45 -0
  223. package/dist/runs/background/runner-step.js +112 -0
  224. package/dist/runs/background/runner-streaming.js +173 -0
  225. package/dist/runs/background/runner-workflow.js +213 -0
  226. package/dist/runs/background/stale-run-reconciler.js +155 -292
  227. package/dist/runs/background/subagent-runner-launcher.js +33 -13
  228. package/dist/runs/background/subagent-runner.js +51 -1842
  229. package/dist/runs/background/top-level-async.js +2 -1
  230. package/dist/runs/foreground/chain-clarify.js +293 -1017
  231. package/dist/runs/foreground/clarification-draft.js +87 -0
  232. package/dist/runs/foreground/clarify-contracts.js +1 -0
  233. package/dist/runs/foreground/clarify-invocation.js +129 -38
  234. package/dist/runs/foreground/clarify-text-editor.js +210 -0
  235. package/dist/runs/foreground/clarify-view.js +167 -0
  236. package/dist/runs/foreground/execution-input.js +226 -353
  237. package/dist/runs/foreground/execution-routing.js +33 -0
  238. package/dist/runs/foreground/execution-timeout.js +81 -0
  239. package/dist/runs/foreground/foreground-control.js +222 -763
  240. package/dist/runs/foreground/foreground-memory.js +99 -0
  241. package/dist/runs/foreground/invocation-context.js +55 -0
  242. package/dist/runs/foreground/invocation-execution.js +331 -0
  243. package/dist/runs/foreground/invocation-expansion.js +48 -0
  244. package/dist/runs/foreground/management-actions.js +295 -0
  245. package/dist/runs/foreground/nested-control.js +179 -0
  246. package/dist/runs/foreground/question-continuation.js +78 -0
  247. package/dist/runs/foreground/question-control.js +155 -50
  248. package/dist/runs/foreground/resume-target.js +221 -0
  249. package/dist/runs/foreground/revival-launch-policy.js +58 -0
  250. package/dist/runs/foreground/run-async-path.js +190 -178
  251. package/dist/runs/foreground/run-interrupt.js +164 -0
  252. package/dist/runs/foreground/run-nudge.js +278 -0
  253. package/dist/runs/foreground/saved-revival.js +251 -0
  254. package/dist/runs/foreground/subagent-executor.js +135 -424
  255. package/dist/runs/foreground/subagent-params.js +67 -30
  256. package/dist/runs/foreground/wait-observation.js +104 -0
  257. package/dist/runs/foreground/wait-registration.js +17 -0
  258. package/dist/runs/foreground/wait-run.js +283 -123
  259. package/dist/runs/shared/acceptance-contract.js +193 -99
  260. package/dist/runs/shared/acceptance-defaults.js +1 -0
  261. package/dist/runs/shared/acceptance-evaluation.js +201 -181
  262. package/dist/runs/shared/acceptance-finalization.js +256 -180
  263. package/dist/runs/shared/acceptance-outcome.js +53 -0
  264. package/dist/runs/shared/acceptance-reports.js +137 -72
  265. package/dist/runs/shared/acceptance-submission.js +167 -0
  266. package/dist/runs/shared/acceptance-verification.js +100 -0
  267. package/dist/runs/shared/chain-outputs.js +80 -52
  268. package/dist/runs/shared/child-attempt-types.js +1 -0
  269. package/dist/runs/shared/child-attempt.js +314 -667
  270. package/dist/runs/shared/child-boundaries.js +173 -0
  271. package/dist/runs/shared/child-context-filter.js +44 -0
  272. package/dist/runs/shared/child-event-observer.js +390 -0
  273. package/dist/runs/shared/child-execution-cwd.js +73 -43
  274. package/dist/runs/shared/child-execution-outcome.js +72 -0
  275. package/dist/runs/shared/child-invocation.js +54 -0
  276. package/dist/runs/shared/child-message-validation.js +215 -0
  277. package/dist/runs/shared/child-native-accounting.js +106 -0
  278. package/dist/runs/shared/child-native-observation.js +69 -0
  279. package/dist/runs/shared/child-observation-spool.js +164 -0
  280. package/dist/runs/shared/child-observations.js +157 -76
  281. package/dist/runs/shared/child-presence.js +3 -0
  282. package/dist/runs/shared/child-route-env.js +119 -0
  283. package/dist/runs/shared/child-stream-observer.js +221 -0
  284. package/dist/runs/shared/child-stream-projection.js +137 -0
  285. package/dist/runs/shared/child-structured-tool.js +27 -0
  286. package/dist/runs/shared/claude-code.js +121 -158
  287. package/dist/runs/shared/claude-model.js +42 -0
  288. package/dist/runs/shared/claude-session.js +83 -0
  289. package/dist/runs/shared/claude-types.js +1 -0
  290. package/dist/runs/shared/completion-guard.js +18 -18
  291. package/dist/runs/shared/control-event-policy.js +8 -0
  292. package/dist/runs/shared/control-notification-owner.js +13 -0
  293. package/dist/runs/shared/dynamic-fanout.js +188 -173
  294. package/dist/runs/shared/dynamic-item.js +102 -0
  295. package/dist/runs/shared/history-index.js +62 -36
  296. package/dist/runs/shared/legacy-async-recovery.js +114 -0
  297. package/dist/runs/shared/legacy-output-recovery.js +148 -0
  298. package/dist/runs/shared/mcp-config-schema.js +36 -0
  299. package/dist/runs/shared/mcp-direct-tool-allowlist.js +147 -116
  300. package/dist/runs/shared/model-fallback.js +97 -38
  301. package/dist/runs/shared/mutating-tool-guard.js +128 -88
  302. package/dist/runs/shared/native-finalization-types.js +1 -0
  303. package/dist/runs/shared/native-finalization.js +155 -76
  304. package/dist/runs/shared/native-usage.js +238 -98
  305. package/dist/runs/shared/nested-control-records.js +128 -0
  306. package/dist/runs/shared/nested-events.js +8 -700
  307. package/dist/runs/shared/nested-path.js +32 -28
  308. package/dist/runs/shared/nested-projection.js +155 -0
  309. package/dist/runs/shared/nested-protocol.js +18 -0
  310. package/dist/runs/shared/nested-registry.js +191 -0
  311. package/dist/runs/shared/nested-render.js +106 -58
  312. package/dist/runs/shared/nested-route.js +220 -0
  313. package/dist/runs/shared/nested-validation.js +216 -0
  314. package/dist/runs/shared/owned-child-evidence.js +125 -0
  315. package/dist/runs/shared/owned-run-list.js +146 -0
  316. package/dist/runs/shared/owned-run-observation.js +267 -0
  317. package/dist/runs/shared/owned-run-progress.js +109 -0
  318. package/dist/runs/shared/owned-run-read-state.js +1 -0
  319. package/dist/runs/shared/owned-run-results.js +202 -0
  320. package/dist/runs/shared/owned-run-status.js +180 -0
  321. package/dist/runs/shared/owned-run-view.js +51 -0
  322. package/dist/runs/shared/owned-workflow-details.js +17 -0
  323. package/dist/runs/shared/owner-output.js +43 -0
  324. package/dist/runs/shared/parallel-utils.js +36 -28
  325. package/dist/runs/shared/parent-receipts.js +90 -32
  326. package/dist/runs/shared/parent-usage.js +169 -57
  327. package/dist/runs/shared/pi-args.js +108 -201
  328. package/dist/runs/shared/pi-launch-input.js +1 -0
  329. package/dist/runs/shared/pi-session-launch.js +86 -0
  330. package/dist/runs/shared/pi-spawn.js +35 -21
  331. package/dist/runs/shared/run-history-queries.js +126 -35
  332. package/dist/runs/shared/run-history.js +101 -35
  333. package/dist/runs/shared/run-metadata-paths.js +14 -0
  334. package/dist/runs/shared/run-metadata.js +158 -0
  335. package/dist/runs/shared/run-persistence.js +131 -0
  336. package/dist/runs/shared/run-records.js +9 -679
  337. package/dist/runs/shared/run-restoration.js +338 -0
  338. package/dist/runs/shared/run-state-owner.js +26 -0
  339. package/dist/runs/shared/session-cwd-preload.js +27 -18
  340. package/dist/runs/shared/single-output.js +148 -70
  341. package/dist/runs/shared/stable-value.js +15 -0
  342. package/dist/runs/shared/streaming-text.js +23 -12
  343. package/dist/runs/shared/structured-output.js +25 -13
  344. package/dist/runs/shared/subagent-control.js +167 -100
  345. package/dist/runs/shared/subagent-prompt-runtime.js +27 -130
  346. package/dist/runs/shared/subagent-tool-loop-guard.js +81 -52
  347. package/dist/runs/shared/supervisor-question-state.js +145 -0
  348. package/dist/runs/shared/supervisor-questions.js +185 -254
  349. package/dist/runs/shared/workflow-graph.js +259 -167
  350. package/dist/runs/shared/workflow-policy.js +120 -48
  351. package/dist/runs/shared/worktree-contract.js +1 -0
  352. package/dist/runs/shared/worktree-hook.js +138 -0
  353. package/dist/runs/shared/worktree-location.js +47 -0
  354. package/dist/runs/shared/worktree-preservation.js +8 -0
  355. package/dist/runs/shared/worktree-process.js +107 -0
  356. package/dist/runs/shared/worktree.js +183 -322
  357. package/dist/shared/agent-context-policy.js +34 -44
  358. package/dist/shared/agent-dir.js +14 -0
  359. package/dist/shared/artifacts.js +30 -12
  360. package/dist/shared/atomic-json.js +4 -1
  361. package/dist/shared/chain-files.js +72 -0
  362. package/dist/shared/concurrency.js +18 -0
  363. package/dist/shared/content-preview.js +115 -0
  364. package/dist/shared/cooperative.js +5 -2
  365. package/dist/shared/execution-cwd.js +13 -5
  366. package/dist/shared/file-coalescer.js +2 -1
  367. package/dist/shared/fork-context.js +10 -12
  368. package/dist/shared/formatters.js +45 -19
  369. package/dist/shared/journal-frames.js +164 -0
  370. package/dist/shared/journal-projections.js +121 -0
  371. package/dist/shared/journal-reader.js +6 -407
  372. package/dist/shared/json-projection.js +191 -0
  373. package/dist/shared/lazy-tools.js +19 -8
  374. package/dist/shared/message-output.js +116 -0
  375. package/dist/shared/model-info.js +31 -14
  376. package/dist/shared/native-import.js +20 -0
  377. package/dist/shared/native-journal.js +140 -0
  378. package/dist/shared/native-session-loader.js +17 -0
  379. package/dist/shared/native-session.js +2 -13
  380. package/dist/shared/native-tui.js +7 -2
  381. package/dist/shared/native-typebox.js +15 -3
  382. package/dist/shared/output-page.js +63 -0
  383. package/dist/shared/post-exit-stdio-guard.js +128 -88
  384. package/dist/shared/prompt-sections.js +2 -0
  385. package/dist/shared/session-entries.js +70 -35
  386. package/dist/shared/session-identity.js +5 -3
  387. package/dist/shared/settings.js +62 -192
  388. package/dist/shared/status-format.js +97 -37
  389. package/dist/shared/task-file-policy.js +24 -0
  390. package/dist/shared/temp-root.js +44 -15
  391. package/dist/shared/types/acceptance.js +1 -0
  392. package/dist/shared/types/async.js +1 -0
  393. package/dist/shared/types/config.js +1 -0
  394. package/dist/shared/types/details.js +1 -0
  395. package/dist/shared/types/history.js +1 -0
  396. package/dist/shared/types/inputs.js +1 -0
  397. package/dist/shared/types/intercom.js +1 -0
  398. package/dist/shared/types/launch.js +1 -0
  399. package/dist/shared/types/messages.js +1 -0
  400. package/dist/shared/types/nested.js +1 -0
  401. package/dist/shared/types/owned-runs.js +1 -0
  402. package/dist/shared/types/progress.js +1 -0
  403. package/dist/shared/types/questions.js +1 -0
  404. package/dist/shared/types/results.js +1 -0
  405. package/dist/shared/types/state.js +1 -0
  406. package/dist/shared/types/usage.js +1 -0
  407. package/dist/shared/types/workflow.js +1 -0
  408. package/dist/shared/types.js +75 -30
  409. package/dist/shared/unknown.js +52 -0
  410. package/dist/shared/utils.js +54 -260
  411. package/dist/slash/command-discovery.js +82 -0
  412. package/dist/slash/command-input.js +190 -0
  413. package/dist/slash/prompt-template-bridge.js +94 -270
  414. package/dist/slash/prompt-template-contract.js +77 -0
  415. package/dist/slash/prompt-template-results.js +125 -0
  416. package/dist/slash/request-protocol.js +68 -0
  417. package/dist/slash/result-delivery.js +237 -0
  418. package/dist/slash/saved-chain.js +78 -0
  419. package/dist/slash/slash-bridge.js +123 -89
  420. package/dist/slash/slash-commands.js +101 -572
  421. package/dist/slash/slash-live-state.js +68 -47
  422. package/dist/tui/action-hints.js +50 -22
  423. package/dist/tui/activity-lines.js +32 -0
  424. package/dist/tui/agent-browser.js +290 -0
  425. package/dist/tui/agent-controls.js +289 -0
  426. package/dist/tui/agent-conversation.js +444 -0
  427. package/dist/tui/agent-dock.js +171 -0
  428. package/dist/tui/agent-history.js +50 -183
  429. package/dist/tui/agent-model.js +62 -0
  430. package/dist/tui/agent-picker.js +262 -0
  431. package/dist/tui/agent-view.js +232 -1564
  432. package/dist/tui/compact-results.js +193 -0
  433. package/dist/tui/conversation-details.js +190 -0
  434. package/dist/tui/conversation-frame.js +135 -0
  435. package/dist/tui/conversation-history.js +201 -0
  436. package/dist/tui/conversation-menu.js +78 -0
  437. package/dist/tui/conversation-notices.js +79 -0
  438. package/dist/tui/conversation-selection.js +58 -0
  439. package/dist/tui/conversation-viewport.js +129 -0
  440. package/dist/tui/direction-message.js +27 -0
  441. package/dist/tui/display.js +282 -0
  442. package/dist/tui/editor-viewport.js +18 -0
  443. package/dist/tui/expanded-content.js +87 -0
  444. package/dist/tui/expanded-multi.js +170 -0
  445. package/dist/tui/expanded-single.js +65 -0
  446. package/dist/tui/history-cards.js +216 -0
  447. package/dist/tui/history-display.js +238 -0
  448. package/dist/tui/history-json.js +16 -0
  449. package/dist/tui/history-metadata.js +152 -0
  450. package/dist/tui/history-record.js +251 -0
  451. package/dist/tui/history-text.js +34 -0
  452. package/dist/tui/indexed-history.js +116 -0
  453. package/dist/tui/nested-widget.js +120 -0
  454. package/dist/tui/picker-page.js +59 -0
  455. package/dist/tui/render.js +58 -1501
  456. package/dist/tui/result-facts.js +64 -0
  457. package/dist/tui/task-observation.js +59 -0
  458. package/dist/tui/task-store.js +366 -0
  459. package/dist/tui/text-values.js +16 -0
  460. package/dist/tui/view-connections.js +47 -0
  461. package/dist/tui/view-model.js +94 -0
  462. package/dist/tui/view-persistence.js +51 -0
  463. package/dist/tui/view-ports.js +1 -0
  464. package/dist/tui/view-session.js +37 -0
  465. package/dist/tui/widget-details.js +144 -0
  466. package/dist/tui/widget-status.js +245 -0
  467. package/dist/tui/widget.js +145 -0
  468. package/dist/tui/workflow-labels.js +223 -0
  469. package/dist/tui/workflow-outcomes.js +124 -0
  470. package/docs/code-quality.md +38 -0
  471. package/docs/development.md +99 -0
  472. package/docs/intercom-bridge.md +77 -22
  473. package/docs/intercom.md +132 -106
  474. package/docs/performance.md +19 -17
  475. package/docs/reference.md +1472 -0
  476. package/generated/RunValidators.d.ts +28 -0
  477. package/generated/RunValidators.js +2 -0
  478. package/package.json +27 -6
  479. package/prompts/parallel-cleanup.md +3 -0
  480. package/prompts/parallel-context-build.md +3 -0
  481. package/prompts/parallel-handoff-plan.md +6 -0
  482. package/prompts/parallel-research.md +4 -0
  483. package/prompts/parallel-review.md +2 -0
  484. package/prompts/review-loop.md +2 -0
  485. package/scripts/build.mjs +129 -85
  486. package/scripts/check-compat.mjs +48 -11
  487. package/scripts/compat-host.mjs +35 -7
  488. package/scripts/generate-run-schemas.mjs +210 -0
  489. package/scripts/intercom-bridge-credentials.mjs +158 -29
  490. package/scripts/intercom-remote.mjs +213 -52
  491. package/scripts/local-install-smoke.mjs +47 -37
  492. package/scripts/native-package-smoke.mjs +135 -25
  493. package/scripts/package-smoke.mjs +360 -140
  494. package/scripts/prepare.mjs +54 -34
  495. package/scripts/real-pi-processes.mjs +261 -0
  496. package/scripts/real-pi-smoke.mjs +432 -351
  497. package/scripts/run-tests.mjs +29 -15
  498. package/skills/pi-intercom/SKILL.md +11 -11
  499. package/skills/pi-intercom/references/peer-sessions.md +7 -2
  500. package/skills/pi-subagents/SKILL.md +1 -1
  501. package/skills/pi-subagents/references/full-orchestration-guide.md +254 -112
  502. package/src/agents/agent-defaults.ts +13 -0
  503. package/src/agents/agent-definition.ts +253 -0
  504. package/src/agents/agent-management.ts +111 -808
  505. package/src/agents/agent-scope.ts +7 -3
  506. package/src/agents/agent-selection.ts +26 -16
  507. package/src/agents/agent-serializer.ts +84 -93
  508. package/src/agents/agents.ts +199 -906
  509. package/src/agents/builtin-overrides.ts +297 -0
  510. package/src/agents/chain-serializer.ts +3 -329
  511. package/src/agents/config-values.ts +57 -0
  512. package/src/agents/discovery-paths.ts +134 -0
  513. package/src/agents/frontmatter.ts +35 -17
  514. package/src/agents/identity.ts +49 -18
  515. package/src/agents/json-chain.ts +305 -0
  516. package/src/agents/management-config.ts +342 -0
  517. package/src/agents/management-format.ts +243 -0
  518. package/src/agents/management-persistence.ts +408 -0
  519. package/src/agents/management-targets.ts +260 -0
  520. package/src/agents/management-warnings.ts +115 -0
  521. package/src/agents/markdown-chain.ts +237 -0
  522. package/src/agents/package-agents.ts +231 -0
  523. package/src/agents/skill-files.ts +182 -0
  524. package/src/agents/skill-search-paths.ts +289 -0
  525. package/src/agents/skill-types.ts +31 -0
  526. package/src/agents/skills.ts +152 -610
  527. package/src/extension/acceptance-schema.ts +88 -0
  528. package/src/extension/chain-schema.ts +276 -0
  529. package/src/extension/child-runtime.ts +302 -0
  530. package/src/extension/compact-tools.ts +259 -102
  531. package/src/extension/config-schema.ts +59 -0
  532. package/src/extension/config.ts +39 -17
  533. package/src/extension/control-notice-schema.ts +55 -0
  534. package/src/extension/control-notices.ts +57 -33
  535. package/src/extension/delegation-bridges.ts +59 -0
  536. package/src/extension/doctor.ts +171 -135
  537. package/src/extension/everyday-schemas.ts +252 -0
  538. package/src/extension/fanout-child.ts +29 -308
  539. package/src/extension/index.ts +17 -642
  540. package/src/extension/message-renderers.ts +334 -0
  541. package/src/extension/nested-control-inbox.ts +196 -0
  542. package/src/extension/parent-runtime.ts +405 -0
  543. package/src/extension/primary-tool.ts +130 -0
  544. package/src/extension/result-snapshot.ts +35 -0
  545. package/src/extension/runtime-reload.ts +72 -0
  546. package/src/extension/runtime-storage.ts +49 -0
  547. package/src/extension/schema-overrides.ts +114 -0
  548. package/src/extension/schemas.ts +451 -418
  549. package/src/extension/tool-input.ts +40 -13
  550. package/src/extension/tool-result.ts +45 -14
  551. package/src/history/answer-texts.ts +74 -0
  552. package/src/history/canonical-result.ts +127 -51
  553. package/src/history/canonical-selection.ts +54 -0
  554. package/src/history/database-generation.ts +86 -0
  555. package/src/history/database.ts +86 -48
  556. package/src/history/entry-ingestion.ts +129 -0
  557. package/src/history/index.ts +426 -148
  558. package/src/history/ingest.ts +372 -342
  559. package/src/history/output-digests.ts +41 -0
  560. package/src/history/preview.ts +235 -0
  561. package/src/history/prune.ts +48 -0
  562. package/src/history/queries.ts +122 -256
  563. package/src/history/query-scope.ts +278 -0
  564. package/src/history/rows.ts +118 -0
  565. package/src/history/run-projection.ts +164 -0
  566. package/src/history/run-queries.ts +199 -0
  567. package/src/history/schema.ts +34 -0
  568. package/src/history/search-queries.ts +216 -0
  569. package/src/history/selected-record.ts +140 -0
  570. package/src/history/source-file.ts +51 -0
  571. package/src/history/source-watches.ts +156 -0
  572. package/src/history/store.ts +310 -197
  573. package/src/history/text-chunks.ts +181 -0
  574. package/src/history/text.ts +43 -0
  575. package/src/history/transcript-queries.ts +251 -0
  576. package/src/history/types.ts +27 -164
  577. package/src/history/values.ts +36 -0
  578. package/src/history/wire-inputs.ts +141 -0
  579. package/src/history/wire-models.ts +51 -0
  580. package/src/history/worker-runtime.ts +502 -0
  581. package/src/history/worker.ts +94 -336
  582. package/src/intercom/intercom-bridge.ts +136 -69
  583. package/src/intercom/live-intercom.ts +197 -92
  584. package/src/intercom/nested-result-tree.ts +213 -0
  585. package/src/intercom/result-delivery.ts +56 -0
  586. package/src/intercom/result-intercom.ts +364 -382
  587. package/src/pi-intercom/agent-dir.ts +9 -3
  588. package/src/pi-intercom/async.ts +33 -0
  589. package/src/pi-intercom/bridge-ask.ts +64 -0
  590. package/src/pi-intercom/bridge-config.ts +120 -0
  591. package/src/pi-intercom/bridge-http.ts +97 -0
  592. package/src/pi-intercom/bridge-launch-policy.ts +109 -0
  593. package/src/pi-intercom/bridge-launch.ts +317 -0
  594. package/src/pi-intercom/bridge-protocol.ts +123 -0
  595. package/src/pi-intercom/bridge-routes.ts +105 -0
  596. package/src/pi-intercom/bridge-rpc-process.ts +293 -0
  597. package/src/pi-intercom/bridge-session.ts +510 -0
  598. package/src/pi-intercom/bridge.ts +305 -549
  599. package/src/pi-intercom/broker/broker.ts +326 -263
  600. package/src/pi-intercom/broker/client.ts +273 -354
  601. package/src/pi-intercom/broker/connection.ts +192 -0
  602. package/src/pi-intercom/broker/framing.ts +11 -6
  603. package/src/pi-intercom/broker/paths.ts +28 -25
  604. package/src/pi-intercom/broker/pid.ts +68 -24
  605. package/src/pi-intercom/broker/snapshot-reader.ts +91 -0
  606. package/src/pi-intercom/broker/snapshots.ts +241 -0
  607. package/src/pi-intercom/broker/spawn.ts +58 -34
  608. package/src/pi-intercom/config.ts +113 -108
  609. package/src/pi-intercom/connection.ts +346 -0
  610. package/src/pi-intercom/identity.ts +71 -0
  611. package/src/pi-intercom/inbound-delivery.ts +450 -0
  612. package/src/pi-intercom/inbound-journal.ts +350 -0
  613. package/src/pi-intercom/inbound-record.ts +141 -0
  614. package/src/pi-intercom/inbound.ts +237 -0
  615. package/src/pi-intercom/index.ts +86 -2923
  616. package/src/pi-intercom/inspection.ts +82 -0
  617. package/src/pi-intercom/interview.ts +295 -0
  618. package/src/pi-intercom/lifecycle.ts +183 -0
  619. package/src/pi-intercom/message-format.ts +77 -0
  620. package/src/pi-intercom/outbound.ts +418 -0
  621. package/src/pi-intercom/peer-awareness.ts +84 -0
  622. package/src/pi-intercom/reply-tracker.ts +121 -59
  623. package/src/pi-intercom/reply-wait.ts +247 -0
  624. package/src/pi-intercom/runtime-types.ts +97 -0
  625. package/src/pi-intercom/session-events.ts +247 -0
  626. package/src/pi-intercom/session-targets.ts +124 -72
  627. package/src/pi-intercom/subagent-events.ts +299 -0
  628. package/src/pi-intercom/subagent-live-events.ts +212 -109
  629. package/src/pi-intercom/supervisor.ts +362 -0
  630. package/src/pi-intercom/tool-arguments.ts +120 -0
  631. package/src/pi-intercom/tool-registration.ts +121 -0
  632. package/src/pi-intercom/tool-results.ts +54 -0
  633. package/src/pi-intercom/tool-schemas.ts +134 -0
  634. package/src/pi-intercom/tools.ts +80 -0
  635. package/src/pi-intercom/topic-actions.ts +243 -0
  636. package/src/pi-intercom/topics.ts +267 -121
  637. package/src/pi-intercom/transport.ts +14 -0
  638. package/src/pi-intercom/types.ts +288 -190
  639. package/src/pi-intercom/ui/compose-paste.ts +109 -0
  640. package/src/pi-intercom/ui/compose.ts +173 -157
  641. package/src/pi-intercom/ui/inline-message.ts +80 -62
  642. package/src/pi-intercom/ui/message-renderers.ts +182 -0
  643. package/src/pi-intercom/ui/overlay.ts +238 -0
  644. package/src/pi-intercom/ui/session-format.ts +146 -0
  645. package/src/pi-intercom/ui/session-list.ts +145 -62
  646. package/src/pi-intercom/ui/tool-renderers.ts +148 -0
  647. package/src/pi-intercom/ui/topic-view.ts +107 -0
  648. package/src/pi-intercom/validation.ts +69 -0
  649. package/src/runs/background/async-chain-plan.ts +451 -0
  650. package/src/runs/background/async-control.ts +201 -71
  651. package/src/runs/background/async-execution.ts +206 -829
  652. package/src/runs/background/async-job-admission.ts +54 -0
  653. package/src/runs/background/async-job-projection.ts +225 -0
  654. package/src/runs/background/async-job-tracker.ts +416 -360
  655. package/src/runs/background/async-launch.ts +319 -0
  656. package/src/runs/background/async-plan.ts +285 -0
  657. package/src/runs/background/async-result-file.ts +79 -37
  658. package/src/runs/background/async-resume.ts +338 -285
  659. package/src/runs/background/async-run-discovery.ts +270 -0
  660. package/src/runs/background/async-run-location.ts +194 -0
  661. package/src/runs/background/async-run-record.ts +14 -0
  662. package/src/runs/background/async-run-repair.ts +307 -0
  663. package/src/runs/background/async-run-summary.ts +71 -0
  664. package/src/runs/background/async-single-plan.ts +168 -0
  665. package/src/runs/background/async-status-projection.ts +188 -0
  666. package/src/runs/background/async-status-render.ts +164 -0
  667. package/src/runs/background/async-status-validation.ts +238 -0
  668. package/src/runs/background/async-status.ts +9 -481
  669. package/src/runs/background/async-value.ts +29 -0
  670. package/src/runs/background/completion-dedupe.ts +103 -54
  671. package/src/runs/background/completion-delivery.ts +313 -187
  672. package/src/runs/background/completion-receipts.ts +309 -0
  673. package/src/runs/background/legacy-status-acceptance.ts +38 -0
  674. package/src/runs/background/notify.ts +167 -106
  675. package/src/runs/background/parallel-groups.ts +95 -46
  676. package/src/runs/background/result-payload.ts +268 -0
  677. package/src/runs/background/result-watcher.ts +484 -387
  678. package/src/runs/background/run-id-resolver.ts +126 -57
  679. package/src/runs/background/run-schemas.ts +240 -0
  680. package/src/runs/background/run-status-contracts.ts +46 -0
  681. package/src/runs/background/run-status-render.ts +364 -0
  682. package/src/runs/background/run-status.ts +338 -356
  683. package/src/runs/background/runner-attempt-output.ts +281 -0
  684. package/src/runs/background/runner-attempt.ts +354 -0
  685. package/src/runs/background/runner-child-executor.ts +232 -0
  686. package/src/runs/background/runner-child-observer.ts +270 -0
  687. package/src/runs/background/runner-completion-summary.ts +106 -0
  688. package/src/runs/background/runner-completion.ts +274 -0
  689. package/src/runs/background/runner-config.ts +52 -0
  690. package/src/runs/background/runner-contract.ts +51 -0
  691. package/src/runs/background/runner-dynamic.ts +185 -0
  692. package/src/runs/background/runner-finalization.ts +203 -0
  693. package/src/runs/background/runner-graph.ts +91 -0
  694. package/src/runs/background/runner-initial-status.ts +72 -0
  695. package/src/runs/background/runner-lifecycle.ts +159 -0
  696. package/src/runs/background/runner-monitor.ts +399 -0
  697. package/src/runs/background/runner-parallel.ts +280 -0
  698. package/src/runs/background/runner-prepare-step.ts +128 -0
  699. package/src/runs/background/runner-reporting.ts +192 -0
  700. package/src/runs/background/runner-status.ts +220 -0
  701. package/src/runs/background/runner-step-output.ts +158 -0
  702. package/src/runs/background/runner-step-record.ts +76 -0
  703. package/src/runs/background/runner-step.ts +150 -0
  704. package/src/runs/background/runner-streaming.ts +220 -0
  705. package/src/runs/background/runner-workflow.ts +284 -0
  706. package/src/runs/background/stale-run-reconciler.ts +279 -336
  707. package/src/runs/background/subagent-runner-launcher.ts +67 -35
  708. package/src/runs/background/subagent-runner.ts +80 -2048
  709. package/src/runs/background/top-level-async.ts +9 -7
  710. package/src/runs/foreground/chain-clarify.ts +499 -1334
  711. package/src/runs/foreground/clarification-draft.ts +92 -0
  712. package/src/runs/foreground/clarify-contracts.ts +33 -0
  713. package/src/runs/foreground/clarify-invocation.ts +192 -65
  714. package/src/runs/foreground/clarify-text-editor.ts +229 -0
  715. package/src/runs/foreground/clarify-view.ts +222 -0
  716. package/src/runs/foreground/execution-input.ts +358 -424
  717. package/src/runs/foreground/execution-routing.ts +41 -0
  718. package/src/runs/foreground/execution-timeout.ts +92 -0
  719. package/src/runs/foreground/foreground-control.ts +333 -812
  720. package/src/runs/foreground/foreground-memory.ts +132 -0
  721. package/src/runs/foreground/invocation-context.ts +88 -0
  722. package/src/runs/foreground/invocation-execution.ts +465 -0
  723. package/src/runs/foreground/invocation-expansion.ts +58 -0
  724. package/src/runs/foreground/management-actions.ts +360 -0
  725. package/src/runs/foreground/nested-control.ts +248 -0
  726. package/src/runs/foreground/question-continuation.ts +112 -0
  727. package/src/runs/foreground/question-control.ts +297 -70
  728. package/src/runs/foreground/resume-target.ts +330 -0
  729. package/src/runs/foreground/revival-launch-policy.ts +112 -0
  730. package/src/runs/foreground/run-async-path.ts +307 -223
  731. package/src/runs/foreground/run-interrupt.ts +202 -0
  732. package/src/runs/foreground/run-nudge.ts +355 -0
  733. package/src/runs/foreground/saved-revival.ts +356 -0
  734. package/src/runs/foreground/subagent-executor.ts +195 -493
  735. package/src/runs/foreground/subagent-params.ts +314 -242
  736. package/src/runs/foreground/wait-observation.ts +160 -0
  737. package/src/runs/foreground/wait-registration.ts +18 -0
  738. package/src/runs/foreground/wait-run.ts +361 -119
  739. package/src/runs/shared/acceptance-contract.ts +410 -209
  740. package/src/runs/shared/acceptance-defaults.ts +1 -0
  741. package/src/runs/shared/acceptance-evaluation.ts +314 -240
  742. package/src/runs/shared/acceptance-finalization.ts +447 -305
  743. package/src/runs/shared/acceptance-outcome.ts +69 -0
  744. package/src/runs/shared/acceptance-reports.ts +220 -126
  745. package/src/runs/shared/acceptance-submission.ts +251 -0
  746. package/src/runs/shared/acceptance-verification.ts +118 -0
  747. package/src/runs/shared/acceptance.ts +25 -25
  748. package/src/runs/shared/chain-outputs.ts +190 -98
  749. package/src/runs/shared/child-attempt-types.ts +118 -0
  750. package/src/runs/shared/child-attempt.ts +372 -608
  751. package/src/runs/shared/child-boundaries.ts +217 -0
  752. package/src/runs/shared/child-context-filter.ts +53 -0
  753. package/src/runs/shared/child-event-observer.ts +496 -0
  754. package/src/runs/shared/child-execution-cwd.ts +139 -68
  755. package/src/runs/shared/child-execution-outcome.ts +103 -0
  756. package/src/runs/shared/child-invocation.ts +74 -0
  757. package/src/runs/shared/child-message-validation.ts +233 -0
  758. package/src/runs/shared/child-native-accounting.ts +154 -0
  759. package/src/runs/shared/child-native-observation.ts +79 -0
  760. package/src/runs/shared/child-observation-spool.ts +188 -0
  761. package/src/runs/shared/child-observations.ts +219 -89
  762. package/src/runs/shared/child-presence.ts +6 -0
  763. package/src/runs/shared/child-route-env.ts +142 -0
  764. package/src/runs/shared/child-stream-observer.ts +302 -0
  765. package/src/runs/shared/child-stream-projection.ts +160 -0
  766. package/src/runs/shared/child-structured-tool.ts +38 -0
  767. package/src/runs/shared/claude-code.ts +201 -228
  768. package/src/runs/shared/claude-model.ts +67 -0
  769. package/src/runs/shared/claude-session.ts +124 -0
  770. package/src/runs/shared/claude-types.ts +31 -0
  771. package/src/runs/shared/completion-guard.ts +35 -26
  772. package/src/runs/shared/control-event-policy.ts +15 -0
  773. package/src/runs/shared/control-notification-owner.ts +20 -0
  774. package/src/runs/shared/dynamic-fanout.ts +402 -238
  775. package/src/runs/shared/dynamic-item.ts +114 -0
  776. package/src/runs/shared/history-index.ts +112 -51
  777. package/src/runs/shared/legacy-async-recovery.ts +153 -0
  778. package/src/runs/shared/legacy-output-recovery.ts +214 -0
  779. package/src/runs/shared/mcp-config-schema.ts +46 -0
  780. package/src/runs/shared/mcp-direct-tool-allowlist.ts +396 -307
  781. package/src/runs/shared/model-fallback.ts +302 -180
  782. package/src/runs/shared/mutating-tool-guard.ts +259 -158
  783. package/src/runs/shared/native-finalization-types.ts +29 -0
  784. package/src/runs/shared/native-finalization.ts +233 -109
  785. package/src/runs/shared/native-usage.ts +379 -96
  786. package/src/runs/shared/nested-control-records.ts +178 -0
  787. package/src/runs/shared/nested-events.ts +45 -752
  788. package/src/runs/shared/nested-path.ts +47 -34
  789. package/src/runs/shared/nested-projection.ts +230 -0
  790. package/src/runs/shared/nested-protocol.ts +67 -0
  791. package/src/runs/shared/nested-registry.ts +273 -0
  792. package/src/runs/shared/nested-render.ts +198 -100
  793. package/src/runs/shared/nested-route.ts +292 -0
  794. package/src/runs/shared/nested-validation.ts +291 -0
  795. package/src/runs/shared/owned-child-evidence.ts +184 -0
  796. package/src/runs/shared/owned-run-list.ts +187 -0
  797. package/src/runs/shared/owned-run-observation.ts +368 -0
  798. package/src/runs/shared/owned-run-progress.ts +172 -0
  799. package/src/runs/shared/owned-run-read-state.ts +7 -0
  800. package/src/runs/shared/owned-run-results.ts +289 -0
  801. package/src/runs/shared/owned-run-status.ts +239 -0
  802. package/src/runs/shared/owned-run-view.ts +65 -0
  803. package/src/runs/shared/owned-workflow-details.ts +24 -0
  804. package/src/runs/shared/owner-output.ts +73 -0
  805. package/src/runs/shared/parallel-utils.ts +93 -129
  806. package/src/runs/shared/parent-receipts.ts +177 -50
  807. package/src/runs/shared/parent-usage.ts +314 -91
  808. package/src/runs/shared/pi-args.ts +241 -311
  809. package/src/runs/shared/pi-launch-input.ts +48 -0
  810. package/src/runs/shared/pi-session-launch.ts +94 -0
  811. package/src/runs/shared/pi-spawn.ts +57 -33
  812. package/src/runs/shared/run-history-queries.ts +189 -38
  813. package/src/runs/shared/run-history.ts +197 -76
  814. package/src/runs/shared/run-id-ambiguity.ts +7 -3
  815. package/src/runs/shared/run-metadata-paths.ts +17 -0
  816. package/src/runs/shared/run-metadata.ts +240 -0
  817. package/src/runs/shared/run-persistence.ts +181 -0
  818. package/src/runs/shared/run-records.ts +19 -607
  819. package/src/runs/shared/run-restoration.ts +455 -0
  820. package/src/runs/shared/run-state-owner.ts +31 -0
  821. package/src/runs/shared/session-cwd-preload.ts +39 -19
  822. package/src/runs/shared/single-output.ts +358 -205
  823. package/src/runs/shared/stable-value.ts +15 -0
  824. package/src/runs/shared/streaming-text.ts +39 -12
  825. package/src/runs/shared/structured-output.ts +76 -46
  826. package/src/runs/shared/subagent-control.ts +330 -197
  827. package/src/runs/shared/subagent-prompt-runtime.ts +92 -174
  828. package/src/runs/shared/subagent-tool-loop-guard.ts +118 -68
  829. package/src/runs/shared/supervisor-question-state.ts +221 -0
  830. package/src/runs/shared/supervisor-questions.ts +396 -401
  831. package/src/runs/shared/workflow-graph.ts +400 -198
  832. package/src/runs/shared/workflow-policy.ts +245 -110
  833. package/src/runs/shared/worktree-contract.ts +29 -0
  834. package/src/runs/shared/worktree-hook.ts +181 -0
  835. package/src/runs/shared/worktree-location.ts +61 -0
  836. package/src/runs/shared/worktree-preservation.ts +10 -0
  837. package/src/runs/shared/worktree-process.ts +132 -0
  838. package/src/runs/shared/worktree.ts +459 -587
  839. package/src/shared/agent-context-policy.ts +176 -145
  840. package/src/shared/agent-dir.ts +15 -0
  841. package/src/shared/artifacts.ts +99 -68
  842. package/src/shared/atomic-json.ts +14 -11
  843. package/src/shared/chain-files.ts +72 -0
  844. package/src/shared/concurrency.ts +27 -0
  845. package/src/shared/content-preview.ts +117 -0
  846. package/src/shared/cooperative.ts +17 -13
  847. package/src/shared/execution-cwd.ts +34 -9
  848. package/src/shared/file-coalescer.ts +24 -22
  849. package/src/shared/fork-context.ts +52 -48
  850. package/src/shared/formatters.ts +88 -47
  851. package/src/shared/journal-frames.ts +197 -0
  852. package/src/shared/journal-projections.ts +133 -0
  853. package/src/shared/journal-reader.ts +18 -333
  854. package/src/shared/json-projection.ts +224 -0
  855. package/src/shared/lazy-tools.ts +76 -27
  856. package/src/shared/message-output.ts +146 -0
  857. package/src/shared/model-info.ts +94 -58
  858. package/src/shared/native-import.ts +25 -0
  859. package/src/shared/native-journal.ts +172 -0
  860. package/src/shared/native-session-loader.ts +13 -0
  861. package/src/shared/native-session.ts +3 -5
  862. package/src/shared/native-tui.ts +13 -3
  863. package/src/shared/native-typebox.ts +18 -3
  864. package/src/shared/output-page.ts +76 -0
  865. package/src/shared/post-exit-stdio-guard.ts +232 -172
  866. package/src/shared/prompt-sections.ts +13 -7
  867. package/src/shared/session-entries.ts +103 -44
  868. package/src/shared/session-identity.ts +17 -10
  869. package/src/shared/settings.ts +182 -367
  870. package/src/shared/status-format.ts +207 -98
  871. package/src/shared/stream-json.d.ts +10 -0
  872. package/src/shared/task-file-policy.ts +35 -0
  873. package/src/shared/temp-root.ts +122 -71
  874. package/src/shared/types/acceptance.ts +149 -0
  875. package/src/shared/types/async.ts +247 -0
  876. package/src/shared/types/config.ts +139 -0
  877. package/src/shared/types/details.ts +104 -0
  878. package/src/shared/types/history.ts +217 -0
  879. package/src/shared/types/inputs.ts +4 -0
  880. package/src/shared/types/intercom.ts +57 -0
  881. package/src/shared/types/launch.ts +39 -0
  882. package/src/shared/types/messages.ts +104 -0
  883. package/src/shared/types/nested.ts +153 -0
  884. package/src/shared/types/owned-runs.ts +148 -0
  885. package/src/shared/types/progress.ts +106 -0
  886. package/src/shared/types/questions.ts +103 -0
  887. package/src/shared/types/results.ts +119 -0
  888. package/src/shared/types/state.ts +56 -0
  889. package/src/shared/types/usage.ts +36 -0
  890. package/src/shared/types/workflow.ts +187 -0
  891. package/src/shared/types.ts +222 -1161
  892. package/src/shared/ui-mode.ts +1 -1
  893. package/src/shared/unknown.ts +59 -0
  894. package/src/shared/utils.ts +111 -305
  895. package/src/slash/command-discovery.ts +109 -0
  896. package/src/slash/command-input.ts +232 -0
  897. package/src/slash/prompt-template-bridge.ts +153 -400
  898. package/src/slash/prompt-template-contract.ts +152 -0
  899. package/src/slash/prompt-template-results.ts +189 -0
  900. package/src/slash/request-protocol.ts +87 -0
  901. package/src/slash/result-delivery.ts +312 -0
  902. package/src/slash/saved-chain.ts +115 -0
  903. package/src/slash/slash-bridge.ts +202 -156
  904. package/src/slash/slash-commands.ts +176 -598
  905. package/src/slash/slash-live-state.ts +287 -229
  906. package/src/tui/action-hints.ts +147 -61
  907. package/src/tui/activity-lines.ts +40 -0
  908. package/src/tui/agent-browser.ts +354 -0
  909. package/src/tui/agent-controls.ts +355 -0
  910. package/src/tui/agent-conversation.ts +514 -0
  911. package/src/tui/agent-dock.ts +250 -0
  912. package/src/tui/agent-history.ts +78 -203
  913. package/src/tui/agent-model.ts +78 -0
  914. package/src/tui/agent-picker.ts +325 -0
  915. package/src/tui/agent-view.ts +391 -1333
  916. package/src/tui/compact-results.ts +342 -0
  917. package/src/tui/conversation-details.ts +206 -0
  918. package/src/tui/conversation-frame.ts +184 -0
  919. package/src/tui/conversation-history.ts +246 -0
  920. package/src/tui/conversation-menu.ts +119 -0
  921. package/src/tui/conversation-notices.ts +116 -0
  922. package/src/tui/conversation-selection.ts +66 -0
  923. package/src/tui/conversation-viewport.ts +169 -0
  924. package/src/tui/direction-message.ts +35 -0
  925. package/src/tui/display.ts +409 -0
  926. package/src/tui/editor-viewport.ts +19 -0
  927. package/src/tui/expanded-content.ts +134 -0
  928. package/src/tui/expanded-multi.ts +264 -0
  929. package/src/tui/expanded-single.ts +92 -0
  930. package/src/tui/history-cards.ts +316 -0
  931. package/src/tui/history-display.ts +334 -0
  932. package/src/tui/history-json.ts +17 -0
  933. package/src/tui/history-metadata.ts +177 -0
  934. package/src/tui/history-record.ts +321 -0
  935. package/src/tui/history-text.ts +34 -0
  936. package/src/tui/indexed-history.ts +149 -0
  937. package/src/tui/nested-widget.ts +192 -0
  938. package/src/tui/picker-page.ts +80 -0
  939. package/src/tui/render.ts +100 -1546
  940. package/src/tui/result-facts.ts +99 -0
  941. package/src/tui/task-observation.ts +96 -0
  942. package/src/tui/task-store.ts +432 -0
  943. package/src/tui/text-values.ts +20 -0
  944. package/src/tui/view-connections.ts +64 -0
  945. package/src/tui/view-model.ts +181 -0
  946. package/src/tui/view-persistence.ts +57 -0
  947. package/src/tui/view-ports.ts +55 -0
  948. package/src/tui/view-session.ts +42 -0
  949. package/src/tui/widget-details.ts +220 -0
  950. package/src/tui/widget-status.ts +331 -0
  951. package/src/tui/widget.ts +208 -0
  952. package/src/tui/workflow-labels.ts +340 -0
  953. package/src/tui/workflow-outcomes.ts +150 -0
  954. package/tsconfig.build.json +11 -10
  955. package/tsconfig.json +30 -17
@@ -1,984 +1,26 @@
1
- /**
2
- * Type definitions for the subagent extension
3
- */
4
-
1
+ /** Public compatibility barrel. Domain contracts depend on each other, never on implementation modules. */
5
2
  import * as os from "node:os";
6
3
  import * as path from "node:path";
7
- import type { Message, Usage as NativeUsage } from "@earendil-works/pi-ai";
8
- import type { FSWatcher } from "node:fs";
9
- import type { ExtensionContext } from "@earendil-works/pi-coding-agent";
10
- import type { AgentToolResult } from "@earendil-works/pi-agent-core";
11
- import type { SubagentHistoryIndex } from "../history/index.ts";
12
-
13
- // ============================================================================
14
- // Basic Types
15
- // ============================================================================
16
-
17
- export interface MaxOutputConfig {
18
- bytes?: number;
19
- lines?: number;
20
- }
21
-
22
- export type OutputMode = "inline" | "file-only";
23
-
24
- export type JsonSchemaObject = Record<string, unknown>;
25
-
26
- export interface ChainOutputMapEntry {
27
- text: string;
28
- structured?: unknown;
29
- agent: string;
30
- stepIndex: number;
31
- }
32
-
33
- export type ChainOutputMap = Record<string, ChainOutputMapEntry>;
34
-
35
- export type WorkflowNodeStatus = "pending" | "running" | "completed" | "complete" | "failed" | "blocked" | "paused" | "detached" | "timed-out";
36
-
37
- export interface WorkflowGraphNode {
38
- id: string;
39
- kind: "step" | "parallel-group" | "dynamic-parallel-group" | "agent";
40
- agent?: string;
41
- phase?: string;
42
- label: string;
43
- status: WorkflowNodeStatus;
44
- flatIndex?: number;
45
- stepIndex?: number;
46
- children?: WorkflowGraphNode[];
47
- dynamic?: {
48
- sourceOutput: string;
49
- sourcePath: string;
50
- itemName: string;
51
- maxItems?: number;
52
- collectAs?: string;
53
- };
54
- itemKey?: string;
55
- outputName?: string;
56
- structured?: boolean;
57
- acceptanceStatus?: AcceptanceLedgerStatus;
58
- error?: string;
59
- }
60
-
61
- export interface WorkflowGraphSnapshot {
62
- runId: string;
63
- mode: "chain" | "parallel" | "single";
64
- phases: Array<{ title: string; nodeIds: string[] }>;
65
- nodes: WorkflowGraphNode[];
66
- currentNodeId?: string;
67
- }
68
-
69
- export interface SavedOutputReference {
70
- path: string;
71
- bytes: number;
72
- lines: number;
73
- message: string;
74
- }
75
-
76
- interface TruncationResult {
77
- text: string;
78
- truncated: boolean;
79
- originalBytes?: number;
80
- originalLines?: number;
81
- artifactPath?: string;
82
- }
83
-
84
- export interface UsageContribution {
85
- id: string;
86
- /** Native tool and summary usage may not carry model attribution. */
87
- provider?: string;
88
- model?: string;
89
- usage: NativeUsage;
90
- }
91
-
92
- export interface Usage {
93
- contributions?: UsageContribution[];
94
- input: number;
95
- output: number;
96
- cacheRead: number;
97
- cacheWrite: number;
98
- cost: number;
99
- turns: number;
100
- }
101
-
102
- export interface TokenUsage {
103
- input: number;
104
- output: number;
105
- total: number;
106
- }
107
-
108
- export type ActivityState = "needs_attention";
109
- export type ControlEventType = "needs_attention";
110
- export type ControlNotificationChannel = "event" | "async" | "intercom";
111
-
112
- export interface ControlConfig {
113
- enabled?: boolean;
114
- needsAttentionAfterMs?: number;
115
- failedToolAttemptsBeforeAttention?: number;
116
- notifyOn?: ControlEventType[];
117
- notifyChannels?: ControlNotificationChannel[];
118
- }
119
-
120
- export interface ResolvedControlConfig {
121
- enabled: boolean;
122
- needsAttentionAfterMs: number;
123
- failedToolAttemptsBeforeAttention: number;
124
- notifyOn: ControlEventType[];
125
- notifyChannels: ControlNotificationChannel[];
126
- }
127
-
128
- export interface ControlEvent {
129
- type: ControlEventType;
130
- from?: ActivityState;
131
- to: ActivityState;
132
- ts: number;
133
- agent: string;
134
- index?: number;
135
- runId: string;
136
- message: string;
137
- reason?: "idle" | "completion_guard" | "tool_failures";
138
- turns?: number;
139
- tokens?: number;
140
- toolCount?: number;
141
- currentTool?: string;
142
- currentToolDurationMs?: number;
143
- currentPath?: string;
144
- elapsedMs?: number;
145
- recentFailureSummary?: string;
146
- supervisorQuestion?: { questionId: string; state: "awaiting_input" | "answer_pending"; answer?: string };
147
- }
148
-
149
- export type SubagentResultStatus = "completed" | "failed" | "blocked" | "paused" | "detached" | "timed-out";
150
- export type SubagentRunMode = "single" | "parallel" | "chain";
151
-
152
- export type PublicNestedStepSummary = Pick<
153
- NestedStepSummary,
154
- "agent" | "status" | "sessionFile" | "activityState" | "lastActivityAt" | "currentTool" | "currentToolStartedAt" | "currentPath" | "turnCount" | "toolCount" | "startedAt" | "endedAt" | "error"
155
- > & {
156
- children?: PublicNestedRunSummary[];
157
- };
158
-
159
- export type PublicNestedRunSummary = Pick<
160
- NestedRunSummary,
161
- "id" | "parentRunId" | "parentStepIndex" | "parentAgent" | "depth" | "path" | "asyncDir" | "sessionId" | "sessionFile" | "intercomTarget" | "ownerIntercomTarget" | "leafIntercomTarget" | "ownerState" | "mode" | "state" | "agent" | "agents" | "currentStep" | "chainStepCount" | "parallelGroups" | "activityState" | "lastActivityAt" | "currentTool" | "currentToolStartedAt" | "currentPath" | "turnCount" | "toolCount" | "totalTokens" | "startedAt" | "endedAt" | "lastUpdate" | "error"
162
- > & {
163
- steps?: PublicNestedStepSummary[];
164
- children?: PublicNestedRunSummary[];
165
- };
166
-
167
- export interface SubagentResultIntercomChild {
168
- agent: string;
169
- status: SubagentResultStatus;
170
- summary: string;
171
- index?: number;
172
- artifactPath?: string;
173
- metadataPath?: string;
174
- sessionPath?: string;
175
- intercomTarget?: string;
176
- children?: PublicNestedRunSummary[];
177
- }
178
-
179
- export interface SubagentResultIntercomPayload {
180
- completionId?: string;
181
- to: string;
182
- message: string;
183
- requestId?: string;
184
- runId: string;
185
- mode: SubagentRunMode;
186
- status: SubagentResultStatus;
187
- summary: string;
188
- error?: string;
189
- source: "foreground" | "async";
190
- children: SubagentResultIntercomChild[];
191
- resultPath?: string;
192
- asyncId?: string;
193
- asyncDir?: string;
194
- chainSteps?: number;
195
- agent?: string;
196
- index?: number;
197
- artifactPath?: string;
198
- sessionPath?: string;
199
- }
200
-
201
- // ============================================================================
202
- // Progress Tracking
203
- // ============================================================================
204
-
205
- export interface AgentProgress {
206
- index: number;
207
- agent: string;
208
- status: "pending" | "running" | "completed" | "complete" | "failed" | "blocked" | "paused" | "detached" | "timed-out";
209
- model?: string;
210
- thinking?: string;
211
- /** Display boundary: earlier native history belongs to a previous attempt. */
212
- modelStartedAt?: number;
213
- activityState?: ActivityState;
214
- task: string;
215
- skills?: string[];
216
- lastActivityAt?: number;
217
- currentTool?: string;
218
- currentToolArgs?: string;
219
- currentToolStartedAt?: number;
220
- currentPath?: string;
221
- streamingText?: string;
222
- recentTools: Array<{ tool: string; args: string; endMs: number }>;
223
- recentOutput: string[];
224
- toolCount: number;
225
- turnCount?: number;
226
- tokens: number;
227
- durationMs: number;
228
- error?: string;
229
- failedTool?: string;
230
- }
231
-
232
- export interface ToolCallSummary {
233
- text: string;
234
- expandedText: string;
235
- }
236
-
237
- interface ProgressSummary extends Partial<Pick<AgentProgress,
238
- "index" | "agent" | "status" | "activityState" | "task" | "skills" | "lastActivityAt" | "currentTool" | "currentToolArgs" | "currentToolStartedAt" | "currentPath" | "recentTools" | "recentOutput" | "turnCount" | "error" | "failedTool"
239
- >> {
240
- toolCount: number;
241
- tokens: number;
242
- durationMs: number;
243
- }
244
-
245
- // ============================================================================
246
- // Results
247
- // ============================================================================
248
-
249
- export interface ModelAttempt {
250
- accounting?: { state: "complete" | "incomplete"; error?: string };
251
- model: string;
252
- success: boolean;
253
- exitCode?: number | null;
254
- error?: string;
255
- usage?: Usage;
256
- }
257
-
258
- export type AcceptanceProvenanceLevel = "none" | "attested" | "checked" | "verified";
259
-
260
- export type AcceptanceEvidenceKind =
261
- | "changed-files"
262
- | "tests-added"
263
- | "commands-run"
264
- | "validation-output"
265
- | "residual-risks"
266
- | "no-staged-files"
267
- | "diff-summary"
268
- | "review-findings"
269
- | "manual-notes";
270
-
271
- export interface AcceptanceGate {
272
- id: string;
273
- must: string;
274
- evidence?: AcceptanceEvidenceKind[];
275
- severity?: "required" | "recommended";
276
- }
277
-
278
- export interface AcceptanceVerifyCommand {
279
- id: string;
280
- command: string;
281
- timeoutMs?: number;
282
- cwd?: string;
283
- env?: Record<string, string>;
284
- allowFailure?: boolean;
285
- }
286
-
287
- export interface AcceptanceConfig {
288
- criteria?: Array<string | AcceptanceGate>;
289
- evidence?: AcceptanceEvidenceKind[];
290
- verify?: AcceptanceVerifyCommand[];
291
- stopRules?: string[];
292
- maxFinalizationTurns?: number;
293
- }
294
-
295
- export type AcceptanceInput = AcceptanceConfig;
296
-
297
- export interface ResolvedAcceptanceGate extends AcceptanceGate {
298
- id: string;
299
- must: string;
300
- evidence: AcceptanceEvidenceKind[];
301
- severity: "required" | "recommended";
302
- }
303
-
304
- export interface ResolvedAcceptanceConfig {
305
- level: AcceptanceProvenanceLevel;
306
- explicit: boolean;
307
- inferredReason: string[];
308
- criteria: ResolvedAcceptanceGate[];
309
- evidence: AcceptanceEvidenceKind[];
310
- verify: AcceptanceVerifyCommand[];
311
- stopRules: string[];
312
- finalization: {
313
- mode: "none" | "self-review-loop";
314
- maxTurns: number;
315
- };
316
- }
317
-
318
- export interface AcceptanceReport {
319
- criteriaSatisfied?: Array<{
320
- id?: string;
321
- status: "satisfied" | "not-satisfied" | "not-applicable" | "blocked";
322
- evidence: string;
323
- humanAction?: string;
324
- }>;
325
- changedFiles?: string[];
326
- testsAddedOrUpdated?: string[];
327
- commandsRun?: Array<{
328
- command: string;
329
- result: "passed" | "failed" | "not-run";
330
- summary: string;
331
- }>;
332
- validationOutput?: string[];
333
- residualRisks?: string[];
334
- noStagedFiles?: boolean;
335
- diffSummary?: string;
336
- reviewFindings?: Array<string | Record<string, unknown>>;
337
- manualNotes?: string;
338
- notes?: string;
339
- }
340
-
341
- export type AcceptanceRuntimeCheckStatus = "passed" | "failed" | "blocked" | "not-applicable";
342
-
343
- export interface AcceptanceRuntimeCheck {
344
- id: string;
345
- status: AcceptanceRuntimeCheckStatus;
346
- message: string;
347
- }
348
-
349
- export interface AcceptanceVerifyResult {
350
- id: string;
351
- command: string;
352
- cwd?: string;
353
- exitCode: number | null;
354
- status: "passed" | "failed" | "timed-out" | "allowed-failure";
355
- stdout?: string;
356
- stderr?: string;
357
- durationMs: number;
358
- }
359
-
360
- export type AcceptanceLedgerStatus =
361
- | "not-required"
362
- | "claimed"
363
- | "attested"
364
- | "checked"
365
- | "verified"
366
- | "accepted"
367
- | "blocked"
368
- | "rejected";
369
-
370
- export interface AcceptanceFinalizationTurn {
371
- turn: number;
372
- prompt: string;
373
- status: AcceptanceLedgerStatus;
374
- rawOutput?: string;
375
- unconfirmedOutput?: string;
376
- report?: AcceptanceReport;
377
- parseError?: string;
378
- runtimeChecks: AcceptanceRuntimeCheck[];
379
- verifyRuns: AcceptanceVerifyResult[];
380
- failureMessage?: string;
381
- }
382
-
383
- export interface AcceptanceFinalizationLedger {
384
- mode: "self-review-loop";
385
- status: "not-run" | "completed" | "blocked" | "failed";
386
- maxTurns: number;
387
- turns: AcceptanceFinalizationTurn[];
388
- }
389
-
390
- export interface AcceptanceLedger {
391
- status: AcceptanceLedgerStatus;
392
- explicit: boolean;
393
- effectiveAcceptance: ResolvedAcceptanceConfig;
394
- inferredReason: string[];
395
- criteria: ResolvedAcceptanceGate[];
396
- childReport?: AcceptanceReport;
397
- childReportParseError?: string;
398
- initialChildReport?: AcceptanceReport;
399
- initialChildReportParseError?: string;
400
- /** Prior full report retained as audit evidence, never as current acceptance. */
401
- unconfirmedOutput?: string;
402
- runtimeChecks: AcceptanceRuntimeCheck[];
403
- verifyRuns: AcceptanceVerifyResult[];
404
- finalization?: AcceptanceFinalizationLedger;
405
- }
406
-
407
- export interface ResourceLimitExceeded {
408
- kind: "maxExecutionTimeMs" | "maxTokens";
409
- limit: number;
410
- observed?: number;
411
- message: string;
412
- }
413
-
414
- export interface AgentProcessExit {
415
- pid?: number;
416
- code: number | null;
417
- signal: NodeJS.Signals | null;
418
- at: number;
419
- }
420
-
421
- export interface SingleResult {
422
- accounting?: { state: "complete" | "incomplete"; error?: string };
423
- nativeSessionId?: string;
424
- terminalLeafId?: string | null;
425
- terminalEntryId?: string;
426
- auditPath?: string;
427
- fullOutputPath?: string;
428
- initialOutputPath?: string;
429
- auditSaveError?: string;
430
- agent: string;
431
- agentProcessExit?: AgentProcessExit;
432
- task: string;
433
- exitCode: number;
434
- detached?: boolean;
435
- detachedReason?: string;
436
- interrupted?: boolean;
437
- timedOut?: boolean;
438
- resourceLimitExceeded?: ResourceLimitExceeded;
439
- messages?: Message[];
440
- usage: Usage;
441
- model?: string;
442
- attemptedModels?: string[];
443
- modelAttempts?: ModelAttempt[];
444
- controlEvents?: ControlEvent[];
445
- error?: string;
446
- sessionFile?: string;
447
- skills?: string[];
448
- skillsWarning?: string;
449
- progress?: AgentProgress;
450
- progressSummary?: ProgressSummary;
451
- toolCalls?: ToolCallSummary[];
452
- artifactPaths?: ArtifactPaths;
453
- truncation?: TruncationResult;
454
- finalOutput?: string;
455
- initialOutput?: string;
456
- outputMode?: OutputMode;
457
- savedOutputPath?: string;
458
- outputReference?: SavedOutputReference;
459
- outputSaveError?: string;
460
- outputCleanup?: { path: string; action: "deleted" | "already-missing" | "skipped"; reason?: string; error?: string };
461
- structuredOutput?: unknown;
462
- structuredOutputPath?: string;
463
- structuredOutputSchemaPath?: string;
464
- acceptance?: AcceptanceLedger;
465
- }
466
-
467
- export type ManagementRunState = "live" | "completed" | "paused" | "blocked" | "failed" | "unknown";
468
- export type ManagementAction = "status" | "nudge" | "resume" | "interrupt" | "extend" | "review";
469
-
470
- export interface SavedLaunchConfig {
471
- agent: import("../agents/agents.ts").AgentConfig;
472
- model?: string;
473
- thinking?: string;
474
- /** Timestamp of the native model entry captured with this frozen launch. */
475
- modelRecordedAt?: number;
476
- modelCandidates: string[];
477
- artifacts: boolean;
478
- artifactsDir?: string;
479
- share: boolean;
480
- systemPrompt: string;
481
- skills: string[];
482
- cwd: string;
483
- context: "fresh" | "fork";
484
- output: string | false;
485
- /** Proven generated output filename, independent of the selected profile; absent on legacy snapshots. */
486
- generatedOutputFilename?: string;
487
- outputMode: OutputMode;
488
- outputSchema?: JsonSchemaObject;
489
- effectiveAcceptance?: ResolvedAcceptanceConfig;
490
- maxOutput?: MaxOutputConfig;
491
- maxSubagentDepth?: number;
492
- maxExecutionTimeMs?: number;
493
- maxTokens?: number;
494
- controlConfig?: ResolvedControlConfig;
495
- projectTrust?: ChildProjectTrustPolicy;
496
- projectTrusted?: boolean;
497
- }
498
-
499
- export interface ParentRunReview {
500
- decision: "accepted" | "needs_changes";
501
- message?: string;
502
- reviewedAt: number;
503
- }
504
-
505
- export interface OwnedRun {
506
- recoveryError?: string;
507
- runId: string;
508
- ownerSessionId: string;
509
- source: "foreground" | "async";
510
- mode: SubagentRunMode;
511
- cwd: string;
512
- task: string;
513
- startedAt: number;
514
- rootRunId: string;
515
- predecessorRunId?: string;
516
- predecessorIndex?: number;
517
- asyncDir?: string;
518
- pid?: number;
519
- children: Array<{ agent: string; index: number; workflowNodeId?: string; task?: string; label?: string; sessionFile?: string }>;
520
- review?: ParentRunReview;
521
- completion?: { id: string; state: "pending" | "queued" | "dropped" | "journaled"; channel?: "notification" | "intercom"; queuedAt?: number; entryId?: string };
522
- accounting?: { state: "pending" | "complete" | "incomplete"; error?: string };
523
- delivery?: { notifiedAt: number; intercomDelivered: boolean; completionId?: string; entryId?: string };
524
- legacy?: boolean;
525
- error?: string;
526
- }
527
-
528
- export interface OwnedRunView extends OwnedRun {
529
- state: ManagementRunState;
530
- updatedAt: number;
531
- attention: string[];
532
- children: Array<OwnedRun["children"][number] & {
533
- state: ManagementRunState;
534
- result?: Omit<SingleResult, "artifactPaths"> & { artifactPaths?: Partial<ArtifactPaths> };
535
- launch?: SavedLaunchConfig;
536
- configuration: "saved" | "legacy-partial";
537
- missingSession?: boolean;
538
- identityUnavailable?: boolean;
539
- modelSelection?: Pick<AgentProgress, "model" | "thinking" | "modelStartedAt">;
540
- activity?: Partial<Pick<AgentProgress, "status" | "currentTool" | "currentToolArgs" | "currentPath" | "recentOutput" | "lastActivityAt" | "streamingText">>;
541
- }>;
542
- continuations: Array<{ runId: string; predecessorRunId: string; predecessorIndex?: number }>;
543
- resultPath?: string;
544
- canInterrupt: boolean;
545
- diagnosis?: string;
546
- }
547
-
548
- export interface ManagementControl {
549
- state: ManagementRunState;
550
- runId: string;
551
- capabilities: ManagementAction[];
552
- nextActions: Array<{
553
- action: ManagementAction;
554
- runId: string;
555
- index?: number;
556
- intercomTarget?: string;
557
- }>;
558
- unavailableActions?: Partial<Record<ManagementAction, string>>;
559
- revivedFromRunId?: string;
560
- pendingReplyContextValid?: boolean;
561
- }
562
-
563
- export interface Details {
564
- accounting?: { state: "incomplete"; error: string };
565
- mode: SubagentRunMode | "management";
566
- /** A receipt only when persisted on a native tool result with matching top-level usage. */
567
- parentUsage?: { contributions: UsageContribution[] };
568
- runId?: string;
569
- context?: "fresh" | "fork";
570
- results: SingleResult[];
571
- controlEvents?: ControlEvent[];
572
- asyncId?: string;
573
- asyncDir?: string;
574
- asyncPid?: number;
575
- shareUrl?: string;
576
- gistUrl?: string;
577
- shareError?: string;
578
- progress?: AgentProgress[];
579
- progressSummary?: ProgressSummary;
580
- intercomTargets?: string[];
581
- managementControl?: ManagementControl;
582
- managementControls?: ManagementControl[];
583
- questions?: import("../runs/shared/supervisor-questions.ts").SupervisorQuestionSummary[];
584
- questionList?: { total: number; offset: number; limit: number; nextOffset?: number };
585
- wait?: { runId: string; completionId?: string; index?: number; status: "completed" | "cancelled" | "yielded" | "awaiting_input" | "unavailable" };
586
- run?: OwnedRunView;
587
- runs?: Array<Pick<OwnedRunView, "runId" | "source" | "mode" | "cwd" | "task" | "state" | "updatedAt" | "attention" | "review" | "rootRunId" | "predecessorRunId" | "predecessorIndex"> & { summary?: string; continuations?: string[] }>;
588
- runList?: { total: number; offset: number; limit: number; nextOffset?: number; nextCursor?: string; version: number; freshness: import("../history/types.ts").HistoryFreshness };
589
- history?: import("../history/types.ts").HistoryPage;
590
- historySearch?: import("../history/types.ts").HistorySearchPage;
591
- intercomDelivery?: {
592
- delivered: boolean;
593
- to: string;
594
- status: SubagentResultStatus;
595
- summary: string;
596
- };
597
- artifacts?: {
598
- dir: string;
599
- files: ArtifactPaths[];
600
- };
601
- truncation?: {
602
- truncated: boolean;
603
- originalBytes?: number;
604
- originalLines?: number;
605
- artifactPath?: string;
606
- };
607
- // Chain metadata for observability
608
- chainAgents?: string[]; // Agent names in order, e.g., ["scout", "planner"]
609
- totalSteps?: number; // Total steps in chain
610
- currentStepIndex?: number; // 0-indexed current step (for running chains)
611
- workflowGraph?: WorkflowGraphSnapshot;
612
- outputs?: ChainOutputMap;
613
- }
614
-
615
- export type SubagentExecutionResult = AgentToolResult<Details> & {
616
- /** Executor error marker; registered tools transfer it through Pi's native tool_result hook. */
617
- isError?: boolean;
618
- };
619
-
620
- // ============================================================================
621
- // Artifacts
622
- // ============================================================================
623
-
624
- export interface ArtifactPaths {
625
- inputPath: string;
626
- outputPath: string;
627
- metadataPath: string;
628
- }
629
-
630
- // ============================================================================
631
- // Async Execution
632
- // ============================================================================
633
-
634
- export interface AsyncParallelGroupStatus {
635
- start: number;
636
- count: number;
637
- stepIndex: number;
638
- }
639
-
640
- export type AsyncResultTerminalState = "complete" | "failed" | "blocked" | "paused";
641
-
642
- export interface AsyncResultChild extends Partial<Pick<SingleResult,
643
- "task" | "finalOutput" | "initialOutput" | "outputMode" | "savedOutputPath" | "outputReference" | "outputSaveError" | "outputCleanup"
644
- | "toolCalls" | "progressSummary" | "truncation" | "skills" | "skillsWarning" | "accounting" | "nativeSessionId" | "terminalLeafId" | "terminalEntryId" | "auditPath" | "auditSaveError" | "fullOutputPath" | "initialOutputPath"
645
- >> {
646
- usage?: Usage;
647
- timedOut?: boolean;
648
- agent?: string;
649
- agentProcessExit?: AgentProcessExit;
650
- exitCode?: number | null;
651
- output?: string;
652
- error?: string;
653
- success?: boolean;
654
- skipped?: boolean;
655
- sessionFile?: string;
656
- intercomTarget?: string;
657
- model?: string;
658
- attemptedModels?: string[];
659
- modelAttempts?: ModelAttempt[];
660
- artifactPaths?: Partial<ArtifactPaths>;
661
- truncated?: boolean;
662
- structuredOutput?: unknown;
663
- structuredOutputPath?: string;
664
- structuredOutputSchemaPath?: string;
665
- acceptance?: AcceptanceLedger;
666
- resourceLimitExceeded?: ResourceLimitExceeded;
667
- interrupted?: boolean;
668
- children?: unknown;
669
- }
670
-
671
- export interface AsyncResultFile {
672
- legacySource?: string;
673
- recordVersion?: 3;
674
- completionId?: string;
675
- maxOutput?: MaxOutputConfig;
676
- error?: string;
677
- runtimeVersion?: 2;
678
- timedOut?: boolean;
679
- id?: string;
680
- runId?: string;
681
- agent?: string;
682
- mode?: SubagentRunMode;
683
- success?: boolean;
684
- state?: string;
685
- summary?: string;
686
- results?: AsyncResultChild[];
687
- outputs?: ChainOutputMap;
688
- workflowGraph?: WorkflowGraphSnapshot;
689
- exitCode?: number;
690
- timestamp?: number;
691
- durationMs?: number;
692
- truncated?: boolean;
693
- artifactsDir?: string;
694
- cwd?: string;
695
- asyncDir?: string;
696
- sessionId?: string;
697
- sessionFile?: string;
698
- intercomTarget?: string;
699
- shareUrl?: string;
700
- gistUrl?: string;
701
- shareError?: string;
702
- taskIndex?: number;
703
- totalTasks?: number;
704
- nestedChildren?: unknown;
705
- }
706
-
707
- export type NestedRunState = "queued" | "running" | "complete" | "failed" | "blocked" | "paused";
708
- export type NestedOwnerState = "live" | "gone" | "unknown";
709
-
710
- export interface NestedRunAddress {
711
- id: string;
712
- parentRunId: string;
713
- parentStepIndex?: number;
714
- parentAgent?: string;
715
- depth: number;
716
- path: Array<{ runId: string; stepIndex?: number; agent?: string }>;
717
- }
718
-
719
- export interface NestedStepSummary {
720
- agent: string;
721
- status: "pending" | "running" | "complete" | "completed" | "failed" | "blocked" | "paused" | "timed-out";
722
- sessionFile?: string;
723
- activityState?: ActivityState;
724
- lastActivityAt?: number;
725
- currentTool?: string;
726
- currentToolStartedAt?: number;
727
- currentPath?: string;
728
- turnCount?: number;
729
- toolCount?: number;
730
- startedAt?: number;
731
- endedAt?: number;
732
- error?: string;
733
- children?: NestedRunSummary[];
734
- }
735
-
736
- export interface NestedRunSummary extends NestedRunAddress {
737
- indexedControl?: boolean;
738
- asyncDir?: string;
739
- pid?: number;
740
- sessionId?: string;
741
- sessionFile?: string;
742
- intercomTarget?: string;
743
- ownerIntercomTarget?: string;
744
- leafIntercomTarget?: string;
745
- ownerState?: NestedOwnerState;
746
- controlInbox?: string;
747
- capabilityToken?: string;
748
- mode?: SubagentRunMode;
749
- state: NestedRunState;
750
- agent?: string;
751
- agents?: string[];
752
- currentStep?: number;
753
- chainStepCount?: number;
754
- parallelGroups?: AsyncParallelGroupStatus[];
755
- steps?: NestedStepSummary[];
756
- children?: NestedRunSummary[];
757
- activityState?: ActivityState;
758
- lastActivityAt?: number;
759
- currentTool?: string;
760
- currentToolStartedAt?: number;
761
- currentPath?: string;
762
- turnCount?: number;
763
- toolCount?: number;
764
- totalTokens?: TokenUsage;
765
- startedAt?: number;
766
- endedAt?: number;
767
- lastUpdate?: number;
768
- error?: string;
769
- }
770
-
771
- export interface NestedRouteInfo {
772
- rootRunId: string;
773
- eventSink: string;
774
- controlInbox: string;
775
- capabilityToken: string;
776
- }
777
-
778
- export interface AsyncStartedEvent {
779
- id?: string;
780
- asyncDir?: string;
781
- pid?: number;
782
- sessionId?: string;
783
- mode?: SubagentRunMode;
784
- agent?: string;
785
- agents?: string[];
786
- chain?: string[];
787
- chainStepCount?: number;
788
- parallelGroups?: AsyncParallelGroupStatus[];
789
- workflowGraph?: WorkflowGraphSnapshot;
790
- nestedRoute?: NestedRouteInfo;
791
- }
792
-
793
- export interface AsyncStatus {
794
- runtimeVersion?: 2;
795
- error?: string;
796
- timeoutAt?: number;
797
- timedOut?: boolean;
798
- runId: string;
799
- indexedControl?: boolean;
800
- controlRequestFiles?: boolean;
801
- sessionId?: string;
802
- mode: SubagentRunMode;
803
- state: "queued" | "running" | "complete" | "failed" | "blocked" | "paused";
804
- activityState?: ActivityState;
805
- lastActivityAt?: number;
806
- currentTool?: string;
807
- currentToolStartedAt?: number;
808
- currentPath?: string;
809
- turnCount?: number;
810
- toolCount?: number;
811
- startedAt: number;
812
- endedAt?: number;
813
- lastUpdate?: number;
814
- pid?: number;
815
- cwd?: string;
816
- currentStep?: number;
817
- chainStepCount?: number;
818
- parallelGroups?: AsyncParallelGroupStatus[];
819
- workflowGraph?: WorkflowGraphSnapshot;
820
- steps?: Array<{
821
- agent: string;
822
- phase?: string;
823
- label?: string;
824
- outputName?: string;
825
- structured?: boolean;
826
- status: "pending" | "running" | "complete" | "completed" | "failed" | "blocked" | "paused" | "timed-out";
827
- children?: NestedRunSummary[];
828
- sessionFile?: string;
829
- activityState?: ActivityState;
830
- lastActivityAt?: number;
831
- currentTool?: string;
832
- currentToolArgs?: string;
833
- streamingText?: string;
834
- currentToolStartedAt?: number;
835
- currentPath?: string;
836
- recentTools?: Array<{ tool: string; args: string; endMs: number }>;
837
- recentOutput?: string[];
838
- turnCount?: number;
839
- toolCount?: number;
840
- startedAt?: number;
841
- endedAt?: number;
842
- durationMs?: number;
843
- exitCode?: number | null;
844
- agentProcessExit?: AgentProcessExit;
845
- tokens?: TokenUsage;
846
- skills?: string[];
847
- model?: string;
848
- thinking?: string;
849
- modelStartedAt?: number;
850
- attemptedModels?: string[];
851
- modelAttempts?: ModelAttempt[];
852
- error?: string;
853
- structuredOutput?: unknown;
854
- structuredOutputPath?: string;
855
- structuredOutputSchemaPath?: string;
856
- acceptance?: AcceptanceLedger;
857
- resourceLimitExceeded?: ResourceLimitExceeded;
858
- }>;
859
- sessionDir?: string;
860
- outputFile?: string;
861
- totalTokens?: TokenUsage;
862
- sessionFile?: string;
863
- outputs?: ChainOutputMap;
864
- }
865
-
866
- export type AsyncJobStep = NonNullable<AsyncStatus["steps"]>[number] & {
867
- index?: number;
868
- };
869
-
870
- export interface AsyncJobState {
871
- asyncId: string;
872
- asyncDir: string;
873
- status: "queued" | "running" | "complete" | "failed" | "blocked" | "paused";
874
- pid?: number;
875
- sessionId?: string;
876
- activityState?: ActivityState;
877
- lastActivityAt?: number;
878
- currentTool?: string;
879
- currentToolStartedAt?: number;
880
- currentPath?: string;
881
- turnCount?: number;
882
- toolCount?: number;
883
- mode?: SubagentRunMode;
884
- agents?: string[];
885
- currentStep?: number;
886
- chainStepCount?: number;
887
- parallelGroups?: AsyncParallelGroupStatus[];
888
- steps?: AsyncJobStep[];
889
- stepsTotal?: number;
890
- runningSteps?: number;
891
- completedSteps?: number;
892
- activeParallelGroup?: boolean;
893
- startedAt?: number;
894
- updatedAt?: number;
895
- totalTokens?: TokenUsage;
896
- sessionFile?: string;
897
- controlEventCursor?: number;
898
- controlEventIdentity?: string;
899
- controlEventSince?: number;
900
- nestedRoute?: NestedRouteInfo;
901
- nestedChildren?: NestedRunSummary[];
902
- }
903
-
904
- export interface ForegroundResumeChild {
905
- agent: string;
906
- index: number;
907
- sessionFile?: string;
908
- status: SubagentResultStatus;
909
- summary?: string;
910
- artifactPath?: string;
911
- effectiveAcceptance?: ResolvedAcceptanceConfig;
912
- result?: SingleResult;
913
- }
914
-
915
- export interface ForegroundResumeRun {
916
- runId: string;
917
- mode: SubagentRunMode;
918
- cwd: string;
919
- updatedAt: number;
920
- error?: string;
921
- /** Logical work left after detachment, independent of child success. */
922
- pausedReason?: string;
923
- children: ForegroundResumeChild[];
924
- }
925
-
926
- export interface TimeoutExtensionResult {
927
- ok: boolean;
928
- timeoutAt?: number;
929
- message: string;
930
- }
931
-
932
- export type TimeoutExtensionCallback = (additionalMs: number) => TimeoutExtensionResult;
933
-
934
- export interface SubagentState {
935
- baseCwd: string;
936
- currentSessionId: string | null;
937
- asyncJobs: Map<string, AsyncJobState>;
938
- waitingRuns?: Map<string, number>;
939
- isRunResultConsumed?: (runId: string) => boolean;
940
- foregroundRuns?: Map<string, ForegroundResumeRun>;
941
- ownedRuns?: Map<string, OwnedRun>;
942
- historyIndex?: SubagentHistoryIndex;
943
- historyReady?: Promise<void>;
944
- historyClosing?: Promise<void>;
945
- persistOwnedRun?: (run: OwnedRun) => void;
946
- onRunsChanged?: () => void;
947
- cleanupTimers: Map<string, ReturnType<typeof setTimeout>>;
948
- lastUiContext: ExtensionContext | null;
949
- poller: NodeJS.Timeout | null;
950
- completionSeen: Map<string, number>;
951
- watcher: FSWatcher | null;
952
- watcherRestartTimer: ReturnType<typeof setTimeout> | null;
953
- resultFileCoalescer: {
954
- schedule(file: string, delayMs?: number): boolean;
955
- clear(): void;
956
- };
957
- }
958
-
959
- // ============================================================================
960
- // Display
961
- // ============================================================================
962
-
963
- export type DisplayItem =
964
- | { type: "text"; text: string }
965
- | { type: "tool"; name: string; args: Record<string, unknown> };
966
-
967
- // ============================================================================
968
- // Error Handling
969
- // ============================================================================
970
-
971
- export interface ErrorInfo {
972
- hasError: boolean;
973
- exitCode?: number;
974
- errorType?: string;
975
- details?: string;
976
- }
977
-
978
- export interface IntercomEventBus {
979
- on(channel: string, handler: (data: unknown) => void): () => void;
980
- emit(channel: string, data: unknown): void;
981
- }
4
+ import type { MaxOutputConfig } from "./types/config.ts";
5
+ import type { TruncationResult } from "./types/results.ts";
6
+
7
+ export type * from "./types/inputs.ts";
8
+ export type * from "./types/config.ts";
9
+ export type * from "./types/acceptance.ts";
10
+ export type * from "./types/launch.ts";
11
+ export type * from "./types/workflow.ts";
12
+ export type * from "./types/messages.ts";
13
+ export type * from "./types/usage.ts";
14
+ export type * from "./types/progress.ts";
15
+ export type * from "./types/results.ts";
16
+ export type * from "./types/nested.ts";
17
+ export type * from "./types/owned-runs.ts";
18
+ export type * from "./types/async.ts";
19
+ export type * from "./types/questions.ts";
20
+ export type * from "./types/history.ts";
21
+ export type * from "./types/state.ts";
22
+ export type * from "./types/details.ts";
23
+ export type * from "./types/intercom.ts";
982
24
 
983
25
  export const INTERCOM_DETACH_REQUEST_EVENT = "pi-intercom:detach-request";
984
26
  export const INTERCOM_DETACH_RESPONSE_EVENT = "pi-intercom:detach-response";
@@ -995,114 +37,77 @@ export const SUBAGENT_INTERCOM_HEALTH_RESPONSE_EVENT = "subagent:intercom-health
995
37
  export const SUBAGENT_INTERCOM_IDENTITY_REQUEST_EVENT = "subagent:intercom-identity-request";
996
38
  export const SUBAGENT_INTERCOM_IDENTITY_RESPONSE_EVENT = "subagent:intercom-identity-response";
997
39
 
998
- export interface SubagentIntercomConnection {
999
- status: "connected" | "disconnected" | "connecting" | "unknown";
1000
- sessionId?: string;
1001
- reason?: string;
1002
- }
1003
-
1004
- export interface SubagentLiveIntercomHealth {
1005
- target: string;
1006
- status: "registered" | "none" | "missing" | "ambiguous" | "prefix_too_short";
1007
- sessionId?: string;
1008
- sessionName?: string;
1009
- sessionStatus?: string;
1010
- acceptsAsks?: boolean;
1011
- pendingAsks?: number;
1012
- }
1013
-
1014
- // ============================================================================
1015
- // Execution Options
1016
- // ============================================================================
1017
-
1018
- export type ChildProjectTrustPolicy = "inherit" | "approve" | "no-approve";
1019
-
1020
- export interface ProjectTrustConfig {
1021
- childRuns?: ChildProjectTrustPolicy;
1022
- }
1023
-
1024
- interface TopLevelParallelConfig {
1025
- maxTasks?: number;
1026
- concurrency?: number;
1027
- }
1028
-
1029
- interface ExtensionChainConfig {
1030
- dynamicFanout?: {
1031
- maxItems?: number;
1032
- };
1033
- }
1034
-
1035
- export interface ExtensionConfig {
1036
- /** Start authorized children with everyday tools; false restores the full subagent-only surface. */
1037
- compactChildTools?: boolean;
1038
- asyncByDefault?: boolean;
1039
- forceTopLevelAsync?: boolean;
1040
- defaultSessionDir?: string;
1041
- maxSubagentDepth?: number;
1042
- control?: ControlConfig;
1043
- parallel?: TopLevelParallelConfig;
1044
- chain?: ExtensionChainConfig;
1045
- worktreeSetupHook?: string;
1046
- worktreeSetupHookTimeoutMs?: number;
1047
- projectTrust?: ChildProjectTrustPolicy | ProjectTrustConfig;
1048
- }
1049
-
1050
- // ============================================================================
1051
40
  // Constants
1052
41
  // ============================================================================
1053
42
 
1054
43
  export const DEFAULT_MAX_OUTPUT: Required<MaxOutputConfig> = {
1055
- bytes: 200 * 1024,
1056
- lines: 5000,
44
+ bytes: 200 * 1024,
45
+ lines: 5000,
1057
46
  };
1058
47
 
1059
48
  function sanitizeTempScopeSegment(value: string): string {
1060
- const sanitized = value
1061
- .trim()
1062
- .replace(/[^A-Za-z0-9._-]+/g, "-")
1063
- .replace(/^-+|-+$/g, "");
1064
- return sanitized || "unknown";
49
+ const sanitized = value
50
+ .trim()
51
+ .replace(/[^A-Za-z0-9._-]+/g, "-")
52
+ .replace(/^-+|-+$/g, "");
53
+ return sanitized.length > 0 ? sanitized : "unknown";
1065
54
  }
1066
55
 
1067
56
  export function resolveTempScopeId(): string {
1068
- if (typeof process.getuid === "function") return `uid-${process.getuid()}`;
1069
-
1070
- for (const key of ["USERNAME", "USER", "LOGNAME"] as const) {
1071
- const value = process.env[key];
1072
- if (value) return `user-${sanitizeTempScopeSegment(value)}`;
1073
- }
1074
-
1075
- try {
1076
- const username = os.userInfo().username;
1077
- if (username) return `user-${sanitizeTempScopeSegment(username)}`;
1078
- } catch {
1079
- // Fall through to home-directory-based scoping.
1080
- }
1081
-
1082
- const homedir = process.env.HOME;
1083
- if (homedir) return `home-${sanitizeTempScopeSegment(homedir)}`;
1084
-
1085
- try {
1086
- const fallbackHomedir = os.homedir();
1087
- if (fallbackHomedir) return `home-${sanitizeTempScopeSegment(fallbackHomedir)}`;
1088
- } catch {
1089
- // Fall through to the last-resort shared scope.
1090
- }
1091
-
1092
- return "shared";
57
+ if (typeof process.getuid === "function") {
58
+ return `uid-${process.getuid()}`;
59
+ }
60
+
61
+ for (const key of ["USERNAME", "USER", "LOGNAME"] as const) {
62
+ const value = process.env[key];
63
+ if (value !== undefined && value.length > 0) {
64
+ return `user-${sanitizeTempScopeSegment(value)}`;
65
+ }
66
+ }
67
+
68
+ try {
69
+ const username = os.userInfo().username;
70
+ if (username.length > 0) {
71
+ return `user-${sanitizeTempScopeSegment(username)}`;
72
+ }
73
+ } catch {
74
+ // Fall through to home-directory-based scoping.
75
+ }
76
+
77
+ return resolveHomeTempScopeId();
78
+ }
79
+
80
+ function resolveHomeTempScopeId(): string {
81
+ const homedir = process.env.HOME;
82
+ if (homedir !== undefined && homedir.length > 0) {
83
+ return `home-${sanitizeTempScopeSegment(homedir)}`;
84
+ }
85
+
86
+ try {
87
+ const fallbackHomedir = os.homedir();
88
+ if (fallbackHomedir.length > 0) {
89
+ return `home-${sanitizeTempScopeSegment(fallbackHomedir)}`;
90
+ }
91
+ } catch {
92
+ // Fall through to the last-resort shared scope.
93
+ }
94
+
95
+ return "shared";
1093
96
  }
1094
97
 
1095
98
  const MAX_PARALLEL = 8;
1096
99
  export const MAX_CONCURRENCY = 4;
1097
100
 
1098
101
  export function resolveTempRootDir(configured = process.env.PI_SUBAGENT_TEMP_ROOT): string {
1099
- const fallback = path.join(os.tmpdir(), `pi-subagents-${resolveTempScopeId()}`);
1100
- if (!configured?.trim()) return fallback;
1101
- const resolved = path.resolve(configured);
1102
- if (!path.basename(resolved).startsWith("pi-subagents-")) {
1103
- throw new Error("PI_SUBAGENT_TEMP_ROOT must name a dedicated 'pi-subagents-*' directory.");
1104
- }
1105
- return resolved;
102
+ const fallback = path.join(os.tmpdir(), `pi-subagents-${resolveTempScopeId()}`);
103
+ if (configured === undefined || configured.trim().length === 0) {
104
+ return fallback;
105
+ }
106
+ const resolved = path.resolve(configured);
107
+ if (!path.basename(resolved).startsWith("pi-subagents-")) {
108
+ throw new Error("PI_SUBAGENT_TEMP_ROOT must name a dedicated 'pi-subagents-*' directory.");
109
+ }
110
+ return resolved;
1106
111
  }
1107
112
 
1108
113
  export const TEMP_ROOT_DIR = resolveTempRootDir();
@@ -1121,43 +126,73 @@ export const SLASH_SUBAGENT_CANCEL_EVENT = "subagent:slash:cancel";
1121
126
  export const POLL_INTERVAL_MS = 1000;
1122
127
  export const MAX_WIDGET_JOBS = 4;
1123
128
  export const DEFAULT_SUBAGENT_MAX_DEPTH = 1;
1124
- export const SUBAGENT_ACTIONS = ["list", "get", "create", "update", "delete", "status", "history", "search", "interrupt", "extend", "resume", "nudge", "questions", "answer", "review", "doctor"] as const;
129
+ export const SUBAGENT_ACTIONS = [
130
+ "list",
131
+ "get",
132
+ "create",
133
+ "update",
134
+ "delete",
135
+ "status",
136
+ "history",
137
+ "search",
138
+ "interrupt",
139
+ "extend",
140
+ "resume",
141
+ "nudge",
142
+ "questions",
143
+ "answer",
144
+ "review",
145
+ "doctor",
146
+ ] as const;
1125
147
 
1126
148
  export const DEFAULT_FORK_PREAMBLE =
1127
- "You are a delegated subagent running from a fork of the parent session. " +
1128
- "Treat the inherited conversation as reference-only context, not a live thread to continue. " +
1129
- "Do not continue or answer prior messages as if they are waiting for a reply. " +
1130
- "Your sole job is to execute the task below and return a focused result for that task using your tools.";
149
+ "You are a delegated subagent running from a fork of the parent session. " +
150
+ "Treat the inherited conversation as reference-only context, not a live thread to continue. " +
151
+ "Do not continue or answer prior messages as if they are waiting for a reply. " +
152
+ "Your sole job is to execute the task below and return a focused result for that task using your tools.";
1131
153
 
1132
154
  function normalizeTopLevelParallelValue(value: unknown): number | undefined {
1133
- const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
1134
- if (!Number.isInteger(parsed) || parsed < 1) return undefined;
1135
- return parsed;
155
+ let parsed = NaN;
156
+ if (typeof value === "number") {
157
+ parsed = value;
158
+ } else if (typeof value === "string") {
159
+ parsed = Number(value);
160
+ }
161
+ if (!Number.isInteger(parsed) || parsed < 1) {
162
+ return undefined;
163
+ }
164
+ return parsed;
1136
165
  }
1137
166
 
1138
167
  export function resolveTopLevelParallelMaxTasks(value: unknown): number {
1139
- return normalizeTopLevelParallelValue(value) ?? MAX_PARALLEL;
168
+ return normalizeTopLevelParallelValue(value) ?? MAX_PARALLEL;
1140
169
  }
1141
170
 
1142
171
  export function resolveTopLevelParallelConcurrency(
1143
- override: unknown,
1144
- configValue: unknown,
172
+ override: unknown,
173
+ configValue: unknown,
1145
174
  ): number {
1146
- return normalizeTopLevelParallelValue(override)
1147
- ?? normalizeTopLevelParallelValue(configValue)
1148
- ?? MAX_CONCURRENCY;
175
+ return (
176
+ normalizeTopLevelParallelValue(override) ??
177
+ normalizeTopLevelParallelValue(configValue) ??
178
+ MAX_CONCURRENCY
179
+ );
1149
180
  }
1150
181
 
1151
182
  export function getAsyncConfigPath(suffix: string): string {
1152
- return path.join(TEMP_ROOT_DIR, `async-cfg-${suffix}.json`);
183
+ return path.join(TEMP_ROOT_DIR, `async-cfg-${suffix}.json`);
1153
184
  }
1154
185
 
1155
186
  export function wrapForkTask(task: string, preamble?: string | false): string {
1156
- if (preamble === false) return task;
1157
- const effectivePreamble = preamble ?? DEFAULT_FORK_PREAMBLE;
1158
- const wrappedPrefix = `${effectivePreamble}\n\nTask:\n`;
1159
- if (task.startsWith(wrappedPrefix)) return task;
1160
- return `${wrappedPrefix}${task}`;
187
+ if (preamble === false) {
188
+ return task;
189
+ }
190
+ const effectivePreamble = preamble ?? DEFAULT_FORK_PREAMBLE;
191
+ const wrappedPrefix = `${effectivePreamble}\n\nTask:\n`;
192
+ if (task.startsWith(wrappedPrefix)) {
193
+ return task;
194
+ }
195
+ return `${wrappedPrefix}${task}`;
1161
196
  }
1162
197
 
1163
198
  // ============================================================================
@@ -1165,44 +200,66 @@ export function wrapForkTask(task: string, preamble?: string | false): string {
1165
200
  // ============================================================================
1166
201
 
1167
202
  export function normalizeMaxSubagentDepth(value: unknown): number | undefined {
1168
- const parsed = typeof value === "number" ? value : typeof value === "string" ? Number(value) : NaN;
1169
- if (!Number.isInteger(parsed) || parsed < 0) return undefined;
1170
- return parsed;
203
+ let parsed = NaN;
204
+ if (typeof value === "number") {
205
+ parsed = value;
206
+ } else if (typeof value === "string") {
207
+ parsed = Number(value);
208
+ }
209
+ if (!Number.isInteger(parsed) || parsed < 0) {
210
+ return undefined;
211
+ }
212
+ return parsed;
1171
213
  }
1172
214
 
1173
215
  export function resolveCurrentMaxSubagentDepth(configMaxDepth?: number): number {
1174
- return normalizeMaxSubagentDepth(process.env.PI_SUBAGENT_MAX_DEPTH)
1175
- ?? normalizeMaxSubagentDepth(configMaxDepth)
1176
- ?? DEFAULT_SUBAGENT_MAX_DEPTH;
216
+ return (
217
+ normalizeMaxSubagentDepth(process.env.PI_SUBAGENT_MAX_DEPTH) ??
218
+ normalizeMaxSubagentDepth(configMaxDepth) ??
219
+ DEFAULT_SUBAGENT_MAX_DEPTH
220
+ );
1177
221
  }
1178
222
 
1179
- export function resolveChildMaxSubagentDepth(parentMaxDepth: number, agentMaxDepth?: number): number {
1180
- const normalizedParent = normalizeMaxSubagentDepth(parentMaxDepth) ?? DEFAULT_SUBAGENT_MAX_DEPTH;
1181
- const normalizedAgent = normalizeMaxSubagentDepth(agentMaxDepth);
1182
- return normalizedAgent === undefined ? normalizedParent : Math.min(normalizedParent, normalizedAgent);
223
+ export function resolveChildMaxSubagentDepth(
224
+ parentMaxDepth: number,
225
+ agentMaxDepth?: number,
226
+ ): number {
227
+ const normalizedParent = normalizeMaxSubagentDepth(parentMaxDepth) ?? DEFAULT_SUBAGENT_MAX_DEPTH;
228
+ const normalizedAgent = normalizeMaxSubagentDepth(agentMaxDepth);
229
+ return normalizedAgent === undefined
230
+ ? normalizedParent
231
+ : Math.min(normalizedParent, normalizedAgent);
1183
232
  }
1184
233
 
1185
234
  function parseSubagentDepth(value: unknown): number | undefined {
1186
- if (value === undefined || value === null || value === "") return 0;
1187
- const depth = Number(value);
1188
- return Number.isInteger(depth) && depth >= 0 ? depth : undefined;
1189
- }
1190
-
1191
- export function checkSubagentDepth(configMaxDepth?: number): { blocked: boolean; depth: number; maxDepth: number } {
1192
- const maxDepth = resolveCurrentMaxSubagentDepth(configMaxDepth);
1193
- const depth = parseSubagentDepth(process.env.PI_SUBAGENT_DEPTH);
1194
- if (depth === undefined) return { blocked: true, depth: maxDepth, maxDepth };
1195
- return { blocked: depth >= maxDepth, depth, maxDepth };
235
+ if (value === undefined || value === null || value === "") {
236
+ return 0;
237
+ }
238
+ const depth = Number(value);
239
+ return Number.isInteger(depth) && depth >= 0 ? depth : undefined;
240
+ }
241
+
242
+ export function checkSubagentDepth(configMaxDepth?: number): {
243
+ blocked: boolean;
244
+ depth: number;
245
+ maxDepth: number;
246
+ } {
247
+ const maxDepth = resolveCurrentMaxSubagentDepth(configMaxDepth);
248
+ const depth = parseSubagentDepth(process.env.PI_SUBAGENT_DEPTH);
249
+ if (depth === undefined) {
250
+ return { blocked: true, depth: maxDepth, maxDepth };
251
+ }
252
+ return { blocked: depth >= maxDepth, depth, maxDepth };
1196
253
  }
1197
254
 
1198
255
  export function getSubagentDepthEnv(maxDepth?: number): Record<string, string> {
1199
- const childMaxDepth = normalizeMaxSubagentDepth(maxDepth) ?? resolveCurrentMaxSubagentDepth();
1200
- const parentDepth = parseSubagentDepth(process.env.PI_SUBAGENT_DEPTH);
1201
- const nextDepth = parentDepth === undefined ? childMaxDepth : parentDepth + 1;
1202
- return {
1203
- PI_SUBAGENT_DEPTH: String(nextDepth),
1204
- PI_SUBAGENT_MAX_DEPTH: String(childMaxDepth),
1205
- };
256
+ const childMaxDepth = normalizeMaxSubagentDepth(maxDepth) ?? resolveCurrentMaxSubagentDepth();
257
+ const parentDepth = parseSubagentDepth(process.env.PI_SUBAGENT_DEPTH);
258
+ const nextDepth = parentDepth === undefined ? childMaxDepth : parentDepth + 1;
259
+ return {
260
+ PI_SUBAGENT_DEPTH: String(nextDepth),
261
+ PI_SUBAGENT_MAX_DEPTH: String(childMaxDepth),
262
+ };
1206
263
  }
1207
264
 
1208
265
  // ============================================================================
@@ -1210,51 +267,55 @@ export function getSubagentDepthEnv(maxDepth?: number): Record<string, string> {
1210
267
  // ============================================================================
1211
268
 
1212
269
  function formatBytes(bytes: number): string {
1213
- if (bytes < 1024) return `${bytes}B`;
1214
- if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)}KB`;
1215
- return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
270
+ if (bytes < 1024) {
271
+ return `${bytes}B`;
272
+ }
273
+ if (bytes < 1024 * 1024) {
274
+ return `${(bytes / 1024).toFixed(1)}KB`;
275
+ }
276
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
1216
277
  }
1217
278
 
1218
279
  export function truncateOutput(
1219
- output: string,
1220
- config: Required<MaxOutputConfig>,
1221
- artifactPath?: string,
280
+ output: string,
281
+ config: Required<MaxOutputConfig>,
282
+ artifactPath?: string,
1222
283
  ): TruncationResult {
1223
- const lines = output.split("\n");
1224
- const bytes = Buffer.byteLength(output, "utf-8");
1225
-
1226
- if (bytes <= config.bytes && lines.length <= config.lines) {
1227
- return { text: output, truncated: false };
1228
- }
1229
-
1230
- let truncatedLines = lines;
1231
- if (lines.length > config.lines) {
1232
- truncatedLines = lines.slice(0, config.lines);
1233
- }
1234
-
1235
- let result = truncatedLines.join("\n");
1236
- if (Buffer.byteLength(result, "utf-8") > config.bytes) {
1237
- let low = 0;
1238
- let high = result.length;
1239
- while (low < high) {
1240
- const mid = Math.floor((low + high + 1) / 2);
1241
- if (Buffer.byteLength(result.slice(0, mid), "utf-8") <= config.bytes) {
1242
- low = mid;
1243
- } else {
1244
- high = mid - 1;
1245
- }
1246
- }
1247
- result = result.slice(0, low);
1248
- }
1249
-
1250
- const keptLines = result.split("\n").length;
1251
- const marker = `[TRUNCATED: showing first ${keptLines} of ${lines.length} lines, ${formatBytes(Buffer.byteLength(result))} of ${formatBytes(bytes)}${artifactPath ? ` - full output at ${artifactPath}` : ""}]\n`;
1252
-
1253
- return {
1254
- text: marker + result,
1255
- truncated: true,
1256
- originalBytes: bytes,
1257
- originalLines: lines.length,
1258
- artifactPath,
1259
- };
284
+ const lines = output.split("\n");
285
+ const bytes = Buffer.byteLength(output, "utf-8");
286
+
287
+ if (bytes <= config.bytes && lines.length <= config.lines) {
288
+ return { text: output, truncated: false };
289
+ }
290
+
291
+ let truncatedLines = lines;
292
+ if (lines.length > config.lines) {
293
+ truncatedLines = lines.slice(0, config.lines);
294
+ }
295
+
296
+ let result = truncatedLines.join("\n");
297
+ if (Buffer.byteLength(result, "utf-8") > config.bytes) {
298
+ let low = 0;
299
+ let high = result.length;
300
+ while (low < high) {
301
+ const mid = Math.floor((low + high + 1) / 2);
302
+ if (Buffer.byteLength(result.slice(0, mid), "utf-8") <= config.bytes) {
303
+ low = mid;
304
+ } else {
305
+ high = mid - 1;
306
+ }
307
+ }
308
+ result = result.slice(0, low);
309
+ }
310
+
311
+ const keptLines = result.split("\n").length;
312
+ const marker = `[TRUNCATED: showing first ${keptLines} of ${lines.length} lines, ${formatBytes(Buffer.byteLength(result))} of ${formatBytes(bytes)}${artifactPath !== undefined && artifactPath.length > 0 ? ` - full output at ${artifactPath}` : ""}]\n`;
313
+
314
+ return {
315
+ text: marker + result,
316
+ truncated: true,
317
+ originalBytes: bytes,
318
+ originalLines: lines.length,
319
+ artifactPath,
320
+ };
1260
321
  }