@agimon-ai/doompi-team 0.0.1-alpha.2 → 0.0.1-alpha.21

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 (727) hide show
  1. package/README.md +33 -17
  2. package/dist/adapters/asyncJobTracker.cjs +2 -0
  3. package/dist/adapters/asyncJobTracker.cjs.map +1 -0
  4. package/dist/adapters/asyncJobTracker.mjs +2 -0
  5. package/dist/adapters/asyncJobTracker.mjs.map +1 -0
  6. package/dist/adapters/atomicJson.cjs +2 -0
  7. package/dist/adapters/atomicJson.cjs.map +1 -0
  8. package/dist/adapters/atomicJson.mjs +2 -0
  9. package/dist/adapters/atomicJson.mjs.map +1 -0
  10. package/dist/adapters/pi/extension.cjs +2 -0
  11. package/dist/adapters/pi/extension.cjs.map +1 -0
  12. package/dist/adapters/pi/extension.mjs +2 -0
  13. package/dist/adapters/pi/extension.mjs.map +1 -0
  14. package/dist/adapters/pollScheduler.cjs +2 -0
  15. package/dist/adapters/pollScheduler.cjs.map +1 -0
  16. package/dist/adapters/pollScheduler.mjs +2 -0
  17. package/dist/adapters/pollScheduler.mjs.map +1 -0
  18. package/dist/adapters/process/childTranscript.cjs +5 -0
  19. package/dist/adapters/process/childTranscript.cjs.map +1 -0
  20. package/dist/adapters/process/childTranscript.mjs +5 -0
  21. package/dist/adapters/process/childTranscript.mjs.map +1 -0
  22. package/dist/adapters/process/env.cjs +2 -0
  23. package/dist/adapters/process/env.cjs.map +1 -0
  24. package/dist/adapters/process/env.d.cts +69 -0
  25. package/dist/adapters/process/env.d.cts.map +1 -0
  26. package/dist/adapters/process/env.d.mts +69 -0
  27. package/dist/adapters/process/env.d.mts.map +1 -0
  28. package/dist/adapters/process/env.mjs +2 -0
  29. package/dist/adapters/process/env.mjs.map +1 -0
  30. package/dist/adapters/process/sdkRunnerEntry.cjs +2 -0
  31. package/dist/adapters/process/sdkRunnerEntry.cjs.map +1 -0
  32. package/dist/adapters/process/sdkRunnerEntry.d.cts +5 -0
  33. package/dist/adapters/process/sdkRunnerEntry.d.cts.map +1 -0
  34. package/dist/adapters/process/sdkRunnerEntry.d.mts +5 -0
  35. package/dist/adapters/process/sdkRunnerEntry.d.mts.map +1 -0
  36. package/dist/adapters/process/sdkRunnerEntry.mjs +2 -0
  37. package/dist/adapters/process/sdkRunnerEntry.mjs.map +1 -0
  38. package/dist/adapters/processTerminal.cjs +2 -0
  39. package/dist/adapters/processTerminal.cjs.map +1 -0
  40. package/dist/adapters/processTerminal.mjs +2 -0
  41. package/dist/adapters/processTerminal.mjs.map +1 -0
  42. package/dist/adapters/resultWatcher.cjs +2 -0
  43. package/dist/adapters/resultWatcher.cjs.map +1 -0
  44. package/dist/adapters/resultWatcher.mjs +2 -0
  45. package/dist/adapters/resultWatcher.mjs.map +1 -0
  46. package/dist/adapters/runIdResolver.cjs +2 -0
  47. package/dist/adapters/runIdResolver.cjs.map +1 -0
  48. package/dist/adapters/runIdResolver.mjs +2 -0
  49. package/dist/adapters/runIdResolver.mjs.map +1 -0
  50. package/dist/adapters/runRegistry.cjs +2 -0
  51. package/dist/adapters/runRegistry.cjs.map +1 -0
  52. package/dist/adapters/runRegistry.mjs +2 -0
  53. package/dist/adapters/runRegistry.mjs.map +1 -0
  54. package/dist/adapters/scopeOwner.cjs +2 -0
  55. package/dist/adapters/scopeOwner.cjs.map +1 -0
  56. package/dist/adapters/scopeOwner.mjs +2 -0
  57. package/dist/adapters/scopeOwner.mjs.map +1 -0
  58. package/dist/adapters/staleRunReconciler.cjs +2 -0
  59. package/dist/adapters/staleRunReconciler.cjs.map +1 -0
  60. package/dist/adapters/staleRunReconciler.mjs +2 -0
  61. package/dist/adapters/staleRunReconciler.mjs.map +1 -0
  62. package/dist/adapters/statusReader.cjs +2 -0
  63. package/dist/adapters/statusReader.cjs.map +1 -0
  64. package/dist/adapters/statusReader.mjs +2 -0
  65. package/dist/adapters/statusReader.mjs.map +1 -0
  66. package/dist/adapters/suspendedRuns.cjs +6 -0
  67. package/dist/adapters/suspendedRuns.cjs.map +1 -0
  68. package/dist/adapters/suspendedRuns.mjs +6 -0
  69. package/dist/adapters/suspendedRuns.mjs.map +1 -0
  70. package/dist/api/backgroundWork.cjs +1 -1
  71. package/dist/api/backgroundWork.d.cts +2 -2
  72. package/dist/api/backgroundWork.d.mts +2 -2
  73. package/dist/api/backgroundWork.mjs +1 -1
  74. package/dist/api/capabilityCeiling.cjs +1 -1
  75. package/dist/api/capabilityCeiling.d.cts +3 -3
  76. package/dist/api/capabilityCeiling.d.mts +3 -3
  77. package/dist/api/capabilityCeiling.mjs +1 -2
  78. package/dist/api/delegation.cjs +1 -1
  79. package/dist/api/delegation.d.cts +1 -1
  80. package/dist/api/delegation.d.mts +1 -1
  81. package/dist/api/delegation.mjs +1 -1
  82. package/dist/api/teamSnapshot.cjs +1 -1
  83. package/dist/api/teamSnapshot.d.cts +2 -2
  84. package/dist/api/teamSnapshot.d.mts +2 -2
  85. package/dist/api/teamSnapshot.mjs +1 -2
  86. package/dist/commands/slash/chainExpression.cjs.map +1 -0
  87. package/dist/commands/slash/chainExpression.mjs.map +1 -0
  88. package/dist/commands/slash/doctor.cjs +5 -0
  89. package/dist/commands/slash/doctor.cjs.map +1 -0
  90. package/dist/commands/slash/doctor.mjs +5 -0
  91. package/dist/{slash/doctor.cjs.map → commands/slash/doctor.mjs.map} +1 -1
  92. package/dist/{slash → commands/slash}/slashCommands.cjs +1 -1
  93. package/dist/commands/slash/slashCommands.cjs.map +1 -0
  94. package/dist/{slash → commands/slash}/slashCommands.mjs +2 -2
  95. package/dist/commands/slash/slashCommands.mjs.map +1 -0
  96. package/dist/commands/slash/spawnRequestMapping.cjs.map +1 -0
  97. package/dist/commands/slash/spawnRequestMapping.mjs.map +1 -0
  98. package/dist/commands/slash/subagentLaunch.cjs +2 -0
  99. package/dist/commands/slash/subagentLaunch.cjs.map +1 -0
  100. package/dist/commands/slash/subagentLaunch.mjs +2 -0
  101. package/dist/commands/slash/subagentLaunch.mjs.map +1 -0
  102. package/dist/container/globalBridge.cjs.map +1 -1
  103. package/dist/container/globalBridge.d.cts +1 -1
  104. package/dist/container/globalBridge.d.mts +1 -1
  105. package/dist/container/globalBridge.mjs.map +1 -1
  106. package/dist/container/index.cjs +1 -1
  107. package/dist/container/index.cjs.map +1 -1
  108. package/dist/container/index.d.cts +2 -1
  109. package/dist/container/index.d.cts.map +1 -1
  110. package/dist/container/index.d.mts +2 -1
  111. package/dist/container/index.d.mts.map +1 -1
  112. package/dist/container/index.mjs +1 -1
  113. package/dist/container/index.mjs.map +1 -1
  114. package/dist/container/modules/agents.cjs +1 -1
  115. package/dist/container/modules/agents.cjs.map +1 -1
  116. package/dist/container/modules/agents.mjs +1 -1
  117. package/dist/container/modules/agents.mjs.map +1 -1
  118. package/dist/container/modules/core.cjs +1 -1
  119. package/dist/container/modules/core.cjs.map +1 -1
  120. package/dist/container/modules/core.mjs +1 -1
  121. package/dist/container/modules/core.mjs.map +1 -1
  122. package/dist/container/modules/extensions.cjs +1 -1
  123. package/dist/container/modules/extensions.cjs.map +1 -1
  124. package/dist/container/modules/extensions.mjs +1 -1
  125. package/dist/container/modules/extensions.mjs.map +1 -1
  126. package/dist/container/modules/intercom.cjs +1 -1
  127. package/dist/container/modules/intercom.cjs.map +1 -1
  128. package/dist/container/modules/intercom.mjs +1 -1
  129. package/dist/container/modules/intercom.mjs.map +1 -1
  130. package/dist/container/modules/runs.cjs +1 -1
  131. package/dist/container/modules/runs.cjs.map +1 -1
  132. package/dist/container/modules/runs.mjs +1 -1
  133. package/dist/container/modules/runs.mjs.map +1 -1
  134. package/dist/container/types.cjs +1 -1
  135. package/dist/container/types.cjs.map +1 -1
  136. package/dist/container/types.d.cts +1 -0
  137. package/dist/container/types.d.cts.map +1 -1
  138. package/dist/container/types.d.mts +1 -0
  139. package/dist/container/types.d.mts.map +1 -1
  140. package/dist/container/types.mjs +1 -1
  141. package/dist/container/types.mjs.map +1 -1
  142. package/dist/env.cjs +1 -2
  143. package/dist/env.d.cts +2 -65
  144. package/dist/env.d.mts +2 -65
  145. package/dist/env.mjs +1 -1
  146. package/dist/env.mjs.map +1 -1
  147. package/dist/extensions/config.cjs.map +1 -1
  148. package/dist/extensions/config.mjs.map +1 -1
  149. package/dist/extensions/delegationBridge.cjs.map +1 -1
  150. package/dist/extensions/delegationBridge.mjs.map +1 -1
  151. package/dist/extensions/doom.cjs +1 -1
  152. package/dist/extensions/doom.cjs.map +1 -1
  153. package/dist/extensions/doom.mjs +1 -1
  154. package/dist/extensions/doom.mjs.map +1 -1
  155. package/dist/extensions/fablePlanBridge.cjs +1 -1
  156. package/dist/extensions/fablePlanBridge.cjs.map +1 -1
  157. package/dist/extensions/fablePlanBridge.mjs +1 -1
  158. package/dist/extensions/fablePlanBridge.mjs.map +1 -1
  159. package/dist/extensions/managementActions.cjs +1 -1
  160. package/dist/extensions/managementActions.cjs.map +1 -1
  161. package/dist/extensions/managementActions.mjs +1 -1
  162. package/dist/extensions/managementActions.mjs.map +1 -1
  163. package/dist/extensions/operationJournal.cjs +1 -1
  164. package/dist/extensions/operationJournal.cjs.map +1 -1
  165. package/dist/extensions/operationJournal.mjs +1 -1
  166. package/dist/extensions/operationJournal.mjs.map +1 -1
  167. package/dist/extensions/orchestratorPrompt.cjs +5 -6
  168. package/dist/extensions/orchestratorPrompt.cjs.map +1 -1
  169. package/dist/extensions/orchestratorPrompt.mjs +5 -6
  170. package/dist/extensions/orchestratorPrompt.mjs.map +1 -1
  171. package/dist/extensions/schemas.mjs.map +1 -1
  172. package/dist/extensions/spawnPlan.cjs +3 -2
  173. package/dist/extensions/spawnPlan.cjs.map +1 -1
  174. package/dist/extensions/spawnPlan.mjs +3 -2
  175. package/dist/extensions/spawnPlan.mjs.map +1 -1
  176. package/dist/extensions/standard.cjs +1 -1
  177. package/dist/extensions/standard.cjs.map +1 -1
  178. package/dist/extensions/standard.mjs +1 -1
  179. package/dist/extensions/standard.mjs.map +1 -1
  180. package/dist/extensions/statusViews.cjs +1 -1
  181. package/dist/extensions/statusViews.cjs.map +1 -1
  182. package/dist/extensions/statusViews.mjs +2 -2
  183. package/dist/extensions/statusViews.mjs.map +1 -1
  184. package/dist/extensions/subagentPromptRuntime.cjs +11 -11
  185. package/dist/extensions/subagentPromptRuntime.cjs.map +1 -1
  186. package/dist/extensions/subagentPromptRuntime.d.cts.map +1 -1
  187. package/dist/extensions/subagentPromptRuntime.d.mts.map +1 -1
  188. package/dist/extensions/subagentPromptRuntime.mjs +5 -5
  189. package/dist/extensions/subagentPromptRuntime.mjs.map +1 -1
  190. package/dist/extensions/subagentTool.cjs +5 -6
  191. package/dist/extensions/subagentTool.cjs.map +1 -1
  192. package/dist/extensions/subagentTool.mjs +5 -6
  193. package/dist/extensions/subagentTool.mjs.map +1 -1
  194. package/dist/extensions/toolDescription.cjs +1 -1
  195. package/dist/extensions/toolDescription.cjs.map +1 -1
  196. package/dist/extensions/toolDescription.mjs +1 -1
  197. package/dist/extensions/toolDescription.mjs.map +1 -1
  198. package/dist/index.cjs +1 -1
  199. package/dist/index.cjs.map +1 -1
  200. package/dist/index.d.cts +2 -2
  201. package/dist/index.d.cts.map +1 -1
  202. package/dist/index.d.mts +2 -2
  203. package/dist/index.d.mts.map +1 -1
  204. package/dist/index.mjs +1 -1
  205. package/dist/index.mjs.map +1 -1
  206. package/dist/runs/background/cliRunnerEntry.cjs +1 -2
  207. package/dist/runs/background/cliRunnerEntry.mjs +1 -2
  208. package/dist/runs/sdkRunnerEntry.cjs +1 -2
  209. package/dist/runs/sdkRunnerEntry.d.cts +2 -1
  210. package/dist/runs/sdkRunnerEntry.d.mts +2 -1
  211. package/dist/runs/sdkRunnerEntry.mjs +1 -2
  212. package/dist/schemas/team/backgroundWork.cjs +2 -0
  213. package/dist/schemas/team/backgroundWork.cjs.map +1 -0
  214. package/dist/{protocol → schemas/team}/backgroundWork.d.cts +2 -2
  215. package/dist/schemas/team/backgroundWork.d.cts.map +1 -0
  216. package/dist/{protocol → schemas/team}/backgroundWork.d.mts +2 -2
  217. package/dist/schemas/team/backgroundWork.d.mts.map +1 -0
  218. package/dist/schemas/team/backgroundWork.mjs +2 -0
  219. package/dist/{protocol/backgroundWork.cjs.map → schemas/team/backgroundWork.mjs.map} +1 -1
  220. package/dist/schemas/team/capabilityCeiling.cjs +2 -0
  221. package/dist/schemas/team/capabilityCeiling.cjs.map +1 -0
  222. package/dist/{protocol → schemas/team}/capabilityCeiling.d.cts +3 -3
  223. package/dist/schemas/team/capabilityCeiling.d.cts.map +1 -0
  224. package/dist/{protocol → schemas/team}/capabilityCeiling.d.mts +3 -3
  225. package/dist/schemas/team/capabilityCeiling.d.mts.map +1 -0
  226. package/dist/schemas/team/capabilityCeiling.mjs +2 -0
  227. package/dist/schemas/team/capabilityCeiling.mjs.map +1 -0
  228. package/dist/schemas/team/delegation.cjs.map +1 -0
  229. package/dist/{protocol → schemas/team}/delegation.d.cts +1 -1
  230. package/dist/schemas/team/delegation.d.cts.map +1 -0
  231. package/dist/{protocol → schemas/team}/delegation.d.mts +1 -1
  232. package/dist/schemas/team/delegation.d.mts.map +1 -0
  233. package/dist/schemas/team/delegation.mjs.map +1 -0
  234. package/dist/schemas/team/packageConfig.cjs +2 -0
  235. package/dist/schemas/team/packageConfig.cjs.map +1 -0
  236. package/dist/schemas/team/packageConfig.mjs +2 -0
  237. package/dist/schemas/team/packageConfig.mjs.map +1 -0
  238. package/dist/services/agents/discovery.cjs +2 -0
  239. package/dist/services/agents/discovery.cjs.map +1 -0
  240. package/dist/services/agents/discovery.mjs +2 -0
  241. package/dist/services/agents/discovery.mjs.map +1 -0
  242. package/dist/services/agents/frontmatter.cjs.map +1 -0
  243. package/dist/{agents → services/agents}/frontmatter.mjs +1 -1
  244. package/dist/services/agents/frontmatter.mjs.map +1 -0
  245. package/dist/services/agents/loader.cjs +2 -0
  246. package/dist/services/agents/loader.cjs.map +1 -0
  247. package/dist/services/agents/loader.mjs +2 -0
  248. package/dist/services/agents/loader.mjs.map +1 -0
  249. package/dist/services/agents/memory.cjs +3 -0
  250. package/dist/services/agents/memory.cjs.map +1 -0
  251. package/dist/{agents → services/agents}/memory.mjs +1 -1
  252. package/dist/services/agents/memory.mjs.map +1 -0
  253. package/dist/services/agents/projectRoot.cjs +2 -0
  254. package/dist/services/agents/projectRoot.cjs.map +1 -0
  255. package/dist/services/agents/projectRoot.mjs +2 -0
  256. package/dist/services/agents/projectRoot.mjs.map +1 -0
  257. package/dist/services/agents/settings.cjs +2 -0
  258. package/dist/services/agents/settings.cjs.map +1 -0
  259. package/dist/services/agents/settings.mjs +2 -0
  260. package/dist/services/agents/settings.mjs.map +1 -0
  261. package/dist/services/agents/skills.cjs +0 -0
  262. package/dist/services/agents/skills.cjs.map +1 -0
  263. package/dist/services/agents/skills.mjs +5 -0
  264. package/dist/services/agents/skills.mjs.map +1 -0
  265. package/dist/{agents → services/agents}/types.d.cts +4 -4
  266. package/dist/services/agents/types.d.cts.map +1 -0
  267. package/dist/{agents → services/agents}/types.d.mts +4 -4
  268. package/dist/services/agents/types.d.mts.map +1 -0
  269. package/dist/services/api/backgroundWork.cjs +1 -0
  270. package/dist/services/api/backgroundWork.d.cts +1 -0
  271. package/dist/services/api/backgroundWork.d.mts +1 -0
  272. package/dist/services/api/backgroundWork.mjs +1 -0
  273. package/dist/services/api/capabilityCeiling.cjs +1 -0
  274. package/dist/services/api/capabilityCeiling.d.cts +2 -0
  275. package/dist/services/api/capabilityCeiling.d.mts +2 -0
  276. package/dist/services/api/capabilityCeiling.mjs +2 -0
  277. package/dist/services/api/capabilityCeiling.mjs.map +1 -0
  278. package/dist/services/api/teamSnapshot.cjs +1 -0
  279. package/dist/services/api/teamSnapshot.d.cts +1 -0
  280. package/dist/services/api/teamSnapshot.d.mts +1 -0
  281. package/dist/services/api/teamSnapshot.mjs +2 -0
  282. package/dist/services/api/teamSnapshot.mjs.map +1 -0
  283. package/dist/services/intercom/intercomBridge.cjs.map +1 -0
  284. package/dist/services/intercom/intercomBridge.mjs.map +1 -0
  285. package/dist/services/intercom/nativeTeamChannel.cjs +5 -0
  286. package/dist/services/intercom/nativeTeamChannel.cjs.map +1 -0
  287. package/dist/{intercom → services/intercom}/nativeTeamChannel.d.cts +1 -1
  288. package/dist/services/intercom/nativeTeamChannel.d.cts.map +1 -0
  289. package/dist/{intercom → services/intercom}/nativeTeamChannel.d.mts +1 -1
  290. package/dist/services/intercom/nativeTeamChannel.d.mts.map +1 -0
  291. package/dist/services/intercom/nativeTeamChannel.mjs +5 -0
  292. package/dist/services/intercom/nativeTeamChannel.mjs.map +1 -0
  293. package/dist/services/intercom/supervisorControlChannel.cjs +2 -0
  294. package/dist/services/intercom/supervisorControlChannel.cjs.map +1 -0
  295. package/dist/{intercom → services/intercom}/supervisorControlChannel.mjs +1 -1
  296. package/dist/services/intercom/supervisorControlChannel.mjs.map +1 -0
  297. package/dist/services/runs/background/asyncExecution.cjs +2 -0
  298. package/dist/services/runs/background/asyncExecution.cjs.map +1 -0
  299. package/dist/services/runs/background/asyncExecution.mjs +2 -0
  300. package/dist/services/runs/background/asyncExecution.mjs.map +1 -0
  301. package/dist/services/runs/background/asyncJobTracker.cjs +1 -0
  302. package/dist/services/runs/background/asyncJobTracker.mjs +2 -0
  303. package/dist/services/runs/background/asyncJobTracker.mjs.map +1 -0
  304. package/dist/services/runs/background/cliRunnerEntry.cjs +2 -0
  305. package/dist/services/runs/background/cliRunnerEntry.cjs.map +1 -0
  306. package/dist/services/runs/background/cliRunnerEntry.mjs +2 -0
  307. package/dist/services/runs/background/cliRunnerEntry.mjs.map +1 -0
  308. package/dist/services/runs/background/completionBatcher.cjs.map +1 -0
  309. package/dist/services/runs/background/completionBatcher.mjs +2 -0
  310. package/dist/services/runs/background/completionBatcher.mjs.map +1 -0
  311. package/dist/{runs → services/runs}/background/notify.cjs +1 -1
  312. package/dist/services/runs/background/notify.cjs.map +1 -0
  313. package/dist/{runs → services/runs}/background/notify.mjs +1 -1
  314. package/dist/services/runs/background/notify.mjs.map +1 -0
  315. package/dist/services/runs/background/parentWatchdog.cjs.map +1 -0
  316. package/dist/services/runs/background/parentWatchdog.mjs.map +1 -0
  317. package/dist/services/runs/background/processTerminal.cjs +1 -0
  318. package/dist/services/runs/background/processTerminal.mjs +2 -0
  319. package/dist/services/runs/background/processTerminal.mjs.map +1 -0
  320. package/dist/services/runs/background/resultWatcher.cjs +1 -0
  321. package/dist/services/runs/background/resultWatcher.mjs +2 -0
  322. package/dist/services/runs/background/resultWatcher.mjs.map +1 -0
  323. package/dist/services/runs/background/runIdResolver.cjs +1 -0
  324. package/dist/services/runs/background/runIdResolver.mjs +2 -0
  325. package/dist/services/runs/background/runIdResolver.mjs.map +1 -0
  326. package/dist/services/runs/background/runnerBootstrap.cjs +2 -0
  327. package/dist/services/runs/background/runnerBootstrap.cjs.map +1 -0
  328. package/dist/services/runs/background/runnerBootstrap.mjs +2 -0
  329. package/dist/services/runs/background/runnerBootstrap.mjs.map +1 -0
  330. package/dist/services/runs/background/runnerExecution.cjs +2 -0
  331. package/dist/services/runs/background/runnerExecution.cjs.map +1 -0
  332. package/dist/services/runs/background/runnerExecution.mjs +2 -0
  333. package/dist/services/runs/background/runnerExecution.mjs.map +1 -0
  334. package/dist/{runs → services/runs}/background/runnerReporting.cjs +2 -2
  335. package/dist/services/runs/background/runnerReporting.cjs.map +1 -0
  336. package/dist/{runs → services/runs}/background/runnerReporting.mjs +2 -2
  337. package/dist/services/runs/background/runnerReporting.mjs.map +1 -0
  338. package/dist/services/runs/background/runnerTeamMembership.cjs +2 -0
  339. package/dist/services/runs/background/runnerTeamMembership.cjs.map +1 -0
  340. package/dist/services/runs/background/runnerTeamMembership.mjs +2 -0
  341. package/dist/services/runs/background/runnerTeamMembership.mjs.map +1 -0
  342. package/dist/services/runs/background/spawnHandshake.cjs +2 -0
  343. package/dist/services/runs/background/spawnHandshake.cjs.map +1 -0
  344. package/dist/services/runs/background/spawnHandshake.mjs +2 -0
  345. package/dist/services/runs/background/spawnHandshake.mjs.map +1 -0
  346. package/dist/services/runs/background/staleRunReconciler.cjs +1 -0
  347. package/dist/services/runs/background/staleRunReconciler.mjs +2 -0
  348. package/dist/services/runs/background/staleRunReconciler.mjs.map +1 -0
  349. package/dist/services/runs/background/statusReader.cjs +1 -0
  350. package/dist/services/runs/background/statusReader.mjs +2 -0
  351. package/dist/services/runs/background/statusReader.mjs.map +1 -0
  352. package/dist/services/runs/background/statusWriter.cjs +2 -0
  353. package/dist/services/runs/background/statusWriter.cjs.map +1 -0
  354. package/dist/services/runs/background/statusWriter.mjs +2 -0
  355. package/dist/services/runs/background/statusWriter.mjs.map +1 -0
  356. package/dist/services/runs/background/subagentWait.cjs +2 -0
  357. package/dist/services/runs/background/subagentWait.cjs.map +1 -0
  358. package/dist/services/runs/background/subagentWait.mjs +2 -0
  359. package/dist/services/runs/background/subagentWait.mjs.map +1 -0
  360. package/dist/{runs/background/terminalPersistence.mjs → services/runs/background/terminalPersistence.cjs} +2 -2
  361. package/dist/services/runs/background/terminalPersistence.cjs.map +1 -0
  362. package/dist/services/runs/background/terminalPersistence.mjs +2 -0
  363. package/dist/services/runs/background/terminalPersistence.mjs.map +1 -0
  364. package/dist/services/runs/extensionErrorTelemetry.cjs +2 -0
  365. package/dist/services/runs/extensionErrorTelemetry.cjs.map +1 -0
  366. package/dist/services/runs/extensionErrorTelemetry.mjs +2 -0
  367. package/dist/services/runs/extensionErrorTelemetry.mjs.map +1 -0
  368. package/dist/services/runs/registry/processGroup.cjs.map +1 -0
  369. package/dist/services/runs/registry/processGroup.mjs.map +1 -0
  370. package/dist/services/runs/registry/runRegistry.cjs +1 -0
  371. package/dist/services/runs/registry/runRegistry.mjs +2 -0
  372. package/dist/services/runs/registry/runRegistry.mjs.map +1 -0
  373. package/dist/services/runs/registry/sessionLifecycle.cjs +2 -0
  374. package/dist/services/runs/registry/sessionLifecycle.cjs.map +1 -0
  375. package/dist/services/runs/registry/sessionLifecycle.mjs +2 -0
  376. package/dist/services/runs/registry/sessionLifecycle.mjs.map +1 -0
  377. package/dist/services/runs/registry/suspendedRuns.cjs +1 -0
  378. package/dist/services/runs/registry/suspendedRuns.mjs +2 -0
  379. package/dist/services/runs/registry/suspendedRuns.mjs.map +1 -0
  380. package/dist/services/runs/sdkRunnerEntry.cjs +1 -0
  381. package/dist/services/runs/sdkRunnerEntry.mjs +1 -0
  382. package/dist/services/runs/shared/claudeFableProfile.cjs +4 -0
  383. package/dist/services/runs/shared/claudeFableProfile.cjs.map +1 -0
  384. package/dist/services/runs/shared/claudeFableProfile.mjs +4 -0
  385. package/dist/services/runs/shared/claudeFableProfile.mjs.map +1 -0
  386. package/dist/services/runs/shared/depthGuard.cjs +2 -0
  387. package/dist/services/runs/shared/depthGuard.cjs.map +1 -0
  388. package/dist/services/runs/shared/depthGuard.mjs +2 -0
  389. package/dist/services/runs/shared/depthGuard.mjs.map +1 -0
  390. package/dist/services/runs/shared/mcpDirectToolAllowlist.cjs +2 -0
  391. package/dist/services/runs/shared/mcpDirectToolAllowlist.cjs.map +1 -0
  392. package/dist/services/runs/shared/mcpDirectToolAllowlist.mjs +2 -0
  393. package/dist/services/runs/shared/mcpDirectToolAllowlist.mjs.map +1 -0
  394. package/dist/services/runs/shared/modelFallback.cjs +2 -0
  395. package/dist/services/runs/shared/modelFallback.cjs.map +1 -0
  396. package/dist/services/runs/shared/modelFallback.mjs +2 -0
  397. package/dist/services/runs/shared/modelFallback.mjs.map +1 -0
  398. package/dist/services/runs/shared/modelScope.cjs +2 -0
  399. package/dist/services/runs/shared/modelScope.cjs.map +1 -0
  400. package/dist/services/runs/shared/modelScope.mjs +2 -0
  401. package/dist/services/runs/shared/modelScope.mjs.map +1 -0
  402. package/dist/services/runs/shared/nestedPath.cjs +2 -0
  403. package/dist/services/runs/shared/nestedPath.cjs.map +1 -0
  404. package/dist/services/runs/shared/nestedPath.mjs +2 -0
  405. package/dist/services/runs/shared/nestedPath.mjs.map +1 -0
  406. package/dist/services/runs/shared/piArgs.cjs +2 -0
  407. package/dist/services/runs/shared/piArgs.cjs.map +1 -0
  408. package/dist/services/runs/shared/piArgs.mjs +2 -0
  409. package/dist/services/runs/shared/piArgs.mjs.map +1 -0
  410. package/dist/services/runs/shared/piSpawn.cjs +2 -0
  411. package/dist/services/runs/shared/piSpawn.cjs.map +1 -0
  412. package/dist/services/runs/shared/piSpawn.mjs +2 -0
  413. package/dist/services/runs/shared/piSpawn.mjs.map +1 -0
  414. package/dist/services/runs/shared/runWithConcurrency.cjs +2 -0
  415. package/dist/services/runs/shared/runWithConcurrency.cjs.map +1 -0
  416. package/dist/services/runs/shared/runWithConcurrency.d.cts +25 -0
  417. package/dist/services/runs/shared/runWithConcurrency.d.cts.map +1 -0
  418. package/dist/services/runs/shared/runWithConcurrency.d.mts +25 -0
  419. package/dist/services/runs/shared/runWithConcurrency.d.mts.map +1 -0
  420. package/dist/services/runs/shared/runWithConcurrency.mjs +2 -0
  421. package/dist/services/runs/shared/runWithConcurrency.mjs.map +1 -0
  422. package/dist/services/runs/shared/runtimeRegistry.cjs +2 -0
  423. package/dist/services/runs/shared/runtimeRegistry.cjs.map +1 -0
  424. package/dist/services/runs/shared/runtimeRegistry.mjs +2 -0
  425. package/dist/services/runs/shared/runtimeRegistry.mjs.map +1 -0
  426. package/dist/services/runs/shared/structuredOutput.cjs +2 -0
  427. package/dist/{runs → services/runs}/shared/structuredOutput.cjs.map +1 -1
  428. package/dist/services/runs/shared/structuredOutput.mjs +2 -0
  429. package/dist/{runs → services/runs}/shared/structuredOutput.mjs.map +1 -1
  430. package/dist/services/runs/shared/toolAvailability.cjs +2 -0
  431. package/dist/services/runs/shared/toolAvailability.cjs.map +1 -0
  432. package/dist/services/runs/shared/toolAvailability.mjs +2 -0
  433. package/dist/services/runs/shared/toolAvailability.mjs.map +1 -0
  434. package/dist/services/runs/shared/toolBudget.cjs +2 -0
  435. package/dist/services/runs/shared/toolBudget.cjs.map +1 -0
  436. package/dist/services/runs/shared/toolBudget.mjs +2 -0
  437. package/dist/services/runs/shared/toolBudget.mjs.map +1 -0
  438. package/dist/shared/artifacts.cjs.map +1 -1
  439. package/dist/shared/artifacts.mjs.map +1 -1
  440. package/dist/shared/atomicJson.cjs +1 -2
  441. package/dist/shared/atomicJson.mjs +1 -1
  442. package/dist/shared/atomicJson.mjs.map +1 -1
  443. package/dist/shared/childTranscript.cjs +1 -5
  444. package/dist/shared/childTranscript.mjs +1 -4
  445. package/dist/shared/childTranscript.mjs.map +1 -1
  446. package/dist/shared/fileSystemRetry.cjs +1 -1
  447. package/dist/shared/fileSystemRetry.cjs.map +1 -1
  448. package/dist/shared/fileSystemRetry.mjs +1 -1
  449. package/dist/shared/fileSystemRetry.mjs.map +1 -1
  450. package/dist/shared/formatters.cjs.map +1 -1
  451. package/dist/shared/formatters.mjs.map +1 -1
  452. package/dist/shared/paths.cjs +1 -1
  453. package/dist/shared/paths.cjs.map +1 -1
  454. package/dist/shared/paths.mjs +1 -1
  455. package/dist/shared/paths.mjs.map +1 -1
  456. package/dist/shared/pollScheduler.cjs +1 -2
  457. package/dist/shared/pollScheduler.mjs +1 -1
  458. package/dist/shared/pollScheduler.mjs.map +1 -1
  459. package/dist/shared/scopeOwner.cjs +1 -2
  460. package/dist/shared/scopeOwner.mjs +1 -1
  461. package/dist/shared/scopeOwner.mjs.map +1 -1
  462. package/dist/tui/agentCatalog.cjs +1 -1
  463. package/dist/tui/agentCatalog.cjs.map +1 -1
  464. package/dist/tui/agentCatalog.mjs +1 -1
  465. package/dist/tui/agentCatalog.mjs.map +1 -1
  466. package/dist/tui/agentResourceProjection.cjs +1 -1
  467. package/dist/tui/agentResourceProjection.cjs.map +1 -1
  468. package/dist/tui/agentResourceProjection.mjs +1 -1
  469. package/dist/tui/agentResourceProjection.mjs.map +1 -1
  470. package/dist/tui/completionNotice.cjs +1 -1
  471. package/dist/tui/completionNotice.cjs.map +1 -1
  472. package/dist/tui/completionNotice.mjs +1 -1
  473. package/dist/tui/completionNotice.mjs.map +1 -1
  474. package/dist/tui/fleet.cjs +2 -2
  475. package/dist/tui/fleet.cjs.map +1 -1
  476. package/dist/tui/fleet.mjs +2 -2
  477. package/dist/tui/fleet.mjs.map +1 -1
  478. package/dist/tui/fleetAgentView.cjs.map +1 -1
  479. package/dist/tui/fleetAgentView.mjs.map +1 -1
  480. package/dist/tui/fleetStatus.cjs +1 -1
  481. package/dist/tui/fleetStatus.cjs.map +1 -1
  482. package/dist/tui/fleetStatus.mjs +1 -1
  483. package/dist/tui/fleetStatus.mjs.map +1 -1
  484. package/dist/tui/fleetTranscript.cjs +1 -1
  485. package/dist/tui/fleetTranscript.cjs.map +1 -1
  486. package/dist/tui/fleetTranscript.mjs +1 -1
  487. package/dist/tui/fleetTranscript.mjs.map +1 -1
  488. package/dist/tui/register.cjs +1 -1
  489. package/dist/tui/register.cjs.map +1 -1
  490. package/dist/tui/register.mjs +1 -1
  491. package/dist/tui/register.mjs.map +1 -1
  492. package/dist/tui/subagentToolRender.cjs +3 -0
  493. package/dist/tui/subagentToolRender.cjs.map +1 -0
  494. package/dist/tui/subagentToolRender.mjs +3 -0
  495. package/dist/tui/subagentToolRender.mjs.map +1 -0
  496. package/dist/{types.d.cts → types/index.d.cts} +2 -2
  497. package/dist/types/index.d.cts.map +1 -0
  498. package/dist/{types.d.mts → types/index.d.mts} +2 -2
  499. package/dist/types/index.d.mts.map +1 -0
  500. package/package.json +23 -16
  501. package/dist/agents/discovery.cjs +0 -2
  502. package/dist/agents/discovery.cjs.map +0 -1
  503. package/dist/agents/discovery.mjs +0 -2
  504. package/dist/agents/discovery.mjs.map +0 -1
  505. package/dist/agents/frontmatter.cjs.map +0 -1
  506. package/dist/agents/frontmatter.mjs.map +0 -1
  507. package/dist/agents/loader.cjs +0 -2
  508. package/dist/agents/loader.cjs.map +0 -1
  509. package/dist/agents/loader.mjs +0 -2
  510. package/dist/agents/loader.mjs.map +0 -1
  511. package/dist/agents/memory.cjs +0 -3
  512. package/dist/agents/memory.cjs.map +0 -1
  513. package/dist/agents/memory.mjs.map +0 -1
  514. package/dist/agents/projectRoot.cjs +0 -2
  515. package/dist/agents/projectRoot.cjs.map +0 -1
  516. package/dist/agents/projectRoot.mjs +0 -2
  517. package/dist/agents/projectRoot.mjs.map +0 -1
  518. package/dist/agents/settings.cjs +0 -2
  519. package/dist/agents/settings.cjs.map +0 -1
  520. package/dist/agents/settings.mjs +0 -2
  521. package/dist/agents/settings.mjs.map +0 -1
  522. package/dist/agents/skills.cjs +0 -0
  523. package/dist/agents/skills.cjs.map +0 -1
  524. package/dist/agents/skills.mjs +0 -5
  525. package/dist/agents/skills.mjs.map +0 -1
  526. package/dist/agents/types.d.cts.map +0 -1
  527. package/dist/agents/types.d.mts.map +0 -1
  528. package/dist/api/capabilityCeiling.mjs.map +0 -1
  529. package/dist/api/teamSnapshot.mjs.map +0 -1
  530. package/dist/env.cjs.map +0 -1
  531. package/dist/env.d.cts.map +0 -1
  532. package/dist/env.d.mts.map +0 -1
  533. package/dist/extension.cjs +0 -2
  534. package/dist/extension.cjs.map +0 -1
  535. package/dist/extension.mjs +0 -2
  536. package/dist/extension.mjs.map +0 -1
  537. package/dist/intercom/intercomBridge.cjs.map +0 -1
  538. package/dist/intercom/intercomBridge.mjs.map +0 -1
  539. package/dist/intercom/nativeTeamChannel.cjs +0 -5
  540. package/dist/intercom/nativeTeamChannel.cjs.map +0 -1
  541. package/dist/intercom/nativeTeamChannel.d.cts.map +0 -1
  542. package/dist/intercom/nativeTeamChannel.d.mts.map +0 -1
  543. package/dist/intercom/nativeTeamChannel.mjs +0 -5
  544. package/dist/intercom/nativeTeamChannel.mjs.map +0 -1
  545. package/dist/intercom/supervisorControlChannel.cjs +0 -2
  546. package/dist/intercom/supervisorControlChannel.cjs.map +0 -1
  547. package/dist/intercom/supervisorControlChannel.mjs.map +0 -1
  548. package/dist/protocol/backgroundWork.cjs +0 -2
  549. package/dist/protocol/backgroundWork.d.cts.map +0 -1
  550. package/dist/protocol/backgroundWork.d.mts.map +0 -1
  551. package/dist/protocol/backgroundWork.mjs +0 -2
  552. package/dist/protocol/backgroundWork.mjs.map +0 -1
  553. package/dist/protocol/capabilityCeiling.cjs +0 -2
  554. package/dist/protocol/capabilityCeiling.cjs.map +0 -1
  555. package/dist/protocol/capabilityCeiling.d.cts.map +0 -1
  556. package/dist/protocol/capabilityCeiling.d.mts.map +0 -1
  557. package/dist/protocol/capabilityCeiling.mjs +0 -2
  558. package/dist/protocol/capabilityCeiling.mjs.map +0 -1
  559. package/dist/protocol/delegation.cjs.map +0 -1
  560. package/dist/protocol/delegation.d.cts.map +0 -1
  561. package/dist/protocol/delegation.d.mts.map +0 -1
  562. package/dist/protocol/delegation.mjs.map +0 -1
  563. package/dist/runs/background/asyncExecution.cjs +0 -2
  564. package/dist/runs/background/asyncExecution.cjs.map +0 -1
  565. package/dist/runs/background/asyncExecution.mjs +0 -2
  566. package/dist/runs/background/asyncExecution.mjs.map +0 -1
  567. package/dist/runs/background/asyncJobTracker.cjs +0 -2
  568. package/dist/runs/background/asyncJobTracker.cjs.map +0 -1
  569. package/dist/runs/background/asyncJobTracker.mjs +0 -2
  570. package/dist/runs/background/asyncJobTracker.mjs.map +0 -1
  571. package/dist/runs/background/cliRunnerEntry.cjs.map +0 -1
  572. package/dist/runs/background/cliRunnerEntry.mjs.map +0 -1
  573. package/dist/runs/background/completionBatcher.cjs.map +0 -1
  574. package/dist/runs/background/completionBatcher.mjs +0 -2
  575. package/dist/runs/background/completionBatcher.mjs.map +0 -1
  576. package/dist/runs/background/notify.cjs.map +0 -1
  577. package/dist/runs/background/notify.mjs.map +0 -1
  578. package/dist/runs/background/parentWatchdog.cjs.map +0 -1
  579. package/dist/runs/background/parentWatchdog.mjs.map +0 -1
  580. package/dist/runs/background/processTerminal.cjs +0 -2
  581. package/dist/runs/background/processTerminal.cjs.map +0 -1
  582. package/dist/runs/background/processTerminal.mjs +0 -2
  583. package/dist/runs/background/processTerminal.mjs.map +0 -1
  584. package/dist/runs/background/resultWatcher.cjs +0 -2
  585. package/dist/runs/background/resultWatcher.cjs.map +0 -1
  586. package/dist/runs/background/resultWatcher.mjs +0 -2
  587. package/dist/runs/background/resultWatcher.mjs.map +0 -1
  588. package/dist/runs/background/runIdResolver.cjs +0 -2
  589. package/dist/runs/background/runIdResolver.cjs.map +0 -1
  590. package/dist/runs/background/runIdResolver.mjs +0 -2
  591. package/dist/runs/background/runIdResolver.mjs.map +0 -1
  592. package/dist/runs/background/runnerBootstrap.cjs +0 -2
  593. package/dist/runs/background/runnerBootstrap.cjs.map +0 -1
  594. package/dist/runs/background/runnerBootstrap.mjs +0 -2
  595. package/dist/runs/background/runnerBootstrap.mjs.map +0 -1
  596. package/dist/runs/background/runnerExecution.cjs +0 -2
  597. package/dist/runs/background/runnerExecution.cjs.map +0 -1
  598. package/dist/runs/background/runnerExecution.mjs +0 -2
  599. package/dist/runs/background/runnerExecution.mjs.map +0 -1
  600. package/dist/runs/background/runnerReporting.cjs.map +0 -1
  601. package/dist/runs/background/runnerReporting.mjs.map +0 -1
  602. package/dist/runs/background/runnerTeamMembership.cjs +0 -2
  603. package/dist/runs/background/runnerTeamMembership.cjs.map +0 -1
  604. package/dist/runs/background/runnerTeamMembership.mjs +0 -2
  605. package/dist/runs/background/runnerTeamMembership.mjs.map +0 -1
  606. package/dist/runs/background/spawnHandshake.cjs +0 -2
  607. package/dist/runs/background/spawnHandshake.cjs.map +0 -1
  608. package/dist/runs/background/spawnHandshake.mjs +0 -2
  609. package/dist/runs/background/spawnHandshake.mjs.map +0 -1
  610. package/dist/runs/background/staleRunReconciler.cjs +0 -2
  611. package/dist/runs/background/staleRunReconciler.cjs.map +0 -1
  612. package/dist/runs/background/staleRunReconciler.mjs +0 -2
  613. package/dist/runs/background/staleRunReconciler.mjs.map +0 -1
  614. package/dist/runs/background/statusReader.cjs +0 -2
  615. package/dist/runs/background/statusReader.cjs.map +0 -1
  616. package/dist/runs/background/statusReader.mjs +0 -2
  617. package/dist/runs/background/statusReader.mjs.map +0 -1
  618. package/dist/runs/background/statusWriter.cjs +0 -2
  619. package/dist/runs/background/statusWriter.cjs.map +0 -1
  620. package/dist/runs/background/statusWriter.mjs +0 -2
  621. package/dist/runs/background/statusWriter.mjs.map +0 -1
  622. package/dist/runs/background/subagentWait.cjs +0 -2
  623. package/dist/runs/background/subagentWait.cjs.map +0 -1
  624. package/dist/runs/background/subagentWait.mjs +0 -2
  625. package/dist/runs/background/subagentWait.mjs.map +0 -1
  626. package/dist/runs/background/terminalPersistence.cjs +0 -2
  627. package/dist/runs/background/terminalPersistence.cjs.map +0 -1
  628. package/dist/runs/background/terminalPersistence.mjs.map +0 -1
  629. package/dist/runs/registry/processGroup.cjs.map +0 -1
  630. package/dist/runs/registry/processGroup.mjs.map +0 -1
  631. package/dist/runs/registry/runRegistry.cjs +0 -2
  632. package/dist/runs/registry/runRegistry.cjs.map +0 -1
  633. package/dist/runs/registry/runRegistry.mjs +0 -2
  634. package/dist/runs/registry/runRegistry.mjs.map +0 -1
  635. package/dist/runs/registry/sessionLifecycle.cjs +0 -2
  636. package/dist/runs/registry/sessionLifecycle.cjs.map +0 -1
  637. package/dist/runs/registry/sessionLifecycle.mjs +0 -2
  638. package/dist/runs/registry/sessionLifecycle.mjs.map +0 -1
  639. package/dist/runs/registry/suspendedRuns.cjs +0 -4
  640. package/dist/runs/registry/suspendedRuns.cjs.map +0 -1
  641. package/dist/runs/registry/suspendedRuns.mjs +0 -4
  642. package/dist/runs/registry/suspendedRuns.mjs.map +0 -1
  643. package/dist/runs/sdkRunnerEntry.cjs.map +0 -1
  644. package/dist/runs/sdkRunnerEntry.mjs.map +0 -1
  645. package/dist/runs/shared/claudeFableProfile.cjs +0 -4
  646. package/dist/runs/shared/claudeFableProfile.cjs.map +0 -1
  647. package/dist/runs/shared/claudeFableProfile.mjs +0 -4
  648. package/dist/runs/shared/claudeFableProfile.mjs.map +0 -1
  649. package/dist/runs/shared/depthGuard.cjs +0 -2
  650. package/dist/runs/shared/depthGuard.cjs.map +0 -1
  651. package/dist/runs/shared/depthGuard.mjs +0 -2
  652. package/dist/runs/shared/depthGuard.mjs.map +0 -1
  653. package/dist/runs/shared/mcpDirectToolAllowlist.cjs +0 -2
  654. package/dist/runs/shared/mcpDirectToolAllowlist.cjs.map +0 -1
  655. package/dist/runs/shared/mcpDirectToolAllowlist.mjs +0 -2
  656. package/dist/runs/shared/mcpDirectToolAllowlist.mjs.map +0 -1
  657. package/dist/runs/shared/modelFallback.cjs +0 -2
  658. package/dist/runs/shared/modelFallback.cjs.map +0 -1
  659. package/dist/runs/shared/modelFallback.mjs +0 -2
  660. package/dist/runs/shared/modelFallback.mjs.map +0 -1
  661. package/dist/runs/shared/modelScope.cjs +0 -2
  662. package/dist/runs/shared/modelScope.cjs.map +0 -1
  663. package/dist/runs/shared/modelScope.mjs +0 -2
  664. package/dist/runs/shared/modelScope.mjs.map +0 -1
  665. package/dist/runs/shared/nestedPath.cjs +0 -2
  666. package/dist/runs/shared/nestedPath.cjs.map +0 -1
  667. package/dist/runs/shared/nestedPath.mjs +0 -2
  668. package/dist/runs/shared/nestedPath.mjs.map +0 -1
  669. package/dist/runs/shared/piArgs.cjs +0 -2
  670. package/dist/runs/shared/piArgs.cjs.map +0 -1
  671. package/dist/runs/shared/piArgs.mjs +0 -2
  672. package/dist/runs/shared/piArgs.mjs.map +0 -1
  673. package/dist/runs/shared/piSpawn.cjs +0 -2
  674. package/dist/runs/shared/piSpawn.cjs.map +0 -1
  675. package/dist/runs/shared/piSpawn.mjs +0 -2
  676. package/dist/runs/shared/piSpawn.mjs.map +0 -1
  677. package/dist/runs/shared/runWithConcurrency.cjs +0 -2
  678. package/dist/runs/shared/runWithConcurrency.cjs.map +0 -1
  679. package/dist/runs/shared/runWithConcurrency.mjs +0 -2
  680. package/dist/runs/shared/runWithConcurrency.mjs.map +0 -1
  681. package/dist/runs/shared/runtimeRegistry.cjs +0 -2
  682. package/dist/runs/shared/runtimeRegistry.cjs.map +0 -1
  683. package/dist/runs/shared/runtimeRegistry.mjs +0 -2
  684. package/dist/runs/shared/runtimeRegistry.mjs.map +0 -1
  685. package/dist/runs/shared/structuredOutput.cjs +0 -2
  686. package/dist/runs/shared/structuredOutput.mjs +0 -2
  687. package/dist/runs/shared/toolAvailability.cjs +0 -2
  688. package/dist/runs/shared/toolAvailability.cjs.map +0 -1
  689. package/dist/runs/shared/toolAvailability.mjs +0 -2
  690. package/dist/runs/shared/toolAvailability.mjs.map +0 -1
  691. package/dist/runs/shared/toolBudget.cjs +0 -2
  692. package/dist/runs/shared/toolBudget.cjs.map +0 -1
  693. package/dist/runs/shared/toolBudget.mjs +0 -2
  694. package/dist/runs/shared/toolBudget.mjs.map +0 -1
  695. package/dist/shared/atomicJson.cjs.map +0 -1
  696. package/dist/shared/childTranscript.cjs.map +0 -1
  697. package/dist/shared/pollScheduler.cjs.map +0 -1
  698. package/dist/shared/scopeOwner.cjs.map +0 -1
  699. package/dist/slash/chainExpression.cjs.map +0 -1
  700. package/dist/slash/chainExpression.mjs.map +0 -1
  701. package/dist/slash/doctor.cjs +0 -5
  702. package/dist/slash/doctor.mjs +0 -5
  703. package/dist/slash/doctor.mjs.map +0 -1
  704. package/dist/slash/slashCommands.cjs.map +0 -1
  705. package/dist/slash/slashCommands.mjs.map +0 -1
  706. package/dist/slash/spawnRequestMapping.cjs.map +0 -1
  707. package/dist/slash/spawnRequestMapping.mjs.map +0 -1
  708. package/dist/slash/subagentLaunch.cjs +0 -2
  709. package/dist/slash/subagentLaunch.cjs.map +0 -1
  710. package/dist/slash/subagentLaunch.mjs +0 -2
  711. package/dist/slash/subagentLaunch.mjs.map +0 -1
  712. package/dist/types.d.cts.map +0 -1
  713. package/dist/types.d.mts.map +0 -1
  714. /package/dist/{slash → commands/slash}/chainExpression.cjs +0 -0
  715. /package/dist/{slash → commands/slash}/chainExpression.mjs +0 -0
  716. /package/dist/{slash → commands/slash}/spawnRequestMapping.cjs +0 -0
  717. /package/dist/{slash → commands/slash}/spawnRequestMapping.mjs +0 -0
  718. /package/dist/{protocol → schemas/team}/delegation.cjs +0 -0
  719. /package/dist/{protocol → schemas/team}/delegation.mjs +0 -0
  720. /package/dist/{agents → services/agents}/frontmatter.cjs +0 -0
  721. /package/dist/{intercom → services/intercom}/intercomBridge.cjs +0 -0
  722. /package/dist/{intercom → services/intercom}/intercomBridge.mjs +0 -0
  723. /package/dist/{runs → services/runs}/background/completionBatcher.cjs +0 -0
  724. /package/dist/{runs → services/runs}/background/parentWatchdog.cjs +0 -0
  725. /package/dist/{runs → services/runs}/background/parentWatchdog.mjs +0 -0
  726. /package/dist/{runs → services/runs}/registry/processGroup.cjs +0 -0
  727. /package/dist/{runs → services/runs}/registry/processGroup.mjs +0 -0
@@ -1,2 +0,0 @@
1
- require(`./_virtual/_rolldown/runtime.cjs`);const e=require(`./container/types.cjs`),t=require(`./container/globalBridge.cjs`),n=require(`./shared/paths.cjs`),r=require(`./shared/modelResolution.cjs`),i=require(`./runs/shared/modelFallback.cjs`),a=require(`./extensions/spawnPlan.cjs`),o=require(`./runs/background/asyncJobTracker.cjs`),s=require(`./runs/registry/suspendedRuns.cjs`),c=require(`./extensions/config.cjs`),l=require(`./shared/scopeOwner.cjs`),u=require(`./container/index.cjs`),d=require(`./slash/slashCommands.cjs`),f=require(`./tui/completionNotice.cjs`),p=require(`./tui/register.cjs`),m=require(`./runs/registry/sessionLifecycle.cjs`),h=require(`./extensions/orchestratorPrompt.cjs`),g=require(`./extensions/delegationBridge.cjs`),_=require(`./extensions/fablePlanBridge.cjs`);let v=require(`@agimon-ai/doompi-extension-contracts/child-process`),y=require(`@agimon-ai/doompi-telemetry`),b=require(`@agimon-ai/doompi-extension-contracts/background-work`),x=require(`@agimon-ai/doompi-extension-contracts/protocol`),S=require(`@agimon-ai/doompi-extension-contracts/subagent-policy`),C=require(`@agimon-ai/doompi-extension-contracts/delegation`);const w=`unknown`;function T(e,t,n,r,i,a){return{spawnPlanner:n,tracker:r,scheduler:i,discovery:e,skills:t,management:a,loadConfig:()=>c.loadConfig().config}}function E(E,D={}){let O=D.doomIntegrations??!0,k=new t.GlobalStateBridge,A,j=e=>(A??=(0,y.createDoomTelemetry)({serviceName:`doom-team`,packageName:`@agimon-ai/doompi-team`,cwd:e.cwd,env:process.env,enableLogs:!0,enableTraces:!0}),A),M=k.getDefaultContainer(),N=M??u.createExtensionContainer(),P=M===void 0;P&&k.setDefaultContainer(N);let F=N.get(e.DOOM_TEAM_TYPES.SubagentToolService),I=N.get(e.DOOM_TEAM_TYPES.NativeTeamChannelService),L=N.get(e.DOOM_TEAM_TYPES.PollScheduler),R=N.get(e.DOOM_TEAM_TYPES.AsyncJobTracker),z=N.get(e.DOOM_TEAM_TYPES.SubagentWaiter),B=N.get(e.DOOM_TEAM_TYPES.AsyncSubagentSpawner),V=N.get(e.DOOM_TEAM_TYPES.AgentDiscoveryService),H=N.get(e.DOOM_TEAM_TYPES.SkillDiscoveryService),U=N.get(e.DOOM_TEAM_TYPES.SpawnPlanner),W=N.get(e.DOOM_TEAM_TYPES.CompletionNotifier),G=N.get(e.DOOM_TEAM_TYPES.ResultWatcher),K=N.get(e.DOOM_TEAM_TYPES.StaleRunReconciler),q=N.get(e.DOOM_TEAM_TYPES.ManagementActions),J=N.get(e.DOOM_TEAM_TYPES.SubagentCapabilityPolicyStore);F.registerTool(E);let Y=P&&O?p.registerSubagentLeaderContribution(E):void 0,X=I.createRuntime(E);if(I.registerClient(E),W.attachHost(E),L.start(),R.start(),P){let e=[],t=[],u,y,w,D,O=g.createDelegationBridge({planner:U,management:q,waiter:z,scheduler:L,tracker:R,loadConfig:()=>c.loadConfig().config}),M=_.createFablePlanBridge({spawner:B,waiter:z,management:q,policies:J,report:(e,t)=>{A?.recordEvent(e,t)}}),N=L.register({id:`stale-run-reconciler`,intervalMs:2e3,run:()=>{let e=!1,t=!1;for(let n of w?.list()??[]){if(n.status&&o.TERMINAL_ASYNC_JOB_STATES.has(n.status))continue;t=!0;let{reconcile:r,sweep:i}=K.reconcileAndSweep(n.runId);r.repaired&&(w?.track(n.runId),e=!0),i.recovered.length>0&&(e=!0)}return e||t}});E.on(`before_agent_start`,e=>{if(h.shouldInjectOrchestratorPrompt(c.loadConfig().config))return{systemPrompt:h.appendOrchestratorPrompt(e.systemPrompt)}}),d.registerSlashCommands(E,{baseCwd:void 0},T(V,H,U,R,L,q)),p.registerAgentListCommand(E,{discovery:V,skills:H,policies:J}),p.registerFleetCommand(E,{scheduler:L,tracker:R,management:q});let P=p.registerAgentStatus(E,{scheduler:L,tracker:R});f.registerCompletionRenderer(E),E.on(`session_start`,(o,c)=>{let d=j(c);d.recordEvent(`doom_team.session_started`,{"team.root_session":(0,v.resolveRootSessionId)(c.sessionManager.getSessionId())===c.sessionManager.getSessionId()});let f=c.sessionManager.getSessionId(),h=n.createSessionScope((0,v.resolveRootSessionId)(f));n.setCurrentSessionScope(h),l.writeScopeOwner(h);let g=m.openScope(h,{readStatus:e=>q.status(e).status});g.suspended.length>0&&c.hasUI&&c.ui.notify(s.formatSuspendedRuns(g.suspended),`info`),d.recordEvent(`doom_team.runs_restored`,{"team.suspended_count":g.suspended.length,"team.pruned_count":g.pruned.length,"team.reaped_count":g.reaped,outcome:`reported`}),w=R.forSession(f),D!==h.scopeKey&&(D=h.scopeKey,G.start(e=>w?.get(e.runId)?W.deliver(e):!1));for(let t of e)t();e=[];for(let e of t)e();t=[],J.clear(),u?.dispose(),y?.dispose(),y=void 0,O.abandonAll(),M.abandonAll();let _=(0,x.createProtocolRuntime)({bus:E.events,source:p.SUBAGENT_LEADER_SOURCE,sessionId:c.sessionManager.getSessionId()});u=(0,b.provideBackgroundWorkRegistry)(_),y=M.bind({sessionId:f,cwd:c.cwd}),t.push(_.onNotification(S.SubagentPolicyRegistration,({policy:e,generation:t})=>{J.register(e,t)}),_.onNotification(S.SubagentPolicyChanged,({policy:e,generation:t})=>{J.update(e,t)}),_.onNotification(S.SubagentPolicyUnregistration,({owner:e,generation:t})=>{J.remove(e,t)})),_.notify(S.SubagentPolicyDiscovery,{}),e.push(...O.bind(_,()=>{let e=i.normalizeParentModel(c.model);return{sessionId:c.sessionManager.getSessionId(),availableModels:r.authenticatedModelInfos(c.modelRegistry),...e?{parentModel:e}:{},forkSource:a.captureSessionForkSource(c.sessionManager,`tool`)}}),_.onNotification(C.DelegationRequested,e=>{d.recordEvent(`doom_team.delegation_requested`,{"agent.name":e.agent,"task.id":e.taskId,mode:e.runMode??`foreground`})}),_.onNotification(C.DelegationStarted,e=>{d.recordEvent(`doom_team.child_started`,{"run.id":e.runId,outcome:`started`})}),_.onNotification(C.DelegationUpdated,e=>{d.recordEvent(`doom_team.delegation_updated`,{"run.id":e.runId,"team.tool_count":e.toolCount??0,"team.duration_ms":e.durationMs??0,"team.token_count":e.tokens??0,outcome:e.status??`updated`})}),_.onNotification(C.DelegationFinished,e=>{d.recordEvent(`doom_team.delegation_finished`,{"run.id":e.runId,"team.tool_count":e.toolCount??0,"team.duration_ms":e.durationMs??0,outcome:e.status})}),_.onNotification(C.DelegationCancelled,()=>{d.recordEvent(`doom_team.delegation_cancelled`,{outcome:`cancelled`})})),X.bindMainSession(f)}),k.setRuntimeCleanup(()=>{N();for(let t of e)t();e=[];for(let e of t)e();t=[],J.clear(),u?.dispose(),u=void 0,y?.dispose(),y=void 0,O.abandonAll(),M.abandonAll(),Y?.(),P(),X.dispose(),G.stop(),D=void 0,W.dispose(),L.stop(),R.stop(),X.dispose(),k.clearDefaultContainer()})}E.on(`session_shutdown`,async(e,t)=>{let r=n.tryCurrentSessionScope(),i=r?m.suspendScopeRuns({scope:r,reason:e.reason??w,readStatus:e=>q.status(e).status}):Promise.resolve(void 0);k.takeRuntimeCleanup()?.();let a;try{a=await i,await A?.recordEvent(`doom_team.session_finished`,{reason:e.reason??w,"team.suspended_count":a?.suspended.length??0,"team.unstoppable_count":a?.unstoppable.length??0,outcome:a?.unstoppable.length?`degraded`:`suspended`})}catch(t){await A?.recordError(`doom_team.session_shutdown_failed`,t,{reason:e.reason??w})}finally{await A?.shutdown(),A=void 0}})}exports.activateDoomTeamExtension=E;
2
- //# sourceMappingURL=extension.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.cjs","names":["loadConfig","GlobalStateBridge","createExtensionContainer","DOOM_TEAM_TYPES","registerSubagentLeaderContribution","createDelegationBridge","createFablePlanBridge","TERMINAL_ASYNC_JOB_STATES","shouldInjectOrchestratorPrompt","appendOrchestratorPrompt","registerAgentStatus","createSessionScope","openScope","formatSuspendedRuns","SUBAGENT_LEADER_SOURCE","SubagentPolicyRegistration","SubagentPolicyChanged","SubagentPolicyUnregistration","SubagentPolicyDiscovery","normalizeParentModel","authenticatedModelInfos","captureSessionForkSource","DelegationRequested","DelegationStarted","DelegationUpdated","DelegationFinished","DelegationCancelled","tryCurrentSessionScope","suspendScopeRuns"],"sources":["../src/extension.ts"],"sourcesContent":["/**\n * The parent extension's implementation: everything `extensions/pi.ts` wires\n * into a Pi host, kept out of that adapter so it is testable without a host.\n *\n * `extensions/pi.ts` is a three-line re-export of this, matching every sibling\n * doom extension (`doom-task`, `doom-workflow`, `doom-file-edit`,\n * `doom-runner`) and the `thin-pi-adapter` rule they all satisfy.\n *\n * RELOAD SAFETY, AND WHY `GlobalStateBridge` OWNS IT:\n * The activation function below can run more than once against the SAME\n * `pi: ExtensionAPI` (a host reload re-invoking a still-cached module\n * instance). Building a SECOND `createExtensionContainer()` on a repeat\n * activation would produce two independent singleton sets in one process -\n * the exact split-brain shape flagged earlier in this package's history for\n * a similarly-shaped \"container per call instead of per process\" bug. Since\n * this file cannot be `@injectable()` (it IS the composition root; nothing\n * constructs it), it cannot hold instance state the way `SubagentToolService`\n * holds its own `WeakSet<ExtensionAPI>` registration guard. `GlobalStateBridge`\n * exists for exactly this: its `getDefaultContainer()`/`setDefaultContainer()`\n * pair (`container/globalBridge.ts`) is the one sanctioned place this\n * package is allowed to remember something across what would otherwise be\n * independent module instantiations, keyed through `globalThis` rather than\n * a module-level `let`. A repeat activation reuses the existing container, so\n * every already-idempotent per-service registration (`SubagentToolService`'s\n * own `WeakSet` guard,\n * `NativeTeamChannelService.createRuntime`'s `WeakMap` memo, `PollScheduler.\n * start()`'s own idempotent doc) stays correct. Registrations with NO internal\n * guard (`registerSlashCommands`, `registerAgentListCommand`, and\n * `registerFleetCommand`) are gated to run only on the activation that actually\n * built the container because `pi.registerCommand` has no documented\n * duplicate-name behavior or `hasCommand`-style helper in this package.\n *\n * DISPOSAL ON `session_shutdown`:\n * `GlobalStateBridge.setRuntimeCleanup()`/`takeRuntimeCleanup()` is a POP,\n * not a peek - the second call (a second shutdown event, or a defensive\n * double-registration of the handler across two activations) finds nothing\n * and no-ops, so the shutdown handler needs no separate idempotency guard of\n * its own. `SessionShutdownEvent.reason` covers `quit`/`reload`/`new`/\n * `resume`/`fork`, but its own doc says the event fires whenever \"an\n * extension runtime is torn down\" regardless of reason, so cleanup runs\n * unconditionally rather than branching on `reason`.\n *\n * SCOPE, STATED EXPLICITLY:\n * This wires the lifecycle services, starts `AsyncJobTracker`, and binds the\n * root session as intercom member `main`. Child membership is registered by\n * the child prompt runtime. It also drives\n * `StaleRunReconciler` from the shared poll scheduler for every tracked\n * non-terminal run. `ControlChannelWatcher` is child-runtime-owned, while\n * `AutoDrainService` remains outside this parent composition root.\n *\n */\n\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport {\n provideBackgroundWorkRegistry,\n type BackgroundWorkRegistryHandle,\n} from '@agimon-ai/doompi-extension-contracts/background-work';\nimport { resolveRootSessionId } from '@agimon-ai/doompi-extension-contracts/child-process';\nimport { createProtocolRuntime } from '@agimon-ai/doompi-extension-contracts/protocol';\nimport {\n SubagentPolicyChanged,\n SubagentPolicyDiscovery,\n SubagentPolicyRegistration,\n SubagentPolicyUnregistration,\n} from '@agimon-ai/doompi-extension-contracts/subagent-policy';\nimport {\n DelegationCancelled,\n DelegationFinished,\n DelegationRequested,\n DelegationStarted,\n DelegationUpdated,\n} from '@agimon-ai/doompi-extension-contracts/delegation';\n\nimport { GlobalStateBridge } from './container/globalBridge.ts';\nimport { createExtensionContainer } from './container/index.ts';\nimport { DOOM_TEAM_TYPES } from './container/types.ts';\nimport type { IAgentDiscoveryService } from './agents/types.ts';\nimport type { ISkillDiscoveryService } from './agents/skills.ts';\nimport {\n type IAsyncJobTracker,\n type ITrackedAsyncJobs,\n TERMINAL_ASYNC_JOB_STATES,\n} from './runs/background/asyncJobTracker.ts';\nimport type { IAsyncSubagentSpawner } from './runs/background/asyncExecution.ts';\nimport type { ISubagentWaiter } from './runs/background/subagentWait.ts';\nimport type { ICompletionNotifier } from './runs/background/notify.ts';\nimport type { IPollScheduler } from './shared/pollScheduler.ts';\nimport type { IResultWatcher } from './runs/background/resultWatcher.ts';\nimport type { IStaleRunReconciler } from './runs/background/staleRunReconciler.ts';\nimport type { INativeTeamChannelService } from './intercom/nativeTeamChannel.ts';\nimport { registerSlashCommands, type SlashCommandDeps, type SlashCommandState } from './slash/slashCommands.ts';\nimport { registerCompletionRenderer } from './tui/completionNotice.ts';\nimport {\n registerAgentListCommand,\n registerAgentStatus,\n registerFleetCommand,\n registerSubagentLeaderContribution,\n SUBAGENT_LEADER_SOURCE,\n} from './tui/register.ts';\nimport { normalizeParentModel } from './runs/shared/modelFallback.ts';\nimport { authenticatedModelInfos } from './shared/modelResolution.ts';\nimport { createSessionScope, setCurrentSessionScope, tryCurrentSessionScope } from './shared/paths.ts';\nimport { writeScopeOwner } from './shared/scopeOwner.ts';\nimport { openScope, suspendScopeRuns } from './runs/registry/sessionLifecycle.ts';\nimport { formatSuspendedRuns } from './runs/registry/suspendedRuns.ts';\nimport { loadConfig } from './extensions/config.ts';\nimport { appendOrchestratorPrompt, shouldInjectOrchestratorPrompt } from './extensions/orchestratorPrompt.ts';\nimport type { IManagementActions } from './extensions/managementActions.ts';\nimport { SubagentCapabilityPolicyStore } from './protocol/capabilityCeiling.ts';\nimport { captureSessionForkSource, type ISpawnPlanner } from './extensions/spawnPlan.ts';\nimport type { ISubagentToolService } from './extensions/subagentTool.ts';\nimport { createDelegationBridge } from './extensions/delegationBridge.ts';\nimport { createFablePlanBridge } from './extensions/fablePlanBridge.ts';\n\n/** See the subscriber's own comment for why crash detection does not need the 250ms floor. */\nconst STALE_RUN_RECONCILE_INTERVAL_MS = 2_000;\nconst SESSION_SHUTDOWN_REASON_FALLBACK = 'unknown';\n\nfunction buildSlashCommandDeps(\n discovery: IAgentDiscoveryService,\n skills: ISkillDiscoveryService,\n planner: ISpawnPlanner,\n tracker: IAsyncJobTracker,\n scheduler: IPollScheduler,\n management: IManagementActions,\n): SlashCommandDeps {\n return {\n spawnPlanner: planner,\n tracker,\n scheduler,\n discovery,\n skills,\n management,\n loadConfig: () => loadConfig().config,\n };\n}\n\n/**\n * The extension factory pi's loader calls, exported as the module default\n * (see the override this file carries in `vibe-lint.config.yaml`). This is an\n * ESM `.ts` module, so it CANNOT use the `export =` form that\n * `subagentPromptRuntimeEntry.cts` is required to use - that file is `.cts`\n * and is resolved by raw path, this one is resolved as a package subpath and\n * matches the `export default` convention every sibling extension in this repo\n * already uses (`doom-task`, `doom-file-edit`, `doom-pi-ui`).\n */\nexport interface DoomTeamExtensionOptions {\n doomIntegrations?: boolean;\n}\n\nexport function activateDoomTeamExtension(pi: ExtensionAPI, options: DoomTeamExtensionOptions = {}): void {\n const doomIntegrations = options.doomIntegrations ?? true;\n const bridge = new GlobalStateBridge();\n let telemetry: DoomTelemetry | undefined;\n const getTelemetry = (ctx: ExtensionContext): DoomTelemetry => {\n telemetry ??= createDoomTelemetry({\n serviceName: 'doom-team',\n packageName: '@agimon-ai/doompi-team',\n cwd: ctx.cwd,\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n return telemetry;\n };\n const existingContainer = bridge.getDefaultContainer();\n const container = existingContainer ?? createExtensionContainer();\n const builtNewContainer = existingContainer === undefined;\n if (builtNewContainer) bridge.setDefaultContainer(container);\n\n const subagentTool = container.get<ISubagentToolService>(DOOM_TEAM_TYPES.SubagentToolService);\n const teamChannel = container.get<INativeTeamChannelService>(DOOM_TEAM_TYPES.NativeTeamChannelService);\n const pollScheduler = container.get<IPollScheduler>(DOOM_TEAM_TYPES.PollScheduler);\n const asyncJobTracker = container.get<IAsyncJobTracker>(DOOM_TEAM_TYPES.AsyncJobTracker);\n const subagentWaiter = container.get<ISubagentWaiter>(DOOM_TEAM_TYPES.SubagentWaiter);\n const asyncSubagentSpawner = container.get<IAsyncSubagentSpawner>(DOOM_TEAM_TYPES.AsyncSubagentSpawner);\n const discovery = container.get<IAgentDiscoveryService>(DOOM_TEAM_TYPES.AgentDiscoveryService);\n const skills = container.get<ISkillDiscoveryService>(DOOM_TEAM_TYPES.SkillDiscoveryService);\n const spawnPlanner = container.get<ISpawnPlanner>(DOOM_TEAM_TYPES.SpawnPlanner);\n const completionNotifier = container.get<ICompletionNotifier>(DOOM_TEAM_TYPES.CompletionNotifier);\n const resultWatcher = container.get<IResultWatcher>(DOOM_TEAM_TYPES.ResultWatcher);\n const staleRunReconciler = container.get<IStaleRunReconciler>(DOOM_TEAM_TYPES.StaleRunReconciler);\n const management = container.get<IManagementActions>(DOOM_TEAM_TYPES.ManagementActions);\n const capabilityPolicies = container.get<SubagentCapabilityPolicyStore>(\n DOOM_TEAM_TYPES.SubagentCapabilityPolicyStore,\n );\n\n // Each of these is idempotent on its own (own WeakSet/WeakMap guard, or\n // internally gated to no-op) - safe to redo on every activation, not just\n // the one that built the container.\n subagentTool.registerTool(pi);\n const disposeLeader = builtNewContainer && doomIntegrations ? registerSubagentLeaderContribution(pi) : undefined;\n const teamRuntime = teamChannel.createRuntime(pi);\n teamChannel.registerClient(pi);\n // Attach before `ResultWatcher.start()`, which `session_start` drives: a\n // result file left behind by a previous session is claimed on the watcher's\n // very first tick, and a notifier with no host yet would report\n // non-delivery for it and make the watcher retry a completion it could have\n // rendered immediately.\n completionNotifier.attachHost(pi);\n pollScheduler.start();\n asyncJobTracker.start();\n\n // No internal guard exists for these - see the module header. Gated to the\n // activation that actually built the container so a repeat activation does\n // not attempt to register the same command name twice.\n if (builtNewContainer) {\n let disposeDelegationProviders: Array<() => void> = [];\n let disposePolicyProviders: Array<() => void> = [];\n let backgroundWorkRegistry: BackgroundWorkRegistryHandle | undefined;\n let fableBrokerRegistration: { dispose(): void } | undefined;\n let currentSessionJobs: ITrackedAsyncJobs | undefined;\n // The scope `ResultWatcher` is currently watching. See its start site in\n // the `session_start` handler for why the watcher is latched on this\n // rather than started once.\n let watchedScopeKey: string | undefined;\n const delegationBridge = createDelegationBridge({\n planner: spawnPlanner,\n management,\n waiter: subagentWaiter,\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n const fablePlanBridge = createFablePlanBridge({\n spawner: asyncSubagentSpawner,\n waiter: subagentWaiter,\n management,\n policies: capabilityPolicies,\n report: (event, attributes) => {\n void telemetry?.recordEvent(event, attributes);\n },\n });\n\n const unregisterStaleRunReconciler = pollScheduler.register({\n id: 'stale-run-reconciler',\n // Crash detection, not status freshness - `AsyncJobTracker` owns that and\n // polls on its own 250ms. This subscriber only ever acts on a run whose\n // process is provably dead, so noticing that 2s later is invisible, while\n // running it 4x/second per active run was not: each pass is a status read,\n // a run-id resolve and a pid probe that a healthy child always discards.\n intervalMs: STALE_RUN_RECONCILE_INTERVAL_MS,\n run: () => {\n let repaired = false;\n let hasActiveRun = false;\n for (const job of currentSessionJobs?.list() ?? []) {\n if (job.status && TERMINAL_ASYNC_JOB_STATES.has(job.status)) continue;\n hasActiveRun = true;\n // One pass, one `inspect()`. Calling `reconcile` and\n // `sweepOrphanedClaims` separately probed the same pid twice for the\n // same answer - see `IStaleRunReconciler.reconcileAndSweep`.\n const { reconcile: outcome, sweep } = staleRunReconciler.reconcileAndSweep(job.runId);\n if (outcome.repaired) {\n currentSessionJobs?.track(job.runId);\n repaired = true;\n }\n if (sweep.recovered.length > 0) repaired = true;\n }\n // An active runner is useful work for scheduling purposes: keeping\n // the shared scheduler at its floor prevents crash detection from\n // inheriting the idle five-second backoff ceiling.\n return repaired || hasActiveRun;\n },\n });\n // The orchestration addendum. Registered here rather than inside the\n // `subagent` tool's description because it is behavioural guidance, and it\n // has to land before the model decides whether to reach for the tool at\n // all - see `orchestratorPrompt.ts`. Read config per turn so toggling it\n // does not need a session restart; `loadConfig` is memoized on the file's\n // own mtime, so this is a stat, not a read.\n pi.on('before_agent_start', (event: { systemPrompt?: string }) => {\n if (!shouldInjectOrchestratorPrompt(loadConfig().config)) return undefined;\n return { systemPrompt: appendOrchestratorPrompt(event.systemPrompt) };\n });\n\n const state: SlashCommandState = { baseCwd: undefined };\n registerSlashCommands(\n pi,\n state,\n buildSlashCommandDeps(discovery, skills, spawnPlanner, asyncJobTracker, pollScheduler, management),\n );\n registerAgentListCommand(pi, { discovery, skills, policies: capabilityPolicies });\n registerFleetCommand(pi, {\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n management,\n });\n const disposeAgentStatus = registerAgentStatus(pi, {\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n });\n registerCompletionRenderer(pi);\n\n // Bind the root session directly into the one intercom transport. Child\n // processes bind from the team environment written during spawn.\n pi.on('session_start', (_event, ctx: ExtensionContext) => {\n const activeTelemetry = getTelemetry(ctx);\n void activeTelemetry.recordEvent('doom_team.session_started', {\n 'team.root_session':\n resolveRootSessionId(ctx.sessionManager.getSessionId()) === ctx.sessionManager.getSessionId(),\n });\n // Before anything else: every scoped path helper reads this. A child\n // keeps the root inherited from its spawn environment, while a top-level\n // session falls back to its own Pi session id.\n const sessionId = ctx.sessionManager.getSessionId();\n const scope = createSessionScope(resolveRootSessionId(sessionId));\n setCurrentSessionScope(scope);\n // Claim the scope for this process, so a later sweep can tell an\n // abandoned tree from a live one. Rewritten on every session_start\n // because /resume legitimately re-adopts a scope under a new process.\n writeScopeOwner(scope);\n // Prune records whose process is gone, reap sibling scopes holding\n // nothing alive, and REPORT what is suspended. Nothing is restarted\n // here: reopening a session must not silently spawn agents and start\n // spending tokens on work that may be days stale.\n const opened = openScope(scope, {\n readStatus: (runId) => management.status(runId).status,\n });\n if (opened.suspended.length > 0 && ctx.hasUI) {\n ctx.ui.notify(formatSuspendedRuns(opened.suspended), 'info');\n }\n void activeTelemetry.recordEvent('doom_team.runs_restored', {\n 'team.suspended_count': opened.suspended.length,\n 'team.pruned_count': opened.pruned.length,\n 'team.reaped_count': opened.reaped,\n outcome: 'reported',\n });\n currentSessionJobs = asyncJobTracker.forSession(sessionId);\n // Started HERE, not at activation: `start()` reads `currentRunsDir()`\n // for lingering claims and puts an `fs.watch` on `currentResultsDir()`,\n // so it needs the scope that only exists from this point on. Starting it\n // at activation threw outright, and would have pinned the watch to the\n // previous scope's directory after /new, /resume and /fork.\n //\n // Latched on the scope key because `start()`'s own contract says a\n // repeat call RESETS what it tracks: a reload that re-fires\n // `session_start` for the SAME session must not drop in-flight claims,\n // while a genuinely new scope has none to drop and needs the new watch.\n // `CompletionNotifier.deliver` matches `ResultConsumer` exactly, which\n // is what makes a completed run render in the parent's chat rather than\n // only land as a file nobody reads.\n if (watchedScopeKey !== scope.scopeKey) {\n watchedScopeKey = scope.scopeKey;\n resultWatcher.start((result) =>\n currentSessionJobs?.get(result.runId) ? completionNotifier.deliver(result) : false,\n );\n }\n for (const dispose of disposeDelegationProviders) dispose();\n disposeDelegationProviders = [];\n for (const dispose of disposePolicyProviders) dispose();\n disposePolicyProviders = [];\n capabilityPolicies.clear();\n backgroundWorkRegistry?.dispose();\n fableBrokerRegistration?.dispose();\n fableBrokerRegistration = undefined;\n delegationBridge.abandonAll();\n fablePlanBridge.abandonAll();\n const protocol = createProtocolRuntime({\n bus: pi.events,\n source: SUBAGENT_LEADER_SOURCE,\n sessionId: ctx.sessionManager.getSessionId(),\n });\n backgroundWorkRegistry = provideBackgroundWorkRegistry(protocol);\n fableBrokerRegistration = fablePlanBridge.bind({ sessionId, cwd: ctx.cwd });\n const registerPolicy = ({\n policy,\n generation,\n }: {\n policy: Parameters<typeof capabilityPolicies.update>[0];\n generation: string;\n }): void => {\n capabilityPolicies.register(policy, generation);\n };\n const updatePolicy: typeof registerPolicy = ({ policy, generation }): void => {\n capabilityPolicies.update(policy, generation);\n };\n disposePolicyProviders.push(\n protocol.onNotification(SubagentPolicyRegistration, registerPolicy),\n protocol.onNotification(SubagentPolicyChanged, updatePolicy),\n protocol.onNotification(SubagentPolicyUnregistration, ({ owner, generation }) => {\n capabilityPolicies.remove(owner, generation);\n }),\n );\n protocol.notify(SubagentPolicyDiscovery, {});\n disposeDelegationProviders.push(\n ...delegationBridge.bind(protocol, () => {\n const parentModel = normalizeParentModel(ctx.model);\n return {\n sessionId: ctx.sessionManager.getSessionId(),\n availableModels: authenticatedModelInfos(ctx.modelRegistry),\n ...(parentModel ? { parentModel } : {}),\n forkSource: captureSessionForkSource(ctx.sessionManager, 'tool'),\n };\n }),\n protocol.onNotification(DelegationRequested, (request) => {\n void activeTelemetry.recordEvent('doom_team.delegation_requested', {\n 'agent.name': request.agent,\n 'task.id': request.taskId,\n mode: request.runMode ?? 'foreground',\n });\n }),\n protocol.onNotification(DelegationStarted, (event) => {\n void activeTelemetry.recordEvent('doom_team.child_started', { 'run.id': event.runId, outcome: 'started' });\n }),\n protocol.onNotification(DelegationUpdated, (event) => {\n void activeTelemetry.recordEvent('doom_team.delegation_updated', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n 'team.token_count': event.tokens ?? 0,\n outcome: event.status ?? 'updated',\n });\n }),\n protocol.onNotification(DelegationFinished, (event) => {\n void activeTelemetry.recordEvent('doom_team.delegation_finished', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n outcome: event.status,\n });\n }),\n protocol.onNotification(DelegationCancelled, () => {\n void activeTelemetry.recordEvent('doom_team.delegation_cancelled', { outcome: 'cancelled' });\n }),\n );\n teamRuntime.bindMainSession(sessionId);\n });\n\n bridge.setRuntimeCleanup(() => {\n unregisterStaleRunReconciler();\n for (const dispose of disposeDelegationProviders) dispose();\n disposeDelegationProviders = [];\n for (const dispose of disposePolicyProviders) dispose();\n disposePolicyProviders = [];\n capabilityPolicies.clear();\n backgroundWorkRegistry?.dispose();\n backgroundWorkRegistry = undefined;\n fableBrokerRegistration?.dispose();\n fableBrokerRegistration = undefined;\n delegationBridge.abandonAll();\n fablePlanBridge.abandonAll();\n disposeLeader?.();\n disposeAgentStatus();\n teamRuntime.dispose();\n resultWatcher.stop();\n watchedScopeKey = undefined;\n completionNotifier.dispose();\n pollScheduler.stop();\n asyncJobTracker.stop();\n teamRuntime.dispose();\n bridge.clearDefaultContainer();\n });\n }\n\n /**\n * Every reason suspends, with no exception for `reload`.\n *\n * Pi emits this for `quit`, `reload`, `new`, `resume` and `fork`. Treating\n * `reload` differently - keeping children alive because `/domains`, `/major-mode`\n * and `/profile` only reload the extension - would be the one case someone\n * has to remember, and the one that silently misbehaves if Pi adds a sixth\n * reason. Suspending uniformly costs a respawn on reload; restore continues\n * the child's own transcript rather than restarting its task.\n */\n pi.on('session_shutdown', async (event: { reason?: string }, _ctx: ExtensionContext) => {\n const scope = tryCurrentSessionScope();\n const suspensionPromise = scope\n ? suspendScopeRuns({\n scope,\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n readStatus: (runId) => management.status(runId).status,\n })\n : Promise.resolve(undefined);\n bridge.takeRuntimeCleanup()?.();\n let suspension: Awaited<ReturnType<typeof suspendScopeRuns>> | undefined;\n try {\n suspension = await suspensionPromise;\n await telemetry?.recordEvent('doom_team.session_finished', {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n 'team.suspended_count': suspension?.suspended.length ?? 0,\n 'team.unstoppable_count': suspension?.unstoppable.length ?? 0,\n outcome: suspension?.unstoppable.length ? 'degraded' : 'suspended',\n });\n } catch (error) {\n await telemetry?.recordError('doom_team.session_shutdown_failed', error, {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n });\n } finally {\n await telemetry?.shutdown();\n telemetry = undefined;\n }\n });\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{DOOM_TEAM_TYPES as e,init_types as t}from"./container/types.mjs";import{GlobalStateBridge as n,init_globalBridge as r}from"./container/globalBridge.mjs";import{createSessionScope as i,init_paths as a,setCurrentSessionScope as ee,tryCurrentSessionScope as o}from"./shared/paths.mjs";import{authenticatedModelInfos as te,init_modelResolution as s}from"./shared/modelResolution.mjs";import{init_modelFallback as c,normalizeParentModel as l}from"./runs/shared/modelFallback.mjs";import{captureSessionForkSource as u,init_spawnPlan as d}from"./extensions/spawnPlan.mjs";import{TERMINAL_ASYNC_JOB_STATES as f,init_asyncJobTracker as p}from"./runs/background/asyncJobTracker.mjs";import{formatSuspendedRuns as ne,init_suspendedRuns as m}from"./runs/registry/suspendedRuns.mjs";import{init_config as h,loadConfig as g}from"./extensions/config.mjs";import{init_scopeOwner as _,writeScopeOwner as re}from"./shared/scopeOwner.mjs";import{createExtensionContainer as v,init_container as y}from"./container/index.mjs";import{registerSlashCommands as ie}from"./slash/slashCommands.mjs";import{registerCompletionRenderer as b}from"./tui/completionNotice.mjs";import{SUBAGENT_LEADER_SOURCE as x,registerAgentListCommand as S,registerAgentStatus as C,registerFleetCommand as w,registerSubagentLeaderContribution as ae}from"./tui/register.mjs";import{openScope as oe,suspendScopeRuns as se}from"./runs/registry/sessionLifecycle.mjs";import{appendOrchestratorPrompt as T,shouldInjectOrchestratorPrompt as E}from"./extensions/orchestratorPrompt.mjs";import{createDelegationBridge as D}from"./extensions/delegationBridge.mjs";import{createFablePlanBridge as O}from"./extensions/fablePlanBridge.mjs";import{resolveRootSessionId as k}from"@agimon-ai/doompi-extension-contracts/child-process";import{createDoomTelemetry as A}from"@agimon-ai/doompi-telemetry";import{provideBackgroundWorkRegistry as j}from"@agimon-ai/doompi-extension-contracts/background-work";import{createProtocolRuntime as M}from"@agimon-ai/doompi-extension-contracts/protocol";import{SubagentPolicyChanged as N,SubagentPolicyDiscovery as P,SubagentPolicyRegistration as F,SubagentPolicyUnregistration as I}from"@agimon-ai/doompi-extension-contracts/subagent-policy";import{DelegationCancelled as L,DelegationFinished as R,DelegationRequested as z,DelegationStarted as ce,DelegationUpdated as B}from"@agimon-ai/doompi-extension-contracts/delegation";r(),y(),t(),p(),c(),s(),a(),_(),m(),h(),d();const V=`unknown`;function H(e,t,n,r,i,a){return{spawnPlanner:n,tracker:r,scheduler:i,discovery:e,skills:t,management:a,loadConfig:()=>g().config}}function U(t,r={}){let a=r.doomIntegrations??!0,s=new n,c,d=e=>(c??=A({serviceName:`doom-team`,packageName:`@agimon-ai/doompi-team`,cwd:e.cwd,env:process.env,enableLogs:!0,enableTraces:!0}),c),p=s.getDefaultContainer(),m=p??v(),h=p===void 0;h&&s.setDefaultContainer(m);let _=m.get(e.SubagentToolService),y=m.get(e.NativeTeamChannelService),U=m.get(e.PollScheduler),W=m.get(e.AsyncJobTracker),G=m.get(e.SubagentWaiter),le=m.get(e.AsyncSubagentSpawner),K=m.get(e.AgentDiscoveryService),q=m.get(e.SkillDiscoveryService),J=m.get(e.SpawnPlanner),Y=m.get(e.CompletionNotifier),X=m.get(e.ResultWatcher),ue=m.get(e.StaleRunReconciler),Z=m.get(e.ManagementActions),Q=m.get(e.SubagentCapabilityPolicyStore);_.registerTool(t);let de=h&&a?ae(t):void 0,$=y.createRuntime(t);if(y.registerClient(t),Y.attachHost(t),U.start(),W.start(),h){let e=[],n=[],r,a,o,p,m=D({planner:J,management:Z,waiter:G,scheduler:U,tracker:W,loadConfig:()=>g().config}),h=O({spawner:le,waiter:G,management:Z,policies:Q,report:(e,t)=>{c?.recordEvent(e,t)}}),_=U.register({id:`stale-run-reconciler`,intervalMs:2e3,run:()=>{let e=!1,t=!1;for(let n of o?.list()??[]){if(n.status&&f.has(n.status))continue;t=!0;let{reconcile:r,sweep:i}=ue.reconcileAndSweep(n.runId);r.repaired&&(o?.track(n.runId),e=!0),i.recovered.length>0&&(e=!0)}return e||t}});t.on(`before_agent_start`,e=>{if(E(g().config))return{systemPrompt:T(e.systemPrompt)}}),ie(t,{baseCwd:void 0},H(K,q,J,W,U,Z)),S(t,{discovery:K,skills:q,policies:Q}),w(t,{scheduler:U,tracker:W,management:Z});let v=C(t,{scheduler:U,tracker:W});b(t),t.on(`session_start`,(s,c)=>{let f=d(c);f.recordEvent(`doom_team.session_started`,{"team.root_session":k(c.sessionManager.getSessionId())===c.sessionManager.getSessionId()});let g=c.sessionManager.getSessionId(),_=i(k(g));ee(_),re(_);let v=oe(_,{readStatus:e=>Z.status(e).status});v.suspended.length>0&&c.hasUI&&c.ui.notify(ne(v.suspended),`info`),f.recordEvent(`doom_team.runs_restored`,{"team.suspended_count":v.suspended.length,"team.pruned_count":v.pruned.length,"team.reaped_count":v.reaped,outcome:`reported`}),o=W.forSession(g),p!==_.scopeKey&&(p=_.scopeKey,X.start(e=>o?.get(e.runId)?Y.deliver(e):!1));for(let t of e)t();e=[];for(let e of n)e();n=[],Q.clear(),r?.dispose(),a?.dispose(),a=void 0,m.abandonAll(),h.abandonAll();let y=M({bus:t.events,source:x,sessionId:c.sessionManager.getSessionId()});r=j(y),a=h.bind({sessionId:g,cwd:c.cwd}),n.push(y.onNotification(F,({policy:e,generation:t})=>{Q.register(e,t)}),y.onNotification(N,({policy:e,generation:t})=>{Q.update(e,t)}),y.onNotification(I,({owner:e,generation:t})=>{Q.remove(e,t)})),y.notify(P,{}),e.push(...m.bind(y,()=>{let e=l(c.model);return{sessionId:c.sessionManager.getSessionId(),availableModels:te(c.modelRegistry),...e?{parentModel:e}:{},forkSource:u(c.sessionManager,`tool`)}}),y.onNotification(z,e=>{f.recordEvent(`doom_team.delegation_requested`,{"agent.name":e.agent,"task.id":e.taskId,mode:e.runMode??`foreground`})}),y.onNotification(ce,e=>{f.recordEvent(`doom_team.child_started`,{"run.id":e.runId,outcome:`started`})}),y.onNotification(B,e=>{f.recordEvent(`doom_team.delegation_updated`,{"run.id":e.runId,"team.tool_count":e.toolCount??0,"team.duration_ms":e.durationMs??0,"team.token_count":e.tokens??0,outcome:e.status??`updated`})}),y.onNotification(R,e=>{f.recordEvent(`doom_team.delegation_finished`,{"run.id":e.runId,"team.tool_count":e.toolCount??0,"team.duration_ms":e.durationMs??0,outcome:e.status})}),y.onNotification(L,()=>{f.recordEvent(`doom_team.delegation_cancelled`,{outcome:`cancelled`})})),$.bindMainSession(g)}),s.setRuntimeCleanup(()=>{_();for(let t of e)t();e=[];for(let e of n)e();n=[],Q.clear(),r?.dispose(),r=void 0,a?.dispose(),a=void 0,m.abandonAll(),h.abandonAll(),de?.(),v(),$.dispose(),X.stop(),p=void 0,Y.dispose(),U.stop(),W.stop(),$.dispose(),s.clearDefaultContainer()})}t.on(`session_shutdown`,async(e,t)=>{let n=o(),r=n?se({scope:n,reason:e.reason??V,readStatus:e=>Z.status(e).status}):Promise.resolve(void 0);s.takeRuntimeCleanup()?.();let i;try{i=await r,await c?.recordEvent(`doom_team.session_finished`,{reason:e.reason??V,"team.suspended_count":i?.suspended.length??0,"team.unstoppable_count":i?.unstoppable.length??0,outcome:i?.unstoppable.length?`degraded`:`suspended`})}catch(t){await c?.recordError(`doom_team.session_shutdown_failed`,t,{reason:e.reason??V})}finally{await c?.shutdown(),c=void 0}})}export{U as activateDoomTeamExtension};
2
- //# sourceMappingURL=extension.mjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"extension.mjs","names":[],"sources":["../src/extension.ts"],"sourcesContent":["/**\n * The parent extension's implementation: everything `extensions/pi.ts` wires\n * into a Pi host, kept out of that adapter so it is testable without a host.\n *\n * `extensions/pi.ts` is a three-line re-export of this, matching every sibling\n * doom extension (`doom-task`, `doom-workflow`, `doom-file-edit`,\n * `doom-runner`) and the `thin-pi-adapter` rule they all satisfy.\n *\n * RELOAD SAFETY, AND WHY `GlobalStateBridge` OWNS IT:\n * The activation function below can run more than once against the SAME\n * `pi: ExtensionAPI` (a host reload re-invoking a still-cached module\n * instance). Building a SECOND `createExtensionContainer()` on a repeat\n * activation would produce two independent singleton sets in one process -\n * the exact split-brain shape flagged earlier in this package's history for\n * a similarly-shaped \"container per call instead of per process\" bug. Since\n * this file cannot be `@injectable()` (it IS the composition root; nothing\n * constructs it), it cannot hold instance state the way `SubagentToolService`\n * holds its own `WeakSet<ExtensionAPI>` registration guard. `GlobalStateBridge`\n * exists for exactly this: its `getDefaultContainer()`/`setDefaultContainer()`\n * pair (`container/globalBridge.ts`) is the one sanctioned place this\n * package is allowed to remember something across what would otherwise be\n * independent module instantiations, keyed through `globalThis` rather than\n * a module-level `let`. A repeat activation reuses the existing container, so\n * every already-idempotent per-service registration (`SubagentToolService`'s\n * own `WeakSet` guard,\n * `NativeTeamChannelService.createRuntime`'s `WeakMap` memo, `PollScheduler.\n * start()`'s own idempotent doc) stays correct. Registrations with NO internal\n * guard (`registerSlashCommands`, `registerAgentListCommand`, and\n * `registerFleetCommand`) are gated to run only on the activation that actually\n * built the container because `pi.registerCommand` has no documented\n * duplicate-name behavior or `hasCommand`-style helper in this package.\n *\n * DISPOSAL ON `session_shutdown`:\n * `GlobalStateBridge.setRuntimeCleanup()`/`takeRuntimeCleanup()` is a POP,\n * not a peek - the second call (a second shutdown event, or a defensive\n * double-registration of the handler across two activations) finds nothing\n * and no-ops, so the shutdown handler needs no separate idempotency guard of\n * its own. `SessionShutdownEvent.reason` covers `quit`/`reload`/`new`/\n * `resume`/`fork`, but its own doc says the event fires whenever \"an\n * extension runtime is torn down\" regardless of reason, so cleanup runs\n * unconditionally rather than branching on `reason`.\n *\n * SCOPE, STATED EXPLICITLY:\n * This wires the lifecycle services, starts `AsyncJobTracker`, and binds the\n * root session as intercom member `main`. Child membership is registered by\n * the child prompt runtime. It also drives\n * `StaleRunReconciler` from the shared poll scheduler for every tracked\n * non-terminal run. `ControlChannelWatcher` is child-runtime-owned, while\n * `AutoDrainService` remains outside this parent composition root.\n *\n */\n\nimport type { ExtensionAPI, ExtensionContext } from '@earendil-works/pi-coding-agent';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport {\n provideBackgroundWorkRegistry,\n type BackgroundWorkRegistryHandle,\n} from '@agimon-ai/doompi-extension-contracts/background-work';\nimport { resolveRootSessionId } from '@agimon-ai/doompi-extension-contracts/child-process';\nimport { createProtocolRuntime } from '@agimon-ai/doompi-extension-contracts/protocol';\nimport {\n SubagentPolicyChanged,\n SubagentPolicyDiscovery,\n SubagentPolicyRegistration,\n SubagentPolicyUnregistration,\n} from '@agimon-ai/doompi-extension-contracts/subagent-policy';\nimport {\n DelegationCancelled,\n DelegationFinished,\n DelegationRequested,\n DelegationStarted,\n DelegationUpdated,\n} from '@agimon-ai/doompi-extension-contracts/delegation';\n\nimport { GlobalStateBridge } from './container/globalBridge.ts';\nimport { createExtensionContainer } from './container/index.ts';\nimport { DOOM_TEAM_TYPES } from './container/types.ts';\nimport type { IAgentDiscoveryService } from './agents/types.ts';\nimport type { ISkillDiscoveryService } from './agents/skills.ts';\nimport {\n type IAsyncJobTracker,\n type ITrackedAsyncJobs,\n TERMINAL_ASYNC_JOB_STATES,\n} from './runs/background/asyncJobTracker.ts';\nimport type { IAsyncSubagentSpawner } from './runs/background/asyncExecution.ts';\nimport type { ISubagentWaiter } from './runs/background/subagentWait.ts';\nimport type { ICompletionNotifier } from './runs/background/notify.ts';\nimport type { IPollScheduler } from './shared/pollScheduler.ts';\nimport type { IResultWatcher } from './runs/background/resultWatcher.ts';\nimport type { IStaleRunReconciler } from './runs/background/staleRunReconciler.ts';\nimport type { INativeTeamChannelService } from './intercom/nativeTeamChannel.ts';\nimport { registerSlashCommands, type SlashCommandDeps, type SlashCommandState } from './slash/slashCommands.ts';\nimport { registerCompletionRenderer } from './tui/completionNotice.ts';\nimport {\n registerAgentListCommand,\n registerAgentStatus,\n registerFleetCommand,\n registerSubagentLeaderContribution,\n SUBAGENT_LEADER_SOURCE,\n} from './tui/register.ts';\nimport { normalizeParentModel } from './runs/shared/modelFallback.ts';\nimport { authenticatedModelInfos } from './shared/modelResolution.ts';\nimport { createSessionScope, setCurrentSessionScope, tryCurrentSessionScope } from './shared/paths.ts';\nimport { writeScopeOwner } from './shared/scopeOwner.ts';\nimport { openScope, suspendScopeRuns } from './runs/registry/sessionLifecycle.ts';\nimport { formatSuspendedRuns } from './runs/registry/suspendedRuns.ts';\nimport { loadConfig } from './extensions/config.ts';\nimport { appendOrchestratorPrompt, shouldInjectOrchestratorPrompt } from './extensions/orchestratorPrompt.ts';\nimport type { IManagementActions } from './extensions/managementActions.ts';\nimport { SubagentCapabilityPolicyStore } from './protocol/capabilityCeiling.ts';\nimport { captureSessionForkSource, type ISpawnPlanner } from './extensions/spawnPlan.ts';\nimport type { ISubagentToolService } from './extensions/subagentTool.ts';\nimport { createDelegationBridge } from './extensions/delegationBridge.ts';\nimport { createFablePlanBridge } from './extensions/fablePlanBridge.ts';\n\n/** See the subscriber's own comment for why crash detection does not need the 250ms floor. */\nconst STALE_RUN_RECONCILE_INTERVAL_MS = 2_000;\nconst SESSION_SHUTDOWN_REASON_FALLBACK = 'unknown';\n\nfunction buildSlashCommandDeps(\n discovery: IAgentDiscoveryService,\n skills: ISkillDiscoveryService,\n planner: ISpawnPlanner,\n tracker: IAsyncJobTracker,\n scheduler: IPollScheduler,\n management: IManagementActions,\n): SlashCommandDeps {\n return {\n spawnPlanner: planner,\n tracker,\n scheduler,\n discovery,\n skills,\n management,\n loadConfig: () => loadConfig().config,\n };\n}\n\n/**\n * The extension factory pi's loader calls, exported as the module default\n * (see the override this file carries in `vibe-lint.config.yaml`). This is an\n * ESM `.ts` module, so it CANNOT use the `export =` form that\n * `subagentPromptRuntimeEntry.cts` is required to use - that file is `.cts`\n * and is resolved by raw path, this one is resolved as a package subpath and\n * matches the `export default` convention every sibling extension in this repo\n * already uses (`doom-task`, `doom-file-edit`, `doom-pi-ui`).\n */\nexport interface DoomTeamExtensionOptions {\n doomIntegrations?: boolean;\n}\n\nexport function activateDoomTeamExtension(pi: ExtensionAPI, options: DoomTeamExtensionOptions = {}): void {\n const doomIntegrations = options.doomIntegrations ?? true;\n const bridge = new GlobalStateBridge();\n let telemetry: DoomTelemetry | undefined;\n const getTelemetry = (ctx: ExtensionContext): DoomTelemetry => {\n telemetry ??= createDoomTelemetry({\n serviceName: 'doom-team',\n packageName: '@agimon-ai/doompi-team',\n cwd: ctx.cwd,\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n return telemetry;\n };\n const existingContainer = bridge.getDefaultContainer();\n const container = existingContainer ?? createExtensionContainer();\n const builtNewContainer = existingContainer === undefined;\n if (builtNewContainer) bridge.setDefaultContainer(container);\n\n const subagentTool = container.get<ISubagentToolService>(DOOM_TEAM_TYPES.SubagentToolService);\n const teamChannel = container.get<INativeTeamChannelService>(DOOM_TEAM_TYPES.NativeTeamChannelService);\n const pollScheduler = container.get<IPollScheduler>(DOOM_TEAM_TYPES.PollScheduler);\n const asyncJobTracker = container.get<IAsyncJobTracker>(DOOM_TEAM_TYPES.AsyncJobTracker);\n const subagentWaiter = container.get<ISubagentWaiter>(DOOM_TEAM_TYPES.SubagentWaiter);\n const asyncSubagentSpawner = container.get<IAsyncSubagentSpawner>(DOOM_TEAM_TYPES.AsyncSubagentSpawner);\n const discovery = container.get<IAgentDiscoveryService>(DOOM_TEAM_TYPES.AgentDiscoveryService);\n const skills = container.get<ISkillDiscoveryService>(DOOM_TEAM_TYPES.SkillDiscoveryService);\n const spawnPlanner = container.get<ISpawnPlanner>(DOOM_TEAM_TYPES.SpawnPlanner);\n const completionNotifier = container.get<ICompletionNotifier>(DOOM_TEAM_TYPES.CompletionNotifier);\n const resultWatcher = container.get<IResultWatcher>(DOOM_TEAM_TYPES.ResultWatcher);\n const staleRunReconciler = container.get<IStaleRunReconciler>(DOOM_TEAM_TYPES.StaleRunReconciler);\n const management = container.get<IManagementActions>(DOOM_TEAM_TYPES.ManagementActions);\n const capabilityPolicies = container.get<SubagentCapabilityPolicyStore>(\n DOOM_TEAM_TYPES.SubagentCapabilityPolicyStore,\n );\n\n // Each of these is idempotent on its own (own WeakSet/WeakMap guard, or\n // internally gated to no-op) - safe to redo on every activation, not just\n // the one that built the container.\n subagentTool.registerTool(pi);\n const disposeLeader = builtNewContainer && doomIntegrations ? registerSubagentLeaderContribution(pi) : undefined;\n const teamRuntime = teamChannel.createRuntime(pi);\n teamChannel.registerClient(pi);\n // Attach before `ResultWatcher.start()`, which `session_start` drives: a\n // result file left behind by a previous session is claimed on the watcher's\n // very first tick, and a notifier with no host yet would report\n // non-delivery for it and make the watcher retry a completion it could have\n // rendered immediately.\n completionNotifier.attachHost(pi);\n pollScheduler.start();\n asyncJobTracker.start();\n\n // No internal guard exists for these - see the module header. Gated to the\n // activation that actually built the container so a repeat activation does\n // not attempt to register the same command name twice.\n if (builtNewContainer) {\n let disposeDelegationProviders: Array<() => void> = [];\n let disposePolicyProviders: Array<() => void> = [];\n let backgroundWorkRegistry: BackgroundWorkRegistryHandle | undefined;\n let fableBrokerRegistration: { dispose(): void } | undefined;\n let currentSessionJobs: ITrackedAsyncJobs | undefined;\n // The scope `ResultWatcher` is currently watching. See its start site in\n // the `session_start` handler for why the watcher is latched on this\n // rather than started once.\n let watchedScopeKey: string | undefined;\n const delegationBridge = createDelegationBridge({\n planner: spawnPlanner,\n management,\n waiter: subagentWaiter,\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n loadConfig: () => loadConfig().config,\n });\n const fablePlanBridge = createFablePlanBridge({\n spawner: asyncSubagentSpawner,\n waiter: subagentWaiter,\n management,\n policies: capabilityPolicies,\n report: (event, attributes) => {\n void telemetry?.recordEvent(event, attributes);\n },\n });\n\n const unregisterStaleRunReconciler = pollScheduler.register({\n id: 'stale-run-reconciler',\n // Crash detection, not status freshness - `AsyncJobTracker` owns that and\n // polls on its own 250ms. This subscriber only ever acts on a run whose\n // process is provably dead, so noticing that 2s later is invisible, while\n // running it 4x/second per active run was not: each pass is a status read,\n // a run-id resolve and a pid probe that a healthy child always discards.\n intervalMs: STALE_RUN_RECONCILE_INTERVAL_MS,\n run: () => {\n let repaired = false;\n let hasActiveRun = false;\n for (const job of currentSessionJobs?.list() ?? []) {\n if (job.status && TERMINAL_ASYNC_JOB_STATES.has(job.status)) continue;\n hasActiveRun = true;\n // One pass, one `inspect()`. Calling `reconcile` and\n // `sweepOrphanedClaims` separately probed the same pid twice for the\n // same answer - see `IStaleRunReconciler.reconcileAndSweep`.\n const { reconcile: outcome, sweep } = staleRunReconciler.reconcileAndSweep(job.runId);\n if (outcome.repaired) {\n currentSessionJobs?.track(job.runId);\n repaired = true;\n }\n if (sweep.recovered.length > 0) repaired = true;\n }\n // An active runner is useful work for scheduling purposes: keeping\n // the shared scheduler at its floor prevents crash detection from\n // inheriting the idle five-second backoff ceiling.\n return repaired || hasActiveRun;\n },\n });\n // The orchestration addendum. Registered here rather than inside the\n // `subagent` tool's description because it is behavioural guidance, and it\n // has to land before the model decides whether to reach for the tool at\n // all - see `orchestratorPrompt.ts`. Read config per turn so toggling it\n // does not need a session restart; `loadConfig` is memoized on the file's\n // own mtime, so this is a stat, not a read.\n pi.on('before_agent_start', (event: { systemPrompt?: string }) => {\n if (!shouldInjectOrchestratorPrompt(loadConfig().config)) return undefined;\n return { systemPrompt: appendOrchestratorPrompt(event.systemPrompt) };\n });\n\n const state: SlashCommandState = { baseCwd: undefined };\n registerSlashCommands(\n pi,\n state,\n buildSlashCommandDeps(discovery, skills, spawnPlanner, asyncJobTracker, pollScheduler, management),\n );\n registerAgentListCommand(pi, { discovery, skills, policies: capabilityPolicies });\n registerFleetCommand(pi, {\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n management,\n });\n const disposeAgentStatus = registerAgentStatus(pi, {\n scheduler: pollScheduler,\n tracker: asyncJobTracker,\n });\n registerCompletionRenderer(pi);\n\n // Bind the root session directly into the one intercom transport. Child\n // processes bind from the team environment written during spawn.\n pi.on('session_start', (_event, ctx: ExtensionContext) => {\n const activeTelemetry = getTelemetry(ctx);\n void activeTelemetry.recordEvent('doom_team.session_started', {\n 'team.root_session':\n resolveRootSessionId(ctx.sessionManager.getSessionId()) === ctx.sessionManager.getSessionId(),\n });\n // Before anything else: every scoped path helper reads this. A child\n // keeps the root inherited from its spawn environment, while a top-level\n // session falls back to its own Pi session id.\n const sessionId = ctx.sessionManager.getSessionId();\n const scope = createSessionScope(resolveRootSessionId(sessionId));\n setCurrentSessionScope(scope);\n // Claim the scope for this process, so a later sweep can tell an\n // abandoned tree from a live one. Rewritten on every session_start\n // because /resume legitimately re-adopts a scope under a new process.\n writeScopeOwner(scope);\n // Prune records whose process is gone, reap sibling scopes holding\n // nothing alive, and REPORT what is suspended. Nothing is restarted\n // here: reopening a session must not silently spawn agents and start\n // spending tokens on work that may be days stale.\n const opened = openScope(scope, {\n readStatus: (runId) => management.status(runId).status,\n });\n if (opened.suspended.length > 0 && ctx.hasUI) {\n ctx.ui.notify(formatSuspendedRuns(opened.suspended), 'info');\n }\n void activeTelemetry.recordEvent('doom_team.runs_restored', {\n 'team.suspended_count': opened.suspended.length,\n 'team.pruned_count': opened.pruned.length,\n 'team.reaped_count': opened.reaped,\n outcome: 'reported',\n });\n currentSessionJobs = asyncJobTracker.forSession(sessionId);\n // Started HERE, not at activation: `start()` reads `currentRunsDir()`\n // for lingering claims and puts an `fs.watch` on `currentResultsDir()`,\n // so it needs the scope that only exists from this point on. Starting it\n // at activation threw outright, and would have pinned the watch to the\n // previous scope's directory after /new, /resume and /fork.\n //\n // Latched on the scope key because `start()`'s own contract says a\n // repeat call RESETS what it tracks: a reload that re-fires\n // `session_start` for the SAME session must not drop in-flight claims,\n // while a genuinely new scope has none to drop and needs the new watch.\n // `CompletionNotifier.deliver` matches `ResultConsumer` exactly, which\n // is what makes a completed run render in the parent's chat rather than\n // only land as a file nobody reads.\n if (watchedScopeKey !== scope.scopeKey) {\n watchedScopeKey = scope.scopeKey;\n resultWatcher.start((result) =>\n currentSessionJobs?.get(result.runId) ? completionNotifier.deliver(result) : false,\n );\n }\n for (const dispose of disposeDelegationProviders) dispose();\n disposeDelegationProviders = [];\n for (const dispose of disposePolicyProviders) dispose();\n disposePolicyProviders = [];\n capabilityPolicies.clear();\n backgroundWorkRegistry?.dispose();\n fableBrokerRegistration?.dispose();\n fableBrokerRegistration = undefined;\n delegationBridge.abandonAll();\n fablePlanBridge.abandonAll();\n const protocol = createProtocolRuntime({\n bus: pi.events,\n source: SUBAGENT_LEADER_SOURCE,\n sessionId: ctx.sessionManager.getSessionId(),\n });\n backgroundWorkRegistry = provideBackgroundWorkRegistry(protocol);\n fableBrokerRegistration = fablePlanBridge.bind({ sessionId, cwd: ctx.cwd });\n const registerPolicy = ({\n policy,\n generation,\n }: {\n policy: Parameters<typeof capabilityPolicies.update>[0];\n generation: string;\n }): void => {\n capabilityPolicies.register(policy, generation);\n };\n const updatePolicy: typeof registerPolicy = ({ policy, generation }): void => {\n capabilityPolicies.update(policy, generation);\n };\n disposePolicyProviders.push(\n protocol.onNotification(SubagentPolicyRegistration, registerPolicy),\n protocol.onNotification(SubagentPolicyChanged, updatePolicy),\n protocol.onNotification(SubagentPolicyUnregistration, ({ owner, generation }) => {\n capabilityPolicies.remove(owner, generation);\n }),\n );\n protocol.notify(SubagentPolicyDiscovery, {});\n disposeDelegationProviders.push(\n ...delegationBridge.bind(protocol, () => {\n const parentModel = normalizeParentModel(ctx.model);\n return {\n sessionId: ctx.sessionManager.getSessionId(),\n availableModels: authenticatedModelInfos(ctx.modelRegistry),\n ...(parentModel ? { parentModel } : {}),\n forkSource: captureSessionForkSource(ctx.sessionManager, 'tool'),\n };\n }),\n protocol.onNotification(DelegationRequested, (request) => {\n void activeTelemetry.recordEvent('doom_team.delegation_requested', {\n 'agent.name': request.agent,\n 'task.id': request.taskId,\n mode: request.runMode ?? 'foreground',\n });\n }),\n protocol.onNotification(DelegationStarted, (event) => {\n void activeTelemetry.recordEvent('doom_team.child_started', { 'run.id': event.runId, outcome: 'started' });\n }),\n protocol.onNotification(DelegationUpdated, (event) => {\n void activeTelemetry.recordEvent('doom_team.delegation_updated', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n 'team.token_count': event.tokens ?? 0,\n outcome: event.status ?? 'updated',\n });\n }),\n protocol.onNotification(DelegationFinished, (event) => {\n void activeTelemetry.recordEvent('doom_team.delegation_finished', {\n 'run.id': event.runId,\n 'team.tool_count': event.toolCount ?? 0,\n 'team.duration_ms': event.durationMs ?? 0,\n outcome: event.status,\n });\n }),\n protocol.onNotification(DelegationCancelled, () => {\n void activeTelemetry.recordEvent('doom_team.delegation_cancelled', { outcome: 'cancelled' });\n }),\n );\n teamRuntime.bindMainSession(sessionId);\n });\n\n bridge.setRuntimeCleanup(() => {\n unregisterStaleRunReconciler();\n for (const dispose of disposeDelegationProviders) dispose();\n disposeDelegationProviders = [];\n for (const dispose of disposePolicyProviders) dispose();\n disposePolicyProviders = [];\n capabilityPolicies.clear();\n backgroundWorkRegistry?.dispose();\n backgroundWorkRegistry = undefined;\n fableBrokerRegistration?.dispose();\n fableBrokerRegistration = undefined;\n delegationBridge.abandonAll();\n fablePlanBridge.abandonAll();\n disposeLeader?.();\n disposeAgentStatus();\n teamRuntime.dispose();\n resultWatcher.stop();\n watchedScopeKey = undefined;\n completionNotifier.dispose();\n pollScheduler.stop();\n asyncJobTracker.stop();\n teamRuntime.dispose();\n bridge.clearDefaultContainer();\n });\n }\n\n /**\n * Every reason suspends, with no exception for `reload`.\n *\n * Pi emits this for `quit`, `reload`, `new`, `resume` and `fork`. Treating\n * `reload` differently - keeping children alive because `/domains`, `/major-mode`\n * and `/profile` only reload the extension - would be the one case someone\n * has to remember, and the one that silently misbehaves if Pi adds a sixth\n * reason. Suspending uniformly costs a respawn on reload; restore continues\n * the child's own transcript rather than restarting its task.\n */\n pi.on('session_shutdown', async (event: { reason?: string }, _ctx: ExtensionContext) => {\n const scope = tryCurrentSessionScope();\n const suspensionPromise = scope\n ? suspendScopeRuns({\n scope,\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n readStatus: (runId) => management.status(runId).status,\n })\n : Promise.resolve(undefined);\n bridge.takeRuntimeCleanup()?.();\n let suspension: Awaited<ReturnType<typeof suspendScopeRuns>> | undefined;\n try {\n suspension = await suspensionPromise;\n await telemetry?.recordEvent('doom_team.session_finished', {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n 'team.suspended_count': suspension?.suspended.length ?? 0,\n 'team.unstoppable_count': suspension?.unstoppable.length ?? 0,\n outcome: suspension?.unstoppable.length ? 'degraded' : 'suspended',\n });\n } catch (error) {\n await telemetry?.recordError('doom_team.session_shutdown_failed', error, {\n reason: event.reason ?? SESSION_SHUTDOWN_REASON_FALLBACK,\n });\n } finally {\n await telemetry?.shutdown();\n telemetry = undefined;\n }\n });\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"intercomBridge.cjs","names":[],"sources":["../../src/intercom/intercomBridge.ts"],"sourcesContent":["/**\n * Whether a child would be wired to talk back to the session that spawned it,\n * reported for diagnostics.\n *\n * WHY THIS IS ONLY A DIAGNOSTIC NOW:\n * Children receive the native intercom runtime directly. This module retains\n * only the human-facing doctor diagnostic and does not register or alias tools.\n *\n * AVOID:\n * - Re-adding a resolution path here without a caller. If the bridge needs to\n * shape an agent again, wire it in the same change\n */\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = 'native:doom-team-intercom';\n\nexport type IntercomBridgeMode = 'off' | 'always' | 'fork-only';\n\n/** The intercom-bridge slice of this package's extension config. Narrow on purpose. */\nexport interface IntercomBridgeConfigInput {\n mode?: unknown;\n instructionFile?: unknown;\n resultDelivery?: unknown;\n}\n\ninterface ResolvedIntercomBridgeConfig {\n mode: IntercomBridgeMode;\n resultDelivery: boolean;\n}\n\nexport interface IntercomBridgeDiagnostic {\n active: boolean;\n mode: IntercomBridgeMode;\n wantsIntercom: boolean;\n intercomAvailable: boolean;\n extensionDir: string;\n orchestratorTarget?: string;\n reason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n config: IntercomBridgeConfigInput | undefined;\n context: 'fresh' | 'fork' | undefined;\n orchestratorTarget?: string;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n if (value === 'off' || value === 'always' || value === 'fork-only') return value;\n return 'always';\n}\n\nfunction resolveIntercomBridgeConfig(value: IntercomBridgeConfigInput | undefined): ResolvedIntercomBridgeConfig {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { mode: 'always', resultDelivery: true };\n }\n return { mode: resolveIntercomBridgeMode(value.mode), resultDelivery: value.resultDelivery !== false };\n}\n\n/** Why the bridge is not active, or `undefined` when it is. */\nfunction inactiveReason(\n mode: IntercomBridgeMode,\n context: 'fresh' | 'fork' | undefined,\n orchestratorTarget: string | undefined,\n): string | undefined {\n if (mode === 'off') return 'bridge mode is off';\n if (mode === 'fork-only' && context !== 'fork') return 'bridge mode is fork-only and context is not fork';\n if (!orchestratorTarget) return 'orchestrator target is not available';\n return undefined;\n}\n\n/**\n * Report the bridge's state without changing anything.\n *\n * `wantsIntercom` and `active` differ deliberately: the first says the\n * configuration asks for a bridge, the second says one is actually available.\n * A doctor report needs to distinguish \"you turned it off\" from \"it is on but\n * has no orchestrator to reach\".\n */\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n const { mode } = resolveIntercomBridgeConfig(input.config);\n const orchestratorTarget = input.orchestratorTarget?.trim();\n const wantsIntercom = mode !== 'off' && !(mode === 'fork-only' && input.context !== 'fork');\n const reason = inactiveReason(mode, input.context, orchestratorTarget);\n return {\n active: reason === undefined,\n mode,\n wantsIntercom,\n intercomAvailable: true,\n extensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n ...(orchestratorTarget ? { orchestratorTarget } : {}),\n ...(reason ? { reason } : {}),\n };\n}\n"],"mappings":"AA6CA,SAAgB,EAA0B,EAAoC,CAE5E,OADI,IAAU,OAAS,IAAU,UAAY,IAAU,YAAoB,EACpE,SAGT,SAAS,EAA4B,EAA4E,CAI/G,MAHI,CAAC,GAAS,OAAO,GAAU,UAAY,MAAM,QAAQ,EAAM,CACtD,CAAE,KAAM,SAAU,eAAgB,GAAM,CAE1C,CAAE,KAAM,EAA0B,EAAM,KAAK,CAAE,eAAgB,EAAM,iBAAmB,GAAO,CAIxG,SAAS,EACP,EACA,EACA,EACoB,CACpB,GAAI,IAAS,MAAO,MAAO,qBAC3B,GAAI,IAAS,aAAe,IAAY,OAAQ,MAAO,mDACvD,GAAI,CAAC,EAAoB,MAAO,uCAYlC,SAAgB,EAAuB,EAA6D,CAClG,GAAM,CAAE,QAAS,EAA4B,EAAM,OAAO,CACpD,EAAqB,EAAM,oBAAoB,MAAM,CACrD,EAAgB,IAAS,OAAS,EAAE,IAAS,aAAe,EAAM,UAAY,QAC9E,EAAS,EAAe,EAAM,EAAM,QAAS,EAAmB,CACtE,MAAO,CACL,OAAQ,IAAW,IAAA,GACnB,OACA,gBACA,kBAAmB,GACnB,aAAc,4BACd,GAAI,EAAqB,CAAE,qBAAoB,CAAG,EAAE,CACpD,GAAI,EAAS,CAAE,SAAQ,CAAG,EAAE,CAC7B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"intercomBridge.mjs","names":[],"sources":["../../src/intercom/intercomBridge.ts"],"sourcesContent":["/**\n * Whether a child would be wired to talk back to the session that spawned it,\n * reported for diagnostics.\n *\n * WHY THIS IS ONLY A DIAGNOSTIC NOW:\n * Children receive the native intercom runtime directly. This module retains\n * only the human-facing doctor diagnostic and does not register or alias tools.\n *\n * AVOID:\n * - Re-adding a resolution path here without a caller. If the bridge needs to\n * shape an agent again, wire it in the same change\n */\n\nexport const NATIVE_INTERCOM_EXTENSION_DIR = 'native:doom-team-intercom';\n\nexport type IntercomBridgeMode = 'off' | 'always' | 'fork-only';\n\n/** The intercom-bridge slice of this package's extension config. Narrow on purpose. */\nexport interface IntercomBridgeConfigInput {\n mode?: unknown;\n instructionFile?: unknown;\n resultDelivery?: unknown;\n}\n\ninterface ResolvedIntercomBridgeConfig {\n mode: IntercomBridgeMode;\n resultDelivery: boolean;\n}\n\nexport interface IntercomBridgeDiagnostic {\n active: boolean;\n mode: IntercomBridgeMode;\n wantsIntercom: boolean;\n intercomAvailable: boolean;\n extensionDir: string;\n orchestratorTarget?: string;\n reason?: string;\n}\n\ninterface ResolveIntercomBridgeInput {\n config: IntercomBridgeConfigInput | undefined;\n context: 'fresh' | 'fork' | undefined;\n orchestratorTarget?: string;\n}\n\nexport function resolveIntercomBridgeMode(value: unknown): IntercomBridgeMode {\n if (value === 'off' || value === 'always' || value === 'fork-only') return value;\n return 'always';\n}\n\nfunction resolveIntercomBridgeConfig(value: IntercomBridgeConfigInput | undefined): ResolvedIntercomBridgeConfig {\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { mode: 'always', resultDelivery: true };\n }\n return { mode: resolveIntercomBridgeMode(value.mode), resultDelivery: value.resultDelivery !== false };\n}\n\n/** Why the bridge is not active, or `undefined` when it is. */\nfunction inactiveReason(\n mode: IntercomBridgeMode,\n context: 'fresh' | 'fork' | undefined,\n orchestratorTarget: string | undefined,\n): string | undefined {\n if (mode === 'off') return 'bridge mode is off';\n if (mode === 'fork-only' && context !== 'fork') return 'bridge mode is fork-only and context is not fork';\n if (!orchestratorTarget) return 'orchestrator target is not available';\n return undefined;\n}\n\n/**\n * Report the bridge's state without changing anything.\n *\n * `wantsIntercom` and `active` differ deliberately: the first says the\n * configuration asks for a bridge, the second says one is actually available.\n * A doctor report needs to distinguish \"you turned it off\" from \"it is on but\n * has no orchestrator to reach\".\n */\nexport function diagnoseIntercomBridge(input: ResolveIntercomBridgeInput): IntercomBridgeDiagnostic {\n const { mode } = resolveIntercomBridgeConfig(input.config);\n const orchestratorTarget = input.orchestratorTarget?.trim();\n const wantsIntercom = mode !== 'off' && !(mode === 'fork-only' && input.context !== 'fork');\n const reason = inactiveReason(mode, input.context, orchestratorTarget);\n return {\n active: reason === undefined,\n mode,\n wantsIntercom,\n intercomAvailable: true,\n extensionDir: NATIVE_INTERCOM_EXTENSION_DIR,\n ...(orchestratorTarget ? { orchestratorTarget } : {}),\n ...(reason ? { reason } : {}),\n };\n}\n"],"mappings":"AA6CA,SAAgB,EAA0B,EAAoC,CAE5E,OADI,IAAU,OAAS,IAAU,UAAY,IAAU,YAAoB,EACpE,SAGT,SAAS,EAA4B,EAA4E,CAI/G,MAHI,CAAC,GAAS,OAAO,GAAU,UAAY,MAAM,QAAQ,EAAM,CACtD,CAAE,KAAM,SAAU,eAAgB,GAAM,CAE1C,CAAE,KAAM,EAA0B,EAAM,KAAK,CAAE,eAAgB,EAAM,iBAAmB,GAAO,CAIxG,SAAS,EACP,EACA,EACA,EACoB,CACpB,GAAI,IAAS,MAAO,MAAO,qBAC3B,GAAI,IAAS,aAAe,IAAY,OAAQ,MAAO,mDACvD,GAAI,CAAC,EAAoB,MAAO,uCAYlC,SAAgB,EAAuB,EAA6D,CAClG,GAAM,CAAE,QAAS,EAA4B,EAAM,OAAO,CACpD,EAAqB,EAAM,oBAAoB,MAAM,CACrD,EAAgB,IAAS,OAAS,EAAE,IAAS,aAAe,EAAM,UAAY,QAC9E,EAAS,EAAe,EAAM,EAAM,QAAS,EAAmB,CACtE,MAAO,CACL,OAAQ,IAAW,IAAA,GACnB,OACA,gBACA,kBAAmB,GACnB,aAAc,4BACd,GAAI,EAAqB,CAAE,qBAAoB,CAAG,EAAE,CACpD,GAAI,EAAS,CAAE,SAAQ,CAAG,EAAE,CAC7B"}
@@ -1,5 +0,0 @@
1
- const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../shared/lruCache.cjs`),n=require(`../shared/atomicJson.cjs`),r=require(`../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.cjs`),i=require(`../env.cjs`),a=require(`../shared/paths.cjs`),o=require(`../shared/errors.cjs`),s=require(`../shared/versioned.cjs`),c=require(`../shared/boundedKeySet.cjs`);let l=require(`node:fs`);l=e.__toESM(l,1);let u=require(`node:path`);u=e.__toESM(u,1);let d=require(`inversify`),f=require(`node:crypto`);const p=`intercom`,m=`subagent.team.message`,h=`subagent.team.reply`,g=`members`,_=`heartbeats`,ee=`inboxes`,v=`replies`,te=`receipts`,ne=`team.json`,y=`.json`,b=`main`,x=`agent`,S=64*1024,C=4*1024,re=[`members`,`send`,`ask`,`reply`,`pending`],ie=/^[A-Za-z0-9._-]{1,256}$/,ae=/[^a-z0-9._-]+/g,w=/^[-.]+|[-.]+$/g,oe=`sha256`,T=`delivered`,se=`failed`,ce={oneOf:[...[`members`,`pending`].map(e=>({type:`object`,properties:{action:{const:e}},required:[`action`],additionalProperties:!1})),{type:`object`,properties:{action:{const:`send`},to:{type:`string`},message:{type:`string`}},required:[`action`,`to`,`message`],additionalProperties:!1},{type:`object`,properties:{action:{const:`ask`},to:{type:`string`},message:{type:`string`},timeoutMs:{type:`integer`,minimum:1}},required:[`action`,`to`,`message`],additionalProperties:!1},{type:`object`,properties:{action:{const:`reply`},requestId:{type:`string`},message:{type:`string`}},required:[`action`,`requestId`,`message`],additionalProperties:!1}]};function E(e){return typeof e==`string`&&ie.test(e)}function D(e){return typeof e==`number`&&Number.isInteger(e)}function O(e){return typeof e==`number`&&Number.isFinite(e)}function k(e){return typeof e==`string`&&e.trim().length>0}function A(e){return e===void 0||typeof e==`string`}function le(e){return e===void 0||D(e)}function ue(e){return e===`main`||e===`subagent`}function de(e){return e===`send`||e===`ask`}function j(e,t){return Buffer.byteLength(e,`utf-8`)<=t}function fe(e){return e instanceof Error?e.message:String(e)}function M(e){return process.env[e]?.trim()||void 0}function N(e){return(0,f.createHash)(oe).update(e).digest(`hex`)}function pe(){return(0,f.randomBytes)(32).toString(`base64url`)}function me(e){return`session-${N(e).slice(0,32)}`}function P(e){return e.trim().toLowerCase().replace(ae,`-`).replace(w,``).slice(0,48).replace(w,``)||x}function he(e,t){let n=`-${t+1}`,r=48-n.length;return`${e.slice(0,Math.max(r,0)).replace(w,``)||x}${n}`}function ge(e,t){if(e!==b)return e;if(t)throw Error(`Native team member name '${b}' is reserved for the root session.`);return`main-agent`}function F(e){if(!E(e))throw Error(`Invalid native team id.`);return u.join(a.scopeTeamDir(a.requireCurrentSessionScope()),e)}function I(e,t){if(!E(t))throw Error(`Invalid native team member id.`);return u.join(F(e.teamId),g,`${t}${y}`)}function L(e,t){if(!E(t))throw Error(`Invalid native team member id.`);return u.join(F(e.teamId),_,`${t}${y}`)}function R(e,t){if(!E(t))throw Error(`Invalid native team member id.`);return u.join(F(e.teamId),ee,t)}function z(e){return`${e}${y}`}function B(e,t,n){if(!E(n))throw Error(`Invalid native team message id.`);return u.join(R(e,t),z(n))}function _e(e,t){if(!E(t))throw Error(`Invalid native team request id.`);return u.join(F(e.teamId),v,`${t}${y}`)}function V(e,t,n){if(!E(t)||!E(n))throw Error(`Invalid intercom receipt identity.`);return u.join(F(e.teamId),te,t,`${n}${y}`)}function ve(e,t){return(0,f.createHash)(oe).update(`${e}:${t}`).digest(`hex`)}function ye(e){let t=F(e.teamId);for(let e of[g,_,ee,v,te])l.mkdirSync(u.join(t,e),{recursive:!0,mode:448})}function H(e){try{let t=JSON.parse(l.readFileSync(e,`utf-8`));return t&&typeof t==`object`&&!Array.isArray(t)?t:void 0}catch{return}}function U(e){try{return l.rmSync(e,{force:!0}),!0}catch(e){return e.code===`ENOENT`}}function be(e){try{l.rmSync(e,{recursive:!0,force:!0})}catch{}}function W(e){if(!(!s.parseVersioned(e,[1]).ok||!e)&&!(!E(e.teamId)||!k(e.rootSessionId)||e.mainMemberId!==b||!O(e.createdAt)||!O(e.updatedAt)))return{version:1,teamId:e.teamId,rootSessionId:e.rootSessionId,mainMemberId:b,createdAt:e.createdAt,updatedAt:e.updatedAt}}function xe(e){if(!e||typeof e!=`object`||Array.isArray(e))return;let t=e;if(!(!k(t.id)||!k(t.subject))&&!(!j(t.id,256)||!j(t.subject,C)))return{id:t.id,subject:t.subject}}function Se(e){if(!s.parseVersioned(e,[1]).ok||!e||!E(e.teamId)||!k(e.rootSessionId)||!k(e.mainMemberId)||!E(e.memberId)||!ue(e.role)||!k(e.tokenHash)||!D(e.pid)||typeof e.active!=`boolean`||!O(e.joinedAt)||!A(e.agent)||!A(e.runId)||!le(e.childIndex)||!A(e.parentMemberId))return;let t=e.task===void 0?void 0:xe(e.task);if(!(e.task!==void 0&&!t))return{version:1,teamId:e.teamId,rootSessionId:e.rootSessionId,mainMemberId:e.mainMemberId,memberId:e.memberId,role:e.role,tokenHash:e.tokenHash,pid:e.pid,active:e.active,joinedAt:e.joinedAt,...O(e.leftAt)?{leftAt:e.leftAt}:{},...e.agent===void 0?{}:{agent:e.agent},...e.runId===void 0?{}:{runId:e.runId},...e.childIndex===void 0?{}:{childIndex:e.childIndex},...e.parentMemberId===void 0?{}:{parentMemberId:e.parentMemberId},...t?{task:t}:{}}}function Ce(e){if(!(!s.parseVersioned(e,[1]).ok||!e)&&!(!E(e.memberId)||!k(e.tokenHash)||!D(e.pid)||!O(e.heartbeatAt)))return{version:1,memberId:e.memberId,tokenHash:e.tokenHash,pid:e.pid,heartbeatAt:e.heartbeatAt}}function we(e){if(!(!s.parseVersioned(e,[2]).ok||!e)&&!(e.type!==m||!E(e.id)||!E(e.teamId)||!de(e.kind)||!E(e.fromMemberId)||!E(e.toMemberId)||!k(e.senderTokenHash)||!D(e.seq)||typeof e.message!=`string`||!j(e.message,S)||!O(e.createdAt)||!O(e.expiresAt)))return{type:m,version:2,id:e.id,teamId:e.teamId,kind:e.kind,fromMemberId:e.fromMemberId,toMemberId:e.toMemberId,senderTokenHash:e.senderTokenHash,seq:e.seq,message:e.message,createdAt:e.createdAt,expiresAt:e.expiresAt}}function Te(e){if(!(!s.parseVersioned(e,[2]).ok||!e)&&!(e.type!==h||!E(e.requestId)||!E(e.teamId)||!E(e.fromMemberId)||!E(e.toMemberId)||!k(e.senderTokenHash)||typeof e.message!=`string`||!j(e.message,S)||!O(e.createdAt)))return{type:h,version:2,requestId:e.requestId,teamId:e.teamId,fromMemberId:e.fromMemberId,toMemberId:e.toMemberId,senderTokenHash:e.senderTokenHash,message:e.message,createdAt:e.createdAt}}function Ee(e){if(!e||typeof e!=`object`||Array.isArray(e))throw o.invalidRequest(`Intercom params must be an object.`,`Use one documented intercom action shape.`);let t=e,n=re.find(e=>e===t.action);if(!n)throw new o.DoomTeamExpectedError(`unsupported_operation`,`Unsupported intercom action: ${String(t.action)}.`,!1,`Use members, send, ask, pending, or reply.`);if(!A(t.to)||!A(t.message)||!A(t.requestId))throw o.invalidRequest(`Intercom to, message and requestId values must be strings.`,`Correct the action fields and retry.`);if(t.timeoutMs!==void 0&&(!D(t.timeoutMs)||t.timeoutMs<1))throw o.invalidRequest(`Intercom timeoutMs must be a positive integer.`,`Correct timeoutMs and retry.`);let r=new Set(n===`members`||n===`pending`?[`action`]:n===`reply`?[`action`,`requestId`,`message`]:n===`ask`?[`action`,`to`,`message`,`timeoutMs`]:[`action`,`to`,`message`]),i=Object.keys(t).filter(e=>!r.has(e));if(i.length)throw o.invalidRequest(`Intercom action '${n}' does not accept: ${i.join(`, `)}.`,`Remove unknown fields and retry.`);return{action:n,...t.to===void 0?{}:{to:t.to},...t.message===void 0?{}:{message:t.message},...t.requestId===void 0?{}:{requestId:t.requestId},...t.timeoutMs===void 0?{}:{timeoutMs:t.timeoutMs}}}function G(e,t){return Se(H(I(e,t)))}function De(e,t){let n=Ce(H(L(e,t.memberId)));if(!(!n||n.memberId!==t.memberId||n.tokenHash!==t.tokenHash))return n}function Oe(e){if(e===process.pid)return!0;try{return process.kill(e,0),!0}catch(e){return e.code===`EPERM`}}function ke(e,t){return De(e,t)?.heartbeatAt??t.leftAt??t.joinedAt}function K(e,t,n){return t.active&&Oe(t.pid)&&n-ke(e,t)<=3e4}function Ae(e){l.mkdirSync(R(e,e.memberId),{recursive:!0,mode:448}),n.writePrivateAtomicJson(I(e,e.memberId),e)}function q(e,t,r){let i={version:1,memberId:t.memberId,tokenHash:t.tokenHash,pid:t.pid,heartbeatAt:r};n.writePrivateAtomicJson(L(e,t.memberId),i)}function je(e){let t=u.join(F(e.teamId),g),n;try{n=l.readdirSync(t,{withFileTypes:!0})}catch{return[]}return n.filter(e=>e.isFile()&&e.name.endsWith(y)).map(e=>Se(H(u.join(t,e.name)))).filter(e=>!!e).filter(t=>t.teamId===e.teamId&&t.rootSessionId===e.rootSessionId)}function J(e,t){return je(e).filter(n=>K(e,n,t)).sort((e,t)=>e.joinedAt-t.joinedAt||e.memberId.localeCompare(t.memberId))}function Me(e=Date.now()){let t=X();if(t)return{members:J(t,e).map(Je)}}function Ne(e,t,n){let r=0;for(let i of je(e))i.memberId!==t&&(K(e,i,n)||n-ke(e,i)<=33e4||(be(R(e,i.memberId)),U(L(e,i.memberId)),U(I(e,i.memberId)),r+=1));return r}function Pe(e){let t=e.trim();if(!t)throw Error(`A root session id is required for native team communication.`);let r={version:1,teamId:me(t),rootSessionId:t,mainMemberId:b};ye(r);let i=u.join(F(r.teamId),ne),a=W(H(i));if(a&&a.rootSessionId!==t)throw Error(`Native team identity collision detected.`);let o=Date.now();return n.writePrivateAtomicJson(i,{...r,createdAt:a?.createdAt??o,updatedAt:o}),r}function Y(e){return{[i.SUBAGENT_TEAM_ID_ENV]:e.teamId,[i.SUBAGENT_TEAM_ROOT_SESSION_ENV]:e.rootSessionId,[i.SUBAGENT_TEAM_MAIN_MEMBER_ENV]:e.mainMemberId}}function Fe(e){return{...Y(e),[i.SUBAGENT_TEAM_MEMBER_ID_ENV]:e.memberId,[i.SUBAGENT_TEAM_MEMBER_TOKEN_ENV]:e.token}}function Ie(){return{[i.SUBAGENT_TEAM_MEMBER_ID_ENV]:void 0,[i.SUBAGENT_TEAM_MEMBER_TOKEN_ENV]:void 0}}function Le(e){Object.assign(process.env,Y(e))}function Re(e){e&&process.env.PI_SUBAGENT_TEAM_ID!==e.teamId||(delete process.env[i.SUBAGENT_TEAM_ID_ENV],delete process.env[i.SUBAGENT_TEAM_ROOT_SESSION_ENV],delete process.env[i.SUBAGENT_TEAM_MAIN_MEMBER_ENV])}function X(){let e=M(i.SUBAGENT_TEAM_ID_ENV),t=M(i.SUBAGENT_TEAM_ROOT_SESSION_ENV),n=M(i.SUBAGENT_TEAM_MAIN_MEMBER_ENV);if(!e||!E(e)||!t||n!==b||e!==me(t))return;let r=W(H(u.join(F(e),ne)));if(!(!r||r.rootSessionId!==t||r.teamId!==e))return{version:1,teamId:e,rootSessionId:t,mainMemberId:n}}function ze(e){if(!e)return;let t=e.id.trim(),n=e.subject.trim();if(!t||!j(t,256))throw Error(`Native team task id must be between 1 and 256 bytes.`);if(!n||!j(n,C))throw Error(`Native team task subject must be between 1 and ${C} bytes.`);return{id:t,subject:n}}function Be(e){if(e.role===`main`)return e.root.mainMemberId;let t=e.name!==void 0;if(!t&&!e.agent)throw Error(`An intercom member needs a name or an agent to derive one from.`);let n=ge(P(e.name??e.agent??x),t);if(e.runId){let t=P(e.runId).slice(0,8),r=48-t.length-1;return`${n.slice(0,r).replace(w,``)||x}-${t}`}return e.fanoutIndex===void 0?n:he(n,e.fanoutIndex)}function Ve(e){let t=Be(e);if(!E(t))throw Error(`A safe native team member id is required.`);let n=pe(),r=N(n),i=Date.now(),a=ze(e.task),o={...e.root,memberId:t,token:n,role:e.role,...e.agent?{agent:e.agent}:{},...e.runId?{runId:e.runId}:{},...e.childIndex===void 0?{}:{childIndex:e.childIndex},...e.parentMemberId?{parentMemberId:e.parentMemberId}:{},...a?{task:a}:{}},s=G(e.root,t);s&&s.tokenHash!==r&&be(R(e.root,t));let{token:c,version:l,...u}=o,d={...u,version:1,tokenHash:r,pid:e.pid??process.pid,active:!0,joinedAt:i};Ae(d),q(e.root,d,i);let f=!1;return{context:o,dispose:()=>{if(f)return;f=!0;let n=G(e.root,t);if(!n||n.tokenHash!==r)return;let i=Date.now();Ae({...n,active:!1,leftAt:i}),q(e.root,n,i)}}}function He(){let e=X(),t=M(i.SUBAGENT_TEAM_MEMBER_ID_ENV),n=M(i.SUBAGENT_TEAM_MEMBER_TOKEN_ENV);if(!e||!t||!E(t)||!n)return;let r=G(e,t);if(!(!r||r.teamId!==e.teamId||r.rootSessionId!==e.rootSessionId)&&!(r.tokenHash!==N(n)||!r.active))return{...e,memberId:t,token:n,role:r.role,...r.agent?{agent:r.agent}:{},...r.runId?{runId:r.runId}:{},...r.childIndex===void 0?{}:{childIndex:r.childIndex},...r.parentMemberId?{parentMemberId:r.parentMemberId}:{},...r.task?{task:r.task}:{}}}function Z(e,t){let n=G(e,e.memberId);if(!n||n.tokenHash!==N(e.token)||!K(e,n,t))throw Error(`This native team member is no longer active.`);return n}function Ue(e,t,n){let r=t?.trim();if(!r)throw o.invalidRequest(`to is required for intercom send and ask.`,`Provide an explicit recipient.`);let i=J(e,n).filter(t=>t.memberId!==e.memberId),a=P(r),s=i.find(e=>e.memberId===r||e.memberId===a);if(s)return s;let c=r.toLowerCase(),l=i.filter(e=>e.agent?.toLowerCase()===c||e.runId?.toLowerCase()===c||c===b&&e.role===`main`);if(l.length===1)return l[0];throw l.length>1?new o.DoomTeamExpectedError(`recipient_ambiguous`,`Multiple active intercom members match '${r}': ${l.map(e=>e.memberId).join(`, `)}.`,!1,`Retry with one exact member id.`):new o.DoomTeamExpectedError(`recipient_not_found`,`Active intercom member '${r}' was not found.`,!0,`Call intercom({"action":"members"}) and retry with an active member id.`)}function We(e){let t=e?.trim();if(!t)throw o.invalidRequest(`message is required for intercom communication.`,`Provide a nonblank message.`);if(!j(t,S))throw o.invalidRequest(`Intercom message exceeds 64 KiB.`,`Shorten the message and retry.`);return t}function Q(e,t,n){let r=G(e,t);return!!(r&&r.tokenHash===n)}function Ge(e,t,n){let r=R(e,e.memberId),i;try{i=l.readdirSync(r,{withFileTypes:!0})}catch{return{messages:[],foreignFiles:[]}}let a=[],o=[];for(let s of i){if(!s.isFile()||!s.name.endsWith(y)||n?.(s.name))continue;let i=u.join(r,s.name),c=we(H(i));if(!c){U(i);continue}if(c.teamId!==e.teamId||c.toMemberId!==e.memberId){o.push(s.name);continue}if(c.expiresAt<t||!Q(e,c.fromMemberId,c.senderTokenHash)){U(i);continue}a.push(c)}return{messages:Ke(a),foreignFiles:o}}function Ke(e){let t=new Map;for(let n of e){let e=t.get(n.fromMemberId);e?e.push(n):t.set(n.fromMemberId,[n])}let n=[];for(let e of t.values())e.sort((e,t)=>e.seq-t.seq),n.push(e);let r=[];for(;;){let e,t;for(let r of n){let n=r[0];n&&(!t||n.createdAt<t.createdAt||n.createdAt===t.createdAt&&n.fromMemberId<t.fromMemberId)&&(e=r,t=n)}if(!e||!t)break;e.shift(),r.push(t)}return r}function qe(e){let t=e.role===`main`?b:e.agent??e.memberId,n=e.runId?` [${e.runId}]`:``,r=e.task?`, task ${e.task.id}: ${e.task.subject}`:``;return`- ${e.memberId}: ${t}${n}${r}`}function Je(e){return{name:e.memberId,role:e.role,...e.agent?{agent:e.agent}:{},...e.runId?{runId:e.runId}:{},...e.task?{task:e.task}:{}}}function Ye(e,t){return new Promise((n,r)=>{if(t?.aborted){r(Error(`Native team request cancelled.`));return}let i,a=()=>{i&&clearTimeout(i),t?.removeEventListener(`abort`,o)},o=()=>{a(),r(Error(`Native team request cancelled.`))};i=setTimeout(()=>{a(),n()},e),t?.addEventListener(`abort`,o,{once:!0})})}function Xe(e,t){let n=G(e,t.fromMemberId),r=`${t.fromMemberId}${n?.agent?` (${n.agent})`:``}`,i=n?.task?`, task ${n.task.id}`:``,a=[`${t.kind===`ask`?`Question`:`Message`} from ${r}${i}.`];return a.push(``,t.message),t.kind===`ask`&&a.push(``,`Reply with ${p}({ action: "reply", requestId: "${t.id}", message: "..." }).`),a.join(`
2
- `)}function Ze(e,t){try{return e.getAllTools().some(e=>e.name===t)}catch{return!1}}var Qe=class{context;ownedMembershipDispose;poller;lastHeartbeatAt=0;lastGcAt=0;seenFiles=new c.BoundedKeySet(1024);deliveryAttempts=new t.LruCache(256);undeliverableMessages=[];outboundSeq=0;constructor(e,t){if(this.pi=e,this.options=t,Ze(e,`intercom`))throw Error(`[tool_conflict] A foreign '${p}' tool is already registered. Recovery: disable the competing extension and reload Doom Team.`);e.registerTool(this.buildTool())}current(){return this.context}undeliverable(){return this.undeliverableMessages}bindMainSession(e){let t=Pe(e);Le(t);let n=Ve({root:t,role:`main`});return this.startBinding(n.context,n.dispose)}bindChildFromEnvironment(){let e=He();if(e)return this.context?.memberId===e.memberId&&this.context.token===e.token?this.context:this.startBinding(e)}dispose(){let e=this.context;this.stopBinding(),e?.role===`main`&&Re(e)}startBinding(e,t){return this.stopBinding(),this.context=e,this.ownedMembershipDispose=t,this.poll(),this.poller=setInterval(()=>{this.poll()},this.options.pollIntervalMs),this.poller.unref?.(),e}stopBinding(){this.poller&&clearInterval(this.poller),this.poller=void 0,this.ownedMembershipDispose?.(),this.ownedMembershipDispose=void 0,this.seenFiles.clear(),this.deliveryAttempts.clear(),this.lastHeartbeatAt=0,this.lastGcAt=0,this.outboundSeq=0,this.context=void 0}poll(){let e=this.context;if(!e)return;let t=this.options.now();this.heartbeat(e,t),this.collectGarbageIfDue(e,t);let n=Ge(e,t,e=>this.seenFiles.has(e));for(let e of n.foreignFiles)this.seenFiles.add(e);for(let t of n.messages)this.deliverOnce(e,t)}deliverOnce(e,t){let r=z(t.id);try{this.deliver(e,t)}catch(n){let i=(this.deliveryAttempts.get(r)??0)+1;if(i<this.options.maxDeliveryAttempts){this.deliveryAttempts.set(r,i);return}this.deliveryAttempts.delete(r),this.seenFiles.add(r),this.reportUndeliverable(e,t,i,n);return}this.seenFiles.add(r),this.deliveryAttempts.delete(r),n.writePrivateAtomicJson(V(e,t.fromMemberId,t.id),{version:1,messageId:t.id,state:T,deliveredAt:this.options.now()}),t.kind===`send`&&U(B(e,e.memberId,t.id))}deliver(e,t){let n=Xe(e,t);if(e.role===`subagent`){this.pi.sendUserMessage(n,{deliverAs:`steer`});return}this.pi.sendMessage({customType:`intercom_message`,content:n,display:!0,details:{id:t.id,kind:t.kind,from:t.fromMemberId,to:t.toMemberId,seq:t.seq}},{triggerTurn:!0,deliverAs:`steer`})}reportUndeliverable(e,t,r,i){let a={messageId:t.id,fromMemberId:t.fromMemberId,kind:t.kind,attempts:r,reason:fe(i),at:this.options.now()};for(this.undeliverableMessages.push(a),n.writePrivateAtomicJson(V(e,t.fromMemberId,t.id),{version:1,messageId:t.id,state:se,reason:a.reason,failedAt:a.at});this.undeliverableMessages.length>32;)this.undeliverableMessages.shift();try{this.pi.sendMessage({customType:`intercom_undeliverable`,content:`Native team message ${t.id} from ${t.fromMemberId} could not be delivered after ${r} attempts: ${a.reason}`,display:!0,details:{...a}},{triggerTurn:!0,deliverAs:`steer`})}catch{}}heartbeat(e,t){if(t-this.lastHeartbeatAt<this.options.heartbeatIntervalMs)return;let n=G(e,e.memberId);!n||n.tokenHash!==N(e.token)||!n.active||(this.lastHeartbeatAt=t,q(e,n,t))}collectGarbageIfDue(e,t){if(!(t-this.lastGcAt<this.options.gcIntervalMs)){this.lastGcAt=t;try{Ne(e,e.memberId,t)}catch(n){for(this.undeliverableMessages.push({messageId:``,fromMemberId:e.memberId,kind:`send`,attempts:0,reason:`Native team directory sweep failed: ${fe(n)}`,at:t});this.undeliverableMessages.length>32;)this.undeliverableMessages.shift()}}}nextSeq(){return this.outboundSeq+=1,this.outboundSeq}queueMessage(e,t,r,i,a,o){if(Z(e,a),!K(e,t,a))throw Error(`Native team member '${t.memberId}' is no longer active.`);let s={type:m,version:2,id:o,teamId:e.teamId,kind:r,fromMemberId:e.memberId,toMemberId:t.memberId,senderTokenHash:N(e.token),seq:this.nextSeq(),message:i,createdAt:a,expiresAt:a+864e5};return l.mkdirSync(R(e,t.memberId),{recursive:!0,mode:448}),n.writePrivateAtomicJson(B(e,t.memberId,s.id),s),s}replyToRequest(e,t,r,i){if(!t||!E(t))throw Error(`requestId must be a valid intercom request id.`);Z(e,i);let a=B(e,e.memberId,t),s=we(H(a));if(!s||s.kind!==`ask`||s.teamId!==e.teamId||s.toMemberId!==e.memberId||!Q(e,s.fromMemberId,s.senderTokenHash))throw new o.DoomTeamExpectedError(`recipient_not_found`,`No pending intercom ask matches requestId '${t}'.`,!1,`Call intercom({"action":"pending"}) and retry with an exact requestId.`);let c={type:h,version:2,requestId:t,teamId:e.teamId,fromMemberId:e.memberId,toMemberId:s.fromMemberId,senderTokenHash:N(e.token),message:r,createdAt:i};return n.writePrivateAtomicJson(_e(e,t),c),U(a),this.seenFiles.delete(z(t)),c}async waitForReply(e,t,n,r,i){let a=_e(e,n.id),s=this.options.now()+(i??this.options.askTimeoutMs);for(;this.options.now()<=s;){if(r?.aborted)throw Error(`Native team request cancelled.`);let i=Te(H(a));if(i&&i.teamId===e.teamId&&i.requestId===n.id&&i.fromMemberId===t.memberId&&i.toMemberId===e.memberId&&Q(e,i.fromMemberId,i.senderTokenHash))return U(a),i;let s=G(e,t.memberId);if(!s||!K(e,s,this.options.now()))throw new o.DoomTeamExpectedError(`communication_unavailable`,`Intercom member '${t.memberId}' became unreachable before replying.`,!0,`Call intercom({"action":"members"}) and decide whether to retry with an active member.`);await Ye(this.options.replyPollIntervalMs,r)}throw new o.DoomTeamExpectedError(`reply_timeout`,`Timed out waiting for intercom member '${t.memberId}' to reply.`,!0,`Check member status before deciding whether to ask again.`)}buildTool(){return{name:p,label:`Intercom`,description:`Communicate with active agents in this root session. Use members, send, ask, pending, or reply. The stable root identity is main.`,promptGuidelines:[`Send only new progress, blockers, or decisions. Do not repeat the task brief, sender task, or delegation instructions because the recipient already has them.`],parameters:ce,execute:async(e,t,n,r)=>{let i=this.context;if(!i)throw new o.DoomTeamExpectedError(`communication_unavailable`,`Intercom is not active for this session.`,!0,`Wait for session startup or reload Doom Team.`);let a=Ee(t),s=this.options.now();if(Z(i,s),a.action===`members`){let e=J(i,s);return{content:[{type:`text`,text:e.length?e.map(qe).join(`
3
- `):`No active members.`}],details:{members:e.map(Je)}}}if(a.action===`pending`){let e=Ge(i,s).messages.filter(e=>e.kind===`ask`),t=e.map(e=>`- ${e.id}: from ${e.fromMemberId}. Reply with ${p}({ action: "reply", requestId: "${e.id}", message: "..." }).`);return{content:[{type:`text`,text:t.length?t.join(`
4
- `):`No pending native team asks.`}],details:{pending:e.map(e=>({id:e.id,from:e.fromMemberId,message:e.message}))}}}let c=We(a.message);if(a.action===`reply`){let e=this.replyToRequest(i,a.requestId,c,s);return{content:[{type:`text`,text:`Replied to native team request ${e.requestId}.`}],details:{requestId:e.requestId,to:e.toMemberId}}}let l=Ue(i,a.to,s);a.action===`ask`&&r?.({content:[{type:`text`,text:`Waiting for ${l.memberId} to reply...`}],details:{action:`ask`,to:l.memberId,partial:!0}});let u=ve(i.memberId,e),d=H(V(i,i.memberId,u));if(d?.state===se)throw new o.DoomTeamExpectedError(`delivery_unconfirmed`,`Intercom message ${u} failed: ${typeof d.reason==`string`?d.reason:`unknown error`}`,!1,`Call intercom({"action":"members"}) and do not resend automatically.`);if(a.action===`send`&&d?.state===T)return{content:[{type:`text`,text:`Message ${u} delivered to ${l.memberId}.`}],details:{state:T,delivered:!0,messageId:u,to:l.memberId}};let f=this.queueMessage(i,l,a.action,c,s,u);if(a.action===`send`)return{content:[{type:`text`,text:`Message ${f.id} queued for ${l.memberId}; delivery is not yet confirmed. Do not resend.`}],details:{state:`queued`,delivered:!1,messageId:f.id,to:l.memberId,seq:f.seq}};try{let e=await this.waitForReply(i,l,f,n,a.timeoutMs);return{content:[{type:`text`,text:`Reply from ${l.memberId}:\n${e.message}`}],details:{requestId:f.id,from:l.memberId,reply:e.message}}}finally{U(B(i,l.memberId,f.id))}}}}};let $=class{runtimes=new WeakMap;pollIntervalMs=250;replyPollIntervalMs=250;heartbeatIntervalMs=5e3;gcIntervalMs=6e4;askTimeoutMs=6e5;maxDeliveryAttempts=5;now(){return Date.now()}createRuntime(e){let t=this.runtimes.get(e);if(t)return t;let n=new Qe(e,{pollIntervalMs:this.pollIntervalMs,replyPollIntervalMs:this.replyPollIntervalMs,heartbeatIntervalMs:this.heartbeatIntervalMs,gcIntervalMs:this.gcIntervalMs,askTimeoutMs:this.askTimeoutMs,maxDeliveryAttempts:this.maxDeliveryAttempts,now:()=>this.now()});return this.runtimes.set(e,n),e.on(`session_shutdown`,()=>{this.runtimes.get(e)?.dispose()}),n}registerClient(e){a.tryCurrentSessionScope()&&He()&&this.createRuntime(e).bindChildFromEnvironment()}};$=r.__decorate([(0,d.injectable)()],$),exports.NATIVE_TEAM_TOOL_NAME=p,Object.defineProperty(exports,`NativeTeamChannelService`,{enumerable:!0,get:function(){return $}}),exports.clearNativeTeamMemberEnvironment=Ie,exports.nativeTeamMemberEnvironment=Fe,exports.nativeTeamRootEnvironment=Y,exports.readActiveNativeTeamSnapshot=Me,exports.readNativeTeamRootFromEnvironment=X,exports.registerNativeTeamMember=Ve;
5
- //# sourceMappingURL=nativeTeamChannel.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"nativeTeamChannel.cjs","names":["path","scopeTeamDir","requireCurrentSessionScope","fs","parseVersioned","invalidRequest","DoomTeamExpectedError","SUBAGENT_TEAM_ID_ENV","SUBAGENT_TEAM_ROOT_SESSION_ENV","SUBAGENT_TEAM_MAIN_MEMBER_ENV","SUBAGENT_TEAM_MEMBER_ID_ENV","SUBAGENT_TEAM_MEMBER_TOKEN_ENV","BoundedKeySet","LruCache","tryCurrentSessionScope"],"sources":["../../src/intercom/nativeTeamChannel.ts"],"sourcesContent":["/**\n * Peer messaging between the named members of one root session's team.\n *\n * A team is every agent process descended from a single root session. Each\n * member owns an inbox directory; peers drop message files into it and the\n * member's poll loop delivers them into its own agent turn. `ask` blocks the\n * sender until the recipient writes a reply file.\n *\n * DESIGN PATTERNS:\n * - A member's name IS its id. Names are what an operator and a model both use\n * to address a teammate, so a second opaque identifier would only ever be a\n * translation layer that can drift\n * - Deliver, then mark seen. Delivery is the side effect that must not be lost,\n * so nothing is recorded as handled until the transport has accepted it\n * - Every record on disk carries a version through `parseVersioned`, so a\n * process running an older build skips a record it cannot read rather than\n * misreading it\n * - One writer per file. A member writes only its own member record, its own\n * heartbeat and other members' inboxes. No file is read-modify-written by two\n * processes, so no update can be lost\n *\n * PERFORMANCE:\n * - The poll skips a file by name before opening it, so an inbox that has\n * accumulated files that are not for us costs one readdir per poll rather than\n * one parse per file per poll\n * - Dead members' directories are swept on a timer, which is what stops that\n * readdir from growing for the life of a long session\n *\n * SEVEN FAILURE MODES THIS MODULE IS BUILT AROUND. Each is called out again at\n * the code that handles it, because each one is a plausible \"simplification\"\n * that would silently reintroduce message loss:\n * 1. Marking a message seen before delivering it loses it permanently when the\n * transport throws, because a seen message is never retried.\n * 2. Ordering by wall-clock alone reorders two messages from the same sender\n * written in the same millisecond.\n * 3. Leaving a file that is not addressed to us unseen re-parses it on every\n * poll, forever.\n * 4. Putting the sender's token in the envelope hands every recipient the value\n * it needs to impersonate that sender.\n * 5. An unbounded seen set grows for the life of the session.\n * 6. Read-modify-writing a shared heartbeat file lets a stale writer resurrect\n * a dead member.\n * 7. Never collecting dead members leaves their inboxes and records on disk.\n *\n * AVOID:\n * - Any module-level mutable state; the runtime owns everything stateful so a\n * second session in the same process cannot inherit the first one's inbox\n * - Deleting a file that failed validation because of a team mismatch; that file\n * belongs to another session and is not ours to destroy\n * - Treating an atomic write as a lock. It prevents a torn read, nothing else\n */\n\nimport { createHash, randomBytes } from 'node:crypto';\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport type { AgentToolResult } from '@earendil-works/pi-agent-core';\nimport type { ExtensionAPI, ToolDefinition } from '@earendil-works/pi-coding-agent';\nimport { injectable } from 'inversify';\nimport type { TSchema } from 'typebox';\nimport {\n SUBAGENT_TEAM_ID_ENV,\n SUBAGENT_TEAM_MAIN_MEMBER_ENV,\n SUBAGENT_TEAM_MEMBER_ID_ENV,\n SUBAGENT_TEAM_MEMBER_TOKEN_ENV,\n SUBAGENT_TEAM_ROOT_SESSION_ENV,\n} from '../env.ts';\nimport { writePrivateAtomicJson } from '../shared/atomicJson.ts';\nimport { BoundedKeySet } from '../shared/boundedKeySet.ts';\nimport { LruCache } from '../shared/lruCache.ts';\nimport { requireCurrentSessionScope, scopeTeamDir, tryCurrentSessionScope } from '../shared/paths.ts';\nimport { parseVersioned } from '../shared/versioned.ts';\nimport { DoomTeamExpectedError, invalidRequest } from '../shared/errors.ts';\n\n/** Wire literal. The model calls the tool by this name, so it is not renamed. */\nexport const NATIVE_TEAM_TOOL_NAME = 'intercom';\n\n/** Wire literals. Present in every envelope so a foreign file is recognisable. */\nconst TEAM_MESSAGE_TYPE = 'subagent.team.message';\nconst TEAM_REPLY_TYPE = 'subagent.team.reply';\n/** Custom message types the host renders. */\nconst TEAM_MESSAGE_CUSTOM_TYPE = 'intercom_message';\nconst TEAM_UNDELIVERABLE_CUSTOM_TYPE = 'intercom_undeliverable';\n\nconst MEMBERS_DIR = 'members';\nconst HEARTBEATS_DIR = 'heartbeats';\nconst INBOXES_DIR = 'inboxes';\nconst REPLIES_DIR = 'replies';\nconst RECEIPTS_DIR = 'receipts';\nconst TEAM_FILE = 'team.json';\nconst JSON_FILE_SUFFIX = '.json';\n\n/** Reserved for the root session. A child that asks for it is refused. */\nconst MAIN_MEMBER_ID = 'main';\n/** Substituted when a derived name would land on the reserved root name. */\nconst RESERVED_NAME_FALLBACK = 'main-agent';\nconst FALLBACK_MEMBER_NAME = 'agent';\nconst MAX_MEMBER_NAME_LENGTH = 48;\nconst FANOUT_SUFFIX_SEPARATOR = '-';\n/** Fanout suffixes are 1-based, so the first child of a fanout reads as `-1`. */\nconst FIRST_FANOUT_ORDINAL = 1;\n\nconst PRIVATE_DIRECTORY_MODE = 0o700;\nconst MAX_MESSAGE_BYTES = 64 * 1024;\nconst MAX_TASK_ID_BYTES = 256;\nconst MAX_TASK_SUBJECT_BYTES = 4 * 1024;\nconst MESSAGE_TTL_MS = 24 * 60 * 60 * 1000;\nconst DEFAULT_ASK_TIMEOUT_MS = 10 * 60 * 1000;\nconst HEARTBEAT_INTERVAL_MS = 5_000;\n/**\n * Exported: `task-board.ts` gates a claim guard on the same staleness window,\n * and must never drift from it. Two definitions of \"how stale is too stale\"\n * would let a claim guard and this module's own liveness check disagree about\n * who is alive.\n */\nexport const HEARTBEAT_STALE_MS = 30_000;\nconst CHANNEL_POLL_MS = 250;\nconst REPLY_POLL_MS = 250;\n\n/**\n * How many times one message may fail delivery before it is given up on.\n *\n * The retry exists for a transient host refusal, and the bound exists because a\n * message the host will never accept would otherwise be re-delivered on every\n * poll for the life of the session, starving every message behind it.\n */\nconst MAX_DELIVERY_ATTEMPTS = 5;\nconst FIRST_DELIVERY_ATTEMPT = 1;\n/** Comfortably above the number of inbox files that can be live at once. */\nconst SEEN_FILE_CAPACITY = 1024;\nconst DELIVERY_ATTEMPT_CAPACITY = 256;\nconst UNDELIVERABLE_HISTORY_LIMIT = 32;\n\nconst TEAM_GC_INTERVAL_MS = 60_000;\n/**\n * How long past its liveness deadline a member's state is kept.\n *\n * Deliberately much larger than `HEARTBEAT_STALE_MS`: a member that is merely\n * slow to start, or stopped at a breakpoint, must not have its inbox deleted\n * out from under a peer that is mid-`ask`.\n */\nconst TEAM_GC_GRACE_MS = 5 * 60 * 1000;\n\nconst TEAM_ROOT_VERSION = 1;\nconst MEMBER_RECORD_VERSION = 1;\nconst HEARTBEAT_RECORD_VERSION = 1;\n/**\n * Version 2 of the envelope. Version 1 carried the sender's token and had no\n * sequence number; both are load-bearing changes, so an old envelope is\n * rejected rather than read with the missing fields defaulted.\n */\nconst ENVELOPE_VERSION = 2;\n\nconst TEAM_ACTIONS = ['members', 'send', 'ask', 'reply', 'pending'] as const;\nconst SAFE_ID_PATTERN = /^[A-Za-z0-9._-]{1,256}$/;\nconst UNSAFE_NAME_CHARS = /[^a-z0-9._-]+/g;\nconst SURROUNDING_SEPARATORS = /^[-.]+|[-.]+$/g;\nconst TEAM_ID_HASH_LENGTH = 32;\nconst TOKEN_BYTES = 32;\nconst HASH_ALGORITHM = 'sha256';\nconst RECEIPT_VERSION = 1;\nconst RECEIPT_DELIVERED = 'delivered';\nconst RECEIPT_FAILED = 'failed';\nconst TEAM_ID_PREFIX = 'session-';\n\nexport type TeamMemberRole = 'main' | 'subagent';\n\nexport interface TeamRootContext {\n version: typeof TEAM_ROOT_VERSION;\n teamId: string;\n rootSessionId: string;\n mainMemberId: string;\n}\n\nexport interface TeamTaskMetadata {\n id: string;\n subject: string;\n}\n\nexport interface TeamMemberContext extends TeamRootContext {\n memberId: string;\n token: string;\n role: TeamMemberRole;\n agent?: string;\n runId?: string;\n childIndex?: number;\n parentMemberId?: string;\n task?: TeamTaskMetadata;\n}\n\ninterface TeamRecord extends TeamRootContext {\n createdAt: number;\n updatedAt: number;\n}\n\n/**\n * The member's durable identity.\n *\n * FIX 6: no `heartbeatAt`. Liveness moved to a per-member file so that writing a\n * heartbeat never rewrites identity, and so a writer can only ever affect its\n * own liveness.\n */\nexport interface TeamMemberRecord extends Omit<TeamMemberContext, 'token' | 'version'> {\n version: typeof MEMBER_RECORD_VERSION;\n tokenHash: string;\n pid: number;\n active: boolean;\n joinedAt: number;\n leftAt?: number;\n}\n\nexport interface NativeTeamMemberSnapshot {\n name: string;\n role: TeamMemberRole;\n agent?: string;\n runId?: string;\n task?: TeamTaskMetadata;\n}\n\nexport interface NativeTeamSnapshot {\n members: NativeTeamMemberSnapshot[];\n}\n\n/**\n * One member's liveness, in a file only that member writes.\n *\n * FIX 6: the predecessor kept `heartbeatAt` inside the member record and\n * refreshed it with a read-modify-write. Two writers racing that read could\n * republish a stale snapshot, which resurrected a member that had already\n * marked itself inactive. `tokenHash` is repeated here so a heartbeat left\n * behind by a previous owner of the same name does not count for the new one.\n */\nexport interface TeamHeartbeatRecord {\n version: typeof HEARTBEAT_RECORD_VERSION;\n memberId: string;\n tokenHash: string;\n pid: number;\n heartbeatAt: number;\n}\n\ntype TeamMessageKind = 'send' | 'ask';\n\n/**\n * FIX 4: `senderTokenHash`, never the token itself.\n *\n * The predecessor embedded the sender's bearer token, so every recipient came\n * out of a single message holding the value that authenticates that sender to\n * `assertCurrentMember`, to `dispose`, and to any future capability keyed on it.\n * A hash is enough for the recipient's actual question, which is only \"does this\n * match the tokenHash in the sender's member record\". What it deliberately does\n * NOT claim is unforgeability against a process that can already write into this\n * team directory: everyone in the team runs as the same OS user, so the\n * boundary here is the token, not the directory.\n */\ninterface TeamMessageEnvelope {\n type: typeof TEAM_MESSAGE_TYPE;\n version: typeof ENVELOPE_VERSION;\n id: string;\n teamId: string;\n kind: TeamMessageKind;\n fromMemberId: string;\n toMemberId: string;\n senderTokenHash: string;\n /**\n * FIX 2: monotonic per sender, assigned in the order the sender queued.\n *\n * `createdAt` has millisecond resolution, so two messages from one sender in\n * the same millisecond are indistinguishable by time and were delivered in\n * whatever order the directory happened to list them.\n */\n seq: number;\n message: string;\n createdAt: number;\n expiresAt: number;\n}\n\ninterface TeamReplyEnvelope {\n type: typeof TEAM_REPLY_TYPE;\n version: typeof ENVELOPE_VERSION;\n requestId: string;\n teamId: string;\n fromMemberId: string;\n toMemberId: string;\n senderTokenHash: string;\n message: string;\n createdAt: number;\n}\n\n/** A message the transport refused often enough that it was given up on. */\nexport interface UndeliverableTeamMessage {\n messageId: string;\n fromMemberId: string;\n kind: TeamMessageKind;\n attempts: number;\n reason: string;\n at: number;\n}\n\ninterface TeamToolParams {\n action: (typeof TEAM_ACTIONS)[number];\n to?: string;\n message?: string;\n requestId?: string;\n timeoutMs?: number;\n}\n\n/**\n * Hand-written JSON Schema rather than a TypeBox builder, so the wire shape is\n * readable in one place. The cast is the reason `execute` narrows its params\n * with a real guard instead of trusting the static type.\n */\nconst TeamToolParamsSchema = {\n oneOf: [\n ...(['members', 'pending'] as const).map((action) => ({\n type: 'object',\n properties: { action: { const: action } },\n required: ['action'],\n additionalProperties: false,\n })),\n {\n type: 'object',\n properties: { action: { const: 'send' }, to: { type: 'string' }, message: { type: 'string' } },\n required: ['action', 'to', 'message'],\n additionalProperties: false,\n },\n {\n type: 'object',\n properties: {\n action: { const: 'ask' },\n to: { type: 'string' },\n message: { type: 'string' },\n timeoutMs: { type: 'integer', minimum: 1 },\n },\n required: ['action', 'to', 'message'],\n additionalProperties: false,\n },\n {\n type: 'object',\n properties: { action: { const: 'reply' }, requestId: { type: 'string' }, message: { type: 'string' } },\n required: ['action', 'requestId', 'message'],\n additionalProperties: false,\n },\n ],\n} as unknown as TSchema;\n\n// ---------------------------------------------------------------------------\n// Narrowing helpers. Everything read off disk or out of a tool call arrives as\n// `unknown` and is narrowed by one of these; nothing is asserted into shape.\n// ---------------------------------------------------------------------------\n\nfunction isSafeId(value: unknown): value is string {\n return typeof value === 'string' && SAFE_ID_PATTERN.test(value);\n}\n\nfunction isInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isInteger(value);\n}\n\nfunction isFiniteNumber(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value);\n}\n\nfunction isNonEmptyString(value: unknown): value is string {\n return typeof value === 'string' && value.trim().length > 0;\n}\n\nfunction isOptionalString(value: unknown): value is string | undefined {\n return value === undefined || typeof value === 'string';\n}\n\nfunction isOptionalInteger(value: unknown): value is number | undefined {\n return value === undefined || isInteger(value);\n}\n\nfunction isMemberRole(value: unknown): value is TeamMemberRole {\n return value === 'main' || value === 'subagent';\n}\n\nfunction isMessageKind(value: unknown): value is TeamMessageKind {\n return value === 'send' || value === 'ask';\n}\n\nfunction withinBytes(value: string, limit: number): boolean {\n return Buffer.byteLength(value, 'utf-8') <= limit;\n}\n\nfunction errorText(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction textEnv(name: string): string | undefined {\n const value = process.env[name]?.trim();\n return value ? value : undefined;\n}\n\nfunction hash(value: string): string {\n return createHash(HASH_ALGORITHM).update(value).digest('hex');\n}\n\nfunction newToken(): string {\n return randomBytes(TOKEN_BYTES).toString('base64url');\n}\n\nfunction teamIdForSession(rootSessionId: string): string {\n return `${TEAM_ID_PREFIX}${hash(rootSessionId).slice(0, TEAM_ID_HASH_LENGTH)}`;\n}\n\n// ---------------------------------------------------------------------------\n// Member names. A name is the id, so naming rules are identity rules.\n// ---------------------------------------------------------------------------\n\n/**\n * Reduce any label to a usable member name.\n *\n * Lowercase because a name is typed by hand and by a model, and two members\n * differing only in case would be two identities that read as one.\n */\nexport function normalizeTeamMemberName(raw: string): string {\n const normalized = raw\n .trim()\n .toLowerCase()\n .replace(UNSAFE_NAME_CHARS, FANOUT_SUFFIX_SEPARATOR)\n .replace(SURROUNDING_SEPARATORS, '')\n .slice(0, MAX_MEMBER_NAME_LENGTH)\n .replace(SURROUNDING_SEPARATORS, '');\n return normalized || FALLBACK_MEMBER_NAME;\n}\n\n/** Append `-1`..`-N` while keeping the whole name inside the length budget. */\nfunction withFanoutOrdinal(base: string, fanoutIndex: number): string {\n const suffix = `${FANOUT_SUFFIX_SEPARATOR}${fanoutIndex + FIRST_FANOUT_ORDINAL}`;\n const room = MAX_MEMBER_NAME_LENGTH - suffix.length;\n const trimmed = base.slice(0, Math.max(room, 0)).replace(SURROUNDING_SEPARATORS, '');\n return `${trimmed || FALLBACK_MEMBER_NAME}${suffix}`;\n}\n\n/**\n * `main` belongs to the root session and to nothing else.\n *\n * An explicit request for it is an error, because silently handing the caller a\n * different name would leave it addressing a member that does not exist. A name\n * that merely derived to `main` is substituted instead, since the caller never\n * asked for that name and cannot act on the refusal.\n */\nfunction guardReservedName(name: string, explicit: boolean): string {\n if (name !== MAIN_MEMBER_ID) return name;\n if (explicit) throw new Error(`Native team member name '${MAIN_MEMBER_ID}' is reserved for the root session.`);\n return RESERVED_NAME_FALLBACK;\n}\n\n// ---------------------------------------------------------------------------\n// Paths\n// ---------------------------------------------------------------------------\n\n/**\n * This team's directory, under the owning session's scope.\n *\n * A team is every agent descended from one root session, so the team tree\n * belongs inside that session's scope rather than in a parallel\n * `team-channels/` root shared by every concurrent session. The `teamId`\n * segment is kept even though a scope holds exactly one team: it is the value\n * every record on disk is validated against (see `readNativeTeamRootFromEnvironment`),\n * so keeping path and record agreeing costs one segment and removes a way for\n * a stale tree to be read as the current one.\n */\nexport function teamDir(teamId: string): string {\n if (!isSafeId(teamId)) throw new Error('Invalid native team id.');\n return path.join(scopeTeamDir(requireCurrentSessionScope()), teamId);\n}\n\nfunction memberPath(root: TeamRootContext, memberId: string): string {\n if (!isSafeId(memberId)) throw new Error('Invalid native team member id.');\n return path.join(teamDir(root.teamId), MEMBERS_DIR, `${memberId}${JSON_FILE_SUFFIX}`);\n}\n\nfunction heartbeatPath(root: TeamRootContext, memberId: string): string {\n if (!isSafeId(memberId)) throw new Error('Invalid native team member id.');\n return path.join(teamDir(root.teamId), HEARTBEATS_DIR, `${memberId}${JSON_FILE_SUFFIX}`);\n}\n\nfunction inboxDir(root: TeamRootContext, memberId: string): string {\n if (!isSafeId(memberId)) throw new Error('Invalid native team member id.');\n return path.join(teamDir(root.teamId), INBOXES_DIR, memberId);\n}\n\nfunction messageFileName(messageId: string): string {\n return `${messageId}${JSON_FILE_SUFFIX}`;\n}\n\nfunction messagePath(root: TeamRootContext, memberId: string, messageId: string): string {\n if (!isSafeId(messageId)) throw new Error('Invalid native team message id.');\n return path.join(inboxDir(root, memberId), messageFileName(messageId));\n}\n\nfunction replyPath(root: TeamRootContext, requestId: string): string {\n if (!isSafeId(requestId)) throw new Error('Invalid native team request id.');\n return path.join(teamDir(root.teamId), REPLIES_DIR, `${requestId}${JSON_FILE_SUFFIX}`);\n}\n\nfunction receiptPath(root: TeamRootContext, senderId: string, messageId: string): string {\n if (!isSafeId(senderId) || !isSafeId(messageId)) throw new Error('Invalid intercom receipt identity.');\n return path.join(teamDir(root.teamId), RECEIPTS_DIR, senderId, `${messageId}${JSON_FILE_SUFFIX}`);\n}\n\nfunction operationMessageId(memberId: string, operationId: string): string {\n return createHash(HASH_ALGORITHM).update(`${memberId}:${operationId}`).digest('hex');\n}\n\nfunction ensureTeamDirectories(root: TeamRootContext): void {\n const rootDir = teamDir(root.teamId);\n for (const child of [MEMBERS_DIR, HEARTBEATS_DIR, INBOXES_DIR, REPLIES_DIR, RECEIPTS_DIR]) {\n fs.mkdirSync(path.join(rootDir, child), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n }\n}\n\nfunction readJsonRecord(file: string): Record<string, unknown> | undefined {\n try {\n const parsed: unknown = JSON.parse(fs.readFileSync(file, 'utf-8'));\n return parsed && typeof parsed === 'object' && !Array.isArray(parsed)\n ? (parsed as Record<string, unknown>)\n : undefined;\n } catch {\n // A missing, half-written or corrupt file is a normal state for a directory\n // several processes write to. The caller treats undefined as \"not readable\n // yet\" and either retries on the next poll or removes the file.\n return undefined;\n }\n}\n\nfunction removeFile(file: string): boolean {\n try {\n fs.rmSync(file, { force: true });\n return true;\n } catch (error) {\n // Already gone counts as removed. Anything else is reported so a caller\n // that must not re-deliver can tell the difference.\n return (error as NodeJS.ErrnoException).code === 'ENOENT';\n }\n}\n\nfunction removeDirectory(dir: string): void {\n try {\n fs.rmSync(dir, { recursive: true, force: true });\n } catch {\n // Best effort. A directory that resists removal is retried by the next\n // sweep; failing the sweep would stop the rest of the cleanup.\n }\n}\n\n// ---------------------------------------------------------------------------\n// Record parsing\n// ---------------------------------------------------------------------------\n\nfunction parseTeamRecord(value: Record<string, unknown> | undefined): TeamRecord | undefined {\n const versioned = parseVersioned(value, [TEAM_ROOT_VERSION]);\n if (!versioned.ok || !value) return undefined;\n if (\n !isSafeId(value.teamId) ||\n !isNonEmptyString(value.rootSessionId) ||\n value.mainMemberId !== MAIN_MEMBER_ID ||\n !isFiniteNumber(value.createdAt) ||\n !isFiniteNumber(value.updatedAt)\n )\n return undefined;\n return {\n version: TEAM_ROOT_VERSION,\n teamId: value.teamId,\n rootSessionId: value.rootSessionId,\n mainMemberId: MAIN_MEMBER_ID,\n createdAt: value.createdAt,\n updatedAt: value.updatedAt,\n };\n}\n\nfunction parseTaskMetadata(value: unknown): TeamTaskMetadata | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n const task: Record<string, unknown> = value as Record<string, unknown>;\n if (!isNonEmptyString(task.id) || !isNonEmptyString(task.subject)) return undefined;\n if (!withinBytes(task.id, MAX_TASK_ID_BYTES) || !withinBytes(task.subject, MAX_TASK_SUBJECT_BYTES)) return undefined;\n return { id: task.id, subject: task.subject };\n}\n\nfunction parseMemberRecord(value: Record<string, unknown> | undefined): TeamMemberRecord | undefined {\n const versioned = parseVersioned(value, [MEMBER_RECORD_VERSION]);\n if (!versioned.ok || !value) return undefined;\n if (\n !isSafeId(value.teamId) ||\n !isNonEmptyString(value.rootSessionId) ||\n !isNonEmptyString(value.mainMemberId) ||\n !isSafeId(value.memberId) ||\n !isMemberRole(value.role) ||\n !isNonEmptyString(value.tokenHash) ||\n !isInteger(value.pid) ||\n typeof value.active !== 'boolean' ||\n !isFiniteNumber(value.joinedAt) ||\n !isOptionalString(value.agent) ||\n !isOptionalString(value.runId) ||\n !isOptionalInteger(value.childIndex) ||\n !isOptionalString(value.parentMemberId)\n )\n return undefined;\n const task = value.task === undefined ? undefined : parseTaskMetadata(value.task);\n if (value.task !== undefined && !task) return undefined;\n return {\n version: MEMBER_RECORD_VERSION,\n teamId: value.teamId,\n rootSessionId: value.rootSessionId,\n mainMemberId: value.mainMemberId,\n memberId: value.memberId,\n role: value.role,\n tokenHash: value.tokenHash,\n pid: value.pid,\n active: value.active,\n joinedAt: value.joinedAt,\n ...(isFiniteNumber(value.leftAt) ? { leftAt: value.leftAt } : {}),\n ...(value.agent !== undefined ? { agent: value.agent } : {}),\n ...(value.runId !== undefined ? { runId: value.runId } : {}),\n ...(value.childIndex !== undefined ? { childIndex: value.childIndex } : {}),\n ...(value.parentMemberId !== undefined ? { parentMemberId: value.parentMemberId } : {}),\n ...(task ? { task } : {}),\n };\n}\n\nfunction parseHeartbeatRecord(value: Record<string, unknown> | undefined): TeamHeartbeatRecord | undefined {\n const versioned = parseVersioned(value, [HEARTBEAT_RECORD_VERSION]);\n if (!versioned.ok || !value) return undefined;\n if (\n !isSafeId(value.memberId) ||\n !isNonEmptyString(value.tokenHash) ||\n !isInteger(value.pid) ||\n !isFiniteNumber(value.heartbeatAt)\n )\n return undefined;\n return {\n version: HEARTBEAT_RECORD_VERSION,\n memberId: value.memberId,\n tokenHash: value.tokenHash,\n pid: value.pid,\n heartbeatAt: value.heartbeatAt,\n };\n}\n\nfunction parseMessageEnvelope(value: Record<string, unknown> | undefined): TeamMessageEnvelope | undefined {\n const versioned = parseVersioned(value, [ENVELOPE_VERSION]);\n if (!versioned.ok || !value) return undefined;\n if (\n value.type !== TEAM_MESSAGE_TYPE ||\n !isSafeId(value.id) ||\n !isSafeId(value.teamId) ||\n !isMessageKind(value.kind) ||\n !isSafeId(value.fromMemberId) ||\n !isSafeId(value.toMemberId) ||\n !isNonEmptyString(value.senderTokenHash) ||\n !isInteger(value.seq) ||\n typeof value.message !== 'string' ||\n !withinBytes(value.message, MAX_MESSAGE_BYTES) ||\n !isFiniteNumber(value.createdAt) ||\n !isFiniteNumber(value.expiresAt)\n )\n return undefined;\n return {\n type: TEAM_MESSAGE_TYPE,\n version: ENVELOPE_VERSION,\n id: value.id,\n teamId: value.teamId,\n kind: value.kind,\n fromMemberId: value.fromMemberId,\n toMemberId: value.toMemberId,\n senderTokenHash: value.senderTokenHash,\n seq: value.seq,\n message: value.message,\n createdAt: value.createdAt,\n expiresAt: value.expiresAt,\n };\n}\n\nfunction parseReplyEnvelope(value: Record<string, unknown> | undefined): TeamReplyEnvelope | undefined {\n const versioned = parseVersioned(value, [ENVELOPE_VERSION]);\n if (!versioned.ok || !value) return undefined;\n if (\n value.type !== TEAM_REPLY_TYPE ||\n !isSafeId(value.requestId) ||\n !isSafeId(value.teamId) ||\n !isSafeId(value.fromMemberId) ||\n !isSafeId(value.toMemberId) ||\n !isNonEmptyString(value.senderTokenHash) ||\n typeof value.message !== 'string' ||\n !withinBytes(value.message, MAX_MESSAGE_BYTES) ||\n !isFiniteNumber(value.createdAt)\n )\n return undefined;\n return {\n type: TEAM_REPLY_TYPE,\n version: ENVELOPE_VERSION,\n requestId: value.requestId,\n teamId: value.teamId,\n fromMemberId: value.fromMemberId,\n toMemberId: value.toMemberId,\n senderTokenHash: value.senderTokenHash,\n message: value.message,\n createdAt: value.createdAt,\n };\n}\n\nfunction parseTeamToolParams(raw: unknown): TeamToolParams {\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {\n throw invalidRequest('Intercom params must be an object.', 'Use one documented intercom action shape.');\n }\n const params: Record<string, unknown> = raw as Record<string, unknown>;\n const action = TEAM_ACTIONS.find((candidate) => candidate === params.action);\n if (!action) {\n throw new DoomTeamExpectedError(\n 'unsupported_operation',\n `Unsupported intercom action: ${String(params.action)}.`,\n false,\n 'Use members, send, ask, pending, or reply.',\n );\n }\n if (!isOptionalString(params.to) || !isOptionalString(params.message) || !isOptionalString(params.requestId))\n throw invalidRequest(\n 'Intercom to, message and requestId values must be strings.',\n 'Correct the action fields and retry.',\n );\n if (params.timeoutMs !== undefined && (!isInteger(params.timeoutMs) || params.timeoutMs < 1)) {\n throw invalidRequest('Intercom timeoutMs must be a positive integer.', 'Correct timeoutMs and retry.');\n }\n const allowed = new Set(\n action === 'members' || action === 'pending'\n ? ['action']\n : action === 'reply'\n ? ['action', 'requestId', 'message']\n : action === 'ask'\n ? ['action', 'to', 'message', 'timeoutMs']\n : ['action', 'to', 'message'],\n );\n const unknown = Object.keys(params).filter((field) => !allowed.has(field));\n if (unknown.length) {\n throw invalidRequest(\n `Intercom action '${action}' does not accept: ${unknown.join(', ')}.`,\n 'Remove unknown fields and retry.',\n );\n }\n return {\n action,\n ...(params.to !== undefined ? { to: params.to } : {}),\n ...(params.message !== undefined ? { message: params.message } : {}),\n ...(params.requestId !== undefined ? { requestId: params.requestId } : {}),\n ...(params.timeoutMs !== undefined ? { timeoutMs: params.timeoutMs } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Liveness\n//\n// `readMember`, `readHeartbeat` and `processAlive` are exported: they are the\n// only readers of the member and heartbeat record formats this module owns,\n// and `task-board.ts` reads through them for its own claim guard rather than\n// keeping a second parser for the same on-disk shape. What is NOT exported is\n// `memberIsActive`: it encodes THIS module's own liveness policy (fall back to\n// `leftAt ?? joinedAt` when there is no heartbeat yet, because a member that\n// has only just registered deserves a grace period before it is judged dead).\n// `task-board.ts` needs a different policy for the same readers -- a missing\n// heartbeat reads as dead, because it only ever gates a claim or a prune, and\n// \"unknown means dead\" is the safe direction there. Sharing the predicate\n// itself instead of the readers would force one of those two correct policies\n// to lose.\n// ---------------------------------------------------------------------------\n\nexport function readMember(root: TeamRootContext, memberId: string): TeamMemberRecord | undefined {\n return parseMemberRecord(readJsonRecord(memberPath(root, memberId)));\n}\n\nexport function readHeartbeat(root: TeamRootContext, member: TeamMemberRecord): TeamHeartbeatRecord | undefined {\n const record = parseHeartbeatRecord(readJsonRecord(heartbeatPath(root, member.memberId)));\n // A heartbeat left by a previous owner of this name proves nothing about the\n // member that holds it now, which is exactly the resurrection FIX 6 targets.\n if (!record || record.memberId !== member.memberId || record.tokenHash !== member.tokenHash) return undefined;\n return record;\n}\n\nexport function processAlive(pid: number): boolean {\n if (pid === process.pid) return true;\n try {\n process.kill(pid, 0);\n return true;\n } catch (error) {\n // EPERM means the pid exists and belongs to someone else, which still\n // answers the question being asked.\n return (error as NodeJS.ErrnoException).code === 'EPERM';\n }\n}\n\n/** Last moment this member proved it was running, from its own writes only. */\nfunction lastProofOfLife(root: TeamRootContext, member: TeamMemberRecord): number {\n return readHeartbeat(root, member)?.heartbeatAt ?? member.leftAt ?? member.joinedAt;\n}\n\nfunction memberIsActive(root: TeamRootContext, member: TeamMemberRecord, now: number): boolean {\n return member.active && processAlive(member.pid) && now - lastProofOfLife(root, member) <= HEARTBEAT_STALE_MS;\n}\n\nfunction writeMemberRecord(record: TeamMemberRecord): void {\n fs.mkdirSync(inboxDir(record, record.memberId), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n writePrivateAtomicJson(memberPath(record, record.memberId), record);\n}\n\nfunction writeHeartbeat(root: TeamRootContext, member: TeamMemberRecord, at: number): void {\n const record: TeamHeartbeatRecord = {\n version: HEARTBEAT_RECORD_VERSION,\n memberId: member.memberId,\n tokenHash: member.tokenHash,\n pid: member.pid,\n heartbeatAt: at,\n };\n writePrivateAtomicJson(heartbeatPath(root, member.memberId), record);\n}\n\n/** Exported: `task-board.ts` walks this to find every member's task claim without duplicating the readdir + parse. */\nexport function listMemberRecords(root: TeamRootContext): TeamMemberRecord[] {\n const dir = path.join(teamDir(root.teamId), MEMBERS_DIR);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n // No members directory means no team on disk yet, which is not an error for\n // a caller that is only asking who is around.\n return [];\n }\n return entries\n .filter((entry) => entry.isFile() && entry.name.endsWith(JSON_FILE_SUFFIX))\n .map((entry) => parseMemberRecord(readJsonRecord(path.join(dir, entry.name))))\n .filter((member): member is TeamMemberRecord => Boolean(member))\n .filter((member) => member.teamId === root.teamId && member.rootSessionId === root.rootSessionId);\n}\n\nfunction listActiveMembers(root: TeamRootContext, now: number): TeamMemberRecord[] {\n return listMemberRecords(root)\n .filter((member) => memberIsActive(root, member, now))\n .sort((left, right) => left.joinedAt - right.joinedAt || left.memberId.localeCompare(right.memberId));\n}\n\nexport function readActiveNativeTeamSnapshot(now = Date.now()): NativeTeamSnapshot | undefined {\n const root = readNativeTeamRootFromEnvironment();\n if (!root) return undefined;\n return { members: listActiveMembers(root, now).map(publicMember) };\n}\n\n/**\n * FIX 7: drop the state of members that are long gone.\n *\n * Without this, every inbox directory and member record a session ever created\n * stays on disk, so `listMemberRecords` and the inbox readdir both grow for the\n * life of the machine's temp directory. The liveness rule is the same one used\n * everywhere else, plus a grace period, so nothing here can collect a member\n * that a peer still considers reachable.\n */\nfunction collectDeadMembers(root: TeamRootContext, selfMemberId: string, now: number): number {\n let collected = 0;\n for (const member of listMemberRecords(root)) {\n if (member.memberId === selfMemberId) continue;\n if (memberIsActive(root, member, now)) continue;\n if (now - lastProofOfLife(root, member) <= HEARTBEAT_STALE_MS + TEAM_GC_GRACE_MS) continue;\n removeDirectory(inboxDir(root, member.memberId));\n removeFile(heartbeatPath(root, member.memberId));\n removeFile(memberPath(root, member.memberId));\n collected += 1;\n }\n return collected;\n}\n\n// ---------------------------------------------------------------------------\n// Team and membership lifecycle\n// ---------------------------------------------------------------------------\n\nexport function ensureNativeTeamRoot(rootSessionId: string): TeamRootContext {\n const normalizedSessionId = rootSessionId.trim();\n if (!normalizedSessionId) throw new Error('A root session id is required for native team communication.');\n const root: TeamRootContext = {\n version: TEAM_ROOT_VERSION,\n teamId: teamIdForSession(normalizedSessionId),\n rootSessionId: normalizedSessionId,\n mainMemberId: MAIN_MEMBER_ID,\n };\n ensureTeamDirectories(root);\n const file = path.join(teamDir(root.teamId), TEAM_FILE);\n const existing = parseTeamRecord(readJsonRecord(file));\n if (existing && existing.rootSessionId !== normalizedSessionId)\n throw new Error('Native team identity collision detected.');\n const now = Date.now();\n const record: TeamRecord = { ...root, createdAt: existing?.createdAt ?? now, updatedAt: now };\n writePrivateAtomicJson(file, record);\n return root;\n}\n\nexport function nativeTeamRootEnvironment(root: TeamRootContext): Record<string, string> {\n return {\n [SUBAGENT_TEAM_ID_ENV]: root.teamId,\n [SUBAGENT_TEAM_ROOT_SESSION_ENV]: root.rootSessionId,\n [SUBAGENT_TEAM_MAIN_MEMBER_ENV]: root.mainMemberId,\n };\n}\n\n/**\n * The environment a child needs to act as this member.\n *\n * The token travels only to the process that IS this member, which is what\n * makes FIX 4 coherent: the secret goes down the spawn path, never sideways in\n * an envelope.\n */\nexport function nativeTeamMemberEnvironment(context: TeamMemberContext): Record<string, string> {\n return {\n ...nativeTeamRootEnvironment(context),\n [SUBAGENT_TEAM_MEMBER_ID_ENV]: context.memberId,\n [SUBAGENT_TEAM_MEMBER_TOKEN_ENV]: context.token,\n };\n}\n\nexport function clearNativeTeamMemberEnvironment(): Record<string, undefined> {\n return {\n [SUBAGENT_TEAM_MEMBER_ID_ENV]: undefined,\n [SUBAGENT_TEAM_MEMBER_TOKEN_ENV]: undefined,\n };\n}\n\nexport function applyNativeTeamRootEnvironment(root: TeamRootContext): void {\n Object.assign(process.env, nativeTeamRootEnvironment(root));\n}\n\nexport function clearNativeTeamRootEnvironment(root?: TeamRootContext): void {\n if (root && process.env[SUBAGENT_TEAM_ID_ENV] !== root.teamId) return;\n delete process.env[SUBAGENT_TEAM_ID_ENV];\n delete process.env[SUBAGENT_TEAM_ROOT_SESSION_ENV];\n delete process.env[SUBAGENT_TEAM_MAIN_MEMBER_ENV];\n}\n\nexport function readNativeTeamRootFromEnvironment(): TeamRootContext | undefined {\n const teamId = textEnv(SUBAGENT_TEAM_ID_ENV);\n const rootSessionId = textEnv(SUBAGENT_TEAM_ROOT_SESSION_ENV);\n const mainMemberId = textEnv(SUBAGENT_TEAM_MAIN_MEMBER_ENV);\n if (!teamId || !isSafeId(teamId) || !rootSessionId || mainMemberId !== MAIN_MEMBER_ID) return undefined;\n if (teamId !== teamIdForSession(rootSessionId)) return undefined;\n const record = parseTeamRecord(readJsonRecord(path.join(teamDir(teamId), TEAM_FILE)));\n if (!record || record.rootSessionId !== rootSessionId || record.teamId !== teamId) return undefined;\n return { version: TEAM_ROOT_VERSION, teamId, rootSessionId, mainMemberId };\n}\n\nfunction validateTaskMetadata(task: TeamTaskMetadata | undefined): TeamTaskMetadata | undefined {\n if (!task) return undefined;\n const id = task.id.trim();\n const subject = task.subject.trim();\n if (!id || !withinBytes(id, MAX_TASK_ID_BYTES))\n throw new Error(`Native team task id must be between 1 and ${MAX_TASK_ID_BYTES} bytes.`);\n if (!subject || !withinBytes(subject, MAX_TASK_SUBJECT_BYTES))\n throw new Error(`Native team task subject must be between 1 and ${MAX_TASK_SUBJECT_BYTES} bytes.`);\n return { id, subject };\n}\n\nexport interface RegisterNativeTeamMemberInput {\n root: TeamRootContext;\n role: TeamMemberRole;\n /** Explicit name. Becomes the member id verbatim once normalized. */\n name?: string;\n agent?: string;\n runId?: string;\n childIndex?: number;\n /** Present when this member is child N of a fanout; drives the `-N` suffix. */\n fanoutIndex?: number;\n parentMemberId?: string;\n task?: TeamTaskMetadata;\n pid?: number;\n}\n\n/**\n * Resolve the member id, which is also the member's name.\n *\n * Precedence is explicit name, then the agent name, because the caller that\n * passed a name meant it, while an agent name is only a sensible default.\n */\nfunction resolveMemberId(input: RegisterNativeTeamMemberInput): string {\n if (input.role === 'main') return input.root.mainMemberId;\n const explicit = input.name !== undefined;\n if (!explicit && !input.agent) throw new Error('An intercom member needs a name or an agent to derive one from.');\n const base = guardReservedName(normalizeTeamMemberName(input.name ?? input.agent ?? FALLBACK_MEMBER_NAME), explicit);\n if (input.runId) {\n const suffix = normalizeTeamMemberName(input.runId).slice(0, 8);\n const room = MAX_MEMBER_NAME_LENGTH - suffix.length - FANOUT_SUFFIX_SEPARATOR.length;\n return `${base.slice(0, room).replace(SURROUNDING_SEPARATORS, '') || FALLBACK_MEMBER_NAME}-${suffix}`;\n }\n return input.fanoutIndex === undefined ? base : withFanoutOrdinal(base, input.fanoutIndex);\n}\n\n/**\n * Claim a name and join the team. Latest claimant wins.\n *\n * Taking a name over rotates the token, so the previous holder's next\n * `assertCurrentMember` fails and it stops acting as that member. Its inbox is\n * purged in the same step: those messages were addressed to a different process\n * with a different task, and delivering them to the new holder would be worse\n * than dropping them, since the sender is still alive to be told.\n */\nexport function registerNativeTeamMember(input: RegisterNativeTeamMemberInput): {\n context: TeamMemberContext;\n dispose: () => void;\n} {\n const memberId = resolveMemberId(input);\n if (!isSafeId(memberId)) throw new Error('A safe native team member id is required.');\n const memberToken = newToken();\n const tokenHash = hash(memberToken);\n const now = Date.now();\n const task = validateTaskMetadata(input.task);\n const context: TeamMemberContext = {\n ...input.root,\n memberId,\n token: memberToken,\n role: input.role,\n ...(input.agent ? { agent: input.agent } : {}),\n ...(input.runId ? { runId: input.runId } : {}),\n ...(input.childIndex !== undefined ? { childIndex: input.childIndex } : {}),\n ...(input.parentMemberId ? { parentMemberId: input.parentMemberId } : {}),\n ...(task ? { task } : {}),\n };\n const previous = readMember(input.root, memberId);\n if (previous && previous.tokenHash !== tokenHash) removeDirectory(inboxDir(input.root, memberId));\n\n const { token: _unusedToken, version: _unusedVersion, ...identity } = context;\n const record: TeamMemberRecord = {\n ...identity,\n version: MEMBER_RECORD_VERSION,\n tokenHash,\n pid: input.pid ?? process.pid,\n active: true,\n joinedAt: now,\n };\n writeMemberRecord(record);\n writeHeartbeat(input.root, record, now);\n\n let disposed = false;\n return {\n context,\n dispose: () => {\n if (disposed) return;\n disposed = true;\n const current = readMember(input.root, memberId);\n // The name may already have been taken over. Writing then would hand the\n // new holder an inactive record it never asked for.\n if (!current || current.tokenHash !== tokenHash) return;\n const leftAt = Date.now();\n writeMemberRecord({ ...current, active: false, leftAt });\n writeHeartbeat(input.root, current, leftAt);\n },\n };\n}\n\nexport function readNativeTeamMemberFromEnvironment(): TeamMemberContext | undefined {\n const root = readNativeTeamRootFromEnvironment();\n const memberId = textEnv(SUBAGENT_TEAM_MEMBER_ID_ENV);\n const memberToken = textEnv(SUBAGENT_TEAM_MEMBER_TOKEN_ENV);\n if (!root || !memberId || !isSafeId(memberId) || !memberToken) return undefined;\n const member = readMember(root, memberId);\n if (!member || member.teamId !== root.teamId || member.rootSessionId !== root.rootSessionId) return undefined;\n if (member.tokenHash !== hash(memberToken) || !member.active) return undefined;\n return {\n ...root,\n memberId,\n token: memberToken,\n role: member.role,\n ...(member.agent ? { agent: member.agent } : {}),\n ...(member.runId ? { runId: member.runId } : {}),\n ...(member.childIndex !== undefined ? { childIndex: member.childIndex } : {}),\n ...(member.parentMemberId ? { parentMemberId: member.parentMemberId } : {}),\n ...(member.task ? { task: member.task } : {}),\n };\n}\n\n// ---------------------------------------------------------------------------\n// Messaging\n// ---------------------------------------------------------------------------\n\nfunction assertCurrentMember(context: TeamMemberContext, now: number): TeamMemberRecord {\n const member = readMember(context, context.memberId);\n if (!member || member.tokenHash !== hash(context.token) || !memberIsActive(context, member, now))\n throw new Error('This native team member is no longer active.');\n return member;\n}\n\nfunction resolveTarget(context: TeamMemberContext, to: string | undefined, now: number): TeamMemberRecord {\n const query = to?.trim();\n if (!query) throw invalidRequest('to is required for intercom send and ask.', 'Provide an explicit recipient.');\n const members = listActiveMembers(context, now).filter((member) => member.memberId !== context.memberId);\n const normalized = normalizeTeamMemberName(query);\n // The name is the id, so an id match is the answer whenever there is one.\n const exact = members.find((member) => member.memberId === query || member.memberId === normalized);\n if (exact) return exact;\n const lowered = query.toLowerCase();\n const matches = members.filter(\n (member) =>\n member.agent?.toLowerCase() === lowered ||\n member.runId?.toLowerCase() === lowered ||\n (lowered === MAIN_MEMBER_ID && member.role === 'main'),\n );\n if (matches.length === 1) return matches[0] as TeamMemberRecord;\n if (matches.length > 1) {\n throw new DoomTeamExpectedError(\n 'recipient_ambiguous',\n `Multiple active intercom members match '${query}': ${matches.map((member) => member.memberId).join(', ')}.`,\n false,\n 'Retry with one exact member id.',\n );\n }\n throw new DoomTeamExpectedError(\n 'recipient_not_found',\n `Active intercom member '${query}' was not found.`,\n true,\n 'Call intercom({\"action\":\"members\"}) and retry with an active member id.',\n );\n}\n\nfunction validateMessage(message: string | undefined): string {\n const normalized = message?.trim();\n if (!normalized)\n throw invalidRequest('message is required for intercom communication.', 'Provide a nonblank message.');\n if (!withinBytes(normalized, MAX_MESSAGE_BYTES)) {\n throw invalidRequest('Intercom message exceeds 64 KiB.', 'Shorten the message and retry.');\n }\n return normalized;\n}\n\n/**\n * Does this envelope really come from the member it names?\n *\n * FIX 4: compares hashes. The caller separately knows the file was found in its\n * own inbox directory, which is the other half of the check the predecessor\n * replaced with a bearer token it then leaked to the recipient.\n */\nfunction senderAuthenticated(root: TeamRootContext, memberId: string, senderTokenHash: string): boolean {\n const member = readMember(root, memberId);\n return Boolean(member && member.tokenHash === senderTokenHash);\n}\n\ninterface InboxScan {\n /** Deliverable, ordered per FIX 2. */\n messages: TeamMessageEnvelope[];\n /**\n * Files that parsed but belong to another team or another member.\n *\n * FIX 3: they are NOT removed, because they are not ours to destroy, and they\n * are reported so the caller can mark them seen. The predecessor left them in\n * place and unmarked, so every poll re-read and re-parsed every one of them.\n */\n foreignFiles: string[];\n}\n\nfunction scanInbox(context: TeamMemberContext, now: number, skip?: (fileName: string) => boolean): InboxScan {\n const dir = inboxDir(context, context.memberId);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n // The inbox is created at registration; a missing one means this member has\n // been collected or has not finished joining, and there is nothing to read.\n return { messages: [], foreignFiles: [] };\n }\n const messages: TeamMessageEnvelope[] = [];\n const foreignFiles: string[] = [];\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(JSON_FILE_SUFFIX)) continue;\n // Checked before the file is opened: this is what keeps an already-handled\n // file from costing a read and a parse on every poll.\n if (skip?.(entry.name)) continue;\n const file = path.join(dir, entry.name);\n const envelope = parseMessageEnvelope(readJsonRecord(file));\n if (!envelope) {\n // Unparseable JSON in our own inbox is corrupt, not foreign: the atomic\n // writer's partial files are named `.tmp` and never seen here.\n removeFile(file);\n continue;\n }\n if (envelope.teamId !== context.teamId || envelope.toMemberId !== context.memberId) {\n foreignFiles.push(entry.name);\n continue;\n }\n if (envelope.expiresAt < now || !senderAuthenticated(context, envelope.fromMemberId, envelope.senderTokenHash)) {\n // Ours, and unusable: expired past its TTL, or from a member whose record\n // is gone so the message can never be authenticated.\n removeFile(file);\n continue;\n }\n messages.push(envelope);\n }\n return { messages: orderBySenderSequence(messages), foreignFiles };\n}\n\n/** The minimum a caller needs to know an ask exists, is addressed to a member, and is unanswered. */\nexport interface PendingTeamAsk {\n id: string;\n fromMemberId: string;\n createdAt: number;\n}\n\n/**\n * Unanswered `ask`s addressed to `targetMemberId`, for a runner-side caller\n * that is not `targetMemberId` itself and does not hold its token (for\n * example a deliverable guard checking on a subagent it spawned).\n *\n * READ-ONLY, DELIBERATELY NOT `scanInbox`: `scanInbox` deletes a corrupt file,\n * an expired file, and a file whose sender no longer authenticates, as a side\n * effect of scanning. That is correct for a poll loop, which owns the inbox\n * and is allowed to clean it up, but it is exactly wrong for a diagnostic\n * read: consuming a message as a side effect of merely asking about it would\n * make the message vanish for its real recipient, which is a worse bug than\n * the one this function exists to answer. This function only ever SKIPS a\n * file it cannot use when deciding what to report; it never calls\n * `removeFile` and never touches any in-memory \"seen\" state (it has no access\n * to another process's runtime instance to touch even if it wanted to). Do\n * not refactor this to share the scan loop with `scanInbox` -- that would\n * reintroduce the deletion as a side effect of a read.\n *\n * \"Unanswered\" needs no extra flag and none should be added: `replyToRequest`\n * removes the request file on reply, and `waitForReply`'s `finally` removes\n * it on timeout or cancellation too, so a valid, unexpired, sender-\n * authenticated `ask` file still sitting in the inbox always means nobody has\n * replied to it yet. A separate `answered` boolean would just be a second\n * place that fact could go stale.\n *\n * AUTHENTICATION: `caller` must be a currently active member of this exact\n * team, verified the same way every tool action verifies its caller\n * (`assertCurrentMember`). This is DELIBERATELY NARROWER than the plain\n * `TeamRootContext` the other exported readers (`readMember`, `readHeartbeat`,\n * `listMemberRecords`) accept, and that narrowing is not an inconsistency to\n * \"fix\" by loosening this to match them: a `TeamRootContext` is cheap to\n * reconstruct from a bare `rootSessionId` (`teamIdForSession` is a pure\n * function of it), so those readers' bar is really \"knows or can guess a\n * session id\". That is an acceptable bar for a static roster (who exists,\n * their role, their task) -- the same thing `list`/`status` already hand to\n * any member. It is not an acceptable bar for this function: who is asking\n * whom, and when, is a live activity signal, not roster data, so this\n * requires proof the caller is a real, currently-registered member with a\n * token that hashes to what is on disk. It deliberately does NOT require\n * `targetMemberId`'s own token: requiring that would mean handing it out to a\n * process that is not that member, which is exactly the impersonation\n * capability removing `senderToken` from the envelope (FIX 4) was there to\n * prevent. Do not let a future \"simplification\" walk either of those back.\n */\nexport function pendingAsksAddressedTo(\n caller: TeamMemberContext,\n targetMemberId: string,\n now: number,\n): PendingTeamAsk[] {\n assertCurrentMember(caller, now);\n if (!isSafeId(targetMemberId)) return [];\n const dir = inboxDir(caller, targetMemberId);\n let entries: fs.Dirent[];\n try {\n entries = fs.readdirSync(dir, { withFileTypes: true });\n } catch {\n // No inbox for this member: nothing pending, not an error.\n return [];\n }\n const pending: PendingTeamAsk[] = [];\n for (const entry of entries) {\n if (!entry.isFile() || !entry.name.endsWith(JSON_FILE_SUFFIX)) continue;\n const envelope = parseMessageEnvelope(readJsonRecord(path.join(dir, entry.name)));\n if (!envelope || envelope.kind !== 'ask') continue;\n if (envelope.teamId !== caller.teamId || envelope.toMemberId !== targetMemberId) continue;\n if (envelope.expiresAt < now) continue;\n if (!senderAuthenticated(caller, envelope.fromMemberId, envelope.senderTokenHash)) continue;\n pending.push({ id: envelope.id, fromMemberId: envelope.fromMemberId, createdAt: envelope.createdAt });\n }\n return pending.sort((left, right) => left.createdAt - right.createdAt || left.id.localeCompare(right.id));\n}\n\n/**\n * FIX 2: order within a sender by `seq`, and between senders by time.\n *\n * Implemented as a merge of per-sender queues rather than one comparator,\n * because \"same sender by seq, different senders by createdAt\" is not a\n * transitive relation and `Array.sort` on it would produce an order that\n * depends on the initial file listing.\n */\nfunction orderBySenderSequence(messages: TeamMessageEnvelope[]): TeamMessageEnvelope[] {\n const bySender = new Map<string, TeamMessageEnvelope[]>();\n for (const envelope of messages) {\n const queue = bySender.get(envelope.fromMemberId);\n if (queue) queue.push(envelope);\n else bySender.set(envelope.fromMemberId, [envelope]);\n }\n const queues: TeamMessageEnvelope[][] = [];\n for (const queue of bySender.values()) {\n queue.sort((left, right) => left.seq - right.seq);\n queues.push(queue);\n }\n const ordered: TeamMessageEnvelope[] = [];\n for (;;) {\n let chosen: TeamMessageEnvelope[] | undefined;\n let chosenHead: TeamMessageEnvelope | undefined;\n for (const queue of queues) {\n const head = queue[0];\n if (!head) continue;\n if (\n !chosenHead ||\n head.createdAt < chosenHead.createdAt ||\n (head.createdAt === chosenHead.createdAt && head.fromMemberId < chosenHead.fromMemberId)\n ) {\n chosen = queue;\n chosenHead = head;\n }\n }\n if (!chosen || !chosenHead) break;\n chosen.shift();\n ordered.push(chosenHead);\n }\n return ordered;\n}\n\nfunction formatMember(member: TeamMemberRecord): string {\n const identity = member.role === 'main' ? MAIN_MEMBER_ID : (member.agent ?? member.memberId);\n const run = member.runId ? ` [${member.runId}]` : '';\n const task = member.task ? `, task ${member.task.id}: ${member.task.subject}` : '';\n return `- ${member.memberId}: ${identity}${run}${task}`;\n}\n\nfunction publicMember(member: TeamMemberRecord): NativeTeamMemberSnapshot {\n return {\n name: member.memberId,\n role: member.role,\n ...(member.agent ? { agent: member.agent } : {}),\n ...(member.runId ? { runId: member.runId } : {}),\n ...(member.task ? { task: member.task } : {}),\n };\n}\n\nfunction delay(ms: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(new Error('Native team request cancelled.'));\n return;\n }\n let timer: ReturnType<typeof setTimeout> | undefined;\n const cleanup = (): void => {\n if (timer) clearTimeout(timer);\n signal?.removeEventListener('abort', onAbort);\n };\n const onAbort = (): void => {\n cleanup();\n reject(new Error('Native team request cancelled.'));\n };\n timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\nfunction formatIncomingMessage(context: TeamMemberContext, envelope: TeamMessageEnvelope): string {\n const sender = readMember(context, envelope.fromMemberId);\n const identity = `${envelope.fromMemberId}${sender?.agent ? ` (${sender.agent})` : ''}`;\n const task = sender?.task ? `, task ${sender.task.id}` : '';\n const lines = [`${envelope.kind === 'ask' ? 'Question' : 'Message'} from ${identity}${task}.`];\n lines.push('', envelope.message);\n if (envelope.kind === 'ask') {\n lines.push(\n '',\n `Reply with ${NATIVE_TEAM_TOOL_NAME}({ action: \"reply\", requestId: \"${envelope.id}\", message: \"...\" }).`,\n );\n }\n return lines.join('\\n');\n}\n\nfunction hasTool(pi: ExtensionAPI, name: string): boolean {\n try {\n return pi.getAllTools().some((tool) => tool.name === name);\n } catch {\n // Tool enumeration is unavailable before the host binds its context. Saying\n // \"not registered\" is safe: registerTool is idempotent for our name.\n return false;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Runtime\n// ---------------------------------------------------------------------------\n\nexport interface NativeTeamRuntime {\n bindMainSession(rootSessionId: string): TeamMemberContext;\n bindChildFromEnvironment(): TeamMemberContext | undefined;\n current(): TeamMemberContext | undefined;\n /** Messages given up on after `MAX_DELIVERY_ATTEMPTS`, most recent last. */\n undeliverable(): readonly UndeliverableTeamMessage[];\n dispose(): void;\n}\n\n/** Timing and limits, supplied by the service so tests can subclass and vary. */\ninterface TeamRuntimeOptions {\n pollIntervalMs: number;\n replyPollIntervalMs: number;\n heartbeatIntervalMs: number;\n gcIntervalMs: number;\n askTimeoutMs: number;\n maxDeliveryAttempts: number;\n now: () => number;\n}\n\nclass TeamChannelRuntime implements NativeTeamRuntime {\n private context: TeamMemberContext | undefined;\n private ownedMembershipDispose: (() => void) | undefined;\n private poller: ReturnType<typeof setInterval> | undefined;\n private lastHeartbeatAt = 0;\n private lastGcAt = 0;\n /** FIX 5: bounded. Keyed by file name so FIX 3 can skip before opening. */\n private readonly seenFiles = new BoundedKeySet<string>(SEEN_FILE_CAPACITY);\n private readonly deliveryAttempts = new LruCache<string, number>(DELIVERY_ATTEMPT_CAPACITY);\n private readonly undeliverableMessages: UndeliverableTeamMessage[] = [];\n /** FIX 2: this member's outbound counter, monotonic for its whole lifetime. */\n private outboundSeq = 0;\n\n constructor(\n private readonly pi: ExtensionAPI,\n private readonly options: TeamRuntimeOptions,\n ) {\n if (hasTool(pi, NATIVE_TEAM_TOOL_NAME)) {\n throw new Error(\n `[tool_conflict] A foreign '${NATIVE_TEAM_TOOL_NAME}' tool is already registered. ` +\n 'Recovery: disable the competing extension and reload Doom Team.',\n );\n }\n pi.registerTool(this.buildTool());\n }\n\n current(): TeamMemberContext | undefined {\n return this.context;\n }\n\n undeliverable(): readonly UndeliverableTeamMessage[] {\n return this.undeliverableMessages;\n }\n\n bindMainSession(rootSessionId: string): TeamMemberContext {\n const root = ensureNativeTeamRoot(rootSessionId);\n applyNativeTeamRootEnvironment(root);\n const membership = registerNativeTeamMember({ root, role: 'main' });\n return this.startBinding(membership.context, membership.dispose);\n }\n\n bindChildFromEnvironment(): TeamMemberContext | undefined {\n const childContext = readNativeTeamMemberFromEnvironment();\n if (!childContext) return undefined;\n if (this.context?.memberId === childContext.memberId && this.context.token === childContext.token)\n return this.context;\n return this.startBinding(childContext);\n }\n\n dispose(): void {\n const previous = this.context;\n this.stopBinding();\n if (previous?.role === 'main') clearNativeTeamRootEnvironment(previous);\n }\n\n private startBinding(nextContext: TeamMemberContext, dispose?: () => void): TeamMemberContext {\n this.stopBinding();\n this.context = nextContext;\n this.ownedMembershipDispose = dispose;\n this.poll();\n this.poller = setInterval(() => {\n this.poll();\n }, this.options.pollIntervalMs);\n this.poller.unref?.();\n return nextContext;\n }\n\n private stopBinding(): void {\n if (this.poller) clearInterval(this.poller);\n this.poller = undefined;\n this.ownedMembershipDispose?.();\n this.ownedMembershipDispose = undefined;\n this.seenFiles.clear();\n this.deliveryAttempts.clear();\n this.lastHeartbeatAt = 0;\n this.lastGcAt = 0;\n this.outboundSeq = 0;\n this.context = undefined;\n }\n\n private poll(): void {\n const context = this.context;\n if (!context) return;\n const now = this.options.now();\n this.heartbeat(context, now);\n this.collectGarbageIfDue(context, now);\n const scan = scanInbox(context, now, (fileName) => this.seenFiles.has(fileName));\n // FIX 3: skipped from here on, at the cost of one Set entry rather than a\n // read and a parse on every future poll.\n for (const fileName of scan.foreignFiles) this.seenFiles.add(fileName);\n for (const envelope of scan.messages) this.deliverOnce(context, envelope);\n }\n\n /**\n * FIX 1: deliver, then mark seen. Never the other way round.\n *\n * The predecessor added the id to its seen set and then called an unguarded\n * `deliver`. A throw from the host left the message marked as handled while it\n * had never been shown to anyone, and since it was seen it was never retried:\n * the message was lost with no trace. Here a failure leaves the file unseen so\n * the next poll retries it, and the attempt count is what stops a message the\n * host will never accept from blocking the inbox forever.\n */\n private deliverOnce(context: TeamMemberContext, envelope: TeamMessageEnvelope): void {\n const fileName = messageFileName(envelope.id);\n try {\n this.deliver(context, envelope);\n } catch (error) {\n const attempts = (this.deliveryAttempts.get(fileName) ?? 0) + FIRST_DELIVERY_ATTEMPT;\n if (attempts < this.options.maxDeliveryAttempts) {\n this.deliveryAttempts.set(fileName, attempts);\n return;\n }\n this.deliveryAttempts.delete(fileName);\n this.seenFiles.add(fileName);\n this.reportUndeliverable(context, envelope, attempts, error);\n return;\n }\n this.seenFiles.add(fileName);\n this.deliveryAttempts.delete(fileName);\n writePrivateAtomicJson(receiptPath(context, envelope.fromMemberId, envelope.id), {\n version: RECEIPT_VERSION,\n messageId: envelope.id,\n state: RECEIPT_DELIVERED,\n deliveredAt: this.options.now(),\n });\n // An `ask` file has to survive delivery: `replyToRequest` reads it back to\n // prove the reply answers a real question.\n if (envelope.kind === 'send') removeFile(messagePath(context, context.memberId, envelope.id));\n }\n\n private deliver(context: TeamMemberContext, envelope: TeamMessageEnvelope): void {\n const content = formatIncomingMessage(context, envelope);\n if (context.role === 'subagent') {\n // A subagent is mid-task, so the message is steered into the running turn\n // rather than starting a new one.\n this.pi.sendUserMessage(content, { deliverAs: 'steer' });\n return;\n }\n this.pi.sendMessage(\n {\n customType: TEAM_MESSAGE_CUSTOM_TYPE,\n content,\n display: true,\n details: {\n id: envelope.id,\n kind: envelope.kind,\n from: envelope.fromMemberId,\n to: envelope.toMemberId,\n seq: envelope.seq,\n },\n },\n { triggerTurn: true, deliverAs: 'steer' },\n );\n }\n\n private reportUndeliverable(\n context: TeamMemberContext,\n envelope: TeamMessageEnvelope,\n attempts: number,\n error: unknown,\n ): void {\n const record: UndeliverableTeamMessage = {\n messageId: envelope.id,\n fromMemberId: envelope.fromMemberId,\n kind: envelope.kind,\n attempts,\n reason: errorText(error),\n at: this.options.now(),\n };\n this.undeliverableMessages.push(record);\n writePrivateAtomicJson(receiptPath(context, envelope.fromMemberId, envelope.id), {\n version: RECEIPT_VERSION,\n messageId: envelope.id,\n state: RECEIPT_FAILED,\n reason: record.reason,\n failedAt: record.at,\n });\n while (this.undeliverableMessages.length > UNDELIVERABLE_HISTORY_LIMIT) this.undeliverableMessages.shift();\n try {\n this.pi.sendMessage(\n {\n customType: TEAM_UNDELIVERABLE_CUSTOM_TYPE,\n content: `Native team message ${envelope.id} from ${envelope.fromMemberId} could not be delivered after ${attempts} attempts: ${record.reason}`,\n display: true,\n details: { ...record },\n },\n { triggerTurn: true, deliverAs: 'steer' },\n );\n } catch {\n // The notice travels over the transport that just refused the message, so\n // it can fail for the same reason. `undeliverable()` is then the only\n // record, and rethrowing here would abort the poll and stall every other\n // sender's messages behind this one.\n }\n }\n\n /** FIX 6: writes only this member's own heartbeat file. */\n private heartbeat(context: TeamMemberContext, now: number): void {\n if (now - this.lastHeartbeatAt < this.options.heartbeatIntervalMs) return;\n const member = readMember(context, context.memberId);\n if (!member || member.tokenHash !== hash(context.token) || !member.active) return;\n this.lastHeartbeatAt = now;\n writeHeartbeat(context, member, now);\n }\n\n private collectGarbageIfDue(context: TeamMemberContext, now: number): void {\n if (now - this.lastGcAt < this.options.gcIntervalMs) return;\n this.lastGcAt = now;\n try {\n collectDeadMembers(context, context.memberId, now);\n } catch (error) {\n // FIX 7 is housekeeping, not delivery. A sweep that fails is retried on\n // the next interval; letting it escape would stop the poll that delivers\n // messages, which is strictly worse than a directory left on disk.\n this.undeliverableMessages.push({\n messageId: '',\n fromMemberId: context.memberId,\n kind: 'send',\n attempts: 0,\n reason: `Native team directory sweep failed: ${errorText(error)}`,\n at: now,\n });\n while (this.undeliverableMessages.length > UNDELIVERABLE_HISTORY_LIMIT) this.undeliverableMessages.shift();\n }\n }\n\n private nextSeq(): number {\n this.outboundSeq += 1;\n return this.outboundSeq;\n }\n\n private queueMessage(\n context: TeamMemberContext,\n target: TeamMemberRecord,\n kind: TeamMessageKind,\n message: string,\n now: number,\n messageId: string,\n ): TeamMessageEnvelope {\n assertCurrentMember(context, now);\n if (!memberIsActive(context, target, now))\n throw new Error(`Native team member '${target.memberId}' is no longer active.`);\n const envelope: TeamMessageEnvelope = {\n type: TEAM_MESSAGE_TYPE,\n version: ENVELOPE_VERSION,\n id: messageId,\n teamId: context.teamId,\n kind,\n fromMemberId: context.memberId,\n toMemberId: target.memberId,\n senderTokenHash: hash(context.token),\n seq: this.nextSeq(),\n message,\n createdAt: now,\n expiresAt: now + MESSAGE_TTL_MS,\n };\n fs.mkdirSync(inboxDir(context, target.memberId), { recursive: true, mode: PRIVATE_DIRECTORY_MODE });\n writePrivateAtomicJson(messagePath(context, target.memberId, envelope.id), envelope);\n return envelope;\n }\n\n private replyToRequest(\n context: TeamMemberContext,\n requestId: string | undefined,\n message: string,\n now: number,\n ): TeamReplyEnvelope {\n if (!requestId || !isSafeId(requestId)) throw new Error('requestId must be a valid intercom request id.');\n assertCurrentMember(context, now);\n const requestFile = messagePath(context, context.memberId, requestId);\n const request = parseMessageEnvelope(readJsonRecord(requestFile));\n if (\n !request ||\n request.kind !== 'ask' ||\n request.teamId !== context.teamId ||\n request.toMemberId !== context.memberId ||\n !senderAuthenticated(context, request.fromMemberId, request.senderTokenHash)\n )\n throw new DoomTeamExpectedError(\n 'recipient_not_found',\n `No pending intercom ask matches requestId '${requestId}'.`,\n false,\n 'Call intercom({\"action\":\"pending\"}) and retry with an exact requestId.',\n );\n const reply: TeamReplyEnvelope = {\n type: TEAM_REPLY_TYPE,\n version: ENVELOPE_VERSION,\n requestId,\n teamId: context.teamId,\n fromMemberId: context.memberId,\n toMemberId: request.fromMemberId,\n senderTokenHash: hash(context.token),\n message,\n createdAt: now,\n };\n writePrivateAtomicJson(replyPath(context, requestId), reply);\n removeFile(requestFile);\n this.seenFiles.delete(messageFileName(requestId));\n return reply;\n }\n\n private async waitForReply(\n context: TeamMemberContext,\n target: TeamMemberRecord,\n request: TeamMessageEnvelope,\n signal: AbortSignal | undefined,\n timeoutMs?: number,\n ): Promise<TeamReplyEnvelope> {\n const file = replyPath(context, request.id);\n const deadline = this.options.now() + (timeoutMs ?? this.options.askTimeoutMs);\n while (this.options.now() <= deadline) {\n if (signal?.aborted) throw new Error('Native team request cancelled.');\n const reply = parseReplyEnvelope(readJsonRecord(file));\n if (\n reply &&\n reply.teamId === context.teamId &&\n reply.requestId === request.id &&\n reply.fromMemberId === target.memberId &&\n reply.toMemberId === context.memberId &&\n senderAuthenticated(context, reply.fromMemberId, reply.senderTokenHash)\n ) {\n removeFile(file);\n return reply;\n }\n const currentTarget = readMember(context, target.memberId);\n if (!currentTarget || !memberIsActive(context, currentTarget, this.options.now()))\n throw new DoomTeamExpectedError(\n 'communication_unavailable',\n `Intercom member '${target.memberId}' became unreachable before replying.`,\n true,\n 'Call intercom({\"action\":\"members\"}) and decide whether to retry with an active member.',\n );\n await delay(this.options.replyPollIntervalMs, signal);\n }\n throw new DoomTeamExpectedError(\n 'reply_timeout',\n `Timed out waiting for intercom member '${target.memberId}' to reply.`,\n true,\n 'Check member status before deciding whether to ask again.',\n );\n }\n\n private buildTool(): ToolDefinition<typeof TeamToolParamsSchema, Record<string, unknown>> {\n return {\n name: NATIVE_TEAM_TOOL_NAME,\n label: 'Intercom',\n description:\n 'Communicate with active agents in this root session. Use members, send, ask, pending, or reply. The stable root identity is main.',\n promptGuidelines: [\n 'Send only new progress, blockers, or decisions. Do not repeat the task brief, sender task, or delegation instructions because the recipient already has them.',\n ],\n parameters: TeamToolParamsSchema,\n execute: async (operationId, rawParams, signal, onUpdate): Promise<AgentToolResult<Record<string, unknown>>> => {\n const context = this.context;\n if (!context) {\n throw new DoomTeamExpectedError(\n 'communication_unavailable',\n 'Intercom is not active for this session.',\n true,\n 'Wait for session startup or reload Doom Team.',\n );\n }\n const params = parseTeamToolParams(rawParams);\n const now = this.options.now();\n assertCurrentMember(context, now);\n\n if (params.action === 'members') {\n const members = listActiveMembers(context, now);\n return {\n content: [\n { type: 'text', text: members.length ? members.map(formatMember).join('\\n') : 'No active members.' },\n ],\n details: { members: members.map(publicMember) },\n };\n }\n if (params.action === 'pending') {\n // Deliberately scans without the seen filter: a pending ask has been\n // delivered already, so filtering by seen would hide every one of them.\n const asks = scanInbox(context, now).messages.filter((message) => message.kind === 'ask');\n const lines = asks.map(\n (ask) =>\n `- ${ask.id}: from ${ask.fromMemberId}. Reply with ${NATIVE_TEAM_TOOL_NAME}({ action: \"reply\", requestId: \"${ask.id}\", message: \"...\" }).`,\n );\n return {\n content: [{ type: 'text', text: lines.length ? lines.join('\\n') : 'No pending native team asks.' }],\n details: { pending: asks.map((ask) => ({ id: ask.id, from: ask.fromMemberId, message: ask.message })) },\n };\n }\n\n const message = validateMessage(params.message);\n if (params.action === 'reply') {\n const reply = this.replyToRequest(context, params.requestId, message, now);\n return {\n content: [{ type: 'text', text: `Replied to native team request ${reply.requestId}.` }],\n details: { requestId: reply.requestId, to: reply.toMemberId },\n };\n }\n\n const target = resolveTarget(context, params.to, now);\n if (params.action === 'ask') {\n onUpdate?.({\n content: [{ type: 'text', text: `Waiting for ${target.memberId} to reply...` }],\n details: { action: 'ask', to: target.memberId, partial: true },\n });\n }\n const messageId = operationMessageId(context.memberId, operationId);\n const existingReceipt = readJsonRecord(receiptPath(context, context.memberId, messageId));\n if (existingReceipt?.state === RECEIPT_FAILED) {\n const reason = typeof existingReceipt.reason === 'string' ? existingReceipt.reason : 'unknown error';\n throw new DoomTeamExpectedError(\n 'delivery_unconfirmed',\n `Intercom message ${messageId} failed: ${reason}`,\n false,\n 'Call intercom({\"action\":\"members\"}) and do not resend automatically.',\n );\n }\n if (params.action === 'send' && existingReceipt?.state === RECEIPT_DELIVERED) {\n return {\n content: [{ type: 'text', text: `Message ${messageId} delivered to ${target.memberId}.` }],\n details: { state: RECEIPT_DELIVERED, delivered: true, messageId, to: target.memberId },\n };\n }\n const request = this.queueMessage(context, target, params.action, message, now, messageId);\n if (params.action === 'send') {\n return {\n content: [\n {\n type: 'text',\n text: `Message ${request.id} queued for ${target.memberId}; delivery is not yet confirmed. Do not resend.`,\n },\n ],\n details: {\n state: 'queued',\n delivered: false,\n messageId: request.id,\n to: target.memberId,\n seq: request.seq,\n },\n };\n }\n try {\n const reply = await this.waitForReply(context, target, request, signal, params.timeoutMs);\n return {\n content: [{ type: 'text', text: `Reply from ${target.memberId}:\\n${reply.message}` }],\n details: { requestId: request.id, from: target.memberId, reply: reply.message },\n };\n } finally {\n // Whether it was answered, timed out or cancelled, the ask must not\n // stay in the target's inbox waiting for a reply nobody is reading.\n removeFile(messagePath(context, target.memberId, request.id));\n }\n },\n };\n }\n}\n\nexport interface INativeTeamChannelService {\n /** Create (or reuse) the runtime bound to one host instance. */\n createRuntime(pi: ExtensionAPI): NativeTeamRuntime;\n /** Bind this process as a team member when its environment says it is one. */\n registerClient(pi: ExtensionAPI): void;\n}\n\n/**\n * Owner of every team runtime in the process.\n *\n * WHY THIS IS A SERVICE AND NOT A MODULE-LEVEL WEAKMAP:\n * The predecessor kept the per-host runtime registry in a module-level WeakMap,\n * so the registry outlived any single session and could not be reset between\n * tests or between two sessions in one process. Timing lives here too: the\n * container resolves this by type and inversify cannot supply a primitive, so\n * intervals are protected members that a test subclass overrides, not\n * constructor arguments.\n */\n@injectable()\nexport class NativeTeamChannelService implements INativeTeamChannelService {\n private readonly runtimes = new WeakMap<ExtensionAPI, NativeTeamRuntime>();\n\n protected readonly pollIntervalMs: number = CHANNEL_POLL_MS;\n protected readonly replyPollIntervalMs: number = REPLY_POLL_MS;\n protected readonly heartbeatIntervalMs: number = HEARTBEAT_INTERVAL_MS;\n protected readonly gcIntervalMs: number = TEAM_GC_INTERVAL_MS;\n protected readonly askTimeoutMs: number = DEFAULT_ASK_TIMEOUT_MS;\n protected readonly maxDeliveryAttempts: number = MAX_DELIVERY_ATTEMPTS;\n\n protected now(): number {\n return Date.now();\n }\n\n createRuntime(pi: ExtensionAPI): NativeTeamRuntime {\n const existing = this.runtimes.get(pi);\n if (existing) return existing;\n const runtime = new TeamChannelRuntime(pi, {\n pollIntervalMs: this.pollIntervalMs,\n replyPollIntervalMs: this.replyPollIntervalMs,\n heartbeatIntervalMs: this.heartbeatIntervalMs,\n gcIntervalMs: this.gcIntervalMs,\n askTimeoutMs: this.askTimeoutMs,\n maxDeliveryAttempts: this.maxDeliveryAttempts,\n now: () => this.now(),\n });\n this.runtimes.set(pi, runtime);\n pi.on('session_shutdown', () => {\n this.runtimes.get(pi)?.dispose();\n });\n return runtime;\n }\n\n registerClient(pi: ExtensionAPI): void {\n // Checked BEFORE readNativeTeamMemberFromEnvironment, which is not\n // scope-free: it resolves `teamDir()` and so requires a scope just to\n // answer \"not a member\". Activation runs before `session_start`, and the\n // parent puts its own PI_SUBAGENT_TEAM_* vars on `process.env`\n // (`applyNativeTeamRootEnvironment`), so a reload re-enters here with team\n // env set and no scope yet. No scope means this process is not a bound\n // child - a real one adopts its scope from the spawn environment first.\n if (!tryCurrentSessionScope()) return;\n if (!readNativeTeamMemberFromEnvironment()) return;\n this.createRuntime(pi).bindChildFromEnvironment();\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"nativeTeamChannel.d.cts","names":[],"sources":["../../src/intercom/nativeTeamChannel.ts"],"mappings":";;;KAoKY,cAAA;AAAA,UASK,gBAAA;EACf,EAAA;EACA,OAAA;AAAA;AAAA,UAmCe,wBAAA;EACf,IAAA;EACA,IAAA,EAAM,cAAA;EACN,KAAA;EACA,KAAA;EACA,IAAA,GAAO,gBAAA;AAAA;AAAA,UAGQ,kBAAA;EACf,OAAA,EAAS,wBAAA;AAAA;AAAA,iBA6mBK,4BAAA,CAA6B,GAAA,YAAmB,kBAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"nativeTeamChannel.d.mts","names":[],"sources":["../../src/intercom/nativeTeamChannel.ts"],"mappings":";;;KAoKY,cAAA;AAAA,UASK,gBAAA;EACf,EAAA;EACA,OAAA;AAAA;AAAA,UAmCe,wBAAA;EACf,IAAA;EACA,IAAA,EAAM,cAAA;EACN,KAAA;EACA,KAAA;EACA,IAAA,GAAO,gBAAA;AAAA;AAAA,UAGQ,kBAAA;EACf,OAAA,EAAS,wBAAA;AAAA;AAAA,iBA6mBK,4BAAA,CAA6B,GAAA,YAAmB,kBAAA"}