@fitchmultz/pi-subagents 0.44.6 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (947) hide show
  1. package/CHANGELOG.md +265 -7
  2. package/LICENSE +1 -0
  3. package/README.md +58 -1483
  4. package/agents/context-builder.md +19 -1
  5. package/agents/debugger.md +10 -3
  6. package/agents/delegate.md +1 -0
  7. package/agents/fixer.md +4 -1
  8. package/agents/oracle.md +13 -2
  9. package/agents/planner.md +14 -3
  10. package/agents/researcher.md +11 -2
  11. package/agents/reviewer-claude.md +11 -2
  12. package/agents/reviewer-gpt.md +12 -2
  13. package/agents/reviewer-ponytail.md +11 -1
  14. package/agents/reviewer-security.md +13 -2
  15. package/agents/reviewer.md +12 -3
  16. package/agents/scout.md +12 -1
  17. package/agents/ui-designer.md +10 -3
  18. package/agents/watcher.md +1 -0
  19. package/agents/worker.md +8 -2
  20. package/agents/writer.md +6 -3
  21. package/dist/agents/agent-defaults.js +9 -0
  22. package/dist/agents/agent-definition.js +196 -0
  23. package/dist/agents/agent-management.js +64 -905
  24. package/dist/agents/agent-scope.js +4 -2
  25. package/dist/agents/agent-selection.js +10 -5
  26. package/dist/agents/agent-serializer.js +55 -67
  27. package/dist/agents/agents.js +75 -716
  28. package/dist/agents/builtin-overrides.js +218 -0
  29. package/dist/agents/chain-serializer.js +3 -367
  30. package/dist/agents/config-values.js +52 -0
  31. package/dist/agents/discovery-paths.js +91 -0
  32. package/dist/agents/frontmatter.js +15 -5
  33. package/dist/agents/identity.js +25 -8
  34. package/dist/agents/json-chain.js +254 -0
  35. package/dist/agents/management-config.js +332 -0
  36. package/dist/agents/management-format.js +231 -0
  37. package/dist/agents/management-persistence.js +287 -0
  38. package/dist/agents/management-targets.js +136 -0
  39. package/dist/agents/management-warnings.js +81 -0
  40. package/dist/agents/markdown-chain.js +210 -0
  41. package/dist/agents/package-agents.js +154 -0
  42. package/dist/agents/skill-files.js +157 -0
  43. package/dist/agents/skill-search-paths.js +246 -0
  44. package/dist/agents/skill-types.js +1 -0
  45. package/dist/agents/skills.js +54 -499
  46. package/dist/extension/acceptance-schema.js +55 -0
  47. package/dist/extension/build-info.js +1 -1
  48. package/dist/extension/chain-schema.js +196 -0
  49. package/dist/extension/child-runtime.js +237 -0
  50. package/dist/extension/compact-tools.js +122 -51
  51. package/dist/extension/config-schema.js +29 -0
  52. package/dist/extension/config.js +27 -11
  53. package/dist/extension/control-notice-schema.js +37 -0
  54. package/dist/extension/control-notices.js +13 -6
  55. package/dist/extension/delegation-bridges.js +43 -0
  56. package/dist/extension/doctor.js +48 -25
  57. package/dist/extension/everyday-schemas.js +207 -0
  58. package/dist/extension/fanout-child.js +18 -319
  59. package/dist/extension/index.js +8 -563
  60. package/dist/extension/message-renderers.js +225 -0
  61. package/dist/extension/nested-control-inbox.js +154 -0
  62. package/dist/extension/parent-runtime.js +339 -0
  63. package/dist/extension/primary-tool.js +69 -0
  64. package/dist/extension/result-snapshot.js +22 -0
  65. package/dist/extension/runtime-reload.js +62 -0
  66. package/dist/extension/runtime-storage.js +43 -0
  67. package/dist/extension/schema-overrides.js +75 -0
  68. package/dist/extension/schemas.js +265 -336
  69. package/dist/extension/tool-input.js +27 -12
  70. package/dist/extension/tool-result.js +19 -4
  71. package/dist/history/answer-texts.js +57 -0
  72. package/dist/history/canonical-result.js +76 -43
  73. package/dist/history/canonical-selection.js +40 -0
  74. package/dist/history/database-generation.js +82 -0
  75. package/dist/history/database.js +57 -33
  76. package/dist/history/entry-ingestion.js +61 -0
  77. package/dist/history/index.js +242 -97
  78. package/dist/history/ingest.js +168 -331
  79. package/dist/history/output-digests.js +40 -0
  80. package/dist/history/preview.js +210 -0
  81. package/dist/history/prune.js +33 -0
  82. package/dist/history/queries.js +60 -349
  83. package/dist/history/query-scope.js +190 -0
  84. package/dist/history/rows.js +77 -0
  85. package/dist/history/run-projection.js +137 -0
  86. package/dist/history/run-queries.js +153 -0
  87. package/dist/history/schema.js +31 -0
  88. package/dist/history/search-queries.js +163 -0
  89. package/dist/history/selected-record.js +108 -0
  90. package/dist/history/source-file.js +45 -0
  91. package/dist/history/source-watches.js +141 -0
  92. package/dist/history/store.js +164 -153
  93. package/dist/history/text-chunks.js +169 -0
  94. package/dist/history/text.js +35 -0
  95. package/dist/history/transcript-queries.js +177 -0
  96. package/dist/history/types.js +5 -1
  97. package/dist/history/values.js +36 -0
  98. package/dist/history/wire-inputs.js +122 -0
  99. package/dist/history/wire-models.js +38 -0
  100. package/dist/history/worker-runtime.js +441 -0
  101. package/dist/history/worker.js +66 -462
  102. package/dist/intercom/intercom-bridge.js +48 -20
  103. package/dist/intercom/live-intercom.js +80 -23
  104. package/dist/intercom/nested-result-tree.js +163 -0
  105. package/dist/intercom/result-delivery.js +40 -0
  106. package/dist/intercom/result-intercom.js +178 -261
  107. package/dist/pi-intercom/agent-dir.js +7 -3
  108. package/dist/pi-intercom/async.js +27 -0
  109. package/dist/pi-intercom/bridge-ask.js +57 -0
  110. package/dist/pi-intercom/bridge-config.js +79 -0
  111. package/dist/pi-intercom/bridge-http.js +86 -0
  112. package/dist/pi-intercom/bridge-protocol.js +106 -0
  113. package/dist/pi-intercom/bridge-routes.js +64 -0
  114. package/dist/pi-intercom/bridge-session.js +416 -0
  115. package/dist/pi-intercom/bridge.js +182 -603
  116. package/dist/pi-intercom/broker/broker.js +236 -244
  117. package/dist/pi-intercom/broker/client.js +189 -304
  118. package/dist/pi-intercom/broker/connection.js +165 -0
  119. package/dist/pi-intercom/broker/framing.js +5 -3
  120. package/dist/pi-intercom/broker/paths.js +4 -1
  121. package/dist/pi-intercom/broker/pid.js +53 -25
  122. package/dist/pi-intercom/broker/snapshot-reader.js +78 -0
  123. package/dist/pi-intercom/broker/snapshots.js +188 -0
  124. package/dist/pi-intercom/broker/spawn.js +36 -25
  125. package/dist/pi-intercom/config.js +85 -71
  126. package/dist/pi-intercom/connection.js +297 -0
  127. package/dist/pi-intercom/identity.js +58 -0
  128. package/dist/pi-intercom/inbound-delivery.js +356 -0
  129. package/dist/pi-intercom/inbound-journal.js +303 -0
  130. package/dist/pi-intercom/inbound-record.js +113 -0
  131. package/dist/pi-intercom/inbound.js +179 -0
  132. package/dist/pi-intercom/index.js +79 -2933
  133. package/dist/pi-intercom/inspection.js +62 -0
  134. package/dist/pi-intercom/interview.js +236 -0
  135. package/dist/pi-intercom/lifecycle.js +168 -0
  136. package/dist/pi-intercom/message-format.js +69 -0
  137. package/dist/pi-intercom/outbound.js +304 -0
  138. package/dist/pi-intercom/peer-awareness.js +66 -0
  139. package/dist/pi-intercom/reply-tracker.js +62 -43
  140. package/dist/pi-intercom/reply-wait.js +201 -0
  141. package/dist/pi-intercom/runtime-types.js +3 -0
  142. package/dist/pi-intercom/session-events.js +180 -0
  143. package/dist/pi-intercom/session-targets.js +42 -34
  144. package/dist/pi-intercom/subagent-events.js +238 -0
  145. package/dist/pi-intercom/subagent-live-events.js +129 -86
  146. package/dist/pi-intercom/supervisor.js +282 -0
  147. package/dist/pi-intercom/tool-arguments.js +74 -0
  148. package/dist/pi-intercom/tool-registration.js +95 -0
  149. package/dist/pi-intercom/tool-results.js +38 -0
  150. package/dist/pi-intercom/tool-schemas.js +82 -0
  151. package/dist/pi-intercom/tools.js +51 -0
  152. package/dist/pi-intercom/topic-actions.js +177 -0
  153. package/dist/pi-intercom/topics.js +177 -92
  154. package/dist/pi-intercom/transport.js +1 -0
  155. package/dist/pi-intercom/types.js +151 -114
  156. package/dist/pi-intercom/ui/compose-paste.js +93 -0
  157. package/dist/pi-intercom/ui/compose.js +121 -143
  158. package/dist/pi-intercom/ui/inline-message.js +59 -59
  159. package/dist/pi-intercom/ui/message-renderers.js +147 -0
  160. package/dist/pi-intercom/ui/overlay.js +181 -0
  161. package/dist/pi-intercom/ui/session-format.js +124 -0
  162. package/dist/pi-intercom/ui/session-list.js +76 -43
  163. package/dist/pi-intercom/ui/tool-renderers.js +110 -0
  164. package/dist/pi-intercom/ui/topic-view.js +88 -0
  165. package/dist/pi-intercom/validation.js +59 -0
  166. package/dist/runs/background/async-chain-plan.js +265 -0
  167. package/dist/runs/background/async-control.js +134 -58
  168. package/dist/runs/background/async-execution.js +136 -633
  169. package/dist/runs/background/async-job-admission.js +40 -0
  170. package/dist/runs/background/async-job-projection.js +169 -0
  171. package/dist/runs/background/async-job-tracker.js +297 -327
  172. package/dist/runs/background/async-launch.js +216 -0
  173. package/dist/runs/background/async-plan.js +116 -0
  174. package/dist/runs/background/async-result-file.js +47 -23
  175. package/dist/runs/background/async-resume.js +195 -253
  176. package/dist/runs/background/async-run-discovery.js +213 -0
  177. package/dist/runs/background/async-run-location.js +135 -0
  178. package/dist/runs/background/async-run-record.js +1 -0
  179. package/dist/runs/background/async-run-repair.js +223 -0
  180. package/dist/runs/background/async-run-summary.js +1 -0
  181. package/dist/runs/background/async-single-plan.js +105 -0
  182. package/dist/runs/background/async-status-projection.js +155 -0
  183. package/dist/runs/background/async-status-render.js +117 -0
  184. package/dist/runs/background/async-status-validation.js +181 -0
  185. package/dist/runs/background/async-status.js +3 -442
  186. package/dist/runs/background/async-value.js +21 -0
  187. package/dist/runs/background/completion-dedupe.js +36 -12
  188. package/dist/runs/background/completion-delivery.js +211 -205
  189. package/dist/runs/background/completion-receipts.js +237 -0
  190. package/dist/runs/background/legacy-status-acceptance.js +34 -0
  191. package/dist/runs/background/notify.js +96 -48
  192. package/dist/runs/background/parallel-groups.js +36 -19
  193. package/dist/runs/background/result-payload.js +178 -0
  194. package/dist/runs/background/result-watcher.js +348 -339
  195. package/dist/runs/background/run-id-resolver.js +53 -33
  196. package/dist/runs/background/run-schemas.js +189 -0
  197. package/dist/runs/background/run-status-contracts.js +14 -0
  198. package/dist/runs/background/run-status-render.js +270 -0
  199. package/dist/runs/background/run-status.js +231 -339
  200. package/dist/runs/background/runner-attempt-output.js +155 -0
  201. package/dist/runs/background/runner-attempt.js +263 -0
  202. package/dist/runs/background/runner-child-executor.js +166 -0
  203. package/dist/runs/background/runner-child-observer.js +192 -0
  204. package/dist/runs/background/runner-completion-summary.js +71 -0
  205. package/dist/runs/background/runner-completion.js +211 -0
  206. package/dist/runs/background/runner-config.js +1 -0
  207. package/dist/runs/background/runner-contract.js +1 -0
  208. package/dist/runs/background/runner-dynamic.js +121 -0
  209. package/dist/runs/background/runner-finalization.js +149 -0
  210. package/dist/runs/background/runner-graph.js +68 -0
  211. package/dist/runs/background/runner-initial-status.js +60 -0
  212. package/dist/runs/background/runner-lifecycle.js +142 -0
  213. package/dist/runs/background/runner-monitor.js +309 -0
  214. package/dist/runs/background/runner-parallel.js +204 -0
  215. package/dist/runs/background/runner-prepare-step.js +86 -0
  216. package/dist/runs/background/runner-reporting.js +153 -0
  217. package/dist/runs/background/runner-status.js +148 -0
  218. package/dist/runs/background/runner-step-output.js +92 -0
  219. package/dist/runs/background/runner-step-record.js +45 -0
  220. package/dist/runs/background/runner-step.js +112 -0
  221. package/dist/runs/background/runner-streaming.js +173 -0
  222. package/dist/runs/background/runner-workflow.js +213 -0
  223. package/dist/runs/background/stale-run-reconciler.js +155 -292
  224. package/dist/runs/background/subagent-runner-launcher.js +33 -13
  225. package/dist/runs/background/subagent-runner.js +51 -1842
  226. package/dist/runs/background/top-level-async.js +2 -1
  227. package/dist/runs/foreground/chain-clarify.js +293 -1017
  228. package/dist/runs/foreground/clarification-draft.js +87 -0
  229. package/dist/runs/foreground/clarify-contracts.js +1 -0
  230. package/dist/runs/foreground/clarify-invocation.js +129 -38
  231. package/dist/runs/foreground/clarify-text-editor.js +210 -0
  232. package/dist/runs/foreground/clarify-view.js +167 -0
  233. package/dist/runs/foreground/execution-input.js +226 -353
  234. package/dist/runs/foreground/execution-routing.js +33 -0
  235. package/dist/runs/foreground/execution-timeout.js +81 -0
  236. package/dist/runs/foreground/foreground-control.js +222 -763
  237. package/dist/runs/foreground/foreground-memory.js +99 -0
  238. package/dist/runs/foreground/invocation-context.js +55 -0
  239. package/dist/runs/foreground/invocation-execution.js +331 -0
  240. package/dist/runs/foreground/invocation-expansion.js +48 -0
  241. package/dist/runs/foreground/management-actions.js +295 -0
  242. package/dist/runs/foreground/nested-control.js +179 -0
  243. package/dist/runs/foreground/question-continuation.js +78 -0
  244. package/dist/runs/foreground/question-control.js +155 -50
  245. package/dist/runs/foreground/resume-target.js +221 -0
  246. package/dist/runs/foreground/revival-launch-policy.js +58 -0
  247. package/dist/runs/foreground/run-async-path.js +190 -178
  248. package/dist/runs/foreground/run-interrupt.js +164 -0
  249. package/dist/runs/foreground/run-nudge.js +278 -0
  250. package/dist/runs/foreground/saved-revival.js +251 -0
  251. package/dist/runs/foreground/subagent-executor.js +135 -424
  252. package/dist/runs/foreground/subagent-params.js +67 -30
  253. package/dist/runs/foreground/wait-observation.js +104 -0
  254. package/dist/runs/foreground/wait-registration.js +17 -0
  255. package/dist/runs/foreground/wait-run.js +283 -123
  256. package/dist/runs/shared/acceptance-contract.js +193 -99
  257. package/dist/runs/shared/acceptance-defaults.js +1 -0
  258. package/dist/runs/shared/acceptance-evaluation.js +201 -181
  259. package/dist/runs/shared/acceptance-finalization.js +256 -180
  260. package/dist/runs/shared/acceptance-outcome.js +53 -0
  261. package/dist/runs/shared/acceptance-reports.js +137 -72
  262. package/dist/runs/shared/acceptance-submission.js +167 -0
  263. package/dist/runs/shared/acceptance-verification.js +100 -0
  264. package/dist/runs/shared/chain-outputs.js +80 -52
  265. package/dist/runs/shared/child-attempt-types.js +1 -0
  266. package/dist/runs/shared/child-attempt.js +314 -667
  267. package/dist/runs/shared/child-boundaries.js +173 -0
  268. package/dist/runs/shared/child-context-filter.js +44 -0
  269. package/dist/runs/shared/child-event-observer.js +390 -0
  270. package/dist/runs/shared/child-execution-cwd.js +73 -43
  271. package/dist/runs/shared/child-execution-outcome.js +72 -0
  272. package/dist/runs/shared/child-invocation.js +54 -0
  273. package/dist/runs/shared/child-message-validation.js +215 -0
  274. package/dist/runs/shared/child-native-accounting.js +106 -0
  275. package/dist/runs/shared/child-native-observation.js +69 -0
  276. package/dist/runs/shared/child-observation-spool.js +164 -0
  277. package/dist/runs/shared/child-observations.js +157 -76
  278. package/dist/runs/shared/child-presence.js +3 -0
  279. package/dist/runs/shared/child-route-env.js +119 -0
  280. package/dist/runs/shared/child-stream-observer.js +221 -0
  281. package/dist/runs/shared/child-stream-projection.js +137 -0
  282. package/dist/runs/shared/child-structured-tool.js +27 -0
  283. package/dist/runs/shared/claude-code.js +121 -158
  284. package/dist/runs/shared/claude-model.js +42 -0
  285. package/dist/runs/shared/claude-session.js +83 -0
  286. package/dist/runs/shared/claude-types.js +1 -0
  287. package/dist/runs/shared/completion-guard.js +18 -18
  288. package/dist/runs/shared/control-event-policy.js +8 -0
  289. package/dist/runs/shared/control-notification-owner.js +13 -0
  290. package/dist/runs/shared/dynamic-fanout.js +188 -173
  291. package/dist/runs/shared/dynamic-item.js +102 -0
  292. package/dist/runs/shared/history-index.js +62 -36
  293. package/dist/runs/shared/legacy-async-recovery.js +114 -0
  294. package/dist/runs/shared/legacy-output-recovery.js +148 -0
  295. package/dist/runs/shared/mcp-config-schema.js +36 -0
  296. package/dist/runs/shared/mcp-direct-tool-allowlist.js +147 -116
  297. package/dist/runs/shared/model-fallback.js +97 -38
  298. package/dist/runs/shared/mutating-tool-guard.js +128 -88
  299. package/dist/runs/shared/native-finalization-types.js +1 -0
  300. package/dist/runs/shared/native-finalization.js +155 -76
  301. package/dist/runs/shared/native-usage.js +238 -98
  302. package/dist/runs/shared/nested-control-records.js +128 -0
  303. package/dist/runs/shared/nested-events.js +8 -700
  304. package/dist/runs/shared/nested-path.js +32 -28
  305. package/dist/runs/shared/nested-projection.js +155 -0
  306. package/dist/runs/shared/nested-protocol.js +18 -0
  307. package/dist/runs/shared/nested-registry.js +191 -0
  308. package/dist/runs/shared/nested-render.js +106 -58
  309. package/dist/runs/shared/nested-route.js +220 -0
  310. package/dist/runs/shared/nested-validation.js +216 -0
  311. package/dist/runs/shared/owned-child-evidence.js +125 -0
  312. package/dist/runs/shared/owned-run-list.js +146 -0
  313. package/dist/runs/shared/owned-run-observation.js +267 -0
  314. package/dist/runs/shared/owned-run-progress.js +109 -0
  315. package/dist/runs/shared/owned-run-read-state.js +1 -0
  316. package/dist/runs/shared/owned-run-results.js +202 -0
  317. package/dist/runs/shared/owned-run-status.js +180 -0
  318. package/dist/runs/shared/owned-run-view.js +51 -0
  319. package/dist/runs/shared/owned-workflow-details.js +17 -0
  320. package/dist/runs/shared/owner-output.js +43 -0
  321. package/dist/runs/shared/parallel-utils.js +36 -28
  322. package/dist/runs/shared/parent-receipts.js +90 -32
  323. package/dist/runs/shared/parent-usage.js +169 -57
  324. package/dist/runs/shared/pi-args.js +108 -201
  325. package/dist/runs/shared/pi-launch-input.js +1 -0
  326. package/dist/runs/shared/pi-session-launch.js +86 -0
  327. package/dist/runs/shared/pi-spawn.js +35 -21
  328. package/dist/runs/shared/run-history-queries.js +126 -35
  329. package/dist/runs/shared/run-history.js +101 -35
  330. package/dist/runs/shared/run-metadata-paths.js +14 -0
  331. package/dist/runs/shared/run-metadata.js +158 -0
  332. package/dist/runs/shared/run-persistence.js +131 -0
  333. package/dist/runs/shared/run-records.js +9 -679
  334. package/dist/runs/shared/run-restoration.js +338 -0
  335. package/dist/runs/shared/run-state-owner.js +26 -0
  336. package/dist/runs/shared/session-cwd-preload.js +27 -18
  337. package/dist/runs/shared/single-output.js +148 -70
  338. package/dist/runs/shared/stable-value.js +15 -0
  339. package/dist/runs/shared/streaming-text.js +23 -12
  340. package/dist/runs/shared/structured-output.js +25 -13
  341. package/dist/runs/shared/subagent-control.js +167 -100
  342. package/dist/runs/shared/subagent-prompt-runtime.js +27 -130
  343. package/dist/runs/shared/subagent-tool-loop-guard.js +81 -52
  344. package/dist/runs/shared/supervisor-question-state.js +145 -0
  345. package/dist/runs/shared/supervisor-questions.js +185 -254
  346. package/dist/runs/shared/workflow-graph.js +259 -167
  347. package/dist/runs/shared/workflow-policy.js +120 -48
  348. package/dist/runs/shared/worktree-contract.js +1 -0
  349. package/dist/runs/shared/worktree-hook.js +138 -0
  350. package/dist/runs/shared/worktree-location.js +47 -0
  351. package/dist/runs/shared/worktree-preservation.js +8 -0
  352. package/dist/runs/shared/worktree-process.js +107 -0
  353. package/dist/runs/shared/worktree.js +183 -322
  354. package/dist/shared/agent-context-policy.js +34 -44
  355. package/dist/shared/agent-dir.js +14 -0
  356. package/dist/shared/artifacts.js +30 -12
  357. package/dist/shared/atomic-json.js +4 -1
  358. package/dist/shared/chain-files.js +72 -0
  359. package/dist/shared/concurrency.js +18 -0
  360. package/dist/shared/content-preview.js +115 -0
  361. package/dist/shared/cooperative.js +5 -2
  362. package/dist/shared/execution-cwd.js +13 -5
  363. package/dist/shared/file-coalescer.js +2 -1
  364. package/dist/shared/fork-context.js +10 -12
  365. package/dist/shared/formatters.js +45 -19
  366. package/dist/shared/journal-frames.js +164 -0
  367. package/dist/shared/journal-projections.js +121 -0
  368. package/dist/shared/journal-reader.js +6 -407
  369. package/dist/shared/json-projection.js +191 -0
  370. package/dist/shared/lazy-tools.js +19 -8
  371. package/dist/shared/message-output.js +116 -0
  372. package/dist/shared/model-info.js +31 -14
  373. package/dist/shared/native-import.js +20 -0
  374. package/dist/shared/native-journal.js +140 -0
  375. package/dist/shared/native-session.js +5 -2
  376. package/dist/shared/native-tui.js +7 -2
  377. package/dist/shared/native-typebox.js +15 -3
  378. package/dist/shared/output-page.js +63 -0
  379. package/dist/shared/post-exit-stdio-guard.js +128 -88
  380. package/dist/shared/prompt-sections.js +2 -0
  381. package/dist/shared/session-entries.js +70 -35
  382. package/dist/shared/session-identity.js +5 -3
  383. package/dist/shared/settings.js +62 -192
  384. package/dist/shared/status-format.js +97 -37
  385. package/dist/shared/task-file-policy.js +24 -0
  386. package/dist/shared/temp-root.js +44 -15
  387. package/dist/shared/types/acceptance.js +1 -0
  388. package/dist/shared/types/async.js +1 -0
  389. package/dist/shared/types/config.js +1 -0
  390. package/dist/shared/types/details.js +1 -0
  391. package/dist/shared/types/history.js +1 -0
  392. package/dist/shared/types/inputs.js +1 -0
  393. package/dist/shared/types/intercom.js +1 -0
  394. package/dist/shared/types/launch.js +1 -0
  395. package/dist/shared/types/messages.js +1 -0
  396. package/dist/shared/types/nested.js +1 -0
  397. package/dist/shared/types/owned-runs.js +1 -0
  398. package/dist/shared/types/progress.js +1 -0
  399. package/dist/shared/types/questions.js +1 -0
  400. package/dist/shared/types/results.js +1 -0
  401. package/dist/shared/types/state.js +1 -0
  402. package/dist/shared/types/usage.js +1 -0
  403. package/dist/shared/types/workflow.js +1 -0
  404. package/dist/shared/types.js +75 -30
  405. package/dist/shared/unknown.js +52 -0
  406. package/dist/shared/utils.js +54 -260
  407. package/dist/slash/command-discovery.js +82 -0
  408. package/dist/slash/command-input.js +190 -0
  409. package/dist/slash/prompt-template-bridge.js +94 -270
  410. package/dist/slash/prompt-template-contract.js +77 -0
  411. package/dist/slash/prompt-template-results.js +125 -0
  412. package/dist/slash/request-protocol.js +68 -0
  413. package/dist/slash/result-delivery.js +237 -0
  414. package/dist/slash/saved-chain.js +78 -0
  415. package/dist/slash/slash-bridge.js +123 -89
  416. package/dist/slash/slash-commands.js +101 -572
  417. package/dist/slash/slash-live-state.js +68 -47
  418. package/dist/tui/action-hints.js +50 -22
  419. package/dist/tui/activity-lines.js +32 -0
  420. package/dist/tui/agent-browser.js +290 -0
  421. package/dist/tui/agent-controls.js +289 -0
  422. package/dist/tui/agent-conversation.js +444 -0
  423. package/dist/tui/agent-dock.js +171 -0
  424. package/dist/tui/agent-history.js +50 -183
  425. package/dist/tui/agent-model.js +62 -0
  426. package/dist/tui/agent-picker.js +262 -0
  427. package/dist/tui/agent-view.js +232 -1537
  428. package/dist/tui/compact-results.js +193 -0
  429. package/dist/tui/conversation-details.js +190 -0
  430. package/dist/tui/conversation-frame.js +135 -0
  431. package/dist/tui/conversation-history.js +201 -0
  432. package/dist/tui/conversation-menu.js +78 -0
  433. package/dist/tui/conversation-notices.js +79 -0
  434. package/dist/tui/conversation-selection.js +58 -0
  435. package/dist/tui/conversation-viewport.js +129 -0
  436. package/dist/tui/direction-message.js +27 -0
  437. package/dist/tui/display.js +282 -0
  438. package/dist/tui/editor-viewport.js +18 -0
  439. package/dist/tui/expanded-content.js +87 -0
  440. package/dist/tui/expanded-multi.js +170 -0
  441. package/dist/tui/expanded-single.js +65 -0
  442. package/dist/tui/history-cards.js +216 -0
  443. package/dist/tui/history-display.js +238 -0
  444. package/dist/tui/history-json.js +16 -0
  445. package/dist/tui/history-metadata.js +152 -0
  446. package/dist/tui/history-record.js +251 -0
  447. package/dist/tui/history-text.js +34 -0
  448. package/dist/tui/indexed-history.js +116 -0
  449. package/dist/tui/nested-widget.js +120 -0
  450. package/dist/tui/picker-page.js +59 -0
  451. package/dist/tui/render.js +58 -1501
  452. package/dist/tui/result-facts.js +64 -0
  453. package/dist/tui/task-observation.js +59 -0
  454. package/dist/tui/task-store.js +366 -0
  455. package/dist/tui/text-values.js +16 -0
  456. package/dist/tui/view-connections.js +47 -0
  457. package/dist/tui/view-model.js +94 -0
  458. package/dist/tui/view-persistence.js +51 -0
  459. package/dist/tui/view-ports.js +1 -0
  460. package/dist/tui/view-session.js +37 -0
  461. package/dist/tui/widget-details.js +144 -0
  462. package/dist/tui/widget-status.js +245 -0
  463. package/dist/tui/widget.js +145 -0
  464. package/dist/tui/workflow-labels.js +223 -0
  465. package/dist/tui/workflow-outcomes.js +124 -0
  466. package/docs/code-quality.md +38 -0
  467. package/docs/development.md +99 -0
  468. package/docs/intercom-bridge.md +23 -18
  469. package/docs/intercom.md +132 -106
  470. package/docs/performance.md +19 -17
  471. package/docs/reference.md +1472 -0
  472. package/generated/RunValidators.d.ts +28 -0
  473. package/generated/RunValidators.js +2 -0
  474. package/package.json +27 -6
  475. package/prompts/parallel-cleanup.md +3 -0
  476. package/prompts/parallel-context-build.md +3 -0
  477. package/prompts/parallel-handoff-plan.md +6 -0
  478. package/prompts/parallel-research.md +4 -0
  479. package/prompts/parallel-review.md +2 -0
  480. package/prompts/review-loop.md +2 -0
  481. package/scripts/build.mjs +129 -85
  482. package/scripts/check-compat.mjs +48 -11
  483. package/scripts/compat-host.mjs +35 -7
  484. package/scripts/generate-run-schemas.mjs +210 -0
  485. package/scripts/intercom-bridge-credentials.mjs +155 -28
  486. package/scripts/intercom-remote.mjs +175 -50
  487. package/scripts/local-install-smoke.mjs +47 -37
  488. package/scripts/native-package-smoke.mjs +135 -25
  489. package/scripts/package-smoke.mjs +360 -140
  490. package/scripts/prepare.mjs +54 -34
  491. package/scripts/real-pi-processes.mjs +261 -0
  492. package/scripts/real-pi-smoke.mjs +432 -351
  493. package/scripts/run-tests.mjs +29 -15
  494. package/skills/pi-intercom/SKILL.md +11 -11
  495. package/skills/pi-intercom/references/peer-sessions.md +7 -2
  496. package/skills/pi-subagents/SKILL.md +1 -1
  497. package/skills/pi-subagents/references/full-orchestration-guide.md +254 -112
  498. package/src/agents/agent-defaults.ts +13 -0
  499. package/src/agents/agent-definition.ts +253 -0
  500. package/src/agents/agent-management.ts +111 -808
  501. package/src/agents/agent-scope.ts +7 -3
  502. package/src/agents/agent-selection.ts +26 -16
  503. package/src/agents/agent-serializer.ts +84 -93
  504. package/src/agents/agents.ts +199 -906
  505. package/src/agents/builtin-overrides.ts +297 -0
  506. package/src/agents/chain-serializer.ts +3 -329
  507. package/src/agents/config-values.ts +57 -0
  508. package/src/agents/discovery-paths.ts +134 -0
  509. package/src/agents/frontmatter.ts +35 -17
  510. package/src/agents/identity.ts +49 -18
  511. package/src/agents/json-chain.ts +305 -0
  512. package/src/agents/management-config.ts +342 -0
  513. package/src/agents/management-format.ts +243 -0
  514. package/src/agents/management-persistence.ts +408 -0
  515. package/src/agents/management-targets.ts +260 -0
  516. package/src/agents/management-warnings.ts +115 -0
  517. package/src/agents/markdown-chain.ts +237 -0
  518. package/src/agents/package-agents.ts +231 -0
  519. package/src/agents/skill-files.ts +182 -0
  520. package/src/agents/skill-search-paths.ts +289 -0
  521. package/src/agents/skill-types.ts +31 -0
  522. package/src/agents/skills.ts +152 -610
  523. package/src/extension/acceptance-schema.ts +88 -0
  524. package/src/extension/chain-schema.ts +276 -0
  525. package/src/extension/child-runtime.ts +302 -0
  526. package/src/extension/compact-tools.ts +259 -102
  527. package/src/extension/config-schema.ts +59 -0
  528. package/src/extension/config.ts +39 -17
  529. package/src/extension/control-notice-schema.ts +55 -0
  530. package/src/extension/control-notices.ts +57 -33
  531. package/src/extension/delegation-bridges.ts +59 -0
  532. package/src/extension/doctor.ts +171 -135
  533. package/src/extension/everyday-schemas.ts +252 -0
  534. package/src/extension/fanout-child.ts +29 -308
  535. package/src/extension/index.ts +17 -642
  536. package/src/extension/message-renderers.ts +334 -0
  537. package/src/extension/nested-control-inbox.ts +196 -0
  538. package/src/extension/parent-runtime.ts +405 -0
  539. package/src/extension/primary-tool.ts +130 -0
  540. package/src/extension/result-snapshot.ts +35 -0
  541. package/src/extension/runtime-reload.ts +72 -0
  542. package/src/extension/runtime-storage.ts +49 -0
  543. package/src/extension/schema-overrides.ts +114 -0
  544. package/src/extension/schemas.ts +451 -418
  545. package/src/extension/tool-input.ts +40 -13
  546. package/src/extension/tool-result.ts +45 -14
  547. package/src/history/answer-texts.ts +74 -0
  548. package/src/history/canonical-result.ts +127 -51
  549. package/src/history/canonical-selection.ts +54 -0
  550. package/src/history/database-generation.ts +86 -0
  551. package/src/history/database.ts +86 -48
  552. package/src/history/entry-ingestion.ts +129 -0
  553. package/src/history/index.ts +426 -148
  554. package/src/history/ingest.ts +372 -342
  555. package/src/history/output-digests.ts +41 -0
  556. package/src/history/preview.ts +235 -0
  557. package/src/history/prune.ts +48 -0
  558. package/src/history/queries.ts +122 -256
  559. package/src/history/query-scope.ts +278 -0
  560. package/src/history/rows.ts +118 -0
  561. package/src/history/run-projection.ts +164 -0
  562. package/src/history/run-queries.ts +199 -0
  563. package/src/history/schema.ts +34 -0
  564. package/src/history/search-queries.ts +216 -0
  565. package/src/history/selected-record.ts +140 -0
  566. package/src/history/source-file.ts +51 -0
  567. package/src/history/source-watches.ts +156 -0
  568. package/src/history/store.ts +310 -197
  569. package/src/history/text-chunks.ts +181 -0
  570. package/src/history/text.ts +43 -0
  571. package/src/history/transcript-queries.ts +251 -0
  572. package/src/history/types.ts +27 -164
  573. package/src/history/values.ts +36 -0
  574. package/src/history/wire-inputs.ts +141 -0
  575. package/src/history/wire-models.ts +51 -0
  576. package/src/history/worker-runtime.ts +502 -0
  577. package/src/history/worker.ts +94 -336
  578. package/src/intercom/intercom-bridge.ts +136 -69
  579. package/src/intercom/live-intercom.ts +197 -92
  580. package/src/intercom/nested-result-tree.ts +213 -0
  581. package/src/intercom/result-delivery.ts +56 -0
  582. package/src/intercom/result-intercom.ts +364 -382
  583. package/src/pi-intercom/agent-dir.ts +9 -3
  584. package/src/pi-intercom/async.ts +33 -0
  585. package/src/pi-intercom/bridge-ask.ts +64 -0
  586. package/src/pi-intercom/bridge-config.ts +101 -0
  587. package/src/pi-intercom/bridge-http.ts +97 -0
  588. package/src/pi-intercom/bridge-protocol.ts +123 -0
  589. package/src/pi-intercom/bridge-routes.ts +90 -0
  590. package/src/pi-intercom/bridge-session.ts +506 -0
  591. package/src/pi-intercom/bridge.ts +258 -547
  592. package/src/pi-intercom/broker/broker.ts +326 -263
  593. package/src/pi-intercom/broker/client.ts +273 -354
  594. package/src/pi-intercom/broker/connection.ts +192 -0
  595. package/src/pi-intercom/broker/framing.ts +11 -6
  596. package/src/pi-intercom/broker/paths.ts +28 -25
  597. package/src/pi-intercom/broker/pid.ts +68 -24
  598. package/src/pi-intercom/broker/snapshot-reader.ts +91 -0
  599. package/src/pi-intercom/broker/snapshots.ts +241 -0
  600. package/src/pi-intercom/broker/spawn.ts +58 -34
  601. package/src/pi-intercom/config.ts +113 -108
  602. package/src/pi-intercom/connection.ts +346 -0
  603. package/src/pi-intercom/identity.ts +71 -0
  604. package/src/pi-intercom/inbound-delivery.ts +450 -0
  605. package/src/pi-intercom/inbound-journal.ts +350 -0
  606. package/src/pi-intercom/inbound-record.ts +141 -0
  607. package/src/pi-intercom/inbound.ts +237 -0
  608. package/src/pi-intercom/index.ts +86 -2923
  609. package/src/pi-intercom/inspection.ts +82 -0
  610. package/src/pi-intercom/interview.ts +295 -0
  611. package/src/pi-intercom/lifecycle.ts +183 -0
  612. package/src/pi-intercom/message-format.ts +77 -0
  613. package/src/pi-intercom/outbound.ts +418 -0
  614. package/src/pi-intercom/peer-awareness.ts +84 -0
  615. package/src/pi-intercom/reply-tracker.ts +121 -59
  616. package/src/pi-intercom/reply-wait.ts +247 -0
  617. package/src/pi-intercom/runtime-types.ts +97 -0
  618. package/src/pi-intercom/session-events.ts +247 -0
  619. package/src/pi-intercom/session-targets.ts +124 -72
  620. package/src/pi-intercom/subagent-events.ts +299 -0
  621. package/src/pi-intercom/subagent-live-events.ts +212 -109
  622. package/src/pi-intercom/supervisor.ts +362 -0
  623. package/src/pi-intercom/tool-arguments.ts +120 -0
  624. package/src/pi-intercom/tool-registration.ts +121 -0
  625. package/src/pi-intercom/tool-results.ts +54 -0
  626. package/src/pi-intercom/tool-schemas.ts +134 -0
  627. package/src/pi-intercom/tools.ts +80 -0
  628. package/src/pi-intercom/topic-actions.ts +243 -0
  629. package/src/pi-intercom/topics.ts +267 -121
  630. package/src/pi-intercom/transport.ts +14 -0
  631. package/src/pi-intercom/types.ts +288 -190
  632. package/src/pi-intercom/ui/compose-paste.ts +109 -0
  633. package/src/pi-intercom/ui/compose.ts +173 -157
  634. package/src/pi-intercom/ui/inline-message.ts +80 -62
  635. package/src/pi-intercom/ui/message-renderers.ts +182 -0
  636. package/src/pi-intercom/ui/overlay.ts +238 -0
  637. package/src/pi-intercom/ui/session-format.ts +146 -0
  638. package/src/pi-intercom/ui/session-list.ts +145 -62
  639. package/src/pi-intercom/ui/tool-renderers.ts +148 -0
  640. package/src/pi-intercom/ui/topic-view.ts +107 -0
  641. package/src/pi-intercom/validation.ts +69 -0
  642. package/src/runs/background/async-chain-plan.ts +451 -0
  643. package/src/runs/background/async-control.ts +201 -71
  644. package/src/runs/background/async-execution.ts +206 -829
  645. package/src/runs/background/async-job-admission.ts +54 -0
  646. package/src/runs/background/async-job-projection.ts +225 -0
  647. package/src/runs/background/async-job-tracker.ts +416 -360
  648. package/src/runs/background/async-launch.ts +319 -0
  649. package/src/runs/background/async-plan.ts +285 -0
  650. package/src/runs/background/async-result-file.ts +79 -37
  651. package/src/runs/background/async-resume.ts +338 -285
  652. package/src/runs/background/async-run-discovery.ts +270 -0
  653. package/src/runs/background/async-run-location.ts +194 -0
  654. package/src/runs/background/async-run-record.ts +14 -0
  655. package/src/runs/background/async-run-repair.ts +307 -0
  656. package/src/runs/background/async-run-summary.ts +71 -0
  657. package/src/runs/background/async-single-plan.ts +168 -0
  658. package/src/runs/background/async-status-projection.ts +188 -0
  659. package/src/runs/background/async-status-render.ts +164 -0
  660. package/src/runs/background/async-status-validation.ts +238 -0
  661. package/src/runs/background/async-status.ts +9 -481
  662. package/src/runs/background/async-value.ts +29 -0
  663. package/src/runs/background/completion-dedupe.ts +103 -54
  664. package/src/runs/background/completion-delivery.ts +313 -187
  665. package/src/runs/background/completion-receipts.ts +309 -0
  666. package/src/runs/background/legacy-status-acceptance.ts +38 -0
  667. package/src/runs/background/notify.ts +167 -106
  668. package/src/runs/background/parallel-groups.ts +95 -46
  669. package/src/runs/background/result-payload.ts +268 -0
  670. package/src/runs/background/result-watcher.ts +484 -387
  671. package/src/runs/background/run-id-resolver.ts +126 -57
  672. package/src/runs/background/run-schemas.ts +240 -0
  673. package/src/runs/background/run-status-contracts.ts +46 -0
  674. package/src/runs/background/run-status-render.ts +364 -0
  675. package/src/runs/background/run-status.ts +338 -356
  676. package/src/runs/background/runner-attempt-output.ts +281 -0
  677. package/src/runs/background/runner-attempt.ts +354 -0
  678. package/src/runs/background/runner-child-executor.ts +232 -0
  679. package/src/runs/background/runner-child-observer.ts +270 -0
  680. package/src/runs/background/runner-completion-summary.ts +106 -0
  681. package/src/runs/background/runner-completion.ts +274 -0
  682. package/src/runs/background/runner-config.ts +52 -0
  683. package/src/runs/background/runner-contract.ts +51 -0
  684. package/src/runs/background/runner-dynamic.ts +185 -0
  685. package/src/runs/background/runner-finalization.ts +203 -0
  686. package/src/runs/background/runner-graph.ts +91 -0
  687. package/src/runs/background/runner-initial-status.ts +72 -0
  688. package/src/runs/background/runner-lifecycle.ts +159 -0
  689. package/src/runs/background/runner-monitor.ts +399 -0
  690. package/src/runs/background/runner-parallel.ts +280 -0
  691. package/src/runs/background/runner-prepare-step.ts +128 -0
  692. package/src/runs/background/runner-reporting.ts +192 -0
  693. package/src/runs/background/runner-status.ts +220 -0
  694. package/src/runs/background/runner-step-output.ts +158 -0
  695. package/src/runs/background/runner-step-record.ts +76 -0
  696. package/src/runs/background/runner-step.ts +150 -0
  697. package/src/runs/background/runner-streaming.ts +220 -0
  698. package/src/runs/background/runner-workflow.ts +284 -0
  699. package/src/runs/background/stale-run-reconciler.ts +279 -336
  700. package/src/runs/background/subagent-runner-launcher.ts +67 -35
  701. package/src/runs/background/subagent-runner.ts +80 -2048
  702. package/src/runs/background/top-level-async.ts +9 -7
  703. package/src/runs/foreground/chain-clarify.ts +499 -1334
  704. package/src/runs/foreground/clarification-draft.ts +92 -0
  705. package/src/runs/foreground/clarify-contracts.ts +33 -0
  706. package/src/runs/foreground/clarify-invocation.ts +192 -65
  707. package/src/runs/foreground/clarify-text-editor.ts +229 -0
  708. package/src/runs/foreground/clarify-view.ts +222 -0
  709. package/src/runs/foreground/execution-input.ts +358 -424
  710. package/src/runs/foreground/execution-routing.ts +41 -0
  711. package/src/runs/foreground/execution-timeout.ts +92 -0
  712. package/src/runs/foreground/foreground-control.ts +333 -812
  713. package/src/runs/foreground/foreground-memory.ts +132 -0
  714. package/src/runs/foreground/invocation-context.ts +88 -0
  715. package/src/runs/foreground/invocation-execution.ts +465 -0
  716. package/src/runs/foreground/invocation-expansion.ts +58 -0
  717. package/src/runs/foreground/management-actions.ts +360 -0
  718. package/src/runs/foreground/nested-control.ts +248 -0
  719. package/src/runs/foreground/question-continuation.ts +112 -0
  720. package/src/runs/foreground/question-control.ts +297 -70
  721. package/src/runs/foreground/resume-target.ts +330 -0
  722. package/src/runs/foreground/revival-launch-policy.ts +112 -0
  723. package/src/runs/foreground/run-async-path.ts +307 -223
  724. package/src/runs/foreground/run-interrupt.ts +202 -0
  725. package/src/runs/foreground/run-nudge.ts +355 -0
  726. package/src/runs/foreground/saved-revival.ts +356 -0
  727. package/src/runs/foreground/subagent-executor.ts +195 -493
  728. package/src/runs/foreground/subagent-params.ts +314 -242
  729. package/src/runs/foreground/wait-observation.ts +160 -0
  730. package/src/runs/foreground/wait-registration.ts +18 -0
  731. package/src/runs/foreground/wait-run.ts +361 -119
  732. package/src/runs/shared/acceptance-contract.ts +410 -209
  733. package/src/runs/shared/acceptance-defaults.ts +1 -0
  734. package/src/runs/shared/acceptance-evaluation.ts +314 -240
  735. package/src/runs/shared/acceptance-finalization.ts +447 -305
  736. package/src/runs/shared/acceptance-outcome.ts +69 -0
  737. package/src/runs/shared/acceptance-reports.ts +220 -126
  738. package/src/runs/shared/acceptance-submission.ts +251 -0
  739. package/src/runs/shared/acceptance-verification.ts +118 -0
  740. package/src/runs/shared/acceptance.ts +25 -25
  741. package/src/runs/shared/chain-outputs.ts +190 -98
  742. package/src/runs/shared/child-attempt-types.ts +118 -0
  743. package/src/runs/shared/child-attempt.ts +372 -608
  744. package/src/runs/shared/child-boundaries.ts +217 -0
  745. package/src/runs/shared/child-context-filter.ts +53 -0
  746. package/src/runs/shared/child-event-observer.ts +496 -0
  747. package/src/runs/shared/child-execution-cwd.ts +139 -68
  748. package/src/runs/shared/child-execution-outcome.ts +103 -0
  749. package/src/runs/shared/child-invocation.ts +74 -0
  750. package/src/runs/shared/child-message-validation.ts +233 -0
  751. package/src/runs/shared/child-native-accounting.ts +154 -0
  752. package/src/runs/shared/child-native-observation.ts +79 -0
  753. package/src/runs/shared/child-observation-spool.ts +188 -0
  754. package/src/runs/shared/child-observations.ts +219 -89
  755. package/src/runs/shared/child-presence.ts +6 -0
  756. package/src/runs/shared/child-route-env.ts +142 -0
  757. package/src/runs/shared/child-stream-observer.ts +302 -0
  758. package/src/runs/shared/child-stream-projection.ts +160 -0
  759. package/src/runs/shared/child-structured-tool.ts +38 -0
  760. package/src/runs/shared/claude-code.ts +201 -228
  761. package/src/runs/shared/claude-model.ts +67 -0
  762. package/src/runs/shared/claude-session.ts +124 -0
  763. package/src/runs/shared/claude-types.ts +31 -0
  764. package/src/runs/shared/completion-guard.ts +35 -26
  765. package/src/runs/shared/control-event-policy.ts +15 -0
  766. package/src/runs/shared/control-notification-owner.ts +20 -0
  767. package/src/runs/shared/dynamic-fanout.ts +402 -238
  768. package/src/runs/shared/dynamic-item.ts +114 -0
  769. package/src/runs/shared/history-index.ts +112 -51
  770. package/src/runs/shared/legacy-async-recovery.ts +153 -0
  771. package/src/runs/shared/legacy-output-recovery.ts +214 -0
  772. package/src/runs/shared/mcp-config-schema.ts +46 -0
  773. package/src/runs/shared/mcp-direct-tool-allowlist.ts +396 -307
  774. package/src/runs/shared/model-fallback.ts +302 -180
  775. package/src/runs/shared/mutating-tool-guard.ts +259 -158
  776. package/src/runs/shared/native-finalization-types.ts +29 -0
  777. package/src/runs/shared/native-finalization.ts +233 -109
  778. package/src/runs/shared/native-usage.ts +379 -96
  779. package/src/runs/shared/nested-control-records.ts +178 -0
  780. package/src/runs/shared/nested-events.ts +45 -752
  781. package/src/runs/shared/nested-path.ts +47 -34
  782. package/src/runs/shared/nested-projection.ts +230 -0
  783. package/src/runs/shared/nested-protocol.ts +67 -0
  784. package/src/runs/shared/nested-registry.ts +273 -0
  785. package/src/runs/shared/nested-render.ts +198 -100
  786. package/src/runs/shared/nested-route.ts +292 -0
  787. package/src/runs/shared/nested-validation.ts +291 -0
  788. package/src/runs/shared/owned-child-evidence.ts +184 -0
  789. package/src/runs/shared/owned-run-list.ts +187 -0
  790. package/src/runs/shared/owned-run-observation.ts +368 -0
  791. package/src/runs/shared/owned-run-progress.ts +172 -0
  792. package/src/runs/shared/owned-run-read-state.ts +7 -0
  793. package/src/runs/shared/owned-run-results.ts +289 -0
  794. package/src/runs/shared/owned-run-status.ts +239 -0
  795. package/src/runs/shared/owned-run-view.ts +65 -0
  796. package/src/runs/shared/owned-workflow-details.ts +24 -0
  797. package/src/runs/shared/owner-output.ts +73 -0
  798. package/src/runs/shared/parallel-utils.ts +93 -129
  799. package/src/runs/shared/parent-receipts.ts +177 -50
  800. package/src/runs/shared/parent-usage.ts +314 -91
  801. package/src/runs/shared/pi-args.ts +241 -311
  802. package/src/runs/shared/pi-launch-input.ts +48 -0
  803. package/src/runs/shared/pi-session-launch.ts +94 -0
  804. package/src/runs/shared/pi-spawn.ts +57 -33
  805. package/src/runs/shared/run-history-queries.ts +189 -38
  806. package/src/runs/shared/run-history.ts +197 -76
  807. package/src/runs/shared/run-id-ambiguity.ts +7 -3
  808. package/src/runs/shared/run-metadata-paths.ts +17 -0
  809. package/src/runs/shared/run-metadata.ts +240 -0
  810. package/src/runs/shared/run-persistence.ts +181 -0
  811. package/src/runs/shared/run-records.ts +19 -607
  812. package/src/runs/shared/run-restoration.ts +455 -0
  813. package/src/runs/shared/run-state-owner.ts +31 -0
  814. package/src/runs/shared/session-cwd-preload.ts +39 -19
  815. package/src/runs/shared/single-output.ts +358 -205
  816. package/src/runs/shared/stable-value.ts +15 -0
  817. package/src/runs/shared/streaming-text.ts +39 -12
  818. package/src/runs/shared/structured-output.ts +76 -46
  819. package/src/runs/shared/subagent-control.ts +330 -197
  820. package/src/runs/shared/subagent-prompt-runtime.ts +92 -174
  821. package/src/runs/shared/subagent-tool-loop-guard.ts +118 -68
  822. package/src/runs/shared/supervisor-question-state.ts +221 -0
  823. package/src/runs/shared/supervisor-questions.ts +396 -401
  824. package/src/runs/shared/workflow-graph.ts +400 -198
  825. package/src/runs/shared/workflow-policy.ts +245 -110
  826. package/src/runs/shared/worktree-contract.ts +29 -0
  827. package/src/runs/shared/worktree-hook.ts +181 -0
  828. package/src/runs/shared/worktree-location.ts +61 -0
  829. package/src/runs/shared/worktree-preservation.ts +10 -0
  830. package/src/runs/shared/worktree-process.ts +132 -0
  831. package/src/runs/shared/worktree.ts +459 -587
  832. package/src/shared/agent-context-policy.ts +176 -145
  833. package/src/shared/agent-dir.ts +15 -0
  834. package/src/shared/artifacts.ts +99 -68
  835. package/src/shared/atomic-json.ts +14 -11
  836. package/src/shared/chain-files.ts +72 -0
  837. package/src/shared/concurrency.ts +27 -0
  838. package/src/shared/content-preview.ts +117 -0
  839. package/src/shared/cooperative.ts +17 -13
  840. package/src/shared/execution-cwd.ts +34 -9
  841. package/src/shared/file-coalescer.ts +24 -22
  842. package/src/shared/fork-context.ts +52 -48
  843. package/src/shared/formatters.ts +88 -47
  844. package/src/shared/journal-frames.ts +197 -0
  845. package/src/shared/journal-projections.ts +133 -0
  846. package/src/shared/journal-reader.ts +18 -333
  847. package/src/shared/json-projection.ts +224 -0
  848. package/src/shared/lazy-tools.ts +76 -27
  849. package/src/shared/message-output.ts +146 -0
  850. package/src/shared/model-info.ts +94 -58
  851. package/src/shared/native-import.ts +25 -0
  852. package/src/shared/native-journal.ts +172 -0
  853. package/src/shared/native-session.ts +8 -3
  854. package/src/shared/native-tui.ts +13 -3
  855. package/src/shared/native-typebox.ts +18 -3
  856. package/src/shared/output-page.ts +76 -0
  857. package/src/shared/post-exit-stdio-guard.ts +232 -172
  858. package/src/shared/prompt-sections.ts +13 -7
  859. package/src/shared/session-entries.ts +103 -44
  860. package/src/shared/session-identity.ts +17 -10
  861. package/src/shared/settings.ts +182 -367
  862. package/src/shared/status-format.ts +207 -98
  863. package/src/shared/stream-json.d.ts +10 -0
  864. package/src/shared/task-file-policy.ts +35 -0
  865. package/src/shared/temp-root.ts +122 -71
  866. package/src/shared/types/acceptance.ts +149 -0
  867. package/src/shared/types/async.ts +247 -0
  868. package/src/shared/types/config.ts +139 -0
  869. package/src/shared/types/details.ts +104 -0
  870. package/src/shared/types/history.ts +217 -0
  871. package/src/shared/types/inputs.ts +4 -0
  872. package/src/shared/types/intercom.ts +57 -0
  873. package/src/shared/types/launch.ts +39 -0
  874. package/src/shared/types/messages.ts +104 -0
  875. package/src/shared/types/nested.ts +153 -0
  876. package/src/shared/types/owned-runs.ts +148 -0
  877. package/src/shared/types/progress.ts +106 -0
  878. package/src/shared/types/questions.ts +103 -0
  879. package/src/shared/types/results.ts +119 -0
  880. package/src/shared/types/state.ts +56 -0
  881. package/src/shared/types/usage.ts +36 -0
  882. package/src/shared/types/workflow.ts +187 -0
  883. package/src/shared/types.ts +222 -1161
  884. package/src/shared/ui-mode.ts +1 -1
  885. package/src/shared/unknown.ts +59 -0
  886. package/src/shared/utils.ts +111 -305
  887. package/src/slash/command-discovery.ts +109 -0
  888. package/src/slash/command-input.ts +232 -0
  889. package/src/slash/prompt-template-bridge.ts +153 -400
  890. package/src/slash/prompt-template-contract.ts +152 -0
  891. package/src/slash/prompt-template-results.ts +189 -0
  892. package/src/slash/request-protocol.ts +87 -0
  893. package/src/slash/result-delivery.ts +312 -0
  894. package/src/slash/saved-chain.ts +115 -0
  895. package/src/slash/slash-bridge.ts +202 -156
  896. package/src/slash/slash-commands.ts +176 -598
  897. package/src/slash/slash-live-state.ts +287 -229
  898. package/src/tui/action-hints.ts +147 -61
  899. package/src/tui/activity-lines.ts +40 -0
  900. package/src/tui/agent-browser.ts +354 -0
  901. package/src/tui/agent-controls.ts +355 -0
  902. package/src/tui/agent-conversation.ts +514 -0
  903. package/src/tui/agent-dock.ts +250 -0
  904. package/src/tui/agent-history.ts +78 -203
  905. package/src/tui/agent-model.ts +78 -0
  906. package/src/tui/agent-picker.ts +325 -0
  907. package/src/tui/agent-view.ts +391 -1310
  908. package/src/tui/compact-results.ts +342 -0
  909. package/src/tui/conversation-details.ts +206 -0
  910. package/src/tui/conversation-frame.ts +184 -0
  911. package/src/tui/conversation-history.ts +246 -0
  912. package/src/tui/conversation-menu.ts +119 -0
  913. package/src/tui/conversation-notices.ts +116 -0
  914. package/src/tui/conversation-selection.ts +66 -0
  915. package/src/tui/conversation-viewport.ts +169 -0
  916. package/src/tui/direction-message.ts +35 -0
  917. package/src/tui/display.ts +409 -0
  918. package/src/tui/editor-viewport.ts +19 -0
  919. package/src/tui/expanded-content.ts +134 -0
  920. package/src/tui/expanded-multi.ts +264 -0
  921. package/src/tui/expanded-single.ts +92 -0
  922. package/src/tui/history-cards.ts +316 -0
  923. package/src/tui/history-display.ts +334 -0
  924. package/src/tui/history-json.ts +17 -0
  925. package/src/tui/history-metadata.ts +177 -0
  926. package/src/tui/history-record.ts +321 -0
  927. package/src/tui/history-text.ts +34 -0
  928. package/src/tui/indexed-history.ts +149 -0
  929. package/src/tui/nested-widget.ts +192 -0
  930. package/src/tui/picker-page.ts +80 -0
  931. package/src/tui/render.ts +100 -1546
  932. package/src/tui/result-facts.ts +99 -0
  933. package/src/tui/task-observation.ts +96 -0
  934. package/src/tui/task-store.ts +432 -0
  935. package/src/tui/text-values.ts +20 -0
  936. package/src/tui/view-connections.ts +64 -0
  937. package/src/tui/view-model.ts +181 -0
  938. package/src/tui/view-persistence.ts +57 -0
  939. package/src/tui/view-ports.ts +55 -0
  940. package/src/tui/view-session.ts +42 -0
  941. package/src/tui/widget-details.ts +220 -0
  942. package/src/tui/widget-status.ts +331 -0
  943. package/src/tui/widget.ts +208 -0
  944. package/src/tui/workflow-labels.ts +340 -0
  945. package/src/tui/workflow-outcomes.ts +150 -0
  946. package/tsconfig.build.json +11 -10
  947. package/tsconfig.json +30 -17
@@ -1,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
  }