@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"childTranscript.cjs","names":["path"],"sources":["../../../src/adapters/process/childTranscript.ts"],"sourcesContent":["/**\n * Append-only JSONL transcript of one child run, written by the parent.\n *\n * WHY THE PARENT WRITES ITS OWN:\n * The child's session transcript lives in the host agent's config directory and\n * is keyed by a session id the parent does not learn until the run ends. This\n * file is the parent's independent record: it exists from the first prompt, it\n * survives a child that never started, and it carries the stdout and stderr the\n * child's own transcript has no place for.\n *\n * DESIGN PATTERNS:\n * - Two independent byte budgets. Each tool payload is capped so one huge result\n * cannot consume the file, and the file itself is capped so a runaway child\n * cannot fill the disk\n * - The file budget reserves room for the truncation marker up front, so the\n * record that trips the limit is dropped in favour of a record explaining why\n * - Write failures latch into one reported error instead of throwing. This file\n * is evidence about a run, so losing it must never end the run it describes\n * - Truncation is carried as a flag beside the text. The predecessor rediscovered\n * it by searching the output for the marker substring, which any payload\n * quoting that phrase would have tripped\n *\n * PERFORMANCE:\n * The marker's byte size is measured once. Every field feeding it is fixed for\n * the writer's lifetime and both timestamps are fixed width, so the predecessor's\n * re-serialisation of the marker on every single record bought nothing.\n *\n * AVOID:\n * - Throwing from any writer method\n * - Cutting a payload mid-character; the cut walks back off UTF-8 continuation\n * bytes before slicing\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport const CHILD_TRANSCRIPT_ARTIFACT_VERSION = 1;\n\nconst BYTES_PER_KIB = 1024;\nconst BYTES_PER_MIB = 1024 * BYTES_PER_KIB;\nconst MAX_TOOL_PAYLOAD_BYTES = 32 * BYTES_PER_KIB;\nconst DEFAULT_MAX_CHILD_TRANSCRIPT_BYTES = 50 * BYTES_PER_MIB;\nconst TOOL_PAYLOAD_TRUNCATION_MARKER = '\\n\\n… payload truncated';\nconst JSON_INDENT = 2;\n\n/** High bits identifying a UTF-8 continuation byte (10xxxxxx). */\nconst UTF8_CONTINUATION_MASK = 0xc0;\nconst UTF8_CONTINUATION_BITS = 0x80;\n\nconst PREVIEW_ELLIPSIS = '...';\nconst PREVIEW_MAX_LENGTH = 60;\nconst FALLBACK_PREVIEW_MAX_LENGTH = 50;\nconst WORKFLOW_PREVIEW_MAX_LENGTH = 48;\nconst MCP_ARGS_PREVIEW_MAX_LENGTH = 40;\nconst LIVE_ACTIVITY_MAX_LENGTH = 72;\n\n/** Argument keys worth previewing verbatim, in the order they are preferred. */\nconst PREVIEW_KEYS = ['command', 'path', 'file_path', 'pattern', 'query', 'url', 'task', 'describe', 'search'] as const;\n\n/**\n * Which execution path produced the records in a file.\n *\n * Only background runs exist, so this is single-valued today. It is still\n * written into every record because the file is read by tools that must be able\n * to tell what produced it without being told out of band, and because a second\n * variant is cheaper to add than to retrofit onto files already on disk.\n */\nexport type ChildTranscriptSource = 'async';\n\nexport type ChildTranscriptRecordType = 'message' | 'tool_start' | 'tool_end' | 'stdout' | 'stderr' | 'truncated';\n\n/**\n * The message fields this transcript records.\n *\n * Declared structurally rather than imported from the host agent's message type:\n * the writer only reads these fields, and a shared leaf should not take on an\n * optional peer dependency to describe them.\n */\nexport interface ChildTranscriptMessage {\n role: string;\n content?: unknown;\n toolCallId?: string;\n toolName?: string;\n isError?: boolean;\n timestamp?: unknown;\n model?: string;\n errorMessage?: string;\n stopReason?: string;\n usage?: unknown;\n}\n\nexport interface ChildTranscriptEvent {\n type?: string;\n message?: ChildTranscriptMessage;\n toolCallId?: string;\n toolName?: string;\n args?: unknown;\n isError?: boolean;\n}\n\nexport interface ChildTranscriptWriterInput {\n transcriptPath: string;\n source: ChildTranscriptSource;\n runId: string;\n agent: string;\n childIndex?: number;\n cwd: string;\n maxBytes?: number;\n}\n\nexport interface ChildTranscriptWriter {\n path: string;\n writeInitialUserMessage(prompt: string): void;\n writeChildEvent(event: ChildTranscriptEvent): void;\n writeStdoutLine(line: string): void;\n writeStderrLine(line: string): void;\n writeStderrText(text: string): void;\n getError(): string | undefined;\n}\n\ninterface BoundedPayload {\n text: string;\n truncated: boolean;\n}\n\ninterface NormalizedUsage {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\n/**\n * Render `value` as text no larger than `maxBytes`, or undefined if it carries\n * nothing worth recording.\n *\n * A value that cannot be serialised (a cycle, a BigInt) is dropped rather than\n * reported, because a tool payload is context and not part of the run's result.\n */\nfunction boundedPayload(value: unknown, maxBytes = MAX_TOOL_PAYLOAD_BYTES): BoundedPayload | undefined {\n let text: string;\n if (typeof value === 'string') {\n text = value;\n } else {\n try {\n const serialized = JSON.stringify(value, null, JSON_INDENT);\n if (serialized === undefined) return undefined;\n text = serialized;\n } catch {\n // Cyclic or non-serialisable payloads have no textual form to record.\n return undefined;\n }\n }\n if (!text.trim()) return undefined;\n\n const payload = Buffer.from(text, 'utf-8');\n if (payload.length <= maxBytes) return { text, truncated: false };\n\n const markerBytes = Buffer.byteLength(TOOL_PAYLOAD_TRUNCATION_MARKER, 'utf-8');\n let end = Math.max(0, maxBytes - markerBytes);\n // Back off any continuation bytes so the cut lands on a character boundary.\n while (end > 0 && ((payload[end] ?? 0) & UTF8_CONTINUATION_MASK) === UTF8_CONTINUATION_BITS) end--;\n return {\n text: `${payload.subarray(0, end).toString('utf-8')}${TOOL_PAYLOAD_TRUNCATION_MARKER}`,\n truncated: true,\n };\n}\n\n/**\n * Read a child's usage counters, tolerating both field namings the host has used.\n *\n * Cost arrives either as a number or as an object with a `total`, so both are\n * accepted; anything else counts as zero rather than as missing, because a run\n * with unreadable cost still has a real elapsed usage record.\n */\nfunction normalizeUsage(value: unknown): NormalizedUsage | undefined {\n if (!value || typeof value !== 'object') return undefined;\n const raw = value as Record<string, unknown>;\n const rawCost = raw.cost;\n const cost =\n rawCost && typeof rawCost === 'object'\n ? (finiteNumber((rawCost as { total?: unknown }).total) ?? 0)\n : (finiteNumber(rawCost) ?? 0);\n return {\n input: finiteNumber(raw.input) ?? finiteNumber(raw.inputTokens) ?? 0,\n output: finiteNumber(raw.output) ?? finiteNumber(raw.outputTokens) ?? 0,\n cacheRead: finiteNumber(raw.cacheRead) ?? 0,\n cacheWrite: finiteNumber(raw.cacheWrite) ?? 0,\n cost,\n };\n}\n\n/**\n * Return the token total observed on one finalized child message.\n *\n * Missing usage means that this message carried no observation and therefore\n * returns undefined. An actual usage object with empty or zero buckets returns\n * zero, which is a meaningful observation for live progress.\n */\nexport function getMessageUsageTokens(message: ChildTranscriptMessage): number | undefined {\n if (message.role !== 'assistant' || !message.usage || typeof message.usage !== 'object') return undefined;\n const raw = message.usage as Record<string, unknown>;\n const totalTokens = finiteNumber(raw.totalTokens);\n if (totalTokens !== undefined) return totalTokens;\n\n const usage = normalizeUsage(message.usage);\n if (!usage) return undefined;\n return usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n}\n\n/**\n * A bounded tail of the assistant's current streamed text/thinking.\n *\n * The tail changes as the model streams, so a parent can show what the child is\n * doing between tool calls instead of leaving the last tool frozen on screen.\n */\nexport function getMessageActivity(message: ChildTranscriptMessage): string | undefined {\n if (message.role !== 'assistant' || !Array.isArray(message.content)) return undefined;\n for (let index = message.content.length - 1; index >= 0; index -= 1) {\n const block = message.content[index];\n if (!block || typeof block !== 'object') continue;\n const record = block as Record<string, unknown>;\n const raw =\n record.type === 'thinking' && typeof record.thinking === 'string'\n ? record.thinking\n : typeof record.text === 'string'\n ? record.text\n : undefined;\n const activity = raw?.replace(/\\s+/g, ' ').trim();\n if (!activity) continue;\n if (activity.length <= LIVE_ACTIVITY_MAX_LENGTH) return `working: ${activity}`;\n return `working: …${activity.slice(-(LIVE_ACTIVITY_MAX_LENGTH - 1))}`;\n }\n return undefined;\n}\n\nfunction truncatePreview(value: string, maxLength: number): string {\n return value.length > maxLength ? `${value.slice(0, maxLength - PREVIEW_ELLIPSIS.length)}${PREVIEW_ELLIPSIS}` : value;\n}\n\nfunction stringifyPreviewValue(value: unknown): string | undefined {\n if (typeof value === 'string' && value.trim().length > 0) return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return undefined;\n}\n\nfunction previewArray(value: unknown): string | undefined {\n if (!Array.isArray(value) || value.length === 0) return undefined;\n const first = stringifyPreviewValue(value[0]);\n if (!first) return undefined;\n const suffix = value.length > 1 ? ` (+${value.length - 1} more)` : '';\n return `${first}${suffix}`;\n}\n\n/**\n * One short line describing what a tool call was asked to do.\n *\n * The ladder is ordered by how much the key tells a reader, not alphabetically:\n * an MCP call is named by server and tool, a search by its query, and everything\n * else falls back to the first stringable argument so the line is never empty\n * when the call had any arguments at all.\n */\nexport function extractToolArgsPreview(args: Record<string, unknown>): string {\n if (typeof args.tool === 'string' && args.tool) {\n const server = typeof args.server === 'string' && args.server ? `${args.server}/` : '';\n const toolArgs =\n typeof args.args === 'string' && args.args ? ` ${args.args.slice(0, MCP_ARGS_PREVIEW_MAX_LENGTH)}` : '';\n return `${server}${args.tool}${toolArgs}`;\n }\n\n const queriesPreview = previewArray(args.queries);\n if (queriesPreview) return truncatePreview(queriesPreview, PREVIEW_MAX_LENGTH);\n if (typeof args.query === 'string' && args.query.trim().length > 0) {\n return truncatePreview(args.query, PREVIEW_MAX_LENGTH);\n }\n if (typeof args.workflow === 'string' && args.workflow.trim().length > 0) {\n return `workflow=${truncatePreview(args.workflow, WORKFLOW_PREVIEW_MAX_LENGTH)}`;\n }\n if (typeof args.url === 'string' && args.url.trim().length > 0) return truncatePreview(args.url, PREVIEW_MAX_LENGTH);\n const urlsPreview = previewArray(args.urls);\n if (urlsPreview) return truncatePreview(urlsPreview, PREVIEW_MAX_LENGTH);\n if (typeof args.prompt === 'string' && args.prompt.trim().length > 0) {\n return truncatePreview(args.prompt, PREVIEW_MAX_LENGTH);\n }\n\n for (const key of PREVIEW_KEYS) {\n const value = args[key];\n if (typeof value === 'string' && value.length > 0) return truncatePreview(value, PREVIEW_MAX_LENGTH);\n }\n\n for (const [key, value] of Object.entries(args)) {\n const arrayPreview = previewArray(value);\n if (arrayPreview) return `${key}=${truncatePreview(arrayPreview, FALLBACK_PREVIEW_MAX_LENGTH)}`;\n if (typeof value === 'string' && value.length > 0) {\n return `${key}=${truncatePreview(value, FALLBACK_PREVIEW_MAX_LENGTH)}`;\n }\n }\n return '';\n}\n\n/** A compact description of a live tool call for the parent task trail. */\nexport function formatToolActivity(toolName: string, args: unknown): string {\n if (!args || typeof args !== 'object' || Array.isArray(args)) return toolName;\n const preview = extractToolArgsPreview(args as Record<string, unknown>);\n return preview ? `${toolName} (${preview})` : toolName;\n}\n\n/**\n * Flatten a message's content into plain text.\n *\n * Content arrives as unknown JSON in four shapes the host has used over time, so\n * every hop is checked. Anything unrecognised contributes nothing rather than\n * being stringified, which would put `[object Object]` into the transcript.\n */\nfunction extractTextFromContent(content: unknown): string {\n if (!content) return '';\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n\n const texts: string[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') continue;\n const record = part as Record<string, unknown>;\n if (record.type === 'text' && 'text' in record) {\n texts.push(String(record.text));\n } else if (record.type === 'tool_result' && 'content' in record) {\n const inner = extractTextFromContent(record.content);\n if (inner) texts.push(inner);\n } else if ('text' in record) {\n texts.push(String(record.text));\n }\n }\n return texts.join('\\n');\n}\n\nfunction eventArgs(event: ChildTranscriptEvent): Record<string, unknown> {\n return event.args && typeof event.args === 'object' && !Array.isArray(event.args)\n ? (event.args as Record<string, unknown>)\n : {};\n}\n\nexport function createChildTranscriptWriter(input: ChildTranscriptWriterInput): ChildTranscriptWriter {\n let bytesWritten = 0;\n let writeError: string | undefined;\n let truncated = false;\n const maxBytes = input.maxBytes ?? DEFAULT_MAX_CHILD_TRANSCRIPT_BYTES;\n\n const baseRecord = (recordType: ChildTranscriptRecordType) => {\n const ts = Date.now();\n return {\n version: CHILD_TRANSCRIPT_ARTIFACT_VERSION,\n recordType,\n source: input.source,\n runId: input.runId,\n agent: input.agent,\n ...(input.childIndex !== undefined ? { childIndex: input.childIndex } : {}),\n cwd: input.cwd,\n ts,\n timestamp: new Date(ts).toISOString(),\n };\n };\n\n const truncationMarkerLine = (): string =>\n `${JSON.stringify({\n ...baseRecord('truncated'),\n maxBytes,\n message: `Child transcript exceeded ${maxBytes} bytes; further records were omitted.`,\n })}\\n`;\n\n // Fixed for this writer: every field is constant except the two timestamps,\n // which are fixed width. Measuring once is why writeRecord stays allocation-free.\n const reservedMarkerBytes = Buffer.byteLength(truncationMarkerLine(), 'utf-8');\n\n const writeTruncatedMarker = () => {\n truncated = true;\n const marker = truncationMarkerLine();\n const markerBytes = Buffer.byteLength(marker, 'utf-8');\n if (bytesWritten + markerBytes > maxBytes) return;\n try {\n fs.appendFileSync(input.transcriptPath, marker, 'utf-8');\n bytesWritten += markerBytes;\n } catch (error) {\n writeError = `Failed to write child transcript '${input.transcriptPath}': ${errorMessage(error)}`;\n }\n };\n\n const writeRecord = (record: Record<string, unknown>) => {\n if (writeError || truncated) return;\n const line = `${JSON.stringify(record)}\\n`;\n const bytes = Buffer.byteLength(line, 'utf-8');\n // The marker's room is reserved, so the file can always state why it ended.\n if (bytesWritten + bytes + reservedMarkerBytes > maxBytes) {\n writeTruncatedMarker();\n return;\n }\n try {\n fs.appendFileSync(input.transcriptPath, line, 'utf-8');\n bytesWritten += bytes;\n } catch (error) {\n writeError = `Failed to write child transcript '${input.transcriptPath}': ${errorMessage(error)}`;\n }\n };\n\n try {\n fs.mkdirSync(path.dirname(input.transcriptPath), { recursive: true });\n fs.writeFileSync(input.transcriptPath, '', 'utf-8');\n } catch (error) {\n writeError = `Failed to initialize child transcript '${input.transcriptPath}': ${errorMessage(error)}`;\n }\n\n const writeMessage = (sourceEventType: string, message: ChildTranscriptMessage) => {\n const text = extractTextFromContent(message.content);\n const usage = normalizeUsage(message.usage);\n if (message.role === 'toolResult') {\n const output = boundedPayload(text);\n writeRecord({\n ...baseRecord('message'),\n sourceEventType,\n role: message.role,\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n isError: message.isError,\n ...(output ? { text: output.text, outputTruncated: output.truncated } : {}),\n message: {\n role: message.role,\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n isError: message.isError,\n content: output ? [{ type: 'text', text: output.text }] : [],\n ...(message.timestamp !== undefined ? { timestamp: message.timestamp } : {}),\n },\n });\n return;\n }\n writeRecord({\n ...baseRecord('message'),\n sourceEventType,\n role: message.role,\n ...(text ? { text } : {}),\n ...(message.model ? { model: message.model } : {}),\n ...(message.stopReason ? { stopReason: message.stopReason } : {}),\n ...(message.errorMessage ? { errorMessage: message.errorMessage } : {}),\n ...(usage ? { usage } : {}),\n message,\n });\n };\n\n const writeStderrLine = (line: string) => {\n if (!line.trim()) return;\n writeRecord({ ...baseRecord('stderr'), text: line });\n };\n\n return {\n path: input.transcriptPath,\n writeInitialUserMessage(prompt: string) {\n writeRecord({\n ...baseRecord('message'),\n sourceEventType: 'initial_prompt',\n role: 'user',\n text: prompt,\n message: { role: 'user', content: [{ type: 'text', text: prompt }] },\n });\n },\n writeChildEvent(event: ChildTranscriptEvent) {\n if ((event.type === 'message_end' || event.type === 'tool_result_end') && event.message) {\n writeMessage(event.type, event.message);\n return;\n }\n if (event.type === 'tool_execution_start' && event.toolName) {\n const args = eventArgs(event);\n const argsPayload = boundedPayload(args);\n writeRecord({\n ...baseRecord('tool_start'),\n sourceEventType: event.type,\n ...(event.toolCallId ? { toolCallId: event.toolCallId } : {}),\n toolName: event.toolName,\n ...(Object.keys(args).length > 0 ? { argsPreview: extractToolArgsPreview(args) } : {}),\n ...(argsPayload ? { argsPayload: argsPayload.text } : {}),\n });\n return;\n }\n if (event.type === 'tool_execution_end') {\n writeRecord({\n ...baseRecord('tool_end'),\n sourceEventType: event.type,\n ...(event.toolCallId ? { toolCallId: event.toolCallId } : {}),\n ...(event.toolName ? { toolName: event.toolName } : {}),\n ...(typeof event.isError === 'boolean' ? { isError: event.isError } : {}),\n });\n }\n },\n writeStdoutLine(line: string) {\n if (!line.trim()) return;\n writeRecord({ ...baseRecord('stdout'), text: line });\n },\n writeStderrLine,\n writeStderrText(text: string) {\n for (const line of text.split(/\\r?\\n/)) writeStderrLine(line);\n },\n getError() {\n return writeError;\n },\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import{__esmMin as e}from"../../_virtual/_rolldown/runtime.mjs";import*as t from"node:fs";import*as n from"node:path";function r(e){return e instanceof Error?e.message:String(e)}function i(e){return typeof e==`number`&&Number.isFinite(e)?e:void 0}function a(e,t=y){let n;if(typeof e==`string`)n=e;else try{let t=JSON.stringify(e,null,S);if(t===void 0)return;n=t}catch{return}if(!n.trim())return;let r=Buffer.from(n,`utf-8`);if(r.length<=t)return{text:n,truncated:!1};let i=Buffer.byteLength(x,`utf-8`),a=Math.max(0,t-i);for(;a>0&&((r[a]??0)&C)===w;)a--;return{text:`${r.subarray(0,a).toString(`utf-8`)}${x}`,truncated:!0}}function o(e){if(!e||typeof e!=`object`)return;let t=e,n=t.cost,r=n&&typeof n==`object`?i(n.total)??0:i(n)??0;return{input:i(t.input)??i(t.inputTokens)??0,output:i(t.output)??i(t.outputTokens)??0,cacheRead:i(t.cacheRead)??0,cacheWrite:i(t.cacheWrite)??0,cost:r}}function s(e){if(e.role!==`assistant`||!e.usage||typeof e.usage!=`object`)return;let t=e.usage,n=i(t.totalTokens);if(n!==void 0)return n;let r=o(e.usage);if(r)return r.input+r.output+r.cacheRead+r.cacheWrite}function c(e){if(!(e.role!==`assistant`||!Array.isArray(e.content)))for(let t=e.content.length-1;t>=0;--t){let n=e.content[t];if(!n||typeof n!=`object`)continue;let r=n,i=(r.type===`thinking`&&typeof r.thinking==`string`?r.thinking:typeof r.text==`string`?r.text:void 0)?.replace(/\s+/g,` `).trim();if(i)return i.length<=A?`working: ${i}`:`working: …${i.slice(-(A-1))}`}}function l(e,t){return e.length>t?`${e.slice(0,t-3)}${T}`:e}function u(e){if(typeof e==`string`&&e.trim().length>0)return e;if(typeof e==`number`||typeof e==`boolean`)return String(e)}function d(e){if(!Array.isArray(e)||e.length===0)return;let t=u(e[0]);if(t)return`${t}${e.length>1?` (+${e.length-1} more)`:``}`}function f(e){if(typeof e.tool==`string`&&e.tool){let t=typeof e.server==`string`&&e.server?`${e.server}/`:``,n=typeof e.args==`string`&&e.args?` ${e.args.slice(0,k)}`:``;return`${t}${e.tool}${n}`}let t=d(e.queries);if(t)return l(t,E);if(typeof e.query==`string`&&e.query.trim().length>0)return l(e.query,E);if(typeof e.workflow==`string`&&e.workflow.trim().length>0)return`workflow=${l(e.workflow,O)}`;if(typeof e.url==`string`&&e.url.trim().length>0)return l(e.url,E);let n=d(e.urls);if(n)return l(n,E);if(typeof e.prompt==`string`&&e.prompt.trim().length>0)return l(e.prompt,E);for(let t of j){let n=e[t];if(typeof n==`string`&&n.length>0)return l(n,E)}for(let[t,n]of Object.entries(e)){let e=d(n);if(e)return`${t}=${l(e,D)}`;if(typeof n==`string`&&n.length>0)return`${t}=${l(n,D)}`}return``}function p(e,t){if(!t||typeof t!=`object`||Array.isArray(t))return e;let n=f(t);return n?`${e} (${n})`:e}function m(e){if(!e)return``;if(typeof e==`string`)return e;if(!Array.isArray(e))return``;let t=[];for(let n of e){if(!n||typeof n!=`object`)continue;let e=n;if(e.type===`text`&&`text`in e)t.push(String(e.text));else if(e.type===`tool_result`&&`content`in e){let n=m(e.content);n&&t.push(n)}else `text`in e&&t.push(String(e.text))}return t.join(`
2
+ `)}function h(e){return e.args&&typeof e.args==`object`&&!Array.isArray(e.args)?e.args:{}}function g(e){let i=0,s,c=!1,l=e.maxBytes??b,u=t=>{let n=Date.now();return{version:1,recordType:t,source:e.source,runId:e.runId,agent:e.agent,...e.childIndex===void 0?{}:{childIndex:e.childIndex},cwd:e.cwd,ts:n,timestamp:new Date(n).toISOString()}},d=()=>`${JSON.stringify({...u(`truncated`),maxBytes:l,message:`Child transcript exceeded ${l} bytes; further records were omitted.`})}\n`,p=Buffer.byteLength(d(),`utf-8`),g=()=>{c=!0;let n=d(),a=Buffer.byteLength(n,`utf-8`);if(!(i+a>l))try{t.appendFileSync(e.transcriptPath,n,`utf-8`),i+=a}catch(t){s=`Failed to write child transcript '${e.transcriptPath}': ${r(t)}`}},_=n=>{if(s||c)return;let a=`${JSON.stringify(n)}\n`,o=Buffer.byteLength(a,`utf-8`);if(i+o+p>l){g();return}try{t.appendFileSync(e.transcriptPath,a,`utf-8`),i+=o}catch(t){s=`Failed to write child transcript '${e.transcriptPath}': ${r(t)}`}};try{t.mkdirSync(n.dirname(e.transcriptPath),{recursive:!0}),t.writeFileSync(e.transcriptPath,``,`utf-8`)}catch(t){s=`Failed to initialize child transcript '${e.transcriptPath}': ${r(t)}`}let v=(e,t)=>{let n=m(t.content),r=o(t.usage);if(t.role===`toolResult`){let r=a(n);_({...u(`message`),sourceEventType:e,role:t.role,toolCallId:t.toolCallId,toolName:t.toolName,isError:t.isError,...r?{text:r.text,outputTruncated:r.truncated}:{},message:{role:t.role,toolCallId:t.toolCallId,toolName:t.toolName,isError:t.isError,content:r?[{type:`text`,text:r.text}]:[],...t.timestamp===void 0?{}:{timestamp:t.timestamp}}});return}_({...u(`message`),sourceEventType:e,role:t.role,...n?{text:n}:{},...t.model?{model:t.model}:{},...t.stopReason?{stopReason:t.stopReason}:{},...t.errorMessage?{errorMessage:t.errorMessage}:{},...r?{usage:r}:{},message:t})},y=e=>{e.trim()&&_({...u(`stderr`),text:e})};return{path:e.transcriptPath,writeInitialUserMessage(e){_({...u(`message`),sourceEventType:`initial_prompt`,role:`user`,text:e,message:{role:`user`,content:[{type:`text`,text:e}]}})},writeChildEvent(e){if((e.type===`message_end`||e.type===`tool_result_end`)&&e.message){v(e.type,e.message);return}if(e.type===`tool_execution_start`&&e.toolName){let t=h(e),n=a(t);_({...u(`tool_start`),sourceEventType:e.type,...e.toolCallId?{toolCallId:e.toolCallId}:{},toolName:e.toolName,...Object.keys(t).length>0?{argsPreview:f(t)}:{},...n?{argsPayload:n.text}:{}});return}e.type===`tool_execution_end`&&_({...u(`tool_end`),sourceEventType:e.type,...e.toolCallId?{toolCallId:e.toolCallId}:{},...e.toolName?{toolName:e.toolName}:{},...typeof e.isError==`boolean`?{isError:e.isError}:{}})},writeStdoutLine(e){e.trim()&&_({...u(`stdout`),text:e})},writeStderrLine:y,writeStderrText(e){for(let t of e.split(/\r?\n/))y(t)},getError(){return s}}}var _,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M=e((()=>{_=1024,v=1024*_,y=32*_,b=50*v,x=`
3
+
4
+ … payload truncated`,S=2,C=192,w=128,T=`...`,E=60,D=50,O=48,k=40,A=72,j=[`command`,`path`,`file_path`,`pattern`,`query`,`url`,`task`,`describe`,`search`]}));M();export{g as createChildTranscriptWriter,f as extractToolArgsPreview,p as formatToolActivity,c as getMessageActivity,s as getMessageUsageTokens,M as init_childTranscript};
5
+ //# sourceMappingURL=childTranscript.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"childTranscript.mjs","names":[],"sources":["../../../src/adapters/process/childTranscript.ts"],"sourcesContent":["/**\n * Append-only JSONL transcript of one child run, written by the parent.\n *\n * WHY THE PARENT WRITES ITS OWN:\n * The child's session transcript lives in the host agent's config directory and\n * is keyed by a session id the parent does not learn until the run ends. This\n * file is the parent's independent record: it exists from the first prompt, it\n * survives a child that never started, and it carries the stdout and stderr the\n * child's own transcript has no place for.\n *\n * DESIGN PATTERNS:\n * - Two independent byte budgets. Each tool payload is capped so one huge result\n * cannot consume the file, and the file itself is capped so a runaway child\n * cannot fill the disk\n * - The file budget reserves room for the truncation marker up front, so the\n * record that trips the limit is dropped in favour of a record explaining why\n * - Write failures latch into one reported error instead of throwing. This file\n * is evidence about a run, so losing it must never end the run it describes\n * - Truncation is carried as a flag beside the text. The predecessor rediscovered\n * it by searching the output for the marker substring, which any payload\n * quoting that phrase would have tripped\n *\n * PERFORMANCE:\n * The marker's byte size is measured once. Every field feeding it is fixed for\n * the writer's lifetime and both timestamps are fixed width, so the predecessor's\n * re-serialisation of the marker on every single record bought nothing.\n *\n * AVOID:\n * - Throwing from any writer method\n * - Cutting a payload mid-character; the cut walks back off UTF-8 continuation\n * bytes before slicing\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nexport const CHILD_TRANSCRIPT_ARTIFACT_VERSION = 1;\n\nconst BYTES_PER_KIB = 1024;\nconst BYTES_PER_MIB = 1024 * BYTES_PER_KIB;\nconst MAX_TOOL_PAYLOAD_BYTES = 32 * BYTES_PER_KIB;\nconst DEFAULT_MAX_CHILD_TRANSCRIPT_BYTES = 50 * BYTES_PER_MIB;\nconst TOOL_PAYLOAD_TRUNCATION_MARKER = '\\n\\n… payload truncated';\nconst JSON_INDENT = 2;\n\n/** High bits identifying a UTF-8 continuation byte (10xxxxxx). */\nconst UTF8_CONTINUATION_MASK = 0xc0;\nconst UTF8_CONTINUATION_BITS = 0x80;\n\nconst PREVIEW_ELLIPSIS = '...';\nconst PREVIEW_MAX_LENGTH = 60;\nconst FALLBACK_PREVIEW_MAX_LENGTH = 50;\nconst WORKFLOW_PREVIEW_MAX_LENGTH = 48;\nconst MCP_ARGS_PREVIEW_MAX_LENGTH = 40;\nconst LIVE_ACTIVITY_MAX_LENGTH = 72;\n\n/** Argument keys worth previewing verbatim, in the order they are preferred. */\nconst PREVIEW_KEYS = ['command', 'path', 'file_path', 'pattern', 'query', 'url', 'task', 'describe', 'search'] as const;\n\n/**\n * Which execution path produced the records in a file.\n *\n * Only background runs exist, so this is single-valued today. It is still\n * written into every record because the file is read by tools that must be able\n * to tell what produced it without being told out of band, and because a second\n * variant is cheaper to add than to retrofit onto files already on disk.\n */\nexport type ChildTranscriptSource = 'async';\n\nexport type ChildTranscriptRecordType = 'message' | 'tool_start' | 'tool_end' | 'stdout' | 'stderr' | 'truncated';\n\n/**\n * The message fields this transcript records.\n *\n * Declared structurally rather than imported from the host agent's message type:\n * the writer only reads these fields, and a shared leaf should not take on an\n * optional peer dependency to describe them.\n */\nexport interface ChildTranscriptMessage {\n role: string;\n content?: unknown;\n toolCallId?: string;\n toolName?: string;\n isError?: boolean;\n timestamp?: unknown;\n model?: string;\n errorMessage?: string;\n stopReason?: string;\n usage?: unknown;\n}\n\nexport interface ChildTranscriptEvent {\n type?: string;\n message?: ChildTranscriptMessage;\n toolCallId?: string;\n toolName?: string;\n args?: unknown;\n isError?: boolean;\n}\n\nexport interface ChildTranscriptWriterInput {\n transcriptPath: string;\n source: ChildTranscriptSource;\n runId: string;\n agent: string;\n childIndex?: number;\n cwd: string;\n maxBytes?: number;\n}\n\nexport interface ChildTranscriptWriter {\n path: string;\n writeInitialUserMessage(prompt: string): void;\n writeChildEvent(event: ChildTranscriptEvent): void;\n writeStdoutLine(line: string): void;\n writeStderrLine(line: string): void;\n writeStderrText(text: string): void;\n getError(): string | undefined;\n}\n\ninterface BoundedPayload {\n text: string;\n truncated: boolean;\n}\n\ninterface NormalizedUsage {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: number;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction finiteNumber(value: unknown): number | undefined {\n return typeof value === 'number' && Number.isFinite(value) ? value : undefined;\n}\n\n/**\n * Render `value` as text no larger than `maxBytes`, or undefined if it carries\n * nothing worth recording.\n *\n * A value that cannot be serialised (a cycle, a BigInt) is dropped rather than\n * reported, because a tool payload is context and not part of the run's result.\n */\nfunction boundedPayload(value: unknown, maxBytes = MAX_TOOL_PAYLOAD_BYTES): BoundedPayload | undefined {\n let text: string;\n if (typeof value === 'string') {\n text = value;\n } else {\n try {\n const serialized = JSON.stringify(value, null, JSON_INDENT);\n if (serialized === undefined) return undefined;\n text = serialized;\n } catch {\n // Cyclic or non-serialisable payloads have no textual form to record.\n return undefined;\n }\n }\n if (!text.trim()) return undefined;\n\n const payload = Buffer.from(text, 'utf-8');\n if (payload.length <= maxBytes) return { text, truncated: false };\n\n const markerBytes = Buffer.byteLength(TOOL_PAYLOAD_TRUNCATION_MARKER, 'utf-8');\n let end = Math.max(0, maxBytes - markerBytes);\n // Back off any continuation bytes so the cut lands on a character boundary.\n while (end > 0 && ((payload[end] ?? 0) & UTF8_CONTINUATION_MASK) === UTF8_CONTINUATION_BITS) end--;\n return {\n text: `${payload.subarray(0, end).toString('utf-8')}${TOOL_PAYLOAD_TRUNCATION_MARKER}`,\n truncated: true,\n };\n}\n\n/**\n * Read a child's usage counters, tolerating both field namings the host has used.\n *\n * Cost arrives either as a number or as an object with a `total`, so both are\n * accepted; anything else counts as zero rather than as missing, because a run\n * with unreadable cost still has a real elapsed usage record.\n */\nfunction normalizeUsage(value: unknown): NormalizedUsage | undefined {\n if (!value || typeof value !== 'object') return undefined;\n const raw = value as Record<string, unknown>;\n const rawCost = raw.cost;\n const cost =\n rawCost && typeof rawCost === 'object'\n ? (finiteNumber((rawCost as { total?: unknown }).total) ?? 0)\n : (finiteNumber(rawCost) ?? 0);\n return {\n input: finiteNumber(raw.input) ?? finiteNumber(raw.inputTokens) ?? 0,\n output: finiteNumber(raw.output) ?? finiteNumber(raw.outputTokens) ?? 0,\n cacheRead: finiteNumber(raw.cacheRead) ?? 0,\n cacheWrite: finiteNumber(raw.cacheWrite) ?? 0,\n cost,\n };\n}\n\n/**\n * Return the token total observed on one finalized child message.\n *\n * Missing usage means that this message carried no observation and therefore\n * returns undefined. An actual usage object with empty or zero buckets returns\n * zero, which is a meaningful observation for live progress.\n */\nexport function getMessageUsageTokens(message: ChildTranscriptMessage): number | undefined {\n if (message.role !== 'assistant' || !message.usage || typeof message.usage !== 'object') return undefined;\n const raw = message.usage as Record<string, unknown>;\n const totalTokens = finiteNumber(raw.totalTokens);\n if (totalTokens !== undefined) return totalTokens;\n\n const usage = normalizeUsage(message.usage);\n if (!usage) return undefined;\n return usage.input + usage.output + usage.cacheRead + usage.cacheWrite;\n}\n\n/**\n * A bounded tail of the assistant's current streamed text/thinking.\n *\n * The tail changes as the model streams, so a parent can show what the child is\n * doing between tool calls instead of leaving the last tool frozen on screen.\n */\nexport function getMessageActivity(message: ChildTranscriptMessage): string | undefined {\n if (message.role !== 'assistant' || !Array.isArray(message.content)) return undefined;\n for (let index = message.content.length - 1; index >= 0; index -= 1) {\n const block = message.content[index];\n if (!block || typeof block !== 'object') continue;\n const record = block as Record<string, unknown>;\n const raw =\n record.type === 'thinking' && typeof record.thinking === 'string'\n ? record.thinking\n : typeof record.text === 'string'\n ? record.text\n : undefined;\n const activity = raw?.replace(/\\s+/g, ' ').trim();\n if (!activity) continue;\n if (activity.length <= LIVE_ACTIVITY_MAX_LENGTH) return `working: ${activity}`;\n return `working: …${activity.slice(-(LIVE_ACTIVITY_MAX_LENGTH - 1))}`;\n }\n return undefined;\n}\n\nfunction truncatePreview(value: string, maxLength: number): string {\n return value.length > maxLength ? `${value.slice(0, maxLength - PREVIEW_ELLIPSIS.length)}${PREVIEW_ELLIPSIS}` : value;\n}\n\nfunction stringifyPreviewValue(value: unknown): string | undefined {\n if (typeof value === 'string' && value.trim().length > 0) return value;\n if (typeof value === 'number' || typeof value === 'boolean') return String(value);\n return undefined;\n}\n\nfunction previewArray(value: unknown): string | undefined {\n if (!Array.isArray(value) || value.length === 0) return undefined;\n const first = stringifyPreviewValue(value[0]);\n if (!first) return undefined;\n const suffix = value.length > 1 ? ` (+${value.length - 1} more)` : '';\n return `${first}${suffix}`;\n}\n\n/**\n * One short line describing what a tool call was asked to do.\n *\n * The ladder is ordered by how much the key tells a reader, not alphabetically:\n * an MCP call is named by server and tool, a search by its query, and everything\n * else falls back to the first stringable argument so the line is never empty\n * when the call had any arguments at all.\n */\nexport function extractToolArgsPreview(args: Record<string, unknown>): string {\n if (typeof args.tool === 'string' && args.tool) {\n const server = typeof args.server === 'string' && args.server ? `${args.server}/` : '';\n const toolArgs =\n typeof args.args === 'string' && args.args ? ` ${args.args.slice(0, MCP_ARGS_PREVIEW_MAX_LENGTH)}` : '';\n return `${server}${args.tool}${toolArgs}`;\n }\n\n const queriesPreview = previewArray(args.queries);\n if (queriesPreview) return truncatePreview(queriesPreview, PREVIEW_MAX_LENGTH);\n if (typeof args.query === 'string' && args.query.trim().length > 0) {\n return truncatePreview(args.query, PREVIEW_MAX_LENGTH);\n }\n if (typeof args.workflow === 'string' && args.workflow.trim().length > 0) {\n return `workflow=${truncatePreview(args.workflow, WORKFLOW_PREVIEW_MAX_LENGTH)}`;\n }\n if (typeof args.url === 'string' && args.url.trim().length > 0) return truncatePreview(args.url, PREVIEW_MAX_LENGTH);\n const urlsPreview = previewArray(args.urls);\n if (urlsPreview) return truncatePreview(urlsPreview, PREVIEW_MAX_LENGTH);\n if (typeof args.prompt === 'string' && args.prompt.trim().length > 0) {\n return truncatePreview(args.prompt, PREVIEW_MAX_LENGTH);\n }\n\n for (const key of PREVIEW_KEYS) {\n const value = args[key];\n if (typeof value === 'string' && value.length > 0) return truncatePreview(value, PREVIEW_MAX_LENGTH);\n }\n\n for (const [key, value] of Object.entries(args)) {\n const arrayPreview = previewArray(value);\n if (arrayPreview) return `${key}=${truncatePreview(arrayPreview, FALLBACK_PREVIEW_MAX_LENGTH)}`;\n if (typeof value === 'string' && value.length > 0) {\n return `${key}=${truncatePreview(value, FALLBACK_PREVIEW_MAX_LENGTH)}`;\n }\n }\n return '';\n}\n\n/** A compact description of a live tool call for the parent task trail. */\nexport function formatToolActivity(toolName: string, args: unknown): string {\n if (!args || typeof args !== 'object' || Array.isArray(args)) return toolName;\n const preview = extractToolArgsPreview(args as Record<string, unknown>);\n return preview ? `${toolName} (${preview})` : toolName;\n}\n\n/**\n * Flatten a message's content into plain text.\n *\n * Content arrives as unknown JSON in four shapes the host has used over time, so\n * every hop is checked. Anything unrecognised contributes nothing rather than\n * being stringified, which would put `[object Object]` into the transcript.\n */\nfunction extractTextFromContent(content: unknown): string {\n if (!content) return '';\n if (typeof content === 'string') return content;\n if (!Array.isArray(content)) return '';\n\n const texts: string[] = [];\n for (const part of content) {\n if (!part || typeof part !== 'object') continue;\n const record = part as Record<string, unknown>;\n if (record.type === 'text' && 'text' in record) {\n texts.push(String(record.text));\n } else if (record.type === 'tool_result' && 'content' in record) {\n const inner = extractTextFromContent(record.content);\n if (inner) texts.push(inner);\n } else if ('text' in record) {\n texts.push(String(record.text));\n }\n }\n return texts.join('\\n');\n}\n\nfunction eventArgs(event: ChildTranscriptEvent): Record<string, unknown> {\n return event.args && typeof event.args === 'object' && !Array.isArray(event.args)\n ? (event.args as Record<string, unknown>)\n : {};\n}\n\nexport function createChildTranscriptWriter(input: ChildTranscriptWriterInput): ChildTranscriptWriter {\n let bytesWritten = 0;\n let writeError: string | undefined;\n let truncated = false;\n const maxBytes = input.maxBytes ?? DEFAULT_MAX_CHILD_TRANSCRIPT_BYTES;\n\n const baseRecord = (recordType: ChildTranscriptRecordType) => {\n const ts = Date.now();\n return {\n version: CHILD_TRANSCRIPT_ARTIFACT_VERSION,\n recordType,\n source: input.source,\n runId: input.runId,\n agent: input.agent,\n ...(input.childIndex !== undefined ? { childIndex: input.childIndex } : {}),\n cwd: input.cwd,\n ts,\n timestamp: new Date(ts).toISOString(),\n };\n };\n\n const truncationMarkerLine = (): string =>\n `${JSON.stringify({\n ...baseRecord('truncated'),\n maxBytes,\n message: `Child transcript exceeded ${maxBytes} bytes; further records were omitted.`,\n })}\\n`;\n\n // Fixed for this writer: every field is constant except the two timestamps,\n // which are fixed width. Measuring once is why writeRecord stays allocation-free.\n const reservedMarkerBytes = Buffer.byteLength(truncationMarkerLine(), 'utf-8');\n\n const writeTruncatedMarker = () => {\n truncated = true;\n const marker = truncationMarkerLine();\n const markerBytes = Buffer.byteLength(marker, 'utf-8');\n if (bytesWritten + markerBytes > maxBytes) return;\n try {\n fs.appendFileSync(input.transcriptPath, marker, 'utf-8');\n bytesWritten += markerBytes;\n } catch (error) {\n writeError = `Failed to write child transcript '${input.transcriptPath}': ${errorMessage(error)}`;\n }\n };\n\n const writeRecord = (record: Record<string, unknown>) => {\n if (writeError || truncated) return;\n const line = `${JSON.stringify(record)}\\n`;\n const bytes = Buffer.byteLength(line, 'utf-8');\n // The marker's room is reserved, so the file can always state why it ended.\n if (bytesWritten + bytes + reservedMarkerBytes > maxBytes) {\n writeTruncatedMarker();\n return;\n }\n try {\n fs.appendFileSync(input.transcriptPath, line, 'utf-8');\n bytesWritten += bytes;\n } catch (error) {\n writeError = `Failed to write child transcript '${input.transcriptPath}': ${errorMessage(error)}`;\n }\n };\n\n try {\n fs.mkdirSync(path.dirname(input.transcriptPath), { recursive: true });\n fs.writeFileSync(input.transcriptPath, '', 'utf-8');\n } catch (error) {\n writeError = `Failed to initialize child transcript '${input.transcriptPath}': ${errorMessage(error)}`;\n }\n\n const writeMessage = (sourceEventType: string, message: ChildTranscriptMessage) => {\n const text = extractTextFromContent(message.content);\n const usage = normalizeUsage(message.usage);\n if (message.role === 'toolResult') {\n const output = boundedPayload(text);\n writeRecord({\n ...baseRecord('message'),\n sourceEventType,\n role: message.role,\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n isError: message.isError,\n ...(output ? { text: output.text, outputTruncated: output.truncated } : {}),\n message: {\n role: message.role,\n toolCallId: message.toolCallId,\n toolName: message.toolName,\n isError: message.isError,\n content: output ? [{ type: 'text', text: output.text }] : [],\n ...(message.timestamp !== undefined ? { timestamp: message.timestamp } : {}),\n },\n });\n return;\n }\n writeRecord({\n ...baseRecord('message'),\n sourceEventType,\n role: message.role,\n ...(text ? { text } : {}),\n ...(message.model ? { model: message.model } : {}),\n ...(message.stopReason ? { stopReason: message.stopReason } : {}),\n ...(message.errorMessage ? { errorMessage: message.errorMessage } : {}),\n ...(usage ? { usage } : {}),\n message,\n });\n };\n\n const writeStderrLine = (line: string) => {\n if (!line.trim()) return;\n writeRecord({ ...baseRecord('stderr'), text: line });\n };\n\n return {\n path: input.transcriptPath,\n writeInitialUserMessage(prompt: string) {\n writeRecord({\n ...baseRecord('message'),\n sourceEventType: 'initial_prompt',\n role: 'user',\n text: prompt,\n message: { role: 'user', content: [{ type: 'text', text: prompt }] },\n });\n },\n writeChildEvent(event: ChildTranscriptEvent) {\n if ((event.type === 'message_end' || event.type === 'tool_result_end') && event.message) {\n writeMessage(event.type, event.message);\n return;\n }\n if (event.type === 'tool_execution_start' && event.toolName) {\n const args = eventArgs(event);\n const argsPayload = boundedPayload(args);\n writeRecord({\n ...baseRecord('tool_start'),\n sourceEventType: event.type,\n ...(event.toolCallId ? { toolCallId: event.toolCallId } : {}),\n toolName: event.toolName,\n ...(Object.keys(args).length > 0 ? { argsPreview: extractToolArgsPreview(args) } : {}),\n ...(argsPayload ? { argsPayload: argsPayload.text } : {}),\n });\n return;\n }\n if (event.type === 'tool_execution_end') {\n writeRecord({\n ...baseRecord('tool_end'),\n sourceEventType: event.type,\n ...(event.toolCallId ? { toolCallId: event.toolCallId } : {}),\n ...(event.toolName ? { toolName: event.toolName } : {}),\n ...(typeof event.isError === 'boolean' ? { isError: event.isError } : {}),\n });\n }\n },\n writeStdoutLine(line: string) {\n if (!line.trim()) return;\n writeRecord({ ...baseRecord('stdout'), text: line });\n },\n writeStderrLine,\n writeStderrText(text: string) {\n for (const line of text.split(/\\r?\\n/)) writeStderrLine(line);\n },\n getError() {\n return writeError;\n },\n };\n}\n"],"mappings":"sHAqIA,SAAS,EAAa,EAAwB,CAC5C,OAAO,aAAiB,MAAQ,EAAM,QAAU,OAAO,EAAM,CAG/D,SAAS,EAAa,EAAoC,CACxD,OAAO,OAAO,GAAU,UAAY,OAAO,SAAS,EAAM,CAAG,EAAQ,IAAA,GAUvE,SAAS,EAAe,EAAgB,EAAW,EAAoD,CACrG,IAAI,EACJ,GAAI,OAAO,GAAU,SACnB,EAAO,OAEP,GAAI,CACF,IAAM,EAAa,KAAK,UAAU,EAAO,KAAM,EAAY,CAC3D,GAAI,IAAe,IAAA,GAAW,OAC9B,EAAO,OACD,CAEN,OAGJ,GAAI,CAAC,EAAK,MAAM,CAAE,OAElB,IAAM,EAAU,OAAO,KAAK,EAAM,QAAQ,CAC1C,GAAI,EAAQ,QAAU,EAAU,MAAO,CAAE,OAAM,UAAW,GAAO,CAEjE,IAAM,EAAc,OAAO,WAAW,EAAgC,QAAQ,CAC1E,EAAM,KAAK,IAAI,EAAG,EAAW,EAAY,CAE7C,KAAO,EAAM,KAAO,EAAQ,IAAQ,GAAK,KAA4B,GAAwB,IAC7F,MAAO,CACL,KAAM,GAAG,EAAQ,SAAS,EAAG,EAAI,CAAC,SAAS,QAAQ,GAAG,IACtD,UAAW,GACZ,CAUH,SAAS,EAAe,EAA6C,CACnE,GAAI,CAAC,GAAS,OAAO,GAAU,SAAU,OACzC,IAAM,EAAM,EACN,EAAU,EAAI,KACd,EACJ,GAAW,OAAO,GAAY,SACzB,EAAc,EAAgC,MAAM,EAAI,EACxD,EAAa,EAAQ,EAAI,EAChC,MAAO,CACL,MAAO,EAAa,EAAI,MAAM,EAAI,EAAa,EAAI,YAAY,EAAI,EACnE,OAAQ,EAAa,EAAI,OAAO,EAAI,EAAa,EAAI,aAAa,EAAI,EACtE,UAAW,EAAa,EAAI,UAAU,EAAI,EAC1C,WAAY,EAAa,EAAI,WAAW,EAAI,EAC5C,OACD,CAUH,SAAgB,EAAsB,EAAqD,CACzF,GAAI,EAAQ,OAAS,aAAe,CAAC,EAAQ,OAAS,OAAO,EAAQ,OAAU,SAAU,OACzF,IAAM,EAAM,EAAQ,MACd,EAAc,EAAa,EAAI,YAAY,CACjD,GAAI,IAAgB,IAAA,GAAW,OAAO,EAEtC,IAAM,EAAQ,EAAe,EAAQ,MAAM,CACtC,KACL,OAAO,EAAM,MAAQ,EAAM,OAAS,EAAM,UAAY,EAAM,WAS9D,SAAgB,EAAmB,EAAqD,CAClF,OAAQ,OAAS,aAAe,CAAC,MAAM,QAAQ,EAAQ,QAAQ,EACnE,IAAK,IAAI,EAAQ,EAAQ,QAAQ,OAAS,EAAG,GAAS,EAAG,IAAY,CACnE,IAAM,EAAQ,EAAQ,QAAQ,GAC9B,GAAI,CAAC,GAAS,OAAO,GAAU,SAAU,SACzC,IAAM,EAAS,EAOT,GALJ,EAAO,OAAS,YAAc,OAAO,EAAO,UAAa,SACrD,EAAO,SACP,OAAO,EAAO,MAAS,SACrB,EAAO,KACP,IAAA,KACc,QAAQ,OAAQ,IAAI,CAAC,MAAM,CAC5C,KAEL,OADI,EAAS,QAAU,EAAiC,YAAY,IAC7D,aAAa,EAAS,MAAM,EAAE,EAA2B,GAAG,IAKvE,SAAS,EAAgB,EAAe,EAA2B,CACjE,OAAO,EAAM,OAAS,EAAY,GAAG,EAAM,MAAM,EAAG,EAAY,EAAwB,GAAG,IAAqB,EAGlH,SAAS,EAAsB,EAAoC,CACjE,GAAI,OAAO,GAAU,UAAY,EAAM,MAAM,CAAC,OAAS,EAAG,OAAO,EACjE,GAAI,OAAO,GAAU,UAAY,OAAO,GAAU,UAAW,OAAO,OAAO,EAAM,CAInF,SAAS,EAAa,EAAoC,CACxD,GAAI,CAAC,MAAM,QAAQ,EAAM,EAAI,EAAM,SAAW,EAAG,OACjD,IAAM,EAAQ,EAAsB,EAAM,GAAG,CACxC,KAEL,MAAO,GAAG,IADK,EAAM,OAAS,EAAI,MAAM,EAAM,OAAS,EAAE,QAAU,KAYrE,SAAgB,EAAuB,EAAuC,CAC5E,GAAI,OAAO,EAAK,MAAS,UAAY,EAAK,KAAM,CAC9C,IAAM,EAAS,OAAO,EAAK,QAAW,UAAY,EAAK,OAAS,GAAG,EAAK,OAAO,GAAK,GAC9E,EACJ,OAAO,EAAK,MAAS,UAAY,EAAK,KAAO,IAAI,EAAK,KAAK,MAAM,EAAG,EAA4B,GAAK,GACvG,MAAO,GAAG,IAAS,EAAK,OAAO,IAGjC,IAAM,EAAiB,EAAa,EAAK,QAAQ,CACjD,GAAI,EAAgB,OAAO,EAAgB,EAAgB,EAAmB,CAC9E,GAAI,OAAO,EAAK,OAAU,UAAY,EAAK,MAAM,MAAM,CAAC,OAAS,EAC/D,OAAO,EAAgB,EAAK,MAAO,EAAmB,CAExD,GAAI,OAAO,EAAK,UAAa,UAAY,EAAK,SAAS,MAAM,CAAC,OAAS,EACrE,MAAO,YAAY,EAAgB,EAAK,SAAU,EAA4B,GAEhF,GAAI,OAAO,EAAK,KAAQ,UAAY,EAAK,IAAI,MAAM,CAAC,OAAS,EAAG,OAAO,EAAgB,EAAK,IAAK,EAAmB,CACpH,IAAM,EAAc,EAAa,EAAK,KAAK,CAC3C,GAAI,EAAa,OAAO,EAAgB,EAAa,EAAmB,CACxE,GAAI,OAAO,EAAK,QAAW,UAAY,EAAK,OAAO,MAAM,CAAC,OAAS,EACjE,OAAO,EAAgB,EAAK,OAAQ,EAAmB,CAGzD,IAAK,IAAM,KAAO,EAAc,CAC9B,IAAM,EAAQ,EAAK,GACnB,GAAI,OAAO,GAAU,UAAY,EAAM,OAAS,EAAG,OAAO,EAAgB,EAAO,EAAmB,CAGtG,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,EAAK,CAAE,CAC/C,IAAM,EAAe,EAAa,EAAM,CACxC,GAAI,EAAc,MAAO,GAAG,EAAI,GAAG,EAAgB,EAAc,EAA4B,GAC7F,GAAI,OAAO,GAAU,UAAY,EAAM,OAAS,EAC9C,MAAO,GAAG,EAAI,GAAG,EAAgB,EAAO,EAA4B,GAGxE,MAAO,GAIT,SAAgB,EAAmB,EAAkB,EAAuB,CAC1E,GAAI,CAAC,GAAQ,OAAO,GAAS,UAAY,MAAM,QAAQ,EAAK,CAAE,OAAO,EACrE,IAAM,EAAU,EAAuB,EAAgC,CACvE,OAAO,EAAU,GAAG,EAAS,IAAI,EAAQ,GAAK,EAUhD,SAAS,EAAuB,EAA0B,CACxD,GAAI,CAAC,EAAS,MAAO,GACrB,GAAI,OAAO,GAAY,SAAU,OAAO,EACxC,GAAI,CAAC,MAAM,QAAQ,EAAQ,CAAE,MAAO,GAEpC,IAAM,EAAkB,EAAE,CAC1B,IAAK,IAAM,KAAQ,EAAS,CAC1B,GAAI,CAAC,GAAQ,OAAO,GAAS,SAAU,SACvC,IAAM,EAAS,EACf,GAAI,EAAO,OAAS,QAAU,SAAU,EACtC,EAAM,KAAK,OAAO,EAAO,KAAK,CAAC,SACtB,EAAO,OAAS,eAAiB,YAAa,EAAQ,CAC/D,IAAM,EAAQ,EAAuB,EAAO,QAAQ,CAChD,GAAO,EAAM,KAAK,EAAM,MACnB,SAAU,GACnB,EAAM,KAAK,OAAO,EAAO,KAAK,CAAC,CAGnC,OAAO,EAAM,KAAK;EAAK,CAGzB,SAAS,EAAU,EAAsD,CACvE,OAAO,EAAM,MAAQ,OAAO,EAAM,MAAS,UAAY,CAAC,MAAM,QAAQ,EAAM,KAAK,CAC5E,EAAM,KACP,EAAE,CAGR,SAAgB,EAA4B,EAA0D,CACpG,IAAI,EAAe,EACf,EACA,EAAY,GACV,EAAW,EAAM,UAAY,EAE7B,EAAc,GAA0C,CAC5D,IAAM,EAAK,KAAK,KAAK,CACrB,MAAO,CACL,QAAA,EACA,aACA,OAAQ,EAAM,OACd,MAAO,EAAM,MACb,MAAO,EAAM,MACb,GAAI,EAAM,aAAe,IAAA,GAA+C,EAAE,CAArC,CAAE,WAAY,EAAM,WAAY,CACrE,IAAK,EAAM,IACX,KACA,UAAW,IAAI,KAAK,EAAG,CAAC,aAAa,CACtC,EAGG,MACJ,GAAG,KAAK,UAAU,CAChB,GAAG,EAAW,YAAY,CAC1B,WACA,QAAS,6BAA6B,EAAS,uCAChD,CAAC,CAAC,IAIC,EAAsB,OAAO,WAAW,GAAsB,CAAE,QAAQ,CAExE,MAA6B,CACjC,EAAY,GACZ,IAAM,EAAS,GAAsB,CAC/B,EAAc,OAAO,WAAW,EAAQ,QAAQ,CAClD,OAAe,EAAc,GACjC,GAAI,CACF,EAAG,eAAe,EAAM,eAAgB,EAAQ,QAAQ,CACxD,GAAgB,QACT,EAAO,CACd,EAAa,qCAAqC,EAAM,eAAe,KAAK,EAAa,EAAM,KAI7F,EAAe,GAAoC,CACvD,GAAI,GAAc,EAAW,OAC7B,IAAM,EAAO,GAAG,KAAK,UAAU,EAAO,CAAC,IACjC,EAAQ,OAAO,WAAW,EAAM,QAAQ,CAE9C,GAAI,EAAe,EAAQ,EAAsB,EAAU,CACzD,GAAsB,CACtB,OAEF,GAAI,CACF,EAAG,eAAe,EAAM,eAAgB,EAAM,QAAQ,CACtD,GAAgB,QACT,EAAO,CACd,EAAa,qCAAqC,EAAM,eAAe,KAAK,EAAa,EAAM,KAInG,GAAI,CACF,EAAG,UAAU,EAAK,QAAQ,EAAM,eAAe,CAAE,CAAE,UAAW,GAAM,CAAC,CACrE,EAAG,cAAc,EAAM,eAAgB,GAAI,QAAQ,OAC5C,EAAO,CACd,EAAa,0CAA0C,EAAM,eAAe,KAAK,EAAa,EAAM,GAGtG,IAAM,GAAgB,EAAyB,IAAoC,CACjF,IAAM,EAAO,EAAuB,EAAQ,QAAQ,CAC9C,EAAQ,EAAe,EAAQ,MAAM,CAC3C,GAAI,EAAQ,OAAS,aAAc,CACjC,IAAM,EAAS,EAAe,EAAK,CACnC,EAAY,CACV,GAAG,EAAW,UAAU,CACxB,kBACA,KAAM,EAAQ,KACd,WAAY,EAAQ,WACpB,SAAU,EAAQ,SAClB,QAAS,EAAQ,QACjB,GAAI,EAAS,CAAE,KAAM,EAAO,KAAM,gBAAiB,EAAO,UAAW,CAAG,EAAE,CAC1E,QAAS,CACP,KAAM,EAAQ,KACd,WAAY,EAAQ,WACpB,SAAU,EAAQ,SAClB,QAAS,EAAQ,QACjB,QAAS,EAAS,CAAC,CAAE,KAAM,OAAQ,KAAM,EAAO,KAAM,CAAC,CAAG,EAAE,CAC5D,GAAI,EAAQ,YAAc,IAAA,GAA+C,EAAE,CAArC,CAAE,UAAW,EAAQ,UAAW,CACvE,CACF,CAAC,CACF,OAEF,EAAY,CACV,GAAG,EAAW,UAAU,CACxB,kBACA,KAAM,EAAQ,KACd,GAAI,EAAO,CAAE,OAAM,CAAG,EAAE,CACxB,GAAI,EAAQ,MAAQ,CAAE,MAAO,EAAQ,MAAO,CAAG,EAAE,CACjD,GAAI,EAAQ,WAAa,CAAE,WAAY,EAAQ,WAAY,CAAG,EAAE,CAChE,GAAI,EAAQ,aAAe,CAAE,aAAc,EAAQ,aAAc,CAAG,EAAE,CACtE,GAAI,EAAQ,CAAE,QAAO,CAAG,EAAE,CAC1B,UACD,CAAC,EAGE,EAAmB,GAAiB,CACnC,EAAK,MAAM,EAChB,EAAY,CAAE,GAAG,EAAW,SAAS,CAAE,KAAM,EAAM,CAAC,EAGtD,MAAO,CACL,KAAM,EAAM,eACZ,wBAAwB,EAAgB,CACtC,EAAY,CACV,GAAG,EAAW,UAAU,CACxB,gBAAiB,iBACjB,KAAM,OACN,KAAM,EACN,QAAS,CAAE,KAAM,OAAQ,QAAS,CAAC,CAAE,KAAM,OAAQ,KAAM,EAAQ,CAAC,CAAE,CACrE,CAAC,EAEJ,gBAAgB,EAA6B,CAC3C,IAAK,EAAM,OAAS,eAAiB,EAAM,OAAS,oBAAsB,EAAM,QAAS,CACvF,EAAa,EAAM,KAAM,EAAM,QAAQ,CACvC,OAEF,GAAI,EAAM,OAAS,wBAA0B,EAAM,SAAU,CAC3D,IAAM,EAAO,EAAU,EAAM,CACvB,EAAc,EAAe,EAAK,CACxC,EAAY,CACV,GAAG,EAAW,aAAa,CAC3B,gBAAiB,EAAM,KACvB,GAAI,EAAM,WAAa,CAAE,WAAY,EAAM,WAAY,CAAG,EAAE,CAC5D,SAAU,EAAM,SAChB,GAAI,OAAO,KAAK,EAAK,CAAC,OAAS,EAAI,CAAE,YAAa,EAAuB,EAAK,CAAE,CAAG,EAAE,CACrF,GAAI,EAAc,CAAE,YAAa,EAAY,KAAM,CAAG,EAAE,CACzD,CAAC,CACF,OAEE,EAAM,OAAS,sBACjB,EAAY,CACV,GAAG,EAAW,WAAW,CACzB,gBAAiB,EAAM,KACvB,GAAI,EAAM,WAAa,CAAE,WAAY,EAAM,WAAY,CAAG,EAAE,CAC5D,GAAI,EAAM,SAAW,CAAE,SAAU,EAAM,SAAU,CAAG,EAAE,CACtD,GAAI,OAAO,EAAM,SAAY,UAAY,CAAE,QAAS,EAAM,QAAS,CAAG,EAAE,CACzE,CAAC,EAGN,gBAAgB,EAAc,CACvB,EAAK,MAAM,EAChB,EAAY,CAAE,GAAG,EAAW,SAAS,CAAE,KAAM,EAAM,CAAC,EAEtD,kBACA,gBAAgB,EAAc,CAC5B,IAAK,IAAM,KAAQ,EAAK,MAAM,QAAQ,CAAE,EAAgB,EAAK,EAE/D,UAAW,CACT,OAAO,GAEV,6CAzdG,EAAgB,KAChB,EAAgB,KAAO,EACvB,EAAyB,GAAK,EAC9B,EAAqC,GAAK,EAC1C,EAAiC;;qBACjC,EAAc,EAGd,EAAyB,IACzB,EAAyB,IAEzB,EAAmB,MACnB,EAAqB,GACrB,EAA8B,GAC9B,EAA8B,GAC9B,EAA8B,GAC9B,EAA2B,GAG3B,EAAe,CAAC,UAAW,OAAQ,YAAa,UAAW,QAAS,MAAO,OAAQ,WAAY,SAAS"}
@@ -0,0 +1,2 @@
1
+ require(`../../_virtual/_rolldown/runtime.cjs`),require(`@agimon-ai/doompi-extension-contracts/child-process`);function e(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?[...new Set(t.filter(e=>typeof e==`number`&&Number.isSafeInteger(e)&&e>1))]:[]}catch{return[]}}function t(e){return`DOOM_TEAM_${e.toUpperCase().replace(/[^A-Z0-9]+/g,`_`)}_BIN`}exports.CHILD_TOOL_DIAGNOSTIC_PATH_ENV=`PI_SUBAGENT_TOOL_DIAGNOSTIC_PATH`,exports.DOOMPI_CHILD_EXTENSIONS_ENV=`DOOMPI_CHILD_EXTENSIONS`,exports.DOOMPI_SKILL_DIRS_ENV=`DOOMPI_SKILL_DIRS`,exports.EXTRA_AGENT_DIRS_ENV=`PI_SUBAGENT_EXTRA_AGENT_DIRS`,exports.EXTRA_SKILL_DIRS_ENV=`PI_SUBAGENT_EXTRA_SKILL_DIRS`,exports.INHERIT_PROJECT_CONTEXT_ENV=`PI_SUBAGENT_INHERIT_PROJECT_CONTEXT`,exports.INHERIT_SKILLS_ENV=`PI_SUBAGENT_INHERIT_SKILLS`,exports.MAX_SPAWNS_PER_SESSION_ENV=`PI_SUBAGENT_MAX_SPAWNS_PER_SESSION`,exports.MCP_DIRECT_CHILD_TOOLS_ENV=`PI_SUBAGENT_MCP_DIRECT_TOOLS`,exports.MCP_DIRECT_TOOLS_ENV=`MCP_DIRECT_TOOLS`,exports.PI_CODING_AGENT_PACKAGE_ROOT_ENV=`PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT`,exports.PI_INTERCOM_SESSION_ID_ENV=`PI_INTERCOM_SESSION_ID`,exports.PI_INTERCOM_STABLE_ID_ENV=`PI_INTERCOM_STABLE_ID`,exports.PI_RUNTIME_NAME=`pi`,exports.PI_SUBAGENT_PI_BINARY_ENV=`PI_SUBAGENT_PI_BINARY`,exports.REQUIRED_CHILD_TOOLS_ENV=`PI_SUBAGENT_REQUIRED_TOOLS`,exports.STRUCTURED_OUTPUT_CAPTURE_ENV=`PI_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE`,exports.STRUCTURED_OUTPUT_SCHEMA_ENV=`PI_SUBAGENT_STRUCTURED_OUTPUT_SCHEMA`,exports.SUBAGENT_CAPABILITY_CEILING_ENV=`PI_SUBAGENT_CAPABILITY_CEILING_V1`,exports.SUBAGENT_CHILD_AGENT_ENV=`PI_SUBAGENT_CHILD_AGENT`,exports.SUBAGENT_CHILD_INDEX_ENV=`PI_SUBAGENT_CHILD_INDEX`,exports.SUBAGENT_FANOUT_CHILD_ENV=`PI_SUBAGENT_FANOUT_CHILD`,exports.SUBAGENT_INTERCOM_SESSION_NAME_ENV=`PI_SUBAGENT_INTERCOM_SESSION_NAME`,exports.SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV=`PI_SUBAGENT_PARENT_CAPABILITY_TOKEN`,exports.SUBAGENT_PARENT_CHILD_INDEX_ENV=`PI_SUBAGENT_PARENT_CHILD_INDEX`,exports.SUBAGENT_PARENT_CONTROL_INBOX_ENV=`PI_SUBAGENT_PARENT_CONTROL_INBOX`,exports.SUBAGENT_PARENT_DEPTH_ENV=`PI_SUBAGENT_PARENT_DEPTH`,exports.SUBAGENT_PARENT_EVENT_SINK_ENV=`PI_SUBAGENT_PARENT_EVENT_SINK`,exports.SUBAGENT_PARENT_PATH_ENV=`PI_SUBAGENT_PARENT_PATH`,exports.SUBAGENT_PARENT_ROOT_RUN_ID_ENV=`PI_SUBAGENT_PARENT_ROOT_RUN_ID`,exports.SUBAGENT_PARENT_RUN_ID_ENV=`PI_SUBAGENT_PARENT_RUN_ID`,exports.SUBAGENT_PROTECTED_PARENT_PIDS_ENV=`PI_SUBAGENT_PROTECTED_PARENT_PIDS`,exports.SUBAGENT_RUN_ID_ENV=`PI_SUBAGENT_RUN_ID`,exports.SUBAGENT_STEER_ACK_DIR_ENV=`PI_SUBAGENT_STEER_ACK_DIR`,exports.SUBAGENT_STEER_CAPABILITY_ENV=`PI_SUBAGENT_STEER_CAPABILITY`,exports.SUBAGENT_STEER_INBOX_ENV=`PI_SUBAGENT_STEER_INBOX`,exports.SUBAGENT_TEAM_ID_ENV=`PI_SUBAGENT_TEAM_ID`,exports.SUBAGENT_TEAM_MAIN_MEMBER_ENV=`PI_SUBAGENT_TEAM_MAIN_MEMBER`,exports.SUBAGENT_TEAM_MEMBER_ID_ENV=`PI_SUBAGENT_TEAM_MEMBER_ID`,exports.SUBAGENT_TEAM_MEMBER_TOKEN_ENV=`PI_SUBAGENT_TEAM_MEMBER_TOKEN`,exports.SUBAGENT_TEAM_ROOT_SESSION_ENV=`PI_SUBAGENT_TEAM_ROOT_SESSION`,exports.TOOL_BUDGET_ENV=`PI_SUBAGENT_TOOL_BUDGET`,exports.TOOL_BUDGET_ZERO_AUTH_ENV=`PI_SUBAGENT_TOOL_BUDGET_ZERO_AUTH`,exports.WORKTREE_BASE_DIR_ENV=`PI_SUBAGENTS_WORKTREE_DIR`,exports.decodeProtectedParentProcessIds=e,exports.runtimeBinaryEnvVar=t;
2
+ //# sourceMappingURL=env.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.cjs","names":[],"sources":["../../../src/adapters/process/env.ts"],"sourcesContent":["/**\n * Cross-process environment variable names.\n *\n * DESIGN PATTERNS:\n * - Zero imports, so any process role can read these without pulling in runtime\n * - Names AND values are identical to the predecessor package on purpose\n *\n * WHY THE VALUES ARE UNCHANGED:\n * `PI_SUBAGENT_CHILD` and `PI_SUBAGENT_PARENT_SESSION` are how sibling\n * extensions decide whether they are running inside a subagent child. A child\n * reads whatever its spawning parent set, so during cutover a consumer that has\n * already moved to this package can still be spawned by a doom-pi-subagents\n * parent. Re-prefixing the values would make that child fail to recognise\n * itself. Filesystem roots are namespaced instead; those are what actually\n * needed isolating.\n *\n * AVOID:\n * - Re-prefixing these values; the isolation belongs in the temp roots\n * - Hardcoding any of these literals at a call site\n */\n\nexport {\n SUBAGENT_CHILD_ENV,\n SUBAGENT_PARENT_SESSION_ENV,\n SUBAGENT_ROOT_SESSION_ENV,\n} from '@agimon-ai/doompi-extension-contracts/child-process';\n\nexport const SUBAGENT_RUN_ID_ENV = 'PI_SUBAGENT_RUN_ID';\nexport const SUBAGENT_CHILD_AGENT_ENV = 'PI_SUBAGENT_CHILD_AGENT';\nexport const SUBAGENT_CHILD_INDEX_ENV = 'PI_SUBAGENT_CHILD_INDEX';\nexport const SUBAGENT_FANOUT_CHILD_ENV = 'PI_SUBAGENT_FANOUT_CHILD';\nexport const SUBAGENT_PARENT_EVENT_SINK_ENV = 'PI_SUBAGENT_PARENT_EVENT_SINK';\nexport const SUBAGENT_PARENT_CONTROL_INBOX_ENV = 'PI_SUBAGENT_PARENT_CONTROL_INBOX';\nexport const SUBAGENT_PARENT_ROOT_RUN_ID_ENV = 'PI_SUBAGENT_PARENT_ROOT_RUN_ID';\nexport const SUBAGENT_PARENT_RUN_ID_ENV = 'PI_SUBAGENT_PARENT_RUN_ID';\nexport const SUBAGENT_PARENT_CHILD_INDEX_ENV = 'PI_SUBAGENT_PARENT_CHILD_INDEX';\nexport const SUBAGENT_PARENT_DEPTH_ENV = 'PI_SUBAGENT_PARENT_DEPTH';\nexport const SUBAGENT_PARENT_PATH_ENV = 'PI_SUBAGENT_PARENT_PATH';\nexport const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = 'PI_SUBAGENT_PARENT_CAPABILITY_TOKEN';\n/** Parent/workflow process ids a child Bash tool must never signal. */\nexport const SUBAGENT_PROTECTED_PARENT_PIDS_ENV = 'PI_SUBAGENT_PROTECTED_PARENT_PIDS';\n\n/** Decode the parent-owned PID allowlist without trusting malformed environment state. */\nexport function decodeProtectedParentProcessIds(encoded: string | undefined): number[] {\n if (!encoded) return [];\n try {\n const parsed: unknown = JSON.parse(encoded);\n if (!Array.isArray(parsed)) return [];\n return [\n ...new Set(\n parsed.filter(\n (value): value is number => typeof value === 'number' && Number.isSafeInteger(value) && value > 1,\n ),\n ),\n ];\n } catch {\n return [];\n }\n}\nexport const SUBAGENT_STEER_INBOX_ENV = 'PI_SUBAGENT_STEER_INBOX';\nexport const SUBAGENT_STEER_CAPABILITY_ENV = 'PI_SUBAGENT_STEER_CAPABILITY';\nexport const SUBAGENT_STEER_ACK_DIR_ENV = 'PI_SUBAGENT_STEER_ACK_DIR';\n\n/** The in-process SDK runtime. Not an external command; see `runtimeRegistry.ts`. */\nexport const PI_RUNTIME_NAME = 'pi';\n\n/**\n * Per-runtime binary override, e.g. `DOOM_TEAM_CLAUDE_BIN=/path/to/claude`.\n *\n * Uppercased and non-alphanumerics folded to `_` so a runtime name that is\n * legal in config is always a legal environment variable name.\n */\nexport function runtimeBinaryEnvVar(runtime: string): string {\n return `DOOM_TEAM_${runtime.toUpperCase().replace(/[^A-Z0-9]+/g, '_')}_BIN`;\n}\n\nexport const SUBAGENT_TEAM_ID_ENV = 'PI_SUBAGENT_TEAM_ID';\nexport const SUBAGENT_TEAM_ROOT_SESSION_ENV = 'PI_SUBAGENT_TEAM_ROOT_SESSION';\nexport const SUBAGENT_TEAM_MAIN_MEMBER_ENV = 'PI_SUBAGENT_TEAM_MAIN_MEMBER';\nexport const SUBAGENT_TEAM_MEMBER_ID_ENV = 'PI_SUBAGENT_TEAM_MEMBER_ID';\nexport const SUBAGENT_TEAM_MEMBER_TOKEN_ENV = 'PI_SUBAGENT_TEAM_MEMBER_TOKEN';\n\nexport const SUBAGENT_CAPABILITY_CEILING_ENV = 'PI_SUBAGENT_CAPABILITY_CEILING_V1';\nexport const REQUIRED_CHILD_TOOLS_ENV = 'PI_SUBAGENT_REQUIRED_TOOLS';\nexport const MCP_DIRECT_CHILD_TOOLS_ENV = 'PI_SUBAGENT_MCP_DIRECT_TOOLS';\nexport const CHILD_TOOL_DIAGNOSTIC_PATH_ENV = 'PI_SUBAGENT_TOOL_DIAGNOSTIC_PATH';\nexport const TOOL_BUDGET_ENV = 'PI_SUBAGENT_TOOL_BUDGET';\nexport const TOOL_BUDGET_ZERO_AUTH_ENV = 'PI_SUBAGENT_TOOL_BUDGET_ZERO_AUTH';\nexport const MAX_SPAWNS_PER_SESSION_ENV = 'PI_SUBAGENT_MAX_SPAWNS_PER_SESSION';\nexport const STRUCTURED_OUTPUT_SCHEMA_ENV = 'PI_SUBAGENT_STRUCTURED_OUTPUT_SCHEMA';\nexport const STRUCTURED_OUTPUT_CAPTURE_ENV = 'PI_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE';\nexport const INHERIT_PROJECT_CONTEXT_ENV = 'PI_SUBAGENT_INHERIT_PROJECT_CONTEXT';\nexport const INHERIT_SKILLS_ENV = 'PI_SUBAGENT_INHERIT_SKILLS';\n/**\n * Unprefixed on purpose: this one belongs to the Pi host, not to us. The child's\n * Pi runtime reads it directly, so the name is fixed by that contract and must\n * not be brought under the `PI_SUBAGENT_` namespace.\n */\nexport const MCP_DIRECT_TOOLS_ENV = 'MCP_DIRECT_TOOLS';\n/** Overrides where worktrees are created, for hosts whose tmpdir is unsuitable. */\nexport const WORKTREE_BASE_DIR_ENV = 'PI_SUBAGENTS_WORKTREE_DIR';\nexport const EXTRA_AGENT_DIRS_ENV = 'PI_SUBAGENT_EXTRA_AGENT_DIRS';\nexport const EXTRA_SKILL_DIRS_ENV = 'PI_SUBAGENT_EXTRA_SKILL_DIRS';\nexport const PI_SUBAGENT_PI_BINARY_ENV = 'PI_SUBAGENT_PI_BINARY';\nexport const PI_CODING_AGENT_PACKAGE_ROOT_ENV = 'PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT';\nexport const SUBAGENT_INTERCOM_SESSION_NAME_ENV = 'PI_SUBAGENT_INTERCOM_SESSION_NAME';\nexport const PI_INTERCOM_STABLE_ID_ENV = 'PI_INTERCOM_STABLE_ID';\nexport const PI_INTERCOM_SESSION_ID_ENV = 'PI_INTERCOM_SESSION_ID';\n\n/** Resolved child-safe DoomPi extensions inherited by SDK-backed agents. */\nexport const DOOMPI_CHILD_EXTENSIONS_ENV = 'DOOMPI_CHILD_EXTENSIONS';\n/** Resolved DoomPi domain skill directories inherited by SDK-backed agents. */\nexport const DOOMPI_SKILL_DIRS_ENV = 'DOOMPI_SKILL_DIRS';\n"],"mappings":"+GA2CA,SAAgB,EAAgC,EAAuC,CACrF,GAAI,CAAC,EAAS,MAAO,EAAE,CACvB,GAAI,CACF,IAAM,EAAkB,KAAK,MAAM,EAAQ,CAE3C,OADK,MAAM,QAAQ,EAAO,CACnB,CACL,GAAG,IAAI,IACL,EAAO,OACJ,GAA2B,OAAO,GAAU,UAAY,OAAO,cAAc,EAAM,EAAI,EAAQ,EACjG,CACF,CACF,CAPkC,EAAE,MAQ/B,CACN,MAAO,EAAE,EAgBb,SAAgB,EAAoB,EAAyB,CAC3D,MAAO,aAAa,EAAQ,aAAa,CAAC,QAAQ,cAAe,IAAI,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV, SUBAGENT_ROOT_SESSION_ENV } from "@agimon-ai/doompi-extension-contracts/child-process";
2
+
3
+ //#region src/adapters/process/env.d.ts
4
+ declare const SUBAGENT_RUN_ID_ENV = "PI_SUBAGENT_RUN_ID";
5
+ declare const SUBAGENT_CHILD_AGENT_ENV = "PI_SUBAGENT_CHILD_AGENT";
6
+ declare const SUBAGENT_CHILD_INDEX_ENV = "PI_SUBAGENT_CHILD_INDEX";
7
+ declare const SUBAGENT_FANOUT_CHILD_ENV = "PI_SUBAGENT_FANOUT_CHILD";
8
+ declare const SUBAGENT_PARENT_EVENT_SINK_ENV = "PI_SUBAGENT_PARENT_EVENT_SINK";
9
+ declare const SUBAGENT_PARENT_CONTROL_INBOX_ENV = "PI_SUBAGENT_PARENT_CONTROL_INBOX";
10
+ declare const SUBAGENT_PARENT_ROOT_RUN_ID_ENV = "PI_SUBAGENT_PARENT_ROOT_RUN_ID";
11
+ declare const SUBAGENT_PARENT_RUN_ID_ENV = "PI_SUBAGENT_PARENT_RUN_ID";
12
+ declare const SUBAGENT_PARENT_CHILD_INDEX_ENV = "PI_SUBAGENT_PARENT_CHILD_INDEX";
13
+ declare const SUBAGENT_PARENT_DEPTH_ENV = "PI_SUBAGENT_PARENT_DEPTH";
14
+ declare const SUBAGENT_PARENT_PATH_ENV = "PI_SUBAGENT_PARENT_PATH";
15
+ declare const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = "PI_SUBAGENT_PARENT_CAPABILITY_TOKEN";
16
+ /** Parent/workflow process ids a child Bash tool must never signal. */
17
+ declare const SUBAGENT_PROTECTED_PARENT_PIDS_ENV = "PI_SUBAGENT_PROTECTED_PARENT_PIDS";
18
+ /** Decode the parent-owned PID allowlist without trusting malformed environment state. */
19
+ declare function decodeProtectedParentProcessIds(encoded: string | undefined): number[];
20
+ declare const SUBAGENT_STEER_INBOX_ENV = "PI_SUBAGENT_STEER_INBOX";
21
+ declare const SUBAGENT_STEER_CAPABILITY_ENV = "PI_SUBAGENT_STEER_CAPABILITY";
22
+ declare const SUBAGENT_STEER_ACK_DIR_ENV = "PI_SUBAGENT_STEER_ACK_DIR";
23
+ /** The in-process SDK runtime. Not an external command; see `runtimeRegistry.ts`. */
24
+ declare const PI_RUNTIME_NAME = "pi";
25
+ /**
26
+ * Per-runtime binary override, e.g. `DOOM_TEAM_CLAUDE_BIN=/path/to/claude`.
27
+ *
28
+ * Uppercased and non-alphanumerics folded to `_` so a runtime name that is
29
+ * legal in config is always a legal environment variable name.
30
+ */
31
+ declare function runtimeBinaryEnvVar(runtime: string): string;
32
+ declare const SUBAGENT_TEAM_ID_ENV = "PI_SUBAGENT_TEAM_ID";
33
+ declare const SUBAGENT_TEAM_ROOT_SESSION_ENV = "PI_SUBAGENT_TEAM_ROOT_SESSION";
34
+ declare const SUBAGENT_TEAM_MAIN_MEMBER_ENV = "PI_SUBAGENT_TEAM_MAIN_MEMBER";
35
+ declare const SUBAGENT_TEAM_MEMBER_ID_ENV = "PI_SUBAGENT_TEAM_MEMBER_ID";
36
+ declare const SUBAGENT_TEAM_MEMBER_TOKEN_ENV = "PI_SUBAGENT_TEAM_MEMBER_TOKEN";
37
+ declare const SUBAGENT_CAPABILITY_CEILING_ENV = "PI_SUBAGENT_CAPABILITY_CEILING_V1";
38
+ declare const REQUIRED_CHILD_TOOLS_ENV = "PI_SUBAGENT_REQUIRED_TOOLS";
39
+ declare const MCP_DIRECT_CHILD_TOOLS_ENV = "PI_SUBAGENT_MCP_DIRECT_TOOLS";
40
+ declare const CHILD_TOOL_DIAGNOSTIC_PATH_ENV = "PI_SUBAGENT_TOOL_DIAGNOSTIC_PATH";
41
+ declare const TOOL_BUDGET_ENV = "PI_SUBAGENT_TOOL_BUDGET";
42
+ declare const TOOL_BUDGET_ZERO_AUTH_ENV = "PI_SUBAGENT_TOOL_BUDGET_ZERO_AUTH";
43
+ declare const MAX_SPAWNS_PER_SESSION_ENV = "PI_SUBAGENT_MAX_SPAWNS_PER_SESSION";
44
+ declare const STRUCTURED_OUTPUT_SCHEMA_ENV = "PI_SUBAGENT_STRUCTURED_OUTPUT_SCHEMA";
45
+ declare const STRUCTURED_OUTPUT_CAPTURE_ENV = "PI_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE";
46
+ declare const INHERIT_PROJECT_CONTEXT_ENV = "PI_SUBAGENT_INHERIT_PROJECT_CONTEXT";
47
+ declare const INHERIT_SKILLS_ENV = "PI_SUBAGENT_INHERIT_SKILLS";
48
+ /**
49
+ * Unprefixed on purpose: this one belongs to the Pi host, not to us. The child's
50
+ * Pi runtime reads it directly, so the name is fixed by that contract and must
51
+ * not be brought under the `PI_SUBAGENT_` namespace.
52
+ */
53
+ declare const MCP_DIRECT_TOOLS_ENV = "MCP_DIRECT_TOOLS";
54
+ /** Overrides where worktrees are created, for hosts whose tmpdir is unsuitable. */
55
+ declare const WORKTREE_BASE_DIR_ENV = "PI_SUBAGENTS_WORKTREE_DIR";
56
+ declare const EXTRA_AGENT_DIRS_ENV = "PI_SUBAGENT_EXTRA_AGENT_DIRS";
57
+ declare const EXTRA_SKILL_DIRS_ENV = "PI_SUBAGENT_EXTRA_SKILL_DIRS";
58
+ declare const PI_SUBAGENT_PI_BINARY_ENV = "PI_SUBAGENT_PI_BINARY";
59
+ declare const PI_CODING_AGENT_PACKAGE_ROOT_ENV = "PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT";
60
+ declare const SUBAGENT_INTERCOM_SESSION_NAME_ENV = "PI_SUBAGENT_INTERCOM_SESSION_NAME";
61
+ declare const PI_INTERCOM_STABLE_ID_ENV = "PI_INTERCOM_STABLE_ID";
62
+ declare const PI_INTERCOM_SESSION_ID_ENV = "PI_INTERCOM_SESSION_ID";
63
+ /** Resolved child-safe DoomPi extensions inherited by SDK-backed agents. */
64
+ declare const DOOMPI_CHILD_EXTENSIONS_ENV = "DOOMPI_CHILD_EXTENSIONS";
65
+ /** Resolved DoomPi domain skill directories inherited by SDK-backed agents. */
66
+ declare const DOOMPI_SKILL_DIRS_ENV = "DOOMPI_SKILL_DIRS";
67
+ //#endregion
68
+ export { CHILD_TOOL_DIAGNOSTIC_PATH_ENV, DOOMPI_CHILD_EXTENSIONS_ENV, DOOMPI_SKILL_DIRS_ENV, EXTRA_AGENT_DIRS_ENV, EXTRA_SKILL_DIRS_ENV, INHERIT_PROJECT_CONTEXT_ENV, INHERIT_SKILLS_ENV, MAX_SPAWNS_PER_SESSION_ENV, MCP_DIRECT_CHILD_TOOLS_ENV, MCP_DIRECT_TOOLS_ENV, PI_CODING_AGENT_PACKAGE_ROOT_ENV, PI_INTERCOM_SESSION_ID_ENV, PI_INTERCOM_STABLE_ID_ENV, PI_RUNTIME_NAME, PI_SUBAGENT_PI_BINARY_ENV, REQUIRED_CHILD_TOOLS_ENV, STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV, SUBAGENT_CAPABILITY_CEILING_ENV, SUBAGENT_CHILD_AGENT_ENV, SUBAGENT_CHILD_ENV, SUBAGENT_CHILD_INDEX_ENV, SUBAGENT_FANOUT_CHILD_ENV, SUBAGENT_INTERCOM_SESSION_NAME_ENV, SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV, SUBAGENT_PARENT_CHILD_INDEX_ENV, SUBAGENT_PARENT_CONTROL_INBOX_ENV, SUBAGENT_PARENT_DEPTH_ENV, SUBAGENT_PARENT_EVENT_SINK_ENV, SUBAGENT_PARENT_PATH_ENV, SUBAGENT_PARENT_ROOT_RUN_ID_ENV, SUBAGENT_PARENT_RUN_ID_ENV, SUBAGENT_PARENT_SESSION_ENV, SUBAGENT_PROTECTED_PARENT_PIDS_ENV, SUBAGENT_ROOT_SESSION_ENV, SUBAGENT_RUN_ID_ENV, SUBAGENT_STEER_ACK_DIR_ENV, SUBAGENT_STEER_CAPABILITY_ENV, SUBAGENT_STEER_INBOX_ENV, SUBAGENT_TEAM_ID_ENV, SUBAGENT_TEAM_MAIN_MEMBER_ENV, SUBAGENT_TEAM_MEMBER_ID_ENV, SUBAGENT_TEAM_MEMBER_TOKEN_ENV, SUBAGENT_TEAM_ROOT_SESSION_ENV, TOOL_BUDGET_ENV, TOOL_BUDGET_ZERO_AUTH_ENV, WORKTREE_BASE_DIR_ENV, decodeProtectedParentProcessIds, runtimeBinaryEnvVar };
69
+ //# sourceMappingURL=env.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.cts","names":[],"sources":["../../../src/adapters/process/env.ts"],"mappings":";;;cA2Ba,mBAAA;AAAA,cACA,wBAAA;AAAA,cACA,wBAAA;AAAA,cACA,yBAAA;AAAA,cACA,8BAAA;AAAA,cACA,iCAAA;AAAA,cACA,+BAAA;AAAA,cACA,0BAAA;AAAA,cACA,+BAAA;AAAA,cACA,yBAAA;AAAA,cACA,wBAAA;AAAA,cACA,oCAAA;AALb;AAAA,cAOa,kCAAA;;iBAGG,+BAAA,CAAgC,OAAA;AAAA,cAgBnC,wBAAA;AAAA,cACA,6BAAA;AAAA,cACA,0BAAA;;cAGA,eAAA;;AA7Bb;;;;;iBAqCgB,mBAAA,CAAoB,OAAA;AAAA,cAIvB,oBAAA;AAAA,cACA,8BAAA;AAAA,cACA,6BAAA;AAAA,cACA,2BAAA;AAAA,cACA,8BAAA;AAAA,cAEA,+BAAA;AAAA,cACA,wBAAA;AAAA,cACA,0BAAA;AAAA,cACA,8BAAA;AAAA,cACA,eAAA;AAAA,cACA,yBAAA;AAAA,cACA,0BAAA;AAAA,cACA,4BAAA;AAAA,cACA,6BAAA;AAAA,cACA,2BAAA;AAAA,cACA,kBAAA;;;;AAjDb;;cAuDa,oBAAA;;cAEA,qBAAA;AAAA,cACA,oBAAA;AAAA,cACA,oBAAA;AAAA,cACA,yBAAA;AAAA,cACA,gCAAA;AAAA,cACA,kCAAA;AAAA,cACA,yBAAA;AAAA,cACA,0BAAA;;cAGA,2BAAA;;cAEA,qBAAA"}
@@ -0,0 +1,69 @@
1
+ import { SUBAGENT_CHILD_ENV, SUBAGENT_PARENT_SESSION_ENV, SUBAGENT_ROOT_SESSION_ENV } from "@agimon-ai/doompi-extension-contracts/child-process";
2
+
3
+ //#region src/adapters/process/env.d.ts
4
+ declare const SUBAGENT_RUN_ID_ENV = "PI_SUBAGENT_RUN_ID";
5
+ declare const SUBAGENT_CHILD_AGENT_ENV = "PI_SUBAGENT_CHILD_AGENT";
6
+ declare const SUBAGENT_CHILD_INDEX_ENV = "PI_SUBAGENT_CHILD_INDEX";
7
+ declare const SUBAGENT_FANOUT_CHILD_ENV = "PI_SUBAGENT_FANOUT_CHILD";
8
+ declare const SUBAGENT_PARENT_EVENT_SINK_ENV = "PI_SUBAGENT_PARENT_EVENT_SINK";
9
+ declare const SUBAGENT_PARENT_CONTROL_INBOX_ENV = "PI_SUBAGENT_PARENT_CONTROL_INBOX";
10
+ declare const SUBAGENT_PARENT_ROOT_RUN_ID_ENV = "PI_SUBAGENT_PARENT_ROOT_RUN_ID";
11
+ declare const SUBAGENT_PARENT_RUN_ID_ENV = "PI_SUBAGENT_PARENT_RUN_ID";
12
+ declare const SUBAGENT_PARENT_CHILD_INDEX_ENV = "PI_SUBAGENT_PARENT_CHILD_INDEX";
13
+ declare const SUBAGENT_PARENT_DEPTH_ENV = "PI_SUBAGENT_PARENT_DEPTH";
14
+ declare const SUBAGENT_PARENT_PATH_ENV = "PI_SUBAGENT_PARENT_PATH";
15
+ declare const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = "PI_SUBAGENT_PARENT_CAPABILITY_TOKEN";
16
+ /** Parent/workflow process ids a child Bash tool must never signal. */
17
+ declare const SUBAGENT_PROTECTED_PARENT_PIDS_ENV = "PI_SUBAGENT_PROTECTED_PARENT_PIDS";
18
+ /** Decode the parent-owned PID allowlist without trusting malformed environment state. */
19
+ declare function decodeProtectedParentProcessIds(encoded: string | undefined): number[];
20
+ declare const SUBAGENT_STEER_INBOX_ENV = "PI_SUBAGENT_STEER_INBOX";
21
+ declare const SUBAGENT_STEER_CAPABILITY_ENV = "PI_SUBAGENT_STEER_CAPABILITY";
22
+ declare const SUBAGENT_STEER_ACK_DIR_ENV = "PI_SUBAGENT_STEER_ACK_DIR";
23
+ /** The in-process SDK runtime. Not an external command; see `runtimeRegistry.ts`. */
24
+ declare const PI_RUNTIME_NAME = "pi";
25
+ /**
26
+ * Per-runtime binary override, e.g. `DOOM_TEAM_CLAUDE_BIN=/path/to/claude`.
27
+ *
28
+ * Uppercased and non-alphanumerics folded to `_` so a runtime name that is
29
+ * legal in config is always a legal environment variable name.
30
+ */
31
+ declare function runtimeBinaryEnvVar(runtime: string): string;
32
+ declare const SUBAGENT_TEAM_ID_ENV = "PI_SUBAGENT_TEAM_ID";
33
+ declare const SUBAGENT_TEAM_ROOT_SESSION_ENV = "PI_SUBAGENT_TEAM_ROOT_SESSION";
34
+ declare const SUBAGENT_TEAM_MAIN_MEMBER_ENV = "PI_SUBAGENT_TEAM_MAIN_MEMBER";
35
+ declare const SUBAGENT_TEAM_MEMBER_ID_ENV = "PI_SUBAGENT_TEAM_MEMBER_ID";
36
+ declare const SUBAGENT_TEAM_MEMBER_TOKEN_ENV = "PI_SUBAGENT_TEAM_MEMBER_TOKEN";
37
+ declare const SUBAGENT_CAPABILITY_CEILING_ENV = "PI_SUBAGENT_CAPABILITY_CEILING_V1";
38
+ declare const REQUIRED_CHILD_TOOLS_ENV = "PI_SUBAGENT_REQUIRED_TOOLS";
39
+ declare const MCP_DIRECT_CHILD_TOOLS_ENV = "PI_SUBAGENT_MCP_DIRECT_TOOLS";
40
+ declare const CHILD_TOOL_DIAGNOSTIC_PATH_ENV = "PI_SUBAGENT_TOOL_DIAGNOSTIC_PATH";
41
+ declare const TOOL_BUDGET_ENV = "PI_SUBAGENT_TOOL_BUDGET";
42
+ declare const TOOL_BUDGET_ZERO_AUTH_ENV = "PI_SUBAGENT_TOOL_BUDGET_ZERO_AUTH";
43
+ declare const MAX_SPAWNS_PER_SESSION_ENV = "PI_SUBAGENT_MAX_SPAWNS_PER_SESSION";
44
+ declare const STRUCTURED_OUTPUT_SCHEMA_ENV = "PI_SUBAGENT_STRUCTURED_OUTPUT_SCHEMA";
45
+ declare const STRUCTURED_OUTPUT_CAPTURE_ENV = "PI_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE";
46
+ declare const INHERIT_PROJECT_CONTEXT_ENV = "PI_SUBAGENT_INHERIT_PROJECT_CONTEXT";
47
+ declare const INHERIT_SKILLS_ENV = "PI_SUBAGENT_INHERIT_SKILLS";
48
+ /**
49
+ * Unprefixed on purpose: this one belongs to the Pi host, not to us. The child's
50
+ * Pi runtime reads it directly, so the name is fixed by that contract and must
51
+ * not be brought under the `PI_SUBAGENT_` namespace.
52
+ */
53
+ declare const MCP_DIRECT_TOOLS_ENV = "MCP_DIRECT_TOOLS";
54
+ /** Overrides where worktrees are created, for hosts whose tmpdir is unsuitable. */
55
+ declare const WORKTREE_BASE_DIR_ENV = "PI_SUBAGENTS_WORKTREE_DIR";
56
+ declare const EXTRA_AGENT_DIRS_ENV = "PI_SUBAGENT_EXTRA_AGENT_DIRS";
57
+ declare const EXTRA_SKILL_DIRS_ENV = "PI_SUBAGENT_EXTRA_SKILL_DIRS";
58
+ declare const PI_SUBAGENT_PI_BINARY_ENV = "PI_SUBAGENT_PI_BINARY";
59
+ declare const PI_CODING_AGENT_PACKAGE_ROOT_ENV = "PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT";
60
+ declare const SUBAGENT_INTERCOM_SESSION_NAME_ENV = "PI_SUBAGENT_INTERCOM_SESSION_NAME";
61
+ declare const PI_INTERCOM_STABLE_ID_ENV = "PI_INTERCOM_STABLE_ID";
62
+ declare const PI_INTERCOM_SESSION_ID_ENV = "PI_INTERCOM_SESSION_ID";
63
+ /** Resolved child-safe DoomPi extensions inherited by SDK-backed agents. */
64
+ declare const DOOMPI_CHILD_EXTENSIONS_ENV = "DOOMPI_CHILD_EXTENSIONS";
65
+ /** Resolved DoomPi domain skill directories inherited by SDK-backed agents. */
66
+ declare const DOOMPI_SKILL_DIRS_ENV = "DOOMPI_SKILL_DIRS";
67
+ //#endregion
68
+ export { CHILD_TOOL_DIAGNOSTIC_PATH_ENV, DOOMPI_CHILD_EXTENSIONS_ENV, DOOMPI_SKILL_DIRS_ENV, EXTRA_AGENT_DIRS_ENV, EXTRA_SKILL_DIRS_ENV, INHERIT_PROJECT_CONTEXT_ENV, INHERIT_SKILLS_ENV, MAX_SPAWNS_PER_SESSION_ENV, MCP_DIRECT_CHILD_TOOLS_ENV, MCP_DIRECT_TOOLS_ENV, PI_CODING_AGENT_PACKAGE_ROOT_ENV, PI_INTERCOM_SESSION_ID_ENV, PI_INTERCOM_STABLE_ID_ENV, PI_RUNTIME_NAME, PI_SUBAGENT_PI_BINARY_ENV, REQUIRED_CHILD_TOOLS_ENV, STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV, SUBAGENT_CAPABILITY_CEILING_ENV, SUBAGENT_CHILD_AGENT_ENV, SUBAGENT_CHILD_ENV, SUBAGENT_CHILD_INDEX_ENV, SUBAGENT_FANOUT_CHILD_ENV, SUBAGENT_INTERCOM_SESSION_NAME_ENV, SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV, SUBAGENT_PARENT_CHILD_INDEX_ENV, SUBAGENT_PARENT_CONTROL_INBOX_ENV, SUBAGENT_PARENT_DEPTH_ENV, SUBAGENT_PARENT_EVENT_SINK_ENV, SUBAGENT_PARENT_PATH_ENV, SUBAGENT_PARENT_ROOT_RUN_ID_ENV, SUBAGENT_PARENT_RUN_ID_ENV, SUBAGENT_PARENT_SESSION_ENV, SUBAGENT_PROTECTED_PARENT_PIDS_ENV, SUBAGENT_ROOT_SESSION_ENV, SUBAGENT_RUN_ID_ENV, SUBAGENT_STEER_ACK_DIR_ENV, SUBAGENT_STEER_CAPABILITY_ENV, SUBAGENT_STEER_INBOX_ENV, SUBAGENT_TEAM_ID_ENV, SUBAGENT_TEAM_MAIN_MEMBER_ENV, SUBAGENT_TEAM_MEMBER_ID_ENV, SUBAGENT_TEAM_MEMBER_TOKEN_ENV, SUBAGENT_TEAM_ROOT_SESSION_ENV, TOOL_BUDGET_ENV, TOOL_BUDGET_ZERO_AUTH_ENV, WORKTREE_BASE_DIR_ENV, decodeProtectedParentProcessIds, runtimeBinaryEnvVar };
69
+ //# sourceMappingURL=env.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.d.mts","names":[],"sources":["../../../src/adapters/process/env.ts"],"mappings":";;;cA2Ba,mBAAA;AAAA,cACA,wBAAA;AAAA,cACA,wBAAA;AAAA,cACA,yBAAA;AAAA,cACA,8BAAA;AAAA,cACA,iCAAA;AAAA,cACA,+BAAA;AAAA,cACA,0BAAA;AAAA,cACA,+BAAA;AAAA,cACA,yBAAA;AAAA,cACA,wBAAA;AAAA,cACA,oCAAA;AALb;AAAA,cAOa,kCAAA;;iBAGG,+BAAA,CAAgC,OAAA;AAAA,cAgBnC,wBAAA;AAAA,cACA,6BAAA;AAAA,cACA,0BAAA;;cAGA,eAAA;;AA7Bb;;;;;iBAqCgB,mBAAA,CAAoB,OAAA;AAAA,cAIvB,oBAAA;AAAA,cACA,8BAAA;AAAA,cACA,6BAAA;AAAA,cACA,2BAAA;AAAA,cACA,8BAAA;AAAA,cAEA,+BAAA;AAAA,cACA,wBAAA;AAAA,cACA,0BAAA;AAAA,cACA,8BAAA;AAAA,cACA,eAAA;AAAA,cACA,yBAAA;AAAA,cACA,0BAAA;AAAA,cACA,4BAAA;AAAA,cACA,6BAAA;AAAA,cACA,2BAAA;AAAA,cACA,kBAAA;;;;AAjDb;;cAuDa,oBAAA;;cAEA,qBAAA;AAAA,cACA,oBAAA;AAAA,cACA,oBAAA;AAAA,cACA,yBAAA;AAAA,cACA,gCAAA;AAAA,cACA,kCAAA;AAAA,cACA,yBAAA;AAAA,cACA,0BAAA;;cAGA,2BAAA;;cAEA,qBAAA"}
@@ -0,0 +1,2 @@
1
+ import{__esmMin as e}from"../../_virtual/_rolldown/runtime.mjs";import{SUBAGENT_CHILD_ENV as t,SUBAGENT_PARENT_SESSION_ENV as n,SUBAGENT_ROOT_SESSION_ENV as r}from"@agimon-ai/doompi-extension-contracts/child-process";function i(e){if(!e)return[];try{let t=JSON.parse(e);return Array.isArray(t)?[...new Set(t.filter(e=>typeof e==`number`&&Number.isSafeInteger(e)&&e>1))]:[]}catch{return[]}}function a(e){return`DOOM_TEAM_${e.toUpperCase().replace(/[^A-Z0-9]+/g,`_`)}_BIN`}var o,s,c,l,u,d,f,p,m,h,g,_,v,y,b,x,S,C,w,T,E,D,O,k,A,j,M,N,P,F,I,L,R,z,B,V,H,U,W,G,K,q,J,Y,X=e((()=>{o=`PI_SUBAGENT_RUN_ID`,s=`PI_SUBAGENT_CHILD_AGENT`,c=`PI_SUBAGENT_CHILD_INDEX`,l=`PI_SUBAGENT_FANOUT_CHILD`,u=`PI_SUBAGENT_PARENT_EVENT_SINK`,d=`PI_SUBAGENT_PARENT_CONTROL_INBOX`,f=`PI_SUBAGENT_PARENT_ROOT_RUN_ID`,p=`PI_SUBAGENT_PARENT_RUN_ID`,m=`PI_SUBAGENT_PARENT_CHILD_INDEX`,h=`PI_SUBAGENT_PARENT_DEPTH`,g=`PI_SUBAGENT_PARENT_PATH`,_=`PI_SUBAGENT_PARENT_CAPABILITY_TOKEN`,v=`PI_SUBAGENT_PROTECTED_PARENT_PIDS`,y=`PI_SUBAGENT_STEER_INBOX`,b=`PI_SUBAGENT_STEER_CAPABILITY`,x=`PI_SUBAGENT_STEER_ACK_DIR`,S=`pi`,C=`PI_SUBAGENT_TEAM_ID`,w=`PI_SUBAGENT_TEAM_ROOT_SESSION`,T=`PI_SUBAGENT_TEAM_MAIN_MEMBER`,E=`PI_SUBAGENT_TEAM_MEMBER_ID`,D=`PI_SUBAGENT_TEAM_MEMBER_TOKEN`,O=`PI_SUBAGENT_CAPABILITY_CEILING_V1`,k=`PI_SUBAGENT_REQUIRED_TOOLS`,A=`PI_SUBAGENT_MCP_DIRECT_TOOLS`,j=`PI_SUBAGENT_TOOL_DIAGNOSTIC_PATH`,M=`PI_SUBAGENT_TOOL_BUDGET`,N=`PI_SUBAGENT_TOOL_BUDGET_ZERO_AUTH`,P=`PI_SUBAGENT_MAX_SPAWNS_PER_SESSION`,F=`PI_SUBAGENT_STRUCTURED_OUTPUT_SCHEMA`,I=`PI_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE`,L=`PI_SUBAGENT_INHERIT_PROJECT_CONTEXT`,R=`PI_SUBAGENT_INHERIT_SKILLS`,z=`MCP_DIRECT_TOOLS`,B=`PI_SUBAGENTS_WORKTREE_DIR`,V=`PI_SUBAGENT_EXTRA_AGENT_DIRS`,H=`PI_SUBAGENT_EXTRA_SKILL_DIRS`,U=`PI_SUBAGENT_PI_BINARY`,W=`PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT`,G=`PI_SUBAGENT_INTERCOM_SESSION_NAME`,K=`PI_INTERCOM_STABLE_ID`,q=`PI_INTERCOM_SESSION_ID`,J=`DOOMPI_CHILD_EXTENSIONS`,Y=`DOOMPI_SKILL_DIRS`}));X();export{j as CHILD_TOOL_DIAGNOSTIC_PATH_ENV,J as DOOMPI_CHILD_EXTENSIONS_ENV,Y as DOOMPI_SKILL_DIRS_ENV,V as EXTRA_AGENT_DIRS_ENV,H as EXTRA_SKILL_DIRS_ENV,L as INHERIT_PROJECT_CONTEXT_ENV,R as INHERIT_SKILLS_ENV,P as MAX_SPAWNS_PER_SESSION_ENV,A as MCP_DIRECT_CHILD_TOOLS_ENV,z as MCP_DIRECT_TOOLS_ENV,W as PI_CODING_AGENT_PACKAGE_ROOT_ENV,q as PI_INTERCOM_SESSION_ID_ENV,K as PI_INTERCOM_STABLE_ID_ENV,S as PI_RUNTIME_NAME,U as PI_SUBAGENT_PI_BINARY_ENV,k as REQUIRED_CHILD_TOOLS_ENV,I as STRUCTURED_OUTPUT_CAPTURE_ENV,F as STRUCTURED_OUTPUT_SCHEMA_ENV,O as SUBAGENT_CAPABILITY_CEILING_ENV,s as SUBAGENT_CHILD_AGENT_ENV,t as SUBAGENT_CHILD_ENV,c as SUBAGENT_CHILD_INDEX_ENV,l as SUBAGENT_FANOUT_CHILD_ENV,G as SUBAGENT_INTERCOM_SESSION_NAME_ENV,_ as SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV,m as SUBAGENT_PARENT_CHILD_INDEX_ENV,d as SUBAGENT_PARENT_CONTROL_INBOX_ENV,h as SUBAGENT_PARENT_DEPTH_ENV,u as SUBAGENT_PARENT_EVENT_SINK_ENV,g as SUBAGENT_PARENT_PATH_ENV,f as SUBAGENT_PARENT_ROOT_RUN_ID_ENV,p as SUBAGENT_PARENT_RUN_ID_ENV,n as SUBAGENT_PARENT_SESSION_ENV,v as SUBAGENT_PROTECTED_PARENT_PIDS_ENV,r as SUBAGENT_ROOT_SESSION_ENV,o as SUBAGENT_RUN_ID_ENV,x as SUBAGENT_STEER_ACK_DIR_ENV,b as SUBAGENT_STEER_CAPABILITY_ENV,y as SUBAGENT_STEER_INBOX_ENV,C as SUBAGENT_TEAM_ID_ENV,T as SUBAGENT_TEAM_MAIN_MEMBER_ENV,E as SUBAGENT_TEAM_MEMBER_ID_ENV,D as SUBAGENT_TEAM_MEMBER_TOKEN_ENV,w as SUBAGENT_TEAM_ROOT_SESSION_ENV,M as TOOL_BUDGET_ENV,N as TOOL_BUDGET_ZERO_AUTH_ENV,B as WORKTREE_BASE_DIR_ENV,i as decodeProtectedParentProcessIds,X as init_env,a as runtimeBinaryEnvVar};
2
+ //# sourceMappingURL=env.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env.mjs","names":[],"sources":["../../../src/adapters/process/env.ts"],"sourcesContent":["/**\n * Cross-process environment variable names.\n *\n * DESIGN PATTERNS:\n * - Zero imports, so any process role can read these without pulling in runtime\n * - Names AND values are identical to the predecessor package on purpose\n *\n * WHY THE VALUES ARE UNCHANGED:\n * `PI_SUBAGENT_CHILD` and `PI_SUBAGENT_PARENT_SESSION` are how sibling\n * extensions decide whether they are running inside a subagent child. A child\n * reads whatever its spawning parent set, so during cutover a consumer that has\n * already moved to this package can still be spawned by a doom-pi-subagents\n * parent. Re-prefixing the values would make that child fail to recognise\n * itself. Filesystem roots are namespaced instead; those are what actually\n * needed isolating.\n *\n * AVOID:\n * - Re-prefixing these values; the isolation belongs in the temp roots\n * - Hardcoding any of these literals at a call site\n */\n\nexport {\n SUBAGENT_CHILD_ENV,\n SUBAGENT_PARENT_SESSION_ENV,\n SUBAGENT_ROOT_SESSION_ENV,\n} from '@agimon-ai/doompi-extension-contracts/child-process';\n\nexport const SUBAGENT_RUN_ID_ENV = 'PI_SUBAGENT_RUN_ID';\nexport const SUBAGENT_CHILD_AGENT_ENV = 'PI_SUBAGENT_CHILD_AGENT';\nexport const SUBAGENT_CHILD_INDEX_ENV = 'PI_SUBAGENT_CHILD_INDEX';\nexport const SUBAGENT_FANOUT_CHILD_ENV = 'PI_SUBAGENT_FANOUT_CHILD';\nexport const SUBAGENT_PARENT_EVENT_SINK_ENV = 'PI_SUBAGENT_PARENT_EVENT_SINK';\nexport const SUBAGENT_PARENT_CONTROL_INBOX_ENV = 'PI_SUBAGENT_PARENT_CONTROL_INBOX';\nexport const SUBAGENT_PARENT_ROOT_RUN_ID_ENV = 'PI_SUBAGENT_PARENT_ROOT_RUN_ID';\nexport const SUBAGENT_PARENT_RUN_ID_ENV = 'PI_SUBAGENT_PARENT_RUN_ID';\nexport const SUBAGENT_PARENT_CHILD_INDEX_ENV = 'PI_SUBAGENT_PARENT_CHILD_INDEX';\nexport const SUBAGENT_PARENT_DEPTH_ENV = 'PI_SUBAGENT_PARENT_DEPTH';\nexport const SUBAGENT_PARENT_PATH_ENV = 'PI_SUBAGENT_PARENT_PATH';\nexport const SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV = 'PI_SUBAGENT_PARENT_CAPABILITY_TOKEN';\n/** Parent/workflow process ids a child Bash tool must never signal. */\nexport const SUBAGENT_PROTECTED_PARENT_PIDS_ENV = 'PI_SUBAGENT_PROTECTED_PARENT_PIDS';\n\n/** Decode the parent-owned PID allowlist without trusting malformed environment state. */\nexport function decodeProtectedParentProcessIds(encoded: string | undefined): number[] {\n if (!encoded) return [];\n try {\n const parsed: unknown = JSON.parse(encoded);\n if (!Array.isArray(parsed)) return [];\n return [\n ...new Set(\n parsed.filter(\n (value): value is number => typeof value === 'number' && Number.isSafeInteger(value) && value > 1,\n ),\n ),\n ];\n } catch {\n return [];\n }\n}\nexport const SUBAGENT_STEER_INBOX_ENV = 'PI_SUBAGENT_STEER_INBOX';\nexport const SUBAGENT_STEER_CAPABILITY_ENV = 'PI_SUBAGENT_STEER_CAPABILITY';\nexport const SUBAGENT_STEER_ACK_DIR_ENV = 'PI_SUBAGENT_STEER_ACK_DIR';\n\n/** The in-process SDK runtime. Not an external command; see `runtimeRegistry.ts`. */\nexport const PI_RUNTIME_NAME = 'pi';\n\n/**\n * Per-runtime binary override, e.g. `DOOM_TEAM_CLAUDE_BIN=/path/to/claude`.\n *\n * Uppercased and non-alphanumerics folded to `_` so a runtime name that is\n * legal in config is always a legal environment variable name.\n */\nexport function runtimeBinaryEnvVar(runtime: string): string {\n return `DOOM_TEAM_${runtime.toUpperCase().replace(/[^A-Z0-9]+/g, '_')}_BIN`;\n}\n\nexport const SUBAGENT_TEAM_ID_ENV = 'PI_SUBAGENT_TEAM_ID';\nexport const SUBAGENT_TEAM_ROOT_SESSION_ENV = 'PI_SUBAGENT_TEAM_ROOT_SESSION';\nexport const SUBAGENT_TEAM_MAIN_MEMBER_ENV = 'PI_SUBAGENT_TEAM_MAIN_MEMBER';\nexport const SUBAGENT_TEAM_MEMBER_ID_ENV = 'PI_SUBAGENT_TEAM_MEMBER_ID';\nexport const SUBAGENT_TEAM_MEMBER_TOKEN_ENV = 'PI_SUBAGENT_TEAM_MEMBER_TOKEN';\n\nexport const SUBAGENT_CAPABILITY_CEILING_ENV = 'PI_SUBAGENT_CAPABILITY_CEILING_V1';\nexport const REQUIRED_CHILD_TOOLS_ENV = 'PI_SUBAGENT_REQUIRED_TOOLS';\nexport const MCP_DIRECT_CHILD_TOOLS_ENV = 'PI_SUBAGENT_MCP_DIRECT_TOOLS';\nexport const CHILD_TOOL_DIAGNOSTIC_PATH_ENV = 'PI_SUBAGENT_TOOL_DIAGNOSTIC_PATH';\nexport const TOOL_BUDGET_ENV = 'PI_SUBAGENT_TOOL_BUDGET';\nexport const TOOL_BUDGET_ZERO_AUTH_ENV = 'PI_SUBAGENT_TOOL_BUDGET_ZERO_AUTH';\nexport const MAX_SPAWNS_PER_SESSION_ENV = 'PI_SUBAGENT_MAX_SPAWNS_PER_SESSION';\nexport const STRUCTURED_OUTPUT_SCHEMA_ENV = 'PI_SUBAGENT_STRUCTURED_OUTPUT_SCHEMA';\nexport const STRUCTURED_OUTPUT_CAPTURE_ENV = 'PI_SUBAGENT_STRUCTURED_OUTPUT_CAPTURE';\nexport const INHERIT_PROJECT_CONTEXT_ENV = 'PI_SUBAGENT_INHERIT_PROJECT_CONTEXT';\nexport const INHERIT_SKILLS_ENV = 'PI_SUBAGENT_INHERIT_SKILLS';\n/**\n * Unprefixed on purpose: this one belongs to the Pi host, not to us. The child's\n * Pi runtime reads it directly, so the name is fixed by that contract and must\n * not be brought under the `PI_SUBAGENT_` namespace.\n */\nexport const MCP_DIRECT_TOOLS_ENV = 'MCP_DIRECT_TOOLS';\n/** Overrides where worktrees are created, for hosts whose tmpdir is unsuitable. */\nexport const WORKTREE_BASE_DIR_ENV = 'PI_SUBAGENTS_WORKTREE_DIR';\nexport const EXTRA_AGENT_DIRS_ENV = 'PI_SUBAGENT_EXTRA_AGENT_DIRS';\nexport const EXTRA_SKILL_DIRS_ENV = 'PI_SUBAGENT_EXTRA_SKILL_DIRS';\nexport const PI_SUBAGENT_PI_BINARY_ENV = 'PI_SUBAGENT_PI_BINARY';\nexport const PI_CODING_AGENT_PACKAGE_ROOT_ENV = 'PI_SUBAGENTS_PI_CODING_AGENT_PACKAGE_ROOT';\nexport const SUBAGENT_INTERCOM_SESSION_NAME_ENV = 'PI_SUBAGENT_INTERCOM_SESSION_NAME';\nexport const PI_INTERCOM_STABLE_ID_ENV = 'PI_INTERCOM_STABLE_ID';\nexport const PI_INTERCOM_SESSION_ID_ENV = 'PI_INTERCOM_SESSION_ID';\n\n/** Resolved child-safe DoomPi extensions inherited by SDK-backed agents. */\nexport const DOOMPI_CHILD_EXTENSIONS_ENV = 'DOOMPI_CHILD_EXTENSIONS';\n/** Resolved DoomPi domain skill directories inherited by SDK-backed agents. */\nexport const DOOMPI_SKILL_DIRS_ENV = 'DOOMPI_SKILL_DIRS';\n"],"mappings":"yNA2CA,SAAgB,EAAgC,EAAuC,CACrF,GAAI,CAAC,EAAS,MAAO,EAAE,CACvB,GAAI,CACF,IAAM,EAAkB,KAAK,MAAM,EAAQ,CAE3C,OADK,MAAM,QAAQ,EAAO,CACnB,CACL,GAAG,IAAI,IACL,EAAO,OACJ,GAA2B,OAAO,GAAU,UAAY,OAAO,cAAc,EAAM,EAAI,EAAQ,EACjG,CACF,CACF,CAPkC,EAAE,MAQ/B,CACN,MAAO,EAAE,EAgBb,SAAgB,EAAoB,EAAyB,CAC3D,MAAO,aAAa,EAAQ,aAAa,CAAC,QAAQ,cAAe,IAAI,CAAC,4GA9C3D,EAAsB,qBACtB,EAA2B,0BAC3B,EAA2B,0BAC3B,EAA4B,2BAC5B,EAAiC,gCACjC,EAAoC,mCACpC,EAAkC,iCAClC,EAA6B,4BAC7B,EAAkC,iCAClC,EAA4B,2BAC5B,EAA2B,0BAC3B,EAAuC,sCAEvC,EAAqC,oCAmBrC,EAA2B,0BAC3B,EAAgC,+BAChC,EAA6B,4BAG7B,EAAkB,KAYlB,EAAuB,sBACvB,EAAiC,gCACjC,EAAgC,+BAChC,EAA8B,6BAC9B,EAAiC,gCAEjC,EAAkC,oCAClC,EAA2B,6BAC3B,EAA6B,+BAC7B,EAAiC,mCACjC,EAAkB,0BAClB,EAA4B,oCAC5B,EAA6B,qCAC7B,EAA+B,uCAC/B,EAAgC,wCAChC,EAA8B,sCAC9B,EAAqB,6BAMrB,EAAuB,mBAEvB,EAAwB,4BACxB,EAAuB,+BACvB,EAAuB,+BACvB,EAA4B,wBAC5B,EAAmC,4CACnC,EAAqC,oCACrC,EAA4B,wBAC5B,EAA6B,yBAG7B,EAA8B,0BAE9B,EAAwB"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../../_virtual/_rolldown/runtime.cjs`),t=require(`../atomicJson.cjs`);require(`../../shared/atomicJson.cjs`);const n=require(`./env.cjs`),r=require(`../../shared/paths.cjs`),i=require(`./childTranscript.cjs`);require(`../../shared/childTranscript.cjs`);const a=require(`../../services/runs/background/parentWatchdog.cjs`),o=require(`../../services/runs/extensionErrorTelemetry.cjs`);let s=require(`node:fs`);s=e.__toESM(s,1);let c=require(`@earendil-works/pi-coding-agent`),l=require(`@agimon-ai/doompi-telemetry`),u=require(`@agimon-ai/doompi-extension-contracts/child-process`);const d=`doom_team.child_finished`,f=`doom_team.child_failed`;function p(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function m(e){return e instanceof Error?e.message:String(e)}function h(e){let t=r.currentRunConfigPath(e),n=JSON.parse(s.readFileSync(t,`utf8`));if(!p(n)||n.runId!==e||!p(n.sdk))throw Error(`Launch config for run '${e}' is invalid.`);return n}function g(e){let{cwd:t,sdk:n}=e;return n.sessionFile?c.SessionManager.open(n.sessionFile,n.sessionDir,t):n.sessionEnabled?c.SessionManager.create(t,n.sessionDir):c.SessionManager.inMemory(t)}function _(e,n){let r=e?.handshakePath;!r||s.existsSync(r)||t.writeAtomicJson(r,{state:`error`,error:m(n)})}let v,y;async function b(e,t,n){let r=y;y=void 0,r&&(n===void 0?await r.recordEvent(e,t):await r.recordError(e,n,t),await r.flush(),await r.shutdown())}async function x(){let e=Date.now();y=(0,l.createDoomTelemetry)({serviceName:`doom-team-sdk-child`,packageName:`@agimon-ai/doompi-team`,env:process.env,enableLogs:!0,enableTraces:!0});let t=process.env[n.SUBAGENT_RUN_ID_ENV]?.trim();if(!t)throw Error(`${n.SUBAGENT_RUN_ID_ENV} is required.`);if(!r.adoptSessionScopeFromEnv())throw Error(`${u.SUBAGENT_ROOT_SESSION_ENV} is required: a child cannot resolve its session scope without it.`);let s;try{s=h(t);let n=s;await y?.recordEvent(`doom_team.child_started`,{runtime:`sdk`,"agent.name":n.agent,...n.sdk.model?{"model.id":n.sdk.model}:{},outcome:`started`});let{sdk:r}=n,l=(0,c.getAgentDir)(),u=await(0,c.createAgentSessionServices)({cwd:s.cwd,agentDir:l,resourceLoaderOptions:{additionalExtensionPaths:r.extensions,additionalSkillPaths:r.skillPaths,noExtensions:r.noAmbientExtensions,noSkills:r.noSkills,noContextFiles:r.noContextFiles,...r.systemPromptMode===`replace`?{systemPrompt:r.systemPrompt}:{},...r.systemPrompt&&r.systemPromptMode!==`replace`?{appendSystemPrompt:[r.systemPrompt]}:{}}}),f=u.diagnostics.find(e=>e.type===`error`);if(f)throw Error(f.message);let p=r.model?(0,c.resolveCliModel)({cliModel:r.model,modelRuntime:u.modelRuntime}):void 0;if(p&&!p.model)throw Error(p.error??`Model '${r.model}' was not found.`);let{session:m}=await(0,c.createAgentSessionFromServices)({services:u,sessionManager:g(s),...p?.model?{model:p.model}:{},...p?.thinkingLevel?{thinkingLevel:p.thinkingLevel}:{},...r.tools?{tools:r.tools}:{},...r.noTools?{noTools:r.noTools}:{},...r.excludeTools?{excludeTools:r.excludeTools}:{}});v=a.startParentWatchdog({onParentLost:()=>{m.dispose(),b(d,{runtime:`sdk`,"agent.name":n.agent,duration_ms:Date.now()-e,outcome:`parent_lost`}).finally(()=>process.exit(0))}});let _=s.transcriptPath?i.createChildTranscriptWriter({transcriptPath:s.transcriptPath,source:`async`,runId:s.runId,agent:s.agent,childIndex:s.childIndex,cwd:s.cwd}):void 0;_?.writeInitialUserMessage(s.task);let x=m.subscribe(t=>{_?.writeChildEvent(t),t.type===`agent_end`&&setImmediate(()=>{m.agent.hasQueuedMessages()||(m.dispose(),b(d,{runtime:`sdk`,"agent.name":n.agent,duration_ms:Date.now()-e,outcome:`completed`}).finally(()=>process.exit(0)))})});try{await m.bindExtensions({mode:`print`,onError:e=>{o.recordNonBlockingExtensionError(y,e)}}),await m.prompt(s.task)}finally{v?.(),x(),m.dispose(),await b(d,{runtime:`sdk`,"agent.name":n.agent,duration_ms:Date.now()-e,outcome:`completed`})}}catch(e){throw _(s,e),await b(f,{outcome:`failed`},e),e}}x().then(()=>{process.exit(0)},async e=>{await b(f,{outcome:`failed`},e);let t=e instanceof Error?e:Error(`Doom Team SDK child failed`,{cause:e});setImmediate(()=>{throw t})}),exports.runSdkChild=x;
2
+ //# sourceMappingURL=sdkRunnerEntry.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkRunnerEntry.cjs","names":["currentRunConfigPath","fs","SessionManager","SUBAGENT_RUN_ID_ENV","adoptSessionScopeFromEnv","SUBAGENT_ROOT_SESSION_ENV","startParentWatchdog","createChildTranscriptWriter"],"sources":["../../../src/adapters/process/sdkRunnerEntry.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport {\n createAgentSessionFromServices,\n createAgentSessionServices,\n getAgentDir,\n resolveCliModel,\n SessionManager,\n} from '@earendil-works/pi-coding-agent';\n\nimport type { LaunchConfig } from '../../services/runs/background/asyncExecution.ts';\nimport { startParentWatchdog } from '../../services/runs/background/parentWatchdog.ts';\nimport { recordNonBlockingExtensionError } from '../../services/runs/extensionErrorTelemetry.ts';\nimport { writeAtomicJson } from '../../shared/atomicJson.ts';\nimport { createChildTranscriptWriter } from '../../shared/childTranscript.ts';\nimport { adoptSessionScopeFromEnv, currentRunConfigPath } from '../../shared/paths.ts';\nimport { SUBAGENT_ROOT_SESSION_ENV, SUBAGENT_RUN_ID_ENV } from './env.ts';\n\nconst SDK_RUNTIME = 'sdk';\nconst CHILD_STARTED_EVENT = 'doom_team.child_started';\nconst CHILD_FINISHED_EVENT = 'doom_team.child_finished';\nconst CHILD_FAILED_EVENT = 'doom_team.child_failed';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction readLaunchConfig(runId: string): LaunchConfig {\n const configPath = currentRunConfigPath(runId);\n const parsed: unknown = JSON.parse(fs.readFileSync(configPath, 'utf8'));\n if (!isRecord(parsed) || parsed.runId !== runId || !isRecord(parsed.sdk)) {\n throw new Error(`Launch config for run '${runId}' is invalid.`);\n }\n return parsed as unknown as LaunchConfig;\n}\n\nfunction createSessionManager(config: LaunchConfig): SessionManager {\n const { cwd, sdk } = config;\n if (sdk.sessionFile) return SessionManager.open(sdk.sessionFile, sdk.sessionDir, cwd);\n if (sdk.sessionEnabled) return SessionManager.create(cwd, sdk.sessionDir);\n return SessionManager.inMemory(cwd);\n}\n\nfunction writeStartupError(config: LaunchConfig | undefined, error: unknown): void {\n const handshakePath = config?.handshakePath;\n if (!handshakePath || fs.existsSync(handshakePath)) return;\n writeAtomicJson(handshakePath, { state: 'error', error: errorMessage(error) });\n}\n\nlet stopWatchdog: (() => void) | undefined;\nlet childTelemetry: DoomTelemetry | undefined;\n\nasync function finishTelemetry(event: string, attributes: Record<string, unknown>, error?: unknown): Promise<void> {\n const telemetry = childTelemetry;\n childTelemetry = undefined;\n if (!telemetry) return;\n if (error === undefined) await telemetry.recordEvent(event, attributes);\n else await telemetry.recordError(event, error, attributes);\n await telemetry.flush();\n await telemetry.shutdown();\n}\n\nexport async function runSdkChild(): Promise<void> {\n const startedAt = Date.now();\n childTelemetry = createDoomTelemetry({\n serviceName: 'doom-team-sdk-child',\n packageName: '@agimon-ai/doompi-team',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const runId = process.env[SUBAGENT_RUN_ID_ENV]?.trim();\n if (!runId) throw new Error(`${SUBAGENT_RUN_ID_ENV} is required.`);\n // Before the launch config is read: its own path is scoped, so a child that\n // was spawned without a scope cannot find anything and should say why.\n if (!adoptSessionScopeFromEnv()) {\n throw new Error(`${SUBAGENT_ROOT_SESSION_ENV} is required: a child cannot resolve its session scope without it.`);\n }\n\n let config: LaunchConfig | undefined;\n try {\n config = readLaunchConfig(runId);\n const launchConfig = config;\n await childTelemetry?.recordEvent(CHILD_STARTED_EVENT, {\n runtime: SDK_RUNTIME,\n 'agent.name': launchConfig.agent,\n ...(launchConfig.sdk.model ? { 'model.id': launchConfig.sdk.model } : {}),\n outcome: 'started',\n });\n const { sdk } = launchConfig;\n const agentDir = getAgentDir();\n const services = await createAgentSessionServices({\n cwd: config.cwd,\n agentDir,\n resourceLoaderOptions: {\n additionalExtensionPaths: sdk.extensions,\n additionalSkillPaths: sdk.skillPaths,\n noExtensions: sdk.noAmbientExtensions,\n noSkills: sdk.noSkills,\n noContextFiles: sdk.noContextFiles,\n ...(sdk.systemPromptMode === 'replace' ? { systemPrompt: sdk.systemPrompt } : {}),\n ...(sdk.systemPrompt && sdk.systemPromptMode !== 'replace' ? { appendSystemPrompt: [sdk.systemPrompt] } : {}),\n },\n });\n const serviceError = services.diagnostics.find((diagnostic) => diagnostic.type === 'error');\n if (serviceError) throw new Error(serviceError.message);\n\n const resolved = sdk.model\n ? resolveCliModel({ cliModel: sdk.model, modelRuntime: services.modelRuntime })\n : undefined;\n if (resolved && !resolved.model) throw new Error(resolved.error ?? `Model '${sdk.model}' was not found.`);\n\n const { session } = await createAgentSessionFromServices({\n services,\n sessionManager: createSessionManager(config),\n ...(resolved?.model ? { model: resolved.model } : {}),\n ...(resolved?.thinkingLevel ? { thinkingLevel: resolved.thinkingLevel } : {}),\n ...(sdk.tools ? { tools: sdk.tools } : {}),\n ...(sdk.noTools ? { noTools: sdk.noTools } : {}),\n ...(sdk.excludeTools ? { excludeTools: sdk.excludeTools } : {}),\n });\n // The parent cannot signal us if it was SIGKILLed, and we are in our own\n // process group so its terminal cannot either. This is the only thing that\n // ends this run in that case.\n stopWatchdog = startParentWatchdog({\n onParentLost: () => {\n session.dispose();\n void finishTelemetry(CHILD_FINISHED_EVENT, {\n runtime: SDK_RUNTIME,\n 'agent.name': launchConfig.agent,\n duration_ms: Date.now() - startedAt,\n outcome: 'parent_lost',\n }).finally(() => process.exit(0));\n },\n });\n\n const transcript = config.transcriptPath\n ? createChildTranscriptWriter({\n transcriptPath: config.transcriptPath,\n source: 'async',\n runId: config.runId,\n agent: config.agent,\n childIndex: config.childIndex,\n cwd: config.cwd,\n })\n : undefined;\n transcript?.writeInitialUserMessage(config.task);\n const unsubscribe = session.subscribe((event) => {\n transcript?.writeChildEvent(event);\n if (event.type !== 'agent_end') return;\n // Pi emits session listeners only after awaiting every extension's\n // agent_end handler, including Doom Team's terminal persistence. Defer\n // one event-loop turn so every listener observes the event, then end\n // this dedicated one-session process unless an agent_end handler queued\n // a nudge or follow-up that Pi still needs to run.\n setImmediate(() => {\n if (session.agent.hasQueuedMessages()) return;\n session.dispose();\n void finishTelemetry(CHILD_FINISHED_EVENT, {\n runtime: SDK_RUNTIME,\n 'agent.name': launchConfig.agent,\n duration_ms: Date.now() - startedAt,\n outcome: 'completed',\n }).finally(() => process.exit(0));\n });\n });\n\n try {\n await session.bindExtensions({\n mode: 'print',\n onError: (failure) => {\n recordNonBlockingExtensionError(childTelemetry, failure);\n },\n });\n await session.prompt(config.task);\n } finally {\n stopWatchdog?.();\n unsubscribe();\n session.dispose();\n await finishTelemetry(CHILD_FINISHED_EVENT, {\n runtime: SDK_RUNTIME,\n 'agent.name': launchConfig.agent,\n duration_ms: Date.now() - startedAt,\n outcome: 'completed',\n });\n }\n } catch (error) {\n writeStartupError(config, error);\n await finishTelemetry(CHILD_FAILED_EVENT, { outcome: 'failed' }, error);\n throw error;\n }\n}\n\nvoid runSdkChild().then(\n () => {\n // This entry point owns a dedicated detached process for exactly one SDK\n // session. Extensions may retain polling intervals after session.dispose(),\n // so a successful run must terminate explicitly once synchronous result\n // persistence and session cleanup have completed.\n process.exit(0);\n },\n async (error: unknown) => {\n await finishTelemetry(CHILD_FAILED_EVENT, { outcome: 'failed' }, error);\n const failure = error instanceof Error ? error : new Error('Doom Team SDK child failed', { cause: error });\n setImmediate(() => {\n throw failure;\n });\n },\n);\n"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ //#region src/adapters/process/sdkRunnerEntry.d.ts
2
+ declare function runSdkChild(): Promise<void>;
3
+ //#endregion
4
+ export { runSdkChild };
5
+ //# sourceMappingURL=sdkRunnerEntry.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkRunnerEntry.d.cts","names":[],"sources":["../../../src/adapters/process/sdkRunnerEntry.ts"],"mappings":";iBAkEsB,WAAA,CAAA,GAAe,OAAA"}
@@ -0,0 +1,5 @@
1
+ //#region src/adapters/process/sdkRunnerEntry.d.ts
2
+ declare function runSdkChild(): Promise<void>;
3
+ //#endregion
4
+ export { runSdkChild };
5
+ //# sourceMappingURL=sdkRunnerEntry.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkRunnerEntry.d.mts","names":[],"sources":["../../../src/adapters/process/sdkRunnerEntry.ts"],"mappings":";iBAkEsB,WAAA,CAAA,GAAe,OAAA"}
@@ -0,0 +1,2 @@
1
+ import{writeAtomicJson as e}from"../atomicJson.mjs";import{init_atomicJson as t}from"../../shared/atomicJson.mjs";import{SUBAGENT_ROOT_SESSION_ENV as n,SUBAGENT_RUN_ID_ENV as r,init_env as i}from"./env.mjs";import{adoptSessionScopeFromEnv as a,currentRunConfigPath as o,init_paths as s}from"../../shared/paths.mjs";import{createChildTranscriptWriter as c}from"./childTranscript.mjs";import{init_childTranscript as l}from"../../shared/childTranscript.mjs";import{startParentWatchdog as u}from"../../services/runs/background/parentWatchdog.mjs";import{recordNonBlockingExtensionError as d}from"../../services/runs/extensionErrorTelemetry.mjs";import*as f from"node:fs";import{SessionManager as p,createAgentSessionFromServices as m,createAgentSessionServices as h,getAgentDir as g,resolveCliModel as _}from"@earendil-works/pi-coding-agent";import{createDoomTelemetry as v}from"@agimon-ai/doompi-telemetry";t(),l(),s(),i();const y=`doom_team.child_finished`,b=`doom_team.child_failed`;function x(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function S(e){return e instanceof Error?e.message:String(e)}function C(e){let t=o(e),n=JSON.parse(f.readFileSync(t,`utf8`));if(!x(n)||n.runId!==e||!x(n.sdk))throw Error(`Launch config for run '${e}' is invalid.`);return n}function w(e){let{cwd:t,sdk:n}=e;return n.sessionFile?p.open(n.sessionFile,n.sessionDir,t):n.sessionEnabled?p.create(t,n.sessionDir):p.inMemory(t)}function T(t,n){let r=t?.handshakePath;!r||f.existsSync(r)||e(r,{state:`error`,error:S(n)})}let E,D;async function O(e,t,n){let r=D;D=void 0,r&&(n===void 0?await r.recordEvent(e,t):await r.recordError(e,n,t),await r.flush(),await r.shutdown())}async function k(){let e=Date.now();D=v({serviceName:`doom-team-sdk-child`,packageName:`@agimon-ai/doompi-team`,env:process.env,enableLogs:!0,enableTraces:!0});let t=process.env[r]?.trim();if(!t)throw Error(`${r} is required.`);if(!a())throw Error(`${n} is required: a child cannot resolve its session scope without it.`);let i;try{i=C(t);let n=i;await D?.recordEvent(`doom_team.child_started`,{runtime:`sdk`,"agent.name":n.agent,...n.sdk.model?{"model.id":n.sdk.model}:{},outcome:`started`});let{sdk:r}=n,a=g(),o=await h({cwd:i.cwd,agentDir:a,resourceLoaderOptions:{additionalExtensionPaths:r.extensions,additionalSkillPaths:r.skillPaths,noExtensions:r.noAmbientExtensions,noSkills:r.noSkills,noContextFiles:r.noContextFiles,...r.systemPromptMode===`replace`?{systemPrompt:r.systemPrompt}:{},...r.systemPrompt&&r.systemPromptMode!==`replace`?{appendSystemPrompt:[r.systemPrompt]}:{}}}),s=o.diagnostics.find(e=>e.type===`error`);if(s)throw Error(s.message);let l=r.model?_({cliModel:r.model,modelRuntime:o.modelRuntime}):void 0;if(l&&!l.model)throw Error(l.error??`Model '${r.model}' was not found.`);let{session:f}=await m({services:o,sessionManager:w(i),...l?.model?{model:l.model}:{},...l?.thinkingLevel?{thinkingLevel:l.thinkingLevel}:{},...r.tools?{tools:r.tools}:{},...r.noTools?{noTools:r.noTools}:{},...r.excludeTools?{excludeTools:r.excludeTools}:{}});E=u({onParentLost:()=>{f.dispose(),O(y,{runtime:`sdk`,"agent.name":n.agent,duration_ms:Date.now()-e,outcome:`parent_lost`}).finally(()=>process.exit(0))}});let p=i.transcriptPath?c({transcriptPath:i.transcriptPath,source:`async`,runId:i.runId,agent:i.agent,childIndex:i.childIndex,cwd:i.cwd}):void 0;p?.writeInitialUserMessage(i.task);let v=f.subscribe(t=>{p?.writeChildEvent(t),t.type===`agent_end`&&setImmediate(()=>{f.agent.hasQueuedMessages()||(f.dispose(),O(y,{runtime:`sdk`,"agent.name":n.agent,duration_ms:Date.now()-e,outcome:`completed`}).finally(()=>process.exit(0)))})});try{await f.bindExtensions({mode:`print`,onError:e=>{d(D,e)}}),await f.prompt(i.task)}finally{E?.(),v(),f.dispose(),await O(y,{runtime:`sdk`,"agent.name":n.agent,duration_ms:Date.now()-e,outcome:`completed`})}}catch(e){throw T(i,e),await O(b,{outcome:`failed`},e),e}}k().then(()=>{process.exit(0)},async e=>{await O(b,{outcome:`failed`},e);let t=e instanceof Error?e:Error(`Doom Team SDK child failed`,{cause:e});setImmediate(()=>{throw t})});export{k as runSdkChild};
2
+ //# sourceMappingURL=sdkRunnerEntry.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sdkRunnerEntry.mjs","names":[],"sources":["../../../src/adapters/process/sdkRunnerEntry.ts"],"sourcesContent":["import * as fs from 'node:fs';\nimport { createDoomTelemetry, type DoomTelemetry } from '@agimon-ai/doompi-telemetry';\nimport {\n createAgentSessionFromServices,\n createAgentSessionServices,\n getAgentDir,\n resolveCliModel,\n SessionManager,\n} from '@earendil-works/pi-coding-agent';\n\nimport type { LaunchConfig } from '../../services/runs/background/asyncExecution.ts';\nimport { startParentWatchdog } from '../../services/runs/background/parentWatchdog.ts';\nimport { recordNonBlockingExtensionError } from '../../services/runs/extensionErrorTelemetry.ts';\nimport { writeAtomicJson } from '../../shared/atomicJson.ts';\nimport { createChildTranscriptWriter } from '../../shared/childTranscript.ts';\nimport { adoptSessionScopeFromEnv, currentRunConfigPath } from '../../shared/paths.ts';\nimport { SUBAGENT_ROOT_SESSION_ENV, SUBAGENT_RUN_ID_ENV } from './env.ts';\n\nconst SDK_RUNTIME = 'sdk';\nconst CHILD_STARTED_EVENT = 'doom_team.child_started';\nconst CHILD_FINISHED_EVENT = 'doom_team.child_finished';\nconst CHILD_FAILED_EVENT = 'doom_team.child_failed';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction readLaunchConfig(runId: string): LaunchConfig {\n const configPath = currentRunConfigPath(runId);\n const parsed: unknown = JSON.parse(fs.readFileSync(configPath, 'utf8'));\n if (!isRecord(parsed) || parsed.runId !== runId || !isRecord(parsed.sdk)) {\n throw new Error(`Launch config for run '${runId}' is invalid.`);\n }\n return parsed as unknown as LaunchConfig;\n}\n\nfunction createSessionManager(config: LaunchConfig): SessionManager {\n const { cwd, sdk } = config;\n if (sdk.sessionFile) return SessionManager.open(sdk.sessionFile, sdk.sessionDir, cwd);\n if (sdk.sessionEnabled) return SessionManager.create(cwd, sdk.sessionDir);\n return SessionManager.inMemory(cwd);\n}\n\nfunction writeStartupError(config: LaunchConfig | undefined, error: unknown): void {\n const handshakePath = config?.handshakePath;\n if (!handshakePath || fs.existsSync(handshakePath)) return;\n writeAtomicJson(handshakePath, { state: 'error', error: errorMessage(error) });\n}\n\nlet stopWatchdog: (() => void) | undefined;\nlet childTelemetry: DoomTelemetry | undefined;\n\nasync function finishTelemetry(event: string, attributes: Record<string, unknown>, error?: unknown): Promise<void> {\n const telemetry = childTelemetry;\n childTelemetry = undefined;\n if (!telemetry) return;\n if (error === undefined) await telemetry.recordEvent(event, attributes);\n else await telemetry.recordError(event, error, attributes);\n await telemetry.flush();\n await telemetry.shutdown();\n}\n\nexport async function runSdkChild(): Promise<void> {\n const startedAt = Date.now();\n childTelemetry = createDoomTelemetry({\n serviceName: 'doom-team-sdk-child',\n packageName: '@agimon-ai/doompi-team',\n env: process.env,\n enableLogs: true,\n enableTraces: true,\n });\n const runId = process.env[SUBAGENT_RUN_ID_ENV]?.trim();\n if (!runId) throw new Error(`${SUBAGENT_RUN_ID_ENV} is required.`);\n // Before the launch config is read: its own path is scoped, so a child that\n // was spawned without a scope cannot find anything and should say why.\n if (!adoptSessionScopeFromEnv()) {\n throw new Error(`${SUBAGENT_ROOT_SESSION_ENV} is required: a child cannot resolve its session scope without it.`);\n }\n\n let config: LaunchConfig | undefined;\n try {\n config = readLaunchConfig(runId);\n const launchConfig = config;\n await childTelemetry?.recordEvent(CHILD_STARTED_EVENT, {\n runtime: SDK_RUNTIME,\n 'agent.name': launchConfig.agent,\n ...(launchConfig.sdk.model ? { 'model.id': launchConfig.sdk.model } : {}),\n outcome: 'started',\n });\n const { sdk } = launchConfig;\n const agentDir = getAgentDir();\n const services = await createAgentSessionServices({\n cwd: config.cwd,\n agentDir,\n resourceLoaderOptions: {\n additionalExtensionPaths: sdk.extensions,\n additionalSkillPaths: sdk.skillPaths,\n noExtensions: sdk.noAmbientExtensions,\n noSkills: sdk.noSkills,\n noContextFiles: sdk.noContextFiles,\n ...(sdk.systemPromptMode === 'replace' ? { systemPrompt: sdk.systemPrompt } : {}),\n ...(sdk.systemPrompt && sdk.systemPromptMode !== 'replace' ? { appendSystemPrompt: [sdk.systemPrompt] } : {}),\n },\n });\n const serviceError = services.diagnostics.find((diagnostic) => diagnostic.type === 'error');\n if (serviceError) throw new Error(serviceError.message);\n\n const resolved = sdk.model\n ? resolveCliModel({ cliModel: sdk.model, modelRuntime: services.modelRuntime })\n : undefined;\n if (resolved && !resolved.model) throw new Error(resolved.error ?? `Model '${sdk.model}' was not found.`);\n\n const { session } = await createAgentSessionFromServices({\n services,\n sessionManager: createSessionManager(config),\n ...(resolved?.model ? { model: resolved.model } : {}),\n ...(resolved?.thinkingLevel ? { thinkingLevel: resolved.thinkingLevel } : {}),\n ...(sdk.tools ? { tools: sdk.tools } : {}),\n ...(sdk.noTools ? { noTools: sdk.noTools } : {}),\n ...(sdk.excludeTools ? { excludeTools: sdk.excludeTools } : {}),\n });\n // The parent cannot signal us if it was SIGKILLed, and we are in our own\n // process group so its terminal cannot either. This is the only thing that\n // ends this run in that case.\n stopWatchdog = startParentWatchdog({\n onParentLost: () => {\n session.dispose();\n void finishTelemetry(CHILD_FINISHED_EVENT, {\n runtime: SDK_RUNTIME,\n 'agent.name': launchConfig.agent,\n duration_ms: Date.now() - startedAt,\n outcome: 'parent_lost',\n }).finally(() => process.exit(0));\n },\n });\n\n const transcript = config.transcriptPath\n ? createChildTranscriptWriter({\n transcriptPath: config.transcriptPath,\n source: 'async',\n runId: config.runId,\n agent: config.agent,\n childIndex: config.childIndex,\n cwd: config.cwd,\n })\n : undefined;\n transcript?.writeInitialUserMessage(config.task);\n const unsubscribe = session.subscribe((event) => {\n transcript?.writeChildEvent(event);\n if (event.type !== 'agent_end') return;\n // Pi emits session listeners only after awaiting every extension's\n // agent_end handler, including Doom Team's terminal persistence. Defer\n // one event-loop turn so every listener observes the event, then end\n // this dedicated one-session process unless an agent_end handler queued\n // a nudge or follow-up that Pi still needs to run.\n setImmediate(() => {\n if (session.agent.hasQueuedMessages()) return;\n session.dispose();\n void finishTelemetry(CHILD_FINISHED_EVENT, {\n runtime: SDK_RUNTIME,\n 'agent.name': launchConfig.agent,\n duration_ms: Date.now() - startedAt,\n outcome: 'completed',\n }).finally(() => process.exit(0));\n });\n });\n\n try {\n await session.bindExtensions({\n mode: 'print',\n onError: (failure) => {\n recordNonBlockingExtensionError(childTelemetry, failure);\n },\n });\n await session.prompt(config.task);\n } finally {\n stopWatchdog?.();\n unsubscribe();\n session.dispose();\n await finishTelemetry(CHILD_FINISHED_EVENT, {\n runtime: SDK_RUNTIME,\n 'agent.name': launchConfig.agent,\n duration_ms: Date.now() - startedAt,\n outcome: 'completed',\n });\n }\n } catch (error) {\n writeStartupError(config, error);\n await finishTelemetry(CHILD_FAILED_EVENT, { outcome: 'failed' }, error);\n throw error;\n }\n}\n\nvoid runSdkChild().then(\n () => {\n // This entry point owns a dedicated detached process for exactly one SDK\n // session. Extensions may retain polling intervals after session.dispose(),\n // so a successful run must terminate explicitly once synchronous result\n // persistence and session cleanup have completed.\n process.exit(0);\n },\n async (error: unknown) => {\n await finishTelemetry(CHILD_FAILED_EVENT, { outcome: 'failed' }, error);\n const failure = error instanceof Error ? error : new Error('Doom Team SDK child failed', { cause: error });\n setImmediate(() => {\n throw failure;\n });\n },\n);\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.cjs`),n=require(`../shared/paths.cjs`),r=require(`../services/runs/background/terminalPersistence.cjs`);let i=require(`node:fs`);i=e.__toESM(i,1);let a=require(`node:path`);a=e.__toESM(a,1);let o=require(`inversify`);function s(e){return a.join(n.currentRunsDir(),e,r.CRASH_MARKER_FILE_NAME)}function c(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function l(e){return typeof e==`object`&&e&&`code`in e?e.code:void 0}function u(e,t=process.kill.bind(process)){try{return t(e,0),`alive`}catch(e){return l(e)===`ESRCH`?`dead`:`unknown`}}let d=class{probePid(e){return u(e)}readFile(e){try{return i.readFileSync(e,`utf-8`)}catch(e){if(l(e)===`ENOENT`)return;throw e}}readCrashMarker(e){let t=this.readFile(s(e));if(t===void 0)return;let n;try{n=JSON.parse(t)}catch{return}if(!(!c(n)||n.version!==1||typeof n.runId!=`string`||typeof n.pid!=`number`||typeof n.startedAt!=`number`))return{version:1,runId:n.runId,pid:n.pid,startedAt:n.startedAt}}async readFileAsync(e){try{return await i.promises.readFile(e,`utf-8`)}catch(e){if(l(e)===`ENOENT`)return;throw e}}async readCrashMarkerAsync(e){let t=await this.readFileAsync(s(e));if(t===void 0)return;let n;try{n=JSON.parse(t)}catch{return}if(!(!c(n)||n.version!==1||typeof n.runId!=`string`||typeof n.pid!=`number`||typeof n.startedAt!=`number`))return{version:1,runId:n.runId,pid:n.pid,startedAt:n.startedAt}}verdictFor(e){if(!e)return{state:`unknown`,marker:void 0};let t=this.probePid(e.pid);return t===`dead`?{state:`crashed`,marker:e}:t===`alive`?{state:`alive`,marker:e}:{state:`unknown`,marker:e}}inspect(e){return this.verdictFor(this.readCrashMarker(e))}async inspectAsync(e){return this.verdictFor(await this.readCrashMarkerAsync(e))}};d=t.__decorate([(0,o.injectable)()],d),Object.defineProperty(exports,`ProcessTerminalInspector`,{enumerable:!0,get:function(){return d}}),exports.checkPidLiveness=u;
2
+ //# sourceMappingURL=processTerminal.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processTerminal.cjs","names":["path","currentRunsDir","CRASH_MARKER_FILE_NAME","fs"],"sources":["../../src/adapters/processTerminal.ts"],"sourcesContent":["/**\n * Provable-death check for one run's owning process.\n *\n * WHY THIS IS SMALLER THAN THE PREDECESSOR:\n * `doom-pi-subagents/src/runs/background/processTerminal.ts` proves process\n * termination by cross-referencing every spawned `pi` writer's own close\n * observation against an expected-writer-count candidate file, plus a\n * canonical-session-lease projection for resumability. None of that\n * infrastructure exists in this package yet (writer-close observation and\n * session-lease-aware resumability are later work). What this package already\n * has is `TerminalPersistenceService`'s crash marker: one file, written before\n * a run does anything else and cleared only once `finalize()` has actually\n * persisted a terminal result. That is already a complete answer to the one\n * question `StaleRunReconciler` needs answered - \"did this run's process die\n * without ever finishing?\" - so this module reads that marker instead of\n * reintroducing the predecessor's writer-candidate apparatus.\n *\n * WHY A SEPARATE MODULE FROM `TerminalPersistenceService`:\n * `TerminalPersistenceService` writes and clears the crash marker for the ONE\n * run its own process is guarding. Reading someone else's marker to judge\n * whether THEIR process died is a different responsibility, usually exercised\n * from a different process entirely (the one asking \"is this stale?\", not the\n * one that was running). Splitting it out is what lets `TerminalPersistenceService`'s\n * own header say \"reading it to make that determination is a different\n * module's job\" and mean it.\n *\n * THE VERDICT IS DELIBERATELY THREE-VALUED, NOT TWO:\n * `'crashed'` is the only value that authorizes a repair. `'alive'` and\n * `'unknown'` both mean \"do not touch this run\" - a live pid means it is\n * genuinely still running, and an unreadable pid liveness (`EPERM`, or no\n * marker at all for a run whose status claims to be in flight) means this\n * module cannot prove anything either way. Collapsing `'alive'` and\n * `'unknown'` into one \"don't repair\" value would hide, from every caller,\n * that ambiguity is a real observable outcome, not just the absence of one.\n *\n * AVOID:\n * - Ever returning `'crashed'` from anything other than an OS-confirmed ESRCH\n * on the marker's pid. `EPERM`, a missing marker, or \"no update in a long\n * time\" are all real conditions a caller may still want to know about, but\n * none of them prove death, and treating them as though they did is exactly\n * the guess `StaleRunReconciler` exists to refuse\n * - Writing anything here. This module only reads\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { injectable } from 'inversify';\nimport { CRASH_MARKER_FILE_NAME } from '../services/runs/background/terminalPersistence.ts';\nimport { currentRunsDir } from '../shared/paths.ts';\n\nconst CRASH_MARKER_VERSION = 1;\n\nexport type ProcessLiveness = 'alive' | 'dead' | 'unknown';\n\n/** A signal-0 probe, injectable so a test never sends a real signal to a real pid. */\nexport type PidProbe = (pid: number, signal?: NodeJS.Signals | 0) => boolean;\n\nexport interface CrashMarkerRecord {\n version: typeof CRASH_MARKER_VERSION;\n runId: string;\n pid: number;\n startedAt: number;\n}\n\nexport type ProcessTerminalVerdict =\n | { state: 'alive'; marker: CrashMarkerRecord }\n | { state: 'crashed'; marker: CrashMarkerRecord }\n | { state: 'unknown'; marker: CrashMarkerRecord | undefined };\n\nexport interface IProcessTerminalInspector {\n /** Whether `runId`'s owning process is provably dead, based on its crash marker. */\n inspect(runId: string): ProcessTerminalVerdict;\n /** Promise-based marker read for recurring reconciliation. */\n inspectAsync?(runId: string): Promise<ProcessTerminalVerdict>;\n}\n\nfunction crashMarkerPath(runId: string): string {\n return path.join(currentRunsDir(), runId, CRASH_MARKER_FILE_NAME);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return typeof error === 'object' && error !== null && 'code' in error\n ? (error as NodeJS.ErrnoException).code\n : undefined;\n}\n\n/**\n * `kill(pid, 0)` sends no signal; it only asks the OS whether the pid could be\n * signalled. `ESRCH` is the OS actively confirming no such process exists -\n * the one condition this module trusts as proof. `EPERM` means a process is\n * there but this process may not signal it (commonly a different user), which\n * proves the opposite of death and is reported as `'unknown'` rather than\n * `'alive'` only because ownership, not existence, is what is uncertain there;\n * treating it as `'alive'` would also be a safe, defensible reading, but\n * `'unknown'` keeps the caller from building any certainty either way on it.\n */\nexport function checkPidLiveness(pid: number, probe: PidProbe = process.kill.bind(process)): ProcessLiveness {\n try {\n probe(pid, 0);\n return 'alive';\n } catch (error) {\n const code = errorCode(error);\n if (code === 'ESRCH') return 'dead';\n return 'unknown';\n }\n}\n\n@injectable()\nexport class ProcessTerminalInspector implements IProcessTerminalInspector {\n /**\n * Seam for tests, as a protected member rather than a constructor argument:\n * inversify cannot resolve a function value as a dependency, and a unit test\n * must never deliver a real signal to a real pid.\n */\n protected probePid(pid: number): ProcessLiveness {\n return checkPidLiveness(pid);\n }\n\n protected readFile(filePath: string): string | undefined {\n try {\n return fs.readFileSync(filePath, 'utf-8');\n } catch (error) {\n if (errorCode(error) === 'ENOENT') return undefined;\n throw error;\n }\n }\n\n protected readCrashMarker(runId: string): CrashMarkerRecord | undefined {\n const raw = this.readFile(crashMarkerPath(runId));\n if (raw === undefined) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n // A marker mid-write (rename not yet visible, or a torn read) is not\n // evidence of anything; treated the same as no marker at all.\n return undefined;\n }\n if (\n !isRecord(parsed) ||\n parsed.version !== CRASH_MARKER_VERSION ||\n typeof parsed.runId !== 'string' ||\n typeof parsed.pid !== 'number' ||\n typeof parsed.startedAt !== 'number'\n ) {\n return undefined;\n }\n return { version: CRASH_MARKER_VERSION, runId: parsed.runId, pid: parsed.pid, startedAt: parsed.startedAt };\n }\n\n protected async readFileAsync(filePath: string): Promise<string | undefined> {\n try {\n return await fs.promises.readFile(filePath, 'utf-8');\n } catch (error) {\n if (errorCode(error) === 'ENOENT') return undefined;\n throw error;\n }\n }\n\n protected async readCrashMarkerAsync(runId: string): Promise<CrashMarkerRecord | undefined> {\n const raw = await this.readFileAsync(crashMarkerPath(runId));\n if (raw === undefined) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return undefined;\n }\n if (\n !isRecord(parsed) ||\n parsed.version !== CRASH_MARKER_VERSION ||\n typeof parsed.runId !== 'string' ||\n typeof parsed.pid !== 'number' ||\n typeof parsed.startedAt !== 'number'\n ) {\n return undefined;\n }\n return { version: CRASH_MARKER_VERSION, runId: parsed.runId, pid: parsed.pid, startedAt: parsed.startedAt };\n }\n\n private verdictFor(marker: CrashMarkerRecord | undefined): ProcessTerminalVerdict {\n if (!marker) return { state: 'unknown', marker: undefined };\n const liveness = this.probePid(marker.pid);\n if (liveness === 'dead') return { state: 'crashed', marker };\n if (liveness === 'alive') return { state: 'alive', marker };\n return { state: 'unknown', marker };\n }\n\n inspect(runId: string): ProcessTerminalVerdict {\n return this.verdictFor(this.readCrashMarker(runId));\n }\n\n async inspectAsync(runId: string): Promise<ProcessTerminalVerdict> {\n return this.verdictFor(await this.readCrashMarkerAsync(runId));\n }\n}\n"],"mappings":"oVA4EA,SAAS,EAAgB,EAAuB,CAC9C,OAAOA,EAAK,KAAKC,EAAAA,gBAAgB,CAAE,EAAOC,EAAAA,uBAAuB,CAGnE,SAAS,EAAS,EAAkD,CAClE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAG7E,SAAS,EAAU,EAAoC,CACrD,OAAO,OAAO,GAAU,UAAY,GAAkB,SAAU,EAC3D,EAAgC,KACjC,IAAA,GAaN,SAAgB,EAAiB,EAAa,EAAkB,QAAQ,KAAK,KAAK,QAAQ,CAAmB,CAC3G,GAAI,CAEF,OADA,EAAM,EAAK,EAAE,CACN,cACA,EAAO,CAGd,OAFa,EAAU,EACf,GAAK,QAAgB,OACtB,WAKJ,IAAA,EAAA,KAAoE,CAMzE,SAAmB,EAA8B,CAC/C,OAAO,EAAiB,EAAI,CAG9B,SAAmB,EAAsC,CACvD,GAAI,CACF,OAAOC,EAAG,aAAa,EAAU,QAAQ,OAClC,EAAO,CACd,GAAI,EAAU,EAAM,GAAK,SAAU,OACnC,MAAM,GAIV,gBAA0B,EAA8C,CACtE,IAAM,EAAM,KAAK,SAAS,EAAgB,EAAM,CAAC,CACjD,GAAI,IAAQ,IAAA,GAAW,OACvB,IAAI,EACJ,GAAI,CACF,EAAS,KAAK,MAAM,EAAI,MAClB,CAGN,OAGA,MAAC,EAAS,EAAO,EACjB,EAAO,UAAY,GACnB,OAAO,EAAO,OAAU,UACxB,OAAO,EAAO,KAAQ,UACtB,OAAO,EAAO,WAAc,UAI9B,MAAO,CAAE,QAAS,EAAsB,MAAO,EAAO,MAAO,IAAK,EAAO,IAAK,UAAW,EAAO,UAAW,CAG7G,MAAgB,cAAc,EAA+C,CAC3E,GAAI,CACF,OAAO,MAAMA,EAAG,SAAS,SAAS,EAAU,QAAQ,OAC7C,EAAO,CACd,GAAI,EAAU,EAAM,GAAK,SAAU,OACnC,MAAM,GAIV,MAAgB,qBAAqB,EAAuD,CAC1F,IAAM,EAAM,MAAM,KAAK,cAAc,EAAgB,EAAM,CAAC,CAC5D,GAAI,IAAQ,IAAA,GAAW,OACvB,IAAI,EACJ,GAAI,CACF,EAAS,KAAK,MAAM,EAAI,MAClB,CACN,OAGA,MAAC,EAAS,EAAO,EACjB,EAAO,UAAY,GACnB,OAAO,EAAO,OAAU,UACxB,OAAO,EAAO,KAAQ,UACtB,OAAO,EAAO,WAAc,UAI9B,MAAO,CAAE,QAAS,EAAsB,MAAO,EAAO,MAAO,IAAK,EAAO,IAAK,UAAW,EAAO,UAAW,CAG7G,WAAmB,EAA+D,CAChF,GAAI,CAAC,EAAQ,MAAO,CAAE,MAAO,UAAW,OAAQ,IAAA,GAAW,CAC3D,IAAM,EAAW,KAAK,SAAS,EAAO,IAAI,CAG1C,OAFI,IAAa,OAAe,CAAE,MAAO,UAAW,SAAQ,CACxD,IAAa,QAAgB,CAAE,MAAO,QAAS,SAAQ,CACpD,CAAE,MAAO,UAAW,SAAQ,CAGrC,QAAQ,EAAuC,CAC7C,OAAO,KAAK,WAAW,KAAK,gBAAgB,EAAM,CAAC,CAGrD,MAAM,aAAa,EAAgD,CACjE,OAAO,KAAK,WAAW,MAAM,KAAK,qBAAqB,EAAM,CAAC,qCAtFrD,CAAA,CAAA,EAAA"}
@@ -0,0 +1,2 @@
1
+ import{__esmMin as e}from"../_virtual/_rolldown/runtime.mjs";import{__decorate as t,init_decorate as n}from"../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.mjs";import{currentRunsDir as r,init_paths as i}from"../shared/paths.mjs";import{CRASH_MARKER_FILE_NAME as a,init_terminalPersistence as o}from"../services/runs/background/terminalPersistence.mjs";import*as s from"node:fs";import*as c from"node:path";import{injectable as l}from"inversify";function u(e){return c.join(r(),e,a)}function d(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function f(e){return typeof e==`object`&&e&&`code`in e?e.code:void 0}function p(e,t=process.kill.bind(process)){try{return t(e,0),`alive`}catch(e){return f(e)===`ESRCH`?`dead`:`unknown`}}var m,h,g=e((()=>{o(),i(),n(),m=1,h=class{probePid(e){return p(e)}readFile(e){try{return s.readFileSync(e,`utf-8`)}catch(e){if(f(e)===`ENOENT`)return;throw e}}readCrashMarker(e){let t=this.readFile(u(e));if(t===void 0)return;let n;try{n=JSON.parse(t)}catch{return}if(!(!d(n)||n.version!==m||typeof n.runId!=`string`||typeof n.pid!=`number`||typeof n.startedAt!=`number`))return{version:m,runId:n.runId,pid:n.pid,startedAt:n.startedAt}}async readFileAsync(e){try{return await s.promises.readFile(e,`utf-8`)}catch(e){if(f(e)===`ENOENT`)return;throw e}}async readCrashMarkerAsync(e){let t=await this.readFileAsync(u(e));if(t===void 0)return;let n;try{n=JSON.parse(t)}catch{return}if(!(!d(n)||n.version!==m||typeof n.runId!=`string`||typeof n.pid!=`number`||typeof n.startedAt!=`number`))return{version:m,runId:n.runId,pid:n.pid,startedAt:n.startedAt}}verdictFor(e){if(!e)return{state:`unknown`,marker:void 0};let t=this.probePid(e.pid);return t===`dead`?{state:`crashed`,marker:e}:t===`alive`?{state:`alive`,marker:e}:{state:`unknown`,marker:e}}inspect(e){return this.verdictFor(this.readCrashMarker(e))}async inspectAsync(e){return this.verdictFor(await this.readCrashMarkerAsync(e))}},h=t([l()],h)}));g();export{h as ProcessTerminalInspector,p as checkPidLiveness,g as init_processTerminal};
2
+ //# sourceMappingURL=processTerminal.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"processTerminal.mjs","names":[],"sources":["../../src/adapters/processTerminal.ts"],"sourcesContent":["/**\n * Provable-death check for one run's owning process.\n *\n * WHY THIS IS SMALLER THAN THE PREDECESSOR:\n * `doom-pi-subagents/src/runs/background/processTerminal.ts` proves process\n * termination by cross-referencing every spawned `pi` writer's own close\n * observation against an expected-writer-count candidate file, plus a\n * canonical-session-lease projection for resumability. None of that\n * infrastructure exists in this package yet (writer-close observation and\n * session-lease-aware resumability are later work). What this package already\n * has is `TerminalPersistenceService`'s crash marker: one file, written before\n * a run does anything else and cleared only once `finalize()` has actually\n * persisted a terminal result. That is already a complete answer to the one\n * question `StaleRunReconciler` needs answered - \"did this run's process die\n * without ever finishing?\" - so this module reads that marker instead of\n * reintroducing the predecessor's writer-candidate apparatus.\n *\n * WHY A SEPARATE MODULE FROM `TerminalPersistenceService`:\n * `TerminalPersistenceService` writes and clears the crash marker for the ONE\n * run its own process is guarding. Reading someone else's marker to judge\n * whether THEIR process died is a different responsibility, usually exercised\n * from a different process entirely (the one asking \"is this stale?\", not the\n * one that was running). Splitting it out is what lets `TerminalPersistenceService`'s\n * own header say \"reading it to make that determination is a different\n * module's job\" and mean it.\n *\n * THE VERDICT IS DELIBERATELY THREE-VALUED, NOT TWO:\n * `'crashed'` is the only value that authorizes a repair. `'alive'` and\n * `'unknown'` both mean \"do not touch this run\" - a live pid means it is\n * genuinely still running, and an unreadable pid liveness (`EPERM`, or no\n * marker at all for a run whose status claims to be in flight) means this\n * module cannot prove anything either way. Collapsing `'alive'` and\n * `'unknown'` into one \"don't repair\" value would hide, from every caller,\n * that ambiguity is a real observable outcome, not just the absence of one.\n *\n * AVOID:\n * - Ever returning `'crashed'` from anything other than an OS-confirmed ESRCH\n * on the marker's pid. `EPERM`, a missing marker, or \"no update in a long\n * time\" are all real conditions a caller may still want to know about, but\n * none of them prove death, and treating them as though they did is exactly\n * the guess `StaleRunReconciler` exists to refuse\n * - Writing anything here. This module only reads\n */\n\nimport * as fs from 'node:fs';\nimport * as path from 'node:path';\nimport { injectable } from 'inversify';\nimport { CRASH_MARKER_FILE_NAME } from '../services/runs/background/terminalPersistence.ts';\nimport { currentRunsDir } from '../shared/paths.ts';\n\nconst CRASH_MARKER_VERSION = 1;\n\nexport type ProcessLiveness = 'alive' | 'dead' | 'unknown';\n\n/** A signal-0 probe, injectable so a test never sends a real signal to a real pid. */\nexport type PidProbe = (pid: number, signal?: NodeJS.Signals | 0) => boolean;\n\nexport interface CrashMarkerRecord {\n version: typeof CRASH_MARKER_VERSION;\n runId: string;\n pid: number;\n startedAt: number;\n}\n\nexport type ProcessTerminalVerdict =\n | { state: 'alive'; marker: CrashMarkerRecord }\n | { state: 'crashed'; marker: CrashMarkerRecord }\n | { state: 'unknown'; marker: CrashMarkerRecord | undefined };\n\nexport interface IProcessTerminalInspector {\n /** Whether `runId`'s owning process is provably dead, based on its crash marker. */\n inspect(runId: string): ProcessTerminalVerdict;\n /** Promise-based marker read for recurring reconciliation. */\n inspectAsync?(runId: string): Promise<ProcessTerminalVerdict>;\n}\n\nfunction crashMarkerPath(runId: string): string {\n return path.join(currentRunsDir(), runId, CRASH_MARKER_FILE_NAME);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return typeof error === 'object' && error !== null && 'code' in error\n ? (error as NodeJS.ErrnoException).code\n : undefined;\n}\n\n/**\n * `kill(pid, 0)` sends no signal; it only asks the OS whether the pid could be\n * signalled. `ESRCH` is the OS actively confirming no such process exists -\n * the one condition this module trusts as proof. `EPERM` means a process is\n * there but this process may not signal it (commonly a different user), which\n * proves the opposite of death and is reported as `'unknown'` rather than\n * `'alive'` only because ownership, not existence, is what is uncertain there;\n * treating it as `'alive'` would also be a safe, defensible reading, but\n * `'unknown'` keeps the caller from building any certainty either way on it.\n */\nexport function checkPidLiveness(pid: number, probe: PidProbe = process.kill.bind(process)): ProcessLiveness {\n try {\n probe(pid, 0);\n return 'alive';\n } catch (error) {\n const code = errorCode(error);\n if (code === 'ESRCH') return 'dead';\n return 'unknown';\n }\n}\n\n@injectable()\nexport class ProcessTerminalInspector implements IProcessTerminalInspector {\n /**\n * Seam for tests, as a protected member rather than a constructor argument:\n * inversify cannot resolve a function value as a dependency, and a unit test\n * must never deliver a real signal to a real pid.\n */\n protected probePid(pid: number): ProcessLiveness {\n return checkPidLiveness(pid);\n }\n\n protected readFile(filePath: string): string | undefined {\n try {\n return fs.readFileSync(filePath, 'utf-8');\n } catch (error) {\n if (errorCode(error) === 'ENOENT') return undefined;\n throw error;\n }\n }\n\n protected readCrashMarker(runId: string): CrashMarkerRecord | undefined {\n const raw = this.readFile(crashMarkerPath(runId));\n if (raw === undefined) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n // A marker mid-write (rename not yet visible, or a torn read) is not\n // evidence of anything; treated the same as no marker at all.\n return undefined;\n }\n if (\n !isRecord(parsed) ||\n parsed.version !== CRASH_MARKER_VERSION ||\n typeof parsed.runId !== 'string' ||\n typeof parsed.pid !== 'number' ||\n typeof parsed.startedAt !== 'number'\n ) {\n return undefined;\n }\n return { version: CRASH_MARKER_VERSION, runId: parsed.runId, pid: parsed.pid, startedAt: parsed.startedAt };\n }\n\n protected async readFileAsync(filePath: string): Promise<string | undefined> {\n try {\n return await fs.promises.readFile(filePath, 'utf-8');\n } catch (error) {\n if (errorCode(error) === 'ENOENT') return undefined;\n throw error;\n }\n }\n\n protected async readCrashMarkerAsync(runId: string): Promise<CrashMarkerRecord | undefined> {\n const raw = await this.readFileAsync(crashMarkerPath(runId));\n if (raw === undefined) return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return undefined;\n }\n if (\n !isRecord(parsed) ||\n parsed.version !== CRASH_MARKER_VERSION ||\n typeof parsed.runId !== 'string' ||\n typeof parsed.pid !== 'number' ||\n typeof parsed.startedAt !== 'number'\n ) {\n return undefined;\n }\n return { version: CRASH_MARKER_VERSION, runId: parsed.runId, pid: parsed.pid, startedAt: parsed.startedAt };\n }\n\n private verdictFor(marker: CrashMarkerRecord | undefined): ProcessTerminalVerdict {\n if (!marker) return { state: 'unknown', marker: undefined };\n const liveness = this.probePid(marker.pid);\n if (liveness === 'dead') return { state: 'crashed', marker };\n if (liveness === 'alive') return { state: 'alive', marker };\n return { state: 'unknown', marker };\n }\n\n inspect(runId: string): ProcessTerminalVerdict {\n return this.verdictFor(this.readCrashMarker(runId));\n }\n\n async inspectAsync(runId: string): Promise<ProcessTerminalVerdict> {\n return this.verdictFor(await this.readCrashMarkerAsync(runId));\n }\n}\n"],"mappings":"ycA4EA,SAAS,EAAgB,EAAuB,CAC9C,OAAO,EAAK,KAAK,GAAgB,CAAE,EAAO,EAAuB,CAGnE,SAAS,EAAS,EAAkD,CAClE,OAAO,OAAO,GAAU,YAAY,GAAkB,CAAC,MAAM,QAAQ,EAAM,CAG7E,SAAS,EAAU,EAAoC,CACrD,OAAO,OAAO,GAAU,UAAY,GAAkB,SAAU,EAC3D,EAAgC,KACjC,IAAA,GAaN,SAAgB,EAAiB,EAAa,EAAkB,QAAQ,KAAK,KAAK,QAAQ,CAAmB,CAC3G,GAAI,CAEF,OADA,EAAM,EAAK,EAAE,CACN,cACA,EAAO,CAGd,OAFa,EAAU,EACf,GAAK,QAAgB,OACtB,gCA5DiF,IACxC,KAE9C,EAAuB,IA8DtB,KAAoE,CAMzE,SAAmB,EAA8B,CAC/C,OAAO,EAAiB,EAAI,CAG9B,SAAmB,EAAsC,CACvD,GAAI,CACF,OAAO,EAAG,aAAa,EAAU,QAAQ,OAClC,EAAO,CACd,GAAI,EAAU,EAAM,GAAK,SAAU,OACnC,MAAM,GAIV,gBAA0B,EAA8C,CACtE,IAAM,EAAM,KAAK,SAAS,EAAgB,EAAM,CAAC,CACjD,GAAI,IAAQ,IAAA,GAAW,OACvB,IAAI,EACJ,GAAI,CACF,EAAS,KAAK,MAAM,EAAI,MAClB,CAGN,OAGA,MAAC,EAAS,EAAO,EACjB,EAAO,UAAY,GACnB,OAAO,EAAO,OAAU,UACxB,OAAO,EAAO,KAAQ,UACtB,OAAO,EAAO,WAAc,UAI9B,MAAO,CAAE,QAAS,EAAsB,MAAO,EAAO,MAAO,IAAK,EAAO,IAAK,UAAW,EAAO,UAAW,CAG7G,MAAgB,cAAc,EAA+C,CAC3E,GAAI,CACF,OAAO,MAAM,EAAG,SAAS,SAAS,EAAU,QAAQ,OAC7C,EAAO,CACd,GAAI,EAAU,EAAM,GAAK,SAAU,OACnC,MAAM,GAIV,MAAgB,qBAAqB,EAAuD,CAC1F,IAAM,EAAM,MAAM,KAAK,cAAc,EAAgB,EAAM,CAAC,CAC5D,GAAI,IAAQ,IAAA,GAAW,OACvB,IAAI,EACJ,GAAI,CACF,EAAS,KAAK,MAAM,EAAI,MAClB,CACN,OAGA,MAAC,EAAS,EAAO,EACjB,EAAO,UAAY,GACnB,OAAO,EAAO,OAAU,UACxB,OAAO,EAAO,KAAQ,UACtB,OAAO,EAAO,WAAc,UAI9B,MAAO,CAAE,QAAS,EAAsB,MAAO,EAAO,MAAO,IAAK,EAAO,IAAK,UAAW,EAAO,UAAW,CAG7G,WAAmB,EAA+D,CAChF,GAAI,CAAC,EAAQ,MAAO,CAAE,MAAO,UAAW,OAAQ,IAAA,GAAW,CAC3D,IAAM,EAAW,KAAK,SAAS,EAAO,IAAI,CAG1C,OAFI,IAAa,OAAe,CAAE,MAAO,UAAW,SAAQ,CACxD,IAAa,QAAgB,CAAE,MAAO,QAAS,SAAQ,CACpD,CAAE,MAAO,UAAW,SAAQ,CAGrC,QAAQ,EAAuC,CAC7C,OAAO,KAAK,WAAW,KAAK,gBAAgB,EAAM,CAAC,CAGrD,MAAM,aAAa,EAAgD,CACjE,OAAO,KAAK,WAAW,MAAM,KAAK,qBAAqB,EAAM,CAAC,QAtFjE,GAAY,CAAA,CAAA,EAAA"}
@@ -0,0 +1,2 @@
1
+ const e=require(`../_virtual/_rolldown/runtime.cjs`),t=require(`../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorate.cjs`),n=require(`../container/types.cjs`),r=require(`../shared/configDir.cjs`),i=require(`./process/env.cjs`),a=require(`../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateMetadata.cjs`),o=require(`../_virtual/_@oxc-project_runtime@0.127.0/helpers/decorateParam.cjs`),s=require(`../shared/paths.cjs`);let c=require(`node:fs`);c=e.__toESM(c,1);let l=require(`node:path`);l=e.__toESM(l,1);let u=require(`inversify`);const d=`.json`,f=`claimed-result.json`;function p(e){return l.join(s.currentResultsDir(),e)}function m(e){return l.join(s.currentRunsDir(),e)}function h(e){return l.join(m(e),f)}function g(e){return typeof e==`object`&&e&&`code`in e?e.code:void 0}function _(e){return g(e)===`ENOENT`}let v=class{constructor(e){this.scheduler=e}pollIntervalMs=4e3;dedupeTtlMs=6e4;now(){return Date.now()}onProcessingError(e,t){this.lastProcessingError={id:e,error:t,at:this.now()},this.processingErrorCount+=1}lastProcessingError;processingErrorCount=0;consumer;watcher;unregisterPoll;claims=new Map;deliveredAt=new Map;generation=0;initializedGeneration=-1;listResultFiles(){try{return c.readdirSync(s.currentResultsDir()).filter(e=>e.endsWith(d))}catch(e){if(_(e))return[];throw e}}listClaimedRunIds(){try{return c.readdirSync(s.currentRunsDir()).filter(e=>this.fileExists(l.join(m(e),f)))}catch(e){if(_(e))return[];throw e}}async listResultFilesAsync(){try{return(await c.promises.readdir(s.currentResultsDir())).filter(e=>e.endsWith(d))}catch(e){if(_(e))return[];throw e}}async listClaimedRunIdsAsync(){let e;try{e=await c.promises.readdir(s.currentRunsDir())}catch(e){if(_(e))return[];throw e}let t=await Promise.all(e.map(e=>this.fileExistsAsync(l.join(m(e),f))));return e.filter((e,n)=>t[n])}fileExists(e){return c.existsSync(e)}readFile(e){try{return c.readFileSync(e,`utf-8`)}catch(e){if(_(e))return;throw e}}ensureDir(e){c.mkdirSync(e,{recursive:!0})}renameFile(e,t){try{return c.renameSync(e,t),!0}catch(e){if(_(e))return!1;throw e}}unlinkFile(e){try{c.unlinkSync(e)}catch(t){_(t)||this.onProcessingError(e,t)}}async fileExistsAsync(e){try{return await c.promises.access(e),!0}catch(e){if(_(e))return!1;throw e}}async readFileAsync(e){try{return await c.promises.readFile(e,`utf-8`)}catch(e){if(_(e))return;throw e}}async ensureDirAsync(e){await c.promises.mkdir(e,{recursive:!0})}async renameFileAsync(e,t){try{return await c.promises.rename(e,t),!0}catch(e){if(_(e))return!1;throw e}}async unlinkFileAsync(e){try{await c.promises.unlink(e)}catch(t){_(t)||this.onProcessingError(e,t)}}handleWatchEvent(e,t){t&&t.toString().endsWith(`.json`)&&this.scheduler.wake()}handleWatchError(){this.watcher=void 0}getWatcher(){return this.watcher}watchResultsDir(){try{this.ensureDir(s.currentResultsDir());let e=r.resolveWatchPath(s.currentResultsDir(),c.realpathSync.native),t=c.watch(e,(e,t)=>this.handleWatchEvent(e,t));return t.on(`error`,()=>this.handleWatchError()),t.unref?.(),t}catch{return}}async watchResultsDirAsync(){try{await this.ensureDirAsync(s.currentResultsDir());let e=s.currentResultsDir();try{e=await c.promises.realpath(e)}catch{}let t=c.watch(e,(e,t)=>this.handleWatchEvent(e,t));return t.on(`error`,()=>this.handleWatchError()),t.unref?.(),t}catch{return}}pruneDeliveredAt(e){for(let[t,n]of this.deliveredAt)e-n>this.dedupeTtlMs&&this.deliveredAt.delete(t)}hasRecentlyDelivered(e){let t=this.now();return this.pruneDeliveredAt(t),this.deliveredAt.has(e)}markDelivered(e){let t=this.now();if(this.pruneDeliveredAt(t),this.deliveredAt.set(e,t),this.deliveredAt.size>256){let e=this.deliveredAt.keys().next();e.done||this.deliveredAt.delete(e.value)}}claimResult(e,t){return this.ensureDir(m(e)),this.renameFile(p(t),h(e))}async claimResultAsync(e,t){return await this.ensureDirAsync(m(e)),this.renameFileAsync(p(t),h(e))}async discoverAndClaim(e){let t=0,n=process.env[i.SUBAGENT_RUN_ID_ENV]?.trim();for(let r of await this.listResultFilesAsync()){if(e!==this.generation)return t;let i=r.slice(0,-5);if(!(!i||i===n||this.claims.has(i))&&await this.claimResultAsync(i,r)){if(e!==this.generation)return t;this.claims.set(i,{inFlight:!1}),t+=1}}return t}async discardClaim(e,t){t===this.generation&&(await this.unlinkFileAsync(h(e)),t===this.generation&&this.claims.delete(e))}async deliverClaim(e,t,n){let r=h(e);try{let i=await this.readFileAsync(r);if(n!==this.generation)return;if(i===void 0){this.claims.delete(e);return}let a;try{a=JSON.parse(i)}catch(t){this.onProcessingError(e,t),await this.discardClaim(e,n);return}if(typeof a!=`object`||!a){await this.discardClaim(e,n);return}let o=a,s=typeof o.runId==`string`&&o.runId?o.runId:e;if(this.hasRecentlyDelivered(s)){await this.discardClaim(e,n);return}let c=this.consumer;if(!c){t.inFlight=!1;return}let l=await c({...o,runId:s});if(n!==this.generation)return;l?(this.markDelivered(s),await this.discardClaim(e,n)):t.inFlight=!1}catch(r){if(n!==this.generation)return;this.onProcessingError(e,r),t.inFlight=!1}}async run(){let e=this.generation;if(this.watcher||=await this.watchResultsDirAsync(),e!==this.generation)return!1;if(this.initializedGeneration!==e){let t=await this.listClaimedRunIdsAsync();if(e!==this.generation)return!1;for(let e of t)this.claims.set(e,{inFlight:!1});this.initializedGeneration=e}let t=await this.discoverAndClaim(e);if(e!==this.generation)return!1;for(let[t,n]of this.claims)n.inFlight||(n.inFlight=!0,this.deliverClaim(t,n,e));return t>0}start(e){this.stop(),this.consumer=e,this.unregisterPoll=this.scheduler.register({id:`result-watcher`,intervalMs:this.pollIntervalMs,run:()=>this.run()}),this.scheduler.wake()}stop(){this.generation+=1,this.initializedGeneration=-1,this.consumer=void 0,this.watcher?.close(),this.watcher=void 0,this.unregisterPoll?.(),this.unregisterPoll=void 0,this.claims.clear(),this.deliveredAt.clear()}};v=t.__decorate([(0,u.injectable)(),o.__decorateParam(0,(0,u.inject)(n.DOOM_TEAM_TYPES.PollScheduler)),a.__decorateMetadata(`design:paramtypes`,[Object])],v),exports.CLAIMED_RESULT_FILE_NAME=f,exports.RESULT_FILE_SUFFIX=d,Object.defineProperty(exports,`ResultWatcher`,{enumerable:!0,get:function(){return v}});
2
+ //# sourceMappingURL=resultWatcher.cjs.map