@ashx-j/lunr 0.2.20 → 0.2.22

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 (528) hide show
  1. package/CHANGELOG.md +14 -2
  2. package/README.md +20 -4
  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 +3 -0
  7. package/dist/builtin-extensions/lunr-browser.d.ts.map +1 -0
  8. package/dist/builtin-extensions/lunr-browser.js +56 -0
  9. package/dist/builtin-extensions/lunr-browser.js.map +1 -0
  10. package/dist/builtin-extensions/lunr-todos.d.ts +6 -5
  11. package/dist/builtin-extensions/lunr-todos.d.ts.map +1 -1
  12. package/dist/builtin-extensions/lunr-todos.js +24 -7
  13. package/dist/builtin-extensions/lunr-todos.js.map +1 -1
  14. package/dist/builtin-extensions/pi-intercom/broker/spawn.d.ts.map +1 -1
  15. package/dist/builtin-extensions/pi-intercom/broker/spawn.js +30 -21
  16. package/dist/builtin-extensions/pi-intercom/broker/spawn.js.map +1 -1
  17. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  18. package/dist/builtin-extensions/pi-intercom/index.js +15 -3
  19. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  20. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts +1 -1
  21. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.d.ts.map +1 -1
  22. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js +5 -1
  23. package/dist/builtin-extensions/pi-subagents/src/extension/control-notices.js.map +1 -1
  24. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.d.ts.map +1 -1
  25. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js +2 -2
  26. package/dist/builtin-extensions/pi-subagents/src/extension/fanout-child.js.map +1 -1
  27. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts +8 -7
  28. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  29. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +78 -31
  30. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  31. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  32. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +2 -2
  33. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  34. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -3
  35. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  36. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +6 -2
  37. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  38. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.d.ts +17 -0
  39. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.d.ts.map +1 -0
  40. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.js +45 -0
  41. package/dist/builtin-extensions/pi-subagents/src/intercom/communication.js.map +1 -0
  42. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.d.ts.map +1 -1
  43. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js +4 -11
  44. package/dist/builtin-extensions/pi-subagents/src/intercom/intercom-bridge.js.map +1 -1
  45. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts +5 -1
  46. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.d.ts.map +1 -1
  47. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js +186 -58
  48. package/dist/builtin-extensions/pi-subagents/src/intercom/native-supervisor-channel.js.map +1 -1
  49. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts +1 -0
  50. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.d.ts.map +1 -1
  51. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js +1 -1
  52. package/dist/builtin-extensions/pi-subagents/src/intercom/result-intercom.js.map +1 -1
  53. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js +5 -0
  55. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-ask.js.map +1 -1
  56. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts +2 -0
  57. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js +3 -2
  59. package/dist/builtin-extensions/pi-subagents/src/intercom/supervisor-questions.js.map +1 -1
  60. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts +2 -0
  61. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js +4 -3
  63. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-execution.js.map +1 -1
  64. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.d.ts.map +1 -1
  65. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js +2 -0
  66. package/dist/builtin-extensions/pi-subagents/src/runs/background/async-job-tracker.js.map +1 -1
  67. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts +1 -0
  68. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.d.ts.map +1 -1
  69. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js +2 -1
  70. package/dist/builtin-extensions/pi-subagents/src/runs/background/auto-drain.js.map +1 -1
  71. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +6 -2
  72. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  73. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +23 -1
  74. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  75. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  76. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +1 -0
  77. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  78. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +100 -0
  79. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  80. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +46 -31
  81. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  82. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts +1 -0
  83. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.d.ts.map +1 -1
  84. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js +2 -0
  85. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-wait.js.map +1 -1
  86. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts +15 -2
  87. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.d.ts.map +1 -1
  88. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js +14 -4
  89. package/dist/builtin-extensions/pi-subagents/src/runs/background/top-level-async.js.map +1 -1
  90. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.d.ts.map +1 -1
  91. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js +1 -1
  92. package/dist/builtin-extensions/pi-subagents/src/runs/background/wait-tool.js.map +1 -1
  93. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  94. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +1 -1
  95. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  96. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts +0 -1
  97. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  98. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +9 -9
  99. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  100. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts +1 -1
  101. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.d.ts.map +1 -1
  102. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js +1 -1
  103. package/dist/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.js.map +1 -1
  104. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +1 -0
  105. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  106. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  107. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts +3 -0
  108. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.d.ts.map +1 -1
  109. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js +5 -0
  110. package/dist/builtin-extensions/pi-subagents/src/runs/shared/pi-args.js.map +1 -1
  111. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.d.ts +1 -0
  112. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.d.ts.map +1 -1
  113. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.js +3 -0
  114. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-control.js.map +1 -1
  115. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.d.ts.map +1 -1
  116. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js +1 -1
  117. package/dist/builtin-extensions/pi-subagents/src/runs/shared/subagent-prompt-runtime.js.map +1 -1
  118. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts +2 -2
  119. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.d.ts.map +1 -1
  120. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js +5 -10
  121. package/dist/builtin-extensions/pi-subagents/src/runs/shared/task-intent.js.map +1 -1
  122. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts +2 -0
  123. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.d.ts.map +1 -0
  124. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js +3 -0
  125. package/dist/builtin-extensions/pi-subagents/src/shared/async-guidance.js.map +1 -0
  126. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts +6 -0
  127. package/dist/builtin-extensions/pi-subagents/src/shared/types.d.ts.map +1 -1
  128. package/dist/builtin-extensions/pi-subagents/src/shared/types.js.map +1 -1
  129. package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.d.ts.map +1 -1
  130. package/dist/builtin-extensions/pi-subagents/src/slash/delegation-adapters.js.map +1 -1
  131. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts +7 -0
  132. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +11 -7
  134. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts +4 -0
  136. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.d.ts.map +1 -1
  137. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js +22 -23
  138. package/dist/builtin-extensions/pi-subagents/src/slash/slash-commands.js.map +1 -1
  139. package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts +18 -0
  140. package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts.map +1 -0
  141. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js +47 -0
  142. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js.map +1 -0
  143. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -0
  144. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  145. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +237 -374
  146. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  147. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  148. package/dist/builtin-extensions/pi-web-access/index.js +11 -7
  149. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  150. package/dist/cli/args.d.ts.map +1 -1
  151. package/dist/cli/args.js +2 -1
  152. package/dist/cli/args.js.map +1 -1
  153. package/dist/cli/install-cli.d.ts.map +1 -1
  154. package/dist/cli/install-cli.js +15 -45
  155. package/dist/cli/install-cli.js.map +1 -1
  156. package/dist/core/agent-session-runtime.d.ts +9 -0
  157. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  158. package/dist/core/agent-session-runtime.js +126 -29
  159. package/dist/core/agent-session-runtime.js.map +1 -1
  160. package/dist/core/agent-session.d.ts +3 -0
  161. package/dist/core/agent-session.d.ts.map +1 -1
  162. package/dist/core/agent-session.js +20 -2
  163. package/dist/core/agent-session.js.map +1 -1
  164. package/dist/core/browser/network.d.ts +9 -0
  165. package/dist/core/browser/network.d.ts.map +1 -0
  166. package/dist/core/browser/network.js +146 -0
  167. package/dist/core/browser/network.js.map +1 -0
  168. package/dist/core/browser/runtime.d.ts +24 -0
  169. package/dist/core/browser/runtime.d.ts.map +1 -0
  170. package/dist/core/browser/runtime.js +289 -0
  171. package/dist/core/browser/runtime.js.map +1 -0
  172. package/dist/core/browser/schema.d.ts +16 -0
  173. package/dist/core/browser/schema.d.ts.map +1 -0
  174. package/dist/core/browser/schema.js +36 -0
  175. package/dist/core/browser/schema.js.map +1 -0
  176. package/dist/core/browser/settings.d.ts +8 -0
  177. package/dist/core/browser/settings.d.ts.map +1 -0
  178. package/dist/core/browser/settings.js +30 -0
  179. package/dist/core/browser/settings.js.map +1 -0
  180. package/dist/core/browser/setup.d.ts +2 -0
  181. package/dist/core/browser/setup.d.ts.map +1 -0
  182. package/dist/core/browser/setup.js +16 -0
  183. package/dist/core/browser/setup.js.map +1 -0
  184. package/dist/core/customize.d.ts +2 -0
  185. package/dist/core/customize.d.ts.map +1 -1
  186. package/dist/core/customize.js +17 -13
  187. package/dist/core/customize.js.map +1 -1
  188. package/dist/core/export-html/index.d.ts.map +1 -1
  189. package/dist/core/export-html/index.js +1 -1
  190. package/dist/core/export-html/index.js.map +1 -1
  191. package/dist/core/extensions/runner.d.ts +1 -0
  192. package/dist/core/extensions/runner.d.ts.map +1 -1
  193. package/dist/core/extensions/runner.js +1 -1
  194. package/dist/core/extensions/runner.js.map +1 -1
  195. package/dist/core/extensions/types.d.ts +1 -1
  196. package/dist/core/extensions/types.d.ts.map +1 -1
  197. package/dist/core/extensions/types.js.map +1 -1
  198. package/dist/core/install-features.d.ts.map +1 -1
  199. package/dist/core/install-features.js +10 -8
  200. package/dist/core/install-features.js.map +1 -1
  201. package/dist/core/memory-cap.d.ts.map +1 -1
  202. package/dist/core/memory-cap.js +5 -3
  203. package/dist/core/memory-cap.js.map +1 -1
  204. package/dist/core/model-tiers.d.ts.map +1 -1
  205. package/dist/core/model-tiers.js +9 -6
  206. package/dist/core/model-tiers.js.map +1 -1
  207. package/dist/core/permissions.d.ts.map +1 -1
  208. package/dist/core/permissions.js +9 -0
  209. package/dist/core/permissions.js.map +1 -1
  210. package/dist/core/plan-mode.d.ts.map +1 -1
  211. package/dist/core/plan-mode.js +3 -0
  212. package/dist/core/plan-mode.js.map +1 -1
  213. package/dist/core/process-registry.d.ts.map +1 -1
  214. package/dist/core/process-registry.js +6 -4
  215. package/dist/core/process-registry.js.map +1 -1
  216. package/dist/core/runtime-scope.d.ts +11 -0
  217. package/dist/core/runtime-scope.d.ts.map +1 -0
  218. package/dist/core/runtime-scope.js +3 -0
  219. package/dist/core/runtime-scope.js.map +1 -0
  220. package/dist/core/sdk.d.ts.map +1 -1
  221. package/dist/core/sdk.js +13 -0
  222. package/dist/core/sdk.js.map +1 -1
  223. package/dist/core/session-handoff.d.ts +35 -0
  224. package/dist/core/session-handoff.d.ts.map +1 -0
  225. package/dist/core/session-handoff.js +214 -0
  226. package/dist/core/session-handoff.js.map +1 -0
  227. package/dist/core/session-manager.d.ts +20 -0
  228. package/dist/core/session-manager.d.ts.map +1 -1
  229. package/dist/core/session-manager.js +184 -22
  230. package/dist/core/session-manager.js.map +1 -1
  231. package/dist/core/session-ownership.d.ts +28 -0
  232. package/dist/core/session-ownership.d.ts.map +1 -0
  233. package/dist/core/session-ownership.js +138 -0
  234. package/dist/core/session-ownership.js.map +1 -0
  235. package/dist/core/session-retention.d.ts.map +1 -1
  236. package/dist/core/session-retention.js +11 -2
  237. package/dist/core/session-retention.js.map +1 -1
  238. package/dist/core/settings-manager.d.ts +11 -0
  239. package/dist/core/settings-manager.d.ts.map +1 -1
  240. package/dist/core/settings-manager.js +29 -0
  241. package/dist/core/settings-manager.js.map +1 -1
  242. package/dist/core/slash-commands.d.ts.map +1 -1
  243. package/dist/core/slash-commands.js +2 -0
  244. package/dist/core/slash-commands.js.map +1 -1
  245. package/dist/core/subagent-spinner-setting.d.ts +6 -0
  246. package/dist/core/subagent-spinner-setting.d.ts.map +1 -0
  247. package/dist/core/subagent-spinner-setting.js +12 -0
  248. package/dist/core/subagent-spinner-setting.js.map +1 -0
  249. package/dist/core/subagent-spinner.d.ts +4 -0
  250. package/dist/core/subagent-spinner.d.ts.map +1 -0
  251. package/dist/core/subagent-spinner.js +6 -0
  252. package/dist/core/subagent-spinner.js.map +1 -0
  253. package/dist/core/system-prompt.d.ts.map +1 -1
  254. package/dist/core/system-prompt.js +5 -2
  255. package/dist/core/system-prompt.js.map +1 -1
  256. package/dist/core/todo-settings.d.ts +5 -0
  257. package/dist/core/todo-settings.d.ts.map +1 -0
  258. package/dist/core/todo-settings.js +7 -0
  259. package/dist/core/todo-settings.js.map +1 -0
  260. package/dist/core/tools/bash.d.ts.map +1 -1
  261. package/dist/core/tools/bash.js +4 -4
  262. package/dist/core/tools/bash.js.map +1 -1
  263. package/dist/core/tools/edit.d.ts.map +1 -1
  264. package/dist/core/tools/edit.js +5 -3
  265. package/dist/core/tools/edit.js.map +1 -1
  266. package/dist/core/tools/find.d.ts.map +1 -1
  267. package/dist/core/tools/find.js +4 -4
  268. package/dist/core/tools/find.js.map +1 -1
  269. package/dist/core/tools/grep.d.ts.map +1 -1
  270. package/dist/core/tools/grep.js +4 -4
  271. package/dist/core/tools/grep.js.map +1 -1
  272. package/dist/core/tools/ls.d.ts.map +1 -1
  273. package/dist/core/tools/ls.js +4 -4
  274. package/dist/core/tools/ls.js.map +1 -1
  275. package/dist/core/tools/read.d.ts.map +1 -1
  276. package/dist/core/tools/read.js +4 -4
  277. package/dist/core/tools/read.js.map +1 -1
  278. package/dist/core/tools/render-utils.d.ts +11 -2
  279. package/dist/core/tools/render-utils.d.ts.map +1 -1
  280. package/dist/core/tools/render-utils.js +31 -4
  281. package/dist/core/tools/render-utils.js.map +1 -1
  282. package/dist/core/tools/write.d.ts.map +1 -1
  283. package/dist/core/tools/write.js +4 -4
  284. package/dist/core/tools/write.js.map +1 -1
  285. package/dist/core/usage-service.d.ts.map +1 -1
  286. package/dist/core/usage-service.js +5 -3
  287. package/dist/core/usage-service.js.map +1 -1
  288. package/dist/gateway/adapters/discord.d.ts +12 -1
  289. package/dist/gateway/adapters/discord.d.ts.map +1 -1
  290. package/dist/gateway/adapters/discord.js +112 -17
  291. package/dist/gateway/adapters/discord.js.map +1 -1
  292. package/dist/gateway/adapters/telegram.d.ts +4 -2
  293. package/dist/gateway/adapters/telegram.d.ts.map +1 -1
  294. package/dist/gateway/adapters/telegram.js +34 -11
  295. package/dist/gateway/adapters/telegram.js.map +1 -1
  296. package/dist/gateway/agent-bridge.d.ts +14 -3
  297. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  298. package/dist/gateway/agent-bridge.js +252 -60
  299. package/dist/gateway/agent-bridge.js.map +1 -1
  300. package/dist/gateway/approval.d.ts +1 -0
  301. package/dist/gateway/approval.d.ts.map +1 -1
  302. package/dist/gateway/approval.js +60 -18
  303. package/dist/gateway/approval.js.map +1 -1
  304. package/dist/gateway/authz.d.ts +2 -0
  305. package/dist/gateway/authz.d.ts.map +1 -1
  306. package/dist/gateway/authz.js +13 -0
  307. package/dist/gateway/authz.js.map +1 -1
  308. package/dist/gateway/buttons.d.ts +3 -1
  309. package/dist/gateway/buttons.d.ts.map +1 -1
  310. package/dist/gateway/buttons.js +18 -3
  311. package/dist/gateway/buttons.js.map +1 -1
  312. package/dist/gateway/command.d.ts.map +1 -1
  313. package/dist/gateway/command.js +49 -4
  314. package/dist/gateway/command.js.map +1 -1
  315. package/dist/gateway/commands.d.ts.map +1 -1
  316. package/dist/gateway/commands.js +18 -3
  317. package/dist/gateway/commands.js.map +1 -1
  318. package/dist/gateway/config.d.ts +5 -0
  319. package/dist/gateway/config.d.ts.map +1 -1
  320. package/dist/gateway/config.js +5 -0
  321. package/dist/gateway/config.js.map +1 -1
  322. package/dist/gateway/conversations.d.ts +14 -0
  323. package/dist/gateway/conversations.d.ts.map +1 -0
  324. package/dist/gateway/conversations.js +30 -0
  325. package/dist/gateway/conversations.js.map +1 -0
  326. package/dist/gateway/download.d.ts +2 -0
  327. package/dist/gateway/download.d.ts.map +1 -0
  328. package/dist/gateway/download.js +36 -0
  329. package/dist/gateway/download.js.map +1 -0
  330. package/dist/gateway/index.d.ts.map +1 -1
  331. package/dist/gateway/index.js +85 -26
  332. package/dist/gateway/index.js.map +1 -1
  333. package/dist/gateway/mobile-commands.d.ts +24 -0
  334. package/dist/gateway/mobile-commands.d.ts.map +1 -0
  335. package/dist/gateway/mobile-commands.js +422 -0
  336. package/dist/gateway/mobile-commands.js.map +1 -0
  337. package/dist/gateway/presenter.d.ts +16 -0
  338. package/dist/gateway/presenter.d.ts.map +1 -0
  339. package/dist/gateway/presenter.js +210 -0
  340. package/dist/gateway/presenter.js.map +1 -0
  341. package/dist/gateway/router.d.ts +1 -0
  342. package/dist/gateway/router.d.ts.map +1 -1
  343. package/dist/gateway/router.js +32 -3
  344. package/dist/gateway/router.js.map +1 -1
  345. package/dist/gateway/service.d.ts +46 -0
  346. package/dist/gateway/service.d.ts.map +1 -0
  347. package/dist/gateway/service.js +395 -0
  348. package/dist/gateway/service.js.map +1 -0
  349. package/dist/gateway/setup.d.ts +4 -0
  350. package/dist/gateway/setup.d.ts.map +1 -0
  351. package/dist/gateway/setup.js +146 -0
  352. package/dist/gateway/setup.js.map +1 -0
  353. package/dist/gateway/types.d.ts +4 -2
  354. package/dist/gateway/types.d.ts.map +1 -1
  355. package/dist/gateway/types.js.map +1 -1
  356. package/dist/index.d.ts +2 -0
  357. package/dist/index.d.ts.map +1 -1
  358. package/dist/index.js +2 -0
  359. package/dist/index.js.map +1 -1
  360. package/dist/main.d.ts.map +1 -1
  361. package/dist/main.js +2 -1
  362. package/dist/main.js.map +1 -1
  363. package/dist/modes/interactive/components/assistant-message.d.ts +11 -2
  364. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  365. package/dist/modes/interactive/components/assistant-message.js +53 -16
  366. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  367. package/dist/modes/interactive/components/copyable-text.d.ts +31 -0
  368. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -0
  369. package/dist/modes/interactive/components/copyable-text.js +165 -0
  370. package/dist/modes/interactive/components/copyable-text.js.map +1 -0
  371. package/dist/modes/interactive/components/custom-entry.d.ts +1 -0
  372. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  373. package/dist/modes/interactive/components/custom-entry.js +8 -0
  374. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  375. package/dist/modes/interactive/components/custom-message.d.ts +1 -0
  376. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  377. package/dist/modes/interactive/components/custom-message.js +8 -0
  378. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  379. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  380. package/dist/modes/interactive/components/session-selector.js +16 -0
  381. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  382. package/dist/modes/interactive/components/settings-selector.d.ts +9 -0
  383. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  384. package/dist/modes/interactive/components/settings-selector.js +111 -1
  385. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  386. package/dist/modes/interactive/extension-widget-order.d.ts +8 -0
  387. package/dist/modes/interactive/extension-widget-order.d.ts.map +1 -0
  388. package/dist/modes/interactive/extension-widget-order.js +37 -0
  389. package/dist/modes/interactive/extension-widget-order.js.map +1 -0
  390. package/dist/modes/interactive/interactive-mode.d.ts +3 -0
  391. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  392. package/dist/modes/interactive/interactive-mode.js +166 -29
  393. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  394. package/dist/node-runtime/agent-session-services-NQ6GKOIK.js +49 -0
  395. package/dist/node-runtime/{builtin-extensions-X4JMM4ZS.js → builtin-extensions-GVC6IFDU.js} +6 -4
  396. package/dist/node-runtime/{chunk-LTYWTR3V.js → chunk-2MI5OPMN.js} +17 -2
  397. package/dist/node-runtime/{chunk-W3CVH5RX.js → chunk-2TKODGBZ.js} +11 -6
  398. package/dist/node-runtime/chunk-4EULYYR4.js +62 -0
  399. package/dist/node-runtime/chunk-5BNJ4JUH.js +672 -0
  400. package/dist/node-runtime/{chunk-6N22HULO.js → chunk-5D7LC2ZQ.js} +7 -2
  401. package/dist/node-runtime/chunk-5ZH3ZFIZ.js +308 -0
  402. package/dist/node-runtime/{chunk-KBKMCJDU.js → chunk-5ZQXRPMC.js} +19 -4
  403. package/dist/node-runtime/{chunk-6KDIOJL3.js → chunk-6427XAWG.js} +3 -3
  404. package/dist/node-runtime/{chunk-BOHIDQT4.js → chunk-6B2POMK7.js} +1 -1
  405. package/dist/node-runtime/{chunk-RNBHABBA.js → chunk-7QWNYZDI.js} +7 -0
  406. package/dist/node-runtime/chunk-AZJHNQKQ.js +205 -0
  407. package/dist/node-runtime/chunk-BFNXONG3.js +521 -0
  408. package/dist/node-runtime/{chunk-IRPJXI6U.js → chunk-BX2RB477.js} +1 -1
  409. package/dist/node-runtime/chunk-CCCN2UCX.js +14 -0
  410. package/dist/node-runtime/{chunk-25I2BHAA.js → chunk-CSUZVNYE.js} +1 -1
  411. package/dist/node-runtime/{chunk-QZMODZQ2.js → chunk-E24EO34J.js} +2 -1
  412. package/dist/node-runtime/{chunk-QKFMBRAL.js → chunk-EQ63ANHL.js} +508 -140
  413. package/dist/node-runtime/{chunk-ELWEXVO5.js → chunk-GJSAD4AB.js} +216 -201
  414. package/dist/node-runtime/{chunk-AOFXZQKA.js → chunk-GMHJCCEN.js} +8 -8
  415. package/dist/node-runtime/{chunk-DDWHZ633.js → chunk-GNN7H3B7.js} +1 -1
  416. package/dist/node-runtime/chunk-GS66LV4M.js +2830 -0
  417. package/dist/node-runtime/{chunk-6BEIBLQ3.js → chunk-H3XF4UVQ.js} +1 -1
  418. package/dist/node-runtime/chunk-H4K3JDRB.js +47 -0
  419. package/dist/node-runtime/{chunk-AROOY4BB.js → chunk-HTFRRDSF.js} +2 -7
  420. package/dist/node-runtime/chunk-IMLCWLPI.js +9 -0
  421. package/dist/node-runtime/{chunk-4CSFRBCN.js → chunk-IQIEU7SB.js} +9 -674
  422. package/dist/node-runtime/{chunk-OPEK5RRY.js → chunk-IVXYUAJE.js} +1 -1
  423. package/dist/node-runtime/{chunk-AL2FMKKM.js → chunk-IWOWXRWU.js} +58 -48
  424. package/dist/node-runtime/chunk-KKUTQQV7.js +144 -0
  425. package/dist/node-runtime/chunk-LISUTZS3.js +19 -0
  426. package/dist/node-runtime/{chunk-K3646JTM.js → chunk-LMBNLFXQ.js} +25 -314
  427. package/dist/node-runtime/{chunk-7NBZ5P7I.js → chunk-NAY6UUQZ.js} +1 -1
  428. package/dist/node-runtime/chunk-OAR4TYZE.js +146 -0
  429. package/dist/node-runtime/{chunk-STERBGUB.js → chunk-OFKSVRV7.js} +2 -2
  430. package/dist/node-runtime/{chunk-JZQ7F36T.js → chunk-ORH324EP.js} +19 -3
  431. package/dist/node-runtime/{chunk-2SJB2AWP.js → chunk-PC2Z5TKZ.js} +3 -3
  432. package/dist/node-runtime/{chunk-46ECNOLF.js → chunk-QDGKKKUM.js} +97 -162
  433. package/dist/node-runtime/chunk-R3K2F5GI.js +122 -0
  434. package/dist/node-runtime/chunk-RMQZU2YU.js +117 -0
  435. package/dist/node-runtime/{chunk-JYNNB7DU.js → chunk-TDL7UWJ7.js} +283 -2999
  436. package/dist/node-runtime/{chunk-G6LRAP36.js → chunk-TQGPP4SC.js} +1 -1
  437. package/dist/node-runtime/chunk-UAEOTO52.js +119 -0
  438. package/dist/node-runtime/{chunk-4DJ6HEGH.js → chunk-UAFLNHSH.js} +18 -14
  439. package/dist/node-runtime/{chunk-AY6CAJSL.js → chunk-UJOCPOMX.js} +6 -3
  440. package/dist/node-runtime/chunk-UP2XBVH5.js +40 -0
  441. package/dist/node-runtime/{chunk-WJVFOIB5.js → chunk-UQUCFAJ3.js} +1 -1
  442. package/dist/node-runtime/chunk-URD2SLIT.js +1019 -0
  443. package/dist/node-runtime/chunk-US544NN6.js +13 -0
  444. package/dist/node-runtime/chunk-UWPJL22I.js +341 -0
  445. package/dist/node-runtime/chunk-V2A7CEXK.js +355 -0
  446. package/dist/node-runtime/chunk-VJPTNWAP.js +708 -0
  447. package/dist/node-runtime/{chunk-WKDK4C5P.js → chunk-VSSXXL36.js} +38 -164
  448. package/dist/node-runtime/{chunk-4I23VTC4.js → chunk-VWCE2HSZ.js} +21 -124
  449. package/dist/node-runtime/{chunk-CBGB57XT.js → chunk-WADV2VDS.js} +32 -1014
  450. package/dist/node-runtime/{chunk-GKLEQ3I4.js → chunk-XLTL257W.js} +126 -27
  451. package/dist/node-runtime/chunk-YPHAIRZT.js +10 -0
  452. package/dist/node-runtime/cli-runtime.js +2 -2
  453. package/dist/node-runtime/command-3JHHXOPX.js +45 -0
  454. package/dist/node-runtime/commands-2JVNFGMQ.js +36 -0
  455. package/dist/node-runtime/{commands-MV5KOZ64.js → commands-KAMO2T6P.js} +10 -10
  456. package/dist/node-runtime/config-RORQUQFG.js +20 -0
  457. package/dist/node-runtime/{customize-XEXL2DGQ.js → customize-VFJV3U6A.js} +2 -1
  458. package/dist/node-runtime/{direct-tool-executor-BK7CLEBX.js → direct-tool-executor-YAVOLDFY.js} +8 -8
  459. package/dist/node-runtime/{export-html-TEXVV5RP.js → export-html-KBFVV63J.js} +4 -3
  460. package/dist/node-runtime/{extension-input-O4HSAEM4.js → extension-input-K24TVKVW.js} +4 -4
  461. package/dist/node-runtime/{extension-selector-X5FCX43D.js → extension-selector-SPNF7EDR.js} +4 -4
  462. package/dist/node-runtime/{extract-XLQSJN4V.js → extract-EQJE7FZZ.js} +2 -2
  463. package/dist/node-runtime/{gateway-L4ANRTVE.js → gateway-VFO6SFKK.js} +275 -994
  464. package/dist/node-runtime/{gemini-search-U7SUMPQA.js → gemini-search-35OCRFLN.js} +1 -1
  465. package/dist/node-runtime/{gemini-url-context-PXWCBQHK.js → gemini-url-context-UQY3PHHW.js} +2 -2
  466. package/dist/node-runtime/index.js +105 -64
  467. package/dist/node-runtime/{init-3C7Z24OI.js → init-X2LIUB2H.js} +3 -3
  468. package/dist/node-runtime/{install-cli-EXMJQESX.js → install-cli-C3CF7O7N.js} +21 -82
  469. package/dist/node-runtime/interactive-mode-LOM6AIF6.js +72 -0
  470. package/dist/node-runtime/{interactive-view-ILS6TAN5.js → interactive-view-IDSCPPK7.js} +8 -8
  471. package/dist/node-runtime/lunr-browser-YNW7FTYX.js +87 -0
  472. package/dist/node-runtime/{lunr-cron-NNYTWTGF.js → lunr-cron-BKHGNBKT.js} +19 -5
  473. package/dist/node-runtime/main.js +45 -30
  474. package/dist/node-runtime/{memory-cap-3S4XRLNP.js → memory-cap-EL3KL4JJ.js} +2 -1
  475. package/dist/node-runtime/mobile-commands-HMP25WBC.js +32 -0
  476. package/dist/node-runtime/model-runtime-PLQKAG4B.js +16 -0
  477. package/dist/node-runtime/{model-tiers-NJLHUEGK.js → model-tiers-OU3U5CZG.js} +2 -1
  478. package/dist/node-runtime/{package-manager-cli-7RKSZGEN.js → package-manager-cli-VCK4E2RC.js} +23 -15
  479. package/dist/node-runtime/{pi-intercom-DDQMRNPJ.js → pi-intercom-HBPK5HSJ.js} +38 -34
  480. package/dist/node-runtime/{pi-mcp-adapter-GUFZWW54.js → pi-mcp-adapter-E6WULBKF.js} +4 -4
  481. package/dist/node-runtime/{pi-subagents-T5WMMLBB.js → pi-subagents-FEUDLJOE.js} +476 -412
  482. package/dist/node-runtime/{pi-web-access-2CQGFLT2.js → pi-web-access-WTGMNZ32.js} +15 -15
  483. package/dist/node-runtime/process-registry-4FAKZQOL.js +31 -0
  484. package/dist/node-runtime/{proxy-modes-V6YVFH3C.js → proxy-modes-OSQCWRBI.js} +9 -9
  485. package/dist/node-runtime/rpc-entry.js +46 -31
  486. package/dist/node-runtime/{rpc-mode-W5ZTLTMZ.js → rpc-mode-P5ODXPEG.js} +2 -2
  487. package/dist/node-runtime/runtime-4VA6JKNF.js +373 -0
  488. package/dist/node-runtime/{runtime-bridges-NJQERQ72.js → runtime-bridges-3XUQ46XW.js} +6 -5
  489. package/dist/node-runtime/service-ISSP6VHE.js +36 -0
  490. package/dist/node-runtime/session-handoff-HC7R5E24.js +33 -0
  491. package/dist/node-runtime/{session-manager-E7AREDTV.js → session-manager-CFN4UFM2.js} +2 -1
  492. package/dist/node-runtime/{session-selector-FJ7M2AIX.js → session-selector-LHRMJOKT.js} +5 -4
  493. package/dist/node-runtime/{settings-manager-GHPTUN7R.js → settings-manager-UUZ6NUXI.js} +8 -2
  494. package/dist/node-runtime/setup-JBKOLJ6F.js +18 -0
  495. package/dist/node-runtime/setup-NRXVZBLJ.js +155 -0
  496. package/dist/node-runtime/{subagent-executor-SRFC26SJ.js → subagent-executor-MLUMBWCP.js} +35 -63
  497. package/dist/node-runtime/theme-U7IGOA7O.js +68 -0
  498. package/dist/node-runtime/trust-manager-MMISNCYO.js +17 -0
  499. package/dist/node-runtime/{update-cli-L3JIBH2U.js → update-cli-4TP25CNW.js} +8 -2
  500. package/dist/node-runtime/usage-service-LFB2SWYV.js +37 -0
  501. package/dist/node-runtime/{video-extract-OYT5WKS5.js → video-extract-OOZHR7SU.js} +2 -2
  502. package/dist/node-runtime/{youtube-extract-TQYKGFGS.js → youtube-extract-FNPAUNHU.js} +6 -6
  503. package/docs/browser.md +86 -0
  504. package/docs/extensions.md +2 -0
  505. package/docs/features.md +99 -17
  506. package/docs/interactive-startup.md +2 -1
  507. package/docs/sessions.md +10 -0
  508. package/docs/settings.md +3 -1
  509. package/docs/tui.md +2 -0
  510. package/docs/usage.md +16 -0
  511. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  512. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  513. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  514. package/examples/extensions/gondolin/package-lock.json +2 -2
  515. package/examples/extensions/gondolin/package.json +1 -1
  516. package/examples/extensions/sandbox/package-lock.json +2 -2
  517. package/examples/extensions/sandbox/package.json +1 -1
  518. package/examples/extensions/with-deps/package-lock.json +2 -2
  519. package/examples/extensions/with-deps/package.json +1 -1
  520. package/package.json +7 -4
  521. package/scripts/install-browser.mjs +20 -0
  522. package/dist/node-runtime/agent-session-services-75JKASCW.js +0 -36
  523. package/dist/node-runtime/chunk-HQCKFM2O.js +0 -56
  524. package/dist/node-runtime/command-RBTRL55A.js +0 -13
  525. package/dist/node-runtime/interactive-mode-HPUNH7SV.js +0 -57
  526. package/dist/node-runtime/{chunk-UWQYRSYQ.js → chunk-YJMMG7C6.js} +25 -25
  527. package/dist/node-runtime/{mcp-panel-IIGMXQGP.js → mcp-panel-KTTFXJZ4.js} +3 -3
  528. package/dist/node-runtime/{src-BPQFJR76.js → src-IVPNZ2BX.js} +9 -9
@@ -2,7 +2,7 @@ import type { Message } from "@ashx-j/lunr-ai";
2
2
  import { expectsImplementationMutation } from "./task-intent.ts";
3
3
  export { expectsImplementationMutation };
4
4
  interface CompletionMutationGuardInput {
5
- agent: string;
5
+ permissions: "full" | "read-only";
6
6
  task: string;
7
7
  messages: Message[];
8
8
  tools?: string[];
@@ -1 +1 @@
1
- {"version":3,"file":"completion-guard.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAczC,UAAU,4BAA4B;IACrC,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,UAAU,6BAA6B;IACtC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAGpH;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAchE;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,4BAA4B,GAAG,6BAA6B,CAUlH","sourcesContent":["// @ts-nocheck\nimport type { Message } from \"@ashx-j/lunr-ai\";\nimport { isMutatingBashCommand } from \"./long-running-guard.ts\";\nimport { expectsImplementationMutation } from \"./task-intent.ts\";\n\nexport { expectsImplementationMutation };\n\nconst READ_ONLY_BUILTIN_TOOLS = new Set([\n\t\"read\",\n\t\"grep\",\n\t\"find\",\n\t\"ls\",\n\t\"web_search\",\n\t\"fetch_content\",\n\t\"get_search_content\",\n\t\"intercom\",\n\t\"contact_supervisor\",\n]);\n\ninterface CompletionMutationGuardInput {\n\tagent: string;\n\ttask: string;\n\tmessages: Message[];\n\ttools?: string[];\n\tmcpDirectTools?: string[];\n}\n\ninterface CompletionMutationGuardResult {\n\texpectedMutation: boolean;\n\tattemptedMutation: boolean;\n\ttriggered: boolean;\n}\n\nexport function hasMutationToolCapability(tools: string[] | undefined, mcpDirectTools: string[] | undefined): boolean {\n\tif (tools === undefined || tools.length === 0 || (mcpDirectTools?.length ?? 0) > 0) return true;\n\treturn !tools.every((tool) => READ_ONLY_BUILTIN_TOOLS.has(tool));\n}\n\nexport function hasMutationToolCall(messages: Message[]): boolean {\n\tfor (const message of messages) {\n\t\tif (message.role !== \"assistant\") continue;\n\t\tfor (const part of message.content) {\n\t\t\tif (part.type !== \"toolCall\") continue;\n\t\t\tif (part.name === \"edit\" || part.name === \"write\") return true;\n\t\t\tif (part.name !== \"bash\") continue;\n\t\t\tconst args = typeof part.arguments === \"object\" && part.arguments !== null && !Array.isArray(part.arguments)\n\t\t\t\t? part.arguments as Record<string, unknown>\n\t\t\t\t: {};\n\t\t\tif (typeof args.command === \"string\" && isMutatingBashCommand(args.command)) return true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function evaluateCompletionMutationGuard(input: CompletionMutationGuardInput): CompletionMutationGuardResult {\n\tconst expectedMutation = hasMutationToolCapability(input.tools, input.mcpDirectTools)\n\t\t? expectsImplementationMutation(input.agent, input.task)\n\t\t: false;\n\tconst attemptedMutation = hasMutationToolCall(input.messages);\n\treturn {\n\t\texpectedMutation,\n\t\tattemptedMutation,\n\t\ttriggered: expectedMutation && !attemptedMutation,\n\t};\n}\n"]}
1
+ {"version":3,"file":"completion-guard.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAErD,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAczC,UAAU,4BAA4B;IACrC,WAAW,EAAE,MAAM,GAAG,WAAW,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,UAAU,6BAA6B;IACtC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,SAAS,EAAE,OAAO,CAAC;CACnB;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,EAAE,cAAc,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,OAAO,CAGpH;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,CAchE;AAED,wBAAgB,+BAA+B,CAAC,KAAK,EAAE,4BAA4B,GAAG,6BAA6B,CAUlH","sourcesContent":["// @ts-nocheck\nimport type { Message } from \"@ashx-j/lunr-ai\";\nimport { isMutatingBashCommand } from \"./long-running-guard.ts\";\nimport { expectsImplementationMutation } from \"./task-intent.ts\";\n\nexport { expectsImplementationMutation };\n\nconst READ_ONLY_BUILTIN_TOOLS = new Set([\n\t\"read\",\n\t\"grep\",\n\t\"find\",\n\t\"ls\",\n\t\"web_search\",\n\t\"fetch_content\",\n\t\"get_search_content\",\n\t\"intercom\",\n\t\"contact_supervisor\",\n]);\n\ninterface CompletionMutationGuardInput {\n\tpermissions: \"full\" | \"read-only\";\n\ttask: string;\n\tmessages: Message[];\n\ttools?: string[];\n\tmcpDirectTools?: string[];\n}\n\ninterface CompletionMutationGuardResult {\n\texpectedMutation: boolean;\n\tattemptedMutation: boolean;\n\ttriggered: boolean;\n}\n\nexport function hasMutationToolCapability(tools: string[] | undefined, mcpDirectTools: string[] | undefined): boolean {\n\tif (tools === undefined || tools.length === 0 || (mcpDirectTools?.length ?? 0) > 0) return true;\n\treturn !tools.every((tool) => READ_ONLY_BUILTIN_TOOLS.has(tool));\n}\n\nexport function hasMutationToolCall(messages: Message[]): boolean {\n\tfor (const message of messages) {\n\t\tif (message.role !== \"assistant\") continue;\n\t\tfor (const part of message.content) {\n\t\t\tif (part.type !== \"toolCall\") continue;\n\t\t\tif (part.name === \"edit\" || part.name === \"write\") return true;\n\t\t\tif (part.name !== \"bash\") continue;\n\t\t\tconst args = typeof part.arguments === \"object\" && part.arguments !== null && !Array.isArray(part.arguments)\n\t\t\t\t? part.arguments as Record<string, unknown>\n\t\t\t\t: {};\n\t\t\tif (typeof args.command === \"string\" && isMutatingBashCommand(args.command)) return true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function evaluateCompletionMutationGuard(input: CompletionMutationGuardInput): CompletionMutationGuardResult {\n\tconst expectedMutation = hasMutationToolCapability(input.tools, input.mcpDirectTools)\n\t\t? expectsImplementationMutation(input.permissions, input.task)\n\t\t: false;\n\tconst attemptedMutation = hasMutationToolCall(input.messages);\n\treturn {\n\t\texpectedMutation,\n\t\tattemptedMutation,\n\t\ttriggered: expectedMutation && !attemptedMutation,\n\t};\n}\n"]}
@@ -39,7 +39,7 @@ export function hasMutationToolCall(messages) {
39
39
  }
40
40
  export function evaluateCompletionMutationGuard(input) {
41
41
  const expectedMutation = hasMutationToolCapability(input.tools, input.mcpDirectTools)
42
- ? expectsImplementationMutation(input.agent, input.task)
42
+ ? expectsImplementationMutation(input.permissions, input.task)
43
43
  : false;
44
44
  const attemptedMutation = hasMutationToolCall(input.messages);
45
45
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"completion-guard.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAEzC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACvC,MAAM;IACN,MAAM;IACN,MAAM;IACN,IAAI;IACJ,YAAY;IACZ,eAAe;IACf,oBAAoB;IACpB,UAAU;IACV,oBAAoB;CACpB,CAAC,CAAC;AAgBH,MAAM,UAAU,yBAAyB,CAAC,KAA2B,EAAE,cAAoC,EAAW;IACrH,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAAA,CACjE;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAmB,EAAW;IACjE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAC3C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;gBAAE,SAAS;YACvC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC/D,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YACnC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC3G,CAAC,CAAC,IAAI,CAAC,SAAoC;gBAC3C,CAAC,CAAC,EAAE,CAAC;YACN,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC1F,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAmC,EAAiC;IACnH,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC;QACpF,CAAC,CAAC,6BAA6B,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC;QACxD,CAAC,CAAC,KAAK,CAAC;IACT,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9D,OAAO;QACN,gBAAgB;QAChB,iBAAiB;QACjB,SAAS,EAAE,gBAAgB,IAAI,CAAC,iBAAiB;KACjD,CAAC;AAAA,CACF","sourcesContent":["// @ts-nocheck\nimport type { Message } from \"@ashx-j/lunr-ai\";\nimport { isMutatingBashCommand } from \"./long-running-guard.ts\";\nimport { expectsImplementationMutation } from \"./task-intent.ts\";\n\nexport { expectsImplementationMutation };\n\nconst READ_ONLY_BUILTIN_TOOLS = new Set([\n\t\"read\",\n\t\"grep\",\n\t\"find\",\n\t\"ls\",\n\t\"web_search\",\n\t\"fetch_content\",\n\t\"get_search_content\",\n\t\"intercom\",\n\t\"contact_supervisor\",\n]);\n\ninterface CompletionMutationGuardInput {\n\tagent: string;\n\ttask: string;\n\tmessages: Message[];\n\ttools?: string[];\n\tmcpDirectTools?: string[];\n}\n\ninterface CompletionMutationGuardResult {\n\texpectedMutation: boolean;\n\tattemptedMutation: boolean;\n\ttriggered: boolean;\n}\n\nexport function hasMutationToolCapability(tools: string[] | undefined, mcpDirectTools: string[] | undefined): boolean {\n\tif (tools === undefined || tools.length === 0 || (mcpDirectTools?.length ?? 0) > 0) return true;\n\treturn !tools.every((tool) => READ_ONLY_BUILTIN_TOOLS.has(tool));\n}\n\nexport function hasMutationToolCall(messages: Message[]): boolean {\n\tfor (const message of messages) {\n\t\tif (message.role !== \"assistant\") continue;\n\t\tfor (const part of message.content) {\n\t\t\tif (part.type !== \"toolCall\") continue;\n\t\t\tif (part.name === \"edit\" || part.name === \"write\") return true;\n\t\t\tif (part.name !== \"bash\") continue;\n\t\t\tconst args = typeof part.arguments === \"object\" && part.arguments !== null && !Array.isArray(part.arguments)\n\t\t\t\t? part.arguments as Record<string, unknown>\n\t\t\t\t: {};\n\t\t\tif (typeof args.command === \"string\" && isMutatingBashCommand(args.command)) return true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function evaluateCompletionMutationGuard(input: CompletionMutationGuardInput): CompletionMutationGuardResult {\n\tconst expectedMutation = hasMutationToolCapability(input.tools, input.mcpDirectTools)\n\t\t? expectsImplementationMutation(input.agent, input.task)\n\t\t: false;\n\tconst attemptedMutation = hasMutationToolCall(input.messages);\n\treturn {\n\t\texpectedMutation,\n\t\tattemptedMutation,\n\t\ttriggered: expectedMutation && !attemptedMutation,\n\t};\n}\n"]}
1
+ {"version":3,"file":"completion-guard.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/completion-guard.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAChE,OAAO,EAAE,6BAA6B,EAAE,MAAM,kBAAkB,CAAC;AAEjE,OAAO,EAAE,6BAA6B,EAAE,CAAC;AAEzC,MAAM,uBAAuB,GAAG,IAAI,GAAG,CAAC;IACvC,MAAM;IACN,MAAM;IACN,MAAM;IACN,IAAI;IACJ,YAAY;IACZ,eAAe;IACf,oBAAoB;IACpB,UAAU;IACV,oBAAoB;CACpB,CAAC,CAAC;AAgBH,MAAM,UAAU,yBAAyB,CAAC,KAA2B,EAAE,cAAoC,EAAW;IACrH,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC;QAAE,OAAO,IAAI,CAAC;IAChG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,uBAAuB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AAAA,CACjE;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAmB,EAAW;IACjE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAChC,IAAI,OAAO,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAC3C,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;YACpC,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU;gBAAE,SAAS;YACvC,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO;gBAAE,OAAO,IAAI,CAAC;YAC/D,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM;gBAAE,SAAS;YACnC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;gBAC3G,CAAC,CAAC,IAAI,CAAC,SAAoC;gBAC3C,CAAC,CAAC,EAAE,CAAC;YACN,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAAE,OAAO,IAAI,CAAC;QAC1F,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,MAAM,UAAU,+BAA+B,CAAC,KAAmC,EAAiC;IACnH,MAAM,gBAAgB,GAAG,yBAAyB,CAAC,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,CAAC;QACpF,CAAC,CAAC,6BAA6B,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,CAAC,IAAI,CAAC;QAC9D,CAAC,CAAC,KAAK,CAAC;IACT,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9D,OAAO;QACN,gBAAgB;QAChB,iBAAiB;QACjB,SAAS,EAAE,gBAAgB,IAAI,CAAC,iBAAiB;KACjD,CAAC;AAAA,CACF","sourcesContent":["// @ts-nocheck\nimport type { Message } from \"@ashx-j/lunr-ai\";\nimport { isMutatingBashCommand } from \"./long-running-guard.ts\";\nimport { expectsImplementationMutation } from \"./task-intent.ts\";\n\nexport { expectsImplementationMutation };\n\nconst READ_ONLY_BUILTIN_TOOLS = new Set([\n\t\"read\",\n\t\"grep\",\n\t\"find\",\n\t\"ls\",\n\t\"web_search\",\n\t\"fetch_content\",\n\t\"get_search_content\",\n\t\"intercom\",\n\t\"contact_supervisor\",\n]);\n\ninterface CompletionMutationGuardInput {\n\tpermissions: \"full\" | \"read-only\";\n\ttask: string;\n\tmessages: Message[];\n\ttools?: string[];\n\tmcpDirectTools?: string[];\n}\n\ninterface CompletionMutationGuardResult {\n\texpectedMutation: boolean;\n\tattemptedMutation: boolean;\n\ttriggered: boolean;\n}\n\nexport function hasMutationToolCapability(tools: string[] | undefined, mcpDirectTools: string[] | undefined): boolean {\n\tif (tools === undefined || tools.length === 0 || (mcpDirectTools?.length ?? 0) > 0) return true;\n\treturn !tools.every((tool) => READ_ONLY_BUILTIN_TOOLS.has(tool));\n}\n\nexport function hasMutationToolCall(messages: Message[]): boolean {\n\tfor (const message of messages) {\n\t\tif (message.role !== \"assistant\") continue;\n\t\tfor (const part of message.content) {\n\t\t\tif (part.type !== \"toolCall\") continue;\n\t\t\tif (part.name === \"edit\" || part.name === \"write\") return true;\n\t\t\tif (part.name !== \"bash\") continue;\n\t\t\tconst args = typeof part.arguments === \"object\" && part.arguments !== null && !Array.isArray(part.arguments)\n\t\t\t\t? part.arguments as Record<string, unknown>\n\t\t\t\t: {};\n\t\t\tif (typeof args.command === \"string\" && isMutatingBashCommand(args.command)) return true;\n\t\t}\n\t}\n\treturn false;\n}\n\nexport function evaluateCompletionMutationGuard(input: CompletionMutationGuardInput): CompletionMutationGuardResult {\n\tconst expectedMutation = hasMutationToolCapability(input.tools, input.mcpDirectTools)\n\t\t? expectsImplementationMutation(input.permissions, input.task)\n\t\t: false;\n\tconst attemptedMutation = hasMutationToolCall(input.messages);\n\treturn {\n\t\texpectedMutation,\n\t\tattemptedMutation,\n\t\ttriggered: expectedMutation && !attemptedMutation,\n\t};\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  export interface RunnerSubagentStep {
2
+ completionTask?: string;
2
3
  /** Session id of the direct parent session for permission-system ask forwarding. */
3
4
  parentSessionId?: string;
4
5
  /** Live parent permission mode snapshotted at spawn. */
@@ -1 +1 @@
1
- {"version":3,"file":"parallel-utils.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent?: string;\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: \"full\" | \"read-only\";\n\ttier?: import(\"../../shared/types.ts\").ChildTier;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: import(\"../../shared/types.ts\").ModelSelection;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = Number.MAX_SAFE_INTEGER;\n"]}
1
+ {"version":3,"file":"parallel-utils.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\tcompletionTask?: string;\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent?: string;\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: \"full\" | \"read-only\";\n\ttier?: import(\"../../shared/types.ts\").ChildTier;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: import(\"../../shared/types.ts\").ModelSelection;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = Number.MAX_SAFE_INTEGER;\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"parallel-utils.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent?: string;\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: \"full\" | \"read-only\";\n\ttier?: import(\"../../shared/types.ts\").ChildTier;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: import(\"../../shared/types.ts\").ModelSelection;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = Number.MAX_SAFE_INTEGER;\n"]}
1
+ {"version":3,"file":"parallel-utils.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nexport interface RunnerSubagentStep {\n\tcompletionTask?: string;\n\t/** Session id of the direct parent session for permission-system ask forwarding. */\n\tparentSessionId?: string;\n\t/** Live parent permission mode snapshotted at spawn. */\n\tparentPermissionMode?: string;\n\tagent?: string;\n\tchildId?: string;\n\tdescription?: string;\n\tpermissions?: \"full\" | \"read-only\";\n\ttier?: import(\"../../shared/types.ts\").ChildTier;\n\ttask: string;\n\timportAsyncRoot?: {\n\t\trunId: string;\n\t\tasyncDir: string;\n\t\tresultPath: string;\n\t\tindex: number;\n\t};\n\tphase?: string;\n\tlabel?: string;\n\toutputName?: string;\n\tstructured?: boolean;\n\tcwd?: string;\n\tmodel?: string;\n\tthinking?: string;\n\tmodelSelection?: import(\"../../shared/types.ts\").ModelSelection;\n\tmodelCandidates?: string[];\n\ttools?: string[];\n\textensions?: string[];\n\tsubagentOnlyExtensions?: string[];\n\tmcpDirectTools?: string[];\n\tcompletionGuard?: boolean;\n\tsystemPrompt?: string | null;\n\tsystemPromptMode?: \"append\" | \"replace\";\n\tinheritProjectContext: boolean;\n\tinheritSkills: boolean;\n\tskills?: string[];\n\toutputPath?: string;\n\t/** Defer the authoritative output instruction until a dynamic fanout item is materialized. */\n\tnamespaceOutputPath?: boolean;\n\toutputMode?: \"inline\" | \"file-only\";\n\tsessionFile?: string;\n\tmaxSubagentDepth?: number;\n\twaitToolEnabled?: boolean;\n\tstructuredOutput?: {\n\t\tschema: import(\"../../shared/types.ts\").JsonSchemaObject;\n\t\tschemaPath: string;\n\t\toutputPath: string;\n\t};\n\tstructuredOutputSchema?: import(\"../../shared/types.ts\").JsonSchemaObject;\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n\ttoolBudget?: import(\"../../shared/types.ts\").ResolvedToolBudget;\n}\n\nexport interface ParallelStepGroup {\n\tparallel: RunnerSubagentStep[];\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tworktree?: boolean;\n}\n\nexport interface DynamicRunnerGroup {\n\texpand: import(\"../../shared/settings.ts\").DynamicExpandSpec;\n\tparallel: RunnerSubagentStep;\n\tcollect: import(\"../../shared/settings.ts\").DynamicCollectSpec;\n\tconcurrency?: number;\n\tfailFast?: boolean;\n\tphase?: string;\n\tlabel?: string;\n\tsessionFiles?: (string | undefined)[];\n\tthinkingOverrides?: (string | undefined)[];\n\teffectiveAcceptance?: import(\"../../shared/types.ts\").ResolvedAcceptanceConfig;\n\tacceptanceInput?: import(\"../../shared/types.ts\").AcceptanceInput;\n\tacceptanceRole?: import(\"../../shared/types.ts\").AcceptanceRole;\n}\n\nexport type RunnerStep = RunnerSubagentStep | ParallelStepGroup | DynamicRunnerGroup;\n\nexport function isParallelGroup(step: RunnerStep): step is ParallelStepGroup {\n\treturn \"parallel\" in step && Array.isArray(step.parallel);\n}\n\nexport function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup {\n\treturn \"expand\" in step && \"collect\" in step && \"parallel\" in step && !Array.isArray((step as { parallel?: unknown }).parallel);\n}\n\nexport function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[] {\n\tconst flat: RunnerSubagentStep[] = [];\n\tfor (const step of steps) {\n\t\tif (isParallelGroup(step)) {\n\t\t\tfor (const task of step.parallel) flat.push(task);\n\t\t} else if (isDynamicRunnerGroup(step)) {\n\t\t\tcontinue;\n\t\t} else {\n\t\t\tflat.push(step);\n\t\t}\n\t}\n\treturn flat;\n}\n\nexport const DEFAULT_GLOBAL_CONCURRENCY_LIMIT = Number.MAX_SAFE_INTEGER;\n\n// lunr: stagger parallel cold starts so the first child's response begins\n// (creating the Anthropic cache entry) before siblings fire identical\n// system prompts. Sequential mode (limit=1) is untouched.\nconst PARALLEL_COLD_START_STAGGER_MS = 1000;\n\n/**\n * A promise-based semaphore for limiting concurrent access across multiple\n * mapConcurrent calls within a single run. Enforces a global cap on the total\n * number of subagent tasks executing simultaneously, regardless of each step's\n * per-step concurrency limit.\n */\nexport class Semaphore {\n\tprivate available: number;\n\tprivate readonly queue: Array<() => void> = [];\n\n\tconstructor(limit: number) {\n\t\tthis.available = Math.max(1, Math.floor(limit) || 1);\n\t}\n\n\tacquire(): Promise<void> {\n\t\tif (this.available > 0) {\n\t\t\tthis.available--;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise<void>((resolve) => {\n\t\t\tthis.queue.push(resolve);\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) {\n\t\t\tnext();\n\t\t} else {\n\t\t\tthis.available++;\n\t\t}\n\t}\n}\n\nexport async function mapConcurrent<T, R>(\n\titems: T[],\n\tlimit: number,\n\tfn: (item: T, i: number) => Promise<R>,\n\tglobalSemaphore?: Semaphore,\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tlet next = 0;\n\n\tasync function worker(_workerIndex: number): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tif (safeLimit > 1 && i > 0 && PARALLEL_COLD_START_STAGGER_MS > 0) {\n\t\t\t\tawait new Promise<void>((resolve) => {\n\t\t\t\t\tsetTimeout(resolve, PARALLEL_COLD_START_STAGGER_MS * i);\n\t\t\t\t});\n\t\t\t}\n\t\t\tif (globalSemaphore) {\n\t\t\t\tawait globalSemaphore.acquire();\n\t\t\t\ttry {\n\t\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t\t} finally {\n\t\t\t\t\tglobalSemaphore.release();\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(\n\t\tArray.from({ length: Math.min(safeLimit, items.length) }, (_, wi) => worker(wi)),\n\t);\n\treturn results;\n}\n\nexport interface ParallelTaskResult {\n\tagent: string;\n\ttaskIndex?: number;\n\toutput: string;\n\texitCode: number | null;\n\terror?: string;\n\ttimedOut?: boolean;\n\tmodel?: string;\n\tattemptedModels?: string[];\n\toutputTargetPath?: string;\n\toutputTargetExists?: boolean;\n}\n\nexport function aggregateParallelOutputs(\n\tresults: ParallelTaskResult[],\n\theaderFormat: (index: number, agent: string) => string = (i, agent) =>\n\t\t`=== Parallel Task ${i + 1} (${agent}) ===`,\n): string {\n\treturn results\n\t\t.map((r, i) => {\n\t\t\tconst header = headerFormat(r.taskIndex ?? i, r.agent);\n\t\t\tconst hasOutput = Boolean(r.output?.trim());\n\t\t\tconst status =\n\t\t\t\tr.timedOut\n\t\t\t\t\t? `TIMED OUT${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t: r.exitCode === -1\n\t\t\t\t\t? \"SKIPPED\"\n\t\t\t\t\t: r.exitCode !== 0 && r.exitCode !== null\n\t\t\t\t\t\t? `FAILED (exit code ${r.exitCode})${r.error ? `: ${r.error}` : \"\"}`\n\t\t\t\t\t\t: r.error\n\t\t\t\t\t\t\t? `WARNING: ${r.error}`\n\t\t\t\t\t\t\t: !hasOutput && r.outputTargetPath && r.outputTargetExists === false\n\t\t\t\t\t\t\t\t? `EMPTY OUTPUT (expected output file missing: ${r.outputTargetPath})`\n\t\t\t\t\t\t\t\t: !hasOutput && !r.outputTargetPath\n\t\t\t\t\t\t\t\t\t? \"EMPTY OUTPUT (no textual response returned)\"\n\t\t\t\t\t\t\t: \"\";\n\t\t\tconst body = status ? (hasOutput ? `${status}\\n${r.output}` : status) : r.output;\n\t\t\treturn `${header}\\n${body}`;\n\t\t})\n\t\t.join(\"\\n\\n\");\n}\n\nexport const MAX_PARALLEL_CONCURRENCY = Number.MAX_SAFE_INTEGER;\n"]}
@@ -4,6 +4,7 @@ import { type ChildWatchdogConfig } from "../../watchdog/child-status.ts";
4
4
  export declare const SUBAGENT_CHILD_ENV = "PI_SUBAGENT_CHILD";
5
5
  export declare const SUBAGENT_ORCHESTRATOR_TARGET_ENV = "PI_SUBAGENT_ORCHESTRATOR_TARGET";
6
6
  export declare const SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV = "PI_SUBAGENT_ORCHESTRATOR_SESSION_ID";
7
+ export declare const SUBAGENT_SUPERVISOR_SESSION_ID_ENV = "PI_SUBAGENT_SUPERVISOR_SESSION_ID";
7
8
  export declare const SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV = "PI_SUBAGENT_SUPERVISOR_CHANNEL_DIR";
8
9
  export declare const SUBAGENT_RUN_ID_ENV = "PI_SUBAGENT_RUN_ID";
9
10
  export declare const SUBAGENT_CHILD_AGENT_ENV = "PI_SUBAGENT_CHILD_AGENT";
@@ -25,6 +26,8 @@ export declare const SUBAGENT_STEER_CAPABILITY_ENV = "PI_SUBAGENT_STEER_CAPABILI
25
26
  export declare const SUBAGENT_STEER_ACK_DIR_ENV = "PI_SUBAGENT_STEER_ACK_DIR";
26
27
  interface BuildPiArgsInput {
27
28
  parentSessionId?: string;
29
+ /** Run ownership is a session file or in-memory UUID; parentSessionId remains the routing UUID. */
30
+ supervisorSessionId?: string;
28
31
  baseArgs: string[];
29
32
  task: string;
30
33
  sessionEnabled: boolean;
@@ -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":"AAKA,OAAO,EAAuB,kBAAkB,EAAE,KAAK,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGjG,OAAO,EAAiB,KAAK,gBAAgB,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAItG,OAAO,EAAwD,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAchI,eAAO,MAAM,kBAAkB,sBAAsB,CAAC;AACtD,eAAO,MAAM,gCAAgC,oCAAoC,CAAC;AAClF,eAAO,MAAM,oCAAoC,wCAAwC,CAAC;AAC1F,eAAO,MAAM,mCAAmC,uCAAuC,CAAC;AACxF,eAAO,MAAM,mBAAmB,uBAAuB,CAAC;AACxD,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAClE,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAClE,eAAO,MAAM,yBAAyB,6BAA6B,CAAC;AACpE,eAAO,MAAM,8BAA8B,kCAAkC,CAAC;AAC9E,eAAO,MAAM,iCAAiC,qCAAqC,CAAC;AACpF,eAAO,MAAM,+BAA+B,mCAAmC,CAAC;AAChF,eAAO,MAAM,0BAA0B,8BAA8B,CAAC;AACtE,eAAO,MAAM,+BAA+B,mCAAmC,CAAC;AAChF,eAAO,MAAM,yBAAyB,6BAA6B,CAAC;AACpE,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAClE,eAAO,MAAM,oCAAoC,wCAAwC,CAAC;AAC1F,eAAO,MAAM,2BAA2B,+BAA+B,CAAC;AACxE,eAAO,MAAM,mCAAmC,uCAAuC,CAAC;AACxF,eAAO,MAAM,6BAA6B,iCAAiC,CAAC;AAC5E,eAAO,MAAM,wBAAwB,4BAA4B,CAAC;AAClE,eAAO,MAAM,6BAA6B,iCAAiC,CAAC;AAC5E,eAAO,MAAM,0BAA0B,8BAA8B,CAAC;AAEtE,UAAU,gBAAgB;IACzB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE,OAAO,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAC1B,gBAAgB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACxC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,0BAA0B,CAAC,EAAE,MAAM,CAAC;IACpC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,eAAe,EAAE,CAAC;IAC/B,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE;QAClB,MAAM,EAAE,gBAAgB,CAAC;QACzB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,aAAa,CAAC,EAAE,mBAAmB,CAAC;IACpC,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,eAAe,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IACvC,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,UAAU,iBAAiB;IAC1B,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;IACxC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAUD,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS,EAAE,eAAe,UAAQ,GAAG,MAAM,GAAG,SAAS,CAOhJ;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,GAAG,iBAAiB,CA2LtE;AAED,eAAO,MAAM,kBAAkB,2BAAqB,CAAC;AAErD,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,IAAI,CAOvE","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_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\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\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
@@ -27,6 +28,7 @@ const FANOUT_CHILD_EXTENSION_PATH = resolveRuntimeScriptPath(path.join(path.dirn
27
28
  export const SUBAGENT_CHILD_ENV = "PI_SUBAGENT_CHILD";
28
29
  export const SUBAGENT_ORCHESTRATOR_TARGET_ENV = "PI_SUBAGENT_ORCHESTRATOR_TARGET";
29
30
  export const SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV = "PI_SUBAGENT_ORCHESTRATOR_SESSION_ID";
31
+ export const SUBAGENT_SUPERVISOR_SESSION_ID_ENV = "PI_SUBAGENT_SUPERVISOR_SESSION_ID";
30
32
  export const SUBAGENT_SUPERVISOR_CHANNEL_DIR_ENV = "PI_SUBAGENT_SUPERVISOR_CHANNEL_DIR";
31
33
  export const SUBAGENT_RUN_ID_ENV = "PI_SUBAGENT_RUN_ID";
32
34
  export const SUBAGENT_CHILD_AGENT_ENV = "PI_SUBAGENT_CHILD_AGENT";
@@ -204,6 +206,9 @@ export function buildPiArgs(input) {
204
206
  if (input.parentSessionId) {
205
207
  env[SUBAGENT_ORCHESTRATOR_SESSION_ID_ENV] = input.parentSessionId;
206
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 ?? "";
207
212
  if (input.parentSessionId && input.runId && (input.childId || input.childAgentName)) {
208
213
  const childIndex = input.childIndex ?? 0;
209
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_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\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\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"}`;