@ashx-j/lunr 0.2.21 → 0.2.23

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 (461) hide show
  1. package/CHANGELOG.md +4 -2
  2. package/README.md +23 -5
  3. package/dist/builtin-extensions/index.d.ts.map +1 -1
  4. package/dist/builtin-extensions/index.js +1 -0
  5. package/dist/builtin-extensions/index.js.map +1 -1
  6. package/dist/builtin-extensions/lunr-browser.d.ts +9 -0
  7. package/dist/builtin-extensions/lunr-browser.d.ts.map +1 -0
  8. package/dist/builtin-extensions/lunr-browser.js +169 -0
  9. package/dist/builtin-extensions/lunr-browser.js.map +1 -0
  10. package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
  11. package/dist/builtin-extensions/lunr-todos.js +15 -0
  12. package/dist/builtin-extensions/lunr-todos.js.map +1 -1
  13. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  14. package/dist/builtin-extensions/pi-intercom/index.js +3 -0
  15. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  16. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts +1 -1
  17. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts.map +1 -1
  18. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js +5 -1
  19. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js.map +1 -1
  20. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +2 -2
  21. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +18 -5
  23. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -3
  25. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  26. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +3 -0
  27. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  28. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.d.ts +17 -0
  29. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.d.ts.map +1 -0
  30. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.js +45 -0
  31. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.js.map +1 -0
  32. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
  33. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js +4 -11
  34. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
  35. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +4 -1
  36. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
  37. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js +160 -51
  38. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
  39. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts.map +1 -1
  40. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js +5 -0
  41. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js.map +1 -1
  42. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts +2 -0
  43. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts.map +1 -1
  44. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js +3 -2
  45. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js.map +1 -1
  46. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts +1 -0
  47. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts.map +1 -1
  48. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js +2 -1
  49. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js.map +1 -1
  50. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +3 -0
  51. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts.map +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js +11 -0
  53. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
  55. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +41 -3
  56. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
  57. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +4 -0
  59. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  60. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
  61. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +3 -0
  62. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
  63. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.d.ts +1 -0
  64. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.d.ts.map +1 -1
  65. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.js +3 -0
  66. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.js.map +1 -1
  67. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
  68. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +1 -1
  69. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
  70. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +1 -0
  71. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  72. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  73. package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts +18 -0
  74. package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts.map +1 -0
  75. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js +48 -0
  76. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js.map +1 -0
  77. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  78. package/dist/builtin-extensions/pi-web-access/index.js +11 -7
  79. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  80. package/dist/cli/args.d.ts.map +1 -1
  81. package/dist/cli/args.js +2 -1
  82. package/dist/cli/args.js.map +1 -1
  83. package/dist/cli/install-cli.d.ts.map +1 -1
  84. package/dist/cli/install-cli.js +15 -45
  85. package/dist/cli/install-cli.js.map +1 -1
  86. package/dist/core/agent-session-runtime.d.ts +9 -0
  87. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  88. package/dist/core/agent-session-runtime.js +126 -29
  89. package/dist/core/agent-session-runtime.js.map +1 -1
  90. package/dist/core/agent-session.d.ts +22 -0
  91. package/dist/core/agent-session.d.ts.map +1 -1
  92. package/dist/core/agent-session.js +250 -105
  93. package/dist/core/agent-session.js.map +1 -1
  94. package/dist/core/browser/network.d.ts +9 -0
  95. package/dist/core/browser/network.d.ts.map +1 -0
  96. package/dist/core/browser/network.js +146 -0
  97. package/dist/core/browser/network.js.map +1 -0
  98. package/dist/core/browser/runtime.d.ts +24 -0
  99. package/dist/core/browser/runtime.d.ts.map +1 -0
  100. package/dist/core/browser/runtime.js +289 -0
  101. package/dist/core/browser/runtime.js.map +1 -0
  102. package/dist/core/browser/schema.d.ts +16 -0
  103. package/dist/core/browser/schema.d.ts.map +1 -0
  104. package/dist/core/browser/schema.js +36 -0
  105. package/dist/core/browser/schema.js.map +1 -0
  106. package/dist/core/browser/settings.d.ts +8 -0
  107. package/dist/core/browser/settings.d.ts.map +1 -0
  108. package/dist/core/browser/settings.js +30 -0
  109. package/dist/core/browser/settings.js.map +1 -0
  110. package/dist/core/browser/setup.d.ts +2 -0
  111. package/dist/core/browser/setup.d.ts.map +1 -0
  112. package/dist/core/browser/setup.js +16 -0
  113. package/dist/core/browser/setup.js.map +1 -0
  114. package/dist/core/customize.d.ts.map +1 -1
  115. package/dist/core/customize.js +15 -14
  116. package/dist/core/customize.js.map +1 -1
  117. package/dist/core/export-html/index.d.ts.map +1 -1
  118. package/dist/core/export-html/index.js +1 -1
  119. package/dist/core/export-html/index.js.map +1 -1
  120. package/dist/core/extensions/runner.d.ts +1 -0
  121. package/dist/core/extensions/runner.d.ts.map +1 -1
  122. package/dist/core/extensions/runner.js +1 -1
  123. package/dist/core/extensions/runner.js.map +1 -1
  124. package/dist/core/extensions/types.d.ts +1 -1
  125. package/dist/core/extensions/types.d.ts.map +1 -1
  126. package/dist/core/extensions/types.js.map +1 -1
  127. package/dist/core/install-features.d.ts.map +1 -1
  128. package/dist/core/install-features.js +10 -8
  129. package/dist/core/install-features.js.map +1 -1
  130. package/dist/core/memory-cap.d.ts.map +1 -1
  131. package/dist/core/memory-cap.js +5 -3
  132. package/dist/core/memory-cap.js.map +1 -1
  133. package/dist/core/model-tiers.d.ts.map +1 -1
  134. package/dist/core/model-tiers.js +9 -6
  135. package/dist/core/model-tiers.js.map +1 -1
  136. package/dist/core/permissions.d.ts.map +1 -1
  137. package/dist/core/permissions.js +9 -0
  138. package/dist/core/permissions.js.map +1 -1
  139. package/dist/core/plan-mode.d.ts.map +1 -1
  140. package/dist/core/plan-mode.js +3 -0
  141. package/dist/core/plan-mode.js.map +1 -1
  142. package/dist/core/process-registry.d.ts.map +1 -1
  143. package/dist/core/process-registry.js +6 -4
  144. package/dist/core/process-registry.js.map +1 -1
  145. package/dist/core/runtime-scope.d.ts +11 -0
  146. package/dist/core/runtime-scope.d.ts.map +1 -0
  147. package/dist/core/runtime-scope.js +3 -0
  148. package/dist/core/runtime-scope.js.map +1 -0
  149. package/dist/core/sdk.d.ts.map +1 -1
  150. package/dist/core/sdk.js +13 -0
  151. package/dist/core/sdk.js.map +1 -1
  152. package/dist/core/session-handoff.d.ts +35 -0
  153. package/dist/core/session-handoff.d.ts.map +1 -0
  154. package/dist/core/session-handoff.js +214 -0
  155. package/dist/core/session-handoff.js.map +1 -0
  156. package/dist/core/session-manager.d.ts +20 -0
  157. package/dist/core/session-manager.d.ts.map +1 -1
  158. package/dist/core/session-manager.js +184 -22
  159. package/dist/core/session-manager.js.map +1 -1
  160. package/dist/core/session-ownership.d.ts +28 -0
  161. package/dist/core/session-ownership.d.ts.map +1 -0
  162. package/dist/core/session-ownership.js +138 -0
  163. package/dist/core/session-ownership.js.map +1 -0
  164. package/dist/core/session-retention.d.ts.map +1 -1
  165. package/dist/core/session-retention.js +11 -2
  166. package/dist/core/session-retention.js.map +1 -1
  167. package/dist/core/settings-manager.d.ts +11 -0
  168. package/dist/core/settings-manager.d.ts.map +1 -1
  169. package/dist/core/settings-manager.js +27 -0
  170. package/dist/core/settings-manager.js.map +1 -1
  171. package/dist/core/slash-commands.d.ts.map +1 -1
  172. package/dist/core/slash-commands.js +2 -0
  173. package/dist/core/slash-commands.js.map +1 -1
  174. package/dist/core/subagent-wait-interruption.d.ts +11 -0
  175. package/dist/core/subagent-wait-interruption.d.ts.map +1 -0
  176. package/dist/core/subagent-wait-interruption.js +19 -0
  177. package/dist/core/subagent-wait-interruption.js.map +1 -0
  178. package/dist/core/system-prompt.d.ts.map +1 -1
  179. package/dist/core/system-prompt.js +7 -2
  180. package/dist/core/system-prompt.js.map +1 -1
  181. package/dist/core/todo-settings.d.ts +5 -0
  182. package/dist/core/todo-settings.d.ts.map +1 -0
  183. package/dist/core/todo-settings.js +7 -0
  184. package/dist/core/todo-settings.js.map +1 -0
  185. package/dist/core/tools/bash.d.ts.map +1 -1
  186. package/dist/core/tools/bash.js +4 -4
  187. package/dist/core/tools/bash.js.map +1 -1
  188. package/dist/core/tools/edit.d.ts.map +1 -1
  189. package/dist/core/tools/edit.js +5 -3
  190. package/dist/core/tools/edit.js.map +1 -1
  191. package/dist/core/tools/find.d.ts.map +1 -1
  192. package/dist/core/tools/find.js +4 -4
  193. package/dist/core/tools/find.js.map +1 -1
  194. package/dist/core/tools/grep.d.ts.map +1 -1
  195. package/dist/core/tools/grep.js +4 -4
  196. package/dist/core/tools/grep.js.map +1 -1
  197. package/dist/core/tools/ls.d.ts.map +1 -1
  198. package/dist/core/tools/ls.js +4 -4
  199. package/dist/core/tools/ls.js.map +1 -1
  200. package/dist/core/tools/read.d.ts.map +1 -1
  201. package/dist/core/tools/read.js +4 -4
  202. package/dist/core/tools/read.js.map +1 -1
  203. package/dist/core/tools/render-utils.d.ts +14 -5
  204. package/dist/core/tools/render-utils.d.ts.map +1 -1
  205. package/dist/core/tools/render-utils.js +34 -7
  206. package/dist/core/tools/render-utils.js.map +1 -1
  207. package/dist/core/tools/write.d.ts.map +1 -1
  208. package/dist/core/tools/write.js +4 -4
  209. package/dist/core/tools/write.js.map +1 -1
  210. package/dist/core/usage-service.d.ts.map +1 -1
  211. package/dist/core/usage-service.js +5 -3
  212. package/dist/core/usage-service.js.map +1 -1
  213. package/dist/gateway/adapters/discord.d.ts +12 -1
  214. package/dist/gateway/adapters/discord.d.ts.map +1 -1
  215. package/dist/gateway/adapters/discord.js +112 -17
  216. package/dist/gateway/adapters/discord.js.map +1 -1
  217. package/dist/gateway/adapters/telegram.d.ts +4 -2
  218. package/dist/gateway/adapters/telegram.d.ts.map +1 -1
  219. package/dist/gateway/adapters/telegram.js +34 -11
  220. package/dist/gateway/adapters/telegram.js.map +1 -1
  221. package/dist/gateway/agent-bridge.d.ts +14 -3
  222. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  223. package/dist/gateway/agent-bridge.js +252 -60
  224. package/dist/gateway/agent-bridge.js.map +1 -1
  225. package/dist/gateway/approval.d.ts +1 -0
  226. package/dist/gateway/approval.d.ts.map +1 -1
  227. package/dist/gateway/approval.js +60 -18
  228. package/dist/gateway/approval.js.map +1 -1
  229. package/dist/gateway/authz.d.ts +2 -0
  230. package/dist/gateway/authz.d.ts.map +1 -1
  231. package/dist/gateway/authz.js +13 -0
  232. package/dist/gateway/authz.js.map +1 -1
  233. package/dist/gateway/buttons.d.ts +3 -1
  234. package/dist/gateway/buttons.d.ts.map +1 -1
  235. package/dist/gateway/buttons.js +18 -3
  236. package/dist/gateway/buttons.js.map +1 -1
  237. package/dist/gateway/command.d.ts.map +1 -1
  238. package/dist/gateway/command.js +49 -4
  239. package/dist/gateway/command.js.map +1 -1
  240. package/dist/gateway/commands.d.ts.map +1 -1
  241. package/dist/gateway/commands.js +18 -3
  242. package/dist/gateway/commands.js.map +1 -1
  243. package/dist/gateway/config.d.ts +5 -0
  244. package/dist/gateway/config.d.ts.map +1 -1
  245. package/dist/gateway/config.js +5 -0
  246. package/dist/gateway/config.js.map +1 -1
  247. package/dist/gateway/conversations.d.ts +14 -0
  248. package/dist/gateway/conversations.d.ts.map +1 -0
  249. package/dist/gateway/conversations.js +30 -0
  250. package/dist/gateway/conversations.js.map +1 -0
  251. package/dist/gateway/download.d.ts +2 -0
  252. package/dist/gateway/download.d.ts.map +1 -0
  253. package/dist/gateway/download.js +36 -0
  254. package/dist/gateway/download.js.map +1 -0
  255. package/dist/gateway/index.d.ts.map +1 -1
  256. package/dist/gateway/index.js +85 -26
  257. package/dist/gateway/index.js.map +1 -1
  258. package/dist/gateway/mobile-commands.d.ts +24 -0
  259. package/dist/gateway/mobile-commands.d.ts.map +1 -0
  260. package/dist/gateway/mobile-commands.js +422 -0
  261. package/dist/gateway/mobile-commands.js.map +1 -0
  262. package/dist/gateway/presenter.d.ts +16 -0
  263. package/dist/gateway/presenter.d.ts.map +1 -0
  264. package/dist/gateway/presenter.js +210 -0
  265. package/dist/gateway/presenter.js.map +1 -0
  266. package/dist/gateway/router.d.ts +1 -0
  267. package/dist/gateway/router.d.ts.map +1 -1
  268. package/dist/gateway/router.js +32 -3
  269. package/dist/gateway/router.js.map +1 -1
  270. package/dist/gateway/service.d.ts +46 -0
  271. package/dist/gateway/service.d.ts.map +1 -0
  272. package/dist/gateway/service.js +395 -0
  273. package/dist/gateway/service.js.map +1 -0
  274. package/dist/gateway/setup.d.ts +4 -0
  275. package/dist/gateway/setup.d.ts.map +1 -0
  276. package/dist/gateway/setup.js +146 -0
  277. package/dist/gateway/setup.js.map +1 -0
  278. package/dist/gateway/types.d.ts +4 -2
  279. package/dist/gateway/types.d.ts.map +1 -1
  280. package/dist/gateway/types.js.map +1 -1
  281. package/dist/index.d.ts +2 -0
  282. package/dist/index.d.ts.map +1 -1
  283. package/dist/index.js +2 -0
  284. package/dist/index.js.map +1 -1
  285. package/dist/main.d.ts.map +1 -1
  286. package/dist/main.js +2 -1
  287. package/dist/main.js.map +1 -1
  288. package/dist/modes/interactive/components/assistant-message.d.ts +19 -2
  289. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  290. package/dist/modes/interactive/components/assistant-message.js +78 -17
  291. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  292. package/dist/modes/interactive/components/copyable-text.d.ts +27 -0
  293. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -0
  294. package/dist/modes/interactive/components/copyable-text.js +156 -0
  295. package/dist/modes/interactive/components/copyable-text.js.map +1 -0
  296. package/dist/modes/interactive/components/custom-entry.d.ts +1 -0
  297. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  298. package/dist/modes/interactive/components/custom-entry.js +8 -0
  299. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  300. package/dist/modes/interactive/components/custom-message.d.ts +1 -0
  301. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  302. package/dist/modes/interactive/components/custom-message.js +8 -0
  303. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  304. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  305. package/dist/modes/interactive/components/session-selector.js +16 -0
  306. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  307. package/dist/modes/interactive/components/settings-selector.d.ts +8 -1
  308. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  309. package/dist/modes/interactive/components/settings-selector.js +51 -0
  310. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  311. package/dist/modes/interactive/components/thinking-tail.d.ts +9 -2
  312. package/dist/modes/interactive/components/thinking-tail.d.ts.map +1 -1
  313. package/dist/modes/interactive/components/thinking-tail.js +43 -1
  314. package/dist/modes/interactive/components/thinking-tail.js.map +1 -1
  315. package/dist/modes/interactive/components/tool-execution.d.ts +4 -3
  316. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  317. package/dist/modes/interactive/components/tool-execution.js +34 -45
  318. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  319. package/dist/modes/interactive/interactive-mode.d.ts +9 -0
  320. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  321. package/dist/modes/interactive/interactive-mode.js +267 -44
  322. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  323. package/dist/modes/interactive/theme/theme.d.ts +1 -0
  324. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  325. package/dist/modes/interactive/theme/theme.js +23 -0
  326. package/dist/modes/interactive/theme/theme.js.map +1 -1
  327. package/dist/node-runtime/agent-session-services-GZVSOGYR.js +49 -0
  328. package/dist/node-runtime/{builtin-extensions-JCOPAAB5.js → builtin-extensions-QVCXNQT4.js} +6 -5
  329. package/dist/node-runtime/{chunk-LTYWTR3V.js → chunk-2MI5OPMN.js} +17 -2
  330. package/dist/node-runtime/{chunk-W3CVH5RX.js → chunk-2TKODGBZ.js} +11 -6
  331. package/dist/node-runtime/chunk-4EULYYR4.js +62 -0
  332. package/dist/node-runtime/{chunk-6N22HULO.js → chunk-5D7LC2ZQ.js} +7 -2
  333. package/dist/node-runtime/{chunk-KBKMCJDU.js → chunk-5ZQXRPMC.js} +19 -4
  334. package/dist/node-runtime/{chunk-BOHIDQT4.js → chunk-6VYZ5UFP.js} +1 -1
  335. package/dist/node-runtime/chunk-AZJHNQKQ.js +205 -0
  336. package/dist/node-runtime/{chunk-A3KMVBZV.js → chunk-BBUVIEZB.js} +1 -10
  337. package/dist/node-runtime/{chunk-IRPJXI6U.js → chunk-BX2RB477.js} +1 -1
  338. package/dist/node-runtime/chunk-CCCN2UCX.js +14 -0
  339. package/dist/node-runtime/{chunk-25I2BHAA.js → chunk-CSUZVNYE.js} +1 -1
  340. package/dist/node-runtime/chunk-DD5YWFSJ.js +708 -0
  341. package/dist/node-runtime/chunk-DQMGU675.js +3409 -0
  342. package/dist/node-runtime/{chunk-QZMODZQ2.js → chunk-E24EO34J.js} +2 -1
  343. package/dist/node-runtime/chunk-EKVFP6YF.js +355 -0
  344. package/dist/node-runtime/chunk-GJ2RDBRL.js +672 -0
  345. package/dist/node-runtime/{chunk-W3SILANP.js → chunk-GMHJCCEN.js} +8 -8
  346. package/dist/node-runtime/{chunk-DDWHZ633.js → chunk-GS42T6MX.js} +1 -1
  347. package/dist/node-runtime/chunk-GS66LV4M.js +2830 -0
  348. package/dist/node-runtime/chunk-H4K3JDRB.js +47 -0
  349. package/dist/node-runtime/{chunk-2SJB2AWP.js → chunk-HMBGROQK.js} +3 -3
  350. package/dist/node-runtime/{chunk-GB2MGFLI.js → chunk-HPUP7E4T.js} +216 -201
  351. package/dist/node-runtime/{chunk-YMEAYRBE.js → chunk-HTFRRDSF.js} +2 -7
  352. package/dist/node-runtime/{chunk-OPEK5RRY.js → chunk-IF24A3FH.js} +1 -1
  353. package/dist/node-runtime/chunk-IMLCWLPI.js +9 -0
  354. package/dist/node-runtime/chunk-KKUTQQV7.js +144 -0
  355. package/dist/node-runtime/chunk-LFZDVKSP.js +521 -0
  356. package/dist/node-runtime/{chunk-2BUAYZ7K.js → chunk-LLUIPGDR.js} +581 -197
  357. package/dist/node-runtime/{chunk-7NBZ5P7I.js → chunk-NAY6UUQZ.js} +1 -1
  358. package/dist/node-runtime/chunk-OAR4TYZE.js +146 -0
  359. package/dist/node-runtime/{chunk-STERBGUB.js → chunk-OFKSVRV7.js} +2 -2
  360. package/dist/node-runtime/{chunk-JZQ7F36T.js → chunk-PCEW76PM.js} +19 -3
  361. package/dist/node-runtime/{chunk-WLLDXJRT.js → chunk-QAZOULTU.js} +29 -1014
  362. package/dist/node-runtime/{chunk-6KDIOJL3.js → chunk-QH6YL7VK.js} +3 -3
  363. package/dist/node-runtime/chunk-R3K2F5GI.js +122 -0
  364. package/dist/node-runtime/{chunk-RNBHABBA.js → chunk-RDDAZOMU.js} +23 -0
  365. package/dist/node-runtime/{chunk-SY2TFMLO.js → chunk-RIR5EDDJ.js} +46 -151
  366. package/dist/node-runtime/chunk-RMQZU2YU.js +117 -0
  367. package/dist/node-runtime/{chunk-6BEIBLQ3.js → chunk-RWTKOC3B.js} +1 -1
  368. package/dist/node-runtime/{chunk-G6LRAP36.js → chunk-TQGPP4SC.js} +1 -1
  369. package/dist/node-runtime/{chunk-Y5KOEMBH.js → chunk-TVJUOJZJ.js} +9 -674
  370. package/dist/node-runtime/chunk-UAEOTO52.js +119 -0
  371. package/dist/node-runtime/{chunk-AY6CAJSL.js → chunk-UJOCPOMX.js} +6 -3
  372. package/dist/node-runtime/chunk-UP2XBVH5.js +40 -0
  373. package/dist/node-runtime/{chunk-WJVFOIB5.js → chunk-UQUCFAJ3.js} +1 -1
  374. package/dist/node-runtime/chunk-URD2SLIT.js +1019 -0
  375. package/dist/node-runtime/chunk-US544NN6.js +13 -0
  376. package/dist/node-runtime/chunk-UWPJL22I.js +341 -0
  377. package/dist/node-runtime/{chunk-4I23VTC4.js → chunk-VWCE2HSZ.js} +21 -124
  378. package/dist/node-runtime/{chunk-VZR3NCM7.js → chunk-W64JC4E7.js} +18 -14
  379. package/dist/node-runtime/{chunk-AWVD5IEY.js → chunk-X3URCYCU.js} +23 -12
  380. package/dist/node-runtime/{chunk-GKLEQ3I4.js → chunk-XLTL257W.js} +126 -27
  381. package/dist/node-runtime/{chunk-WKDK4C5P.js → chunk-YDO2F2IA.js} +38 -164
  382. package/dist/node-runtime/{chunk-PDNXVXMD.js → chunk-YHQ3NBB3.js} +58 -48
  383. package/dist/node-runtime/chunk-YPHAIRZT.js +10 -0
  384. package/dist/node-runtime/cli-runtime.js +2 -2
  385. package/dist/node-runtime/command-PDVTBRWA.js +45 -0
  386. package/dist/node-runtime/{commands-MV5KOZ64.js → commands-KAMO2T6P.js} +10 -10
  387. package/dist/node-runtime/commands-XDCFGIGW.js +36 -0
  388. package/dist/node-runtime/config-RORQUQFG.js +20 -0
  389. package/dist/node-runtime/{customize-LF5VST47.js → customize-VFJV3U6A.js} +2 -1
  390. package/dist/node-runtime/{direct-tool-executor-BK7CLEBX.js → direct-tool-executor-YAVOLDFY.js} +8 -8
  391. package/dist/node-runtime/{export-html-TEXVV5RP.js → export-html-KSOIMVPI.js} +4 -3
  392. package/dist/node-runtime/{extension-input-O4HSAEM4.js → extension-input-E7BJZ35H.js} +4 -4
  393. package/dist/node-runtime/{extension-selector-X5FCX43D.js → extension-selector-WU42XDTU.js} +4 -4
  394. package/dist/node-runtime/{extract-XLQSJN4V.js → extract-EQJE7FZZ.js} +2 -2
  395. package/dist/node-runtime/{gateway-BM6NLOH4.js → gateway-AYWM5DIO.js} +275 -994
  396. package/dist/node-runtime/{gemini-search-U7SUMPQA.js → gemini-search-35OCRFLN.js} +1 -1
  397. package/dist/node-runtime/{gemini-url-context-PXWCBQHK.js → gemini-url-context-UQY3PHHW.js} +2 -2
  398. package/dist/node-runtime/index.js +104 -65
  399. package/dist/node-runtime/{init-3C7Z24OI.js → init-X2LIUB2H.js} +3 -3
  400. package/dist/node-runtime/{install-cli-EXMJQESX.js → install-cli-3BO4MMQ6.js} +21 -82
  401. package/dist/node-runtime/interactive-mode-4MFRKAHG.js +72 -0
  402. package/dist/node-runtime/{interactive-view-ILS6TAN5.js → interactive-view-TUZHCQM3.js} +8 -8
  403. package/dist/node-runtime/lunr-browser-RYFIIVJN.js +174 -0
  404. package/dist/node-runtime/{lunr-cron-4VHP4E4B.js → lunr-cron-YWXEPZMQ.js} +19 -5
  405. package/dist/node-runtime/main.js +44 -31
  406. package/dist/node-runtime/{memory-cap-3S4XRLNP.js → memory-cap-EL3KL4JJ.js} +2 -1
  407. package/dist/node-runtime/mobile-commands-LVHDAUDP.js +32 -0
  408. package/dist/node-runtime/model-runtime-PLQKAG4B.js +16 -0
  409. package/dist/node-runtime/{model-tiers-NJLHUEGK.js → model-tiers-OU3U5CZG.js} +2 -1
  410. package/dist/node-runtime/{package-manager-cli-N37546V5.js → package-manager-cli-6GT3Z3CK.js} +22 -15
  411. package/dist/node-runtime/{pi-intercom-NV2LW6X7.js → pi-intercom-HBPK5HSJ.js} +4 -1
  412. package/dist/node-runtime/{pi-mcp-adapter-GUFZWW54.js → pi-mcp-adapter-E6WULBKF.js} +4 -4
  413. package/dist/node-runtime/{pi-subagents-6MUIFNDM.js → pi-subagents-CDWK2AKY.js} +236 -79
  414. package/dist/node-runtime/{pi-web-access-2CQGFLT2.js → pi-web-access-WTGMNZ32.js} +15 -15
  415. package/dist/node-runtime/process-registry-4FAKZQOL.js +31 -0
  416. package/dist/node-runtime/{proxy-modes-V6YVFH3C.js → proxy-modes-OSQCWRBI.js} +9 -9
  417. package/dist/node-runtime/rpc-entry.js +44 -31
  418. package/dist/node-runtime/{rpc-mode-W5ZTLTMZ.js → rpc-mode-O3XV4SID.js} +2 -2
  419. package/dist/node-runtime/runtime-4VA6JKNF.js +373 -0
  420. package/dist/node-runtime/{runtime-bridges-2VQTLPOZ.js → runtime-bridges-3XUQ46XW.js} +6 -5
  421. package/dist/node-runtime/service-ISSP6VHE.js +36 -0
  422. package/dist/node-runtime/session-handoff-HC7R5E24.js +33 -0
  423. package/dist/node-runtime/{session-manager-E7AREDTV.js → session-manager-CFN4UFM2.js} +2 -1
  424. package/dist/node-runtime/{session-selector-FJ7M2AIX.js → session-selector-GIM4DHQ2.js} +5 -4
  425. package/dist/node-runtime/{settings-manager-CUGAZWAB.js → settings-manager-6VEMXRDL.js} +7 -2
  426. package/dist/node-runtime/setup-5SR2J35A.js +155 -0
  427. package/dist/node-runtime/setup-JBKOLJ6F.js +18 -0
  428. package/dist/node-runtime/{subagent-executor-MH4A7CCF.js → subagent-executor-M5VWB3D3.js} +26 -18
  429. package/dist/node-runtime/theme-UOO5RVFN.js +68 -0
  430. package/dist/node-runtime/trust-manager-MMISNCYO.js +17 -0
  431. package/dist/node-runtime/{update-cli-XTZMZGOL.js → update-cli-UVKJWRRJ.js} +7 -2
  432. package/dist/node-runtime/usage-service-LFB2SWYV.js +37 -0
  433. package/dist/node-runtime/{video-extract-OYT5WKS5.js → video-extract-OOZHR7SU.js} +2 -2
  434. package/dist/node-runtime/{youtube-extract-TQYKGFGS.js → youtube-extract-FNPAUNHU.js} +6 -6
  435. package/docs/browser.md +86 -0
  436. package/docs/extensions.md +2 -0
  437. package/docs/features.md +96 -16
  438. package/docs/interactive-startup.md +2 -1
  439. package/docs/sessions.md +10 -0
  440. package/docs/settings.md +2 -0
  441. package/docs/tui.md +2 -0
  442. package/docs/usage.md +16 -0
  443. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  444. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  445. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  446. package/examples/extensions/gondolin/package-lock.json +2 -2
  447. package/examples/extensions/gondolin/package.json +1 -1
  448. package/examples/extensions/sandbox/package-lock.json +2 -2
  449. package/examples/extensions/sandbox/package.json +1 -1
  450. package/examples/extensions/with-deps/package-lock.json +2 -2
  451. package/examples/extensions/with-deps/package.json +1 -1
  452. package/package.json +7 -4
  453. package/scripts/install-browser.mjs +20 -0
  454. package/dist/node-runtime/agent-session-services-C743TYQE.js +0 -37
  455. package/dist/node-runtime/chunk-VGYZ3APQ.js +0 -59
  456. package/dist/node-runtime/chunk-XI77KVKA.js +0 -6009
  457. package/dist/node-runtime/command-P4NYCJ2M.js +0 -13
  458. package/dist/node-runtime/interactive-mode-EVVBA64D.js +0 -59
  459. package/dist/node-runtime/{chunk-UWQYRSYQ.js → chunk-YJMMG7C6.js} +25 -25
  460. package/dist/node-runtime/{mcp-panel-IIGMXQGP.js → mcp-panel-KTTFXJZ4.js} +3 -3
  461. package/dist/node-runtime/{src-BPQFJR76.js → src-IVPNZ2BX.js} +9 -9
@@ -1 +1 @@
1
- {"version":3,"file":"pi-args.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/pi-args.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { encodeNestedPathEnv, parseNestedPathEnv, type NestedPathEntry } from \"./nested-path.ts\";\nimport { resolveMcpDirectToolNames } from \"./mcp-direct-tool-allowlist.ts\";\nimport { STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV } from \"./structured-output.ts\";\nimport { TEMP_ROOT_DIR, type JsonSchemaObject, type ResolvedToolBudget } from \"../../shared/types.ts\";\nimport { THINKING_LEVELS } from \"../../shared/model-info.ts\";\nimport { TOOL_BUDGET_ENV, encodeToolBudgetEnv } from \"./tool-budget.ts\";\nimport { CHILD_TOOL_DIAGNOSTIC_PATH_ENV, REQUIRED_CHILD_TOOLS_ENV } from \"./tool-availability.ts\";\nimport { CHILD_WATCHDOG_CONFIG_ENV, encodeChildWatchdogConfig, type ChildWatchdogConfig } from \"../../watchdog/child-status.ts\";\nimport { WAIT_TOOL_ENABLED_ENV } from \"../background/wait-config.ts\";\n\nconst TASK_ARG_LIMIT = 8000;\n// lunr: the bake-in compiles extensions to dist/*.js only; upstream dev mode ships .ts.\n// Resolve the .ts sibling when present, else fall back to the compiled .js so child\n// processes always get a path that exists (the extension loader accepts both).\nfunction resolveRuntimeScriptPath(basePathWithoutExt: string): string {\n\tconst tsPath = `${basePathWithoutExt}.ts`;\n\tif (fs.existsSync(tsPath)) return tsPath;\n\treturn `${basePathWithoutExt}.js`;\n}\nconst PROMPT_RUNTIME_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"subagent-prompt-runtime\"));\nconst FANOUT_CHILD_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"extension\", \"fanout-child\"));\nexport const SUBAGENT_CHILD_ENV = \"PI_SUBAGENT_CHILD\";\nexport const SUBAGENT_ORCHESTRATOR_TARGET_ENV = \"PI_SUBAGENT_ORCHESTRATOR_TARGET\";\nexport const SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV = \"PI_SUBAGENT_ORCHESTRATOR_SESSION_ID\";\nexport const SUBAGENT_SUPERVISOR_SESSION_ID_ENV = \"PI_SUBAGENT_SUPERVISOR_SESSION_ID\";\nexport const SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV = \"PI_SUBAGENT_SUPERVISOR_CHANNEL_DIR\";\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\";\nexport const SUBAGENT_PARENT_SESSION_ENV = \"PI_SUBAGENT_PARENT_SESSION\";\nexport const SUBAGENT_PARENT_PERMISSION_MODE_ENV = \"PI_SUBAGENT_PARENT_PERMISSION_MODE\";\nexport const SUBAGENT_CHILD_PERMISSION_ENV = \"PI_SUBAGENT_CHILD_PERMISSION\";\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\ninterface BuildPiArgsInput {\n\tparentSessionId?: string;\n\t/** Run ownership is a session file or in-memory UUID; parentSessionId remains the routing UUID. */\n\tsupervisorSessionId?: string;\n\tbaseArgs: string[];\n\ttask: string;\n\tsessionEnabled: boolean;\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tmodel?: string;\n\tthinking?: string | false;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\trequireReadTool?: boolean;\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tsystemPrompt?: string | null;\n\tmcpDirectTools?: string[];\n\tcwd?: string;\n\tpromptFileStem?: string;\n\tintercomSessionName?: string;\n\torchestratorIntercomTarget?: string;\n\trunId?: string;\n\tchildAgentName?: string;\n\tchildIndex?: number;\n\tparentEventSink?: string;\n\tparentControlInbox?: string;\n\tparentRootRunId?: string;\n\tparentRunId?: string;\n\tparentChildIndex?: number;\n\tparentDepth?: number;\n\tparentPath?: NestedPathEntry[];\n\tparentCapabilityToken?: string;\n\tsteerInboxDir?: string;\n\tsteerCapabilityPath?: string;\n\tsteerAckDir?: string;\n\tstructuredOutput?: {\n\t\tschema: JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\ttoolBudget?: ResolvedToolBudget;\n\tchildWatchdog?: ChildWatchdogConfig;\n\twaitToolEnabled?: boolean;\n\tparentPermissionMode?: string;\n\tchildPermission?: \"full\" | \"read-only\";\n\texcludeTools?: string[];\n\tchildId?: string;\n\tchildDescription?: string;\n}\n\ninterface BuildPiArgsResult {\n\targs: string[];\n\tenv: Record<string, string | undefined>;\n\ttempDir?: string;\n\ttoolDiagnosticPath?: string;\n}\n\nfunction sanitizeSupervisorChannelSegment(value: string): string {\n\treturn value.trim().replace(/[^A-Za-z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"unknown\";\n}\n\nfunction supervisorChannelDir(runId: string, agent: string, childIndex: number): string {\n\treturn path.join(TEMP_ROOT_DIR, \"supervisor-channels\", `${sanitizeSupervisorChannelSegment(runId)}-${sanitizeSupervisorChannelSegment(agent)}-${childIndex}`);\n}\n\nexport function applyThinkingSuffix(model: string | undefined, thinking: string | false | undefined, replaceExisting = false): string | undefined {\n\tif (!model || !thinking) return model;\n\tconst colonIdx = model.lastIndexOf(\":\");\n\tif (colonIdx !== -1 && THINKING_LEVELS.some((level) => level === model.substring(colonIdx + 1))) {\n\t\treturn replaceExisting ? `${model.slice(0, colonIdx)}:${thinking}` : model;\n\t}\n\treturn `${model}:${thinking}`;\n}\n\nexport function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {\n\tconst args = [...input.baseArgs];\n\n\tif (input.sessionFile) {\n\t\tfs.mkdirSync(path.dirname(input.sessionFile), { recursive: true });\n\t\targs.push(\"--session\", input.sessionFile);\n\t} else {\n\t\tif (!input.sessionEnabled) {\n\t\t\targs.push(\"--no-session\");\n\t\t}\n\t\tif (input.sessionDir) {\n\t\t\tfs.mkdirSync(input.sessionDir, { recursive: true });\n\t\t\targs.push(\"--session-dir\", input.sessionDir);\n\t\t}\n\t}\n\n\tconst modelArg = applyThinkingSuffix(input.model, input.thinking);\n\tif (modelArg) {\n\t\targs.push(\"--model\", modelArg);\n\t}\n\n\tconst declaredBuiltinToolsBase = input.tools?.filter((tool) => !(tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) ?? [];\n\tconst declaredBuiltinTools = input.requireReadTool && input.tools?.length && !declaredBuiltinToolsBase.includes(\"read\")\n\t\t? [\"read\", ...declaredBuiltinToolsBase]\n\t\t: declaredBuiltinToolsBase;\n\tconst fanoutAuthorized = declaredBuiltinTools.includes(\"subagent\");\n\tconst toolExtensionPaths: string[] = [];\n\tlet requiredChildTools: string[] = [];\n\tif (input.tools?.length) {\n\t\tconst allowedTools = [...declaredBuiltinTools];\n\t\tfor (const tool of input.tools) {\n\t\t\tif (!declaredBuiltinTools.includes(tool) && (tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) {\n\t\t\t\ttoolExtensionPaths.push(tool);\n\t\t\t}\n\t\t}\n\t\tif (allowedTools.length > 0) {\n\t\t\tif (input.mcpDirectTools?.length) {\n\t\t\t\tallowedTools.push(...resolveMcpDirectToolNames(input.mcpDirectTools, input.cwd));\n\t\t\t}\n\t\t\tif (input.structuredOutput) allowedTools.push(\"structured_output\");\n\t\t\trequiredChildTools = [...new Set(allowedTools)];\n\t\t\targs.push(\"--tools\", requiredChildTools.join(\",\"));\n\t\t}\n\t}\n\tif (input.excludeTools?.length) {\n\t\targs.push(\"--exclude-tools\", [...new Set(input.excludeTools)].join(\",\"));\n\t}\n\n\tconst runtimeExtensions = fanoutAuthorized\n\t\t? [PROMPT_RUNTIME_EXTENSION_PATH, FANOUT_CHILD_EXTENSION_PATH]\n\t\t: [PROMPT_RUNTIME_EXTENSION_PATH];\n\tif (input.extensions !== undefined) {\n\t\targs.push(\"--no-extensions\");\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.extensions, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t} else {\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t}\n\n\tif (!input.inheritSkills) {\n\t\targs.push(\"--no-skills\");\n\t}\n\n\tlet tempDir: string | undefined;\n\tif (input.systemPrompt !== undefined && input.systemPrompt !== null) {\n\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\tconst stem = (input.promptFileStem ?? \"prompt\").replace(/[^\\w.-]/g, \"_\");\n\t\tconst promptPath = path.join(tempDir, `${stem}.md`);\n\t\tfs.writeFileSync(promptPath, input.systemPrompt, { mode: 0o600 });\n\t\targs.push(input.systemPromptMode === \"replace\" ? \"--system-prompt\" : \"--append-system-prompt\", promptPath);\n\t}\n\n\tif (input.task.length > TASK_ARG_LIMIT) {\n\t\tif (!tempDir) {\n\t\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\t}\n\t\tconst taskFilePath = path.join(tempDir, \"task.md\");\n\t\tfs.writeFileSync(taskFilePath, `Task: ${input.task}`, { mode: 0o600 });\n\t\targs.push(`@${taskFilePath}`);\n\t} else {\n\t\targs.push(`Task: ${input.task}`);\n\t}\n\n\tconst env: Record<string, string | undefined> = {};\n\tlet toolDiagnosticPath: string | undefined;\n\tif (requiredChildTools.length > 0) {\n\t\tif (!tempDir) tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\ttoolDiagnosticPath = path.join(tempDir, \"tool-diagnostic.json\");\n\t\tenv[REQUIRED_CHILD_TOOLS_ENV] = JSON.stringify(requiredChildTools);\n\t\tenv[CHILD_TOOL_DIAGNOSTIC_PATH_ENV] = toolDiagnosticPath;\n\t}\n\tenv[SUBAGENT_CHILD_ENV] = \"1\";\n\tenv[SUBAGENT_CHILD_PERMISSION_ENV] = input.childPermission\n\t\t?? (input.parentPermissionMode === \"plan\" ? \"read-only\" : \"full\");\n\tenv[SUBAGENT_PARENT_PERMISSION_MODE_ENV] = \"\";\n\tenv[SUBAGENT_FANOUT_CHILD_ENV] = fanoutAuthorized ? \"1\" : \"0\";\n\tif (input.waitToolEnabled !== undefined) {\n\t\tenv[WAIT_TOOL_ENABLED_ENV] = input.waitToolEnabled ? \"true\" : \"false\";\n\t}\n\tconst inheritedNestedRoute = Boolean(process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] && process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] && process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV]);\n\tconst parentRunId = input.parentRunId ?? input.runId ?? (inheritedNestedRoute ? process.env[SUBAGENT_RUN_ID_ENV] : undefined) ?? process.env[SUBAGENT_PARENT_RUN_ID_ENV] ?? \"\";\n\tconst parentChildIndex = input.parentChildIndex !== undefined\n\t\t? String(input.parentChildIndex)\n\t\t: input.childIndex !== undefined\n\t\t\t? String(input.childIndex)\n\t\t\t: process.env[SUBAGENT_PARENT_CHILD_INDEX_ENV] ?? \"\";\n\tconst inheritedDepth = Number(process.env[SUBAGENT_PARENT_DEPTH_ENV]);\n\tconst parentDepth = input.parentDepth ?? (inheritedNestedRoute && Number.isFinite(inheritedDepth) ? inheritedDepth + 1 : 1);\n\tconst parentPath = input.parentPath ?? [\n\t\t...parseNestedPathEnv(process.env[SUBAGENT_PARENT_PATH_ENV]),\n\t\t...(parentRunId ? [{\n\t\t\trunId: parentRunId,\n\t\t\t...(parentChildIndex && /^\\d+$/.test(parentChildIndex) ? { stepIndex: Number(parentChildIndex) } : {}),\n\t\t\t...(input.childAgentName ? { agent: input.childAgentName } : {}),\n\t\t}] : []),\n\t];\n\tenv[SUBAGENT_PARENT_EVENT_SINK_ENV] = fanoutAuthorized\n\t\t? input.parentEventSink ?? process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_CONTROL_INBOX_ENV] = fanoutAuthorized\n\t\t? input.parentControlInbox ?? process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] = fanoutAuthorized\n\t\t? input.parentRootRunId ?? process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] ?? input.runId ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_RUN_ID_ENV] = fanoutAuthorized ? parentRunId : \"\";\n\tenv[SUBAGENT_PARENT_CHILD_INDEX_ENV] = fanoutAuthorized ? parentChildIndex : \"\";\n\tenv[SUBAGENT_PARENT_DEPTH_ENV] = fanoutAuthorized ? String(parentDepth) : \"\";\n\tenv[SUBAGENT_PARENT_PATH_ENV] = fanoutAuthorized ? encodeNestedPathEnv(parentPath) : \"\";\n\tenv[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] = fanoutAuthorized\n\t\t? input.parentCapabilityToken ?? process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] ?? \"\"\n\t\t: \"\";\n\tenv.PI_SUBAGENT_INHERIT_PROJECT_CONTEXT = input.inheritProjectContext ? \"1\" : \"0\";\n\tenv.PI_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? \"1\" : \"0\";\n\tif (input.intercomSessionName) {\n\t\tenv.PI_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;\n\t}\n\tif (input.orchestratorIntercomTarget) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = input.orchestratorIntercomTarget;\n\t}\n\tif (input.parentSessionId) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = input.parentSessionId;\n\t}\n\tenv[SUBAGENT_SUPERVISOR_SESSION_ID_ENV] = input.supervisorSessionId ?? \"\";\n\tif (input.parentSessionId && input.runId && (input.childId || input.childAgentName)) {\n\t\tconst childIndex = input.childIndex ?? 0;\n\t\tconst channelAgent = input.childId ?? input.childAgentName!;\n\t\tconst channelDir = supervisorChannelDir(input.runId, channelAgent, childIndex);\n\t\tfs.mkdirSync(path.join(channelDir, \"requests\"), { recursive: true });\n\t\tfs.mkdirSync(path.join(channelDir, \"replies\"), { recursive: true });\n\t\tfs.mkdirSync(path.join(channelDir, \"questions\"), { recursive: true });\n\t\tenv[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV] = channelDir;\n\t\tenv[SUBAGENT_CHILD_INDEX_ENV] = String(childIndex);\n\t}\n\tif (input.runId) {\n\t\tenv[SUBAGENT_RUN_ID_ENV] = input.runId;\n\t}\n\tif (input.childId || input.childAgentName) {\n\t\tenv[SUBAGENT_CHILD_AGENT_ENV] = input.childId ?? input.childAgentName;\n\t}\n\tif (input.childIndex !== undefined) {\n\t\tenv[SUBAGENT_CHILD_INDEX_ENV] = String(input.childIndex);\n\t}\n\tif (input.mcpDirectTools?.length) {\n\t\tenv.MCP_DIRECT_TOOLS = input.mcpDirectTools.join(\",\");\n\t} else {\n\t\tenv.MCP_DIRECT_TOOLS = \"__none__\";\n\t}\n\tif (input.structuredOutput) {\n\t\tenv[STRUCTURED_OUTPUT_CAPTURE_ENV] = input.structuredOutput.outputPath;\n\t\tenv[STRUCTURED_OUTPUT_SCHEMA_ENV] = input.structuredOutput.schemaPath;\n\t}\n\tif (input.steerInboxDir) {\n\t\tenv[SUBAGENT_STEER_INBOX_ENV] = input.steerInboxDir;\n\t}\n\tif (input.steerCapabilityPath) env[SUBAGENT_STEER_CAPABILITY_ENV] = input.steerCapabilityPath;\n\tif (input.steerAckDir) env[SUBAGENT_STEER_ACK_DIR_ENV] = input.steerAckDir;\n\tconst encodedToolBudget = encodeToolBudgetEnv(input.toolBudget);\n\tif (encodedToolBudget) env[TOOL_BUDGET_ENV] = encodedToolBudget;\n\tconst encodedChildWatchdog = encodeChildWatchdogConfig(input.childWatchdog);\n\tif (encodedChildWatchdog) env[CHILD_WATCHDOG_CONFIG_ENV] = encodedChildWatchdog;\n\n\tenv[SUBAGENT_PARENT_SESSION_ENV] = input.parentSessionId ?? process.env[SUBAGENT_PARENT_SESSION_ENV] ?? \"\";\n\n\treturn { args, env, tempDir, toolDiagnosticPath };\n}\n\nexport const parseParentPathEnv = parseNestedPathEnv;\n\nexport function cleanupTempDir(tempDir: string | null | undefined): void {\n\tif (!tempDir) return;\n\ttry {\n\t\tfs.rmSync(tempDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Temp cleanup is best effort.\n\t}\n}\n"]}
1
+ {"version":3,"file":"pi-args.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/pi-args.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { encodeNestedPathEnv, parseNestedPathEnv, type NestedPathEntry } from \"./nested-path.ts\";\nimport { resolveMcpDirectToolNames } from \"./mcp-direct-tool-allowlist.ts\";\nimport { STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV } from \"./structured-output.ts\";\nimport { TEMP_ROOT_DIR, type JsonSchemaObject, type ResolvedToolBudget } from \"../../shared/types.ts\";\nimport { THINKING_LEVELS } from \"../../shared/model-info.ts\";\nimport { TOOL_BUDGET_ENV, encodeToolBudgetEnv } from \"./tool-budget.ts\";\nimport { CHILD_TOOL_DIAGNOSTIC_PATH_ENV, REQUIRED_CHILD_TOOLS_ENV } from \"./tool-availability.ts\";\nimport { CHILD_WATCHDOG_CONFIG_ENV, encodeChildWatchdogConfig, type ChildWatchdogConfig } from \"../../watchdog/child-status.ts\";\nimport { WAIT_TOOL_ENABLED_ENV } from \"../background/wait-config.ts\";\nimport { CHILD_DESCRIPTION_ENV, SUPERVISOR_PROTOCOL_ENV, SUPERVISOR_PROTOCOL_VERSION } from \"../../intercom/communication.ts\";\n\nconst TASK_ARG_LIMIT = 8000;\n// lunr: the bake-in compiles extensions to dist/*.js only; upstream dev mode ships .ts.\n// Resolve the .ts sibling when present, else fall back to the compiled .js so child\n// processes always get a path that exists (the extension loader accepts both).\nfunction resolveRuntimeScriptPath(basePathWithoutExt: string): string {\n\tconst tsPath = `${basePathWithoutExt}.ts`;\n\tif (fs.existsSync(tsPath)) return tsPath;\n\treturn `${basePathWithoutExt}.js`;\n}\nconst PROMPT_RUNTIME_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"subagent-prompt-runtime\"));\nconst FANOUT_CHILD_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"extension\", \"fanout-child\"));\nexport const SUBAGENT_CHILD_ENV = \"PI_SUBAGENT_CHILD\";\nexport const SUBAGENT_ORCHESTRATOR_TARGET_ENV = \"PI_SUBAGENT_ORCHESTRATOR_TARGET\";\nexport const SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV = \"PI_SUBAGENT_ORCHESTRATOR_SESSION_ID\";\nexport const SUBAGENT_SUPERVISOR_SESSION_ID_ENV = \"PI_SUBAGENT_SUPERVISOR_SESSION_ID\";\nexport const SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV = \"PI_SUBAGENT_SUPERVISOR_CHANNEL_DIR\";\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\";\nexport const SUBAGENT_PARENT_SESSION_ENV = \"PI_SUBAGENT_PARENT_SESSION\";\nexport const SUBAGENT_PARENT_PERMISSION_MODE_ENV = \"PI_SUBAGENT_PARENT_PERMISSION_MODE\";\nexport const SUBAGENT_CHILD_PERMISSION_ENV = \"PI_SUBAGENT_CHILD_PERMISSION\";\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\ninterface BuildPiArgsInput {\n\tparentSessionId?: string;\n\t/** Run ownership is a session file or in-memory UUID; parentSessionId remains the routing UUID. */\n\tsupervisorSessionId?: string;\n\tbaseArgs: string[];\n\ttask: string;\n\tsessionEnabled: boolean;\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tmodel?: string;\n\tthinking?: string | false;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\trequireReadTool?: boolean;\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tsystemPrompt?: string | null;\n\tmcpDirectTools?: string[];\n\tcwd?: string;\n\tpromptFileStem?: string;\n\tintercomSessionName?: string;\n\torchestratorIntercomTarget?: string;\n\trunId?: string;\n\tchildAgentName?: string;\n\tchildIndex?: number;\n\tparentEventSink?: string;\n\tparentControlInbox?: string;\n\tparentRootRunId?: string;\n\tparentRunId?: string;\n\tparentChildIndex?: number;\n\tparentDepth?: number;\n\tparentPath?: NestedPathEntry[];\n\tparentCapabilityToken?: string;\n\tsteerInboxDir?: string;\n\tsteerCapabilityPath?: string;\n\tsteerAckDir?: string;\n\tstructuredOutput?: {\n\t\tschema: JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\ttoolBudget?: ResolvedToolBudget;\n\tchildWatchdog?: ChildWatchdogConfig;\n\twaitToolEnabled?: boolean;\n\tparentPermissionMode?: string;\n\tchildPermission?: \"full\" | \"read-only\";\n\texcludeTools?: string[];\n\tchildId?: string;\n\tchildDescription?: string;\n}\n\ninterface BuildPiArgsResult {\n\targs: string[];\n\tenv: Record<string, string | undefined>;\n\ttempDir?: string;\n\ttoolDiagnosticPath?: string;\n}\n\nfunction sanitizeSupervisorChannelSegment(value: string): string {\n\treturn value.trim().replace(/[^A-Za-z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"unknown\";\n}\n\nfunction supervisorChannelDir(runId: string, agent: string, childIndex: number): string {\n\treturn path.join(TEMP_ROOT_DIR, \"supervisor-channels\", `${sanitizeSupervisorChannelSegment(runId)}-${sanitizeSupervisorChannelSegment(agent)}-${childIndex}`);\n}\n\nexport function applyThinkingSuffix(model: string | undefined, thinking: string | false | undefined, replaceExisting = false): string | undefined {\n\tif (!model || !thinking) return model;\n\tconst colonIdx = model.lastIndexOf(\":\");\n\tif (colonIdx !== -1 && THINKING_LEVELS.some((level) => level === model.substring(colonIdx + 1))) {\n\t\treturn replaceExisting ? `${model.slice(0, colonIdx)}:${thinking}` : model;\n\t}\n\treturn `${model}:${thinking}`;\n}\n\nexport function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {\n\tconst args = [...input.baseArgs];\n\n\tif (input.sessionFile) {\n\t\tfs.mkdirSync(path.dirname(input.sessionFile), { recursive: true });\n\t\targs.push(\"--session\", input.sessionFile);\n\t} else {\n\t\tif (!input.sessionEnabled) {\n\t\t\targs.push(\"--no-session\");\n\t\t}\n\t\tif (input.sessionDir) {\n\t\t\tfs.mkdirSync(input.sessionDir, { recursive: true });\n\t\t\targs.push(\"--session-dir\", input.sessionDir);\n\t\t}\n\t}\n\n\tconst modelArg = applyThinkingSuffix(input.model, input.thinking);\n\tif (modelArg) {\n\t\targs.push(\"--model\", modelArg);\n\t}\n\n\tconst declaredBuiltinToolsBase = input.tools?.filter((tool) => !(tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) ?? [];\n\tconst declaredBuiltinTools = input.requireReadTool && input.tools?.length && !declaredBuiltinToolsBase.includes(\"read\")\n\t\t? [\"read\", ...declaredBuiltinToolsBase]\n\t\t: declaredBuiltinToolsBase;\n\tconst fanoutAuthorized = declaredBuiltinTools.includes(\"subagent\");\n\tconst toolExtensionPaths: string[] = [];\n\tlet requiredChildTools: string[] = [];\n\tif (input.tools?.length) {\n\t\tconst allowedTools = [...declaredBuiltinTools];\n\t\tfor (const tool of input.tools) {\n\t\t\tif (!declaredBuiltinTools.includes(tool) && (tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) {\n\t\t\t\ttoolExtensionPaths.push(tool);\n\t\t\t}\n\t\t}\n\t\tif (allowedTools.length > 0) {\n\t\t\tif (input.mcpDirectTools?.length) {\n\t\t\t\tallowedTools.push(...resolveMcpDirectToolNames(input.mcpDirectTools, input.cwd));\n\t\t\t}\n\t\t\tif (input.structuredOutput) allowedTools.push(\"structured_output\");\n\t\t\trequiredChildTools = [...new Set(allowedTools)];\n\t\t\targs.push(\"--tools\", requiredChildTools.join(\",\"));\n\t\t}\n\t}\n\tif (input.excludeTools?.length) {\n\t\targs.push(\"--exclude-tools\", [...new Set(input.excludeTools)].join(\",\"));\n\t}\n\n\tconst runtimeExtensions = fanoutAuthorized\n\t\t? [PROMPT_RUNTIME_EXTENSION_PATH, FANOUT_CHILD_EXTENSION_PATH]\n\t\t: [PROMPT_RUNTIME_EXTENSION_PATH];\n\tif (input.extensions !== undefined) {\n\t\targs.push(\"--no-extensions\");\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.extensions, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t} else {\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t}\n\n\tif (!input.inheritSkills) {\n\t\targs.push(\"--no-skills\");\n\t}\n\n\tlet tempDir: string | undefined;\n\tif (input.systemPrompt !== undefined && input.systemPrompt !== null) {\n\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\tconst stem = (input.promptFileStem ?? \"prompt\").replace(/[^\\w.-]/g, \"_\");\n\t\tconst promptPath = path.join(tempDir, `${stem}.md`);\n\t\tfs.writeFileSync(promptPath, input.systemPrompt, { mode: 0o600 });\n\t\targs.push(input.systemPromptMode === \"replace\" ? \"--system-prompt\" : \"--append-system-prompt\", promptPath);\n\t}\n\n\tif (input.task.length > TASK_ARG_LIMIT) {\n\t\tif (!tempDir) {\n\t\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\t}\n\t\tconst taskFilePath = path.join(tempDir, \"task.md\");\n\t\tfs.writeFileSync(taskFilePath, `Task: ${input.task}`, { mode: 0o600 });\n\t\targs.push(`@${taskFilePath}`);\n\t} else {\n\t\targs.push(`Task: ${input.task}`);\n\t}\n\n\tconst env: Record<string, string | undefined> = {};\n\tlet toolDiagnosticPath: string | undefined;\n\tif (requiredChildTools.length > 0) {\n\t\tif (!tempDir) tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\ttoolDiagnosticPath = path.join(tempDir, \"tool-diagnostic.json\");\n\t\tenv[REQUIRED_CHILD_TOOLS_ENV] = JSON.stringify(requiredChildTools);\n\t\tenv[CHILD_TOOL_DIAGNOSTIC_PATH_ENV] = toolDiagnosticPath;\n\t}\n\tenv[SUBAGENT_CHILD_ENV] = \"1\";\n\tenv[SUBAGENT_CHILD_PERMISSION_ENV] = input.childPermission\n\t\t?? (input.parentPermissionMode === \"plan\" ? \"read-only\" : \"full\");\n\tenv[SUBAGENT_PARENT_PERMISSION_MODE_ENV] = \"\";\n\tenv[SUBAGENT_FANOUT_CHILD_ENV] = fanoutAuthorized ? \"1\" : \"0\";\n\tif (input.waitToolEnabled !== undefined) {\n\t\tenv[WAIT_TOOL_ENABLED_ENV] = input.waitToolEnabled ? \"true\" : \"false\";\n\t}\n\tconst inheritedNestedRoute = Boolean(process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] && process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] && process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV]);\n\tconst parentRunId = input.parentRunId ?? input.runId ?? (inheritedNestedRoute ? process.env[SUBAGENT_RUN_ID_ENV] : undefined) ?? process.env[SUBAGENT_PARENT_RUN_ID_ENV] ?? \"\";\n\tconst parentChildIndex = input.parentChildIndex !== undefined\n\t\t? String(input.parentChildIndex)\n\t\t: input.childIndex !== undefined\n\t\t\t? String(input.childIndex)\n\t\t\t: process.env[SUBAGENT_PARENT_CHILD_INDEX_ENV] ?? \"\";\n\tconst inheritedDepth = Number(process.env[SUBAGENT_PARENT_DEPTH_ENV]);\n\tconst parentDepth = input.parentDepth ?? (inheritedNestedRoute && Number.isFinite(inheritedDepth) ? inheritedDepth + 1 : 1);\n\tconst parentPath = input.parentPath ?? [\n\t\t...parseNestedPathEnv(process.env[SUBAGENT_PARENT_PATH_ENV]),\n\t\t...(parentRunId ? [{\n\t\t\trunId: parentRunId,\n\t\t\t...(parentChildIndex && /^\\d+$/.test(parentChildIndex) ? { stepIndex: Number(parentChildIndex) } : {}),\n\t\t\t...(input.childAgentName ? { agent: input.childAgentName } : {}),\n\t\t}] : []),\n\t];\n\tenv[SUBAGENT_PARENT_EVENT_SINK_ENV] = fanoutAuthorized\n\t\t? input.parentEventSink ?? process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_CONTROL_INBOX_ENV] = fanoutAuthorized\n\t\t? input.parentControlInbox ?? process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] = fanoutAuthorized\n\t\t? input.parentRootRunId ?? process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] ?? input.runId ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_RUN_ID_ENV] = fanoutAuthorized ? parentRunId : \"\";\n\tenv[SUBAGENT_PARENT_CHILD_INDEX_ENV] = fanoutAuthorized ? parentChildIndex : \"\";\n\tenv[SUBAGENT_PARENT_DEPTH_ENV] = fanoutAuthorized ? String(parentDepth) : \"\";\n\tenv[SUBAGENT_PARENT_PATH_ENV] = fanoutAuthorized ? encodeNestedPathEnv(parentPath) : \"\";\n\tenv[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] = fanoutAuthorized\n\t\t? input.parentCapabilityToken ?? process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] ?? \"\"\n\t\t: \"\";\n\tenv.PI_SUBAGENT_INHERIT_PROJECT_CONTEXT = input.inheritProjectContext ? \"1\" : \"0\";\n\tenv.PI_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? \"1\" : \"0\";\n\tif (input.intercomSessionName) {\n\t\tenv.PI_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;\n\t}\n\tif (input.orchestratorIntercomTarget) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = input.orchestratorIntercomTarget;\n\t}\n\tif (input.parentSessionId) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = input.parentSessionId;\n\t}\n\tenv[SUBAGENT_SUPERVISOR_SESSION_ID_ENV] = input.supervisorSessionId ?? \"\";\n\tenv[SUPERVISOR_PROTOCOL_ENV] = String(SUPERVISOR_PROTOCOL_VERSION);\n\tenv[CHILD_DESCRIPTION_ENV] = input.childDescription ?? input.childAgentName ?? \"\";\n\tif (input.parentSessionId && input.runId && (input.childId || input.childAgentName)) {\n\t\tconst childIndex = input.childIndex ?? 0;\n\t\tconst channelAgent = input.childId ?? input.childAgentName!;\n\t\tconst channelDir = supervisorChannelDir(input.runId, channelAgent, childIndex);\n\t\tfs.mkdirSync(path.join(channelDir, \"requests\"), { recursive: true });\n\t\tfs.mkdirSync(path.join(channelDir, \"replies\"), { recursive: true });\n\t\tfs.mkdirSync(path.join(channelDir, \"questions\"), { recursive: true });\n\t\tenv[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV] = channelDir;\n\t\tenv[SUBAGENT_CHILD_INDEX_ENV] = String(childIndex);\n\t}\n\tif (input.runId) {\n\t\tenv[SUBAGENT_RUN_ID_ENV] = input.runId;\n\t}\n\tif (input.childId || input.childAgentName) {\n\t\tenv[SUBAGENT_CHILD_AGENT_ENV] = input.childId ?? input.childAgentName;\n\t}\n\tif (input.childIndex !== undefined) {\n\t\tenv[SUBAGENT_CHILD_INDEX_ENV] = String(input.childIndex);\n\t}\n\tif (input.mcpDirectTools?.length) {\n\t\tenv.MCP_DIRECT_TOOLS = input.mcpDirectTools.join(\",\");\n\t} else {\n\t\tenv.MCP_DIRECT_TOOLS = \"__none__\";\n\t}\n\tif (input.structuredOutput) {\n\t\tenv[STRUCTURED_OUTPUT_CAPTURE_ENV] = input.structuredOutput.outputPath;\n\t\tenv[STRUCTURED_OUTPUT_SCHEMA_ENV] = input.structuredOutput.schemaPath;\n\t}\n\tif (input.steerInboxDir) {\n\t\tenv[SUBAGENT_STEER_INBOX_ENV] = input.steerInboxDir;\n\t}\n\tif (input.steerCapabilityPath) env[SUBAGENT_STEER_CAPABILITY_ENV] = input.steerCapabilityPath;\n\tif (input.steerAckDir) env[SUBAGENT_STEER_ACK_DIR_ENV] = input.steerAckDir;\n\tconst encodedToolBudget = encodeToolBudgetEnv(input.toolBudget);\n\tif (encodedToolBudget) env[TOOL_BUDGET_ENV] = encodedToolBudget;\n\tconst encodedChildWatchdog = encodeChildWatchdogConfig(input.childWatchdog);\n\tif (encodedChildWatchdog) env[CHILD_WATCHDOG_CONFIG_ENV] = encodedChildWatchdog;\n\n\tenv[SUBAGENT_PARENT_SESSION_ENV] = input.parentSessionId ?? process.env[SUBAGENT_PARENT_SESSION_ENV] ?? \"\";\n\n\treturn { args, env, tempDir, toolDiagnosticPath };\n}\n\nexport const parseParentPathEnv = parseNestedPathEnv;\n\nexport function cleanupTempDir(tempDir: string | null | undefined): void {\n\tif (!tempDir) return;\n\ttry {\n\t\tfs.rmSync(tempDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Temp cleanup is best effort.\n\t}\n}\n"]}
@@ -12,6 +12,7 @@ import { TOOL_BUDGET_ENV, encodeToolBudgetEnv } from "./tool-budget.js";
12
12
  import { CHILD_TOOL_DIAGNOSTIC_PATH_ENV, REQUIRED_CHILD_TOOLS_ENV } from "./tool-availability.js";
13
13
  import { CHILD_WATCHDOG_CONFIG_ENV, encodeChildWatchdogConfig } from "../../watchdog/child-status.js";
14
14
  import { WAIT_TOOL_ENABLED_ENV } from "../background/wait-config.js";
15
+ import { CHILD_DESCRIPTION_ENV, SUPERVISOR_PROTOCOL_ENV, SUPERVISOR_PROTOCOL_VERSION } from "../../intercom/communication.js";
15
16
  const TASK_ARG_LIMIT = 8000;
16
17
  // lunr: the bake-in compiles extensions to dist/*.js only; upstream dev mode ships .ts.
17
18
  // Resolve the .ts sibling when present, else fall back to the compiled .js so child
@@ -206,6 +207,8 @@ export function buildPiArgs(input) {
206
207
  env[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = input.parentSessionId;
207
208
  }
208
209
  env[SUBAGENT_SUPERVISOR_SESSION_ID_ENV] = input.supervisorSessionId ?? "";
210
+ env[SUPERVISOR_PROTOCOL_ENV] = String(SUPERVISOR_PROTOCOL_VERSION);
211
+ env[CHILD_DESCRIPTION_ENV] = input.childDescription ?? input.childAgentName ?? "";
209
212
  if (input.parentSessionId && input.runId && (input.childId || input.childAgentName)) {
210
213
  const childIndex = input.childIndex ?? 0;
211
214
  const channelAgent = input.childId ?? input.childAgentName;
@@ -1 +1 @@
1
- {"version":3,"file":"pi-args.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/pi-args.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { encodeNestedPathEnv, parseNestedPathEnv, type NestedPathEntry } from \"./nested-path.ts\";\nimport { resolveMcpDirectToolNames } from \"./mcp-direct-tool-allowlist.ts\";\nimport { STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV } from \"./structured-output.ts\";\nimport { TEMP_ROOT_DIR, type JsonSchemaObject, type ResolvedToolBudget } from \"../../shared/types.ts\";\nimport { THINKING_LEVELS } from \"../../shared/model-info.ts\";\nimport { TOOL_BUDGET_ENV, encodeToolBudgetEnv } from \"./tool-budget.ts\";\nimport { CHILD_TOOL_DIAGNOSTIC_PATH_ENV, REQUIRED_CHILD_TOOLS_ENV } from \"./tool-availability.ts\";\nimport { CHILD_WATCHDOG_CONFIG_ENV, encodeChildWatchdogConfig, type ChildWatchdogConfig } from \"../../watchdog/child-status.ts\";\nimport { WAIT_TOOL_ENABLED_ENV } from \"../background/wait-config.ts\";\n\nconst TASK_ARG_LIMIT = 8000;\n// lunr: the bake-in compiles extensions to dist/*.js only; upstream dev mode ships .ts.\n// Resolve the .ts sibling when present, else fall back to the compiled .js so child\n// processes always get a path that exists (the extension loader accepts both).\nfunction resolveRuntimeScriptPath(basePathWithoutExt: string): string {\n\tconst tsPath = `${basePathWithoutExt}.ts`;\n\tif (fs.existsSync(tsPath)) return tsPath;\n\treturn `${basePathWithoutExt}.js`;\n}\nconst PROMPT_RUNTIME_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"subagent-prompt-runtime\"));\nconst FANOUT_CHILD_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"extension\", \"fanout-child\"));\nexport const SUBAGENT_CHILD_ENV = \"PI_SUBAGENT_CHILD\";\nexport const SUBAGENT_ORCHESTRATOR_TARGET_ENV = \"PI_SUBAGENT_ORCHESTRATOR_TARGET\";\nexport const SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV = \"PI_SUBAGENT_ORCHESTRATOR_SESSION_ID\";\nexport const SUBAGENT_SUPERVISOR_SESSION_ID_ENV = \"PI_SUBAGENT_SUPERVISOR_SESSION_ID\";\nexport const SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV = \"PI_SUBAGENT_SUPERVISOR_CHANNEL_DIR\";\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\";\nexport const SUBAGENT_PARENT_SESSION_ENV = \"PI_SUBAGENT_PARENT_SESSION\";\nexport const SUBAGENT_PARENT_PERMISSION_MODE_ENV = \"PI_SUBAGENT_PARENT_PERMISSION_MODE\";\nexport const SUBAGENT_CHILD_PERMISSION_ENV = \"PI_SUBAGENT_CHILD_PERMISSION\";\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\ninterface BuildPiArgsInput {\n\tparentSessionId?: string;\n\t/** Run ownership is a session file or in-memory UUID; parentSessionId remains the routing UUID. */\n\tsupervisorSessionId?: string;\n\tbaseArgs: string[];\n\ttask: string;\n\tsessionEnabled: boolean;\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tmodel?: string;\n\tthinking?: string | false;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\trequireReadTool?: boolean;\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tsystemPrompt?: string | null;\n\tmcpDirectTools?: string[];\n\tcwd?: string;\n\tpromptFileStem?: string;\n\tintercomSessionName?: string;\n\torchestratorIntercomTarget?: string;\n\trunId?: string;\n\tchildAgentName?: string;\n\tchildIndex?: number;\n\tparentEventSink?: string;\n\tparentControlInbox?: string;\n\tparentRootRunId?: string;\n\tparentRunId?: string;\n\tparentChildIndex?: number;\n\tparentDepth?: number;\n\tparentPath?: NestedPathEntry[];\n\tparentCapabilityToken?: string;\n\tsteerInboxDir?: string;\n\tsteerCapabilityPath?: string;\n\tsteerAckDir?: string;\n\tstructuredOutput?: {\n\t\tschema: JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\ttoolBudget?: ResolvedToolBudget;\n\tchildWatchdog?: ChildWatchdogConfig;\n\twaitToolEnabled?: boolean;\n\tparentPermissionMode?: string;\n\tchildPermission?: \"full\" | \"read-only\";\n\texcludeTools?: string[];\n\tchildId?: string;\n\tchildDescription?: string;\n}\n\ninterface BuildPiArgsResult {\n\targs: string[];\n\tenv: Record<string, string | undefined>;\n\ttempDir?: string;\n\ttoolDiagnosticPath?: string;\n}\n\nfunction sanitizeSupervisorChannelSegment(value: string): string {\n\treturn value.trim().replace(/[^A-Za-z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"unknown\";\n}\n\nfunction supervisorChannelDir(runId: string, agent: string, childIndex: number): string {\n\treturn path.join(TEMP_ROOT_DIR, \"supervisor-channels\", `${sanitizeSupervisorChannelSegment(runId)}-${sanitizeSupervisorChannelSegment(agent)}-${childIndex}`);\n}\n\nexport function applyThinkingSuffix(model: string | undefined, thinking: string | false | undefined, replaceExisting = false): string | undefined {\n\tif (!model || !thinking) return model;\n\tconst colonIdx = model.lastIndexOf(\":\");\n\tif (colonIdx !== -1 && THINKING_LEVELS.some((level) => level === model.substring(colonIdx + 1))) {\n\t\treturn replaceExisting ? `${model.slice(0, colonIdx)}:${thinking}` : model;\n\t}\n\treturn `${model}:${thinking}`;\n}\n\nexport function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {\n\tconst args = [...input.baseArgs];\n\n\tif (input.sessionFile) {\n\t\tfs.mkdirSync(path.dirname(input.sessionFile), { recursive: true });\n\t\targs.push(\"--session\", input.sessionFile);\n\t} else {\n\t\tif (!input.sessionEnabled) {\n\t\t\targs.push(\"--no-session\");\n\t\t}\n\t\tif (input.sessionDir) {\n\t\t\tfs.mkdirSync(input.sessionDir, { recursive: true });\n\t\t\targs.push(\"--session-dir\", input.sessionDir);\n\t\t}\n\t}\n\n\tconst modelArg = applyThinkingSuffix(input.model, input.thinking);\n\tif (modelArg) {\n\t\targs.push(\"--model\", modelArg);\n\t}\n\n\tconst declaredBuiltinToolsBase = input.tools?.filter((tool) => !(tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) ?? [];\n\tconst declaredBuiltinTools = input.requireReadTool && input.tools?.length && !declaredBuiltinToolsBase.includes(\"read\")\n\t\t? [\"read\", ...declaredBuiltinToolsBase]\n\t\t: declaredBuiltinToolsBase;\n\tconst fanoutAuthorized = declaredBuiltinTools.includes(\"subagent\");\n\tconst toolExtensionPaths: string[] = [];\n\tlet requiredChildTools: string[] = [];\n\tif (input.tools?.length) {\n\t\tconst allowedTools = [...declaredBuiltinTools];\n\t\tfor (const tool of input.tools) {\n\t\t\tif (!declaredBuiltinTools.includes(tool) && (tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) {\n\t\t\t\ttoolExtensionPaths.push(tool);\n\t\t\t}\n\t\t}\n\t\tif (allowedTools.length > 0) {\n\t\t\tif (input.mcpDirectTools?.length) {\n\t\t\t\tallowedTools.push(...resolveMcpDirectToolNames(input.mcpDirectTools, input.cwd));\n\t\t\t}\n\t\t\tif (input.structuredOutput) allowedTools.push(\"structured_output\");\n\t\t\trequiredChildTools = [...new Set(allowedTools)];\n\t\t\targs.push(\"--tools\", requiredChildTools.join(\",\"));\n\t\t}\n\t}\n\tif (input.excludeTools?.length) {\n\t\targs.push(\"--exclude-tools\", [...new Set(input.excludeTools)].join(\",\"));\n\t}\n\n\tconst runtimeExtensions = fanoutAuthorized\n\t\t? [PROMPT_RUNTIME_EXTENSION_PATH, FANOUT_CHILD_EXTENSION_PATH]\n\t\t: [PROMPT_RUNTIME_EXTENSION_PATH];\n\tif (input.extensions !== undefined) {\n\t\targs.push(\"--no-extensions\");\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.extensions, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t} else {\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t}\n\n\tif (!input.inheritSkills) {\n\t\targs.push(\"--no-skills\");\n\t}\n\n\tlet tempDir: string | undefined;\n\tif (input.systemPrompt !== undefined && input.systemPrompt !== null) {\n\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\tconst stem = (input.promptFileStem ?? \"prompt\").replace(/[^\\w.-]/g, \"_\");\n\t\tconst promptPath = path.join(tempDir, `${stem}.md`);\n\t\tfs.writeFileSync(promptPath, input.systemPrompt, { mode: 0o600 });\n\t\targs.push(input.systemPromptMode === \"replace\" ? \"--system-prompt\" : \"--append-system-prompt\", promptPath);\n\t}\n\n\tif (input.task.length > TASK_ARG_LIMIT) {\n\t\tif (!tempDir) {\n\t\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\t}\n\t\tconst taskFilePath = path.join(tempDir, \"task.md\");\n\t\tfs.writeFileSync(taskFilePath, `Task: ${input.task}`, { mode: 0o600 });\n\t\targs.push(`@${taskFilePath}`);\n\t} else {\n\t\targs.push(`Task: ${input.task}`);\n\t}\n\n\tconst env: Record<string, string | undefined> = {};\n\tlet toolDiagnosticPath: string | undefined;\n\tif (requiredChildTools.length > 0) {\n\t\tif (!tempDir) tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\ttoolDiagnosticPath = path.join(tempDir, \"tool-diagnostic.json\");\n\t\tenv[REQUIRED_CHILD_TOOLS_ENV] = JSON.stringify(requiredChildTools);\n\t\tenv[CHILD_TOOL_DIAGNOSTIC_PATH_ENV] = toolDiagnosticPath;\n\t}\n\tenv[SUBAGENT_CHILD_ENV] = \"1\";\n\tenv[SUBAGENT_CHILD_PERMISSION_ENV] = input.childPermission\n\t\t?? (input.parentPermissionMode === \"plan\" ? \"read-only\" : \"full\");\n\tenv[SUBAGENT_PARENT_PERMISSION_MODE_ENV] = \"\";\n\tenv[SUBAGENT_FANOUT_CHILD_ENV] = fanoutAuthorized ? \"1\" : \"0\";\n\tif (input.waitToolEnabled !== undefined) {\n\t\tenv[WAIT_TOOL_ENABLED_ENV] = input.waitToolEnabled ? \"true\" : \"false\";\n\t}\n\tconst inheritedNestedRoute = Boolean(process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] && process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] && process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV]);\n\tconst parentRunId = input.parentRunId ?? input.runId ?? (inheritedNestedRoute ? process.env[SUBAGENT_RUN_ID_ENV] : undefined) ?? process.env[SUBAGENT_PARENT_RUN_ID_ENV] ?? \"\";\n\tconst parentChildIndex = input.parentChildIndex !== undefined\n\t\t? String(input.parentChildIndex)\n\t\t: input.childIndex !== undefined\n\t\t\t? String(input.childIndex)\n\t\t\t: process.env[SUBAGENT_PARENT_CHILD_INDEX_ENV] ?? \"\";\n\tconst inheritedDepth = Number(process.env[SUBAGENT_PARENT_DEPTH_ENV]);\n\tconst parentDepth = input.parentDepth ?? (inheritedNestedRoute && Number.isFinite(inheritedDepth) ? inheritedDepth + 1 : 1);\n\tconst parentPath = input.parentPath ?? [\n\t\t...parseNestedPathEnv(process.env[SUBAGENT_PARENT_PATH_ENV]),\n\t\t...(parentRunId ? [{\n\t\t\trunId: parentRunId,\n\t\t\t...(parentChildIndex && /^\\d+$/.test(parentChildIndex) ? { stepIndex: Number(parentChildIndex) } : {}),\n\t\t\t...(input.childAgentName ? { agent: input.childAgentName } : {}),\n\t\t}] : []),\n\t];\n\tenv[SUBAGENT_PARENT_EVENT_SINK_ENV] = fanoutAuthorized\n\t\t? input.parentEventSink ?? process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_CONTROL_INBOX_ENV] = fanoutAuthorized\n\t\t? input.parentControlInbox ?? process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] = fanoutAuthorized\n\t\t? input.parentRootRunId ?? process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] ?? input.runId ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_RUN_ID_ENV] = fanoutAuthorized ? parentRunId : \"\";\n\tenv[SUBAGENT_PARENT_CHILD_INDEX_ENV] = fanoutAuthorized ? parentChildIndex : \"\";\n\tenv[SUBAGENT_PARENT_DEPTH_ENV] = fanoutAuthorized ? String(parentDepth) : \"\";\n\tenv[SUBAGENT_PARENT_PATH_ENV] = fanoutAuthorized ? encodeNestedPathEnv(parentPath) : \"\";\n\tenv[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] = fanoutAuthorized\n\t\t? input.parentCapabilityToken ?? process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] ?? \"\"\n\t\t: \"\";\n\tenv.PI_SUBAGENT_INHERIT_PROJECT_CONTEXT = input.inheritProjectContext ? \"1\" : \"0\";\n\tenv.PI_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? \"1\" : \"0\";\n\tif (input.intercomSessionName) {\n\t\tenv.PI_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;\n\t}\n\tif (input.orchestratorIntercomTarget) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = input.orchestratorIntercomTarget;\n\t}\n\tif (input.parentSessionId) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = input.parentSessionId;\n\t}\n\tenv[SUBAGENT_SUPERVISOR_SESSION_ID_ENV] = input.supervisorSessionId ?? \"\";\n\tif (input.parentSessionId && input.runId && (input.childId || input.childAgentName)) {\n\t\tconst childIndex = input.childIndex ?? 0;\n\t\tconst channelAgent = input.childId ?? input.childAgentName!;\n\t\tconst channelDir = supervisorChannelDir(input.runId, channelAgent, childIndex);\n\t\tfs.mkdirSync(path.join(channelDir, \"requests\"), { recursive: true });\n\t\tfs.mkdirSync(path.join(channelDir, \"replies\"), { recursive: true });\n\t\tfs.mkdirSync(path.join(channelDir, \"questions\"), { recursive: true });\n\t\tenv[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV] = channelDir;\n\t\tenv[SUBAGENT_CHILD_INDEX_ENV] = String(childIndex);\n\t}\n\tif (input.runId) {\n\t\tenv[SUBAGENT_RUN_ID_ENV] = input.runId;\n\t}\n\tif (input.childId || input.childAgentName) {\n\t\tenv[SUBAGENT_CHILD_AGENT_ENV] = input.childId ?? input.childAgentName;\n\t}\n\tif (input.childIndex !== undefined) {\n\t\tenv[SUBAGENT_CHILD_INDEX_ENV] = String(input.childIndex);\n\t}\n\tif (input.mcpDirectTools?.length) {\n\t\tenv.MCP_DIRECT_TOOLS = input.mcpDirectTools.join(\",\");\n\t} else {\n\t\tenv.MCP_DIRECT_TOOLS = \"__none__\";\n\t}\n\tif (input.structuredOutput) {\n\t\tenv[STRUCTURED_OUTPUT_CAPTURE_ENV] = input.structuredOutput.outputPath;\n\t\tenv[STRUCTURED_OUTPUT_SCHEMA_ENV] = input.structuredOutput.schemaPath;\n\t}\n\tif (input.steerInboxDir) {\n\t\tenv[SUBAGENT_STEER_INBOX_ENV] = input.steerInboxDir;\n\t}\n\tif (input.steerCapabilityPath) env[SUBAGENT_STEER_CAPABILITY_ENV] = input.steerCapabilityPath;\n\tif (input.steerAckDir) env[SUBAGENT_STEER_ACK_DIR_ENV] = input.steerAckDir;\n\tconst encodedToolBudget = encodeToolBudgetEnv(input.toolBudget);\n\tif (encodedToolBudget) env[TOOL_BUDGET_ENV] = encodedToolBudget;\n\tconst encodedChildWatchdog = encodeChildWatchdogConfig(input.childWatchdog);\n\tif (encodedChildWatchdog) env[CHILD_WATCHDOG_CONFIG_ENV] = encodedChildWatchdog;\n\n\tenv[SUBAGENT_PARENT_SESSION_ENV] = input.parentSessionId ?? process.env[SUBAGENT_PARENT_SESSION_ENV] ?? \"\";\n\n\treturn { args, env, tempDir, toolDiagnosticPath };\n}\n\nexport const parseParentPathEnv = parseNestedPathEnv;\n\nexport function cleanupTempDir(tempDir: string | null | undefined): void {\n\tif (!tempDir) return;\n\ttry {\n\t\tfs.rmSync(tempDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Temp cleanup is best effort.\n\t}\n}\n"]}
1
+ {"version":3,"file":"pi-args.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/pi-args.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as os from \"node:os\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { encodeNestedPathEnv, parseNestedPathEnv, type NestedPathEntry } from \"./nested-path.ts\";\nimport { resolveMcpDirectToolNames } from \"./mcp-direct-tool-allowlist.ts\";\nimport { STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV } from \"./structured-output.ts\";\nimport { TEMP_ROOT_DIR, type JsonSchemaObject, type ResolvedToolBudget } from \"../../shared/types.ts\";\nimport { THINKING_LEVELS } from \"../../shared/model-info.ts\";\nimport { TOOL_BUDGET_ENV, encodeToolBudgetEnv } from \"./tool-budget.ts\";\nimport { CHILD_TOOL_DIAGNOSTIC_PATH_ENV, REQUIRED_CHILD_TOOLS_ENV } from \"./tool-availability.ts\";\nimport { CHILD_WATCHDOG_CONFIG_ENV, encodeChildWatchdogConfig, type ChildWatchdogConfig } from \"../../watchdog/child-status.ts\";\nimport { WAIT_TOOL_ENABLED_ENV } from \"../background/wait-config.ts\";\nimport { CHILD_DESCRIPTION_ENV, SUPERVISOR_PROTOCOL_ENV, SUPERVISOR_PROTOCOL_VERSION } from \"../../intercom/communication.ts\";\n\nconst TASK_ARG_LIMIT = 8000;\n// lunr: the bake-in compiles extensions to dist/*.js only; upstream dev mode ships .ts.\n// Resolve the .ts sibling when present, else fall back to the compiled .js so child\n// processes always get a path that exists (the extension loader accepts both).\nfunction resolveRuntimeScriptPath(basePathWithoutExt: string): string {\n\tconst tsPath = `${basePathWithoutExt}.ts`;\n\tif (fs.existsSync(tsPath)) return tsPath;\n\treturn `${basePathWithoutExt}.js`;\n}\nconst PROMPT_RUNTIME_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"subagent-prompt-runtime\"));\nconst FANOUT_CHILD_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\", \"extension\", \"fanout-child\"));\nexport const SUBAGENT_CHILD_ENV = \"PI_SUBAGENT_CHILD\";\nexport const SUBAGENT_ORCHESTRATOR_TARGET_ENV = \"PI_SUBAGENT_ORCHESTRATOR_TARGET\";\nexport const SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV = \"PI_SUBAGENT_ORCHESTRATOR_SESSION_ID\";\nexport const SUBAGENT_SUPERVISOR_SESSION_ID_ENV = \"PI_SUBAGENT_SUPERVISOR_SESSION_ID\";\nexport const SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV = \"PI_SUBAGENT_SUPERVISOR_CHANNEL_DIR\";\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\";\nexport const SUBAGENT_PARENT_SESSION_ENV = \"PI_SUBAGENT_PARENT_SESSION\";\nexport const SUBAGENT_PARENT_PERMISSION_MODE_ENV = \"PI_SUBAGENT_PARENT_PERMISSION_MODE\";\nexport const SUBAGENT_CHILD_PERMISSION_ENV = \"PI_SUBAGENT_CHILD_PERMISSION\";\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\ninterface BuildPiArgsInput {\n\tparentSessionId?: string;\n\t/** Run ownership is a session file or in-memory UUID; parentSessionId remains the routing UUID. */\n\tsupervisorSessionId?: string;\n\tbaseArgs: string[];\n\ttask: string;\n\tsessionEnabled: boolean;\n\tsessionDir?: string;\n\tsessionFile?: string;\n\tmodel?: string;\n\tthinking?: string | false;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\trequireReadTool?: boolean;\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tsystemPrompt?: string | null;\n\tmcpDirectTools?: string[];\n\tcwd?: string;\n\tpromptFileStem?: string;\n\tintercomSessionName?: string;\n\torchestratorIntercomTarget?: string;\n\trunId?: string;\n\tchildAgentName?: string;\n\tchildIndex?: number;\n\tparentEventSink?: string;\n\tparentControlInbox?: string;\n\tparentRootRunId?: string;\n\tparentRunId?: string;\n\tparentChildIndex?: number;\n\tparentDepth?: number;\n\tparentPath?: NestedPathEntry[];\n\tparentCapabilityToken?: string;\n\tsteerInboxDir?: string;\n\tsteerCapabilityPath?: string;\n\tsteerAckDir?: string;\n\tstructuredOutput?: {\n\t\tschema: JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\ttoolBudget?: ResolvedToolBudget;\n\tchildWatchdog?: ChildWatchdogConfig;\n\twaitToolEnabled?: boolean;\n\tparentPermissionMode?: string;\n\tchildPermission?: \"full\" | \"read-only\";\n\texcludeTools?: string[];\n\tchildId?: string;\n\tchildDescription?: string;\n}\n\ninterface BuildPiArgsResult {\n\targs: string[];\n\tenv: Record<string, string | undefined>;\n\ttempDir?: string;\n\ttoolDiagnosticPath?: string;\n}\n\nfunction sanitizeSupervisorChannelSegment(value: string): string {\n\treturn value.trim().replace(/[^A-Za-z0-9._-]+/g, \"-\").replace(/^-+|-+$/g, \"\") || \"unknown\";\n}\n\nfunction supervisorChannelDir(runId: string, agent: string, childIndex: number): string {\n\treturn path.join(TEMP_ROOT_DIR, \"supervisor-channels\", `${sanitizeSupervisorChannelSegment(runId)}-${sanitizeSupervisorChannelSegment(agent)}-${childIndex}`);\n}\n\nexport function applyThinkingSuffix(model: string | undefined, thinking: string | false | undefined, replaceExisting = false): string | undefined {\n\tif (!model || !thinking) return model;\n\tconst colonIdx = model.lastIndexOf(\":\");\n\tif (colonIdx !== -1 && THINKING_LEVELS.some((level) => level === model.substring(colonIdx + 1))) {\n\t\treturn replaceExisting ? `${model.slice(0, colonIdx)}:${thinking}` : model;\n\t}\n\treturn `${model}:${thinking}`;\n}\n\nexport function buildPiArgs(input: BuildPiArgsInput): BuildPiArgsResult {\n\tconst args = [...input.baseArgs];\n\n\tif (input.sessionFile) {\n\t\tfs.mkdirSync(path.dirname(input.sessionFile), { recursive: true });\n\t\targs.push(\"--session\", input.sessionFile);\n\t} else {\n\t\tif (!input.sessionEnabled) {\n\t\t\targs.push(\"--no-session\");\n\t\t}\n\t\tif (input.sessionDir) {\n\t\t\tfs.mkdirSync(input.sessionDir, { recursive: true });\n\t\t\targs.push(\"--session-dir\", input.sessionDir);\n\t\t}\n\t}\n\n\tconst modelArg = applyThinkingSuffix(input.model, input.thinking);\n\tif (modelArg) {\n\t\targs.push(\"--model\", modelArg);\n\t}\n\n\tconst declaredBuiltinToolsBase = input.tools?.filter((tool) => !(tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) ?? [];\n\tconst declaredBuiltinTools = input.requireReadTool && input.tools?.length && !declaredBuiltinToolsBase.includes(\"read\")\n\t\t? [\"read\", ...declaredBuiltinToolsBase]\n\t\t: declaredBuiltinToolsBase;\n\tconst fanoutAuthorized = declaredBuiltinTools.includes(\"subagent\");\n\tconst toolExtensionPaths: string[] = [];\n\tlet requiredChildTools: string[] = [];\n\tif (input.tools?.length) {\n\t\tconst allowedTools = [...declaredBuiltinTools];\n\t\tfor (const tool of input.tools) {\n\t\t\tif (!declaredBuiltinTools.includes(tool) && (tool.includes(\"/\") || tool.endsWith(\".ts\") || tool.endsWith(\".js\"))) {\n\t\t\t\ttoolExtensionPaths.push(tool);\n\t\t\t}\n\t\t}\n\t\tif (allowedTools.length > 0) {\n\t\t\tif (input.mcpDirectTools?.length) {\n\t\t\t\tallowedTools.push(...resolveMcpDirectToolNames(input.mcpDirectTools, input.cwd));\n\t\t\t}\n\t\t\tif (input.structuredOutput) allowedTools.push(\"structured_output\");\n\t\t\trequiredChildTools = [...new Set(allowedTools)];\n\t\t\targs.push(\"--tools\", requiredChildTools.join(\",\"));\n\t\t}\n\t}\n\tif (input.excludeTools?.length) {\n\t\targs.push(\"--exclude-tools\", [...new Set(input.excludeTools)].join(\",\"));\n\t}\n\n\tconst runtimeExtensions = fanoutAuthorized\n\t\t? [PROMPT_RUNTIME_EXTENSION_PATH, FANOUT_CHILD_EXTENSION_PATH]\n\t\t: [PROMPT_RUNTIME_EXTENSION_PATH];\n\tif (input.extensions !== undefined) {\n\t\targs.push(\"--no-extensions\");\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...input.extensions, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t} else {\n\t\tfor (const extPath of [...new Set([...runtimeExtensions, ...toolExtensionPaths, ...(input.subagentOnlyExtensions ?? [])])]) {\n\t\t\targs.push(\"--extension\", extPath);\n\t\t}\n\t}\n\n\tif (!input.inheritSkills) {\n\t\targs.push(\"--no-skills\");\n\t}\n\n\tlet tempDir: string | undefined;\n\tif (input.systemPrompt !== undefined && input.systemPrompt !== null) {\n\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\tconst stem = (input.promptFileStem ?? \"prompt\").replace(/[^\\w.-]/g, \"_\");\n\t\tconst promptPath = path.join(tempDir, `${stem}.md`);\n\t\tfs.writeFileSync(promptPath, input.systemPrompt, { mode: 0o600 });\n\t\targs.push(input.systemPromptMode === \"replace\" ? \"--system-prompt\" : \"--append-system-prompt\", promptPath);\n\t}\n\n\tif (input.task.length > TASK_ARG_LIMIT) {\n\t\tif (!tempDir) {\n\t\t\ttempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\t}\n\t\tconst taskFilePath = path.join(tempDir, \"task.md\");\n\t\tfs.writeFileSync(taskFilePath, `Task: ${input.task}`, { mode: 0o600 });\n\t\targs.push(`@${taskFilePath}`);\n\t} else {\n\t\targs.push(`Task: ${input.task}`);\n\t}\n\n\tconst env: Record<string, string | undefined> = {};\n\tlet toolDiagnosticPath: string | undefined;\n\tif (requiredChildTools.length > 0) {\n\t\tif (!tempDir) tempDir = fs.mkdtempSync(path.join(os.tmpdir(), \"pi-subagent-\"));\n\t\ttoolDiagnosticPath = path.join(tempDir, \"tool-diagnostic.json\");\n\t\tenv[REQUIRED_CHILD_TOOLS_ENV] = JSON.stringify(requiredChildTools);\n\t\tenv[CHILD_TOOL_DIAGNOSTIC_PATH_ENV] = toolDiagnosticPath;\n\t}\n\tenv[SUBAGENT_CHILD_ENV] = \"1\";\n\tenv[SUBAGENT_CHILD_PERMISSION_ENV] = input.childPermission\n\t\t?? (input.parentPermissionMode === \"plan\" ? \"read-only\" : \"full\");\n\tenv[SUBAGENT_PARENT_PERMISSION_MODE_ENV] = \"\";\n\tenv[SUBAGENT_FANOUT_CHILD_ENV] = fanoutAuthorized ? \"1\" : \"0\";\n\tif (input.waitToolEnabled !== undefined) {\n\t\tenv[WAIT_TOOL_ENABLED_ENV] = input.waitToolEnabled ? \"true\" : \"false\";\n\t}\n\tconst inheritedNestedRoute = Boolean(process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] && process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] && process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV]);\n\tconst parentRunId = input.parentRunId ?? input.runId ?? (inheritedNestedRoute ? process.env[SUBAGENT_RUN_ID_ENV] : undefined) ?? process.env[SUBAGENT_PARENT_RUN_ID_ENV] ?? \"\";\n\tconst parentChildIndex = input.parentChildIndex !== undefined\n\t\t? String(input.parentChildIndex)\n\t\t: input.childIndex !== undefined\n\t\t\t? String(input.childIndex)\n\t\t\t: process.env[SUBAGENT_PARENT_CHILD_INDEX_ENV] ?? \"\";\n\tconst inheritedDepth = Number(process.env[SUBAGENT_PARENT_DEPTH_ENV]);\n\tconst parentDepth = input.parentDepth ?? (inheritedNestedRoute && Number.isFinite(inheritedDepth) ? inheritedDepth + 1 : 1);\n\tconst parentPath = input.parentPath ?? [\n\t\t...parseNestedPathEnv(process.env[SUBAGENT_PARENT_PATH_ENV]),\n\t\t...(parentRunId ? [{\n\t\t\trunId: parentRunId,\n\t\t\t...(parentChildIndex && /^\\d+$/.test(parentChildIndex) ? { stepIndex: Number(parentChildIndex) } : {}),\n\t\t\t...(input.childAgentName ? { agent: input.childAgentName } : {}),\n\t\t}] : []),\n\t];\n\tenv[SUBAGENT_PARENT_EVENT_SINK_ENV] = fanoutAuthorized\n\t\t? input.parentEventSink ?? process.env[SUBAGENT_PARENT_EVENT_SINK_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_CONTROL_INBOX_ENV] = fanoutAuthorized\n\t\t? input.parentControlInbox ?? process.env[SUBAGENT_PARENT_CONTROL_INBOX_ENV] ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] = fanoutAuthorized\n\t\t? input.parentRootRunId ?? process.env[SUBAGENT_PARENT_ROOT_RUN_ID_ENV] ?? input.runId ?? \"\"\n\t\t: \"\";\n\tenv[SUBAGENT_PARENT_RUN_ID_ENV] = fanoutAuthorized ? parentRunId : \"\";\n\tenv[SUBAGENT_PARENT_CHILD_INDEX_ENV] = fanoutAuthorized ? parentChildIndex : \"\";\n\tenv[SUBAGENT_PARENT_DEPTH_ENV] = fanoutAuthorized ? String(parentDepth) : \"\";\n\tenv[SUBAGENT_PARENT_PATH_ENV] = fanoutAuthorized ? encodeNestedPathEnv(parentPath) : \"\";\n\tenv[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] = fanoutAuthorized\n\t\t? input.parentCapabilityToken ?? process.env[SUBAGENT_PARENT_CAPABILITY_TOKEN_ENV] ?? \"\"\n\t\t: \"\";\n\tenv.PI_SUBAGENT_INHERIT_PROJECT_CONTEXT = input.inheritProjectContext ? \"1\" : \"0\";\n\tenv.PI_SUBAGENT_INHERIT_SKILLS = input.inheritSkills ? \"1\" : \"0\";\n\tif (input.intercomSessionName) {\n\t\tenv.PI_SUBAGENT_INTERCOM_SESSION_NAME = input.intercomSessionName;\n\t}\n\tif (input.orchestratorIntercomTarget) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_TARGET_ENV] = input.orchestratorIntercomTarget;\n\t}\n\tif (input.parentSessionId) {\n\t\tenv[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = input.parentSessionId;\n\t}\n\tenv[SUBAGENT_SUPERVISOR_SESSION_ID_ENV] = input.supervisorSessionId ?? \"\";\n\tenv[SUPERVISOR_PROTOCOL_ENV] = String(SUPERVISOR_PROTOCOL_VERSION);\n\tenv[CHILD_DESCRIPTION_ENV] = input.childDescription ?? input.childAgentName ?? \"\";\n\tif (input.parentSessionId && input.runId && (input.childId || input.childAgentName)) {\n\t\tconst childIndex = input.childIndex ?? 0;\n\t\tconst channelAgent = input.childId ?? input.childAgentName!;\n\t\tconst channelDir = supervisorChannelDir(input.runId, channelAgent, childIndex);\n\t\tfs.mkdirSync(path.join(channelDir, \"requests\"), { recursive: true });\n\t\tfs.mkdirSync(path.join(channelDir, \"replies\"), { recursive: true });\n\t\tfs.mkdirSync(path.join(channelDir, \"questions\"), { recursive: true });\n\t\tenv[SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV] = channelDir;\n\t\tenv[SUBAGENT_CHILD_INDEX_ENV] = String(childIndex);\n\t}\n\tif (input.runId) {\n\t\tenv[SUBAGENT_RUN_ID_ENV] = input.runId;\n\t}\n\tif (input.childId || input.childAgentName) {\n\t\tenv[SUBAGENT_CHILD_AGENT_ENV] = input.childId ?? input.childAgentName;\n\t}\n\tif (input.childIndex !== undefined) {\n\t\tenv[SUBAGENT_CHILD_INDEX_ENV] = String(input.childIndex);\n\t}\n\tif (input.mcpDirectTools?.length) {\n\t\tenv.MCP_DIRECT_TOOLS = input.mcpDirectTools.join(\",\");\n\t} else {\n\t\tenv.MCP_DIRECT_TOOLS = \"__none__\";\n\t}\n\tif (input.structuredOutput) {\n\t\tenv[STRUCTURED_OUTPUT_CAPTURE_ENV] = input.structuredOutput.outputPath;\n\t\tenv[STRUCTURED_OUTPUT_SCHEMA_ENV] = input.structuredOutput.schemaPath;\n\t}\n\tif (input.steerInboxDir) {\n\t\tenv[SUBAGENT_STEER_INBOX_ENV] = input.steerInboxDir;\n\t}\n\tif (input.steerCapabilityPath) env[SUBAGENT_STEER_CAPABILITY_ENV] = input.steerCapabilityPath;\n\tif (input.steerAckDir) env[SUBAGENT_STEER_ACK_DIR_ENV] = input.steerAckDir;\n\tconst encodedToolBudget = encodeToolBudgetEnv(input.toolBudget);\n\tif (encodedToolBudget) env[TOOL_BUDGET_ENV] = encodedToolBudget;\n\tconst encodedChildWatchdog = encodeChildWatchdogConfig(input.childWatchdog);\n\tif (encodedChildWatchdog) env[CHILD_WATCHDOG_CONFIG_ENV] = encodedChildWatchdog;\n\n\tenv[SUBAGENT_PARENT_SESSION_ENV] = input.parentSessionId ?? process.env[SUBAGENT_PARENT_SESSION_ENV] ?? \"\";\n\n\treturn { args, env, tempDir, toolDiagnosticPath };\n}\n\nexport const parseParentPathEnv = parseNestedPathEnv;\n\nexport function cleanupTempDir(tempDir: string | null | undefined): void {\n\tif (!tempDir) return;\n\ttry {\n\t\tfs.rmSync(tempDir, { recursive: true, force: true });\n\t} catch {\n\t\t// Temp cleanup is best effort.\n\t}\n}\n"]}
@@ -28,6 +28,7 @@ export declare function buildControlEvent(input: {
28
28
  recentFailureSummary?: string;
29
29
  }): ControlEvent;
30
30
  export declare function shouldNotifyControlEvent(config: ResolvedControlConfig, event: ControlEvent): boolean;
31
+ export declare function isDiagnosticControlEvent(event: Partial<ControlEvent> | undefined): boolean;
31
32
  export declare function controlNotificationKey(event: ControlEvent, childIntercomTarget?: string): string;
32
33
  export declare function claimControlNotification(config: ResolvedControlConfig, event: ControlEvent, seenKeys: Set<string>, childIntercomTarget?: string): boolean;
33
34
  export declare function formatControlNoticeMessage(event: ControlEvent, childIntercomTarget?: string): string;
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-control.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,KAAK,qBAAqB,EAC1B,MAAM,uBAAuB,CAAC;AAM/B,eAAO,MAAM,sBAAsB,EAAE,qBAOpC,CAAC;AAgBF,wBAAgB,oBAAoB,CACnC,YAAY,CAAC,EAAE,aAAa,EAC5B,QAAQ,CAAC,EAAE,aAAa,GACtB,qBAAqB,CA+BvB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IAC1C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,aAAa,GAAG,SAAS,CAM5B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACxC,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,EAAE,EAAE,aAAa,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,YAAY,CA6Bf;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,qBAAqB,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAEpG;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAGhG;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,qBAAqB,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAMzJ;AAaD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,YAAY,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAwCpG;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,YAAY,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAiBtG","sourcesContent":["// @ts-nocheck\nimport {\n\ttype ActivityState,\n\ttype ControlConfig,\n\ttype ControlEvent,\n\ttype ControlEventType,\n\ttype ControlNotificationChannel,\n\ttype ResolvedControlConfig,\n} from \"../../shared/types.ts\";\n\nconst CONTROL_EVENT_TYPES: ControlEventType[] = [\"active_long_running\", \"needs_attention\"];\nconst CONTROL_NOTIFICATION_CHANNELS: ControlNotificationChannel[] = [\"event\", \"async\", \"intercom\"];\nconst DEFAULT_NOTIFY_ON: ControlEventType[] = [\"active_long_running\", \"needs_attention\"];\n\nexport const DEFAULT_CONTROL_CONFIG: ResolvedControlConfig = {\n\tenabled: true,\n\tneedsAttentionAfterMs: 60_000,\n\tactiveNoticeAfterMs: 240_000,\n\tfailedToolAttemptsBeforeAttention: 3,\n\tnotifyOn: DEFAULT_NOTIFY_ON,\n\tnotifyChannels: CONTROL_NOTIFICATION_CHANNELS,\n};\n\nfunction parsePositiveInt(value: unknown): number | undefined {\n\tif (typeof value !== \"number\") return undefined;\n\tif (!Number.isFinite(value) || !Number.isInteger(value) || value < 1) return undefined;\n\treturn value;\n}\n\nfunction parseControlList<T extends string>(value: unknown, allowed: readonly T[]): T[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tif (value.length === 0) return [];\n\tconst allowedSet = new Set(allowed);\n\tconst parsed = value.filter((entry): entry is T => typeof entry === \"string\" && allowedSet.has(entry as T));\n\treturn parsed.length > 0 ? Array.from(new Set(parsed)) : undefined;\n}\n\nexport function resolveControlConfig(\n\tglobalConfig?: ControlConfig,\n\toverride?: ControlConfig,\n): ResolvedControlConfig {\n\tconst enabled = override?.enabled ?? globalConfig?.enabled ?? DEFAULT_CONTROL_CONFIG.enabled;\n\tconst needsAttentionAfterMs = parsePositiveInt(override?.needsAttentionAfterMs)\n\t\t?? parsePositiveInt(globalConfig?.needsAttentionAfterMs)\n\t\t?? DEFAULT_CONTROL_CONFIG.needsAttentionAfterMs;\n\tconst activeNoticeAfterMs = parsePositiveInt(override?.activeNoticeAfterMs)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterMs)\n\t\t?? DEFAULT_CONTROL_CONFIG.activeNoticeAfterMs;\n\tconst activeNoticeAfterTurns = parsePositiveInt(override?.activeNoticeAfterTurns)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterTurns);\n\tconst activeNoticeAfterTokens = parsePositiveInt(override?.activeNoticeAfterTokens)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterTokens);\n\tconst failedToolAttemptsBeforeAttention = parsePositiveInt(override?.failedToolAttemptsBeforeAttention)\n\t\t?? parsePositiveInt(globalConfig?.failedToolAttemptsBeforeAttention)\n\t\t?? DEFAULT_CONTROL_CONFIG.failedToolAttemptsBeforeAttention;\n\tconst notifyOn = parseControlList(override?.notifyOn, CONTROL_EVENT_TYPES)\n\t\t?? parseControlList(globalConfig?.notifyOn, CONTROL_EVENT_TYPES)\n\t\t?? DEFAULT_CONTROL_CONFIG.notifyOn;\n\tconst notifyChannels = parseControlList(override?.notifyChannels, CONTROL_NOTIFICATION_CHANNELS)\n\t\t?? parseControlList(globalConfig?.notifyChannels, CONTROL_NOTIFICATION_CHANNELS)\n\t\t?? DEFAULT_CONTROL_CONFIG.notifyChannels;\n\treturn {\n\t\tenabled,\n\t\tneedsAttentionAfterMs,\n\t\tactiveNoticeAfterMs,\n\t\tactiveNoticeAfterTurns,\n\t\tactiveNoticeAfterTokens,\n\t\tfailedToolAttemptsBeforeAttention,\n\t\tnotifyOn: [...notifyOn],\n\t\tnotifyChannels: [...notifyChannels],\n\t};\n}\n\nexport function deriveActivityState(input: {\n\tconfig: ResolvedControlConfig;\n\tstartedAt: number;\n\tlastActivityAt?: number;\n\tnow?: number;\n}): ActivityState | undefined {\n\tif (!input.config.enabled) return undefined;\n\tconst now = input.now ?? Date.now();\n\tconst lastActivity = input.lastActivityAt ?? input.startedAt;\n\tconst ageMs = Math.max(0, now - lastActivity);\n\treturn ageMs > input.config.needsAttentionAfterMs ? \"needs_attention\" : undefined;\n}\n\nexport function buildControlEvent(input: {\n\ttype?: ControlEventType;\n\tfrom?: ActivityState;\n\tto: ActivityState;\n\trunId: string;\n\tagent: string;\n\tindex?: number;\n\tts?: number;\n\tlastActivityAt?: number;\n\tmessage?: string;\n\treason?: ControlEvent[\"reason\"];\n\tturns?: number;\n\ttokens?: number;\n\ttoolCount?: number;\n\tcurrentTool?: string;\n\tcurrentToolDurationMs?: number;\n\tcurrentPath?: string;\n\telapsedMs?: number;\n\trecentFailureSummary?: string;\n}): ControlEvent {\n\tconst ts = input.ts ?? Date.now();\n\tconst type = input.type ?? (input.to === \"active_long_running\" ? \"active_long_running\" : \"needs_attention\");\n\tconst elapsedMs = input.elapsedMs ?? (input.lastActivityAt ? Math.max(0, ts - input.lastActivityAt) : undefined);\n\tconst elapsedSeconds = elapsedMs !== undefined ? Math.floor(elapsedMs / 1000) : undefined;\n\tconst message = input.message ?? (type === \"active_long_running\"\n\t\t? `${input.agent} is still active but long-running`\n\t\t: elapsedSeconds !== undefined\n\t\t\t? `${input.agent} needs attention (no observed activity for ${elapsedSeconds}s)`\n\t\t\t: `${input.agent} needs attention`);\n\treturn {\n\t\ttype,\n\t\t...(input.from ? { from: input.from } : {}),\n\t\tto: input.to,\n\t\tts,\n\t\trunId: input.runId,\n\t\tagent: input.agent,\n\t\t...(input.index !== undefined ? { index: input.index } : {}),\n\t\tmessage,\n\t\treason: input.reason ?? (type === \"active_long_running\" ? \"active_long_running\" : \"idle\"),\n\t\t...(input.turns !== undefined ? { turns: input.turns } : {}),\n\t\t...(input.tokens !== undefined ? { tokens: input.tokens } : {}),\n\t\t...(input.toolCount !== undefined ? { toolCount: input.toolCount } : {}),\n\t\t...(input.currentTool ? { currentTool: input.currentTool } : {}),\n\t\t...(input.currentToolDurationMs !== undefined ? { currentToolDurationMs: input.currentToolDurationMs } : {}),\n\t\t...(input.currentPath ? { currentPath: input.currentPath } : {}),\n\t\t...(elapsedMs !== undefined ? { elapsedMs } : {}),\n\t\t...(input.recentFailureSummary ? { recentFailureSummary: input.recentFailureSummary } : {}),\n\t};\n}\n\nexport function shouldNotifyControlEvent(config: ResolvedControlConfig, event: ControlEvent): boolean {\n\treturn config.enabled && config.notifyOn.includes(event.type);\n}\n\nexport function controlNotificationKey(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst childKey = childIntercomTarget ?? (event.index !== undefined ? `${event.runId}:${event.index}` : event.runId);\n\treturn `${childKey}:${event.type}:${event.reason ?? \"idle\"}`;\n}\n\nexport function claimControlNotification(config: ResolvedControlConfig, event: ControlEvent, seenKeys: Set<string>, childIntercomTarget?: string): boolean {\n\tif (!shouldNotifyControlEvent(config, event)) return false;\n\tconst key = controlNotificationKey(event, childIntercomTarget);\n\tif (seenKeys.has(key)) return false;\n\tseenKeys.add(key);\n\treturn true;\n}\n\nfunction formatLongRunningFacts(event: ControlEvent): string | undefined {\n\tconst facts: string[] = [];\n\tif (event.elapsedMs !== undefined) facts.push(`elapsed ${Math.floor(Math.max(0, event.elapsedMs) / 1000)}s`);\n\tif (event.turns !== undefined) facts.push(`${event.turns} turns`);\n\tif (event.tokens !== undefined) facts.push(`${event.tokens} tokens`);\n\tif (event.toolCount !== undefined) facts.push(`${event.toolCount} tools`);\n\tif (event.currentTool) facts.push(`tool ${event.currentTool}${event.currentToolDurationMs !== undefined ? ` ${Math.floor(Math.max(0, event.currentToolDurationMs) / 1000)}s` : \"\"}`);\n\tif (event.currentPath) facts.push(`path ${event.currentPath}`);\n\treturn facts.length > 0 ? facts.join(\" | \") : undefined;\n}\n\nexport function formatControlNoticeMessage(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst runTarget = event.runId;\n\tif (event.reason === \"completion_guard\") {\n\t\treturn [\n\t\t\t`Subagent failed: ${event.agent}`,\n\t\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t\t`Signal: ${event.message}`,\n\t\t\t\"Next: read the output artifact or session from the subagent result, then retry with a more explicit implementation prompt or handle the fix directly.\",\n\t\t\tchildIntercomTarget ? `Run intercom target (may be inactive): ${childIntercomTarget}` : undefined,\n\t\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n\t}\n\n\tconst nudgeMessage = \"What are you blocked on? Reply with the smallest next step or ask for a decision.\";\n\tconst nudgeCommand = `subagent({ action: \"resume\", id: \"${runTarget}\", ${event.index !== undefined ? `index: ${event.index}, ` : \"\"}message: \"${nudgeMessage}\" })`;\n\tif (event.type === \"active_long_running\") {\n\t\tconst facts = formatLongRunningFacts(event);\n\t\treturn [\n\t\t\t`Subagent active but long-running: ${event.agent}`,\n\t\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t\t`Signal: ${event.message}`,\n\t\t\tfacts ? `Facts: ${facts}` : undefined,\n\t\t\t\"Hint: Inspect status, then nudge if the work seems stuck. Live async nudges interrupt the child before sending the follow-up.\",\n\t\t\t`Nudge: ${nudgeCommand}`,\n\t\t\tchildIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,\n\t\t\t`Status: subagent({ action: \"status\", id: \"${runTarget}\" })`,\n\t\t\t`Interrupt: subagent({ action: \"interrupt\", id: \"${runTarget}\" })`,\n\t\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n\t}\n\n\treturn [\n\t\t`Subagent needs attention: ${event.agent}`,\n\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t`Signal: ${event.message}`,\n\t\tevent.recentFailureSummary ? `Recent failures: ${event.recentFailureSummary}` : undefined,\n\t\t\"Hint: Inspect status first unless the run is clearly blocked. Live async nudges interrupt the child before sending the follow-up.\",\n\t\t`Nudge: ${nudgeCommand}`,\n\t\tchildIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,\n\t\t`Status: subagent({ action: \"status\", id: \"${runTarget}\" })`,\n\t\t`Interrupt: subagent({ action: \"interrupt\", id: \"${runTarget}\" })`,\n\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n}\n\nexport function formatControlIntercomMessage(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst statusLabel = event.reason === \"completion_guard\"\n\t\t? \"subagent failed\"\n\t\t: event.type === \"active_long_running\"\n\t\t\t? \"subagent active but long-running\"\n\t\t\t: \"subagent needs attention\";\n\treturn [\n\t\tstatusLabel,\n\t\t\"\",\n\t\tevent.reason === \"completion_guard\"\n\t\t\t? `${event.agent} failed in run ${event.runId}.`\n\t\t\t: event.type === \"active_long_running\"\n\t\t\t\t? `${event.agent} is still active but long-running in run ${event.runId}.`\n\t\t\t\t: `${event.agent} needs attention in run ${event.runId}.`,\n\t\t\"\",\n\t\tformatControlNoticeMessage(event, childIntercomTarget),\n\t].join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"subagent-control.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.ts"],"names":[],"mappings":"AACA,OAAO,EACN,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EAErB,KAAK,qBAAqB,EAC1B,MAAM,uBAAuB,CAAC;AAM/B,eAAO,MAAM,sBAAsB,EAAE,qBAOpC,CAAC;AAgBF,wBAAgB,oBAAoB,CACnC,YAAY,CAAC,EAAE,aAAa,EAC5B,QAAQ,CAAC,EAAE,aAAa,GACtB,qBAAqB,CA+BvB;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE;IAC1C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,GAAG,CAAC,EAAE,MAAM,CAAC;CACb,GAAG,aAAa,GAAG,SAAS,CAM5B;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE;IACxC,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,IAAI,CAAC,EAAE,aAAa,CAAC;IACrB,EAAE,EAAE,aAAa,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC9B,GAAG,YAAY,CA6Bf;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,qBAAqB,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAEpG;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,GAAG,OAAO,CAE1F;AAED,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,YAAY,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAGhG;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,qBAAqB,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,OAAO,CAMzJ;AAaD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,YAAY,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAwCpG;AAED,wBAAgB,4BAA4B,CAAC,KAAK,EAAE,YAAY,EAAE,mBAAmB,CAAC,EAAE,MAAM,GAAG,MAAM,CAiBtG","sourcesContent":["// @ts-nocheck\nimport {\n\ttype ActivityState,\n\ttype ControlConfig,\n\ttype ControlEvent,\n\ttype ControlEventType,\n\ttype ControlNotificationChannel,\n\ttype ResolvedControlConfig,\n} from \"../../shared/types.ts\";\n\nconst CONTROL_EVENT_TYPES: ControlEventType[] = [\"active_long_running\", \"needs_attention\"];\nconst CONTROL_NOTIFICATION_CHANNELS: ControlNotificationChannel[] = [\"event\", \"async\", \"intercom\"];\nconst DEFAULT_NOTIFY_ON: ControlEventType[] = [\"active_long_running\", \"needs_attention\"];\n\nexport const DEFAULT_CONTROL_CONFIG: ResolvedControlConfig = {\n\tenabled: true,\n\tneedsAttentionAfterMs: 60_000,\n\tactiveNoticeAfterMs: 240_000,\n\tfailedToolAttemptsBeforeAttention: 3,\n\tnotifyOn: DEFAULT_NOTIFY_ON,\n\tnotifyChannels: CONTROL_NOTIFICATION_CHANNELS,\n};\n\nfunction parsePositiveInt(value: unknown): number | undefined {\n\tif (typeof value !== \"number\") return undefined;\n\tif (!Number.isFinite(value) || !Number.isInteger(value) || value < 1) return undefined;\n\treturn value;\n}\n\nfunction parseControlList<T extends string>(value: unknown, allowed: readonly T[]): T[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tif (value.length === 0) return [];\n\tconst allowedSet = new Set(allowed);\n\tconst parsed = value.filter((entry): entry is T => typeof entry === \"string\" && allowedSet.has(entry as T));\n\treturn parsed.length > 0 ? Array.from(new Set(parsed)) : undefined;\n}\n\nexport function resolveControlConfig(\n\tglobalConfig?: ControlConfig,\n\toverride?: ControlConfig,\n): ResolvedControlConfig {\n\tconst enabled = override?.enabled ?? globalConfig?.enabled ?? DEFAULT_CONTROL_CONFIG.enabled;\n\tconst needsAttentionAfterMs = parsePositiveInt(override?.needsAttentionAfterMs)\n\t\t?? parsePositiveInt(globalConfig?.needsAttentionAfterMs)\n\t\t?? DEFAULT_CONTROL_CONFIG.needsAttentionAfterMs;\n\tconst activeNoticeAfterMs = parsePositiveInt(override?.activeNoticeAfterMs)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterMs)\n\t\t?? DEFAULT_CONTROL_CONFIG.activeNoticeAfterMs;\n\tconst activeNoticeAfterTurns = parsePositiveInt(override?.activeNoticeAfterTurns)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterTurns);\n\tconst activeNoticeAfterTokens = parsePositiveInt(override?.activeNoticeAfterTokens)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterTokens);\n\tconst failedToolAttemptsBeforeAttention = parsePositiveInt(override?.failedToolAttemptsBeforeAttention)\n\t\t?? parsePositiveInt(globalConfig?.failedToolAttemptsBeforeAttention)\n\t\t?? DEFAULT_CONTROL_CONFIG.failedToolAttemptsBeforeAttention;\n\tconst notifyOn = parseControlList(override?.notifyOn, CONTROL_EVENT_TYPES)\n\t\t?? parseControlList(globalConfig?.notifyOn, CONTROL_EVENT_TYPES)\n\t\t?? DEFAULT_CONTROL_CONFIG.notifyOn;\n\tconst notifyChannels = parseControlList(override?.notifyChannels, CONTROL_NOTIFICATION_CHANNELS)\n\t\t?? parseControlList(globalConfig?.notifyChannels, CONTROL_NOTIFICATION_CHANNELS)\n\t\t?? DEFAULT_CONTROL_CONFIG.notifyChannels;\n\treturn {\n\t\tenabled,\n\t\tneedsAttentionAfterMs,\n\t\tactiveNoticeAfterMs,\n\t\tactiveNoticeAfterTurns,\n\t\tactiveNoticeAfterTokens,\n\t\tfailedToolAttemptsBeforeAttention,\n\t\tnotifyOn: [...notifyOn],\n\t\tnotifyChannels: [...notifyChannels],\n\t};\n}\n\nexport function deriveActivityState(input: {\n\tconfig: ResolvedControlConfig;\n\tstartedAt: number;\n\tlastActivityAt?: number;\n\tnow?: number;\n}): ActivityState | undefined {\n\tif (!input.config.enabled) return undefined;\n\tconst now = input.now ?? Date.now();\n\tconst lastActivity = input.lastActivityAt ?? input.startedAt;\n\tconst ageMs = Math.max(0, now - lastActivity);\n\treturn ageMs > input.config.needsAttentionAfterMs ? \"needs_attention\" : undefined;\n}\n\nexport function buildControlEvent(input: {\n\ttype?: ControlEventType;\n\tfrom?: ActivityState;\n\tto: ActivityState;\n\trunId: string;\n\tagent: string;\n\tindex?: number;\n\tts?: number;\n\tlastActivityAt?: number;\n\tmessage?: string;\n\treason?: ControlEvent[\"reason\"];\n\tturns?: number;\n\ttokens?: number;\n\ttoolCount?: number;\n\tcurrentTool?: string;\n\tcurrentToolDurationMs?: number;\n\tcurrentPath?: string;\n\telapsedMs?: number;\n\trecentFailureSummary?: string;\n}): ControlEvent {\n\tconst ts = input.ts ?? Date.now();\n\tconst type = input.type ?? (input.to === \"active_long_running\" ? \"active_long_running\" : \"needs_attention\");\n\tconst elapsedMs = input.elapsedMs ?? (input.lastActivityAt ? Math.max(0, ts - input.lastActivityAt) : undefined);\n\tconst elapsedSeconds = elapsedMs !== undefined ? Math.floor(elapsedMs / 1000) : undefined;\n\tconst message = input.message ?? (type === \"active_long_running\"\n\t\t? `${input.agent} is still active but long-running`\n\t\t: elapsedSeconds !== undefined\n\t\t\t? `${input.agent} needs attention (no observed activity for ${elapsedSeconds}s)`\n\t\t\t: `${input.agent} needs attention`);\n\treturn {\n\t\ttype,\n\t\t...(input.from ? { from: input.from } : {}),\n\t\tto: input.to,\n\t\tts,\n\t\trunId: input.runId,\n\t\tagent: input.agent,\n\t\t...(input.index !== undefined ? { index: input.index } : {}),\n\t\tmessage,\n\t\treason: input.reason ?? (type === \"active_long_running\" ? \"active_long_running\" : \"idle\"),\n\t\t...(input.turns !== undefined ? { turns: input.turns } : {}),\n\t\t...(input.tokens !== undefined ? { tokens: input.tokens } : {}),\n\t\t...(input.toolCount !== undefined ? { toolCount: input.toolCount } : {}),\n\t\t...(input.currentTool ? { currentTool: input.currentTool } : {}),\n\t\t...(input.currentToolDurationMs !== undefined ? { currentToolDurationMs: input.currentToolDurationMs } : {}),\n\t\t...(input.currentPath ? { currentPath: input.currentPath } : {}),\n\t\t...(elapsedMs !== undefined ? { elapsedMs } : {}),\n\t\t...(input.recentFailureSummary ? { recentFailureSummary: input.recentFailureSummary } : {}),\n\t};\n}\n\nexport function shouldNotifyControlEvent(config: ResolvedControlConfig, event: ControlEvent): boolean {\n\treturn config.enabled && config.notifyOn.includes(event.type);\n}\n\nexport function isDiagnosticControlEvent(event: Partial<ControlEvent> | undefined): boolean {\n\treturn event?.type === \"active_long_running\" || [\"idle\", \"active_long_running\", \"time_threshold\", \"turn_threshold\", \"token_threshold\", \"completion_guard\"].includes(event?.reason ?? \"\");\n}\n\nexport function controlNotificationKey(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst childKey = childIntercomTarget ?? (event.index !== undefined ? `${event.runId}:${event.index}` : event.runId);\n\treturn `${childKey}:${event.type}:${event.reason ?? \"idle\"}`;\n}\n\nexport function claimControlNotification(config: ResolvedControlConfig, event: ControlEvent, seenKeys: Set<string>, childIntercomTarget?: string): boolean {\n\tif (!shouldNotifyControlEvent(config, event)) return false;\n\tconst key = controlNotificationKey(event, childIntercomTarget);\n\tif (seenKeys.has(key)) return false;\n\tseenKeys.add(key);\n\treturn true;\n}\n\nfunction formatLongRunningFacts(event: ControlEvent): string | undefined {\n\tconst facts: string[] = [];\n\tif (event.elapsedMs !== undefined) facts.push(`elapsed ${Math.floor(Math.max(0, event.elapsedMs) / 1000)}s`);\n\tif (event.turns !== undefined) facts.push(`${event.turns} turns`);\n\tif (event.tokens !== undefined) facts.push(`${event.tokens} tokens`);\n\tif (event.toolCount !== undefined) facts.push(`${event.toolCount} tools`);\n\tif (event.currentTool) facts.push(`tool ${event.currentTool}${event.currentToolDurationMs !== undefined ? ` ${Math.floor(Math.max(0, event.currentToolDurationMs) / 1000)}s` : \"\"}`);\n\tif (event.currentPath) facts.push(`path ${event.currentPath}`);\n\treturn facts.length > 0 ? facts.join(\" | \") : undefined;\n}\n\nexport function formatControlNoticeMessage(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst runTarget = event.runId;\n\tif (event.reason === \"completion_guard\") {\n\t\treturn [\n\t\t\t`Subagent failed: ${event.agent}`,\n\t\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t\t`Signal: ${event.message}`,\n\t\t\t\"Next: read the output artifact or session from the subagent result, then retry with a more explicit implementation prompt or handle the fix directly.\",\n\t\t\tchildIntercomTarget ? `Run intercom target (may be inactive): ${childIntercomTarget}` : undefined,\n\t\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n\t}\n\n\tconst nudgeMessage = \"What are you blocked on? Reply with the smallest next step or ask for a decision.\";\n\tconst nudgeCommand = `subagent({ action: \"resume\", id: \"${runTarget}\", ${event.index !== undefined ? `index: ${event.index}, ` : \"\"}message: \"${nudgeMessage}\" })`;\n\tif (event.type === \"active_long_running\") {\n\t\tconst facts = formatLongRunningFacts(event);\n\t\treturn [\n\t\t\t`Subagent active but long-running: ${event.agent}`,\n\t\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t\t`Signal: ${event.message}`,\n\t\t\tfacts ? `Facts: ${facts}` : undefined,\n\t\t\t\"Hint: Inspect status, then nudge if the work seems stuck. Live async nudges interrupt the child before sending the follow-up.\",\n\t\t\t`Nudge: ${nudgeCommand}`,\n\t\t\tchildIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,\n\t\t\t`Status: subagent({ action: \"status\", id: \"${runTarget}\" })`,\n\t\t\t`Interrupt: subagent({ action: \"interrupt\", id: \"${runTarget}\" })`,\n\t\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n\t}\n\n\treturn [\n\t\t`Subagent needs attention: ${event.agent}`,\n\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t`Signal: ${event.message}`,\n\t\tevent.recentFailureSummary ? `Recent failures: ${event.recentFailureSummary}` : undefined,\n\t\t\"Hint: Inspect status first unless the run is clearly blocked. Live async nudges interrupt the child before sending the follow-up.\",\n\t\t`Nudge: ${nudgeCommand}`,\n\t\tchildIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,\n\t\t`Status: subagent({ action: \"status\", id: \"${runTarget}\" })`,\n\t\t`Interrupt: subagent({ action: \"interrupt\", id: \"${runTarget}\" })`,\n\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n}\n\nexport function formatControlIntercomMessage(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst statusLabel = event.reason === \"completion_guard\"\n\t\t? \"subagent failed\"\n\t\t: event.type === \"active_long_running\"\n\t\t\t? \"subagent active but long-running\"\n\t\t\t: \"subagent needs attention\";\n\treturn [\n\t\tstatusLabel,\n\t\t\"\",\n\t\tevent.reason === \"completion_guard\"\n\t\t\t? `${event.agent} failed in run ${event.runId}.`\n\t\t\t: event.type === \"active_long_running\"\n\t\t\t\t? `${event.agent} is still active but long-running in run ${event.runId}.`\n\t\t\t\t: `${event.agent} needs attention in run ${event.runId}.`,\n\t\t\"\",\n\t\tformatControlNoticeMessage(event, childIntercomTarget),\n\t].join(\"\\n\");\n}\n"]}
@@ -98,6 +98,9 @@ export function buildControlEvent(input) {
98
98
  export function shouldNotifyControlEvent(config, event) {
99
99
  return config.enabled && config.notifyOn.includes(event.type);
100
100
  }
101
+ export function isDiagnosticControlEvent(event) {
102
+ return event?.type === "active_long_running" || ["idle", "active_long_running", "time_threshold", "turn_threshold", "token_threshold", "completion_guard"].includes(event?.reason ?? "");
103
+ }
101
104
  export function controlNotificationKey(event, childIntercomTarget) {
102
105
  const childKey = childIntercomTarget ?? (event.index !== undefined ? `${event.runId}:${event.index}` : event.runId);
103
106
  return `${childKey}:${event.type}:${event.reason ?? "idle"}`;
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-control.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport {\n\ttype ActivityState,\n\ttype ControlConfig,\n\ttype ControlEvent,\n\ttype ControlEventType,\n\ttype ControlNotificationChannel,\n\ttype ResolvedControlConfig,\n} from \"../../shared/types.ts\";\n\nconst CONTROL_EVENT_TYPES: ControlEventType[] = [\"active_long_running\", \"needs_attention\"];\nconst CONTROL_NOTIFICATION_CHANNELS: ControlNotificationChannel[] = [\"event\", \"async\", \"intercom\"];\nconst DEFAULT_NOTIFY_ON: ControlEventType[] = [\"active_long_running\", \"needs_attention\"];\n\nexport const DEFAULT_CONTROL_CONFIG: ResolvedControlConfig = {\n\tenabled: true,\n\tneedsAttentionAfterMs: 60_000,\n\tactiveNoticeAfterMs: 240_000,\n\tfailedToolAttemptsBeforeAttention: 3,\n\tnotifyOn: DEFAULT_NOTIFY_ON,\n\tnotifyChannels: CONTROL_NOTIFICATION_CHANNELS,\n};\n\nfunction parsePositiveInt(value: unknown): number | undefined {\n\tif (typeof value !== \"number\") return undefined;\n\tif (!Number.isFinite(value) || !Number.isInteger(value) || value < 1) return undefined;\n\treturn value;\n}\n\nfunction parseControlList<T extends string>(value: unknown, allowed: readonly T[]): T[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tif (value.length === 0) return [];\n\tconst allowedSet = new Set(allowed);\n\tconst parsed = value.filter((entry): entry is T => typeof entry === \"string\" && allowedSet.has(entry as T));\n\treturn parsed.length > 0 ? Array.from(new Set(parsed)) : undefined;\n}\n\nexport function resolveControlConfig(\n\tglobalConfig?: ControlConfig,\n\toverride?: ControlConfig,\n): ResolvedControlConfig {\n\tconst enabled = override?.enabled ?? globalConfig?.enabled ?? DEFAULT_CONTROL_CONFIG.enabled;\n\tconst needsAttentionAfterMs = parsePositiveInt(override?.needsAttentionAfterMs)\n\t\t?? parsePositiveInt(globalConfig?.needsAttentionAfterMs)\n\t\t?? DEFAULT_CONTROL_CONFIG.needsAttentionAfterMs;\n\tconst activeNoticeAfterMs = parsePositiveInt(override?.activeNoticeAfterMs)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterMs)\n\t\t?? DEFAULT_CONTROL_CONFIG.activeNoticeAfterMs;\n\tconst activeNoticeAfterTurns = parsePositiveInt(override?.activeNoticeAfterTurns)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterTurns);\n\tconst activeNoticeAfterTokens = parsePositiveInt(override?.activeNoticeAfterTokens)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterTokens);\n\tconst failedToolAttemptsBeforeAttention = parsePositiveInt(override?.failedToolAttemptsBeforeAttention)\n\t\t?? parsePositiveInt(globalConfig?.failedToolAttemptsBeforeAttention)\n\t\t?? DEFAULT_CONTROL_CONFIG.failedToolAttemptsBeforeAttention;\n\tconst notifyOn = parseControlList(override?.notifyOn, CONTROL_EVENT_TYPES)\n\t\t?? parseControlList(globalConfig?.notifyOn, CONTROL_EVENT_TYPES)\n\t\t?? DEFAULT_CONTROL_CONFIG.notifyOn;\n\tconst notifyChannels = parseControlList(override?.notifyChannels, CONTROL_NOTIFICATION_CHANNELS)\n\t\t?? parseControlList(globalConfig?.notifyChannels, CONTROL_NOTIFICATION_CHANNELS)\n\t\t?? DEFAULT_CONTROL_CONFIG.notifyChannels;\n\treturn {\n\t\tenabled,\n\t\tneedsAttentionAfterMs,\n\t\tactiveNoticeAfterMs,\n\t\tactiveNoticeAfterTurns,\n\t\tactiveNoticeAfterTokens,\n\t\tfailedToolAttemptsBeforeAttention,\n\t\tnotifyOn: [...notifyOn],\n\t\tnotifyChannels: [...notifyChannels],\n\t};\n}\n\nexport function deriveActivityState(input: {\n\tconfig: ResolvedControlConfig;\n\tstartedAt: number;\n\tlastActivityAt?: number;\n\tnow?: number;\n}): ActivityState | undefined {\n\tif (!input.config.enabled) return undefined;\n\tconst now = input.now ?? Date.now();\n\tconst lastActivity = input.lastActivityAt ?? input.startedAt;\n\tconst ageMs = Math.max(0, now - lastActivity);\n\treturn ageMs > input.config.needsAttentionAfterMs ? \"needs_attention\" : undefined;\n}\n\nexport function buildControlEvent(input: {\n\ttype?: ControlEventType;\n\tfrom?: ActivityState;\n\tto: ActivityState;\n\trunId: string;\n\tagent: string;\n\tindex?: number;\n\tts?: number;\n\tlastActivityAt?: number;\n\tmessage?: string;\n\treason?: ControlEvent[\"reason\"];\n\tturns?: number;\n\ttokens?: number;\n\ttoolCount?: number;\n\tcurrentTool?: string;\n\tcurrentToolDurationMs?: number;\n\tcurrentPath?: string;\n\telapsedMs?: number;\n\trecentFailureSummary?: string;\n}): ControlEvent {\n\tconst ts = input.ts ?? Date.now();\n\tconst type = input.type ?? (input.to === \"active_long_running\" ? \"active_long_running\" : \"needs_attention\");\n\tconst elapsedMs = input.elapsedMs ?? (input.lastActivityAt ? Math.max(0, ts - input.lastActivityAt) : undefined);\n\tconst elapsedSeconds = elapsedMs !== undefined ? Math.floor(elapsedMs / 1000) : undefined;\n\tconst message = input.message ?? (type === \"active_long_running\"\n\t\t? `${input.agent} is still active but long-running`\n\t\t: elapsedSeconds !== undefined\n\t\t\t? `${input.agent} needs attention (no observed activity for ${elapsedSeconds}s)`\n\t\t\t: `${input.agent} needs attention`);\n\treturn {\n\t\ttype,\n\t\t...(input.from ? { from: input.from } : {}),\n\t\tto: input.to,\n\t\tts,\n\t\trunId: input.runId,\n\t\tagent: input.agent,\n\t\t...(input.index !== undefined ? { index: input.index } : {}),\n\t\tmessage,\n\t\treason: input.reason ?? (type === \"active_long_running\" ? \"active_long_running\" : \"idle\"),\n\t\t...(input.turns !== undefined ? { turns: input.turns } : {}),\n\t\t...(input.tokens !== undefined ? { tokens: input.tokens } : {}),\n\t\t...(input.toolCount !== undefined ? { toolCount: input.toolCount } : {}),\n\t\t...(input.currentTool ? { currentTool: input.currentTool } : {}),\n\t\t...(input.currentToolDurationMs !== undefined ? { currentToolDurationMs: input.currentToolDurationMs } : {}),\n\t\t...(input.currentPath ? { currentPath: input.currentPath } : {}),\n\t\t...(elapsedMs !== undefined ? { elapsedMs } : {}),\n\t\t...(input.recentFailureSummary ? { recentFailureSummary: input.recentFailureSummary } : {}),\n\t};\n}\n\nexport function shouldNotifyControlEvent(config: ResolvedControlConfig, event: ControlEvent): boolean {\n\treturn config.enabled && config.notifyOn.includes(event.type);\n}\n\nexport function controlNotificationKey(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst childKey = childIntercomTarget ?? (event.index !== undefined ? `${event.runId}:${event.index}` : event.runId);\n\treturn `${childKey}:${event.type}:${event.reason ?? \"idle\"}`;\n}\n\nexport function claimControlNotification(config: ResolvedControlConfig, event: ControlEvent, seenKeys: Set<string>, childIntercomTarget?: string): boolean {\n\tif (!shouldNotifyControlEvent(config, event)) return false;\n\tconst key = controlNotificationKey(event, childIntercomTarget);\n\tif (seenKeys.has(key)) return false;\n\tseenKeys.add(key);\n\treturn true;\n}\n\nfunction formatLongRunningFacts(event: ControlEvent): string | undefined {\n\tconst facts: string[] = [];\n\tif (event.elapsedMs !== undefined) facts.push(`elapsed ${Math.floor(Math.max(0, event.elapsedMs) / 1000)}s`);\n\tif (event.turns !== undefined) facts.push(`${event.turns} turns`);\n\tif (event.tokens !== undefined) facts.push(`${event.tokens} tokens`);\n\tif (event.toolCount !== undefined) facts.push(`${event.toolCount} tools`);\n\tif (event.currentTool) facts.push(`tool ${event.currentTool}${event.currentToolDurationMs !== undefined ? ` ${Math.floor(Math.max(0, event.currentToolDurationMs) / 1000)}s` : \"\"}`);\n\tif (event.currentPath) facts.push(`path ${event.currentPath}`);\n\treturn facts.length > 0 ? facts.join(\" | \") : undefined;\n}\n\nexport function formatControlNoticeMessage(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst runTarget = event.runId;\n\tif (event.reason === \"completion_guard\") {\n\t\treturn [\n\t\t\t`Subagent failed: ${event.agent}`,\n\t\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t\t`Signal: ${event.message}`,\n\t\t\t\"Next: read the output artifact or session from the subagent result, then retry with a more explicit implementation prompt or handle the fix directly.\",\n\t\t\tchildIntercomTarget ? `Run intercom target (may be inactive): ${childIntercomTarget}` : undefined,\n\t\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n\t}\n\n\tconst nudgeMessage = \"What are you blocked on? Reply with the smallest next step or ask for a decision.\";\n\tconst nudgeCommand = `subagent({ action: \"resume\", id: \"${runTarget}\", ${event.index !== undefined ? `index: ${event.index}, ` : \"\"}message: \"${nudgeMessage}\" })`;\n\tif (event.type === \"active_long_running\") {\n\t\tconst facts = formatLongRunningFacts(event);\n\t\treturn [\n\t\t\t`Subagent active but long-running: ${event.agent}`,\n\t\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t\t`Signal: ${event.message}`,\n\t\t\tfacts ? `Facts: ${facts}` : undefined,\n\t\t\t\"Hint: Inspect status, then nudge if the work seems stuck. Live async nudges interrupt the child before sending the follow-up.\",\n\t\t\t`Nudge: ${nudgeCommand}`,\n\t\t\tchildIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,\n\t\t\t`Status: subagent({ action: \"status\", id: \"${runTarget}\" })`,\n\t\t\t`Interrupt: subagent({ action: \"interrupt\", id: \"${runTarget}\" })`,\n\t\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n\t}\n\n\treturn [\n\t\t`Subagent needs attention: ${event.agent}`,\n\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t`Signal: ${event.message}`,\n\t\tevent.recentFailureSummary ? `Recent failures: ${event.recentFailureSummary}` : undefined,\n\t\t\"Hint: Inspect status first unless the run is clearly blocked. Live async nudges interrupt the child before sending the follow-up.\",\n\t\t`Nudge: ${nudgeCommand}`,\n\t\tchildIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,\n\t\t`Status: subagent({ action: \"status\", id: \"${runTarget}\" })`,\n\t\t`Interrupt: subagent({ action: \"interrupt\", id: \"${runTarget}\" })`,\n\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n}\n\nexport function formatControlIntercomMessage(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst statusLabel = event.reason === \"completion_guard\"\n\t\t? \"subagent failed\"\n\t\t: event.type === \"active_long_running\"\n\t\t\t? \"subagent active but long-running\"\n\t\t\t: \"subagent needs attention\";\n\treturn [\n\t\tstatusLabel,\n\t\t\"\",\n\t\tevent.reason === \"completion_guard\"\n\t\t\t? `${event.agent} failed in run ${event.runId}.`\n\t\t\t: event.type === \"active_long_running\"\n\t\t\t\t? `${event.agent} is still active but long-running in run ${event.runId}.`\n\t\t\t\t: `${event.agent} needs attention in run ${event.runId}.`,\n\t\t\"\",\n\t\tformatControlNoticeMessage(event, childIntercomTarget),\n\t].join(\"\\n\");\n}\n"]}
1
+ {"version":3,"file":"subagent-control.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport {\n\ttype ActivityState,\n\ttype ControlConfig,\n\ttype ControlEvent,\n\ttype ControlEventType,\n\ttype ControlNotificationChannel,\n\ttype ResolvedControlConfig,\n} from \"../../shared/types.ts\";\n\nconst CONTROL_EVENT_TYPES: ControlEventType[] = [\"active_long_running\", \"needs_attention\"];\nconst CONTROL_NOTIFICATION_CHANNELS: ControlNotificationChannel[] = [\"event\", \"async\", \"intercom\"];\nconst DEFAULT_NOTIFY_ON: ControlEventType[] = [\"active_long_running\", \"needs_attention\"];\n\nexport const DEFAULT_CONTROL_CONFIG: ResolvedControlConfig = {\n\tenabled: true,\n\tneedsAttentionAfterMs: 60_000,\n\tactiveNoticeAfterMs: 240_000,\n\tfailedToolAttemptsBeforeAttention: 3,\n\tnotifyOn: DEFAULT_NOTIFY_ON,\n\tnotifyChannels: CONTROL_NOTIFICATION_CHANNELS,\n};\n\nfunction parsePositiveInt(value: unknown): number | undefined {\n\tif (typeof value !== \"number\") return undefined;\n\tif (!Number.isFinite(value) || !Number.isInteger(value) || value < 1) return undefined;\n\treturn value;\n}\n\nfunction parseControlList<T extends string>(value: unknown, allowed: readonly T[]): T[] | undefined {\n\tif (!Array.isArray(value)) return undefined;\n\tif (value.length === 0) return [];\n\tconst allowedSet = new Set(allowed);\n\tconst parsed = value.filter((entry): entry is T => typeof entry === \"string\" && allowedSet.has(entry as T));\n\treturn parsed.length > 0 ? Array.from(new Set(parsed)) : undefined;\n}\n\nexport function resolveControlConfig(\n\tglobalConfig?: ControlConfig,\n\toverride?: ControlConfig,\n): ResolvedControlConfig {\n\tconst enabled = override?.enabled ?? globalConfig?.enabled ?? DEFAULT_CONTROL_CONFIG.enabled;\n\tconst needsAttentionAfterMs = parsePositiveInt(override?.needsAttentionAfterMs)\n\t\t?? parsePositiveInt(globalConfig?.needsAttentionAfterMs)\n\t\t?? DEFAULT_CONTROL_CONFIG.needsAttentionAfterMs;\n\tconst activeNoticeAfterMs = parsePositiveInt(override?.activeNoticeAfterMs)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterMs)\n\t\t?? DEFAULT_CONTROL_CONFIG.activeNoticeAfterMs;\n\tconst activeNoticeAfterTurns = parsePositiveInt(override?.activeNoticeAfterTurns)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterTurns);\n\tconst activeNoticeAfterTokens = parsePositiveInt(override?.activeNoticeAfterTokens)\n\t\t?? parsePositiveInt(globalConfig?.activeNoticeAfterTokens);\n\tconst failedToolAttemptsBeforeAttention = parsePositiveInt(override?.failedToolAttemptsBeforeAttention)\n\t\t?? parsePositiveInt(globalConfig?.failedToolAttemptsBeforeAttention)\n\t\t?? DEFAULT_CONTROL_CONFIG.failedToolAttemptsBeforeAttention;\n\tconst notifyOn = parseControlList(override?.notifyOn, CONTROL_EVENT_TYPES)\n\t\t?? parseControlList(globalConfig?.notifyOn, CONTROL_EVENT_TYPES)\n\t\t?? DEFAULT_CONTROL_CONFIG.notifyOn;\n\tconst notifyChannels = parseControlList(override?.notifyChannels, CONTROL_NOTIFICATION_CHANNELS)\n\t\t?? parseControlList(globalConfig?.notifyChannels, CONTROL_NOTIFICATION_CHANNELS)\n\t\t?? DEFAULT_CONTROL_CONFIG.notifyChannels;\n\treturn {\n\t\tenabled,\n\t\tneedsAttentionAfterMs,\n\t\tactiveNoticeAfterMs,\n\t\tactiveNoticeAfterTurns,\n\t\tactiveNoticeAfterTokens,\n\t\tfailedToolAttemptsBeforeAttention,\n\t\tnotifyOn: [...notifyOn],\n\t\tnotifyChannels: [...notifyChannels],\n\t};\n}\n\nexport function deriveActivityState(input: {\n\tconfig: ResolvedControlConfig;\n\tstartedAt: number;\n\tlastActivityAt?: number;\n\tnow?: number;\n}): ActivityState | undefined {\n\tif (!input.config.enabled) return undefined;\n\tconst now = input.now ?? Date.now();\n\tconst lastActivity = input.lastActivityAt ?? input.startedAt;\n\tconst ageMs = Math.max(0, now - lastActivity);\n\treturn ageMs > input.config.needsAttentionAfterMs ? \"needs_attention\" : undefined;\n}\n\nexport function buildControlEvent(input: {\n\ttype?: ControlEventType;\n\tfrom?: ActivityState;\n\tto: ActivityState;\n\trunId: string;\n\tagent: string;\n\tindex?: number;\n\tts?: number;\n\tlastActivityAt?: number;\n\tmessage?: string;\n\treason?: ControlEvent[\"reason\"];\n\tturns?: number;\n\ttokens?: number;\n\ttoolCount?: number;\n\tcurrentTool?: string;\n\tcurrentToolDurationMs?: number;\n\tcurrentPath?: string;\n\telapsedMs?: number;\n\trecentFailureSummary?: string;\n}): ControlEvent {\n\tconst ts = input.ts ?? Date.now();\n\tconst type = input.type ?? (input.to === \"active_long_running\" ? \"active_long_running\" : \"needs_attention\");\n\tconst elapsedMs = input.elapsedMs ?? (input.lastActivityAt ? Math.max(0, ts - input.lastActivityAt) : undefined);\n\tconst elapsedSeconds = elapsedMs !== undefined ? Math.floor(elapsedMs / 1000) : undefined;\n\tconst message = input.message ?? (type === \"active_long_running\"\n\t\t? `${input.agent} is still active but long-running`\n\t\t: elapsedSeconds !== undefined\n\t\t\t? `${input.agent} needs attention (no observed activity for ${elapsedSeconds}s)`\n\t\t\t: `${input.agent} needs attention`);\n\treturn {\n\t\ttype,\n\t\t...(input.from ? { from: input.from } : {}),\n\t\tto: input.to,\n\t\tts,\n\t\trunId: input.runId,\n\t\tagent: input.agent,\n\t\t...(input.index !== undefined ? { index: input.index } : {}),\n\t\tmessage,\n\t\treason: input.reason ?? (type === \"active_long_running\" ? \"active_long_running\" : \"idle\"),\n\t\t...(input.turns !== undefined ? { turns: input.turns } : {}),\n\t\t...(input.tokens !== undefined ? { tokens: input.tokens } : {}),\n\t\t...(input.toolCount !== undefined ? { toolCount: input.toolCount } : {}),\n\t\t...(input.currentTool ? { currentTool: input.currentTool } : {}),\n\t\t...(input.currentToolDurationMs !== undefined ? { currentToolDurationMs: input.currentToolDurationMs } : {}),\n\t\t...(input.currentPath ? { currentPath: input.currentPath } : {}),\n\t\t...(elapsedMs !== undefined ? { elapsedMs } : {}),\n\t\t...(input.recentFailureSummary ? { recentFailureSummary: input.recentFailureSummary } : {}),\n\t};\n}\n\nexport function shouldNotifyControlEvent(config: ResolvedControlConfig, event: ControlEvent): boolean {\n\treturn config.enabled && config.notifyOn.includes(event.type);\n}\n\nexport function isDiagnosticControlEvent(event: Partial<ControlEvent> | undefined): boolean {\n\treturn event?.type === \"active_long_running\" || [\"idle\", \"active_long_running\", \"time_threshold\", \"turn_threshold\", \"token_threshold\", \"completion_guard\"].includes(event?.reason ?? \"\");\n}\n\nexport function controlNotificationKey(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst childKey = childIntercomTarget ?? (event.index !== undefined ? `${event.runId}:${event.index}` : event.runId);\n\treturn `${childKey}:${event.type}:${event.reason ?? \"idle\"}`;\n}\n\nexport function claimControlNotification(config: ResolvedControlConfig, event: ControlEvent, seenKeys: Set<string>, childIntercomTarget?: string): boolean {\n\tif (!shouldNotifyControlEvent(config, event)) return false;\n\tconst key = controlNotificationKey(event, childIntercomTarget);\n\tif (seenKeys.has(key)) return false;\n\tseenKeys.add(key);\n\treturn true;\n}\n\nfunction formatLongRunningFacts(event: ControlEvent): string | undefined {\n\tconst facts: string[] = [];\n\tif (event.elapsedMs !== undefined) facts.push(`elapsed ${Math.floor(Math.max(0, event.elapsedMs) / 1000)}s`);\n\tif (event.turns !== undefined) facts.push(`${event.turns} turns`);\n\tif (event.tokens !== undefined) facts.push(`${event.tokens} tokens`);\n\tif (event.toolCount !== undefined) facts.push(`${event.toolCount} tools`);\n\tif (event.currentTool) facts.push(`tool ${event.currentTool}${event.currentToolDurationMs !== undefined ? ` ${Math.floor(Math.max(0, event.currentToolDurationMs) / 1000)}s` : \"\"}`);\n\tif (event.currentPath) facts.push(`path ${event.currentPath}`);\n\treturn facts.length > 0 ? facts.join(\" | \") : undefined;\n}\n\nexport function formatControlNoticeMessage(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst runTarget = event.runId;\n\tif (event.reason === \"completion_guard\") {\n\t\treturn [\n\t\t\t`Subagent failed: ${event.agent}`,\n\t\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t\t`Signal: ${event.message}`,\n\t\t\t\"Next: read the output artifact or session from the subagent result, then retry with a more explicit implementation prompt or handle the fix directly.\",\n\t\t\tchildIntercomTarget ? `Run intercom target (may be inactive): ${childIntercomTarget}` : undefined,\n\t\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n\t}\n\n\tconst nudgeMessage = \"What are you blocked on? Reply with the smallest next step or ask for a decision.\";\n\tconst nudgeCommand = `subagent({ action: \"resume\", id: \"${runTarget}\", ${event.index !== undefined ? `index: ${event.index}, ` : \"\"}message: \"${nudgeMessage}\" })`;\n\tif (event.type === \"active_long_running\") {\n\t\tconst facts = formatLongRunningFacts(event);\n\t\treturn [\n\t\t\t`Subagent active but long-running: ${event.agent}`,\n\t\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t\t`Signal: ${event.message}`,\n\t\t\tfacts ? `Facts: ${facts}` : undefined,\n\t\t\t\"Hint: Inspect status, then nudge if the work seems stuck. Live async nudges interrupt the child before sending the follow-up.\",\n\t\t\t`Nudge: ${nudgeCommand}`,\n\t\t\tchildIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,\n\t\t\t`Status: subagent({ action: \"status\", id: \"${runTarget}\" })`,\n\t\t\t`Interrupt: subagent({ action: \"interrupt\", id: \"${runTarget}\" })`,\n\t\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n\t}\n\n\treturn [\n\t\t`Subagent needs attention: ${event.agent}`,\n\t\t`Run: ${runTarget}${event.index !== undefined ? ` step ${event.index + 1}` : \"\"}`,\n\t\t`Signal: ${event.message}`,\n\t\tevent.recentFailureSummary ? `Recent failures: ${event.recentFailureSummary}` : undefined,\n\t\t\"Hint: Inspect status first unless the run is clearly blocked. Live async nudges interrupt the child before sending the follow-up.\",\n\t\t`Nudge: ${nudgeCommand}`,\n\t\tchildIntercomTarget ? `Direct intercom target: ${childIntercomTarget}` : undefined,\n\t\t`Status: subagent({ action: \"status\", id: \"${runTarget}\" })`,\n\t\t`Interrupt: subagent({ action: \"interrupt\", id: \"${runTarget}\" })`,\n\t].filter((line): line is string => Boolean(line)).join(\"\\n\");\n}\n\nexport function formatControlIntercomMessage(event: ControlEvent, childIntercomTarget?: string): string {\n\tconst statusLabel = event.reason === \"completion_guard\"\n\t\t? \"subagent failed\"\n\t\t: event.type === \"active_long_running\"\n\t\t\t? \"subagent active but long-running\"\n\t\t\t: \"subagent needs attention\";\n\treturn [\n\t\tstatusLabel,\n\t\t\"\",\n\t\tevent.reason === \"completion_guard\"\n\t\t\t? `${event.agent} failed in run ${event.runId}.`\n\t\t\t: event.type === \"active_long_running\"\n\t\t\t\t? `${event.agent} is still active but long-running in run ${event.runId}.`\n\t\t\t\t: `${event.agent} needs attention in run ${event.runId}.`,\n\t\t\"\",\n\t\tformatControlNoticeMessage(event, childIntercomTarget),\n\t].join(\"\\n\");\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"subagent-prompt-runtime.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAqH,KAAK,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAsBxL,eAAO,MAAM,kCAAkC,sCAAsC,CAAC;AAQtF,eAAO,MAAM,oCAAoC,QAMrC,CAAC;AAEb,eAAO,MAAM,kCAAkC,QAOnC,CAAC;AA6Cb,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAItE;AAUD,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,qBAAqB,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACxF,MAAM,CAaR;AA4BD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAkB9E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAQhE;AAwBD,wBAAgB,qBAAqB,CACpC,EAAE,EAAE,YAAY,EAChB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;CAAO,GACnF,IAAI,CAoHN;AAED,MAAM,CAAC,OAAO,UAAU,6BAA6B,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAiH5E","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport { isPendingQuestionForCurrentChild, markDeliveredSupervisorQuestionFromChild, registerNativeSupervisorClient } from \"../../intercom/native-supervisor-channel.ts\";\nimport { consumeSteerRequestsFromDir, steerAckPathFromDir, writeSteerAckAt, writeSteerCapabilityAt, writeSteerRequestToDir, type SteerRequest } from \"../background/control-channel.ts\";\nimport { SUBAGENT_CHILD_AGENT_ENV, SUBAGENT_CHILD_INDEX_ENV, SUBAGENT_FANOUT_CHILD_ENV, SUBAGENT_STEER_ACK_DIR_ENV, SUBAGENT_STEER_CAPABILITY_ENV, SUBAGENT_STEER_INBOX_ENV } from \"./pi-args.ts\";\nimport { STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV, validateStructuredOutputValue } from \"./structured-output.ts\";\nimport {\n\tCHILD_TOOL_DIAGNOSTIC_PATH_ENV,\n\tformatChildToolDiagnostic,\n\tREQUIRED_CHILD_TOOLS_ENV,\n\twriteChildToolDiagnostic,\n\ttype ChildToolDiagnostic,\n} from \"./tool-availability.ts\";\nimport { TOOL_BUDGET_ENV, decodeToolBudgetEnv, shouldBlockToolForBudget, toolBudgetBlockedMessage, toolBudgetSoftNudge } from \"./tool-budget.ts\";\nimport type { JsonSchemaObject, ResolvedToolBudget, SubagentState } from \"../../shared/types.ts\";\nimport { resolveCurrentSessionId } from \"../../shared/session-identity.ts\";\nimport { resolveWatchPath } from \"../../shared/utils.ts\";\nimport { registerChildWatchdog } from \"../../watchdog/register-child.ts\";\nimport { SUBAGENT_WATCHDOG_WARNING_TYPE } from \"../../watchdog/types.ts\";\nimport { resolveWaitToolConfig } from \"../background/wait-config.ts\";\nimport { registerWaitTool } from \"../background/wait-tool.ts\";\nimport { drainOutstandingWork } from \"../background/auto-drain.ts\";\n\nconst SUBAGENT_INHERIT_PROJECT_CONTEXT_ENV = \"PI_SUBAGENT_INHERIT_PROJECT_CONTEXT\";\nconst SUBAGENT_INHERIT_SKILLS_ENV = \"PI_SUBAGENT_INHERIT_SKILLS\";\nexport const SUBAGENT_INTERCOM_SESSION_NAME_ENV = \"PI_SUBAGENT_INTERCOM_SESSION_NAME\";\n\nconst STRUCTURED_OUTPUT_INSTRUCTIONS = [\n\t\"This subagent step has a strict structured output contract.\",\n\t\"Your final action must be to call the `structured_output` tool with JSON matching the provided schema.\",\n\t\"Do not rely on prose-only completion; if you do not call `structured_output`, the parent will fail this step.\",\n].join(\"\\n\");\n\nexport const CHILD_SUBAGENT_BOUNDARY_INSTRUCTIONS = [\n\t\"You are a child subagent, not the parent orchestrator.\",\n\t\"The parent session owns delegation, orchestration, review fanout, and follow-up launches.\",\n\t\"Ignore prior parent-only orchestration instructions in inherited conversation history.\",\n\t\"Do not propose or run subagents. Complete only your assigned task with the tools available to you.\",\n\t\"If you need to edit files, use the available editing tools. Do not print tool-call syntax, patches, or pseudo-tool calls as text.\",\n].join(\"\\n\");\n\nexport const CHILD_FANOUT_BOUNDARY_INSTRUCTIONS = [\n\t\"You are a child subagent with explicit fanout responsibility for this assigned task.\",\n\t\"The parent session owns final orchestration, acceptance, and follow-up implementation launches.\",\n\t\"You may use the `subagent` tool only for the fanout work explicitly requested in this task.\",\n\t\"Do not broaden yourself into general parent orchestration. Do not launch follow-up workers unless the task explicitly asks for that.\",\n\t\"The maxSubagentDepth cap still applies and may block further fanout.\",\n\t\"If you need to edit files, use the available editing tools. Do not print tool-call syntax, patches, or pseudo-tool calls as text.\",\n].join(\"\\n\");\n\nconst PARENT_ONLY_CUSTOM_MESSAGE_TYPES = new Set([\n\t\"subagent-orchestration-instructions\",\n\t\"subagent-slash-result\",\n\t\"subagent-slash-text-result\",\n\t\"subagent-notify\",\n\t\"subagent_control_notice\",\n\t\"subagent-control\",\n\t\"subagent-control-notice\",\n]);\nconst SUBAGENT_ORCHESTRATION_SKILL_NAME_PATTERN = /<name>\\s*pi-subagents\\s*<\\/name>/;\nconst PROJECT_CONTEXT_HEADER = \"\\n\\n# Project Context\\n\\nProject-specific instructions and guidelines:\\n\\n\";\nconst SKILLS_HEADER = \"\\n\\nThe following skills provide specialized instructions for specific tasks.\";\nconst DATE_HEADER = \"\\nCurrent date:\";\n\nfunction readBooleanEnv(name: string): boolean | undefined {\n\tconst value = process.env[name];\n\tif (value === undefined) return undefined;\n\treturn value !== \"0\";\n}\n\nfunction refreshChildToolDiagnostic(pi: ExtensionAPI): ChildToolDiagnostic | undefined {\n\tconst filePath = process.env[CHILD_TOOL_DIAGNOSTIC_PATH_ENV]?.trim();\n\tconst encoded = process.env[REQUIRED_CHILD_TOOLS_ENV]?.trim();\n\tif (!filePath || !encoded) return undefined;\n\tconst required = JSON.parse(encoded) as unknown;\n\tif (!Array.isArray(required) || required.some((name) => typeof name !== \"string\" || !name)) {\n\t\tthrow new Error(`Invalid ${REQUIRED_CHILD_TOOLS_ENV} payload.`);\n\t}\n\tconst available = pi.getAllTools().map((tool) => tool.name);\n\treturn writeChildToolDiagnostic(filePath, required, available, process.env[SUBAGENT_CHILD_AGENT_ENV]?.trim());\n}\n\nfunction findSectionEnd(prompt: string, startIndex: number, nextHeaders: string[]): number {\n\tlet endIndex = prompt.length;\n\tfor (const header of nextHeaders) {\n\t\tconst index = prompt.indexOf(header, startIndex);\n\t\tif (index !== -1 && index < endIndex) {\n\t\t\tendIndex = index;\n\t\t}\n\t}\n\treturn endIndex;\n}\n\nexport function stripProjectContext(prompt: string): string {\n\tconst startIndex = prompt.indexOf(PROJECT_CONTEXT_HEADER);\n\tif (startIndex === -1) return prompt;\n\tconst endIndex = findSectionEnd(prompt, startIndex + PROJECT_CONTEXT_HEADER.length, [SKILLS_HEADER, DATE_HEADER]);\n\treturn `${prompt.slice(0, startIndex)}${prompt.slice(endIndex)}`;\n}\n\nexport function stripInheritedSkills(prompt: string): string {\n\tconst startIndex = prompt.indexOf(SKILLS_HEADER);\n\tif (startIndex === -1) return prompt;\n\tconst endIndex = findSectionEnd(prompt, startIndex + SKILLS_HEADER.length, [DATE_HEADER]);\n\treturn `${prompt.slice(0, startIndex)}${prompt.slice(endIndex)}`;\n}\n\nexport function stripSubagentOrchestrationSkill(prompt: string): string {\n\treturn prompt\n\t\t.replace(/\\n{0,2}<skill\\s+name=[\"']pi-subagents[\"'][^>]*>[\\s\\S]*?<\\/skill>\\n{0,2}/g, \"\\n\\n\")\n\t\t.replace(/[ \\t]*<skill>\\s*[\\s\\S]*?<\\/skill>\\s*/g, (block) => SUBAGENT_ORCHESTRATION_SKILL_NAME_PATTERN.test(block) ? \"\" : block);\n}\n\nfunction stripChildBoundaryInstructions(prompt: string): string {\n\tlet rewritten = prompt;\n\tfor (const boundary of [CHILD_SUBAGENT_BOUNDARY_INSTRUCTIONS, CHILD_FANOUT_BOUNDARY_INSTRUCTIONS]) {\n\t\trewritten = rewritten.split(boundary).join(\"\");\n\t}\n\treturn rewritten.replace(/^(?:[ \\t]*\\r?\\n)+/, \"\");\n}\n\nexport function rewriteSubagentPrompt(\n\tprompt: string,\n\toptions: { inheritProjectContext: boolean; inheritSkills: boolean; fanoutChild?: boolean },\n): string {\n\tlet rewritten = prompt;\n\tif (!options.inheritProjectContext) {\n\t\trewritten = stripProjectContext(rewritten);\n\t}\n\tif (!options.inheritSkills) {\n\t\trewritten = stripInheritedSkills(rewritten);\n\t}\n\trewritten = stripSubagentOrchestrationSkill(rewritten);\n\trewritten = stripChildBoundaryInstructions(rewritten);\n\tconst boundary = options.fanoutChild ? CHILD_FANOUT_BOUNDARY_INSTRUCTIONS : CHILD_SUBAGENT_BOUNDARY_INSTRUCTIONS;\n\tconst structured = process.env[STRUCTURED_OUTPUT_CAPTURE_ENV] ? `\\n\\n${STRUCTURED_OUTPUT_INSTRUCTIONS}` : \"\";\n\treturn `${boundary}${structured}\\n\\n${rewritten}`;\n}\n\nfunction isParentOnlySubagentMessage(message: unknown): boolean {\n\tconst m = message as { role?: string; customType?: string };\n\tif (m?.role !== \"custom\" || typeof m.customType !== \"string\") return false;\n\tif (m.customType === SUBAGENT_WATCHDOG_WARNING_TYPE) return true;\n\treturn PARENT_ONLY_CUSTOM_MESSAGE_TYPES.has(m.customType);\n}\n\nfunction isSubagentToolResultMessage(message: unknown): boolean {\n\tconst m = message as { role?: string; toolName?: string };\n\treturn m?.role === \"toolResult\" && m.toolName === \"subagent\";\n}\n\nfunction isSubagentToolCallBlock(block: unknown): boolean {\n\tconst b = block as { type?: string; name?: string };\n\treturn b?.type === \"toolCall\" && b.name === \"subagent\";\n}\n\nfunction stripAssistantSubagentToolCallBlocks(message: unknown): unknown | undefined {\n\tconst m = message as { role?: string; content?: unknown };\n\tif (m?.role !== \"assistant\" || !Array.isArray(m.content)) return message;\n\tconst filteredContent = m.content.filter((block) => !isSubagentToolCallBlock(block));\n\tif (filteredContent.length === m.content.length) return message;\n\tif (filteredContent.length === 0) return undefined;\n\treturn { ...m, content: filteredContent };\n}\n\nexport function stripParentOnlySubagentMessages(messages: unknown[]): unknown[] {\n\tconst preserveCurrentFanoutToolHistory = process.env[SUBAGENT_FANOUT_CHILD_ENV] === \"1\";\n\tlet changed = false;\n\tconst filtered: unknown[] = [];\n\tfor (const message of messages) {\n\t\tif (isParentOnlySubagentMessage(message) || (!preserveCurrentFanoutToolHistory && isSubagentToolResultMessage(message))) {\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\t\tconst stripped = preserveCurrentFanoutToolHistory ? message : stripAssistantSubagentToolCallBlocks(message);\n\t\tif (stripped === undefined) {\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (stripped !== message) changed = true;\n\t\tfiltered.push(stripped);\n\t}\n\treturn changed ? filtered : messages;\n}\n\nexport function formatSteerMessage(request: SteerRequest): string {\n\treturn [\n\t\t\"Mid-run steering from the parent orchestrator:\",\n\t\t\"\",\n\t\trequest.message,\n\t\t\"\",\n\t\t\"Incorporate this guidance at the next safe point. Do not restart the task unless the guidance explicitly asks you to.\",\n\t].join(\"\\n\");\n}\n\nfunction registerToolBudget(pi: ExtensionAPI, budget: ResolvedToolBudget | undefined): void {\n\tif (!budget) return;\n\tlet toolCount = 0;\n\tlet softNudged = false;\n\tconst sendUserMessage = (pi as { sendUserMessage?: (content: string, options: { deliverAs: \"steer\" }) => unknown }).sendUserMessage;\n\tconst onRuntimeEvent = pi.on as unknown as (event: string, handler: (event: { toolName?: string }) => unknown) => void;\n\tonRuntimeEvent(\"tool_call\", (event) => {\n\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : \"tool\";\n\t\ttoolCount++;\n\t\tif (budget.soft !== undefined && toolCount >= budget.soft && !softNudged) {\n\t\t\tsoftNudged = true;\n\t\t\ttry {\n\t\t\t\tsendUserMessage?.(toolBudgetSoftNudge(budget, toolCount), { deliverAs: \"steer\" });\n\t\t\t} catch {\n\t\t\t\t// Budget nudges are advisory; blocking below remains authoritative.\n\t\t\t}\n\t\t}\n\t\tif (!shouldBlockToolForBudget(budget, toolName, toolCount)) return undefined;\n\t\treturn { block: true, reason: toolBudgetBlockedMessage(budget, toolName, toolCount) };\n\t});\n}\n\nexport function registerSteeringInbox(\n\tpi: ExtensionAPI,\n\tdeps: { watch?: typeof fs.watch; nativeRealpath?: (filePath: string) => string } = {},\n): void {\n\tconst steerInbox = process.env[SUBAGENT_STEER_INBOX_ENV]?.trim();\n\tif (!steerInbox) return;\n\tconst capabilityPath = process.env[SUBAGENT_STEER_CAPABILITY_ENV]?.trim();\n\tconst ackDir = process.env[SUBAGENT_STEER_ACK_DIR_ENV]?.trim();\n\tconst sendUserMessage = (pi as { sendUserMessage?: (content: string, options: { deliverAs: \"steer\" }) => unknown }).sendUserMessage;\n\tconst childIndex = Number(process.env[SUBAGENT_CHILD_INDEX_ENV]);\n\tconst pending = new Map<string, string[]>();\n\tlet disposed = false;\n\tlet flushing = false;\n\tlet started = false;\n\tlet canSteer = typeof sendUserMessage === \"function\";\n\tlet watcher: fs.FSWatcher | undefined;\n\tlet interval: NodeJS.Timeout | undefined;\n\tconst acknowledge = (request: SteerRequest, state: \"delivered\" | \"failed\", message: string): void => {\n\t\tif (!ackDir || !Number.isInteger(childIndex) || childIndex < 0) return;\n\t\twriteSteerAckAt(steerAckPathFromDir(ackDir, request.id), {\n\t\t\trequestId: request.id,\n\t\t\tindex: childIndex,\n\t\t\tts: Date.now(),\n\t\t\tstate,\n\t\t\tmessage,\n\t\t});\n\t};\n\tlet readyAt = Number(process.env.PI_SUBAGENT_STEER_READY_AT);\n\tif (!Number.isFinite(readyAt) || readyAt <= 0) {\n\t\treadyAt = Date.now();\n\t\tprocess.env.PI_SUBAGENT_STEER_READY_AT = String(readyAt);\n\t}\n\tconst publishCapability = (): void => {\n\t\tif (!capabilityPath || !Number.isInteger(childIndex) || childIndex < 0) return;\n\t\twriteSteerCapabilityAt(capabilityPath, { index: childIndex, pid: process.pid, readyAt, supported: canSteer });\n\t};\n\tconst flush = (): void => {\n\t\tif (disposed || flushing) return;\n\t\tflushing = true;\n\t\ttry {\n\t\t\tconst requests = consumeSteerRequestsFromDir(steerInbox);\n\t\t\tfor (let index = 0; index < requests.length; index++) {\n\t\t\t\tconst request = requests[index]!;\n\t\t\t\tif (!canSteer || typeof sendUserMessage !== \"function\") {\n\t\t\t\t\tacknowledge(request, \"failed\", \"Child Pi session does not support sendUserMessage steering.\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (request.source === \"supervisor-question\" && !isPendingQuestionForCurrentChild(request.id)) {\n\t\t\t\t\tacknowledge(request, \"failed\", \"Question is no longer pending for this child.\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst formatted = request.source === \"supervisor-question\" ? request.message : formatSteerMessage(request);\n\t\t\t\tconst ids = pending.get(formatted) ?? [];\n\t\t\t\tids.push(request.id);\n\t\t\t\tpending.set(formatted, ids);\n\t\t\t\ttry {\n\t\t\t\t\tsendUserMessage(formatted, { deliverAs: \"steer\" });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tids.pop();\n\t\t\t\t\tif (ids.length === 0) pending.delete(formatted);\n\t\t\t\t\tacknowledge(request, \"failed\", error instanceof Error ? error.message : String(error));\n\t\t\t\t\tfor (const retry of requests.slice(index + 1)) writeSteerRequestToDir(steerInbox, retry);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tflushing = false;\n\t\t}\n\t};\n\tconst onInput = (event: unknown): undefined => {\n\t\tif (disposed || !event || typeof event !== \"object\") return undefined;\n\t\tconst input = event as { source?: unknown; streamingBehavior?: unknown; text?: unknown; content?: unknown };\n\t\tif (input.source !== \"extension\" || input.streamingBehavior !== \"steer\") return undefined;\n\t\tconst text = typeof input.text === \"string\" ? input.text : typeof input.content === \"string\" ? input.content : undefined;\n\t\tif (!text) return undefined;\n\t\tconst ids = pending.get(text);\n\t\tconst requestId = ids?.shift();\n\t\tif (!requestId) return undefined;\n\t\tif (ids?.length === 0) pending.delete(text);\n\t\tacknowledge({ type: \"steer\", id: requestId, ts: Date.now(), message: text }, \"delivered\", \"Pi accepted the correlated steering input.\");\n\t\tmarkDeliveredSupervisorQuestionFromChild(text);\n\t\treturn undefined;\n\t};\n\tconst start = (): void => {\n\t\tif (started || disposed) return;\n\t\ttry {\n\t\t\tfs.mkdirSync(steerInbox, { recursive: true });\n\t\t\tpublishCapability();\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tstarted = true;\n\t\ttry {\n\t\t\twatcher = (deps.watch ?? fs.watch)(resolveWatchPath(steerInbox, deps.nativeRealpath), () => flush());\n\t\t\twatcher.on(\"error\", () => {});\n\t\t} catch {\n\t\t\twatcher = undefined;\n\t\t}\n\t\tinterval = setInterval(flush, 250);\n\t\tinterval.unref?.();\n\t};\n\tconst activate = (): undefined => {\n\t\tstart();\n\t\tflush();\n\t\treturn undefined;\n\t};\n\n\tconst onRuntimeEvent = pi.on as unknown as (event: string, handler: (event: unknown) => unknown) => void;\n\t// Register input before the watcher so an accepted extension input cannot race request dispatch.\n\tonRuntimeEvent(\"input\", onInput);\n\tonRuntimeEvent(\"session_start\", () => start());\n\tfor (const eventName of [\"message_start\", \"message_update\", \"message_end\", \"tool_execution_start\", \"tool_execution_end\", \"turn_end\"] as const) {\n\t\tonRuntimeEvent(eventName, activate);\n\t}\n\tonRuntimeEvent(\"session_shutdown\", () => {\n\t\tdisposed = true;\n\t\ttry { watcher?.close(); } catch {}\n\t\tif (interval) clearInterval(interval);\n\t});\n}\n\nexport default function registerSubagentPromptRuntime(pi: ExtensionAPI): void {\n\tregisterSteeringInbox(pi);\n\tregisterToolBudget(pi, decodeToolBudgetEnv(process.env[TOOL_BUDGET_ENV]));\n\tregisterChildWatchdog(pi);\n\tconst waitToolEnabled = resolveWaitToolConfig().enabled;\n\tconst waitState = {\n\t\tbaseCwd: \"\",\n\t\tcurrentSessionId: null,\n\t\tasyncJobs: new Map(),\n\t\tforegroundControls: new Map(),\n\t\tlastForegroundControlId: null,\n\t\tcleanupTimers: new Map(),\n\t\tlastUiContext: null,\n\t\tpoller: null,\n\t\tcompletionSeen: new Map(),\n\t\twatcher: null,\n\t\twatcherRestartTimer: null,\n\t\tresultFileCoalescer: { schedule: () => false, clear: () => {} },\n\t} as unknown as SubagentState;\n\tif (typeof pi.registerTool === \"function\") registerWaitTool(pi, waitState, waitToolEnabled);\n\tlet nativeSupervisorClientRegistered = false;\n\tlet nativeSupervisorFallbackRegistered = false;\n\tconst registerNativeSupervisorClientOnce = (): void => {\n\t\tif (nativeSupervisorClientRegistered) return;\n\t\tnativeSupervisorClientRegistered = true;\n\t\tregisterNativeSupervisorClient(pi, { includeIntercomFallback: false });\n\t};\n\tconst registerNativeSupervisorFallbackOnce = (): void => {\n\t\tregisterNativeSupervisorClientOnce();\n\t\tif (nativeSupervisorFallbackRegistered) return;\n\t\tnativeSupervisorFallbackRegistered = true;\n\t\tregisterNativeSupervisorClient(pi);\n\t};\n\tconst onRuntimeEvent = pi.on as unknown as (event: string, handler: (event: unknown) => unknown) => void;\n\tonRuntimeEvent(\"session_start\", (_event: unknown, ctx: unknown) => {\n\t\tconst sessionManager = (ctx as { sessionManager?: Parameters<typeof resolveCurrentSessionId>[0] } | undefined)?.sessionManager;\n\t\twaitState.currentSessionId = sessionManager ? resolveCurrentSessionId(sessionManager) : null;\n\t\tregisterNativeSupervisorClientOnce();\n\t\trefreshChildToolDiagnostic(pi);\n\t});\n\tonRuntimeEvent(\"agent_end\", async (_event: unknown, ctx: unknown) => {\n\t\tif ((ctx as { hasUI?: boolean } | undefined)?.hasUI === true) return;\n\t\tawait drainOutstandingWork({ state: waitState, events: pi.events });\n\t});\n\tconst structuredOutputPath = process.env[STRUCTURED_OUTPUT_CAPTURE_ENV];\n\tconst structuredSchemaPath = process.env[STRUCTURED_OUTPUT_SCHEMA_ENV];\n\tif (structuredOutputPath && structuredSchemaPath) {\n\t\tconst schema = JSON.parse(fs.readFileSync(structuredSchemaPath, \"utf-8\")) as JsonSchemaObject;\n\t\tconst parameters = {\n\t\t\ttype: \"object\",\n\t\t\tproperties: { value: schema },\n\t\t\trequired: [\"value\"],\n\t\t\tadditionalProperties: false,\n\t\t};\n\t\tconst registerTool = pi.registerTool as unknown as (tool: {\n\t\t\tname: string;\n\t\t\tlabel: string;\n\t\t\tdescription: string;\n\t\t\tparameters: unknown;\n\t\t\texecute: (_id: string, params: { value: unknown }) => Promise<unknown>;\n\t\t}) => void;\n\t\tregisterTool({\n\t\t\tname: \"structured_output\",\n\t\t\tlabel: \"Structured Output\",\n\t\t\tdescription: \"Submit the required final structured output for this subagent step. This terminates the step.\",\n\t\t\tparameters: parameters as never,\n\t\t\tasync execute(_id: string, params: { value: unknown }) {\n\t\t\t\tconst validation = validateStructuredOutputValue(schema, params.value);\n\t\t\t\tif (validation.status === \"invalid\") {\n\t\t\t\t\tthrow new Error(`Structured output validation failed: ${validation.message}`);\n\t\t\t\t}\n\t\t\t\tfs.mkdirSync(path.dirname(structuredOutputPath), { recursive: true });\n\t\t\t\tfs.writeFileSync(structuredOutputPath, JSON.stringify(params.value), { mode: 0o600 });\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Structured output captured.\" }],\n\t\t\t\t\tdetails: { path: structuredOutputPath },\n\t\t\t\t\tterminate: true,\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\t}\n\n\tonRuntimeEvent(\"context\", (event: { messages: unknown[] }) => {\n\t\tconst messages = stripParentOnlySubagentMessages(event.messages);\n\t\tif (messages === event.messages) return undefined;\n\t\treturn { messages };\n\t});\n\n\tonRuntimeEvent(\"before_agent_start\", async (event: { systemPrompt: string }) => {\n\t\tregisterNativeSupervisorFallbackOnce();\n\t\tconst toolDiagnostic = refreshChildToolDiagnostic(pi);\n\t\tconst intercomSessionName = process.env[SUBAGENT_INTERCOM_SESSION_NAME_ENV]?.trim();\n\t\tif (intercomSessionName && typeof pi.setSessionName === \"function\") {\n\t\t\tpi.setSessionName(intercomSessionName);\n\t\t}\n\n\t\tconst inheritProjectContext = readBooleanEnv(SUBAGENT_INHERIT_PROJECT_CONTEXT_ENV);\n\t\tconst inheritSkills = readBooleanEnv(SUBAGENT_INHERIT_SKILLS_ENV);\n\t\tconst fanoutChild = readBooleanEnv(SUBAGENT_FANOUT_CHILD_ENV);\n\t\tlet rewritten = event.systemPrompt;\n\t\tif (inheritProjectContext !== undefined || inheritSkills !== undefined || fanoutChild !== undefined) {\n\t\t\trewritten = rewriteSubagentPrompt(event.systemPrompt, {\n\t\t\t\tinheritProjectContext: inheritProjectContext ?? true,\n\t\t\t\tinheritSkills: inheritSkills ?? true,\n\t\t\t\tfanoutChild: fanoutChild === true,\n\t\t\t});\n\t\t}\n\t\tif (toolDiagnostic) {\n\t\t\trewritten = `${formatChildToolDiagnostic(toolDiagnostic)}\\nDo not claim tool-dependent work succeeded; report this configuration error to the parent.\\n\\n${rewritten}`;\n\t\t}\n\t\tif (rewritten === event.systemPrompt) return;\n\t\treturn { systemPrompt: rewritten };\n\t});\n}\n"]}
1
+ {"version":3,"file":"subagent-prompt-runtime.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAE9B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAEpE,OAAO,EAAqH,KAAK,YAAY,EAAE,MAAM,kCAAkC,CAAC;AAsBxL,eAAO,MAAM,kCAAkC,sCAAsC,CAAC;AAQtF,eAAO,MAAM,oCAAoC,QAMrC,CAAC;AAEb,eAAO,MAAM,kCAAkC,QAOnC,CAAC;AA6Cb,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK1D;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK3D;AAED,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAItE;AAUD,wBAAgB,qBAAqB,CACpC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE;IAAE,qBAAqB,EAAE,OAAO,CAAC;IAAC,aAAa,EAAE,OAAO,CAAC;IAAC,WAAW,CAAC,EAAE,OAAO,CAAA;CAAE,GACxF,MAAM,CAaR;AA4BD,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,EAAE,CAkB9E;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAQhE;AAwBD,wBAAgB,qBAAqB,CACpC,EAAE,EAAE,YAAY,EAChB,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,EAAE,CAAC,KAAK,CAAC;IAAC,cAAc,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,MAAM,CAAA;CAAO,GACnF,IAAI,CAoHN;AAED,MAAM,CAAC,OAAO,UAAU,6BAA6B,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAiH5E","sourcesContent":["// @ts-nocheck\nimport * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport type { ExtensionAPI } from \"@ashx-j/lunr\";\nimport { isPendingQuestionForCurrentChild, markDeliveredSupervisorQuestionFromChild, registerNativeSupervisorClient } from \"../../intercom/native-supervisor-channel.ts\";\nimport { consumeSteerRequestsFromDir, steerAckPathFromDir, writeSteerAckAt, writeSteerCapabilityAt, writeSteerRequestToDir, type SteerRequest } from \"../background/control-channel.ts\";\nimport { SUBAGENT_CHILD_AGENT_ENV, SUBAGENT_CHILD_INDEX_ENV, SUBAGENT_FANOUT_CHILD_ENV, SUBAGENT_STEER_ACK_DIR_ENV, SUBAGENT_STEER_CAPABILITY_ENV, SUBAGENT_STEER_INBOX_ENV } from \"./pi-args.ts\";\nimport { STRUCTURED_OUTPUT_CAPTURE_ENV, STRUCTURED_OUTPUT_SCHEMA_ENV, validateStructuredOutputValue } from \"./structured-output.ts\";\nimport {\n\tCHILD_TOOL_DIAGNOSTIC_PATH_ENV,\n\tformatChildToolDiagnostic,\n\tREQUIRED_CHILD_TOOLS_ENV,\n\twriteChildToolDiagnostic,\n\ttype ChildToolDiagnostic,\n} from \"./tool-availability.ts\";\nimport { TOOL_BUDGET_ENV, decodeToolBudgetEnv, shouldBlockToolForBudget, toolBudgetBlockedMessage, toolBudgetSoftNudge } from \"./tool-budget.ts\";\nimport type { JsonSchemaObject, ResolvedToolBudget, SubagentState } from \"../../shared/types.ts\";\nimport { resolveCurrentSessionId } from \"../../shared/session-identity.ts\";\nimport { resolveWatchPath } from \"../../shared/utils.ts\";\nimport { registerChildWatchdog } from \"../../watchdog/register-child.ts\";\nimport { SUBAGENT_WATCHDOG_WARNING_TYPE } from \"../../watchdog/types.ts\";\nimport { resolveWaitToolConfig } from \"../background/wait-config.ts\";\nimport { registerWaitTool } from \"../background/wait-tool.ts\";\nimport { drainOutstandingWork } from \"../background/auto-drain.ts\";\n\nconst SUBAGENT_INHERIT_PROJECT_CONTEXT_ENV = \"PI_SUBAGENT_INHERIT_PROJECT_CONTEXT\";\nconst SUBAGENT_INHERIT_SKILLS_ENV = \"PI_SUBAGENT_INHERIT_SKILLS\";\nexport const SUBAGENT_INTERCOM_SESSION_NAME_ENV = \"PI_SUBAGENT_INTERCOM_SESSION_NAME\";\n\nconst STRUCTURED_OUTPUT_INSTRUCTIONS = [\n\t\"This subagent step has a strict structured output contract.\",\n\t\"Your final action must be to call the `structured_output` tool with JSON matching the provided schema.\",\n\t\"Do not rely on prose-only completion; if you do not call `structured_output`, the parent will fail this step.\",\n].join(\"\\n\");\n\nexport const CHILD_SUBAGENT_BOUNDARY_INSTRUCTIONS = [\n\t\"You are a child subagent, not the parent orchestrator.\",\n\t\"The parent session owns delegation, orchestration, review fanout, and follow-up launches.\",\n\t\"Ignore prior parent-only orchestration instructions in inherited conversation history.\",\n\t\"Do not propose or run subagents. Complete only your assigned task with the tools available to you.\",\n\t\"If you need to edit files, use the available editing tools. Do not print tool-call syntax, patches, or pseudo-tool calls as text.\",\n].join(\"\\n\");\n\nexport const CHILD_FANOUT_BOUNDARY_INSTRUCTIONS = [\n\t\"You are a child subagent with explicit fanout responsibility for this assigned task.\",\n\t\"The parent session owns final orchestration, acceptance, and follow-up implementation launches.\",\n\t\"You may use the `subagent` tool only for the fanout work explicitly requested in this task.\",\n\t\"Do not broaden yourself into general parent orchestration. Do not launch follow-up workers unless the task explicitly asks for that.\",\n\t\"The maxSubagentDepth cap still applies and may block further fanout.\",\n\t\"If you need to edit files, use the available editing tools. Do not print tool-call syntax, patches, or pseudo-tool calls as text.\",\n].join(\"\\n\");\n\nconst PARENT_ONLY_CUSTOM_MESSAGE_TYPES = new Set([\n\t\"subagent-orchestration-instructions\",\n\t\"subagent-slash-result\",\n\t\"subagent-slash-text-result\",\n\t\"subagent-notify\",\n\t\"subagent_control_notice\",\n\t\"subagent-control\",\n\t\"subagent-control-notice\",\n]);\nconst SUBAGENT_ORCHESTRATION_SKILL_NAME_PATTERN = /<name>\\s*pi-subagents\\s*<\\/name>/;\nconst PROJECT_CONTEXT_HEADER = \"\\n\\n# Project Context\\n\\nProject-specific instructions and guidelines:\\n\\n\";\nconst SKILLS_HEADER = \"\\n\\nThe following skills provide specialized instructions for specific tasks.\";\nconst DATE_HEADER = \"\\nCurrent date:\";\n\nfunction readBooleanEnv(name: string): boolean | undefined {\n\tconst value = process.env[name];\n\tif (value === undefined) return undefined;\n\treturn value !== \"0\";\n}\n\nfunction refreshChildToolDiagnostic(pi: ExtensionAPI): ChildToolDiagnostic | undefined {\n\tconst filePath = process.env[CHILD_TOOL_DIAGNOSTIC_PATH_ENV]?.trim();\n\tconst encoded = process.env[REQUIRED_CHILD_TOOLS_ENV]?.trim();\n\tif (!filePath || !encoded) return undefined;\n\tconst required = JSON.parse(encoded) as unknown;\n\tif (!Array.isArray(required) || required.some((name) => typeof name !== \"string\" || !name)) {\n\t\tthrow new Error(`Invalid ${REQUIRED_CHILD_TOOLS_ENV} payload.`);\n\t}\n\tconst available = pi.getAllTools().map((tool) => tool.name);\n\treturn writeChildToolDiagnostic(filePath, required, available, process.env[SUBAGENT_CHILD_AGENT_ENV]?.trim());\n}\n\nfunction findSectionEnd(prompt: string, startIndex: number, nextHeaders: string[]): number {\n\tlet endIndex = prompt.length;\n\tfor (const header of nextHeaders) {\n\t\tconst index = prompt.indexOf(header, startIndex);\n\t\tif (index !== -1 && index < endIndex) {\n\t\t\tendIndex = index;\n\t\t}\n\t}\n\treturn endIndex;\n}\n\nexport function stripProjectContext(prompt: string): string {\n\tconst startIndex = prompt.indexOf(PROJECT_CONTEXT_HEADER);\n\tif (startIndex === -1) return prompt;\n\tconst endIndex = findSectionEnd(prompt, startIndex + PROJECT_CONTEXT_HEADER.length, [SKILLS_HEADER, DATE_HEADER]);\n\treturn `${prompt.slice(0, startIndex)}${prompt.slice(endIndex)}`;\n}\n\nexport function stripInheritedSkills(prompt: string): string {\n\tconst startIndex = prompt.indexOf(SKILLS_HEADER);\n\tif (startIndex === -1) return prompt;\n\tconst endIndex = findSectionEnd(prompt, startIndex + SKILLS_HEADER.length, [DATE_HEADER]);\n\treturn `${prompt.slice(0, startIndex)}${prompt.slice(endIndex)}`;\n}\n\nexport function stripSubagentOrchestrationSkill(prompt: string): string {\n\treturn prompt\n\t\t.replace(/\\n{0,2}<skill\\s+name=[\"']pi-subagents[\"'][^>]*>[\\s\\S]*?<\\/skill>\\n{0,2}/g, \"\\n\\n\")\n\t\t.replace(/[ \\t]*<skill>\\s*[\\s\\S]*?<\\/skill>\\s*/g, (block) => SUBAGENT_ORCHESTRATION_SKILL_NAME_PATTERN.test(block) ? \"\" : block);\n}\n\nfunction stripChildBoundaryInstructions(prompt: string): string {\n\tlet rewritten = prompt;\n\tfor (const boundary of [CHILD_SUBAGENT_BOUNDARY_INSTRUCTIONS, CHILD_FANOUT_BOUNDARY_INSTRUCTIONS]) {\n\t\trewritten = rewritten.split(boundary).join(\"\");\n\t}\n\treturn rewritten.replace(/^(?:[ \\t]*\\r?\\n)+/, \"\");\n}\n\nexport function rewriteSubagentPrompt(\n\tprompt: string,\n\toptions: { inheritProjectContext: boolean; inheritSkills: boolean; fanoutChild?: boolean },\n): string {\n\tlet rewritten = prompt;\n\tif (!options.inheritProjectContext) {\n\t\trewritten = stripProjectContext(rewritten);\n\t}\n\tif (!options.inheritSkills) {\n\t\trewritten = stripInheritedSkills(rewritten);\n\t}\n\trewritten = stripSubagentOrchestrationSkill(rewritten);\n\trewritten = stripChildBoundaryInstructions(rewritten);\n\tconst boundary = options.fanoutChild ? CHILD_FANOUT_BOUNDARY_INSTRUCTIONS : CHILD_SUBAGENT_BOUNDARY_INSTRUCTIONS;\n\tconst structured = process.env[STRUCTURED_OUTPUT_CAPTURE_ENV] ? `\\n\\n${STRUCTURED_OUTPUT_INSTRUCTIONS}` : \"\";\n\treturn `${boundary}${structured}\\n\\n${rewritten}`;\n}\n\nfunction isParentOnlySubagentMessage(message: unknown): boolean {\n\tconst m = message as { role?: string; customType?: string };\n\tif (m?.role !== \"custom\" || typeof m.customType !== \"string\") return false;\n\tif (m.customType === SUBAGENT_WATCHDOG_WARNING_TYPE) return true;\n\treturn PARENT_ONLY_CUSTOM_MESSAGE_TYPES.has(m.customType);\n}\n\nfunction isSubagentToolResultMessage(message: unknown): boolean {\n\tconst m = message as { role?: string; toolName?: string };\n\treturn m?.role === \"toolResult\" && m.toolName === \"subagent\";\n}\n\nfunction isSubagentToolCallBlock(block: unknown): boolean {\n\tconst b = block as { type?: string; name?: string };\n\treturn b?.type === \"toolCall\" && b.name === \"subagent\";\n}\n\nfunction stripAssistantSubagentToolCallBlocks(message: unknown): unknown | undefined {\n\tconst m = message as { role?: string; content?: unknown };\n\tif (m?.role !== \"assistant\" || !Array.isArray(m.content)) return message;\n\tconst filteredContent = m.content.filter((block) => !isSubagentToolCallBlock(block));\n\tif (filteredContent.length === m.content.length) return message;\n\tif (filteredContent.length === 0) return undefined;\n\treturn { ...m, content: filteredContent };\n}\n\nexport function stripParentOnlySubagentMessages(messages: unknown[]): unknown[] {\n\tconst preserveCurrentFanoutToolHistory = process.env[SUBAGENT_FANOUT_CHILD_ENV] === \"1\";\n\tlet changed = false;\n\tconst filtered: unknown[] = [];\n\tfor (const message of messages) {\n\t\tif (isParentOnlySubagentMessage(message) || (!preserveCurrentFanoutToolHistory && isSubagentToolResultMessage(message))) {\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\t\tconst stripped = preserveCurrentFanoutToolHistory ? message : stripAssistantSubagentToolCallBlocks(message);\n\t\tif (stripped === undefined) {\n\t\t\tchanged = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (stripped !== message) changed = true;\n\t\tfiltered.push(stripped);\n\t}\n\treturn changed ? filtered : messages;\n}\n\nexport function formatSteerMessage(request: SteerRequest): string {\n\treturn [\n\t\t\"Mid-run steering from the parent orchestrator:\",\n\t\t\"\",\n\t\trequest.message,\n\t\t\"\",\n\t\t\"Incorporate this guidance at the next safe point. Do not restart the task unless the guidance explicitly asks you to.\",\n\t].join(\"\\n\");\n}\n\nfunction registerToolBudget(pi: ExtensionAPI, budget: ResolvedToolBudget | undefined): void {\n\tif (!budget) return;\n\tlet toolCount = 0;\n\tlet softNudged = false;\n\tconst sendUserMessage = (pi as { sendUserMessage?: (content: string, options: { deliverAs: \"steer\" }) => unknown }).sendUserMessage;\n\tconst onRuntimeEvent = pi.on as unknown as (event: string, handler: (event: { toolName?: string }) => unknown) => void;\n\tonRuntimeEvent(\"tool_call\", (event) => {\n\t\tconst toolName = typeof event.toolName === \"string\" ? event.toolName : \"tool\";\n\t\ttoolCount++;\n\t\tif (budget.soft !== undefined && toolCount >= budget.soft && !softNudged) {\n\t\t\tsoftNudged = true;\n\t\t\ttry {\n\t\t\t\tsendUserMessage?.(toolBudgetSoftNudge(budget, toolCount), { deliverAs: \"steer\" });\n\t\t\t} catch {\n\t\t\t\t// Budget nudges are advisory; blocking below remains authoritative.\n\t\t\t}\n\t\t}\n\t\tif (!shouldBlockToolForBudget(budget, toolName, toolCount)) return undefined;\n\t\treturn { block: true, reason: toolBudgetBlockedMessage(budget, toolName, toolCount) };\n\t});\n}\n\nexport function registerSteeringInbox(\n\tpi: ExtensionAPI,\n\tdeps: { watch?: typeof fs.watch; nativeRealpath?: (filePath: string) => string } = {},\n): void {\n\tconst steerInbox = process.env[SUBAGENT_STEER_INBOX_ENV]?.trim();\n\tif (!steerInbox) return;\n\tconst capabilityPath = process.env[SUBAGENT_STEER_CAPABILITY_ENV]?.trim();\n\tconst ackDir = process.env[SUBAGENT_STEER_ACK_DIR_ENV]?.trim();\n\tconst sendUserMessage = (pi as { sendUserMessage?: (content: string, options: { deliverAs: \"steer\" }) => unknown }).sendUserMessage;\n\tconst childIndex = Number(process.env[SUBAGENT_CHILD_INDEX_ENV]);\n\tconst pending = new Map<string, string[]>();\n\tlet disposed = false;\n\tlet flushing = false;\n\tlet started = false;\n\tlet canSteer = typeof sendUserMessage === \"function\";\n\tlet watcher: fs.FSWatcher | undefined;\n\tlet interval: NodeJS.Timeout | undefined;\n\tconst acknowledge = (request: SteerRequest, state: \"delivered\" | \"failed\", message: string): void => {\n\t\tif (!ackDir || !Number.isInteger(childIndex) || childIndex < 0) return;\n\t\twriteSteerAckAt(steerAckPathFromDir(ackDir, request.id), {\n\t\t\trequestId: request.id,\n\t\t\tindex: childIndex,\n\t\t\tts: Date.now(),\n\t\t\tstate,\n\t\t\tmessage,\n\t\t});\n\t};\n\tlet readyAt = Number(process.env.PI_SUBAGENT_STEER_READY_AT);\n\tif (!Number.isFinite(readyAt) || readyAt <= 0) {\n\t\treadyAt = Date.now();\n\t\tprocess.env.PI_SUBAGENT_STEER_READY_AT = String(readyAt);\n\t}\n\tconst publishCapability = (): void => {\n\t\tif (!capabilityPath || !Number.isInteger(childIndex) || childIndex < 0) return;\n\t\twriteSteerCapabilityAt(capabilityPath, { index: childIndex, pid: process.pid, readyAt, supported: canSteer });\n\t};\n\tconst flush = (): void => {\n\t\tif (disposed || flushing) return;\n\t\tflushing = true;\n\t\ttry {\n\t\t\tconst requests = consumeSteerRequestsFromDir(steerInbox);\n\t\t\tfor (let index = 0; index < requests.length; index++) {\n\t\t\t\tconst request = requests[index]!;\n\t\t\t\tif (!canSteer || typeof sendUserMessage !== \"function\") {\n\t\t\t\t\tacknowledge(request, \"failed\", \"Child Pi session does not support sendUserMessage steering.\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif (request.source === \"supervisor-question\" && !isPendingQuestionForCurrentChild(request.id)) {\n\t\t\t\t\tacknowledge(request, \"failed\", \"Question is no longer pending for this child.\");\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst formatted = request.source === \"supervisor-question\" ? request.message : formatSteerMessage(request);\n\t\t\t\tconst ids = pending.get(formatted) ?? [];\n\t\t\t\tids.push(request.id);\n\t\t\t\tpending.set(formatted, ids);\n\t\t\t\ttry {\n\t\t\t\t\tsendUserMessage(formatted, { deliverAs: \"steer\" });\n\t\t\t\t} catch (error) {\n\t\t\t\t\tids.pop();\n\t\t\t\t\tif (ids.length === 0) pending.delete(formatted);\n\t\t\t\t\tacknowledge(request, \"failed\", error instanceof Error ? error.message : String(error));\n\t\t\t\t\tfor (const retry of requests.slice(index + 1)) writeSteerRequestToDir(steerInbox, retry);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t} finally {\n\t\t\tflushing = false;\n\t\t}\n\t};\n\tconst onInput = (event: unknown): undefined => {\n\t\tif (disposed || !event || typeof event !== \"object\") return undefined;\n\t\tconst input = event as { source?: unknown; streamingBehavior?: unknown; text?: unknown; content?: unknown };\n\t\tif (input.source !== \"extension\" || input.streamingBehavior !== \"steer\") return undefined;\n\t\tconst text = typeof input.text === \"string\" ? input.text : typeof input.content === \"string\" ? input.content : undefined;\n\t\tif (!text) return undefined;\n\t\tconst ids = pending.get(text);\n\t\tconst requestId = ids?.shift();\n\t\tif (!requestId) return undefined;\n\t\tif (ids?.length === 0) pending.delete(text);\n\t\tacknowledge({ type: \"steer\", id: requestId, ts: Date.now(), message: text }, \"delivered\", \"Pi accepted the correlated steering input.\");\n\t\tmarkDeliveredSupervisorQuestionFromChild(text);\n\t\treturn undefined;\n\t};\n\tconst start = (): void => {\n\t\tif (started || disposed) return;\n\t\ttry {\n\t\t\tfs.mkdirSync(steerInbox, { recursive: true });\n\t\t\tpublishCapability();\n\t\t} catch {\n\t\t\treturn;\n\t\t}\n\t\tstarted = true;\n\t\ttry {\n\t\t\twatcher = (deps.watch ?? fs.watch)(resolveWatchPath(steerInbox, deps.nativeRealpath), () => flush());\n\t\t\twatcher.on(\"error\", () => {});\n\t\t} catch {\n\t\t\twatcher = undefined;\n\t\t}\n\t\tinterval = setInterval(flush, 250);\n\t\tinterval.unref?.();\n\t};\n\tconst activate = (): undefined => {\n\t\tstart();\n\t\tflush();\n\t\treturn undefined;\n\t};\n\n\tconst onRuntimeEvent = pi.on as unknown as (event: string, handler: (event: unknown) => unknown) => void;\n\t// Register input before the watcher so an accepted extension input cannot race request dispatch.\n\tonRuntimeEvent(\"input\", onInput);\n\tonRuntimeEvent(\"session_start\", () => start());\n\tfor (const eventName of [\"message_start\", \"message_update\", \"message_end\", \"tool_execution_start\", \"tool_execution_end\", \"turn_end\"] as const) {\n\t\tonRuntimeEvent(eventName, activate);\n\t}\n\tonRuntimeEvent(\"session_shutdown\", () => {\n\t\tdisposed = true;\n\t\ttry { watcher?.close(); } catch {}\n\t\tif (interval) clearInterval(interval);\n\t});\n}\n\nexport default function registerSubagentPromptRuntime(pi: ExtensionAPI): void {\n\tregisterSteeringInbox(pi);\n\tregisterToolBudget(pi, decodeToolBudgetEnv(process.env[TOOL_BUDGET_ENV]));\n\tregisterChildWatchdog(pi);\n\tconst waitToolEnabled = resolveWaitToolConfig().enabled;\n\tconst waitState = {\n\t\tbaseCwd: \"\",\n\t\tcurrentSessionId: null,\n\t\tasyncJobs: new Map(),\n\t\tforegroundControls: new Map(),\n\t\tlastForegroundControlId: null,\n\t\tcleanupTimers: new Map(),\n\t\tlastUiContext: null,\n\t\tpoller: null,\n\t\tcompletionSeen: new Map(),\n\t\twatcher: null,\n\t\twatcherRestartTimer: null,\n\t\tresultFileCoalescer: { schedule: () => false, clear: () => {} },\n\t} as unknown as SubagentState;\n\tif (typeof pi.registerTool === \"function\") registerWaitTool(pi, waitState, waitToolEnabled);\n\tlet nativeSupervisorClientRegistered = false;\n\tlet nativeSupervisorFallbackRegistered = false;\n\tconst registerNativeSupervisorClientOnce = (): void => {\n\t\tif (nativeSupervisorClientRegistered) return;\n\t\tnativeSupervisorClientRegistered = true;\n\t\tregisterNativeSupervisorClient(pi, { includeIntercomFallback: false });\n\t};\n\tconst registerNativeSupervisorFallbackOnce = (): void => {\n\t\tregisterNativeSupervisorClientOnce();\n\t\tif (nativeSupervisorFallbackRegistered) return;\n\t\tnativeSupervisorFallbackRegistered = true;\n\t\tregisterNativeSupervisorClient(pi);\n\t};\n\tconst onRuntimeEvent = pi.on as unknown as (event: string, handler: (event: unknown) => unknown) => void;\n\tonRuntimeEvent(\"session_start\", (_event: unknown, ctx: unknown) => {\n\t\tconst sessionManager = (ctx as { sessionManager?: Parameters<typeof resolveCurrentSessionId>[0] } | undefined)?.sessionManager;\n\t\twaitState.currentSessionId = sessionManager ? resolveCurrentSessionId(sessionManager) : null;\n\t\tregisterNativeSupervisorClientOnce();\n\t\trefreshChildToolDiagnostic(pi);\n\t});\n\tonRuntimeEvent(\"agent_end\", async (_event: unknown, ctx: unknown) => {\n\t\tif ((ctx as { hasUI?: boolean } | undefined)?.hasUI === true) return;\n\t\tawait drainOutstandingWork({ state: waitState, events: pi.events, hasPendingMessages: () => ctx.hasPendingMessages() });\n\t});\n\tconst structuredOutputPath = process.env[STRUCTURED_OUTPUT_CAPTURE_ENV];\n\tconst structuredSchemaPath = process.env[STRUCTURED_OUTPUT_SCHEMA_ENV];\n\tif (structuredOutputPath && structuredSchemaPath) {\n\t\tconst schema = JSON.parse(fs.readFileSync(structuredSchemaPath, \"utf-8\")) as JsonSchemaObject;\n\t\tconst parameters = {\n\t\t\ttype: \"object\",\n\t\t\tproperties: { value: schema },\n\t\t\trequired: [\"value\"],\n\t\t\tadditionalProperties: false,\n\t\t};\n\t\tconst registerTool = pi.registerTool as unknown as (tool: {\n\t\t\tname: string;\n\t\t\tlabel: string;\n\t\t\tdescription: string;\n\t\t\tparameters: unknown;\n\t\t\texecute: (_id: string, params: { value: unknown }) => Promise<unknown>;\n\t\t}) => void;\n\t\tregisterTool({\n\t\t\tname: \"structured_output\",\n\t\t\tlabel: \"Structured Output\",\n\t\t\tdescription: \"Submit the required final structured output for this subagent step. This terminates the step.\",\n\t\t\tparameters: parameters as never,\n\t\t\tasync execute(_id: string, params: { value: unknown }) {\n\t\t\t\tconst validation = validateStructuredOutputValue(schema, params.value);\n\t\t\t\tif (validation.status === \"invalid\") {\n\t\t\t\t\tthrow new Error(`Structured output validation failed: ${validation.message}`);\n\t\t\t\t}\n\t\t\t\tfs.mkdirSync(path.dirname(structuredOutputPath), { recursive: true });\n\t\t\t\tfs.writeFileSync(structuredOutputPath, JSON.stringify(params.value), { mode: 0o600 });\n\t\t\t\treturn {\n\t\t\t\t\tcontent: [{ type: \"text\", text: \"Structured output captured.\" }],\n\t\t\t\t\tdetails: { path: structuredOutputPath },\n\t\t\t\t\tterminate: true,\n\t\t\t\t};\n\t\t\t},\n\t\t});\n\t}\n\n\tonRuntimeEvent(\"context\", (event: { messages: unknown[] }) => {\n\t\tconst messages = stripParentOnlySubagentMessages(event.messages);\n\t\tif (messages === event.messages) return undefined;\n\t\treturn { messages };\n\t});\n\n\tonRuntimeEvent(\"before_agent_start\", async (event: { systemPrompt: string }) => {\n\t\tregisterNativeSupervisorFallbackOnce();\n\t\tconst toolDiagnostic = refreshChildToolDiagnostic(pi);\n\t\tconst intercomSessionName = process.env[SUBAGENT_INTERCOM_SESSION_NAME_ENV]?.trim();\n\t\tif (intercomSessionName && typeof pi.setSessionName === \"function\") {\n\t\t\tpi.setSessionName(intercomSessionName);\n\t\t}\n\n\t\tconst inheritProjectContext = readBooleanEnv(SUBAGENT_INHERIT_PROJECT_CONTEXT_ENV);\n\t\tconst inheritSkills = readBooleanEnv(SUBAGENT_INHERIT_SKILLS_ENV);\n\t\tconst fanoutChild = readBooleanEnv(SUBAGENT_FANOUT_CHILD_ENV);\n\t\tlet rewritten = event.systemPrompt;\n\t\tif (inheritProjectContext !== undefined || inheritSkills !== undefined || fanoutChild !== undefined) {\n\t\t\trewritten = rewriteSubagentPrompt(event.systemPrompt, {\n\t\t\t\tinheritProjectContext: inheritProjectContext ?? true,\n\t\t\t\tinheritSkills: inheritSkills ?? true,\n\t\t\t\tfanoutChild: fanoutChild === true,\n\t\t\t});\n\t\t}\n\t\tif (toolDiagnostic) {\n\t\t\trewritten = `${formatChildToolDiagnostic(toolDiagnostic)}\\nDo not claim tool-dependent work succeeded; report this configuration error to the parent.\\n\\n${rewritten}`;\n\t\t}\n\t\tif (rewritten === event.systemPrompt) return;\n\t\treturn { systemPrompt: rewritten };\n\t});\n}\n"]}
@@ -380,7 +380,7 @@ export default function registerSubagentPromptRuntime(pi) {
380
380
  onRuntimeEvent("agent_end", async (_event, ctx) => {
381
381
  if (ctx?.hasUI === true)
382
382
  return;
383
- await drainOutstandingWork({ state: waitState, events: pi.events });
383
+ await drainOutstandingWork({ state: waitState, events: pi.events, hasPendingMessages: () => ctx.hasPendingMessages() });
384
384
  });
385
385
  const structuredOutputPath = process.env[STRUCTURED_OUTPUT_CAPTURE_ENV];
386
386
  const structuredSchemaPath = process.env[STRUCTURED_OUTPUT_SCHEMA_ENV];