@fitchmultz/pi-subagents 0.49.0 → 0.50.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 (999) hide show
  1. package/CHANGELOG.md +29 -1
  2. package/README.md +88 -94
  3. package/dist/agent/contracts.js +122 -0
  4. package/dist/agent/cwd.js +51 -0
  5. package/dist/agent/host.js +82 -0
  6. package/dist/agent/index.js +422 -0
  7. package/dist/agent/journal-tail.js +183 -0
  8. package/dist/agent/launch.js +87 -0
  9. package/dist/agent/legacy.js +141 -0
  10. package/dist/agent/notifications.js +119 -0
  11. package/dist/agent/observe-screen.js +132 -0
  12. package/dist/agent/observe.js +234 -0
  13. package/dist/agent/process.js +173 -0
  14. package/dist/agent/receipts.js +75 -0
  15. package/dist/agent/runner.js +372 -0
  16. package/dist/agent/saved.js +195 -0
  17. package/dist/agent/shell.js +43 -0
  18. package/dist/agent/storage.js +113 -0
  19. package/dist/agent/typebox.js +20 -0
  20. package/dist/agent/usage.js +232 -0
  21. package/dist/agent/view.js +164 -0
  22. package/dist/build-info.js +1 -0
  23. package/dist/index.js +8 -0
  24. package/dist/pi-intercom/bridge-config.js +12 -19
  25. package/dist/pi-intercom/bridge-http.js +1 -2
  26. package/dist/pi-intercom/bridge-mailbox.js +2 -7
  27. package/dist/pi-intercom/bridge-protocol.js +3 -10
  28. package/dist/pi-intercom/bridge-routes.js +15 -186
  29. package/dist/pi-intercom/bridge-session.js +2 -96
  30. package/dist/pi-intercom/bridge.js +12 -35
  31. package/dist/pi-intercom/broker/broker.js +33 -38
  32. package/dist/pi-intercom/broker/client-last.js +48 -0
  33. package/dist/pi-intercom/broker/client.js +41 -1
  34. package/dist/pi-intercom/broker/connection.js +5 -18
  35. package/dist/pi-intercom/broker/last.js +173 -0
  36. package/dist/pi-intercom/broker/paths.js +28 -9
  37. package/dist/pi-intercom/broker/server-connection.js +18 -0
  38. package/dist/pi-intercom/broker/spawn.js +32 -16
  39. package/dist/pi-intercom/broker/targets.js +24 -0
  40. package/dist/pi-intercom/config.js +0 -23
  41. package/dist/pi-intercom/connection.js +30 -70
  42. package/dist/pi-intercom/identity.js +14 -44
  43. package/dist/pi-intercom/inbound-delivery.js +8 -69
  44. package/dist/pi-intercom/inbound-journal.js +3 -68
  45. package/dist/pi-intercom/inbound-record.js +2 -48
  46. package/dist/pi-intercom/inbound.js +6 -53
  47. package/dist/pi-intercom/index.js +8 -47
  48. package/dist/pi-intercom/last-message.js +58 -0
  49. package/dist/pi-intercom/lifecycle.js +8 -33
  50. package/dist/pi-intercom/message-format.js +1 -32
  51. package/dist/pi-intercom/outbound.js +9 -1
  52. package/dist/pi-intercom/reply-tracker.js +2 -12
  53. package/dist/pi-intercom/reply-wait.js +16 -107
  54. package/dist/pi-intercom/runtime-types.js +0 -1
  55. package/dist/pi-intercom/session-events.js +5 -21
  56. package/dist/pi-intercom/tool-arguments.js +4 -0
  57. package/dist/pi-intercom/tool-registration.js +5 -86
  58. package/dist/pi-intercom/tool-schemas.js +12 -52
  59. package/dist/pi-intercom/tools.js +55 -29
  60. package/dist/pi-intercom/types.js +10 -3
  61. package/dist/pi-intercom/ui/session-format.js +3 -3
  62. package/dist/shared/journal-projections.js +0 -31
  63. package/dist/shared/types.js +0 -195
  64. package/docs/code-quality.md +4 -3
  65. package/docs/development.md +57 -95
  66. package/docs/intercom-bridge.md +206 -415
  67. package/docs/intercom.md +142 -593
  68. package/docs/performance.md +109 -192
  69. package/docs/reference.md +139 -1452
  70. package/package.json +12 -19
  71. package/scripts/build.mjs +1 -1
  72. package/scripts/intercom-bridge-credentials.mjs +1 -1
  73. package/scripts/intercom-remote.mjs +55 -272
  74. package/scripts/local-install-smoke.mjs +3 -1
  75. package/scripts/measure-size.mjs +64 -0
  76. package/scripts/native-package-smoke.mjs +267 -109
  77. package/scripts/package-smoke.mjs +120 -363
  78. package/scripts/real-pi-processes.mjs +6 -38
  79. package/scripts/real-pi-smoke.mjs +153 -144
  80. package/scripts/run-tests.mjs +4 -3
  81. package/skills/pi-intercom/SKILL.md +53 -107
  82. package/skills/pi-subagents/SKILL.md +45 -59
  83. package/src/agent/contracts.ts +144 -0
  84. package/src/agent/cwd.ts +69 -0
  85. package/src/agent/host.ts +82 -0
  86. package/src/agent/index.ts +486 -0
  87. package/src/agent/journal-tail.ts +184 -0
  88. package/src/agent/launch.ts +112 -0
  89. package/src/agent/legacy.ts +167 -0
  90. package/src/agent/notifications.ts +131 -0
  91. package/src/agent/observe-screen.ts +167 -0
  92. package/src/agent/observe.ts +240 -0
  93. package/src/agent/process.ts +179 -0
  94. package/src/agent/receipts.ts +88 -0
  95. package/src/agent/runner.ts +417 -0
  96. package/src/agent/saved.ts +220 -0
  97. package/src/agent/shell.ts +56 -0
  98. package/src/agent/storage.ts +123 -0
  99. package/src/agent/typebox.ts +17 -0
  100. package/src/agent/usage.ts +263 -0
  101. package/src/agent/view.ts +246 -0
  102. package/src/index.ts +10 -0
  103. package/src/pi-intercom/bridge-config.ts +13 -24
  104. package/src/pi-intercom/bridge-http.ts +1 -2
  105. package/src/pi-intercom/bridge-mailbox.ts +8 -8
  106. package/src/pi-intercom/bridge-protocol.ts +7 -11
  107. package/src/pi-intercom/bridge-routes.ts +29 -277
  108. package/src/pi-intercom/bridge-session.ts +3 -114
  109. package/src/pi-intercom/bridge.ts +12 -35
  110. package/src/pi-intercom/broker/broker.ts +39 -54
  111. package/src/pi-intercom/broker/client-last.ts +65 -0
  112. package/src/pi-intercom/broker/client.ts +45 -3
  113. package/src/pi-intercom/broker/connection.ts +5 -17
  114. package/src/pi-intercom/broker/last.ts +222 -0
  115. package/src/pi-intercom/broker/paths.ts +31 -9
  116. package/src/pi-intercom/broker/server-connection.ts +38 -0
  117. package/src/pi-intercom/broker/spawn.ts +44 -16
  118. package/src/pi-intercom/broker/targets.ts +42 -0
  119. package/src/pi-intercom/config.ts +0 -27
  120. package/src/pi-intercom/connection.ts +41 -84
  121. package/src/pi-intercom/identity.ts +21 -49
  122. package/src/pi-intercom/inbound-delivery.ts +10 -93
  123. package/src/pi-intercom/inbound-journal.ts +4 -81
  124. package/src/pi-intercom/inbound-record.ts +2 -61
  125. package/src/pi-intercom/inbound.ts +7 -69
  126. package/src/pi-intercom/index.ts +10 -49
  127. package/src/pi-intercom/last-message.ts +73 -0
  128. package/src/pi-intercom/lifecycle.ts +14 -41
  129. package/src/pi-intercom/message-format.ts +1 -34
  130. package/src/pi-intercom/outbound.ts +16 -1
  131. package/src/pi-intercom/reply-tracker.ts +2 -19
  132. package/src/pi-intercom/reply-wait.ts +21 -128
  133. package/src/pi-intercom/runtime-types.ts +5 -58
  134. package/src/pi-intercom/session-events.ts +7 -35
  135. package/src/pi-intercom/tool-arguments.ts +6 -0
  136. package/src/pi-intercom/tool-registration.ts +9 -109
  137. package/src/pi-intercom/tool-schemas.ts +17 -80
  138. package/src/pi-intercom/tools.ts +58 -44
  139. package/src/pi-intercom/transport.ts +1 -0
  140. package/src/pi-intercom/types.ts +45 -6
  141. package/src/pi-intercom/ui/session-format.ts +3 -3
  142. package/src/shared/journal-projections.ts +0 -35
  143. package/src/shared/post-exit-stdio-guard.ts +7 -1
  144. package/src/shared/types.ts +0 -257
  145. package/agents/context-builder.md +0 -115
  146. package/agents/debugger.md +0 -58
  147. package/agents/delegate.md +0 -14
  148. package/agents/fixer.md +0 -40
  149. package/agents/oracle.md +0 -82
  150. package/agents/planner.md +0 -83
  151. package/agents/researcher.md +0 -60
  152. package/agents/reviewer-claude.md +0 -78
  153. package/agents/reviewer-gpt.md +0 -78
  154. package/agents/reviewer-ponytail.md +0 -92
  155. package/agents/reviewer-security.md +0 -92
  156. package/agents/reviewer.md +0 -78
  157. package/agents/scout.md +0 -77
  158. package/agents/ui-designer.md +0 -58
  159. package/agents/watcher.md +0 -27
  160. package/agents/worker.md +0 -52
  161. package/agents/writer.md +0 -39
  162. package/dist/agents/agent-defaults.js +0 -9
  163. package/dist/agents/agent-definition.js +0 -196
  164. package/dist/agents/agent-management.js +0 -88
  165. package/dist/agents/agent-scope.js +0 -9
  166. package/dist/agents/agent-selection.js +0 -13
  167. package/dist/agents/agent-serializer.js +0 -88
  168. package/dist/agents/agents.js +0 -111
  169. package/dist/agents/builtin-overrides.js +0 -218
  170. package/dist/agents/chain-serializer.js +0 -3
  171. package/dist/agents/config-values.js +0 -52
  172. package/dist/agents/discovery-paths.js +0 -91
  173. package/dist/agents/frontmatter.js +0 -31
  174. package/dist/agents/identity.js +0 -46
  175. package/dist/agents/json-chain.js +0 -254
  176. package/dist/agents/management-config.js +0 -332
  177. package/dist/agents/management-format.js +0 -231
  178. package/dist/agents/management-persistence.js +0 -287
  179. package/dist/agents/management-targets.js +0 -136
  180. package/dist/agents/management-warnings.js +0 -81
  181. package/dist/agents/markdown-chain.js +0 -210
  182. package/dist/agents/package-agents.js +0 -154
  183. package/dist/agents/skill-files.js +0 -157
  184. package/dist/agents/skill-search-paths.js +0 -246
  185. package/dist/agents/skill-types.js +0 -1
  186. package/dist/agents/skills.js +0 -125
  187. package/dist/extension/acceptance-schema.js +0 -55
  188. package/dist/extension/build-info.js +0 -1
  189. package/dist/extension/chain-schema.js +0 -196
  190. package/dist/extension/child-runtime.js +0 -237
  191. package/dist/extension/compact-tools.js +0 -183
  192. package/dist/extension/config-schema.js +0 -29
  193. package/dist/extension/config.js +0 -38
  194. package/dist/extension/control-notice-schema.js +0 -37
  195. package/dist/extension/control-notices.js +0 -36
  196. package/dist/extension/delegation-bridges.js +0 -43
  197. package/dist/extension/doctor.js +0 -166
  198. package/dist/extension/everyday-schemas.js +0 -207
  199. package/dist/extension/fanout-child.js +0 -25
  200. package/dist/extension/index.js +0 -28
  201. package/dist/extension/message-renderers.js +0 -225
  202. package/dist/extension/nested-control-inbox.js +0 -154
  203. package/dist/extension/parent-runtime.js +0 -339
  204. package/dist/extension/primary-tool.js +0 -69
  205. package/dist/extension/result-snapshot.js +0 -4
  206. package/dist/extension/runtime-reload.js +0 -62
  207. package/dist/extension/runtime-storage.js +0 -43
  208. package/dist/extension/schema-overrides.js +0 -75
  209. package/dist/extension/schemas.js +0 -345
  210. package/dist/extension/tool-input.js +0 -35
  211. package/dist/extension/tool-result.js +0 -29
  212. package/dist/history/answer-texts.js +0 -57
  213. package/dist/history/canonical-result.js +0 -114
  214. package/dist/history/canonical-selection.js +0 -40
  215. package/dist/history/database-generation.js +0 -82
  216. package/dist/history/database.js +0 -96
  217. package/dist/history/entry-ingestion.js +0 -61
  218. package/dist/history/index.js +0 -344
  219. package/dist/history/ingest.js +0 -314
  220. package/dist/history/output-digests.js +0 -40
  221. package/dist/history/preview.js +0 -210
  222. package/dist/history/prune.js +0 -33
  223. package/dist/history/queries.js +0 -81
  224. package/dist/history/query-scope.js +0 -190
  225. package/dist/history/rows.js +0 -77
  226. package/dist/history/run-projection.js +0 -136
  227. package/dist/history/run-queries.js +0 -153
  228. package/dist/history/schema.js +0 -31
  229. package/dist/history/search-queries.js +0 -169
  230. package/dist/history/selected-record.js +0 -108
  231. package/dist/history/source-file.js +0 -45
  232. package/dist/history/source-watches.js +0 -141
  233. package/dist/history/store.js +0 -243
  234. package/dist/history/text-chunks.js +0 -168
  235. package/dist/history/text.js +0 -35
  236. package/dist/history/transcript-queries.js +0 -183
  237. package/dist/history/types.js +0 -8
  238. package/dist/history/values.js +0 -36
  239. package/dist/history/wire-inputs.js +0 -122
  240. package/dist/history/wire-models.js +0 -38
  241. package/dist/history/worker-runtime.js +0 -441
  242. package/dist/history/worker.js +0 -91
  243. package/dist/intercom/intercom-bridge.js +0 -140
  244. package/dist/intercom/live-intercom.js +0 -151
  245. package/dist/intercom/nested-result-tree.js +0 -163
  246. package/dist/intercom/result-delivery.js +0 -40
  247. package/dist/intercom/result-intercom.js +0 -216
  248. package/dist/pi-intercom/bridge-ask.js +0 -57
  249. package/dist/pi-intercom/bridge-broadcast.js +0 -60
  250. package/dist/pi-intercom/bridge-catalog.js +0 -372
  251. package/dist/pi-intercom/bridge-control.js +0 -104
  252. package/dist/pi-intercom/bridge-groups.js +0 -135
  253. package/dist/pi-intercom/bridge-launch-journal.js +0 -84
  254. package/dist/pi-intercom/bridge-launch-policy.js +0 -154
  255. package/dist/pi-intercom/bridge-launch.js +0 -327
  256. package/dist/pi-intercom/bridge-operations.js +0 -127
  257. package/dist/pi-intercom/bridge-rpc-process.js +0 -292
  258. package/dist/pi-intercom/interview.js +0 -236
  259. package/dist/pi-intercom/native-control-auth.js +0 -80
  260. package/dist/pi-intercom/native-control-protocol.js +0 -111
  261. package/dist/pi-intercom/native-control.js +0 -130
  262. package/dist/pi-intercom/peer-awareness.js +0 -66
  263. package/dist/pi-intercom/saved-transcript.js +0 -135
  264. package/dist/pi-intercom/subagent-events.js +0 -238
  265. package/dist/pi-intercom/subagent-live-events.js +0 -175
  266. package/dist/pi-intercom/supervisor.js +0 -282
  267. package/dist/pi-intercom/topic-actions.js +0 -177
  268. package/dist/pi-intercom/topics.js +0 -242
  269. package/dist/pi-intercom/transcript.js +0 -175
  270. package/dist/pi-intercom/ui/compose-paste.js +0 -93
  271. package/dist/pi-intercom/ui/compose.js +0 -247
  272. package/dist/pi-intercom/ui/inline-message.js +0 -80
  273. package/dist/pi-intercom/ui/message-renderers.js +0 -147
  274. package/dist/pi-intercom/ui/overlay.js +0 -181
  275. package/dist/pi-intercom/ui/session-list.js +0 -157
  276. package/dist/pi-intercom/ui/tool-renderers.js +0 -110
  277. package/dist/pi-intercom/ui/topic-view.js +0 -88
  278. package/dist/runs/background/async-chain-plan.js +0 -265
  279. package/dist/runs/background/async-control.js +0 -171
  280. package/dist/runs/background/async-execution.js +0 -179
  281. package/dist/runs/background/async-job-admission.js +0 -40
  282. package/dist/runs/background/async-job-projection.js +0 -169
  283. package/dist/runs/background/async-job-tracker.js +0 -353
  284. package/dist/runs/background/async-launch.js +0 -216
  285. package/dist/runs/background/async-plan.js +0 -116
  286. package/dist/runs/background/async-result-file.js +0 -82
  287. package/dist/runs/background/async-resume.js +0 -247
  288. package/dist/runs/background/async-run-discovery.js +0 -211
  289. package/dist/runs/background/async-run-location.js +0 -135
  290. package/dist/runs/background/async-run-record.js +0 -1
  291. package/dist/runs/background/async-run-repair.js +0 -223
  292. package/dist/runs/background/async-run-summary.js +0 -1
  293. package/dist/runs/background/async-single-plan.js +0 -105
  294. package/dist/runs/background/async-status-projection.js +0 -155
  295. package/dist/runs/background/async-status-render.js +0 -117
  296. package/dist/runs/background/async-status-validation.js +0 -181
  297. package/dist/runs/background/async-status.js +0 -3
  298. package/dist/runs/background/async-value.js +0 -21
  299. package/dist/runs/background/completion-dedupe.js +0 -42
  300. package/dist/runs/background/completion-delivery.js +0 -251
  301. package/dist/runs/background/completion-receipts.js +0 -237
  302. package/dist/runs/background/legacy-status-acceptance.js +0 -34
  303. package/dist/runs/background/notify.js +0 -111
  304. package/dist/runs/background/parallel-groups.js +0 -72
  305. package/dist/runs/background/result-payload.js +0 -178
  306. package/dist/runs/background/result-watcher.js +0 -435
  307. package/dist/runs/background/run-id-resolver.js +0 -84
  308. package/dist/runs/background/run-schemas.js +0 -189
  309. package/dist/runs/background/run-status-contracts.js +0 -14
  310. package/dist/runs/background/run-status-render.js +0 -270
  311. package/dist/runs/background/run-status.js +0 -274
  312. package/dist/runs/background/runner-attempt-output.js +0 -155
  313. package/dist/runs/background/runner-attempt.js +0 -263
  314. package/dist/runs/background/runner-child-executor.js +0 -166
  315. package/dist/runs/background/runner-child-observer.js +0 -197
  316. package/dist/runs/background/runner-completion-summary.js +0 -71
  317. package/dist/runs/background/runner-completion.js +0 -211
  318. package/dist/runs/background/runner-config.js +0 -1
  319. package/dist/runs/background/runner-contract.js +0 -1
  320. package/dist/runs/background/runner-dynamic.js +0 -121
  321. package/dist/runs/background/runner-finalization.js +0 -149
  322. package/dist/runs/background/runner-graph.js +0 -68
  323. package/dist/runs/background/runner-initial-status.js +0 -60
  324. package/dist/runs/background/runner-lifecycle.js +0 -142
  325. package/dist/runs/background/runner-monitor.js +0 -311
  326. package/dist/runs/background/runner-parallel.js +0 -203
  327. package/dist/runs/background/runner-prepare-step.js +0 -86
  328. package/dist/runs/background/runner-reporting.js +0 -153
  329. package/dist/runs/background/runner-status.js +0 -148
  330. package/dist/runs/background/runner-step-output.js +0 -90
  331. package/dist/runs/background/runner-step-record.js +0 -45
  332. package/dist/runs/background/runner-step.js +0 -112
  333. package/dist/runs/background/runner-streaming.js +0 -173
  334. package/dist/runs/background/runner-workflow.js +0 -213
  335. package/dist/runs/background/stale-run-reconciler.js +0 -198
  336. package/dist/runs/background/subagent-runner-launcher.js +0 -75
  337. package/dist/runs/background/subagent-runner.js +0 -81
  338. package/dist/runs/background/top-level-async.js +0 -6
  339. package/dist/runs/foreground/chain-clarify.js +0 -428
  340. package/dist/runs/foreground/clarification-draft.js +0 -87
  341. package/dist/runs/foreground/clarify-contracts.js +0 -1
  342. package/dist/runs/foreground/clarify-invocation.js +0 -163
  343. package/dist/runs/foreground/clarify-text-editor.js +0 -210
  344. package/dist/runs/foreground/clarify-view.js +0 -167
  345. package/dist/runs/foreground/execution-input.js +0 -296
  346. package/dist/runs/foreground/execution-routing.js +0 -33
  347. package/dist/runs/foreground/execution-timeout.js +0 -81
  348. package/dist/runs/foreground/foreground-control.js +0 -276
  349. package/dist/runs/foreground/foreground-memory.js +0 -99
  350. package/dist/runs/foreground/invocation-context.js +0 -55
  351. package/dist/runs/foreground/invocation-execution.js +0 -331
  352. package/dist/runs/foreground/invocation-expansion.js +0 -48
  353. package/dist/runs/foreground/management-actions.js +0 -295
  354. package/dist/runs/foreground/nested-control.js +0 -179
  355. package/dist/runs/foreground/question-continuation.js +0 -78
  356. package/dist/runs/foreground/question-control.js +0 -193
  357. package/dist/runs/foreground/resume-target.js +0 -221
  358. package/dist/runs/foreground/revival-launch-policy.js +0 -58
  359. package/dist/runs/foreground/run-async-path.js +0 -217
  360. package/dist/runs/foreground/run-interrupt.js +0 -164
  361. package/dist/runs/foreground/run-nudge.js +0 -278
  362. package/dist/runs/foreground/saved-revival.js +0 -251
  363. package/dist/runs/foreground/subagent-executor.js +0 -153
  364. package/dist/runs/foreground/subagent-params.js +0 -202
  365. package/dist/runs/foreground/wait-observation.js +0 -104
  366. package/dist/runs/foreground/wait-registration.js +0 -17
  367. package/dist/runs/foreground/wait-run.js +0 -301
  368. package/dist/runs/shared/acceptance-contract.js +0 -347
  369. package/dist/runs/shared/acceptance-defaults.js +0 -1
  370. package/dist/runs/shared/acceptance-evaluation.js +0 -276
  371. package/dist/runs/shared/acceptance-finalization.js +0 -356
  372. package/dist/runs/shared/acceptance-outcome.js +0 -53
  373. package/dist/runs/shared/acceptance-reports.js +0 -212
  374. package/dist/runs/shared/acceptance-submission.js +0 -167
  375. package/dist/runs/shared/acceptance-verification.js +0 -100
  376. package/dist/runs/shared/acceptance.js +0 -4
  377. package/dist/runs/shared/chain-outputs.js +0 -138
  378. package/dist/runs/shared/child-attempt-types.js +0 -1
  379. package/dist/runs/shared/child-attempt.js +0 -340
  380. package/dist/runs/shared/child-boundaries.js +0 -173
  381. package/dist/runs/shared/child-context-filter.js +0 -44
  382. package/dist/runs/shared/child-event-observer.js +0 -390
  383. package/dist/runs/shared/child-execution-cwd.js +0 -126
  384. package/dist/runs/shared/child-execution-outcome.js +0 -72
  385. package/dist/runs/shared/child-invocation.js +0 -54
  386. package/dist/runs/shared/child-message-validation.js +0 -215
  387. package/dist/runs/shared/child-native-accounting.js +0 -106
  388. package/dist/runs/shared/child-native-observation.js +0 -69
  389. package/dist/runs/shared/child-observation-spool.js +0 -169
  390. package/dist/runs/shared/child-observations.js +0 -195
  391. package/dist/runs/shared/child-presence.js +0 -3
  392. package/dist/runs/shared/child-route-env.js +0 -119
  393. package/dist/runs/shared/child-stream-observer.js +0 -221
  394. package/dist/runs/shared/child-stream-projection.js +0 -137
  395. package/dist/runs/shared/child-structured-tool.js +0 -27
  396. package/dist/runs/shared/claude-code.js +0 -162
  397. package/dist/runs/shared/claude-model.js +0 -42
  398. package/dist/runs/shared/claude-session.js +0 -83
  399. package/dist/runs/shared/claude-types.js +0 -1
  400. package/dist/runs/shared/completion-guard.js +0 -31
  401. package/dist/runs/shared/control-event-policy.js +0 -8
  402. package/dist/runs/shared/control-notification-owner.js +0 -13
  403. package/dist/runs/shared/dynamic-fanout.js +0 -289
  404. package/dist/runs/shared/dynamic-item.js +0 -102
  405. package/dist/runs/shared/history-index.js +0 -98
  406. package/dist/runs/shared/legacy-async-recovery.js +0 -114
  407. package/dist/runs/shared/legacy-output-recovery.js +0 -148
  408. package/dist/runs/shared/mcp-config-schema.js +0 -36
  409. package/dist/runs/shared/mcp-direct-tool-allowlist.js +0 -365
  410. package/dist/runs/shared/model-fallback.js +0 -247
  411. package/dist/runs/shared/mutating-tool-guard.js +0 -210
  412. package/dist/runs/shared/native-finalization-types.js +0 -1
  413. package/dist/runs/shared/native-finalization.js +0 -180
  414. package/dist/runs/shared/native-usage.js +0 -293
  415. package/dist/runs/shared/nested-control-records.js +0 -128
  416. package/dist/runs/shared/nested-events.js +0 -8
  417. package/dist/runs/shared/nested-path.js +0 -52
  418. package/dist/runs/shared/nested-projection.js +0 -155
  419. package/dist/runs/shared/nested-protocol.js +0 -18
  420. package/dist/runs/shared/nested-registry.js +0 -191
  421. package/dist/runs/shared/nested-render.js +0 -156
  422. package/dist/runs/shared/nested-route.js +0 -220
  423. package/dist/runs/shared/nested-validation.js +0 -216
  424. package/dist/runs/shared/owned-child-evidence.js +0 -125
  425. package/dist/runs/shared/owned-run-list.js +0 -146
  426. package/dist/runs/shared/owned-run-observation.js +0 -267
  427. package/dist/runs/shared/owned-run-progress.js +0 -109
  428. package/dist/runs/shared/owned-run-read-state.js +0 -1
  429. package/dist/runs/shared/owned-run-results.js +0 -202
  430. package/dist/runs/shared/owned-run-status.js +0 -180
  431. package/dist/runs/shared/owned-run-view.js +0 -51
  432. package/dist/runs/shared/owned-workflow-details.js +0 -17
  433. package/dist/runs/shared/owner-output.js +0 -43
  434. package/dist/runs/shared/parallel-utils.js +0 -49
  435. package/dist/runs/shared/parent-receipts.js +0 -126
  436. package/dist/runs/shared/parent-usage.js +0 -233
  437. package/dist/runs/shared/pi-args.js +0 -217
  438. package/dist/runs/shared/pi-launch-input.js +0 -1
  439. package/dist/runs/shared/pi-session-launch.js +0 -86
  440. package/dist/runs/shared/pi-spawn.js +0 -66
  441. package/dist/runs/shared/run-history-queries.js +0 -136
  442. package/dist/runs/shared/run-history.js +0 -176
  443. package/dist/runs/shared/run-id-ambiguity.js +0 -4
  444. package/dist/runs/shared/run-metadata-paths.js +0 -14
  445. package/dist/runs/shared/run-metadata.js +0 -158
  446. package/dist/runs/shared/run-persistence.js +0 -131
  447. package/dist/runs/shared/run-records.js +0 -9
  448. package/dist/runs/shared/run-restoration.js +0 -337
  449. package/dist/runs/shared/run-state-owner.js +0 -26
  450. package/dist/runs/shared/session-cwd-preload.js +0 -42
  451. package/dist/runs/shared/single-output.js +0 -297
  452. package/dist/runs/shared/stable-value.js +0 -15
  453. package/dist/runs/shared/streaming-text.js +0 -26
  454. package/dist/runs/shared/structured-output.js +0 -67
  455. package/dist/runs/shared/subagent-control.js +0 -246
  456. package/dist/runs/shared/subagent-prompt-runtime.js +0 -94
  457. package/dist/runs/shared/subagent-tool-loop-guard.js +0 -95
  458. package/dist/runs/shared/supervisor-question-state.js +0 -145
  459. package/dist/runs/shared/supervisor-questions.js +0 -284
  460. package/dist/runs/shared/workflow-graph.js +0 -306
  461. package/dist/runs/shared/workflow-policy.js +0 -157
  462. package/dist/runs/shared/worktree-contract.js +0 -1
  463. package/dist/runs/shared/worktree-hook.js +0 -138
  464. package/dist/runs/shared/worktree-location.js +0 -47
  465. package/dist/runs/shared/worktree-preservation.js +0 -8
  466. package/dist/runs/shared/worktree-process.js +0 -107
  467. package/dist/runs/shared/worktree.js +0 -386
  468. package/dist/shared/agent-context-policy.js +0 -116
  469. package/dist/shared/agent-dir.js +0 -14
  470. package/dist/shared/artifacts.js +0 -114
  471. package/dist/shared/atomic-json.js +0 -16
  472. package/dist/shared/chain-files.js +0 -72
  473. package/dist/shared/concurrency.js +0 -18
  474. package/dist/shared/content-preview.js +0 -115
  475. package/dist/shared/execution-cwd.js +0 -22
  476. package/dist/shared/file-coalescer.js +0 -22
  477. package/dist/shared/fork-context.js +0 -47
  478. package/dist/shared/formatters.js +0 -111
  479. package/dist/shared/journal-reader.js +0 -6
  480. package/dist/shared/lazy-tools.js +0 -43
  481. package/dist/shared/message-output.js +0 -116
  482. package/dist/shared/model-info.js +0 -85
  483. package/dist/shared/native-import.js +0 -20
  484. package/dist/shared/native-session-loader.js +0 -17
  485. package/dist/shared/native-session.js +0 -4
  486. package/dist/shared/native-tui.js +0 -23
  487. package/dist/shared/native-typebox.js +0 -32
  488. package/dist/shared/prompt-sections.js +0 -10
  489. package/dist/shared/session-entries.js +0 -87
  490. package/dist/shared/session-identity.js +0 -16
  491. package/dist/shared/settings.js +0 -121
  492. package/dist/shared/status-format.js +0 -171
  493. package/dist/shared/task-file-policy.js +0 -24
  494. package/dist/shared/temp-root.js +0 -143
  495. package/dist/shared/types/acceptance.js +0 -1
  496. package/dist/shared/types/async.js +0 -1
  497. package/dist/shared/types/config.js +0 -1
  498. package/dist/shared/types/details.js +0 -1
  499. package/dist/shared/types/history.js +0 -1
  500. package/dist/shared/types/inputs.js +0 -1
  501. package/dist/shared/types/intercom.js +0 -1
  502. package/dist/shared/types/launch.js +0 -1
  503. package/dist/shared/types/messages.js +0 -1
  504. package/dist/shared/types/nested.js +0 -1
  505. package/dist/shared/types/owned-runs.js +0 -1
  506. package/dist/shared/types/progress.js +0 -1
  507. package/dist/shared/types/questions.js +0 -1
  508. package/dist/shared/types/results.js +0 -1
  509. package/dist/shared/types/state.js +0 -1
  510. package/dist/shared/types/usage.js +0 -1
  511. package/dist/shared/types/workflow.js +0 -1
  512. package/dist/shared/ui-mode.js +0 -3
  513. package/dist/shared/utils.js +0 -128
  514. package/dist/slash/command-discovery.js +0 -83
  515. package/dist/slash/command-input.js +0 -190
  516. package/dist/slash/prompt-template-bridge.js +0 -122
  517. package/dist/slash/prompt-template-contract.js +0 -77
  518. package/dist/slash/prompt-template-results.js +0 -125
  519. package/dist/slash/request-protocol.js +0 -68
  520. package/dist/slash/result-delivery.js +0 -237
  521. package/dist/slash/saved-chain.js +0 -78
  522. package/dist/slash/slash-bridge.js +0 -150
  523. package/dist/slash/slash-commands.js +0 -136
  524. package/dist/slash/slash-live-state.js +0 -267
  525. package/dist/tui/action-hints.js +0 -103
  526. package/dist/tui/activity-lines.js +0 -32
  527. package/dist/tui/agent-browser.js +0 -290
  528. package/dist/tui/agent-controls.js +0 -289
  529. package/dist/tui/agent-conversation.js +0 -444
  530. package/dist/tui/agent-dock.js +0 -171
  531. package/dist/tui/agent-history.js +0 -50
  532. package/dist/tui/agent-model.js +0 -62
  533. package/dist/tui/agent-picker.js +0 -262
  534. package/dist/tui/agent-view.js +0 -350
  535. package/dist/tui/compact-results.js +0 -193
  536. package/dist/tui/conversation-details.js +0 -190
  537. package/dist/tui/conversation-frame.js +0 -135
  538. package/dist/tui/conversation-history.js +0 -210
  539. package/dist/tui/conversation-menu.js +0 -78
  540. package/dist/tui/conversation-notices.js +0 -79
  541. package/dist/tui/conversation-selection.js +0 -58
  542. package/dist/tui/conversation-viewport.js +0 -129
  543. package/dist/tui/direction-message.js +0 -27
  544. package/dist/tui/display.js +0 -282
  545. package/dist/tui/editor-viewport.js +0 -18
  546. package/dist/tui/expanded-content.js +0 -87
  547. package/dist/tui/expanded-multi.js +0 -170
  548. package/dist/tui/expanded-single.js +0 -65
  549. package/dist/tui/history-cards.js +0 -202
  550. package/dist/tui/history-display.js +0 -238
  551. package/dist/tui/history-json.js +0 -16
  552. package/dist/tui/history-metadata.js +0 -152
  553. package/dist/tui/history-record.js +0 -251
  554. package/dist/tui/history-text.js +0 -34
  555. package/dist/tui/indexed-history.js +0 -116
  556. package/dist/tui/nested-widget.js +0 -120
  557. package/dist/tui/picker-page.js +0 -59
  558. package/dist/tui/render.js +0 -72
  559. package/dist/tui/result-facts.js +0 -64
  560. package/dist/tui/task-observation.js +0 -59
  561. package/dist/tui/task-store.js +0 -366
  562. package/dist/tui/text-values.js +0 -16
  563. package/dist/tui/view-connections.js +0 -47
  564. package/dist/tui/view-model.js +0 -94
  565. package/dist/tui/view-persistence.js +0 -51
  566. package/dist/tui/view-ports.js +0 -1
  567. package/dist/tui/view-session.js +0 -37
  568. package/dist/tui/widget-details.js +0 -144
  569. package/dist/tui/widget-status.js +0 -245
  570. package/dist/tui/widget.js +0 -145
  571. package/dist/tui/workflow-labels.js +0 -223
  572. package/dist/tui/workflow-outcomes.js +0 -124
  573. package/generated/RunValidators.d.ts +0 -28
  574. package/generated/RunValidators.js +0 -2
  575. package/prompts/gather-context-and-clarify.md +0 -14
  576. package/prompts/parallel-cleanup.md +0 -65
  577. package/prompts/parallel-context-build.md +0 -59
  578. package/prompts/parallel-handoff-plan.md +0 -68
  579. package/prompts/parallel-research.md +0 -55
  580. package/prompts/parallel-review.md +0 -61
  581. package/prompts/review-loop.md +0 -44
  582. package/scripts/generate-run-schemas.mjs +0 -210
  583. package/skills/pi-intercom/evals/evals.json +0 -29
  584. package/skills/pi-intercom/evals/trigger-evals.json +0 -47
  585. package/skills/pi-intercom/references/peer-sessions.md +0 -74
  586. package/skills/pi-subagents/evals/evals.json +0 -29
  587. package/skills/pi-subagents/evals/trigger-evals.json +0 -42
  588. package/skills/pi-subagents/references/full-orchestration-guide.md +0 -1005
  589. package/src/agents/agent-defaults.ts +0 -13
  590. package/src/agents/agent-definition.ts +0 -253
  591. package/src/agents/agent-management.ts +0 -120
  592. package/src/agents/agent-scope.ts +0 -11
  593. package/src/agents/agent-selection.ts +0 -22
  594. package/src/agents/agent-serializer.ts +0 -90
  595. package/src/agents/agents.ts +0 -214
  596. package/src/agents/builtin-overrides.ts +0 -297
  597. package/src/agents/chain-serializer.ts +0 -3
  598. package/src/agents/config-values.ts +0 -57
  599. package/src/agents/discovery-paths.ts +0 -134
  600. package/src/agents/frontmatter.ts +0 -39
  601. package/src/agents/identity.ts +0 -61
  602. package/src/agents/json-chain.ts +0 -305
  603. package/src/agents/management-config.ts +0 -342
  604. package/src/agents/management-format.ts +0 -243
  605. package/src/agents/management-persistence.ts +0 -408
  606. package/src/agents/management-targets.ts +0 -260
  607. package/src/agents/management-warnings.ts +0 -115
  608. package/src/agents/markdown-chain.ts +0 -237
  609. package/src/agents/package-agents.ts +0 -231
  610. package/src/agents/skill-files.ts +0 -182
  611. package/src/agents/skill-search-paths.ts +0 -289
  612. package/src/agents/skill-types.ts +0 -31
  613. package/src/agents/skills.ts +0 -179
  614. package/src/extension/acceptance-schema.ts +0 -88
  615. package/src/extension/build-info.ts +0 -2
  616. package/src/extension/chain-schema.ts +0 -276
  617. package/src/extension/child-runtime.ts +0 -302
  618. package/src/extension/compact-tools.ts +0 -271
  619. package/src/extension/config-schema.ts +0 -59
  620. package/src/extension/config.ts +0 -45
  621. package/src/extension/control-notice-schema.ts +0 -55
  622. package/src/extension/control-notices.ts +0 -71
  623. package/src/extension/delegation-bridges.ts +0 -59
  624. package/src/extension/doctor.ts +0 -207
  625. package/src/extension/everyday-schemas.ts +0 -252
  626. package/src/extension/fanout-child.ts +0 -33
  627. package/src/extension/index.ts +0 -31
  628. package/src/extension/message-renderers.ts +0 -334
  629. package/src/extension/nested-control-inbox.ts +0 -196
  630. package/src/extension/parent-runtime.ts +0 -405
  631. package/src/extension/primary-tool.ts +0 -130
  632. package/src/extension/result-snapshot.ts +0 -9
  633. package/src/extension/runtime-reload.ts +0 -72
  634. package/src/extension/runtime-storage.ts +0 -49
  635. package/src/extension/schema-overrides.ts +0 -114
  636. package/src/extension/schemas.ts +0 -477
  637. package/src/extension/tool-input.ts +0 -46
  638. package/src/extension/tool-result.ts +0 -47
  639. package/src/history/answer-texts.ts +0 -74
  640. package/src/history/canonical-result.ts +0 -138
  641. package/src/history/canonical-selection.ts +0 -54
  642. package/src/history/database-generation.ts +0 -86
  643. package/src/history/database.ts +0 -97
  644. package/src/history/entry-ingestion.ts +0 -129
  645. package/src/history/index.ts +0 -434
  646. package/src/history/ingest.ts +0 -387
  647. package/src/history/output-digests.ts +0 -41
  648. package/src/history/preview.ts +0 -235
  649. package/src/history/prune.ts +0 -48
  650. package/src/history/queries.ts +0 -125
  651. package/src/history/query-scope.ts +0 -278
  652. package/src/history/rows.ts +0 -118
  653. package/src/history/run-projection.ts +0 -162
  654. package/src/history/run-queries.ts +0 -199
  655. package/src/history/schema.ts +0 -34
  656. package/src/history/search-queries.ts +0 -223
  657. package/src/history/selected-record.ts +0 -140
  658. package/src/history/source-file.ts +0 -51
  659. package/src/history/source-watches.ts +0 -156
  660. package/src/history/store.ts +0 -332
  661. package/src/history/text-chunks.ts +0 -186
  662. package/src/history/text.ts +0 -43
  663. package/src/history/transcript-queries.ts +0 -257
  664. package/src/history/types.ts +0 -29
  665. package/src/history/values.ts +0 -36
  666. package/src/history/wire-inputs.ts +0 -141
  667. package/src/history/wire-models.ts +0 -51
  668. package/src/history/worker-runtime.ts +0 -502
  669. package/src/history/worker.ts +0 -99
  670. package/src/intercom/intercom-bridge.ts +0 -190
  671. package/src/intercom/live-intercom.ts +0 -209
  672. package/src/intercom/nested-result-tree.ts +0 -213
  673. package/src/intercom/result-delivery.ts +0 -56
  674. package/src/intercom/result-intercom.ts +0 -308
  675. package/src/pi-intercom/bridge-ask.ts +0 -64
  676. package/src/pi-intercom/bridge-broadcast.ts +0 -70
  677. package/src/pi-intercom/bridge-catalog.ts +0 -489
  678. package/src/pi-intercom/bridge-control.ts +0 -179
  679. package/src/pi-intercom/bridge-groups.ts +0 -169
  680. package/src/pi-intercom/bridge-launch-journal.ts +0 -122
  681. package/src/pi-intercom/bridge-launch-policy.ts +0 -190
  682. package/src/pi-intercom/bridge-launch.ts +0 -506
  683. package/src/pi-intercom/bridge-operations.ts +0 -169
  684. package/src/pi-intercom/bridge-rpc-process.ts +0 -330
  685. package/src/pi-intercom/interview.ts +0 -295
  686. package/src/pi-intercom/native-control-auth.ts +0 -89
  687. package/src/pi-intercom/native-control-protocol.ts +0 -180
  688. package/src/pi-intercom/native-control.ts +0 -160
  689. package/src/pi-intercom/peer-awareness.ts +0 -84
  690. package/src/pi-intercom/saved-transcript.ts +0 -175
  691. package/src/pi-intercom/subagent-events.ts +0 -299
  692. package/src/pi-intercom/subagent-live-events.ts +0 -236
  693. package/src/pi-intercom/supervisor.ts +0 -362
  694. package/src/pi-intercom/topic-actions.ts +0 -243
  695. package/src/pi-intercom/topics.ts +0 -271
  696. package/src/pi-intercom/transcript.ts +0 -226
  697. package/src/pi-intercom/ui/compose-paste.ts +0 -109
  698. package/src/pi-intercom/ui/compose.ts +0 -305
  699. package/src/pi-intercom/ui/inline-message.ts +0 -110
  700. package/src/pi-intercom/ui/message-renderers.ts +0 -182
  701. package/src/pi-intercom/ui/overlay.ts +0 -238
  702. package/src/pi-intercom/ui/session-list.ts +0 -222
  703. package/src/pi-intercom/ui/tool-renderers.ts +0 -148
  704. package/src/pi-intercom/ui/topic-view.ts +0 -107
  705. package/src/runs/background/async-chain-plan.ts +0 -451
  706. package/src/runs/background/async-control.ts +0 -219
  707. package/src/runs/background/async-execution.ts +0 -227
  708. package/src/runs/background/async-job-admission.ts +0 -54
  709. package/src/runs/background/async-job-projection.ts +0 -225
  710. package/src/runs/background/async-job-tracker.ts +0 -441
  711. package/src/runs/background/async-launch.ts +0 -319
  712. package/src/runs/background/async-plan.ts +0 -285
  713. package/src/runs/background/async-result-file.ts +0 -104
  714. package/src/runs/background/async-resume.ts +0 -386
  715. package/src/runs/background/async-run-discovery.ts +0 -264
  716. package/src/runs/background/async-run-location.ts +0 -194
  717. package/src/runs/background/async-run-record.ts +0 -14
  718. package/src/runs/background/async-run-repair.ts +0 -307
  719. package/src/runs/background/async-run-summary.ts +0 -71
  720. package/src/runs/background/async-single-plan.ts +0 -168
  721. package/src/runs/background/async-status-projection.ts +0 -188
  722. package/src/runs/background/async-status-render.ts +0 -164
  723. package/src/runs/background/async-status-validation.ts +0 -238
  724. package/src/runs/background/async-status.ts +0 -9
  725. package/src/runs/background/async-value.ts +0 -29
  726. package/src/runs/background/completion-dedupe.ts +0 -65
  727. package/src/runs/background/completion-delivery.ts +0 -321
  728. package/src/runs/background/completion-receipts.ts +0 -309
  729. package/src/runs/background/legacy-status-acceptance.ts +0 -38
  730. package/src/runs/background/notify.ts +0 -174
  731. package/src/runs/background/parallel-groups.ts +0 -102
  732. package/src/runs/background/result-payload.ts +0 -268
  733. package/src/runs/background/result-watcher.ts +0 -520
  734. package/src/runs/background/run-id-resolver.ts +0 -138
  735. package/src/runs/background/run-schemas.ts +0 -240
  736. package/src/runs/background/run-status-contracts.ts +0 -46
  737. package/src/runs/background/run-status-render.ts +0 -364
  738. package/src/runs/background/run-status.ts +0 -366
  739. package/src/runs/background/runner-attempt-output.ts +0 -281
  740. package/src/runs/background/runner-attempt.ts +0 -354
  741. package/src/runs/background/runner-child-executor.ts +0 -232
  742. package/src/runs/background/runner-child-observer.ts +0 -278
  743. package/src/runs/background/runner-completion-summary.ts +0 -106
  744. package/src/runs/background/runner-completion.ts +0 -274
  745. package/src/runs/background/runner-config.ts +0 -52
  746. package/src/runs/background/runner-contract.ts +0 -51
  747. package/src/runs/background/runner-dynamic.ts +0 -185
  748. package/src/runs/background/runner-finalization.ts +0 -203
  749. package/src/runs/background/runner-graph.ts +0 -91
  750. package/src/runs/background/runner-initial-status.ts +0 -72
  751. package/src/runs/background/runner-lifecycle.ts +0 -159
  752. package/src/runs/background/runner-monitor.ts +0 -401
  753. package/src/runs/background/runner-parallel.ts +0 -279
  754. package/src/runs/background/runner-prepare-step.ts +0 -128
  755. package/src/runs/background/runner-reporting.ts +0 -192
  756. package/src/runs/background/runner-status.ts +0 -220
  757. package/src/runs/background/runner-step-output.ts +0 -156
  758. package/src/runs/background/runner-step-record.ts +0 -76
  759. package/src/runs/background/runner-step.ts +0 -150
  760. package/src/runs/background/runner-streaming.ts +0 -220
  761. package/src/runs/background/runner-workflow.ts +0 -284
  762. package/src/runs/background/stale-run-reconciler.ts +0 -312
  763. package/src/runs/background/subagent-runner-launcher.ts +0 -88
  764. package/src/runs/background/subagent-runner.ts +0 -85
  765. package/src/runs/background/top-level-async.ts +0 -15
  766. package/src/runs/foreground/chain-clarify.ts +0 -505
  767. package/src/runs/foreground/clarification-draft.ts +0 -92
  768. package/src/runs/foreground/clarify-contracts.ts +0 -33
  769. package/src/runs/foreground/clarify-invocation.ts +0 -204
  770. package/src/runs/foreground/clarify-text-editor.ts +0 -229
  771. package/src/runs/foreground/clarify-view.ts +0 -222
  772. package/src/runs/foreground/execution-input.ts +0 -401
  773. package/src/runs/foreground/execution-routing.ts +0 -41
  774. package/src/runs/foreground/execution-timeout.ts +0 -92
  775. package/src/runs/foreground/foreground-control.ts +0 -342
  776. package/src/runs/foreground/foreground-memory.ts +0 -132
  777. package/src/runs/foreground/invocation-context.ts +0 -88
  778. package/src/runs/foreground/invocation-execution.ts +0 -465
  779. package/src/runs/foreground/invocation-expansion.ts +0 -58
  780. package/src/runs/foreground/management-actions.ts +0 -360
  781. package/src/runs/foreground/nested-control.ts +0 -248
  782. package/src/runs/foreground/question-continuation.ts +0 -112
  783. package/src/runs/foreground/question-control.ts +0 -309
  784. package/src/runs/foreground/resume-target.ts +0 -330
  785. package/src/runs/foreground/revival-launch-policy.ts +0 -112
  786. package/src/runs/foreground/run-async-path.ts +0 -327
  787. package/src/runs/foreground/run-interrupt.ts +0 -202
  788. package/src/runs/foreground/run-nudge.ts +0 -355
  789. package/src/runs/foreground/saved-revival.ts +0 -356
  790. package/src/runs/foreground/subagent-executor.ts +0 -203
  791. package/src/runs/foreground/subagent-params.ts +0 -392
  792. package/src/runs/foreground/wait-observation.ts +0 -160
  793. package/src/runs/foreground/wait-registration.ts +0 -18
  794. package/src/runs/foreground/wait-run.ts +0 -366
  795. package/src/runs/shared/acceptance-contract.ts +0 -458
  796. package/src/runs/shared/acceptance-defaults.ts +0 -1
  797. package/src/runs/shared/acceptance-evaluation.ts +0 -349
  798. package/src/runs/shared/acceptance-finalization.ts +0 -495
  799. package/src/runs/shared/acceptance-outcome.ts +0 -69
  800. package/src/runs/shared/acceptance-reports.ts +0 -246
  801. package/src/runs/shared/acceptance-submission.ts +0 -251
  802. package/src/runs/shared/acceptance-verification.ts +0 -118
  803. package/src/runs/shared/acceptance.ts +0 -31
  804. package/src/runs/shared/chain-outputs.ts +0 -206
  805. package/src/runs/shared/child-attempt-types.ts +0 -118
  806. package/src/runs/shared/child-attempt.ts +0 -387
  807. package/src/runs/shared/child-boundaries.ts +0 -217
  808. package/src/runs/shared/child-context-filter.ts +0 -53
  809. package/src/runs/shared/child-event-observer.ts +0 -496
  810. package/src/runs/shared/child-execution-cwd.ts +0 -162
  811. package/src/runs/shared/child-execution-outcome.ts +0 -103
  812. package/src/runs/shared/child-invocation.ts +0 -74
  813. package/src/runs/shared/child-message-validation.ts +0 -233
  814. package/src/runs/shared/child-native-accounting.ts +0 -154
  815. package/src/runs/shared/child-native-observation.ts +0 -79
  816. package/src/runs/shared/child-observation-spool.ts +0 -193
  817. package/src/runs/shared/child-observations.ts +0 -229
  818. package/src/runs/shared/child-presence.ts +0 -6
  819. package/src/runs/shared/child-route-env.ts +0 -142
  820. package/src/runs/shared/child-stream-observer.ts +0 -302
  821. package/src/runs/shared/child-stream-projection.ts +0 -160
  822. package/src/runs/shared/child-structured-tool.ts +0 -38
  823. package/src/runs/shared/claude-code.ts +0 -216
  824. package/src/runs/shared/claude-model.ts +0 -67
  825. package/src/runs/shared/claude-session.ts +0 -124
  826. package/src/runs/shared/claude-types.ts +0 -31
  827. package/src/runs/shared/completion-guard.ts +0 -44
  828. package/src/runs/shared/control-event-policy.ts +0 -15
  829. package/src/runs/shared/control-notification-owner.ts +0 -20
  830. package/src/runs/shared/dynamic-fanout.ts +0 -459
  831. package/src/runs/shared/dynamic-item.ts +0 -114
  832. package/src/runs/shared/history-index.ts +0 -130
  833. package/src/runs/shared/legacy-async-recovery.ts +0 -153
  834. package/src/runs/shared/legacy-output-recovery.ts +0 -214
  835. package/src/runs/shared/mcp-config-schema.ts +0 -46
  836. package/src/runs/shared/mcp-direct-tool-allowlist.ts +0 -465
  837. package/src/runs/shared/model-fallback.ts +0 -344
  838. package/src/runs/shared/mutating-tool-guard.ts +0 -295
  839. package/src/runs/shared/native-finalization-types.ts +0 -29
  840. package/src/runs/shared/native-finalization.ts +0 -252
  841. package/src/runs/shared/native-usage.ts +0 -396
  842. package/src/runs/shared/nested-control-records.ts +0 -178
  843. package/src/runs/shared/nested-events.ts +0 -45
  844. package/src/runs/shared/nested-path.ts +0 -65
  845. package/src/runs/shared/nested-projection.ts +0 -230
  846. package/src/runs/shared/nested-protocol.ts +0 -67
  847. package/src/runs/shared/nested-registry.ts +0 -273
  848. package/src/runs/shared/nested-render.ts +0 -217
  849. package/src/runs/shared/nested-route.ts +0 -292
  850. package/src/runs/shared/nested-validation.ts +0 -291
  851. package/src/runs/shared/owned-child-evidence.ts +0 -184
  852. package/src/runs/shared/owned-run-list.ts +0 -187
  853. package/src/runs/shared/owned-run-observation.ts +0 -368
  854. package/src/runs/shared/owned-run-progress.ts +0 -172
  855. package/src/runs/shared/owned-run-read-state.ts +0 -7
  856. package/src/runs/shared/owned-run-results.ts +0 -289
  857. package/src/runs/shared/owned-run-status.ts +0 -239
  858. package/src/runs/shared/owned-run-view.ts +0 -65
  859. package/src/runs/shared/owned-workflow-details.ts +0 -24
  860. package/src/runs/shared/owner-output.ts +0 -73
  861. package/src/runs/shared/parallel-utils.ts +0 -93
  862. package/src/runs/shared/parent-receipts.ts +0 -186
  863. package/src/runs/shared/parent-usage.ts +0 -344
  864. package/src/runs/shared/pi-args.ts +0 -280
  865. package/src/runs/shared/pi-launch-input.ts +0 -48
  866. package/src/runs/shared/pi-session-launch.ts +0 -94
  867. package/src/runs/shared/pi-spawn.ts +0 -76
  868. package/src/runs/shared/run-history-queries.ts +0 -195
  869. package/src/runs/shared/run-history.ts +0 -221
  870. package/src/runs/shared/run-id-ambiguity.ts +0 -8
  871. package/src/runs/shared/run-metadata-paths.ts +0 -17
  872. package/src/runs/shared/run-metadata.ts +0 -240
  873. package/src/runs/shared/run-persistence.ts +0 -181
  874. package/src/runs/shared/run-records.ts +0 -19
  875. package/src/runs/shared/run-restoration.ts +0 -455
  876. package/src/runs/shared/run-state-owner.ts +0 -31
  877. package/src/runs/shared/session-cwd-preload.ts +0 -47
  878. package/src/runs/shared/single-output.ts +0 -416
  879. package/src/runs/shared/stable-value.ts +0 -15
  880. package/src/runs/shared/streaming-text.ts +0 -45
  881. package/src/runs/shared/structured-output.ts +0 -98
  882. package/src/runs/shared/subagent-control.ts +0 -352
  883. package/src/runs/shared/subagent-prompt-runtime.ts +0 -119
  884. package/src/runs/shared/subagent-tool-loop-guard.ts +0 -139
  885. package/src/runs/shared/supervisor-question-state.ts +0 -221
  886. package/src/runs/shared/supervisor-questions.ts +0 -410
  887. package/src/runs/shared/workflow-graph.ts +0 -422
  888. package/src/runs/shared/workflow-policy.ts +0 -260
  889. package/src/runs/shared/worktree-contract.ts +0 -29
  890. package/src/runs/shared/worktree-hook.ts +0 -181
  891. package/src/runs/shared/worktree-location.ts +0 -61
  892. package/src/runs/shared/worktree-preservation.ts +0 -10
  893. package/src/runs/shared/worktree-process.ts +0 -132
  894. package/src/runs/shared/worktree.ts +0 -507
  895. package/src/shared/agent-context-policy.ts +0 -215
  896. package/src/shared/agent-dir.ts +0 -15
  897. package/src/shared/artifacts.ts +0 -126
  898. package/src/shared/atomic-json.ts +0 -19
  899. package/src/shared/chain-files.ts +0 -72
  900. package/src/shared/concurrency.ts +0 -27
  901. package/src/shared/content-preview.ts +0 -117
  902. package/src/shared/execution-cwd.ts +0 -39
  903. package/src/shared/file-coalescer.ts +0 -31
  904. package/src/shared/fork-context.ts +0 -72
  905. package/src/shared/formatters.ts +0 -125
  906. package/src/shared/journal-reader.ts +0 -18
  907. package/src/shared/lazy-tools.ts +0 -85
  908. package/src/shared/message-output.ts +0 -146
  909. package/src/shared/model-info.ts +0 -117
  910. package/src/shared/native-import.ts +0 -25
  911. package/src/shared/native-session-loader.ts +0 -13
  912. package/src/shared/native-session.ts +0 -6
  913. package/src/shared/native-tui.ts +0 -20
  914. package/src/shared/native-typebox.ts +0 -29
  915. package/src/shared/prompt-sections.ts +0 -16
  916. package/src/shared/session-entries.ts +0 -108
  917. package/src/shared/session-identity.ts +0 -25
  918. package/src/shared/settings.ts +0 -196
  919. package/src/shared/status-format.ts +0 -232
  920. package/src/shared/task-file-policy.ts +0 -35
  921. package/src/shared/temp-root.ts +0 -158
  922. package/src/shared/types/acceptance.ts +0 -149
  923. package/src/shared/types/async.ts +0 -247
  924. package/src/shared/types/config.ts +0 -139
  925. package/src/shared/types/details.ts +0 -104
  926. package/src/shared/types/history.ts +0 -217
  927. package/src/shared/types/inputs.ts +0 -4
  928. package/src/shared/types/intercom.ts +0 -57
  929. package/src/shared/types/launch.ts +0 -39
  930. package/src/shared/types/messages.ts +0 -104
  931. package/src/shared/types/nested.ts +0 -153
  932. package/src/shared/types/owned-runs.ts +0 -148
  933. package/src/shared/types/progress.ts +0 -106
  934. package/src/shared/types/questions.ts +0 -103
  935. package/src/shared/types/results.ts +0 -119
  936. package/src/shared/types/state.ts +0 -56
  937. package/src/shared/types/usage.ts +0 -36
  938. package/src/shared/types/workflow.ts +0 -187
  939. package/src/shared/ui-mode.ts +0 -5
  940. package/src/shared/utils.ts +0 -148
  941. package/src/slash/command-discovery.ts +0 -110
  942. package/src/slash/command-input.ts +0 -232
  943. package/src/slash/prompt-template-bridge.ts +0 -161
  944. package/src/slash/prompt-template-contract.ts +0 -152
  945. package/src/slash/prompt-template-results.ts +0 -189
  946. package/src/slash/request-protocol.ts +0 -87
  947. package/src/slash/result-delivery.ts +0 -312
  948. package/src/slash/saved-chain.ts +0 -115
  949. package/src/slash/slash-bridge.ts +0 -224
  950. package/src/slash/slash-commands.ts +0 -195
  951. package/src/slash/slash-live-state.ts +0 -350
  952. package/src/tui/action-hints.ts +0 -155
  953. package/src/tui/activity-lines.ts +0 -40
  954. package/src/tui/agent-browser.ts +0 -354
  955. package/src/tui/agent-controls.ts +0 -355
  956. package/src/tui/agent-conversation.ts +0 -514
  957. package/src/tui/agent-dock.ts +0 -250
  958. package/src/tui/agent-history.ts +0 -68
  959. package/src/tui/agent-model.ts +0 -78
  960. package/src/tui/agent-picker.ts +0 -325
  961. package/src/tui/agent-view.ts +0 -403
  962. package/src/tui/compact-results.ts +0 -342
  963. package/src/tui/conversation-details.ts +0 -206
  964. package/src/tui/conversation-frame.ts +0 -184
  965. package/src/tui/conversation-history.ts +0 -260
  966. package/src/tui/conversation-menu.ts +0 -119
  967. package/src/tui/conversation-notices.ts +0 -116
  968. package/src/tui/conversation-selection.ts +0 -66
  969. package/src/tui/conversation-viewport.ts +0 -169
  970. package/src/tui/direction-message.ts +0 -35
  971. package/src/tui/display.ts +0 -409
  972. package/src/tui/editor-viewport.ts +0 -19
  973. package/src/tui/expanded-content.ts +0 -134
  974. package/src/tui/expanded-multi.ts +0 -264
  975. package/src/tui/expanded-single.ts +0 -92
  976. package/src/tui/history-cards.ts +0 -298
  977. package/src/tui/history-display.ts +0 -334
  978. package/src/tui/history-json.ts +0 -17
  979. package/src/tui/history-metadata.ts +0 -177
  980. package/src/tui/history-record.ts +0 -321
  981. package/src/tui/history-text.ts +0 -34
  982. package/src/tui/indexed-history.ts +0 -149
  983. package/src/tui/nested-widget.ts +0 -192
  984. package/src/tui/picker-page.ts +0 -80
  985. package/src/tui/render.ts +0 -104
  986. package/src/tui/result-facts.ts +0 -99
  987. package/src/tui/task-observation.ts +0 -96
  988. package/src/tui/task-store.ts +0 -432
  989. package/src/tui/text-values.ts +0 -20
  990. package/src/tui/view-connections.ts +0 -64
  991. package/src/tui/view-model.ts +0 -181
  992. package/src/tui/view-persistence.ts +0 -57
  993. package/src/tui/view-ports.ts +0 -55
  994. package/src/tui/view-session.ts +0 -42
  995. package/src/tui/widget-details.ts +0 -220
  996. package/src/tui/widget-status.ts +0 -331
  997. package/src/tui/widget.ts +0 -208
  998. package/src/tui/workflow-labels.ts +0 -340
  999. package/src/tui/workflow-outcomes.ts +0 -150
package/docs/intercom.md CHANGED
@@ -1,611 +1,160 @@
1
- # Intercom
1
+ # Local agent communication
2
2
 
3
- Direct 1:1 messaging between pi sessions on the same machine. Send context, findings, or requests from one session to another — whether you're driving the conversation or letting agents coordinate.
3
+ `intercom` is always available with the package. There is no `load_intercom`,
4
+ child-only supervisor tool, peer overlay, topic registry, or separate extension
5
+ to install. Ordinary and delegated sessions use the same messaging tool.
4
6
 
5
- ```text
6
- Your agents: Option+Shift+M (Alt+Shift+M) or /agents. Other peers: /intercom [all]. Quiet current state: /intercom topics.
7
- ```
8
-
9
- ## Why
10
-
11
- Sometimes you're running multiple pi sessions — one researching, one executing, one reviewing. Pi-intercom lets you:
12
-
13
- - **User-driven orchestration** — Send context or findings from your research session to your execution session
14
- - **Agent collaboration** — An agent can reach out to another session when it needs help or wants to share results
15
- - **Session awareness** — See what other pi sessions are running and their current status
16
-
17
- Intercom sends direct messages to the session you choose.
18
-
19
- Intercom is bundled with `pi-subagents`: delegated child agents get a child-only `contact_supervisor` tool when the subagent extension supplies bridge metadata. Use blocking `need_decision` or `interview_request` only when the ephemeral child cannot safely continue and must remain alive for the reply. Use `progress_update` only for a discovery or change the supervisor needs while working. It steers at the next tool boundary; skip starts, redundant narration, and routine completion, and retain material findings in the final result. Fresh normal sessions see `load_intercom`, a small entry that enables the full `intercom` tool without sending or checking anything.
20
-
21
- The broker, presence, receipts and keyboard UI stay active while the model schema is hidden. Call `load_intercom({})` for explicit peer checks, messaging or topics. Actionable peer inbound and recovered reply obligations enable `intercom` before model delivery; mere presence, passive breadcrumbs, routine synthetic child notices, and human-origin messages answered in chat do not. Managed-child `contact_supervisor` remains eager. If an explicit tool policy permits only `intercom` without its loader, it stays eager; excluded tools never reactivate. Selection follows native session/branch declarations and stays stable between turns.
22
-
23
- ## In One Minute
24
-
25
- Each Pi session with the bundled intercom extension loaded connects to a tiny local broker over a local IPC transport. The broker keeps track of connected sessions and routes direct messages to the one you target by name or session ID. The extension gives you both a tool (`intercom`) and a small peer overlay (`/intercom`); Option+Shift+M (Alt+Shift+M) toggles owned agent conversations when `pi-subagents` is loaded. Messages that do not request a reply default to steer: they wake idle recipients and reach active recipients after the current tool call. Important steers release portable subagent waits without stopping the owner or child. Background calls return immediate receipts, with completion delivered later as a separate wake-up message. Foreground waits return saved results or durable questions and release for important Intercom attention without stopping existing work. Explicit queue waits behind active work, and passive delivery is a discouraged opt-in for human-visible breadcrumbs only. Quiet topic state uses native custom entries outside model context, not passive messages.
26
-
27
- ## Install
28
-
29
- Intercom requires Pi **1.0.0** and Node **24.21.0** or later. No Pi fork is required.
30
-
31
- ```bash
32
- pi install npm:@fitchmultz/pi-subagents
33
- ```
34
-
35
- Install from Git:
36
-
37
- ```bash
38
- pi install git:github.com/fitchmultz/pi-subagents
39
- ```
40
-
41
- That one package includes both extension entries and both skills. For a local checkout, follow the [runtime-only install and rebuild recipe](reference.md#installation): run `npm install --omit=dev` before registering or loading it, including after development validation. Before rebuilding or updating an in-use Pi checkout or extension, checkpoint work and fully quit every Pi session using that installation. Update from a separate terminal, then restart Pi and resume the same saved parent session to retain ownership and pending coordination. `/reload` refreshes supported settings, skills, and prompts but is not a reliable code-update boundary.
42
-
43
- To restart the shared broker too, close every Pi session using the same agent directory and wait at least five seconds before reopening Pi.
44
-
45
- ## Development
46
-
47
- Follow the [local validation instructions](development.md#local-validation). Keep retained/cleared custom-queue, rejected-input and pre-admission preparation regressions intact and report results for the exact selected host; earlier published Pi 0.87.1 failures are historical evidence, not current 1.0 certification.
48
-
49
- `ci` runs typechecking, package and install smokes, and the full subagent/intercom test suite. The native intercom regression uses real SDK sessions, a controlled provider, and private runtime directories without credentials or model-service calls. To run just that regression:
50
-
51
- ```bash
52
- PI_INTERCOM_TEST_SDK=/path/to/pi/packages/coding-agent node --test test/integration/pi-intercom-native-replay.test.ts
53
- ```
54
-
55
- The real-Pi smoke installs the single checkout into an isolated temporary Pi home, verifies `pi list`, and loads both bundled extension entries. Use direct `node` with the intended CLI first on `PATH`:
56
-
57
- ```bash
58
- export PATH="$PWD/node_modules/.bin:$PATH"
59
- node scripts/real-pi-smoke.mjs
60
- PI_REAL_SMOKE_MODEL=openai/gpt-6-astra node scripts/real-pi-smoke.mjs --llm
61
- ```
62
-
63
- The `--llm` mode copies local `auth.json` and `models.json` into the isolated Pi agent dir. Set `PI_REAL_SMOKE_AUTH_AGENT_DIR` if your auth files are not in `~/.pi/agent`.
64
-
65
- Pi-intercom automatically gives ordinary agents a bounded presence hint when another connected session is working in the same Git repository, including separate worktrees. The hint is a constant count-free string; agents load `load_intercom({})` if needed, then use `intercom({ action: "list" })` before changing shared state or coordinating known overlapping work. Routine standalone read-only tasks do not need a peer check. No message is sent automatically. This guidance applies on official Pi and the fork; broker presence, delivery, approvals, and child recovery are unchanged. Both the tool and `/intercom` overlay default to that repository/worktree scope. Use `intercom({ action: "list", scope: "all" })` or `/intercom all` only when intentionally discovering sessions in other projects. Managed `pi-subagents` children keep their dedicated supervisor channel instead of receiving the peer hint. Project matching is an advisory presence signal, not an authorization boundary. Add project instructions only when you want a stricter mandatory coordination policy.
66
-
67
- A session becomes intercom-connected when all of these are true:
68
-
69
- - the bundled intercom extension is enabled through `pi config`
70
- - the session has been restarted after the extension was installed or updated
71
- - the local broker is running or can be auto-started
72
-
73
- The session list only shows intercom-connected sessions, not every open Pi process on the machine. Reconnecting the same Pi session reuses a stable broker identity, so transient broker or extension restarts do not create a second logical sender.
74
-
75
- If a session is unnamed, pi-intercom now exposes a runtime-only fallback alias like `subagent-chat-1a2b3c4d` so other sessions can still target it. That alias is not persisted as the Pi session title, so `pi --resume` can keep showing the transcript snippet instead of a generic `session-...` name.
76
-
77
- ## Quick Start
78
-
79
- ### From the Keyboard
80
-
81
- With `pi-subagents`, **Option+Shift+M** (**Alt+Shift+M**) opens your task-labelled agent conversations first; press it again to close. The shortcut is configurable below. In native fullscreen mode, clicking the **Agents** entrance again also closes the open view. See [the agent-view controls](reference.md#try-this-first) for direct human messaging, context replies, saved drafts, unread history, pinning, selected-child stop and explicit continuation. The plain `/intercom` command remains the current-project peer list. Type `/intercom all` to include sessions in other projects:
82
-
83
- 1. **Select a session** — Use arrow keys to pick a target session
84
- 2. **Compose message** — Write your message in the compose overlay. Pasted multiline handoffs are preserved.
85
- 3. **Choose mode** — Press Tab to toggle between Send and Request Reply mode. Request Reply marks the message as needing a reply and adds the recipient reply hint; the overlay itself does not wait for or collect that reply.
86
- 4. **Send** — Press Enter to send, Escape to cancel
87
-
88
- ### Quiet topics and resource owners
89
-
90
- Subscribe explicitly to an exact topic; there are no automatic subscriptions or wildcard broadcasts. Topics span connected local sessions, so use a project/resource-specific name unless cross-project coordination is intended. Publications are self-contained latest state, not deltas. Each sender has one current record per topic; older queued versions cannot replace a newer record. Same-session subscriptions, publications and received records use native session entries. Late subscribers read current published state without replaying earlier interruptions.
7
+ ## Discovery and groups
91
8
 
92
- ```typescript
93
- intercom({ action: "subscribe", topic: "browser/shared-profile/tab-4", awaitRelease: true });
94
- intercom({
95
- action: "publish",
96
- topic: "browser/shared-profile/tab-4",
97
- resource: "tab-4",
98
- ownership: "held",
99
- message: "Reviewing the sign-in flow; keep this tab open.",
100
- });
101
- intercom({ action: "topics", topic: "browser/shared-profile/tab-4" });
102
- intercom({
103
- action: "publish",
104
- topic: "browser/shared-profile/tab-4",
105
- event: "release",
106
- resource: "tab-4",
107
- ownership: "released",
108
- message: "Sign-in check complete; this tab is available.",
109
- });
110
- intercom({ action: "unsubscribe", topic: "browser/shared-profile/tab-4" });
111
- ```
112
-
113
- Routine `event: "update"` publications replace quiet inspectable state; they do not become passive conversation messages or wake a model. Inspect current records and declared resource ownership in **`/intercom topics`** or `intercom({ action: "topics" })`; topic state does not appear in the footer. Ownership is advisory, not an exclusive lock; disconnect means **unavailable/disconnected**, never an implied release.
114
-
115
- `event: "blocker"` and `event: "decision"` steer subscribed sessions. An explicit `event: "release"` interrupts only subscriptions with `awaitRelease: true`; other subscribers get the quiet record. Direct messages, answers and stop acknowledgements bypass topic subscriptions. Keep routine status and browser handoff prose here rather than repeatedly sending it into conversations. The native raw entries remain available as history, but old topic records are not replayed as new work.
116
-
117
- Topics require an updated broker. If an older broker is still serving open sessions, topic actions report that they are unavailable; ordinary messaging and active work stay untouched. Let those sessions close normally. Once the old broker exits, reconnect with the updated package and retry. No broker or active session is stopped or restarted to enable topics.
118
-
119
- ### From the Agent
120
-
121
- The agent can list sessions and send messages using the `intercom` tool. Tool calls and results render as compact transcript rows so send/ask/reply flows are easy to scan. Successful `list` results show only the session count by default in the TUI; press Ctrl+O (or the configured tool-expansion key) to show the full list. For common patterns like planner-worker delegation, the bundled `pi-intercom` skill provides copy-paste ready examples:
122
-
123
- ```typescript
124
- // Enable the peer tool if it is not already available
125
- load_intercom({});
126
- // List connected sessions in this repository and its worktrees
9
+ ```js
127
10
  intercom({ action: "list" });
128
- // → **Current session:**
129
- // → • executor (20d43841) — ~/projects/api (claude-sonnet-4) [self, idle, state:idle, accepts_asks:true, pending_asks:0, last_intercom_activity:none]
130
- // → ↳ self target unavailable; choose a peer from Other sessions; use pending/reply for inbound asks
131
- // → **Other sessions:**
132
- // → • research (6332faab) — ~/projects/api (claude-sonnet-4) [same cwd, thinking, state:busy, accepts_asks:false, pending_asks:1, last_intercom_activity:2m ago]
133
- // → ↳ send defaults to steer; ask only if sender must stay alive for a required reply (default sends without waiting when peer is busy); queue only for intentional delay; passive discouraged
134
-
135
- // Intentionally discover sessions in other projects
136
- intercom({ action: "list", scope: "all" });
137
-
138
- // Send live guidance without blocking this long-lived session; send defaults to steer
139
- intercom({
140
- action: "send",
141
- to: "research",
142
- message: "Check if UserService.validate() handles null. Send the finding back.",
143
- });
144
- // → Message sent to research. This session can end its turn or continue independent work.
145
-
146
- // Check connection status and the same live recipient guidance
11
+ intercom({ action: "list", scope: "project" });
147
12
  intercom({ action: "status" });
148
- // → Connected: Yes, Session ID: abc123, Active sessions: 3
149
- // → Current session and other-session rows follow.
150
-
151
- // Send with attachments (code snippets, files, or context)
152
- intercom({
153
- action: "send",
154
- to: "worker",
155
- message: "Here's the fix:",
156
- attachments: [
157
- {
158
- type: "snippet",
159
- name: "auth.ts",
160
- language: "typescript",
161
- content: "function validate(user: User) { ... }",
162
- },
163
- ],
164
- });
165
- ```
166
-
167
- ### Receiving Messages
168
-
169
- With native [compact view](reference.md#compact-view) enabled, ordinary incoming messages use one content row plus Pi's blank line. In native fullscreen mode, click a collapsed row to reveal its full message and attachments; click it again to collapse. Ctrl+O (or the configured tool-expansion key) still expands all messages. Questions, reply guidance, and needs-attention notices stay prominent. The mode defaults off and does not change delivery or model-visible content.
170
-
171
- When a message arrives, it appears inline in your chat with the sender's info. The cwd label is the sender's **Native session cwd**, not proof of a command's physical directory. Messages sent with `ask` include a reply hint:
172
-
173
- ```
174
- **From research** (Native session cwd: ~/projects/api)
175
-
176
- To reply, use the intercom tool: intercom({ action: "reply", message: "..." })
177
-
178
- Found the issue — UserService.validate() doesn't check for null input.
179
- See auth.ts:142-156.
180
- ```
181
-
182
- The reply hint (enabled by default) points to `intercom({ action: "reply", ... })`, so recipients do not need raw sender or `replyTo` IDs. `send` and `reply` default to steer: they wake an idle recipient or reach a busy recipient at the next tool boundary.
183
-
184
- If Esc clears a steered or follow-up message before native handoff, it is re-delivered after the actual agent run settles. Messages already in Pi's session history are not reinserted, even after compaction or reload; messages still in Pi's native queues remain there for its next continuation or prompt. Pi 1.0's turn-boundary pending messages expose the next queued batch, not the whole custom queue; its coarse `hasPendingMessages()` reports only UI text queues. An empty boundary proves all queues cleared, while a nonempty boundary retains admitted messages until their actual history receipts arrive. Selectively removing individual custom items while other queue items remain is not observable through these public APIs: such items remain pending rather than risk a duplicate. Full queue clearing, retained-queue abort, reload and fresh-process recovery are supported. A rejected overlapping prompt does not start receiver retries while the original run is active.
185
-
186
- Official Pi 1.1.0 runs user preparation hooks before marking a prompt busy. During that pre-admission window, an incoming custom message can legitimately start a separate model request; custom-triggered runs do not run `before_agent_start`. Both inputs and their receipts are preserved, but one combined request is not guaranteed.
187
-
188
- Newer hosts with discriminated `before_agent_start` events also prepare custom-triggered runs, including Intercom and background-command wakeups. A user event has `messageType:"user"` and `prompt`; a custom event has `messageType:"custom"` and `message`, without `prompt`. These hosts mark preparation busy, so Intercom steers arrivals into the starting run instead of launching a separate run. Native steering determines when queued content reaches the model; both inputs and their receipts remain preserved exactly once. Child role/output and peer-awareness sections apply to custom starts without treating notification content as user commands.
189
-
190
- Intercom follows the host's live idle state; it does not reserve rejected input or emulate a core admission hook. Reload also does not cancel active work: abort explicitly when cancellation is intended.
191
-
192
- An omitted `ask` still honors recipient availability; use explicit steer only when the sender must remain alive for a busy recipient's reply. The recipient should incorporate relevant context and continue its active task unless the message explicitly replaces it. Use `delivery:"queue"` only when delay is intentional; `queueMode:"replace"` keeps only the latest undelivered thread update.
193
-
194
- Old queued subagent progress is discarded from pending delivery when its exact generated thread and sender match a proven finished child. Its original checkpoint stays in saved history, but it does not trigger another turn or late notification. Actual final results remain available as completed work. The association survives reload; detached siblings, live successors, unmatched peers, questions, answers, and unrelated explicit queues are unchanged.
195
-
196
- Pending delivery is checkpointed in the saved Pi session before native handoff. Reloading, or resuming that same saved session in a fresh process, restores undelivered messages, including lost native queues, and the latest unsuperseded milestones once; a fork or new session does not adopt them. Resuming again does not replay consumed messages, and passive-only recovery does not start a model turn. Accepted pending messages have no fixed-count backlog cap or age-based expiry. Ordinary peer asks still use the configured reply timeout. Attachment content is included in the agent-visible body and stored in Pi session history. Only passive `send` renders without waking the recipient model.
197
-
198
- ## Workflow: Planner-Worker Coordination
199
-
200
- The most natural use of pi-intercom is splitting a task between two sessions — one holds the big picture, the other does the hands-on work. When the worker hits an ambiguity, it steers the planner without losing context or blocking its long-lived session.
201
-
202
- ### Setup
203
-
204
- Open two terminals and start pi in each. Name them so they can find each other:
205
-
206
- ```
207
- # Terminal 1 # Terminal 2
208
- /name planner /name worker
209
13
  ```
210
14
 
211
- Verify they see each other from either session:
15
+ Default discovery includes every eligible connected session under the same OS
16
+ user, across cwd, Git worktrees, projects, HOME settings, and Pi agent directories.
17
+ `scope:"project"` is an optional convenience filter, not an authority boundary.
18
+ The list does not enumerate all OS processes or disconnected native sessions.
212
19
 
213
- ```typescript
214
- intercom({ action: "list" });
215
- // → • worker — ~/projects/api (claude-sonnet-4) [idle]
216
- ```
20
+ A main session and its children form a collaboration group. Main↔child and
21
+ sibling↔sibling communication works in both directions. Across groups, only
22
+ main↔main communication is allowed. A child cannot discover, message, or read
23
+ another group's main or children—even using a known exact ID. Only mains spawn;
24
+ there is one child level. These are broker-enforced coordination rules, not an OS
25
+ security sandbox against arbitrary code running as the same user.
217
26
 
218
- ### The Conversation
27
+ Registration pins `rootSessionId` and optional `parentSessionId`. Both are native
28
+ Pi session IDs, not cwd or display names. A main uses its own ID as root, without
29
+ a parent. A child uses its main's ID for both. An offline parent does not erase
30
+ sibling membership. Presence updates cannot change the registered group. Legacy
31
+ or remote peers without lineage are standalone mains.
219
32
 
220
- Long-lived Pi sessions normally coordinate without blocking each other. The sender uses `send`, which steers by default, and ends its turn or continues independent work. The recipient sees the message at its next tool boundary, incorporates relevant context, continues the active task, and sends any answer back with steer. A steer supplements the task unless it explicitly says to replace it.
33
+ ### Identity and targeting
221
34
 
222
- **Planner delegates work:**
35
+ Use a target returned by `list`. Native peer IDs are `pi-` plus the first 32
36
+ hexadecimal SHA-256 characters of the native session ID. Reconnecting normally
37
+ reuses that identity. A simultaneous live collision gets a different ID; it never
38
+ merges with or evicts the first connection.
223
39
 
224
- ```typescript
225
- intercom({
226
- action: "send",
227
- to: "worker",
228
- delivery: "steer",
229
- message: "Task-3: Add retry logic to API client. Key files: src/api/client.ts, src/api/types.ts.",
230
- });
231
- ```
40
+ Names are mutable and nonunique. Exact IDs take precedence; otherwise names and
41
+ sufficiently long ID prefixes must resolve unambiguously. Displayed targets grow
42
+ when needed to distinguish collisions. A project-filtered peer can still be
43
+ addressed by its known target; a topology-forbidden peer cannot. A hidden peer
44
+ does not leak through duplicate-name ambiguity or disconnect notifications.
232
45
 
233
- **Worker steers a live discovery without holding its process open:**
46
+ ## Send, ask, and reply
234
47
 
235
- ```typescript
48
+ ```js
49
+ intercom({ action: "send", to: "reviewer", message: "Check refresh-token rotation." });
50
+ intercom({ action: "ask", to: "reviewer", delivery: "steer", message: "Which invariant fails?" });
51
+ intercom({ action: "pending" });
236
52
  intercom({
237
- action: "send",
238
- to: "planner",
239
- delivery: "steer",
240
- message:
241
- "Blocked: should retry apply only to idempotent endpoints? Send the decision back with steer.",
242
- });
243
- // Worker ends its turn instead of polling or waiting.
244
- ```
245
-
246
- **Planner answers while preserving the worker's active task:**
247
-
248
- ```typescript
249
- intercom({
250
- action: "send",
251
- to: "worker",
252
- delivery: "steer",
253
- message:
254
- "Apply retries only to GET/PUT/DELETE. Max 3, exponential backoff from 100ms. Continue the current task.",
255
- });
256
- ```
257
-
258
- **Worker reports completion:**
259
-
260
- ```typescript
261
- intercom({
262
- action: "send",
263
- to: "planner",
264
- delivery: "steer",
265
- message:
266
- "Task-3 done. Added RetryPolicy, applied it to GET/PUT/DELETE, surfaced NetworkError, and passed 4 tests.",
267
- });
268
- ```
269
-
270
- ### Communication Patterns
271
-
272
- | Pattern | Action | Why |
273
- | --------------------------- | -------------- | ----------------------------------------------------------------------------------------------------- |
274
- | **Task Delegation** | `send` + steer | Wakes an idle worker or reaches a busy worker at the next tool boundary without blocking the planner. |
275
- | **Guidance / Answer** | `send` + steer | Makes relevant context available during active work. |
276
- | **Clarification / Blocker** | `send` + steer | Long-lived peers can end their turn and wake when the answer arrives. |
277
- | **Intentional Deferral** | `send` + queue | The recipient should not incorporate the note until after active work. |
278
- | **Ephemeral Blocking Wait** | `ask` + steer | Keeps a short-lived process alive only when it cannot safely continue without the reply. |
279
-
280
- ### Blocking Ask Exception
281
-
282
- Use `ask` only when the sender process must remain alive and cannot safely continue without the answer, such as an ephemeral dispatched subagent. Pass `delivery:"steer"` so the question reaches a busy recipient at its next tool boundary. The recipient answers with `intercom({ action: "reply", message: "..." })`; `pending` recovers unresolved asks when needed.
283
-
284
- ### `send` vs `ask`
285
-
286
- `send` is the default for agent-to-agent coordination and uses steer when `delivery` is omitted. It wakes idle recipients or reaches busy recipients at the next tool boundary, then returns after broker acceptance. Use explicit queue only when delay is intentional, and passive only for human-visible breadcrumbs. If you want approval before non-reply sends, set `confirmSend: true`.
287
-
288
- `ask` sends and waits up to `askTimeoutMs` (default 2 minutes). Reserve `ask` plus steer for a sender process that must remain alive and cannot safely continue without the answer. Long-lived peers should use `send` plus steer and end their turn instead. A default ask to a peer publishing `accepts_asks:false` returns promptly with `reason:"peer_busy"`; an explicit steer ask keeps waiting.
289
-
290
- `reply` answers an inbound ask using its exact sender and message automatically. Otherwise, answer ordinary coordination with `send` plus steer. If multiple asks are pending, use `pending` and disambiguate with `to`.
291
-
292
- Inbound steers are supplemental coordination inside the active task. Incorporate relevant context and continue; replace the task only when the message explicitly instructs replacement.
293
-
294
- ## Workflow: Subagent-to-Supervisor Escalation
295
-
296
- When this package spawns a Pi-backed delegated child, it supplies bridge metadata that gives the child a subagent-only `contact_supervisor` tool in addition to the regular `intercom` tool. Normal sessions never see `contact_supervisor`; non-Pi child backends such as Claude Code do not load this tool.
297
-
298
- ### When the Tool Appears
299
-
300
- `contact_supervisor` only registers when `pi-subagents` sets all of these environment variables:
301
-
302
- - `PI_SUBAGENT_ORCHESTRATOR_TARGET` — the supervisor session name or ID
303
- - `PI_SUBAGENT_RUN_ID` — the run identifier
304
- - `PI_SUBAGENT_CHILD_AGENT` — the agent type
305
- - `PI_SUBAGENT_CHILD_INDEX` — the child index within the run
306
-
307
- If any are missing, the session falls back to the regular `intercom` tool. A subagent status line may mention an intercom target before the child is actually registered with pi-intercom; treat `intercom({ action: "list" })` as the source of truth. If the advertised target is absent from `list`, use normal subagent controls (`status`, `resume`, `nudge`, result artifacts) instead of sending to that target; the child may be Claude Code-backed or already exited and have no child-side `contact_supervisor`.
308
-
309
- When both bundled extension entries are enabled, parent sessions can use `agent_runs({ action: "nudge", id: "<run-id>", message: "..." })` to send a non-blocking steered nudge to a live child. If the run has already finished, nudge returns its terminal outcome and evidence without restarting it. `agent_runs({ action: "list" })` includes this parent's active and completed durable runs across working directories, plus recoverable legacy foreground and background records. `agent_runs` inspection may also show the direct blocking `intercom({ action: "ask", to: "...", delivery: "steer", message: "..." })` path; use that exception only when the parent process must remain alive and cannot safely continue without the reply. `pi-intercom` remains the source of truth for connected sessions and only delivers to registered local peers.
310
-
311
- ### Three Reasons
312
-
313
- | Reason | Behavior | Use When |
314
- | ------------------- | ---------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- |
315
- | `need_decision` | Persists the question, steers the supervisor, and waits without the ordinary ask timeout | The ephemeral child cannot safely continue without one decision, approval, or product/API/scope clarification |
316
- | `interview_request` | Persists structured questions and waits without the ordinary ask timeout | The ephemeral child cannot safely continue until it receives multiple structured answers |
317
- | `progress_update` | Non-blocking steer at the next tool boundary | A discovery or change the supervisor needs while working |
318
-
319
- Do not use `contact_supervisor` for routine completion handoffs. Return the final subagent result normally through `pi-subagents`.
320
-
321
- Intercom provides live coordination and portable background completion notices. Every new subagent run has one detached owner, regardless of whether the parent waits or receives a background receipt. Waiting tools receive their saved result directly; the watcher suppresses an extra Intercom completion notice. See [host capabilities and result delivery](reference.md#host-capabilities-and-result-delivery).
322
-
323
- Durable output lives in `pi-subagents` result details and artifact/output paths (`savedOutputPath`, `artifactPaths`, or explicit workspace `output` files). Completion notices include existing saved result and metadata paths, including acceptance details when configured. Use those files as the source of truth for long reports. Broker acceptance, notification delivery, parent review, and runtime acceptance are separate facts.
324
-
325
- ### Recovering a supervisor question
326
-
327
- `need_decision` and `interview_request` save the question before notification. Supervisor or broker disconnection does not end the wait. Resume the same saved supervisor session and use:
328
-
329
- ```typescript
330
- agent_runs({ action: "questions" });
331
- agent_runs({
332
- action: "answer",
333
- id: "<run-id>",
334
- questionId: "<question-id>",
335
- message: "Use the stable API.",
336
- });
337
- agent_runs({ action: "stop", id: "<run-id>" });
338
- ```
339
-
340
- The full `subagent` tool also accepts `questions` and `answer`; its stop action is `interrupt`. Questions expose `awaiting_input`, `answer_pending`, `answered`, or `cancelled` independently of run completion. Ownership follows the saved supervisor session, not its cwd or display name. The live intercom reply path saves the same answer. Saving an answer or cancelling through run controls also clears the matching live intercom pending ask; a nudge does not resolve a question.
341
-
342
- Question lists page 20 summaries by default, unresolved first. Use `limit: 1–100`, then pass `details.questionList.nextOffset` as `offset`; `id`, `index` and `questionId` narrow the lookup. Summaries retain identity, state, delivery and revival evidence without copying the saved launch or attempt baseline. Previews stop at 2,048 characters. Read `questionPath` for the complete question/interview/contract and `answerPath` for the exact saved answer; never retry an answer using a truncated preview. Browsing does not modify these durable files.
343
-
344
- Needs-attention notices for a matching unresolved question say **Waiting for supervisor input** and include the question ID and answer call. `answer_pending` still means delivery is unconfirmed, not that the child resumed. A live waiter consumes the durable answer. If it exited, answering revives its saved Pi session with the original acceptance contract and a new run ID. Identical repeated answers do not launch duplicate work; conflicting answers leave the original intact. `stop` cancels the question and aborts any live waiter. An interrupted pre-launch revival can be recovered with the exact `continue` call shown in the answer receipt; ambiguous launch evidence is not silently retried.
345
-
346
- Questions, saved launch contracts, and canonical version-2 run status/results live under `${PI_CODING_AGENT_DIR:-~/.pi/agent}/sessions/subagent-runs`, separate from disposable temporary files. Pending records are not age-cleaned. Active legacy owners keep their original runtime and files until they finish; recovery preserves available evidence for the same saved owner without replaying work or deleting history. Ordinary peer asks still use `askTimeoutMs` and are not durable supervisor questions.
347
-
348
- ### Example: Blocked Subagent Asks for Guidance
349
-
350
- ```typescript
351
- contact_supervisor({
352
- reason: "need_decision",
353
- message:
354
- "The auth service returns 403 instead of 401 for expired tokens. Should I treat 403 as a re-auth trigger or a hard failure?",
355
- });
356
- // → Reply from supervisor: Treat 403 as re-auth trigger. Update the token refresh logic.
357
- ```
358
-
359
- ### Example: Structured Supervisor Interview
360
-
361
- ```typescript
362
- contact_supervisor({
363
- reason: "interview_request",
364
- message: "Please answer these before I continue the migration.",
365
- interview: {
366
- title: "API migration choices",
367
- questions: [
368
- {
369
- id: "api",
370
- type: "single",
371
- question: "Which API should I target?",
372
- options: ["Stable API", "Experimental API"],
373
- },
374
- { id: "constraints", type: "text", question: "What constraints should I preserve?" },
375
- ],
376
- },
53
+ action: "reply",
54
+ replyTo: "<message-id>",
55
+ message: "The rotated token remains usable.",
377
56
  });
378
- // → Reply from supervisor: { "responses": [{ "id": "api", "value": "Stable API" }, ...] }
379
- ```
380
-
381
- ### Example: Progress Update
382
-
383
- ```typescript
384
- contact_supervisor({
385
- reason: "progress_update",
386
- message:
387
- "Discovered the bug is in the retry wrapper, not the API client. Fixing the wrapper will also close issue #42.",
388
- });
389
- // → Progress update accepted for supervisor planner. Queued for the next tool boundary; broker acceptance does not confirm the supervisor has read or acted on it.
390
- ```
391
-
392
- ### What the Supervisor Sees
393
-
394
- The supervisor receives a formatted message with run metadata:
395
-
396
- ```
397
- **From subagent-worker-78f659a3-1**
398
-
399
- Subagent needs a supervisor decision.
400
- Run: 78f659a3
401
- Agent: worker
402
- Child index: 0
403
-
404
- Which API should I use?
405
- ```
406
-
407
- Reply hints work the same as regular `intercom` ask/reply flows. The supervisor can reply with `intercom({ action: "reply", message: "..." })` and the subagent receives the answer as the tool result. If the parent agent is busy and later needs to recover the request, `intercom({ action: "pending" })` summarizes supervisor asks with run id, agent, child target, and question text.
408
-
409
- For `interview_request`, the supervisor message includes the structured questions plus a fenced JSON answer example using this stable shape:
410
-
411
- ```json
412
- {
413
- "responses": [
414
- { "id": "api", "value": "Stable API" },
415
- { "id": "constraints", "value": "Keep the public error shape unchanged." }
416
- ]
417
- }
418
- ```
419
-
420
- The supervisor can reply with plain JSON or a fenced `json` block. If the reply matches the `{ "responses": [...] }` shape and references valid question ids/options, the child tool result includes it in `details.structuredReply` while still showing the raw reply text.
421
-
422
- ## Tool Reference
423
-
424
- ### load_intercom
425
-
426
- `load_intercom({})` enables the full peer schema without sending messages or checking sessions. Then use `intercom` for all existing actions. Ordinary peer asks restored after reload retain their configured expiry. Saved replies, peer disconnects, recipient-error feedback, and durable supervisor answers retire the reply obligation without replaying consumed messages.
427
-
428
- ### intercom
429
-
430
- | Parameter | Type | Description |
431
- | ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
432
- | `action` | string | `"list"`, `"send"`, `"ask"`, `"reply"`, `"pending"`, or `"status"` |
433
- | `scope` | string | Optional for list/status: `"project"` (default) shows this Git repository and its worktrees; `"all"` includes sessions in other projects. |
434
- | `to` | string | Target session name or ID (for send/ask, or to disambiguate reply) |
435
- | `message` | string | Message text (for send/ask/reply) |
436
- | `attachments` | array | Optional `file`, `snippet`, or `context` attachments |
437
- | `replyTo` | string | Optional message ID for threading or replying to an `ask` |
438
- | `delivery` | string | Optional: omitted `send` defaults to `"steer"`, which injects after the current tool call; `"queue"` intentionally waits behind active work, and `"passive"` does not wake the recipient model (`send` only). |
439
- | `queueMode` | string | Optional with queued delivery: `"stack"` keeps all messages, `"replace"` keeps only the latest undelivered message for the same `threadId` after a short coalescing window. |
440
- | `threadId` | string | Required for `queueMode:"replace"`; stable topic key for replacement. |
441
- | `passive` | boolean | Legacy `send`-only alias for `delivery:"passive"`. Discouraged for agent-to-agent messages. |
442
-
443
- ### contact_supervisor
444
-
445
- Only registered in sessions where `pi-subagents` supplied the required child bridge metadata. Contacts the supervisor session that delegated the current task.
446
-
447
- | Parameter | Type | Description |
448
- | ----------- | ------ | -------------------------------------------------------------------------------------------------------------------------- |
449
- | `reason` | string | `"need_decision"` (blocking), `"interview_request"` (blocking structured questions), or `"progress_update"` (non-blocking) |
450
- | `message` | string | The decision request, optional interview note, or progress update |
451
- | `interview` | object | Required for `interview_request`: `{ title?, description?, questions: [...] }` |
452
-
453
- **`need_decision`** — Use only when the ephemeral child cannot safely continue without one decision, approval, or product/API/scope clarification. It sends a formatted steered ask to the supervisor and keeps the child alive until the reply arrives, without the ordinary intercom ask timeout. The reply comes back as the tool result. Includes run metadata in the message so the supervisor knows which subagent is asking.
454
-
455
- **`interview_request`** — Use only when the ephemeral child cannot safely continue until it receives multiple structured answers. It sends a formatted, steered agent-readable interview to the supervisor and keeps the child alive until the reply arrives. Questions use a local pi-interview-like shape: `{ id, type, question, options?, context? }` where `type` is `single`, `multi`, `text`, `image`, or `info`. `info` questions are context-only and do not need responses. The supervisor reply should be JSON with `{ "responses": [{ "id": "...", "value": ... }] }`. Parsed JSON replies are returned in `details.structuredReply`.
456
-
457
- **`progress_update`** — Steers a material discovery at the next native tool boundary without waiting for a reply. The receipt confirms broker acceptance, not model consumption or action. Send only what the supervisor needs while working; skip starts, redundant status, and routine completion. Keep material findings in the final result.
458
-
459
- ### intercom actions
460
-
461
- **`list`** — Returns the current session plus other intercom-connected sessions in the current Git repository and its worktrees by default. Pass `scope:"all"` to intentionally include sessions in other projects. Hidden sessions remain connected and directly targetable by an exact known target. Rows include name, safe target, working directory, model, live status, and peer health tags: `state` (`idle`, `busy`, or `unknown`), `accepts_asks`, `pending_asks`, `last_intercom_activity`, and `last_seen`. Peer rows include live delivery guidance for `ask`, `send`, `queue`, `steer`, and the discouraged passive path; the self row says self-target delivery is unavailable and points to peer targets / `pending` / `reply`. Status is derived automatically from Pi lifecycle events: `idle`, `thinking`, or `tool:<name>`. If multiple sessions have the same name, use the displayed target exactly as shown, for example `to: "ca7bfec2"`. The target may be longer than eight characters when needed to avoid collisions.
462
-
463
- **`send`** — Sends a non-blocking, default-steered message to the specified session and returns broker acceptance, not a later response. It wakes idle recipients or reaches busy recipients at the next tool boundary. Use `delivery:"queue"` only when delay is intentional, and `delivery:"passive"`/`passive:true` only for human-visible breadcrumbs. `queueMode:"replace"` with a `threadId` replaces older undelivered intercom-staged messages for that thread after a short coalescing window; once a message is handed to Pi's native queue it cannot be keyed-replaced. Set `confirmSend: true` in config if you want a confirmation dialog for non-reply sends. Replies that include `replyTo` skip confirmation.
464
-
465
- **`ask`** — Sends a message and waits for the recipient to reply (`askTimeoutMs`, default 2 minutes). Reserve it for a sender process that must remain alive and cannot safely continue without the answer; use `delivery:"steer"` so a busy recipient sees it at the next tool boundary. If the target publishes `accepts_asks:false`, a default blocking ask returns promptly with `reason:"peer_busy"`, while an explicit steer ask still waits. Only one pending waiting ask is allowed per session. Passive delivery is rejected.
466
-
467
- **`reply`** — Replies to the current intercom-triggered message if there is one. Otherwise it falls back to the single unresolved inbound ask. If multiple asks are pending, pass `to` or inspect them with `pending` first. Under the hood this is still a normal `send` with the exact `replyTo` value.
468
-
469
- **`pending`** — Lists unresolved inbound asks with sender, elapsed time, a labeled `replyTo` ID, and a copy-ready `intercom({ action: "reply", ... })` call. For `pi-subagents` supervisor asks, the preview expands the run id, agent, child intercom target, and question so the parent can reply without guessing. Useful when replying after the original triggered turn.
470
-
471
- **`status`** — Shows connection status, session ID, and the same project-scoped recipient capability rows as `list`. Also shows inbound messages still queued for delivery or handed to Pi but not yet consumed. Pass `scope:"all"` to include other projects.
472
-
473
- ## Keyboard Shortcuts
474
-
475
- | Key | Action |
476
- | ------------------------------------------ | ---------------------------------------------------------------------------------------- |
477
- | Option+Shift+M (Alt+Shift+M), configurable | Toggle owned agent conversations; open peer messaging when the agent view is unavailable |
478
- | ↑/↓ | Navigate session list |
479
- | Tab | Toggle Send / Request Reply mode in the compose overlay |
480
- | Enter | Select session / Send or ask |
481
- | Escape | Cancel / Close overlay |
482
-
483
- ## Config
484
-
485
- Create `${PI_CODING_AGENT_DIR:-~/.pi/agent}/intercom/config.json`:
486
-
487
- ```json
488
- {
489
- "shortcut": "alt+shift+m",
490
- "confirmSend": false,
491
- "replyHint": true,
492
- "askTimeoutMs": 120000,
493
- "sendTimeoutMs": 8000,
494
- "listTimeoutMs": 5000,
495
- "status": "researching"
496
- }
497
- ```
498
-
499
- | Setting | Default | Description |
500
- | --------------- | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
501
- | `shortcut` | `"alt+shift+m"` | Native Pi key identifier for the Agents/Intercom shortcut, for example `"ctrl+shift+k"`. The Agents entrance hint uses the same setting. |
502
- | `brokerCommand` | current Node executable | Command used to start the local broker process when you override the default |
503
- | `brokerArgs` | `[]` | Arguments passed to `brokerCommand` before the broker script path. The built-in default runs the bundled TypeScript broker directly with Node. |
504
- | `confirmSend` | false | Show a confirmation dialog before non-reply sends from an interactive session with UI |
505
- | `replyHint` | true | Include reply instructions in incoming asks |
506
- | `askTimeoutMs` | `120000` | Reply wait timeout for ordinary peer `ask`; durable supervisor questions do not expire |
507
- | `sendTimeoutMs` | `8000` | Broker delivery-ack timeout for sends/asks |
508
- | `listTimeoutMs` | `5000` | Session-list response timeout |
509
- | `status` | — | Optional custom status suffix shown after the automatic lifecycle status, for example `thinking · researching` |
510
-
511
- The default shortcut requires a terminal that reports combined modifiers through Kitty keyboard protocol or xterm modifyOtherKeys. Pi negotiates these automatically on supported terminals. `/agents` is also available. Restart Pi after changing the shortcut.
512
-
513
- Use `pi config` to enable or disable the bundled intercom extension. The former `config.json` `enabled` key is no longer read; in particular, an existing `"enabled": false` does not disable intercom after this migration.
514
-
515
- For example, if you have Bun installed and want it to start the broker directly, use:
516
-
517
- ```json
518
- {
519
- "brokerCommand": "bun",
520
- "brokerArgs": []
521
- }
522
- ```
523
-
524
- Pi-intercom publishes live session status automatically. Sessions register as `idle`, switch to `thinking` while the agent is running, show `tool:<name>` during tool execution, and return to `idle` on agent completion. If `status` is set in config, it is appended as context instead of replacing the lifecycle status.
525
-
526
- ## How It Works
527
-
528
- ```mermaid
529
- graph TB
530
- subgraph A["Pi Session A"]
531
- A1[Intercom Client]
532
- A2[intercom tool]
533
- A3[UI overlays]
534
- end
535
-
536
- subgraph Broker["Intercom Broker"]
537
- B1[Session Registry]
538
- B2[Message Router]
539
- end
540
-
541
- subgraph B["Pi Session B"]
542
- B3[Intercom Client]
543
- B4[intercom tool]
544
- B5[UI overlays]
545
- end
546
-
547
- A1 <-->|Unix Socket| B1
548
- B1 --- B2
549
- B2 <-->|Unix Socket| B3
550
57
  ```
551
58
 
552
- The broker is a standalone TypeScript process that manages session registration and message routing. It auto-spawns when the first intercom session needs it and exits after 5 seconds when the last connected session disconnects. Clients now reconnect automatically if the broker disappears and later comes back.
553
-
554
- Messages use length-prefixed JSON over a local Unix socket transport (4-byte length + JSON payload) to handle fragmentation properly. The protocol includes request correlation for session listing, explicit delivery failures, and validation for malformed or out-of-order messages. Session registration carries user-facing identity plus live health fields; process ID, start time, and the redundant activity timestamp are no longer part of the protocol.
555
-
556
- Startup restoration and inbound batches join during shutdown while their old native owner remains valid. Work that outlives a replaced owner (reconnects, overlays, and relays) no-ops rather than using stale APIs. Completion handoffs retain accepted acknowledgements before listeners stop; failed shutdown deliveries remain eligible on reopen without requesting a new turn after ingress closes. Undelivered receiver messages remain in native session metadata, bound to the exact saved session UUID. Native message entries are the delivery receipt, including messages that have left the active context after compaction. Each body is checkpointed once; later handoff metadata stores only the message ID and state.
557
-
558
- Runtime files:
559
-
560
- - Unix domain socket — private short temp path `pi-intercom-<hash>/broker.sock` on macOS/Linux, keyed by user ID and `PI_CODING_AGENT_DIR` or `~/.pi/agent`
561
- - `${PI_CODING_AGENT_DIR:-~/.pi/agent}/intercom/broker.pid` — Broker process ID on the first line (backward-readable). On Linux, new brokers add native boot ID, PID namespace, reader time namespace and process start ticks on a second `linux-v1` line.
562
- - `${PI_CODING_AGENT_DIR:-~/.pi/agent}/intercom/config.json` — User configuration
563
-
564
- ## Design Decisions
565
-
566
- **Local IPC instead of TCP.** Same-machine only by design. `pi-intercom` uses Unix sockets on macOS/Linux, which keeps setup simple and avoids port management.
567
-
568
- **Auto-spawn with file lock.** The broker starts on first connection and exits after 5 seconds idle. There is no daemon to manage. A spawn lock file, keyed by PID and timestamp, prevents duplicate brokers when multiple sessions start at once.
569
-
570
- **PID reuse after restore.** A live numeric PID alone does not identify a broker: a cold restore can reuse that number for an unrelated process or thread. Linux startup ignores a saved PID only when readable native metadata disproves its identity. Different boot/PID namespace or comparable start ticks identify a stale record; start ticks are compared only in the same reader time namespace. Legacy numeric-only records remain ambiguous and blocking, except a proven non-leader thread (`Tgid != Pid`) cannot be the process ID a broker wrote. Unreadable/unsupported metadata, foreign procfs PID views and signal-0 permission errors retain the conservative refusal. macOS needs no procfs and retains numeric-PID behavior. No process is killed and no PID file is deleted to recover; normal broker startup writes its new record. A connected broker and its accepted queues are unchanged. The fields follow Linux [`proc_pid_status(5)`](https://man7.org/linux/man-pages/man5/proc_pid_status.5.html), [`proc_pid_stat(5)`](https://man7.org/linux/man-pages/man5/proc_pid_stat.5.html) and [`namespaces(7)`](https://man7.org/linux/man-pages/man7/namespaces.7.html); they are identity evidence, not process-control authority.
571
-
572
- **`ask` stays client-side.** The broker still routes plain messages; it does not have a special request/response mode for `ask`. The sender marks the message as expecting a reply, the recipient wakes or queues according to the delivery mode, and the sender waits for the matching reply before returning it as the tool result. Reply hints make that flow practical by showing the recipient the exact `reply` call to use. Separately, `list` / `sessions` now carry a `requestId` so a delayed session-list reply cannot be mistaken for a newer one.
573
-
574
- ## File Structure
575
-
576
- ```
577
- pi-subagents/
578
- ├── package.json # One manifest for both extensions
579
- ├── src/pi-intercom/
580
- │ ├── index.ts # Intercom extension entry point
581
- │ ├── types.ts # SessionInfo, Message, protocol types
582
- │ ├── config.ts # Config loading
583
- │ ├── broker/
584
- │ │ ├── broker.ts # Broker process
585
- │ │ ├── client.ts # IntercomClient class
586
- │ │ ├── framing.ts # Length-prefixed JSON protocol
587
- │ │ ├── paths.ts # Platform-specific Unix socket paths
588
- │ │ └── spawn.ts # Auto-spawn logic with lock file
589
- │ └── ui/
590
- │ ├── session-list.ts # Session selection overlay
591
- │ ├── compose.ts # Message composition overlay
592
- │ └── inline-message.ts # Received message display
593
- └── skills/pi-intercom/
594
- └── SKILL.md # Bundled skill for common patterns
595
- ```
596
-
597
- ## Lifecycle and saved work
598
-
599
- Pi 1.0 uses ordinary shutdown/reload boundaries, not the old fork's idle-checkpoint or broker-admission-hold API. A settled parent does not prove its detached children are finished. Preserve their saved sessions, run records and questions, and keep a legacy runtime available until its active owners finish. Do not disconnect a recipient or stop a broker to manufacture completion: accepted replace-mode messages can still exist only in broker memory.
600
-
601
- Assistant-error replies wait for broker acknowledgement during `message_end`, bounded by `sendTimeoutMs`. Async inbound/reconnect/relay callbacks remain tied to their owning session generation; late callbacks cannot append into a replacement session. Durable inbox stages and actual parent message publication drive recovery.
602
-
603
- ## Limitations
604
-
605
- Historical official Pi 0.87.1 checks exposed queue visibility and prompt-preparation races. Current tests preserve exact-once receipts and input rejection/recovery on the selected host, including the genuine Pi 1.0 pre-admission window described above; they do not promise one combined provider turn. Historical results are not a current 1.0 pass. Use an explicit `async: false` wait when dependent work needs a finalized result. Native pending-call, idle-checkpoint and immediate-usage APIs are no longer supported. See [result delivery](reference.md#host-capabilities-and-result-delivery) and [local qualification](development.md#local-validation).
606
-
607
- - **Same machine only** — The core broker uses local Unix sockets, no network support. The optional [secure remote bridge](intercom-bridge.md) authenticates remote messaging through a separate loopback mTLS proxy; it does not expose the broker socket.
608
- - **No dedicated local intercom log** — Messages are kept in Pi session history. The optional remote bridge has its own durable mailbox and recent-transcript API; the local peer tool has no separate inbox.
609
- - **No attachments UI** — `file`, `snippet`, and `context` attachments are supported in the protocol, but not in the compose overlay
610
- - **Only connected sessions appear** — The list shows Pi sessions that have loaded `pi-intercom` and successfully registered with the broker, not every open Pi process on the machine
611
- - **Broker lifecycle** — The broker auto-spawns on first use and exits when idle; sessions reconnect automatically if the broker restarts
59
+ - Default **steer** wakes an idle recipient or reaches busy work at a tool boundary.
60
+ - Explicit **queue** defers delivery. Optional `queueMode:"replace"` with a nonempty
61
+ `threadId` coalesces still-staged updates for that thread; messages already handed
62
+ to Pi's native queue cannot be keyed-replaced.
63
+ - Explicit **passive** is a non-waking breadcrumb, not a request for model work.
64
+
65
+ An ordinary send is non-blocking. Its response means broker acceptance, not
66
+ recipient journal persistence, model consumption, reply, or task completion. A
67
+ lost transport response can be uncertain; do not blindly replay side effects.
68
+
69
+ `ask` waits for a correlated reply and has a bounded timeout. Prefer `send` unless
70
+ the sender genuinely must remain alive waiting for a decision. A busy peer may
71
+ report that it cannot answer immediately. `reply` uses the active or sole pending
72
+ ask when unambiguous; otherwise specify `replyTo` and the intended sender. Inspect
73
+ `pending` for the exact correlation rather than guessing from text.
74
+
75
+ This ordinary request/reply mechanism does not recreate the retired durable
76
+ supervisor approval/revival workflow. An expired wait is not an answered question
77
+ or a completed delegated run.
78
+
79
+ ## Read the last response without waking
80
+
81
+ ```js
82
+ intercom({ action: "last", to: "reviewer" });
83
+ // Follow the returned entryId/nextOffset for large responses:
84
+ intercom({ action: "last", to: "<exact-peer-id>", entryId: "<entry-id>", offset: 16384 });
85
+ ```
86
+
87
+ The native owner reads the last completed assistant response on its active
88
+ branch. This is original assistant text, not a run-status summary. No direct
89
+ message, prompt, or model turn is created. Empty history is reported explicitly.
90
+
91
+ Pages are bounded to 16,384 UTF-16 code units. Keep `entryId` for stable paging and
92
+ use the returned next offset; do not calculate byte offsets. A newer response
93
+ does not silently replace the requested entry halfway through retrieval. Missing
94
+ or no-longer-readable entries fail explicitly. Tool output and thought blocks are
95
+ not substituted for completed assistant text.
96
+
97
+ The broker assigns request tokens and verifies the answering peer and page
98
+ identity. Reads settle on response, disconnect, or timeout. Old peers/brokers
99
+ without the capability report unsupported reads instead of receiving unknown
100
+ message frames. Broker correlation does not grant access to another group.
101
+
102
+ ## Persistence and lifecycle
103
+
104
+ Inbound state is checkpointed in the recipient's native session journal. Native
105
+ publication/consumption receipts govern replay; broker writes alone do not.
106
+ Queued, admitted, consumed, and replied are distinct states. Reload, compaction,
107
+ branch changes, shutdown, and fresh-process recovery must not fabricate receipts
108
+ or adopt another native session's pending messages.
109
+
110
+ Shutdown joins admitted inbound work before detaching its native owner. Stale
111
+ runtime generations must not checkpoint or deliver into a replacement session.
112
+ The native tests own these contracts; neither a timer nor a source-string test is
113
+ publication evidence.
114
+
115
+ ## Shared broker and migration
116
+
117
+ Default files on macOS/Linux:
118
+
119
+ - `/tmp/pi-intercom-<uid>/broker.sock`
120
+ - `/tmp/pi-intercom-<uid>/broker.pid`
121
+ - `/tmp/pi-intercom-<uid>/broker.spawn.lock`
122
+
123
+ The runtime directory is owned by the OS user, nonsymlink, and mode 0700; the
124
+ socket is mode 0600. The broker starts on first use and exits after five seconds
125
+ without connected sessions. Concurrent startup uses the shared spawn lock.
126
+
127
+ `PI_INTERCOM_RUNTIME_DIR` explicitly selects an isolated deployment. It must be
128
+ an absolute private directory with a socket path within 100 UTF-8 bytes. Invalid
129
+ configuration fails without falling back to another namespace. Set it consistently
130
+ for every process intended to share that isolated broker. Tests must always use
131
+ an owned isolated directory, never the user's ordinary shared socket.
132
+
133
+ Old releases used agent-directory-specific brokers. Updated sessions join the
134
+ new shared namespace; old sessions stay on their old brokers until they load the
135
+ updated extension. Startup warns when it detects an old broker for the current
136
+ agent directory. It does not kill, modify, take over, or silently route back to
137
+ that broker. During migration, old and new peers may therefore be invisible to
138
+ each other. Finish accepted work before upgrading; do not force broker shutdown
139
+ to make discovery appear complete. During an authorized cutover, inventory and
140
+ reload every participating Pi session on that Mac before resuming bridge traffic,
141
+ then verify the expected exact peers from both mains and the helper. The warning
142
+ only detects old brokers for the current agent directory; it cannot certify that
143
+ all old sessions elsewhere have migrated.
144
+
145
+ The predictable `/tmp` namespace is independent of caller HOME/TMPDIR, which is
146
+ needed for same-user discovery across differently configured sessions. A foreign
147
+ user who pre-creates that path can deny availability, but cannot be adopted as the
148
+ broker owner: startup refuses foreign or symlink directories. It must not delete
149
+ or take over the path to recover. On shared hosts, an operator can pre-provision
150
+ a short private directory under an owned non-writable parent and consistently set
151
+ `PI_INTERCOM_RUNTIME_DIR` for every participating Pi session and helper. This is
152
+ an explicit deployment choice, not an automatic fallback to a split namespace.
153
+
154
+ An unresponsive or missing socket is not permission to kill a possibly live
155
+ owner. PID checks are conservative, including permission-denied cases. Linux
156
+ records include native boot/namespace/start identity to reject proven PID reuse;
157
+ ambiguous legacy numeric PIDs remain blocking. A process is never killed merely
158
+ to recover broker startup.
159
+
160
+ Remote authenticated mail is separate: see [bridge setup](intercom-bridge.md).