@ashx-j/lunr 0.2.25 → 0.2.27

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 (729) hide show
  1. package/CHANGELOG.md +31 -1
  2. package/LICENSE +22 -0
  3. package/dist/builtin-extensions/ashxj-thinking.d.ts +1 -1
  4. package/dist/builtin-extensions/ashxj-thinking.d.ts.map +1 -1
  5. package/dist/builtin-extensions/ashxj-thinking.js +1 -1
  6. package/dist/builtin-extensions/ashxj-thinking.js.map +1 -1
  7. package/dist/builtin-extensions/ashxj-tui.d.ts +11 -1
  8. package/dist/builtin-extensions/ashxj-tui.d.ts.map +1 -1
  9. package/dist/builtin-extensions/ashxj-tui.js +6 -10
  10. package/dist/builtin-extensions/ashxj-tui.js.map +1 -1
  11. package/dist/builtin-extensions/index.d.ts.map +1 -1
  12. package/dist/builtin-extensions/index.js +1 -0
  13. package/dist/builtin-extensions/index.js.map +1 -1
  14. package/dist/builtin-extensions/lunr-computer-use.d.ts +3 -0
  15. package/dist/builtin-extensions/lunr-computer-use.d.ts.map +1 -0
  16. package/dist/builtin-extensions/lunr-computer-use.js +179 -0
  17. package/dist/builtin-extensions/lunr-computer-use.js.map +1 -0
  18. package/dist/builtin-extensions/lunr-cron.d.ts +4 -5
  19. package/dist/builtin-extensions/lunr-cron.d.ts.map +1 -1
  20. package/dist/builtin-extensions/lunr-cron.js +94 -108
  21. package/dist/builtin-extensions/lunr-cron.js.map +1 -1
  22. package/dist/builtin-extensions/lunr-local-providers/local-servers.d.ts.map +1 -1
  23. package/dist/builtin-extensions/lunr-local-providers/local-servers.js +3 -1
  24. package/dist/builtin-extensions/lunr-local-providers/local-servers.js.map +1 -1
  25. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.d.ts.map +1 -1
  26. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js +2 -2
  27. package/dist/builtin-extensions/narumiruna-pi-goal/src/commands.js.map +1 -1
  28. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.d.ts.map +1 -1
  29. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js +1 -1
  30. package/dist/builtin-extensions/narumiruna-pi-goal/src/goal.js.map +1 -1
  31. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.d.ts.map +1 -1
  32. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js +1 -1
  33. package/dist/builtin-extensions/narumiruna-pi-goal/src/runtime.js.map +1 -1
  34. package/dist/builtin-extensions/pi-intercom/index.d.ts.map +1 -1
  35. package/dist/builtin-extensions/pi-intercom/index.js +2 -2
  36. package/dist/builtin-extensions/pi-intercom/index.js.map +1 -1
  37. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts +1 -1
  38. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.d.ts.map +1 -1
  39. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js +1 -1
  40. package/dist/builtin-extensions/pi-lsp-extension/bemol-extension/index.js.map +1 -1
  41. package/dist/builtin-extensions/pi-lsp-extension/src/index.d.ts.map +1 -1
  42. package/dist/builtin-extensions/pi-lsp-extension/src/index.js +1 -15
  43. package/dist/builtin-extensions/pi-lsp-extension/src/index.js.map +1 -1
  44. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts +6 -0
  45. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.d.ts.map +1 -1
  46. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js +187 -132
  47. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-client.js.map +1 -1
  48. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts +8 -0
  49. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.d.ts.map +1 -1
  50. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js +142 -112
  51. package/dist/builtin-extensions/pi-lsp-extension/src/lsp-manager.js.map +1 -1
  52. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts +12 -1
  53. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.d.ts.map +1 -1
  54. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js +14 -7
  55. package/dist/builtin-extensions/pi-lsp-extension/src/tools/code-rewrite.js.map +1 -1
  56. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts +11 -3
  57. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.d.ts.map +1 -1
  58. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js +67 -41
  59. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/rewrite-engine.js.map +1 -1
  60. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts +4 -2
  61. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.d.ts.map +1 -1
  62. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js +3 -0
  63. package/dist/builtin-extensions/pi-lsp-extension/src/tree-sitter/search-engine.js.map +1 -1
  64. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts +2 -1
  65. package/dist/builtin-extensions/pi-mcp-adapter/commands.d.ts.map +1 -1
  66. package/dist/builtin-extensions/pi-mcp-adapter/commands.js +6 -6
  67. package/dist/builtin-extensions/pi-mcp-adapter/commands.js.map +1 -1
  68. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts +1 -1
  69. package/dist/builtin-extensions/pi-mcp-adapter/config.d.ts.map +1 -1
  70. package/dist/builtin-extensions/pi-mcp-adapter/config.js +11 -5
  71. package/dist/builtin-extensions/pi-mcp-adapter/config.js.map +1 -1
  72. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.d.ts.map +1 -1
  73. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js +2 -2
  74. package/dist/builtin-extensions/pi-mcp-adapter/direct-tool-executor.js.map +1 -1
  75. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.d.ts.map +1 -1
  76. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js +1 -1
  77. package/dist/builtin-extensions/pi-mcp-adapter/host-html-template.js.map +1 -1
  78. package/dist/builtin-extensions/pi-mcp-adapter/index.d.ts.map +1 -1
  79. package/dist/builtin-extensions/pi-mcp-adapter/index.js +48 -40
  80. package/dist/builtin-extensions/pi-mcp-adapter/index.js.map +1 -1
  81. package/dist/builtin-extensions/pi-mcp-adapter/init.d.ts.map +1 -1
  82. package/dist/builtin-extensions/pi-mcp-adapter/init.js +3 -1
  83. package/dist/builtin-extensions/pi-mcp-adapter/init.js.map +1 -1
  84. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts +12 -40
  85. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.d.ts.map +1 -1
  86. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js +166 -235
  87. package/dist/builtin-extensions/pi-mcp-adapter/mcp-auth-flow.js.map +1 -1
  88. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts +5 -0
  89. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.d.ts.map +1 -1
  90. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js +43 -13
  91. package/dist/builtin-extensions/pi-mcp-adapter/mcp-callback-server.js.map +1 -1
  92. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts +14 -3
  93. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.d.ts.map +1 -1
  94. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js +73 -21
  95. package/dist/builtin-extensions/pi-mcp-adapter/mcp-oauth-provider.js.map +1 -1
  96. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.d.ts.map +1 -1
  97. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js +4 -4
  98. package/dist/builtin-extensions/pi-mcp-adapter/proxy-modes.js.map +1 -1
  99. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.d.ts.map +1 -1
  100. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js +2 -2
  101. package/dist/builtin-extensions/pi-mcp-adapter/server-manager.js.map +1 -1
  102. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts +2 -0
  103. package/dist/builtin-extensions/pi-mcp-adapter/state.d.ts.map +1 -1
  104. package/dist/builtin-extensions/pi-mcp-adapter/state.js.map +1 -1
  105. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts +1 -1
  106. package/dist/builtin-extensions/pi-ollama-cloud/index.d.ts.map +1 -1
  107. package/dist/builtin-extensions/pi-ollama-cloud/index.js +1 -1
  108. package/dist/builtin-extensions/pi-ollama-cloud/index.js.map +1 -1
  109. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts +11 -5
  110. package/dist/builtin-extensions/pi-ollama-cloud/models.d.ts.map +1 -1
  111. package/dist/builtin-extensions/pi-ollama-cloud/models.js +12 -32
  112. package/dist/builtin-extensions/pi-ollama-cloud/models.js.map +1 -1
  113. package/dist/builtin-extensions/pi-prompt-template-model/index.d.ts.map +1 -1
  114. package/dist/builtin-extensions/pi-prompt-template-model/index.js +5 -3
  115. package/dist/builtin-extensions/pi-prompt-template-model/index.js.map +1 -1
  116. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts +2 -1
  117. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.d.ts.map +1 -1
  118. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js +21 -12
  119. package/dist/builtin-extensions/pi-prompt-template-model/prompt-loader.js.map +1 -1
  120. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.d.ts.map +1 -1
  121. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js +7 -24
  122. package/dist/builtin-extensions/pi-prompt-template-model/tool-manager.js.map +1 -1
  123. package/dist/builtin-extensions/pi-subagents/src/extension/index.d.ts.map +1 -1
  124. package/dist/builtin-extensions/pi-subagents/src/extension/index.js +39 -77
  125. package/dist/builtin-extensions/pi-subagents/src/extension/index.js.map +1 -1
  126. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.d.ts.map +1 -1
  127. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js +1 -1
  128. package/dist/builtin-extensions/pi-subagents/src/extension/schemas.js.map +1 -1
  129. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts +4 -4
  130. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.d.ts.map +1 -1
  131. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js +8 -5
  132. package/dist/builtin-extensions/pi-subagents/src/extension/tool-description.js.map +1 -1
  133. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts +1 -1
  134. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.d.ts.map +1 -1
  135. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js +15 -31
  136. package/dist/builtin-extensions/pi-subagents/src/runs/background/notify.js.map +1 -1
  137. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.d.ts.map +1 -1
  138. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js +7 -2
  139. package/dist/builtin-extensions/pi-subagents/src/runs/background/result-watcher.js.map +1 -1
  140. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts +1 -0
  141. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.d.ts.map +1 -1
  142. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js +21 -4
  143. package/dist/builtin-extensions/pi-subagents/src/runs/background/subagent-runner.js.map +1 -1
  144. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.d.ts.map +1 -1
  145. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js +11 -4
  146. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/chain-execution.js.map +1 -1
  147. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.d.ts.map +1 -1
  148. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js +121 -25
  149. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/execution.js.map +1 -1
  150. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.d.ts.map +1 -1
  151. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js +25 -5
  152. package/dist/builtin-extensions/pi-subagents/src/runs/foreground/subagent-executor.js.map +1 -1
  153. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.d.ts +1 -0
  154. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.d.ts.map +1 -1
  155. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js +5 -0
  156. package/dist/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.js.map +1 -1
  157. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts +1 -1
  158. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.d.ts.map +1 -1
  159. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js +2 -0
  160. package/dist/builtin-extensions/pi-subagents/src/runs/shared/child-tools.js.map +1 -1
  161. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts +1 -1
  162. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.d.ts.map +1 -1
  163. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js +1 -1
  164. package/dist/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.js.map +1 -1
  165. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts +7 -8
  166. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.d.ts.map +1 -1
  167. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js +60 -32
  168. package/dist/builtin-extensions/pi-subagents/src/runs/shared/parallel-utils.js.map +1 -1
  169. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts +1 -1
  170. package/dist/builtin-extensions/pi-subagents/src/shared/utils.d.ts.map +1 -1
  171. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js +15 -5
  172. package/dist/builtin-extensions/pi-subagents/src/shared/utils.js.map +1 -1
  173. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.d.ts.map +1 -1
  174. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js +4 -3
  175. package/dist/builtin-extensions/pi-subagents/src/slash/prompt-workflows.js.map +1 -1
  176. package/dist/builtin-extensions/pi-subagents/src/tui/communication.d.ts.map +1 -1
  177. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js +1 -1
  178. package/dist/builtin-extensions/pi-subagents/src/tui/communication.js.map +1 -1
  179. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts +2 -1
  180. package/dist/builtin-extensions/pi-subagents/src/tui/render.d.ts.map +1 -1
  181. package/dist/builtin-extensions/pi-subagents/src/tui/render.js +22 -11
  182. package/dist/builtin-extensions/pi-subagents/src/tui/render.js.map +1 -1
  183. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.d.ts.map +1 -1
  184. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js +3 -3
  185. package/dist/builtin-extensions/pi-subagents/src/watchdog/review.js.map +1 -1
  186. package/dist/builtin-extensions/pi-tps.d.ts.map +1 -1
  187. package/dist/builtin-extensions/pi-tps.js +20 -17
  188. package/dist/builtin-extensions/pi-tps.js.map +1 -1
  189. package/dist/builtin-extensions/pi-web-access/activity.d.ts +1 -0
  190. package/dist/builtin-extensions/pi-web-access/activity.d.ts.map +1 -1
  191. package/dist/builtin-extensions/pi-web-access/activity.js +27 -5
  192. package/dist/builtin-extensions/pi-web-access/activity.js.map +1 -1
  193. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts +3 -0
  194. package/dist/builtin-extensions/pi-web-access/bounded-body.d.ts.map +1 -0
  195. package/dist/builtin-extensions/pi-web-access/bounded-body.js +43 -0
  196. package/dist/builtin-extensions/pi-web-access/bounded-body.js.map +1 -0
  197. package/dist/builtin-extensions/pi-web-access/content-page.d.ts +24 -0
  198. package/dist/builtin-extensions/pi-web-access/content-page.d.ts.map +1 -0
  199. package/dist/builtin-extensions/pi-web-access/content-page.js +57 -0
  200. package/dist/builtin-extensions/pi-web-access/content-page.js.map +1 -0
  201. package/dist/builtin-extensions/pi-web-access/extract.d.ts.map +1 -1
  202. package/dist/builtin-extensions/pi-web-access/extract.js +7 -2
  203. package/dist/builtin-extensions/pi-web-access/extract.js.map +1 -1
  204. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts +0 -1
  205. package/dist/builtin-extensions/pi-web-access/github-extract.d.ts.map +1 -1
  206. package/dist/builtin-extensions/pi-web-access/github-extract.js +147 -36
  207. package/dist/builtin-extensions/pi-web-access/github-extract.js.map +1 -1
  208. package/dist/builtin-extensions/pi-web-access/index.d.ts.map +1 -1
  209. package/dist/builtin-extensions/pi-web-access/index.js +48 -73
  210. package/dist/builtin-extensions/pi-web-access/index.js.map +1 -1
  211. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts +12 -4
  212. package/dist/builtin-extensions/pi-web-access/session-cleanup.d.ts.map +1 -1
  213. package/dist/builtin-extensions/pi-web-access/session-cleanup.js +35 -12
  214. package/dist/builtin-extensions/pi-web-access/session-cleanup.js.map +1 -1
  215. package/dist/builtin-extensions/pi-web-access/storage.d.ts +9 -6
  216. package/dist/builtin-extensions/pi-web-access/storage.d.ts.map +1 -1
  217. package/dist/builtin-extensions/pi-web-access/storage.js +36 -24
  218. package/dist/builtin-extensions/pi-web-access/storage.js.map +1 -1
  219. package/dist/builtin-extensions/simple-pi-memory.d.ts +1 -1
  220. package/dist/builtin-extensions/simple-pi-memory.d.ts.map +1 -1
  221. package/dist/builtin-extensions/simple-pi-memory.js +1 -1
  222. package/dist/builtin-extensions/simple-pi-memory.js.map +1 -1
  223. package/dist/cli/install-cli.d.ts.map +1 -1
  224. package/dist/cli/install-cli.js +38 -30
  225. package/dist/cli/install-cli.js.map +1 -1
  226. package/dist/core/agent-session-runtime.d.ts +13 -0
  227. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  228. package/dist/core/agent-session-runtime.js +75 -11
  229. package/dist/core/agent-session-runtime.js.map +1 -1
  230. package/dist/core/agent-session-services.d.ts +1 -0
  231. package/dist/core/agent-session-services.d.ts.map +1 -1
  232. package/dist/core/agent-session-services.js +1 -0
  233. package/dist/core/agent-session-services.js.map +1 -1
  234. package/dist/core/agent-session.d.ts +40 -6
  235. package/dist/core/agent-session.d.ts.map +1 -1
  236. package/dist/core/agent-session.js +309 -76
  237. package/dist/core/agent-session.js.map +1 -1
  238. package/dist/core/browser/runtime.d.ts +2 -0
  239. package/dist/core/browser/runtime.d.ts.map +1 -1
  240. package/dist/core/browser/runtime.js +80 -45
  241. package/dist/core/browser/runtime.js.map +1 -1
  242. package/dist/core/browser/setup.d.ts.map +1 -1
  243. package/dist/core/browser/setup.js +12 -1
  244. package/dist/core/browser/setup.js.map +1 -1
  245. package/dist/core/computer-use/adapter.d.ts +28 -0
  246. package/dist/core/computer-use/adapter.d.ts.map +1 -0
  247. package/dist/core/computer-use/adapter.js +138 -0
  248. package/dist/core/computer-use/adapter.js.map +1 -0
  249. package/dist/core/computer-use/image.d.ts +27 -0
  250. package/dist/core/computer-use/image.d.ts.map +1 -0
  251. package/dist/core/computer-use/image.js +84 -0
  252. package/dist/core/computer-use/image.js.map +1 -0
  253. package/dist/core/computer-use/lease.d.ts +18 -0
  254. package/dist/core/computer-use/lease.d.ts.map +1 -0
  255. package/dist/core/computer-use/lease.js +129 -0
  256. package/dist/core/computer-use/lease.js.map +1 -0
  257. package/dist/core/computer-use/macos-runtime.d.ts +14 -0
  258. package/dist/core/computer-use/macos-runtime.d.ts.map +1 -0
  259. package/dist/core/computer-use/macos-runtime.js +148 -0
  260. package/dist/core/computer-use/macos-runtime.js.map +1 -0
  261. package/dist/core/computer-use/policy.d.ts +19 -0
  262. package/dist/core/computer-use/policy.d.ts.map +1 -0
  263. package/dist/core/computer-use/policy.js +67 -0
  264. package/dist/core/computer-use/policy.js.map +1 -0
  265. package/dist/core/computer-use/release.generated.d.ts +31 -0
  266. package/dist/core/computer-use/release.generated.d.ts.map +1 -0
  267. package/dist/core/computer-use/release.generated.js +36 -0
  268. package/dist/core/computer-use/release.generated.js.map +1 -0
  269. package/dist/core/computer-use/runtime.d.ts +13 -0
  270. package/dist/core/computer-use/runtime.d.ts.map +1 -0
  271. package/dist/core/computer-use/runtime.js +158 -0
  272. package/dist/core/computer-use/runtime.js.map +1 -0
  273. package/dist/core/computer-use/schemas.d.ts +100 -0
  274. package/dist/core/computer-use/schemas.d.ts.map +1 -0
  275. package/dist/core/computer-use/schemas.js +96 -0
  276. package/dist/core/computer-use/schemas.js.map +1 -0
  277. package/dist/core/computer-use/windows-desktop.d.ts +3 -0
  278. package/dist/core/computer-use/windows-desktop.d.ts.map +1 -0
  279. package/dist/core/computer-use/windows-desktop.js +48 -0
  280. package/dist/core/computer-use/windows-desktop.js.map +1 -0
  281. package/dist/core/computer-use/workflow.d.ts +38 -0
  282. package/dist/core/computer-use/workflow.d.ts.map +1 -0
  283. package/dist/core/computer-use/workflow.js +900 -0
  284. package/dist/core/computer-use/workflow.js.map +1 -0
  285. package/dist/core/cron/jobs.d.ts +26 -8
  286. package/dist/core/cron/jobs.d.ts.map +1 -1
  287. package/dist/core/cron/jobs.js +357 -232
  288. package/dist/core/cron/jobs.js.map +1 -1
  289. package/dist/core/cron/origin-context.d.ts +1 -0
  290. package/dist/core/cron/origin-context.d.ts.map +1 -1
  291. package/dist/core/cron/origin-context.js.map +1 -1
  292. package/dist/core/cron/scheduler.d.ts +22 -17
  293. package/dist/core/cron/scheduler.d.ts.map +1 -1
  294. package/dist/core/cron/scheduler.js +153 -73
  295. package/dist/core/cron/scheduler.js.map +1 -1
  296. package/dist/core/extensions/index.d.ts +1 -1
  297. package/dist/core/extensions/index.d.ts.map +1 -1
  298. package/dist/core/extensions/index.js.map +1 -1
  299. package/dist/core/extensions/loader.d.ts.map +1 -1
  300. package/dist/core/extensions/loader.js +4 -0
  301. package/dist/core/extensions/loader.js.map +1 -1
  302. package/dist/core/extensions/runner.d.ts +1 -0
  303. package/dist/core/extensions/runner.d.ts.map +1 -1
  304. package/dist/core/extensions/runner.js +8 -0
  305. package/dist/core/extensions/runner.js.map +1 -1
  306. package/dist/core/extensions/types.d.ts +8 -0
  307. package/dist/core/extensions/types.d.ts.map +1 -1
  308. package/dist/core/extensions/types.js.map +1 -1
  309. package/dist/core/footer-data-provider.d.ts +4 -0
  310. package/dist/core/footer-data-provider.d.ts.map +1 -1
  311. package/dist/core/footer-data-provider.js +22 -1
  312. package/dist/core/footer-data-provider.js.map +1 -1
  313. package/dist/core/large-subagent-launch.d.ts +1 -1
  314. package/dist/core/large-subagent-launch.d.ts.map +1 -1
  315. package/dist/core/large-subagent-launch.js +7 -7
  316. package/dist/core/large-subagent-launch.js.map +1 -1
  317. package/dist/core/model-registry.d.ts +2 -0
  318. package/dist/core/model-registry.d.ts.map +1 -1
  319. package/dist/core/model-registry.js +5 -0
  320. package/dist/core/model-registry.js.map +1 -1
  321. package/dist/core/model-runtime.d.ts +4 -1
  322. package/dist/core/model-runtime.d.ts.map +1 -1
  323. package/dist/core/model-runtime.js +40 -4
  324. package/dist/core/model-runtime.js.map +1 -1
  325. package/dist/core/package-manager.d.ts.map +1 -1
  326. package/dist/core/package-manager.js.map +1 -1
  327. package/dist/core/permissions.d.ts +4 -4
  328. package/dist/core/permissions.d.ts.map +1 -1
  329. package/dist/core/permissions.js +25 -38
  330. package/dist/core/permissions.js.map +1 -1
  331. package/dist/core/plan-mode.d.ts +5 -13
  332. package/dist/core/plan-mode.d.ts.map +1 -1
  333. package/dist/core/plan-mode.js +135 -116
  334. package/dist/core/plan-mode.js.map +1 -1
  335. package/dist/core/project-trust.d.ts.map +1 -1
  336. package/dist/core/project-trust.js +1 -1
  337. package/dist/core/project-trust.js.map +1 -1
  338. package/dist/core/prompt-resource-bridge.d.ts +12 -0
  339. package/dist/core/prompt-resource-bridge.d.ts.map +1 -0
  340. package/dist/core/prompt-resource-bridge.js +9 -0
  341. package/dist/core/prompt-resource-bridge.js.map +1 -0
  342. package/dist/core/protected-targets.d.ts +6 -0
  343. package/dist/core/protected-targets.d.ts.map +1 -0
  344. package/dist/core/protected-targets.js +45 -0
  345. package/dist/core/protected-targets.js.map +1 -0
  346. package/dist/core/resource-loader.d.ts.map +1 -1
  347. package/dist/core/resource-loader.js +7 -0
  348. package/dist/core/resource-loader.js.map +1 -1
  349. package/dist/core/rollback.d.ts +19 -3
  350. package/dist/core/rollback.d.ts.map +1 -1
  351. package/dist/core/rollback.js +172 -56
  352. package/dist/core/rollback.js.map +1 -1
  353. package/dist/core/runtime-credentials.d.ts +3 -0
  354. package/dist/core/runtime-credentials.d.ts.map +1 -1
  355. package/dist/core/runtime-credentials.js +14 -1
  356. package/dist/core/runtime-credentials.js.map +1 -1
  357. package/dist/core/sdk.d.ts +3 -0
  358. package/dist/core/sdk.d.ts.map +1 -1
  359. package/dist/core/sdk.js +1 -0
  360. package/dist/core/sdk.js.map +1 -1
  361. package/dist/core/session-manager.d.ts +6 -0
  362. package/dist/core/session-manager.d.ts.map +1 -1
  363. package/dist/core/session-manager.js +95 -32
  364. package/dist/core/session-manager.js.map +1 -1
  365. package/dist/core/session-ownership.d.ts.map +1 -1
  366. package/dist/core/session-ownership.js +8 -3
  367. package/dist/core/session-ownership.js.map +1 -1
  368. package/dist/core/session-retention.d.ts.map +1 -1
  369. package/dist/core/session-retention.js +18 -7
  370. package/dist/core/session-retention.js.map +1 -1
  371. package/dist/core/session-startup-settings.d.ts +10 -0
  372. package/dist/core/session-startup-settings.d.ts.map +1 -0
  373. package/dist/core/session-startup-settings.js +70 -0
  374. package/dist/core/session-startup-settings.js.map +1 -0
  375. package/dist/core/settings-manager.d.ts +6 -0
  376. package/dist/core/settings-manager.d.ts.map +1 -1
  377. package/dist/core/settings-manager.js +19 -0
  378. package/dist/core/settings-manager.js.map +1 -1
  379. package/dist/core/subagent-event-transport.d.ts +3 -0
  380. package/dist/core/subagent-event-transport.d.ts.map +1 -0
  381. package/dist/core/subagent-event-transport.js +61 -0
  382. package/dist/core/subagent-event-transport.js.map +1 -0
  383. package/dist/core/subscriptions.d.ts +16 -7
  384. package/dist/core/subscriptions.d.ts.map +1 -1
  385. package/dist/core/subscriptions.js +96 -55
  386. package/dist/core/subscriptions.js.map +1 -1
  387. package/dist/core/trust-manager.d.ts +2 -1
  388. package/dist/core/trust-manager.d.ts.map +1 -1
  389. package/dist/core/trust-manager.js +6 -1
  390. package/dist/core/trust-manager.js.map +1 -1
  391. package/dist/core/update-check.d.ts.map +1 -1
  392. package/dist/core/update-check.js.map +1 -1
  393. package/dist/core/usage-adapters/kimi-coding.d.ts +2 -2
  394. package/dist/core/usage-adapters/kimi-coding.d.ts.map +1 -1
  395. package/dist/core/usage-adapters/kimi-coding.js +2 -2
  396. package/dist/core/usage-adapters/kimi-coding.js.map +1 -1
  397. package/dist/core/usage-adapters/openai-codex.d.ts +3 -2
  398. package/dist/core/usage-adapters/openai-codex.d.ts.map +1 -1
  399. package/dist/core/usage-adapters/openai-codex.js +3 -3
  400. package/dist/core/usage-adapters/openai-codex.js.map +1 -1
  401. package/dist/core/usage-adapters/xai.d.ts +2 -2
  402. package/dist/core/usage-adapters/xai.d.ts.map +1 -1
  403. package/dist/core/usage-adapters/xai.js +3 -3
  404. package/dist/core/usage-adapters/xai.js.map +1 -1
  405. package/dist/core/usage-adapters/zai.d.ts +2 -2
  406. package/dist/core/usage-adapters/zai.d.ts.map +1 -1
  407. package/dist/core/usage-adapters/zai.js +2 -2
  408. package/dist/core/usage-adapters/zai.js.map +1 -1
  409. package/dist/core/usage-service.d.ts +9 -2
  410. package/dist/core/usage-service.d.ts.map +1 -1
  411. package/dist/core/usage-service.js +95 -50
  412. package/dist/core/usage-service.js.map +1 -1
  413. package/dist/gateway/adapters/discord.d.ts.map +1 -1
  414. package/dist/gateway/adapters/discord.js +2 -2
  415. package/dist/gateway/adapters/discord.js.map +1 -1
  416. package/dist/gateway/agent-bridge.d.ts +9 -1
  417. package/dist/gateway/agent-bridge.d.ts.map +1 -1
  418. package/dist/gateway/agent-bridge.js +91 -37
  419. package/dist/gateway/agent-bridge.js.map +1 -1
  420. package/dist/gateway/approval.d.ts.map +1 -1
  421. package/dist/gateway/approval.js +3 -3
  422. package/dist/gateway/approval.js.map +1 -1
  423. package/dist/gateway/authz.d.ts +4 -4
  424. package/dist/gateway/authz.d.ts.map +1 -1
  425. package/dist/gateway/authz.js +8 -12
  426. package/dist/gateway/authz.js.map +1 -1
  427. package/dist/gateway/buttons.d.ts +8 -1
  428. package/dist/gateway/buttons.d.ts.map +1 -1
  429. package/dist/gateway/buttons.js +76 -18
  430. package/dist/gateway/buttons.js.map +1 -1
  431. package/dist/gateway/commands.d.ts +1 -0
  432. package/dist/gateway/commands.d.ts.map +1 -1
  433. package/dist/gateway/commands.js +12 -10
  434. package/dist/gateway/commands.js.map +1 -1
  435. package/dist/gateway/cron.d.ts +12 -11
  436. package/dist/gateway/cron.d.ts.map +1 -1
  437. package/dist/gateway/cron.js +85 -62
  438. package/dist/gateway/cron.js.map +1 -1
  439. package/dist/gateway/index.d.ts.map +1 -1
  440. package/dist/gateway/index.js +5 -4
  441. package/dist/gateway/index.js.map +1 -1
  442. package/dist/gateway/mobile-commands.d.ts +1 -0
  443. package/dist/gateway/mobile-commands.d.ts.map +1 -1
  444. package/dist/gateway/mobile-commands.js +64 -22
  445. package/dist/gateway/mobile-commands.js.map +1 -1
  446. package/dist/gateway/presenter.d.ts +12 -2
  447. package/dist/gateway/presenter.d.ts.map +1 -1
  448. package/dist/gateway/presenter.js +74 -39
  449. package/dist/gateway/presenter.js.map +1 -1
  450. package/dist/gateway/router.d.ts +2 -2
  451. package/dist/gateway/router.d.ts.map +1 -1
  452. package/dist/gateway/router.js +22 -9
  453. package/dist/gateway/router.js.map +1 -1
  454. package/dist/gateway/service.d.ts +2 -0
  455. package/dist/gateway/service.d.ts.map +1 -1
  456. package/dist/gateway/service.js +153 -0
  457. package/dist/gateway/service.js.map +1 -1
  458. package/dist/gateway/setup.d.ts.map +1 -1
  459. package/dist/gateway/setup.js +6 -4
  460. package/dist/gateway/setup.js.map +1 -1
  461. package/dist/main.d.ts.map +1 -1
  462. package/dist/main.js +86 -33
  463. package/dist/main.js.map +1 -1
  464. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  465. package/dist/modes/interactive/components/assistant-message.js +6 -4
  466. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  467. package/dist/modes/interactive/components/copyable-text.d.ts.map +1 -1
  468. package/dist/modes/interactive/components/copyable-text.js +3 -2
  469. package/dist/modes/interactive/components/copyable-text.js.map +1 -1
  470. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/extension-editor.js +1 -1
  472. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  473. package/dist/modes/interactive/components/settings-selector.d.ts +4 -0
  474. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  475. package/dist/modes/interactive/components/settings-selector.js +20 -0
  476. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  477. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  478. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  479. package/dist/modes/interactive/interactive-mode.js +104 -109
  480. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  481. package/dist/modes/interactive/smooth-streaming.d.ts.map +1 -1
  482. package/dist/modes/interactive/smooth-streaming.js.map +1 -1
  483. package/dist/modes/print-mode.d.ts.map +1 -1
  484. package/dist/modes/print-mode.js +9 -1
  485. package/dist/modes/print-mode.js.map +1 -1
  486. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  487. package/dist/modes/rpc/rpc-mode.js +2 -1
  488. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  489. package/dist/node-runtime/adapter-247RTYLS.js +16 -0
  490. package/dist/node-runtime/agent-session-services-KDMSPQDY.js +53 -0
  491. package/dist/node-runtime/{brave-UWDA3I22.js → brave-2AFFAXNN.js} +1 -1
  492. package/dist/node-runtime/{builtin-extensions-ZLAX7TUH.js → builtin-extensions-OX6KELNX.js} +9 -7
  493. package/dist/node-runtime/{chunk-QH6YL7VK.js → chunk-252ZVPPF.js} +3 -3
  494. package/dist/node-runtime/{chunk-PCEW76PM.js → chunk-2OIPYKLZ.js} +6 -6
  495. package/dist/node-runtime/{chunk-XBWPBZBN.js → chunk-2SWW7KMW.js} +1 -1
  496. package/dist/node-runtime/{chunk-UQUCFAJ3.js → chunk-2VIW3IMF.js} +40 -7
  497. package/dist/node-runtime/{chunk-UOEDI7RP.js → chunk-4KNKQGHM.js} +2 -2
  498. package/dist/node-runtime/{chunk-FQMM2EZ2.js → chunk-64XTQNLA.js} +29 -7
  499. package/dist/node-runtime/{chunk-NRKGMJYU.js → chunk-6O3IW3IA.js} +2 -2
  500. package/dist/node-runtime/{chunk-5ZQXRPMC.js → chunk-6ZZHGUSA.js} +2 -2
  501. package/dist/node-runtime/chunk-A2WO6WIN.js +1197 -0
  502. package/dist/node-runtime/{chunk-ZXSGTGJ6.js → chunk-APVM5NEU.js} +169 -148
  503. package/dist/node-runtime/{chunk-RC7DMV45.js → chunk-AYHH7YSD.js} +205 -144
  504. package/dist/node-runtime/{chunk-LWYIVUGV.js → chunk-B2IBAXNX.js} +48 -31
  505. package/dist/node-runtime/{chunk-M3LZLQW2.js → chunk-BDRGN3L2.js} +1 -0
  506. package/dist/node-runtime/{chunk-GJ2RDBRL.js → chunk-BYC6RKCN.js} +4 -2
  507. package/dist/node-runtime/{chunk-KWIYUUZK.js → chunk-C3P6Q3B2.js} +469 -283
  508. package/dist/node-runtime/{chunk-YCUZEGJG.js → chunk-DQSCFU7R.js} +17 -8
  509. package/dist/node-runtime/chunk-EBLAZVSA.js +4170 -0
  510. package/dist/node-runtime/{chunk-2KIPT4HJ.js → chunk-EPR2F3GU.js} +68 -20
  511. package/dist/node-runtime/{chunk-CSFI6YXL.js → chunk-ES6PBSIE.js} +1 -1
  512. package/dist/node-runtime/{chunk-IF24A3FH.js → chunk-EVM653DD.js} +4 -4
  513. package/dist/node-runtime/{chunk-HTFRRDSF.js → chunk-F2SMQ6ES.js} +3 -2
  514. package/dist/node-runtime/chunk-F2V2F4ZG.js +114 -0
  515. package/dist/node-runtime/chunk-FE3WZI7F.js +290 -0
  516. package/dist/node-runtime/{chunk-GYIXXQAO.js → chunk-FIRA54AC.js} +2 -5
  517. package/dist/node-runtime/{chunk-6VYZ5UFP.js → chunk-FLGEEH27.js} +1 -1
  518. package/dist/node-runtime/{chunk-5EFIU3OM.js → chunk-FTKEZL27.js} +1 -1
  519. package/dist/node-runtime/chunk-FY4A63RK.js +73 -0
  520. package/dist/node-runtime/chunk-FYIFPFXE.js +98 -0
  521. package/dist/node-runtime/{chunk-HMBGROQK.js → chunk-GLDXBBL6.js} +3 -3
  522. package/dist/node-runtime/{chunk-KWA4OC2J.js → chunk-H6YBCWKG.js} +1 -1
  523. package/dist/node-runtime/{chunk-2MI5OPMN.js → chunk-HNNHHJAB.js} +68 -50
  524. package/dist/node-runtime/{chunk-6XL67VVY.js → chunk-HUD2RFJW.js} +17 -2
  525. package/dist/node-runtime/{chunk-I54LGHWM.js → chunk-I2H5QMWW.js} +3 -3
  526. package/dist/node-runtime/chunk-IAZSK7KK.js +108 -0
  527. package/dist/node-runtime/{chunk-2HHLJWGD.js → chunk-IHHTWSXN.js} +9 -9
  528. package/dist/node-runtime/{chunk-DAPBPCBP.js → chunk-IPP5BIV5.js} +25 -3
  529. package/dist/node-runtime/{chunk-QFWG2RVL.js → chunk-IXG6F4NT.js} +11 -0
  530. package/dist/node-runtime/{chunk-RDDAZOMU.js → chunk-JL4HYQXK.js} +1 -1
  531. package/dist/node-runtime/{chunk-CDVHZOOK.js → chunk-JQYNHAKX.js} +1 -1
  532. package/dist/node-runtime/{chunk-WF7PGWRZ.js → chunk-JWEVT363.js} +37 -28
  533. package/dist/node-runtime/{chunk-2HMIRK7W.js → chunk-LHV3V67B.js} +5 -5
  534. package/dist/node-runtime/{chunk-UAEOTO52.js → chunk-MNQXDFPV.js} +6 -2
  535. package/dist/node-runtime/{chunk-IJIFHRTB.js → chunk-MQPKUHRN.js} +165 -85
  536. package/dist/node-runtime/{chunk-MPKSOJBT.js → chunk-NHATCSOI.js} +4 -7
  537. package/dist/node-runtime/{chunk-RMQZU2YU.js → chunk-NNNR3QIY.js} +1 -1
  538. package/dist/node-runtime/{chunk-RWTKOC3B.js → chunk-QBTJG3UM.js} +1 -1
  539. package/dist/node-runtime/{chunk-E4D3IGP2.js → chunk-QNVMKNNN.js} +20 -17
  540. package/dist/node-runtime/{chunk-GS42T6MX.js → chunk-QW3AAHWN.js} +1 -1
  541. package/dist/node-runtime/{chunk-7S3T6YEA.js → chunk-R4WSB2MQ.js} +5 -5
  542. package/dist/node-runtime/{chunk-B4HP6ZWM.js → chunk-RHCGYWO7.js} +1 -1
  543. package/dist/node-runtime/{chunk-3XPLBUEM.js → chunk-RLGY2QIL.js} +49 -59
  544. package/dist/node-runtime/{chunk-KKUTQQV7.js → chunk-RYRGL7P4.js} +1 -1
  545. package/dist/node-runtime/{chunk-AD6VXAO7.js → chunk-TCT6PCUR.js} +47 -115
  546. package/dist/node-runtime/chunk-U5F4IC7R.js +53 -0
  547. package/dist/node-runtime/{chunk-OCVIXVTZ.js → chunk-UBWW2PID.js} +13 -2
  548. package/dist/node-runtime/{chunk-HFVZUPFJ.js → chunk-UNUZICC4.js} +3 -3
  549. package/dist/node-runtime/{chunk-LQP3RB67.js → chunk-UYRKUKFE.js} +1 -1
  550. package/dist/node-runtime/{chunk-DSIKTUPW.js → chunk-VSUEAI7O.js} +2993 -3820
  551. package/dist/node-runtime/{chunk-NAY6UUQZ.js → chunk-WDIVLMOH.js} +1 -1
  552. package/dist/node-runtime/{chunk-E24EO34J.js → chunk-WPXUR3HE.js} +1 -1
  553. package/dist/node-runtime/{chunk-SLVOAQOY.js → chunk-WXYNALHD.js} +113 -1
  554. package/dist/node-runtime/{chunk-KJ6DWS3K.js → chunk-XEOCUEUJ.js} +121 -60
  555. package/dist/node-runtime/chunk-YD3IZAZ7.js +47 -0
  556. package/dist/node-runtime/chunk-YSB6URMT.js +41 -0
  557. package/dist/node-runtime/{chunk-VQFSUJJG.js → chunk-ZDJUR45D.js} +430 -129
  558. package/dist/node-runtime/{chunk-YDO2F2IA.js → chunk-ZEVFBFNF.js} +95 -142
  559. package/dist/node-runtime/chunk-ZIQUS5QO.js +180 -0
  560. package/dist/node-runtime/cli-runtime.js +4 -4
  561. package/dist/node-runtime/{command-6WDOYKS6.js → command-3HMSY6W2.js} +5 -5
  562. package/dist/node-runtime/{commands-NZLSOHPE.js → commands-D6A6H4TS.js} +11 -16
  563. package/dist/node-runtime/commands-OCSSEEWJ.js +37 -0
  564. package/dist/node-runtime/{config-QDD5PUE2.js → config-CU7M7BTK.js} +1 -1
  565. package/dist/node-runtime/{config-D4QUPAHX.js → config-DS7XLMEM.js} +2 -2
  566. package/dist/node-runtime/{direct-tool-executor-77GW4F5P.js → direct-tool-executor-2QJXVQD2.js} +8 -10
  567. package/dist/node-runtime/{exa-LL64QZR2.js → exa-6VBZNPGE.js} +1 -1
  568. package/dist/node-runtime/{export-html-VM4J2MNR.js → export-html-BRWF5AHI.js} +4 -4
  569. package/dist/node-runtime/{extension-input-E7BJZ35H.js → extension-input-VBBMX7YV.js} +5 -5
  570. package/dist/node-runtime/{extension-selector-WU42XDTU.js → extension-selector-T5AOG5XB.js} +5 -5
  571. package/dist/node-runtime/{extract-EQJE7FZZ.js → extract-BFX2N35A.js} +3 -3
  572. package/dist/node-runtime/{gateway-INAYBF4Q.js → gateway-6623C2U3.js} +61 -53
  573. package/dist/node-runtime/{gemini-search-35OCRFLN.js → gemini-search-C66QHDT6.js} +2 -2
  574. package/dist/node-runtime/{gemini-url-context-UQY3PHHW.js → gemini-url-context-T7DEK73R.js} +3 -3
  575. package/dist/node-runtime/{github-extract-F64RZOEA.js → github-extract-HOGE3D6F.js} +107 -38
  576. package/dist/node-runtime/{goal-NJEE5CTU.js → goal-AIHEDUYA.js} +5 -5
  577. package/dist/node-runtime/index.js +54 -48
  578. package/dist/node-runtime/{init-HS6NQXSK.js → init-JBQJIPYI.js} +3 -4
  579. package/dist/node-runtime/{install-cli-KL4UDDAD.js → install-cli-INGHIVBY.js} +30 -25
  580. package/dist/node-runtime/interactive-mode-FM5DNUSW.js +74 -0
  581. package/dist/node-runtime/{interactive-view-NGFAMHPW.js → interactive-view-K33PM4OS.js} +8 -8
  582. package/dist/node-runtime/{lsp-manager-3ASUSO4T.js → lsp-manager-S554V5HR.js} +240 -155
  583. package/dist/node-runtime/{lunr-browser-IR7TL3J7.js → lunr-browser-H4FDOR3C.js} +7 -7
  584. package/dist/node-runtime/lunr-computer-use-VDP2QNRQ.js +158 -0
  585. package/dist/node-runtime/{lunr-cron-LWIZJM2N.js → lunr-cron-LKVA5CZZ.js} +94 -79
  586. package/dist/node-runtime/main.js +42 -39
  587. package/dist/node-runtime/{mobile-commands-J7OJEKFO.js → mobile-commands-XT3NQXLD.js} +13 -12
  588. package/dist/node-runtime/{model-runtime-OO5HFLWE.js → model-runtime-MZ2JMDV4.js} +4 -4
  589. package/dist/node-runtime/{openai-search-B3MSNCQA.js → openai-search-K72LJDYN.js} +1 -1
  590. package/dist/node-runtime/{package-manager-cli-VYZM5WHN.js → package-manager-cli-CYM262SI.js} +20 -19
  591. package/dist/node-runtime/{parallel-AI2MNSCU.js → parallel-X724NCNU.js} +1 -1
  592. package/dist/node-runtime/{perplexity-QVJW3I35.js → perplexity-RDHQHVMK.js} +2 -2
  593. package/dist/node-runtime/{pi-intercom-QM53RLTS.js → pi-intercom-NHHEPBMI.js} +2 -2
  594. package/dist/node-runtime/{pi-mcp-adapter-5UKBZP44.js → pi-mcp-adapter-PP3GQJQ2.js} +98 -94
  595. package/dist/node-runtime/{pi-ollama-cloud-2F3Y2QNM.js → pi-ollama-cloud-4MNWIMFN.js} +11 -24
  596. package/dist/node-runtime/{pi-prompt-template-model-QWTCGLJU.js → pi-prompt-template-model-FTGELLS5.js} +32 -36
  597. package/dist/node-runtime/{pi-subagents-DNY7EAIG.js → pi-subagents-LT3CTO4E.js} +114 -116
  598. package/dist/node-runtime/{pi-web-access-WTGMNZ32.js → pi-web-access-Z3LP246C.js} +144 -108
  599. package/dist/node-runtime/{print-mode-XSFM26EL.js → print-mode-2XHN5SUA.js} +4 -3
  600. package/dist/node-runtime/{process-registry-4FAKZQOL.js → process-registry-Q4QWIU33.js} +3 -3
  601. package/dist/node-runtime/{proxy-modes-LGEUYD7R.js → proxy-modes-VEGC6QG5.js} +9 -13
  602. package/dist/node-runtime/rpc-entry.js +42 -39
  603. package/dist/node-runtime/{rpc-mode-O3XV4SID.js → rpc-mode-32DHJPEJ.js} +4 -4
  604. package/dist/node-runtime/{runtime-4VA6JKNF.js → runtime-EDUUGAQD.js} +56 -46
  605. package/dist/node-runtime/runtime-UGXM4NPQ.js +21 -0
  606. package/dist/node-runtime/{runtime-bridges-VRDDR73P.js → runtime-bridges-DNKMNJCF.js} +8 -7
  607. package/dist/node-runtime/{service-MDQIPQ26.js → service-IHLGFLBT.js} +6 -4
  608. package/dist/node-runtime/{session-handoff-GWARVEWT.js → session-handoff-LNSPDTKY.js} +4 -4
  609. package/dist/node-runtime/{session-manager-JB5J6XBN.js → session-manager-YIFIAVGC.js} +3 -3
  610. package/dist/node-runtime/{session-selector-GIM4DHQ2.js → session-selector-I73U3EIO.js} +7 -7
  611. package/dist/node-runtime/{settings-manager-J4SPQPDJ.js → settings-manager-P2TKGYTR.js} +6 -5
  612. package/dist/node-runtime/{setup-JBKOLJ6F.js → setup-H7CCELIL.js} +15 -1
  613. package/dist/node-runtime/{setup-CQ2NLVK5.js → setup-OLQ4GXWS.js} +22 -21
  614. package/dist/node-runtime/{src-IVPNZ2BX.js → src-6RV4PXKJ.js} +64 -36
  615. package/dist/node-runtime/{subagent-executor-KZZQGAKV.js → subagent-executor-Q5F7DBVM.js} +141 -62
  616. package/dist/node-runtime/{tavily-WEZFVFP7.js → tavily-KZBFYQB6.js} +1 -1
  617. package/dist/node-runtime/{theme-UOO5RVFN.js → theme-YLVZKKZD.js} +2 -2
  618. package/dist/node-runtime/{trust-manager-MMISNCYO.js → trust-manager-ZCU76D23.js} +2 -2
  619. package/dist/node-runtime/{update-cli-GTFJC7XK.js → update-cli-F3XXJANQ.js} +7 -6
  620. package/dist/node-runtime/{usage-service-LFB2SWYV.js → usage-service-CPAGBED5.js} +1 -1
  621. package/dist/node-runtime/{video-extract-OOZHR7SU.js → video-extract-UPKYIBW3.js} +3 -3
  622. package/dist/node-runtime/workflow-ICDI4N3J.js +767 -0
  623. package/dist/node-runtime/{youtube-extract-FNPAUNHU.js → youtube-extract-77NT7FWH.js} +4 -4
  624. package/dist/utils/clipboard-image.d.ts.map +1 -1
  625. package/dist/utils/clipboard-image.js.map +1 -1
  626. package/dist/utils/exif-orientation.d.ts.map +1 -1
  627. package/dist/utils/exif-orientation.js +25 -10
  628. package/dist/utils/exif-orientation.js.map +1 -1
  629. package/dist/utils/image-resize-core.d.ts +2 -0
  630. package/dist/utils/image-resize-core.d.ts.map +1 -1
  631. package/dist/utils/image-resize-core.js +12 -0
  632. package/dist/utils/image-resize-core.js.map +1 -1
  633. package/dist/utils/paths.d.ts +4 -0
  634. package/dist/utils/paths.d.ts.map +1 -1
  635. package/dist/utils/paths.js +33 -2
  636. package/dist/utils/paths.js.map +1 -1
  637. package/dist/utils/sanitize-terminal-text.d.ts +7 -0
  638. package/dist/utils/sanitize-terminal-text.d.ts.map +1 -0
  639. package/dist/utils/sanitize-terminal-text.js +67 -0
  640. package/dist/utils/sanitize-terminal-text.js.map +1 -0
  641. package/docs/browser.md +1 -1
  642. package/docs/computer-use.md +362 -0
  643. package/docs/custom-provider.md +3 -3
  644. package/docs/extensions.md +8 -4
  645. package/docs/features.md +22 -12
  646. package/docs/keybindings.md +1 -1
  647. package/docs/models.md +5 -5
  648. package/docs/packages.md +1 -1
  649. package/docs/providers.md +2 -2
  650. package/docs/rpc.md +7 -7
  651. package/docs/security.md +10 -5
  652. package/docs/sessions.md +2 -2
  653. package/docs/skills.md +1 -1
  654. package/docs/terminal-setup.md +7 -7
  655. package/docs/themes.md +1 -1
  656. package/docs/usage.md +1 -1
  657. package/examples/extensions/auto-commit-on-exit.ts +1 -1
  658. package/examples/extensions/bash-spawn-hook.ts +1 -1
  659. package/examples/extensions/built-in-tool-renderer.ts +1 -1
  660. package/examples/extensions/claude-rules.ts +1 -1
  661. package/examples/extensions/commands.ts +1 -1
  662. package/examples/extensions/custom-compaction.ts +1 -1
  663. package/examples/extensions/custom-provider-anthropic/index.ts +3 -3
  664. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  665. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  666. package/examples/extensions/custom-provider-gitlab-duo/index.ts +1 -1
  667. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  668. package/examples/extensions/doom-overlay/index.ts +1 -1
  669. package/examples/extensions/git-merge-and-resolve.ts +2 -2
  670. package/examples/extensions/gondolin/index.ts +1 -1
  671. package/examples/extensions/gondolin/package-lock.json +2 -2
  672. package/examples/extensions/gondolin/package.json +1 -1
  673. package/examples/extensions/hidden-thinking-label.ts +1 -1
  674. package/examples/extensions/inline-bash.ts +2 -2
  675. package/examples/extensions/input-transform-streaming.ts +2 -2
  676. package/examples/extensions/input-transform.ts +2 -2
  677. package/examples/extensions/interactive-shell.ts +1 -1
  678. package/examples/extensions/kimi-deferred-tools.ts +1 -1
  679. package/examples/extensions/mac-system-theme.ts +1 -1
  680. package/examples/extensions/minimal-mode.ts +1 -1
  681. package/examples/extensions/modal-editor.ts +1 -1
  682. package/examples/extensions/model-status.ts +1 -1
  683. package/examples/extensions/notify.ts +3 -3
  684. package/examples/extensions/overlay-qa-tests.ts +1 -1
  685. package/examples/extensions/overlay-test.ts +1 -1
  686. package/examples/extensions/pirate.ts +1 -1
  687. package/examples/extensions/preset.ts +3 -3
  688. package/examples/extensions/project-trust.ts +4 -4
  689. package/examples/extensions/prompt-customizer.ts +1 -1
  690. package/examples/extensions/rainbow-editor.ts +1 -1
  691. package/examples/extensions/rpc-demo.ts +1 -1
  692. package/examples/extensions/sandbox/index.ts +7 -7
  693. package/examples/extensions/sandbox/package-lock.json +2 -2
  694. package/examples/extensions/sandbox/package.json +1 -1
  695. package/examples/extensions/shutdown-command.ts +5 -5
  696. package/examples/extensions/ssh.ts +2 -2
  697. package/examples/extensions/subagent/README.md +3 -3
  698. package/examples/extensions/subagent/index.ts +2 -2
  699. package/examples/extensions/titlebar-spinner.ts +1 -1
  700. package/examples/extensions/tool-override.ts +1 -1
  701. package/examples/extensions/tools.ts +1 -1
  702. package/examples/extensions/with-deps/package-lock.json +2 -2
  703. package/examples/extensions/with-deps/package.json +1 -1
  704. package/examples/extensions/working-indicator.ts +1 -1
  705. package/examples/extensions/working-message-test.ts +1 -1
  706. package/examples/sdk/01-minimal.ts +1 -1
  707. package/examples/sdk/03-custom-prompt.ts +1 -1
  708. package/examples/sdk/04-skills.ts +1 -1
  709. package/examples/sdk/06-extensions.ts +2 -2
  710. package/examples/sdk/08-prompt-templates.ts +1 -1
  711. package/install-lock/package-lock.json +3841 -0
  712. package/install-lock/package.json +18 -0
  713. package/native/computer-use/LICENSE.md +21 -0
  714. package/npm-shrinkwrap.json +3858 -0
  715. package/package.json +15 -9
  716. package/dist/modes/interactive/components/exit-card.d.ts +0 -22
  717. package/dist/modes/interactive/components/exit-card.d.ts.map +0 -1
  718. package/dist/modes/interactive/components/exit-card.js +0 -69
  719. package/dist/modes/interactive/components/exit-card.js.map +0 -1
  720. package/dist/node-runtime/agent-session-services-YXXFCP5J.js +0 -49
  721. package/dist/node-runtime/chunk-4HXHDDCF.js +0 -16
  722. package/dist/node-runtime/chunk-4TLO4PO2.js +0 -3427
  723. package/dist/node-runtime/chunk-AUXVGBO4.js +0 -19
  724. package/dist/node-runtime/chunk-OVX6X377.js +0 -50
  725. package/dist/node-runtime/chunk-QTU6AKNJ.js +0 -773
  726. package/dist/node-runtime/chunk-TORR5XBV.js +0 -356
  727. package/dist/node-runtime/commands-QC6VUZJQ.js +0 -36
  728. package/dist/node-runtime/interactive-mode-Z5M7WYYZ.js +0 -72
  729. package/dist/node-runtime/mcp-auth-flow-QIXHW6QN.js +0 -32
@@ -9,6 +9,7 @@ export interface ChainOutputValidationContext {
9
9
  }
10
10
  export declare function validateChainOutputBindings(steps: ChainStep[], dynamicFanoutConfig?: DynamicFanoutConfig): void;
11
11
  export declare function validateChainOutputBindingsWithContext(steps: ChainStep[], dynamicFanoutConfig?: DynamicFanoutConfig, context?: ChainOutputValidationContext): void;
12
+ export declare function withChainHandoff(task: string, hasNextStep: boolean): string;
12
13
  export declare function resolveOutputReferences(template: string, outputs: ChainOutputMap): string;
13
14
  export declare function outputEntryFromResult(result: SingleResult, stepIndex: number): ChainOutputMapEntry;
14
15
  export declare function outputEntryFromAsyncResult(result: {
@@ -1 +1 @@
1
- {"version":3,"file":"chain-outputs.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.ts"],"names":[],"mappings":"AACA,OAAO,EAAyC,KAAK,SAAS,EAAuB,MAAM,0BAA0B,CAAC;AACtH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE/F,OAAO,EAA8C,KAAK,mBAAmB,EAA4B,MAAM,qBAAqB,CAAC;AAKrI,qBAAa,0BAA2B,SAAQ,KAAK;CAAG;AAExD,MAAM,WAAW,4BAA4B;IAC5C,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAeD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,mBAAmB,GAAE,mBAAwB,GAAG,IAAI,CAEnH;AAED,wBAAgB,sCAAsC,CACrD,KAAK,EAAE,SAAS,EAAE,EAClB,mBAAmB,GAAE,mBAAwB,EAC7C,OAAO,GAAE,4BAAiC,GACxC,IAAI,CA8CN;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CASzF;AAMD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAOlG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAOxJ","sourcesContent":["// @ts-nocheck\nimport { isDynamicParallelStep, isParallelStep, type ChainStep, type SequentialStep } from \"../../shared/settings.ts\";\nimport type { ChainOutputMap, ChainOutputMapEntry, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { DynamicFanoutError, hasDynamicFanoutFields, type DynamicFanoutConfig, validateDynamicStepShape } from \"./dynamic-fanout.ts\";\n\nconst OUTPUT_REF_PATTERN = /\\{outputs\\.([^}]*)\\}/g;\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport class ChainOutputValidationError extends Error {}\n\nexport interface ChainOutputValidationContext {\n\tpriorOutputNames?: Iterable<string>;\n\tstartStepIndex?: number;\n}\n\nfunction outputNamesForStep(step: ChainStep): string[] {\n\tif (isParallelStep(step)) return step.parallel.map((task) => task.as).filter((name): name is string => Boolean(name));\n\tif (isDynamicParallelStep(step)) return [step.collect.as];\n\tconst name = (step as SequentialStep).as;\n\treturn name ? [name] : [];\n}\n\nfunction taskTemplatesForStep(step: ChainStep): string[] {\n\tif (isParallelStep(step)) return step.parallel.map((task) => task.task ?? \"{previous}\");\n\tif (isDynamicParallelStep(step)) return [step.parallel.task ?? \"{previous}\", step.parallel.label ?? \"\"].filter(Boolean);\n\treturn [(step as SequentialStep).task ?? \"{previous}\"];\n}\n\nexport function validateChainOutputBindings(steps: ChainStep[], dynamicFanoutConfig: DynamicFanoutConfig = {}): void {\n\tvalidateChainOutputBindingsWithContext(steps, dynamicFanoutConfig);\n}\n\nexport function validateChainOutputBindingsWithContext(\n\tsteps: ChainStep[],\n\tdynamicFanoutConfig: DynamicFanoutConfig = {},\n\tcontext: ChainOutputValidationContext = {},\n): void {\n\tconst priorOutputNames = [...(context.priorOutputNames ?? [])];\n\tconst available = new Set<string>(priorOutputNames);\n\tconst seen = new Set<string>(priorOutputNames);\n\tfor (let stepIndex = 0; stepIndex < steps.length; stepIndex++) {\n\t\tconst displayStepIndex = (context.startStepIndex ?? 0) + stepIndex + 1;\n\t\tconst step = steps[stepIndex]!;\n\t\tif (hasDynamicFanoutFields(step)) {\n\t\t\tif (!isDynamicParallelStep(step)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Dynamic chain step ${displayStepIndex} requires expand, a single parallel template object, and collect; dynamic expand/collect cannot be mixed with static parallel arrays.`);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tvalidateDynamicStepShape(step, displayStepIndex - 1, dynamicFanoutConfig);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof DynamicFanoutError) throw new ChainOutputValidationError(error.message);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (!available.has(step.expand.from.output)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Dynamic chain step ${displayStepIndex} references unknown output '${step.expand.from.output}'. Named outputs are only available after producing step/group completes.`);\n\t\t\t}\n\t\t}\n\t\tfor (const name of outputNamesForStep(step)) {\n\t\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Invalid chain output name '${name}' at step ${displayStepIndex}. Use /^[A-Za-z_][A-Za-z0-9_]*$/.`);\n\t\t\t}\n\t\t\tif (seen.has(name)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Duplicate chain output name '${name}'. Each as name must be unique.`);\n\t\t\t}\n\t\t\tseen.add(name);\n\t\t}\n\t\tfor (const template of taskTemplatesForStep(step)) {\n\t\t\tfor (const match of template.matchAll(OUTPUT_REF_PATTERN)) {\n\t\t\t\tconst rawReference = match[0];\n\t\t\t\tconst name = match[1]!;\n\t\t\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\t\t\tthrow new ChainOutputValidationError(`Invalid chain output reference '${rawReference}' at step ${displayStepIndex}. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);\n\t\t\t\t}\n\t\t\t\tif (!available.has(name)) {\n\t\t\t\t\tthrow new ChainOutputValidationError(`Unknown chain output reference '${rawReference}' at step ${displayStepIndex}. Named outputs are only available after producing step/group completes.`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const name of outputNamesForStep(step)) {\n\t\t\tavailable.add(name);\n\t\t}\n\t}\n}\n\nexport function resolveOutputReferences(template: string, outputs: ChainOutputMap): string {\n\treturn template.replace(OUTPUT_REF_PATTERN, (rawReference, name: string) => {\n\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\tthrow new ChainOutputValidationError(`Invalid chain output reference '${rawReference}'. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);\n\t\t}\n\t\tconst entry = outputs[name];\n\t\tif (!entry) throw new ChainOutputValidationError(`Unknown chain output reference '${rawReference}'.`);\n\t\treturn entry.text;\n\t});\n}\n\nfunction compactStructuredText(value: unknown): string {\n\treturn JSON.stringify(value);\n}\n\nexport function outputEntryFromResult(result: SingleResult, stepIndex: number): ChainOutputMapEntry {\n\treturn {\n\t\ttext: result.structuredOutput !== undefined ? compactStructuredText(result.structuredOutput) : getSingleResultOutput(result),\n\t\t...(result.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\tagent: result.agent,\n\t\tstepIndex,\n\t};\n}\n\nexport function outputEntryFromAsyncResult(result: { agent: string; output: string; structuredOutput?: unknown }, stepIndex: number): ChainOutputMapEntry {\n\treturn {\n\t\ttext: result.structuredOutput !== undefined ? compactStructuredText(result.structuredOutput) : result.output,\n\t\t...(result.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\tagent: result.agent,\n\t\tstepIndex,\n\t};\n}\n"]}
1
+ {"version":3,"file":"chain-outputs.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.ts"],"names":[],"mappings":"AACA,OAAO,EAAyC,KAAK,SAAS,EAAuB,MAAM,0BAA0B,CAAC;AACtH,OAAO,KAAK,EAAE,cAAc,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAE/F,OAAO,EAA8C,KAAK,mBAAmB,EAA4B,MAAM,qBAAqB,CAAC;AAKrI,qBAAa,0BAA2B,SAAQ,KAAK;CAAG;AAExD,MAAM,WAAW,4BAA4B;IAC5C,gBAAgB,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IACpC,cAAc,CAAC,EAAE,MAAM,CAAC;CACxB;AAeD,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,mBAAmB,GAAE,mBAAwB,GAAG,IAAI,CAEnH;AAED,wBAAgB,sCAAsC,CACrD,KAAK,EAAE,SAAS,EAAE,EAClB,mBAAmB,GAAE,mBAAwB,EAC7C,OAAO,GAAE,4BAAiC,GACxC,IAAI,CA8CN;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,GAAG,MAAM,CAI3E;AAED,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,MAAM,CASzF;AAMD,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAOlG;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAAE,EAAE,SAAS,EAAE,MAAM,GAAG,mBAAmB,CAOxJ","sourcesContent":["// @ts-nocheck\nimport { isDynamicParallelStep, isParallelStep, type ChainStep, type SequentialStep } from \"../../shared/settings.ts\";\nimport type { ChainOutputMap, ChainOutputMapEntry, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { DynamicFanoutError, hasDynamicFanoutFields, type DynamicFanoutConfig, validateDynamicStepShape } from \"./dynamic-fanout.ts\";\n\nconst OUTPUT_REF_PATTERN = /\\{outputs\\.([^}]*)\\}/g;\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport class ChainOutputValidationError extends Error {}\n\nexport interface ChainOutputValidationContext {\n\tpriorOutputNames?: Iterable<string>;\n\tstartStepIndex?: number;\n}\n\nfunction outputNamesForStep(step: ChainStep): string[] {\n\tif (isParallelStep(step)) return step.parallel.map((task) => task.as).filter((name): name is string => Boolean(name));\n\tif (isDynamicParallelStep(step)) return [step.collect.as];\n\tconst name = (step as SequentialStep).as;\n\treturn name ? [name] : [];\n}\n\nfunction taskTemplatesForStep(step: ChainStep): string[] {\n\tif (isParallelStep(step)) return step.parallel.map((task) => task.task ?? \"{previous}\");\n\tif (isDynamicParallelStep(step)) return [step.parallel.task ?? \"{previous}\", step.parallel.label ?? \"\"].filter(Boolean);\n\treturn [(step as SequentialStep).task ?? \"{previous}\"];\n}\n\nexport function validateChainOutputBindings(steps: ChainStep[], dynamicFanoutConfig: DynamicFanoutConfig = {}): void {\n\tvalidateChainOutputBindingsWithContext(steps, dynamicFanoutConfig);\n}\n\nexport function validateChainOutputBindingsWithContext(\n\tsteps: ChainStep[],\n\tdynamicFanoutConfig: DynamicFanoutConfig = {},\n\tcontext: ChainOutputValidationContext = {},\n): void {\n\tconst priorOutputNames = [...(context.priorOutputNames ?? [])];\n\tconst available = new Set<string>(priorOutputNames);\n\tconst seen = new Set<string>(priorOutputNames);\n\tfor (let stepIndex = 0; stepIndex < steps.length; stepIndex++) {\n\t\tconst displayStepIndex = (context.startStepIndex ?? 0) + stepIndex + 1;\n\t\tconst step = steps[stepIndex]!;\n\t\tif (hasDynamicFanoutFields(step)) {\n\t\t\tif (!isDynamicParallelStep(step)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Dynamic chain step ${displayStepIndex} requires expand, a single parallel template object, and collect; dynamic expand/collect cannot be mixed with static parallel arrays.`);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tvalidateDynamicStepShape(step, displayStepIndex - 1, dynamicFanoutConfig);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof DynamicFanoutError) throw new ChainOutputValidationError(error.message);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (!available.has(step.expand.from.output)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Dynamic chain step ${displayStepIndex} references unknown output '${step.expand.from.output}'. Named outputs are only available after producing step/group completes.`);\n\t\t\t}\n\t\t}\n\t\tfor (const name of outputNamesForStep(step)) {\n\t\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Invalid chain output name '${name}' at step ${displayStepIndex}. Use /^[A-Za-z_][A-Za-z0-9_]*$/.`);\n\t\t\t}\n\t\t\tif (seen.has(name)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Duplicate chain output name '${name}'. Each as name must be unique.`);\n\t\t\t}\n\t\t\tseen.add(name);\n\t\t}\n\t\tfor (const template of taskTemplatesForStep(step)) {\n\t\t\tfor (const match of template.matchAll(OUTPUT_REF_PATTERN)) {\n\t\t\t\tconst rawReference = match[0];\n\t\t\t\tconst name = match[1]!;\n\t\t\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\t\t\tthrow new ChainOutputValidationError(`Invalid chain output reference '${rawReference}' at step ${displayStepIndex}. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);\n\t\t\t\t}\n\t\t\t\tif (!available.has(name)) {\n\t\t\t\t\tthrow new ChainOutputValidationError(`Unknown chain output reference '${rawReference}' at step ${displayStepIndex}. Named outputs are only available after producing step/group completes.`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const name of outputNamesForStep(step)) {\n\t\t\tavailable.add(name);\n\t\t}\n\t}\n}\n\nexport function withChainHandoff(task: string, hasNextStep: boolean): string {\n\treturn hasNextStep\n\t\t? `${task}\\n\\nYour final output will be handed to the next agent. Briefly summarize results, relevant references, verification, and remaining work.`\n\t\t: task;\n}\n\nexport function resolveOutputReferences(template: string, outputs: ChainOutputMap): string {\n\treturn template.replace(OUTPUT_REF_PATTERN, (rawReference, name: string) => {\n\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\tthrow new ChainOutputValidationError(`Invalid chain output reference '${rawReference}'. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);\n\t\t}\n\t\tconst entry = outputs[name];\n\t\tif (!entry) throw new ChainOutputValidationError(`Unknown chain output reference '${rawReference}'.`);\n\t\treturn entry.text;\n\t});\n}\n\nfunction compactStructuredText(value: unknown): string {\n\treturn JSON.stringify(value);\n}\n\nexport function outputEntryFromResult(result: SingleResult, stepIndex: number): ChainOutputMapEntry {\n\treturn {\n\t\ttext: result.structuredOutput !== undefined ? compactStructuredText(result.structuredOutput) : getSingleResultOutput(result),\n\t\t...(result.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\tagent: result.agent,\n\t\tstepIndex,\n\t};\n}\n\nexport function outputEntryFromAsyncResult(result: { agent: string; output: string; structuredOutput?: unknown }, stepIndex: number): ChainOutputMapEntry {\n\treturn {\n\t\ttext: result.structuredOutput !== undefined ? compactStructuredText(result.structuredOutput) : result.output,\n\t\t...(result.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\tagent: result.agent,\n\t\tstepIndex,\n\t};\n}\n"]}
@@ -73,6 +73,11 @@ export function validateChainOutputBindingsWithContext(steps, dynamicFanoutConfi
73
73
  }
74
74
  }
75
75
  }
76
+ export function withChainHandoff(task, hasNextStep) {
77
+ return hasNextStep
78
+ ? `${task}\n\nYour final output will be handed to the next agent. Briefly summarize results, relevant references, verification, and remaining work.`
79
+ : task;
80
+ }
76
81
  export function resolveOutputReferences(template, outputs) {
77
82
  return template.replace(OUTPUT_REF_PATTERN, (rawReference, name) => {
78
83
  if (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {
@@ -1 +1 @@
1
- {"version":3,"file":"chain-outputs.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,qBAAqB,EAAE,cAAc,EAAuC,MAAM,0BAA0B,CAAC;AAEtH,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAA4B,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAErI,MAAM,kBAAkB,GAAG,uBAAuB,CAAC;AACnD,MAAM,wBAAwB,GAAG,0BAA0B,CAAC;AAE5D,MAAM,OAAO,0BAA2B,SAAQ,KAAK;CAAG;AAOxD,SAAS,kBAAkB,CAAC,IAAe,EAAY;IACtD,IAAI,cAAc,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAkB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACtH,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC1D,MAAM,IAAI,GAAI,IAAuB,CAAC,EAAE,CAAC;IACzC,OAAO,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAAA,CAC1B;AAED,SAAS,oBAAoB,CAAC,IAAe,EAAY;IACxD,IAAI,cAAc,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;IACxF,IAAI,qBAAqB,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACxH,OAAO,CAAE,IAAuB,CAAC,IAAI,IAAI,YAAY,CAAC,CAAC;AAAA,CACvD;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAkB,EAAE,mBAAmB,GAAwB,EAAE,EAAQ;IACpH,sCAAsC,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;AAAA,CACnE;AAED,MAAM,UAAU,sCAAsC,CACrD,KAAkB,EAClB,mBAAmB,GAAwB,EAAE,EAC7C,OAAO,GAAiC,EAAE,EACnC;IACP,MAAM,gBAAgB,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,IAAI,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,IAAI,GAAG,CAAS,gBAAgB,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,gBAAgB,CAAC,CAAC;IAC/C,KAAK,IAAI,SAAS,GAAG,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC;QAC/D,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,cAAc,IAAI,CAAC,CAAC,GAAG,SAAS,GAAG,CAAC,CAAC;QACvE,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAE,CAAC;QAC/B,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,0BAA0B,CAAC,sBAAsB,gBAAgB,uIAAuI,CAAC,CAAC;YACrN,CAAC;YACD,IAAI,CAAC;gBACJ,wBAAwB,CAAC,IAAI,EAAE,gBAAgB,GAAG,CAAC,EAAE,mBAAmB,CAAC,CAAC;YAC3E,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,IAAI,KAAK,YAAY,kBAAkB;oBAAE,MAAM,IAAI,0BAA0B,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBAC7F,MAAM,KAAK,CAAC;YACb,CAAC;YACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC7C,MAAM,IAAI,0BAA0B,CAAC,sBAAsB,gBAAgB,+BAA+B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,2EAA2E,CAAC,CAAC;YAC/M,CAAC;QACF,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC1C,MAAM,IAAI,0BAA0B,CAAC,8BAA8B,IAAI,aAAa,gBAAgB,mCAAmC,CAAC,CAAC;YAC1I,CAAC;YACD,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,0BAA0B,CAAC,gCAAgC,IAAI,iCAAiC,CAAC,CAAC;YAC7G,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC;QACD,KAAK,MAAM,QAAQ,IAAI,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,KAAK,MAAM,KAAK,IAAI,QAAQ,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;gBAC3D,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBAC9B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;gBACvB,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1C,MAAM,IAAI,0BAA0B,CAAC,mCAAmC,YAAY,aAAa,gBAAgB,6DAA6D,CAAC,CAAC;gBACjL,CAAC;gBACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC1B,MAAM,IAAI,0BAA0B,CAAC,mCAAmC,YAAY,aAAa,gBAAgB,0EAA0E,CAAC,CAAC;gBAC9L,CAAC;YACF,CAAC;QACF,CAAC;QACD,KAAK,MAAM,IAAI,IAAI,kBAAkB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC7C,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;IACF,CAAC;AAAA,CACD;AAED,MAAM,UAAU,uBAAuB,CAAC,QAAgB,EAAE,OAAuB,EAAU;IAC1F,OAAO,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,YAAY,EAAE,IAAY,EAAE,EAAE,CAAC;QAC3E,IAAI,CAAC,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC1C,MAAM,IAAI,0BAA0B,CAAC,mCAAmC,YAAY,8DAA8D,CAAC,CAAC;QACrJ,CAAC;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK;YAAE,MAAM,IAAI,0BAA0B,CAAC,mCAAmC,YAAY,IAAI,CAAC,CAAC;QACtG,OAAO,KAAK,CAAC,IAAI,CAAC;IAAA,CAClB,CAAC,CAAC;AAAA,CACH;AAED,SAAS,qBAAqB,CAAC,KAAc,EAAU;IACtD,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;AAAA,CAC7B;AAED,MAAM,UAAU,qBAAqB,CAAC,MAAoB,EAAE,SAAiB,EAAuB;IACnG,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC;QAC5H,GAAG,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS;KACT,CAAC;AAAA,CACF;AAED,MAAM,UAAU,0BAA0B,CAAC,MAAqE,EAAE,SAAiB,EAAuB;IACzJ,OAAO;QACN,IAAI,EAAE,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM;QAC5G,GAAG,CAAC,MAAM,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,SAAS;KACT,CAAC;AAAA,CACF","sourcesContent":["// @ts-nocheck\nimport { isDynamicParallelStep, isParallelStep, type ChainStep, type SequentialStep } from \"../../shared/settings.ts\";\nimport type { ChainOutputMap, ChainOutputMapEntry, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { DynamicFanoutError, hasDynamicFanoutFields, type DynamicFanoutConfig, validateDynamicStepShape } from \"./dynamic-fanout.ts\";\n\nconst OUTPUT_REF_PATTERN = /\\{outputs\\.([^}]*)\\}/g;\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport class ChainOutputValidationError extends Error {}\n\nexport interface ChainOutputValidationContext {\n\tpriorOutputNames?: Iterable<string>;\n\tstartStepIndex?: number;\n}\n\nfunction outputNamesForStep(step: ChainStep): string[] {\n\tif (isParallelStep(step)) return step.parallel.map((task) => task.as).filter((name): name is string => Boolean(name));\n\tif (isDynamicParallelStep(step)) return [step.collect.as];\n\tconst name = (step as SequentialStep).as;\n\treturn name ? [name] : [];\n}\n\nfunction taskTemplatesForStep(step: ChainStep): string[] {\n\tif (isParallelStep(step)) return step.parallel.map((task) => task.task ?? \"{previous}\");\n\tif (isDynamicParallelStep(step)) return [step.parallel.task ?? \"{previous}\", step.parallel.label ?? \"\"].filter(Boolean);\n\treturn [(step as SequentialStep).task ?? \"{previous}\"];\n}\n\nexport function validateChainOutputBindings(steps: ChainStep[], dynamicFanoutConfig: DynamicFanoutConfig = {}): void {\n\tvalidateChainOutputBindingsWithContext(steps, dynamicFanoutConfig);\n}\n\nexport function validateChainOutputBindingsWithContext(\n\tsteps: ChainStep[],\n\tdynamicFanoutConfig: DynamicFanoutConfig = {},\n\tcontext: ChainOutputValidationContext = {},\n): void {\n\tconst priorOutputNames = [...(context.priorOutputNames ?? [])];\n\tconst available = new Set<string>(priorOutputNames);\n\tconst seen = new Set<string>(priorOutputNames);\n\tfor (let stepIndex = 0; stepIndex < steps.length; stepIndex++) {\n\t\tconst displayStepIndex = (context.startStepIndex ?? 0) + stepIndex + 1;\n\t\tconst step = steps[stepIndex]!;\n\t\tif (hasDynamicFanoutFields(step)) {\n\t\t\tif (!isDynamicParallelStep(step)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Dynamic chain step ${displayStepIndex} requires expand, a single parallel template object, and collect; dynamic expand/collect cannot be mixed with static parallel arrays.`);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tvalidateDynamicStepShape(step, displayStepIndex - 1, dynamicFanoutConfig);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof DynamicFanoutError) throw new ChainOutputValidationError(error.message);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (!available.has(step.expand.from.output)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Dynamic chain step ${displayStepIndex} references unknown output '${step.expand.from.output}'. Named outputs are only available after producing step/group completes.`);\n\t\t\t}\n\t\t}\n\t\tfor (const name of outputNamesForStep(step)) {\n\t\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Invalid chain output name '${name}' at step ${displayStepIndex}. Use /^[A-Za-z_][A-Za-z0-9_]*$/.`);\n\t\t\t}\n\t\t\tif (seen.has(name)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Duplicate chain output name '${name}'. Each as name must be unique.`);\n\t\t\t}\n\t\t\tseen.add(name);\n\t\t}\n\t\tfor (const template of taskTemplatesForStep(step)) {\n\t\t\tfor (const match of template.matchAll(OUTPUT_REF_PATTERN)) {\n\t\t\t\tconst rawReference = match[0];\n\t\t\t\tconst name = match[1]!;\n\t\t\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\t\t\tthrow new ChainOutputValidationError(`Invalid chain output reference '${rawReference}' at step ${displayStepIndex}. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);\n\t\t\t\t}\n\t\t\t\tif (!available.has(name)) {\n\t\t\t\t\tthrow new ChainOutputValidationError(`Unknown chain output reference '${rawReference}' at step ${displayStepIndex}. Named outputs are only available after producing step/group completes.`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const name of outputNamesForStep(step)) {\n\t\t\tavailable.add(name);\n\t\t}\n\t}\n}\n\nexport function resolveOutputReferences(template: string, outputs: ChainOutputMap): string {\n\treturn template.replace(OUTPUT_REF_PATTERN, (rawReference, name: string) => {\n\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\tthrow new ChainOutputValidationError(`Invalid chain output reference '${rawReference}'. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);\n\t\t}\n\t\tconst entry = outputs[name];\n\t\tif (!entry) throw new ChainOutputValidationError(`Unknown chain output reference '${rawReference}'.`);\n\t\treturn entry.text;\n\t});\n}\n\nfunction compactStructuredText(value: unknown): string {\n\treturn JSON.stringify(value);\n}\n\nexport function outputEntryFromResult(result: SingleResult, stepIndex: number): ChainOutputMapEntry {\n\treturn {\n\t\ttext: result.structuredOutput !== undefined ? compactStructuredText(result.structuredOutput) : getSingleResultOutput(result),\n\t\t...(result.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\tagent: result.agent,\n\t\tstepIndex,\n\t};\n}\n\nexport function outputEntryFromAsyncResult(result: { agent: string; output: string; structuredOutput?: unknown }, stepIndex: number): ChainOutputMapEntry {\n\treturn {\n\t\ttext: result.structuredOutput !== undefined ? compactStructuredText(result.structuredOutput) : result.output,\n\t\t...(result.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\tagent: result.agent,\n\t\tstepIndex,\n\t};\n}\n"]}
1
+ {"version":3,"file":"chain-outputs.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/chain-outputs.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport { isDynamicParallelStep, isParallelStep, type ChainStep, type SequentialStep } from \"../../shared/settings.ts\";\nimport type { ChainOutputMap, ChainOutputMapEntry, SingleResult } from \"../../shared/types.ts\";\nimport { getSingleResultOutput } from \"../../shared/utils.ts\";\nimport { DynamicFanoutError, hasDynamicFanoutFields, type DynamicFanoutConfig, validateDynamicStepShape } from \"./dynamic-fanout.ts\";\n\nconst OUTPUT_REF_PATTERN = /\\{outputs\\.([^}]*)\\}/g;\nconst SAFE_OUTPUT_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\nexport class ChainOutputValidationError extends Error {}\n\nexport interface ChainOutputValidationContext {\n\tpriorOutputNames?: Iterable<string>;\n\tstartStepIndex?: number;\n}\n\nfunction outputNamesForStep(step: ChainStep): string[] {\n\tif (isParallelStep(step)) return step.parallel.map((task) => task.as).filter((name): name is string => Boolean(name));\n\tif (isDynamicParallelStep(step)) return [step.collect.as];\n\tconst name = (step as SequentialStep).as;\n\treturn name ? [name] : [];\n}\n\nfunction taskTemplatesForStep(step: ChainStep): string[] {\n\tif (isParallelStep(step)) return step.parallel.map((task) => task.task ?? \"{previous}\");\n\tif (isDynamicParallelStep(step)) return [step.parallel.task ?? \"{previous}\", step.parallel.label ?? \"\"].filter(Boolean);\n\treturn [(step as SequentialStep).task ?? \"{previous}\"];\n}\n\nexport function validateChainOutputBindings(steps: ChainStep[], dynamicFanoutConfig: DynamicFanoutConfig = {}): void {\n\tvalidateChainOutputBindingsWithContext(steps, dynamicFanoutConfig);\n}\n\nexport function validateChainOutputBindingsWithContext(\n\tsteps: ChainStep[],\n\tdynamicFanoutConfig: DynamicFanoutConfig = {},\n\tcontext: ChainOutputValidationContext = {},\n): void {\n\tconst priorOutputNames = [...(context.priorOutputNames ?? [])];\n\tconst available = new Set<string>(priorOutputNames);\n\tconst seen = new Set<string>(priorOutputNames);\n\tfor (let stepIndex = 0; stepIndex < steps.length; stepIndex++) {\n\t\tconst displayStepIndex = (context.startStepIndex ?? 0) + stepIndex + 1;\n\t\tconst step = steps[stepIndex]!;\n\t\tif (hasDynamicFanoutFields(step)) {\n\t\t\tif (!isDynamicParallelStep(step)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Dynamic chain step ${displayStepIndex} requires expand, a single parallel template object, and collect; dynamic expand/collect cannot be mixed with static parallel arrays.`);\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tvalidateDynamicStepShape(step, displayStepIndex - 1, dynamicFanoutConfig);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof DynamicFanoutError) throw new ChainOutputValidationError(error.message);\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (!available.has(step.expand.from.output)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Dynamic chain step ${displayStepIndex} references unknown output '${step.expand.from.output}'. Named outputs are only available after producing step/group completes.`);\n\t\t\t}\n\t\t}\n\t\tfor (const name of outputNamesForStep(step)) {\n\t\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Invalid chain output name '${name}' at step ${displayStepIndex}. Use /^[A-Za-z_][A-Za-z0-9_]*$/.`);\n\t\t\t}\n\t\t\tif (seen.has(name)) {\n\t\t\t\tthrow new ChainOutputValidationError(`Duplicate chain output name '${name}'. Each as name must be unique.`);\n\t\t\t}\n\t\t\tseen.add(name);\n\t\t}\n\t\tfor (const template of taskTemplatesForStep(step)) {\n\t\t\tfor (const match of template.matchAll(OUTPUT_REF_PATTERN)) {\n\t\t\t\tconst rawReference = match[0];\n\t\t\t\tconst name = match[1]!;\n\t\t\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\t\t\tthrow new ChainOutputValidationError(`Invalid chain output reference '${rawReference}' at step ${displayStepIndex}. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);\n\t\t\t\t}\n\t\t\t\tif (!available.has(name)) {\n\t\t\t\t\tthrow new ChainOutputValidationError(`Unknown chain output reference '${rawReference}' at step ${displayStepIndex}. Named outputs are only available after producing step/group completes.`);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tfor (const name of outputNamesForStep(step)) {\n\t\t\tavailable.add(name);\n\t\t}\n\t}\n}\n\nexport function withChainHandoff(task: string, hasNextStep: boolean): string {\n\treturn hasNextStep\n\t\t? `${task}\\n\\nYour final output will be handed to the next agent. Briefly summarize results, relevant references, verification, and remaining work.`\n\t\t: task;\n}\n\nexport function resolveOutputReferences(template: string, outputs: ChainOutputMap): string {\n\treturn template.replace(OUTPUT_REF_PATTERN, (rawReference, name: string) => {\n\t\tif (!SAFE_OUTPUT_NAME_PATTERN.test(name)) {\n\t\t\tthrow new ChainOutputValidationError(`Invalid chain output reference '${rawReference}'. Use {outputs.name} with /^[A-Za-z_][A-Za-z0-9_]*$/ names.`);\n\t\t}\n\t\tconst entry = outputs[name];\n\t\tif (!entry) throw new ChainOutputValidationError(`Unknown chain output reference '${rawReference}'.`);\n\t\treturn entry.text;\n\t});\n}\n\nfunction compactStructuredText(value: unknown): string {\n\treturn JSON.stringify(value);\n}\n\nexport function outputEntryFromResult(result: SingleResult, stepIndex: number): ChainOutputMapEntry {\n\treturn {\n\t\ttext: result.structuredOutput !== undefined ? compactStructuredText(result.structuredOutput) : getSingleResultOutput(result),\n\t\t...(result.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\tagent: result.agent,\n\t\tstepIndex,\n\t};\n}\n\nexport function outputEntryFromAsyncResult(result: { agent: string; output: string; structuredOutput?: unknown }, stepIndex: number): ChainOutputMapEntry {\n\treturn {\n\t\ttext: result.structuredOutput !== undefined ? compactStructuredText(result.structuredOutput) : result.output,\n\t\t...(result.structuredOutput !== undefined ? { structured: result.structuredOutput } : {}),\n\t\tagent: result.agent,\n\t\tstepIndex,\n\t};\n}\n"]}
@@ -11,7 +11,7 @@
11
11
  */
12
12
  import type { ChildPermission } from "../../../../../core/subagent-permission-inherit.ts";
13
13
  /** Parent-owned / persistent tools excluded even from full children. */
14
- export declare const PARENT_OWNED_CHILD_TOOLS: readonly ["cron", "memory_add", "memory_remove", "memory_load", "present_plan", "goal_complete", "goal_blocked", "subagent", "subagent_wait"];
14
+ export declare const PARENT_OWNED_CHILD_TOOLS: readonly ["computer_load", "computer_apps", "computer_observe", "computer_click", "computer_hover", "computer_drag", "computer_key", "computer_text", "computer_window", "computer_launch", "computer_scroll", "computer_end", "cron", "memory_add", "memory_remove", "memory_load", "present_plan", "goal_complete", "goal_blocked", "subagent", "subagent_wait"];
15
15
  /** Mutating coding tools omitted from the read-only child registry. */
16
16
  export declare const READ_ONLY_EXCLUDED_CHILD_TOOLS: readonly ["edit", "write", "code_rewrite", "lsp_rename"];
17
17
  export interface ResolveChildExcludeToolsInput {
@@ -1 +1 @@
1
- {"version":3,"file":"child-tools.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/child-tools.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oDAAoD,CAAC;AAE1F,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,+IAU3B,CAAC;AAEX,uEAAuE;AACvE,eAAO,MAAM,8BAA8B,0DAKjC,CAAC;AAKX,MAAM,WAAW,6BAA6B;IAC7C,WAAW,EAAE,eAAe,CAAC;IAC7B,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,GAAG,MAAM,EAAE,CASvF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE","sourcesContent":["// @ts-nocheck\n/**\n * Central permission-to-tool resolver for prompt-driven children.\n *\n * Full access is the coding-tool set (read/search/shell/edit/write/web/LSP/MCP\n * plus output and supervisor coordination). It is not parent-equivalent: cron,\n * memory, goals, plan approval, nested subagent management, and other\n * persistent/user-config tools stay excluded.\n *\n * Read-only drops mutating coding tools from the registry and still runs under\n * Read-only mode as defense in depth.\n */\n\nimport type { ChildPermission } from \"../../../../../core/subagent-permission-inherit.ts\";\n\n/** Parent-owned / persistent tools excluded even from full children. */\nexport const PARENT_OWNED_CHILD_TOOLS = [\n\t\"cron\",\n\t\"memory_add\",\n\t\"memory_remove\",\n\t\"memory_load\",\n\t\"present_plan\",\n\t\"goal_complete\",\n\t\"goal_blocked\",\n\t\"subagent\",\n\t\"subagent_wait\",\n] as const;\n\n/** Mutating coding tools omitted from the read-only child registry. */\nexport const READ_ONLY_EXCLUDED_CHILD_TOOLS = [\n\t\"edit\",\n\t\"write\",\n\t\"code_rewrite\",\n\t\"lsp_rename\",\n] as const;\n\nconst PARENT_OWNED_SET = new Set<string>(PARENT_OWNED_CHILD_TOOLS);\nconst READ_ONLY_SET = new Set<string>(READ_ONLY_EXCLUDED_CHILD_TOOLS);\n\nexport interface ResolveChildExcludeToolsInput {\n\tpermissions: ChildPermission;\n\t/** Dynamic fanout children may keep the child-safe subagent tool. */\n\tfanoutAuthorized?: boolean;\n}\n\nexport function resolveChildExcludeTools(input: ResolveChildExcludeToolsInput): string[] {\n\tconst excluded = new Set<string>(PARENT_OWNED_SET);\n\tif (input.fanoutAuthorized) {\n\t\texcluded.delete(\"subagent\");\n\t}\n\tif (input.permissions === \"read-only\") {\n\t\tfor (const tool of READ_ONLY_SET) excluded.add(tool);\n\t}\n\treturn [...excluded];\n}\n\nexport function isParentOwnedChildTool(name: string): boolean {\n\treturn PARENT_OWNED_SET.has(name);\n}\n\nexport function isReadOnlyExcludedChildTool(name: string): boolean {\n\treturn READ_ONLY_SET.has(name);\n}\n"]}
1
+ {"version":3,"file":"child-tools.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/child-tools.ts"],"names":[],"mappings":"AACA;;;;;;;;;;GAUG;AAGH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oDAAoD,CAAC;AAE1F,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,oWAW3B,CAAC;AAEX,uEAAuE;AACvE,eAAO,MAAM,8BAA8B,0DAKjC,CAAC;AAKX,MAAM,WAAW,6BAA6B;IAC7C,WAAW,EAAE,eAAe,CAAC;IAC7B,qEAAqE;IACrE,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,6BAA6B,GAAG,MAAM,EAAE,CASvF;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED,wBAAgB,2BAA2B,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAEjE","sourcesContent":["// @ts-nocheck\n/**\n * Central permission-to-tool resolver for prompt-driven children.\n *\n * Full access is the coding-tool set (read/search/shell/edit/write/web/LSP/MCP\n * plus output and supervisor coordination). It is not parent-equivalent: cron,\n * memory, goals, plan approval, nested subagent management, and other\n * persistent/user-config tools stay excluded.\n *\n * Read-only drops mutating coding tools from the registry and still runs under\n * Read-only mode as defense in depth.\n */\n\nimport { COMPUTER_TOOLS } from \"../../../../../core/computer-use/policy.ts\";\nimport type { ChildPermission } from \"../../../../../core/subagent-permission-inherit.ts\";\n\n/** Parent-owned / persistent tools excluded even from full children. */\nexport const PARENT_OWNED_CHILD_TOOLS = [\n\t...COMPUTER_TOOLS,\n\t\"cron\",\n\t\"memory_add\",\n\t\"memory_remove\",\n\t\"memory_load\",\n\t\"present_plan\",\n\t\"goal_complete\",\n\t\"goal_blocked\",\n\t\"subagent\",\n\t\"subagent_wait\",\n] as const;\n\n/** Mutating coding tools omitted from the read-only child registry. */\nexport const READ_ONLY_EXCLUDED_CHILD_TOOLS = [\n\t\"edit\",\n\t\"write\",\n\t\"code_rewrite\",\n\t\"lsp_rename\",\n] as const;\n\nconst PARENT_OWNED_SET = new Set<string>(PARENT_OWNED_CHILD_TOOLS);\nconst READ_ONLY_SET = new Set<string>(READ_ONLY_EXCLUDED_CHILD_TOOLS);\n\nexport interface ResolveChildExcludeToolsInput {\n\tpermissions: ChildPermission;\n\t/** Dynamic fanout children may keep the child-safe subagent tool. */\n\tfanoutAuthorized?: boolean;\n}\n\nexport function resolveChildExcludeTools(input: ResolveChildExcludeToolsInput): string[] {\n\tconst excluded = new Set<string>(PARENT_OWNED_SET);\n\tif (input.fanoutAuthorized) {\n\t\texcluded.delete(\"subagent\");\n\t}\n\tif (input.permissions === \"read-only\") {\n\t\tfor (const tool of READ_ONLY_SET) excluded.add(tool);\n\t}\n\treturn [...excluded];\n}\n\nexport function isParentOwnedChildTool(name: string): boolean {\n\treturn PARENT_OWNED_SET.has(name);\n}\n\nexport function isReadOnlyExcludedChildTool(name: string): boolean {\n\treturn READ_ONLY_SET.has(name);\n}\n"]}
@@ -10,8 +10,10 @@
10
10
  * Read-only drops mutating coding tools from the registry and still runs under
11
11
  * Read-only mode as defense in depth.
12
12
  */
13
+ import { COMPUTER_TOOLS } from "../../../../../core/computer-use/policy.js";
13
14
  /** Parent-owned / persistent tools excluded even from full children. */
14
15
  export const PARENT_OWNED_CHILD_TOOLS = [
16
+ ...COMPUTER_TOOLS,
15
17
  "cron",
16
18
  "memory_add",
17
19
  "memory_remove",
@@ -1 +1 @@
1
- {"version":3,"file":"child-tools.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/child-tools.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;;;;;;;;;GAUG;AAIH,wEAAwE;AACxE,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACvC,MAAM;IACN,YAAY;IACZ,eAAe;IACf,aAAa;IACb,cAAc;IACd,eAAe;IACf,cAAc;IACd,UAAU;IACV,eAAe;CACN,CAAC;AAEX,uEAAuE;AACvE,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC7C,MAAM;IACN,OAAO;IACP,cAAc;IACd,YAAY;CACH,CAAC;AAEX,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS,wBAAwB,CAAC,CAAC;AACnE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS,8BAA8B,CAAC,CAAC;AAQtE,MAAM,UAAU,wBAAwB,CAAC,KAAoC,EAAY;IACxF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAS,gBAAgB,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC5B,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,aAAa;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,CACrB;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAW;IAC7D,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAAA,CAClC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAY,EAAW;IAClE,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/B","sourcesContent":["// @ts-nocheck\n/**\n * Central permission-to-tool resolver for prompt-driven children.\n *\n * Full access is the coding-tool set (read/search/shell/edit/write/web/LSP/MCP\n * plus output and supervisor coordination). It is not parent-equivalent: cron,\n * memory, goals, plan approval, nested subagent management, and other\n * persistent/user-config tools stay excluded.\n *\n * Read-only drops mutating coding tools from the registry and still runs under\n * Read-only mode as defense in depth.\n */\n\nimport type { ChildPermission } from \"../../../../../core/subagent-permission-inherit.ts\";\n\n/** Parent-owned / persistent tools excluded even from full children. */\nexport const PARENT_OWNED_CHILD_TOOLS = [\n\t\"cron\",\n\t\"memory_add\",\n\t\"memory_remove\",\n\t\"memory_load\",\n\t\"present_plan\",\n\t\"goal_complete\",\n\t\"goal_blocked\",\n\t\"subagent\",\n\t\"subagent_wait\",\n] as const;\n\n/** Mutating coding tools omitted from the read-only child registry. */\nexport const READ_ONLY_EXCLUDED_CHILD_TOOLS = [\n\t\"edit\",\n\t\"write\",\n\t\"code_rewrite\",\n\t\"lsp_rename\",\n] as const;\n\nconst PARENT_OWNED_SET = new Set<string>(PARENT_OWNED_CHILD_TOOLS);\nconst READ_ONLY_SET = new Set<string>(READ_ONLY_EXCLUDED_CHILD_TOOLS);\n\nexport interface ResolveChildExcludeToolsInput {\n\tpermissions: ChildPermission;\n\t/** Dynamic fanout children may keep the child-safe subagent tool. */\n\tfanoutAuthorized?: boolean;\n}\n\nexport function resolveChildExcludeTools(input: ResolveChildExcludeToolsInput): string[] {\n\tconst excluded = new Set<string>(PARENT_OWNED_SET);\n\tif (input.fanoutAuthorized) {\n\t\texcluded.delete(\"subagent\");\n\t}\n\tif (input.permissions === \"read-only\") {\n\t\tfor (const tool of READ_ONLY_SET) excluded.add(tool);\n\t}\n\treturn [...excluded];\n}\n\nexport function isParentOwnedChildTool(name: string): boolean {\n\treturn PARENT_OWNED_SET.has(name);\n}\n\nexport function isReadOnlyExcludedChildTool(name: string): boolean {\n\treturn READ_ONLY_SET.has(name);\n}\n"]}
1
+ {"version":3,"file":"child-tools.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/child-tools.ts"],"names":[],"mappings":"AAAA,cAAc;AACd;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAG5E,wEAAwE;AACxE,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACvC,GAAG,cAAc;IACjB,MAAM;IACN,YAAY;IACZ,eAAe;IACf,aAAa;IACb,cAAc;IACd,eAAe;IACf,cAAc;IACd,UAAU;IACV,eAAe;CACN,CAAC;AAEX,uEAAuE;AACvE,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC7C,MAAM;IACN,OAAO;IACP,cAAc;IACd,YAAY;CACH,CAAC;AAEX,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAAS,wBAAwB,CAAC,CAAC;AACnE,MAAM,aAAa,GAAG,IAAI,GAAG,CAAS,8BAA8B,CAAC,CAAC;AAQtE,MAAM,UAAU,wBAAwB,CAAC,KAAoC,EAAY;IACxF,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAS,gBAAgB,CAAC,CAAC;IACnD,IAAI,KAAK,CAAC,gBAAgB,EAAE,CAAC;QAC5B,QAAQ,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK,CAAC,WAAW,KAAK,WAAW,EAAE,CAAC;QACvC,KAAK,MAAM,IAAI,IAAI,aAAa;YAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;AAAA,CACrB;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAW;IAC7D,OAAO,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAAA,CAClC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAAY,EAAW;IAClE,OAAO,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAAA,CAC/B","sourcesContent":["// @ts-nocheck\n/**\n * Central permission-to-tool resolver for prompt-driven children.\n *\n * Full access is the coding-tool set (read/search/shell/edit/write/web/LSP/MCP\n * plus output and supervisor coordination). It is not parent-equivalent: cron,\n * memory, goals, plan approval, nested subagent management, and other\n * persistent/user-config tools stay excluded.\n *\n * Read-only drops mutating coding tools from the registry and still runs under\n * Read-only mode as defense in depth.\n */\n\nimport { COMPUTER_TOOLS } from \"../../../../../core/computer-use/policy.ts\";\nimport type { ChildPermission } from \"../../../../../core/subagent-permission-inherit.ts\";\n\n/** Parent-owned / persistent tools excluded even from full children. */\nexport const PARENT_OWNED_CHILD_TOOLS = [\n\t...COMPUTER_TOOLS,\n\t\"cron\",\n\t\"memory_add\",\n\t\"memory_remove\",\n\t\"memory_load\",\n\t\"present_plan\",\n\t\"goal_complete\",\n\t\"goal_blocked\",\n\t\"subagent\",\n\t\"subagent_wait\",\n] as const;\n\n/** Mutating coding tools omitted from the read-only child registry. */\nexport const READ_ONLY_EXCLUDED_CHILD_TOOLS = [\n\t\"edit\",\n\t\"write\",\n\t\"code_rewrite\",\n\t\"lsp_rename\",\n] as const;\n\nconst PARENT_OWNED_SET = new Set<string>(PARENT_OWNED_CHILD_TOOLS);\nconst READ_ONLY_SET = new Set<string>(READ_ONLY_EXCLUDED_CHILD_TOOLS);\n\nexport interface ResolveChildExcludeToolsInput {\n\tpermissions: ChildPermission;\n\t/** Dynamic fanout children may keep the child-safe subagent tool. */\n\tfanoutAuthorized?: boolean;\n}\n\nexport function resolveChildExcludeTools(input: ResolveChildExcludeToolsInput): string[] {\n\tconst excluded = new Set<string>(PARENT_OWNED_SET);\n\tif (input.fanoutAuthorized) {\n\t\texcluded.delete(\"subagent\");\n\t}\n\tif (input.permissions === \"read-only\") {\n\t\tfor (const tool of READ_ONLY_SET) excluded.add(tool);\n\t}\n\treturn [...excluded];\n}\n\nexport function isParentOwnedChildTool(name: string): boolean {\n\treturn PARENT_OWNED_SET.has(name);\n}\n\nexport function isReadOnlyExcludedChildTool(name: string): boolean {\n\treturn READ_ONLY_SET.has(name);\n}\n"]}
@@ -60,7 +60,7 @@ export interface ResolveSubagentModelOverrideOptions {
60
60
  * sentinel), the child must inherit the parent session's *in-memory* model
61
61
  * (`provider/id`) instead of being left to resolve its own model. Without an
62
62
  * explicit `provider/id`, the child falls back to the global
63
- * `~/.pi/agent/settings.json` default, which is shared across every open PI
63
+ * `~/.lunr/agent/settings.json` default, which is shared across every open lunR
64
64
  * session — so a different session that last changed its model in the TUI would
65
65
  * silently contaminate this session's subagents (see issue #266). Passing an
66
66
  * explicit `provider/id` keeps each session's children isolated to that
@@ -1 +1 @@
1
- {"version":3,"file":"model-fallback.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { ModelInfo as AvailableModelInfo } from \"../../shared/model-info.ts\";\nimport { getSupportedThinkingLevels, splitKnownThinkingSuffix, THINKING_LEVELS, type ThinkingLevel } from \"../../shared/model-info.ts\";\nimport type { ChildTier, ModelSelection, Usage } from \"../../shared/types.ts\";\nimport { checkModelScope, type ModelScopeConfig, type ModelScopeViolation, type ModelSource } from \"./model-scope.ts\";\nimport { applyThinkingSuffix } from \"./pi-args.ts\";\n\nexport type { AvailableModelInfo };\n\ninterface ModelAttemptSummary {\n\tmodel: string;\n\tsuccess: boolean;\n\texitCode?: number | null;\n\terror?: string;\n\tusage?: Usage;\n}\n\n/** Strip only a known thinking suffix so model ids that contain colons stay intact. */\nexport function splitThinkingSuffix(model: string): { baseModel: string; thinkingSuffix: string } {\n\treturn splitKnownThinkingSuffix(model);\n}\n\n/** Sentinel model value requesting that a subagent inherit the parent session's model. */\nexport const INHERIT_MODEL = \"inherit\";\n\n/** Minimal shape of the parent session's in-memory model (`ctx.model`). */\nexport interface ParentModel {\n\tprovider: string;\n\tid: string;\n}\n\n/**\n * Normalize a model id or provider segment for fuzzy comparison: case-fold,\n * treat dots/underscores as dashes (so `4.5` matches `4-5`), and collapse\n * repeated separators. Pure.\n */\nexport function normalizeModelSegment(segment: string): string {\n\treturn segment\n\t\t.toLowerCase()\n\t\t.replace(/[._]+/g, \"-\")\n\t\t.replace(/-+/g, \"-\")\n\t\t.replace(/^-|-$/g, \"\");\n}\n\nfunction isPlausibleDateStamp(year: string, month: string, day: string): boolean {\n\tconst yyyy = Number(year);\n\tconst mm = Number(month);\n\tconst dd = Number(day);\n\treturn yyyy >= 1900 && yyyy <= 2099 && mm >= 1 && mm <= 12 && dd >= 1 && dd <= 31;\n}\n\n/** Drop a trailing date stamp (`-20251001` or `-2025-10-01`) so dated and undated ids match. Pure. */\nfunction stripTrailingDateStamp(segment: string): string {\n\tconst dashed = /^(.*)-(\\d{4})-(\\d{2})-(\\d{2})$/.exec(segment);\n\tif (dashed && isPlausibleDateStamp(dashed[2]!, dashed[3]!, dashed[4]!)) return dashed[1]!;\n\tconst compact = /^(.*)-(\\d{4})(\\d{2})(\\d{2})$/.exec(segment);\n\tif (compact && isPlausibleDateStamp(compact[2]!, compact[3]!, compact[4]!)) return compact[1]!;\n\treturn segment;\n}\n\nfunction resolveBaseModelCandidate(\n\tbaseModel: string,\n\tavailableModels: AvailableModelInfo[],\n\tpreferredProvider?: string,\n): string | undefined {\n\tif (baseModel.includes(\"/\")) {\n\t\tconst exact = availableModels.find((entry) => entry.fullId === baseModel);\n\t\tif (exact) return exact.fullId;\n\t} else {\n\t\tconst exactMatches = availableModels.filter((entry) => entry.id === baseModel);\n\t\tif (preferredProvider) {\n\t\t\tconst preferredMatch = exactMatches.find((entry) => entry.provider === preferredProvider);\n\t\t\tif (preferredMatch) return preferredMatch.fullId;\n\t\t}\n\t\tif (exactMatches.length === 1) return exactMatches[0]!.fullId;\n\t}\n\n\treturn fuzzyResolveModel(baseModel, availableModels, preferredProvider);\n}\n\n/**\n * Fuzzy-resolve a base model id (thinking suffix already stripped) against the\n * registry, tolerating separator, case, and optional date-stamp differences so\n * users do not have to spell provider/model exactly. A qualified `provider/id`\n * query only matches within the named provider — this never silently switches\n * providers for security/cost-sensitive configs. Returns the matched `fullId`,\n * or `undefined` when there is no match or the match is ambiguous across\n * providers (and no `preferredProvider` disambiguates). Pure.\n */\nexport function fuzzyResolveModel(\n\tbaseModel: string,\n\tavailableModels: AvailableModelInfo[],\n\tpreferredProvider?: string,\n): string | undefined {\n\tlet queryProvider: string | undefined;\n\tlet queryIdRaw = baseModel;\n\tconst slashIdx = baseModel.indexOf(\"/\");\n\tif (slashIdx !== -1) {\n\t\tqueryProvider = normalizeModelSegment(baseModel.slice(0, slashIdx));\n\t\tqueryIdRaw = baseModel.slice(slashIdx + 1);\n\t} else {\n\t\tconst providerSeparators = [\":\", \".\"];\n\t\tfor (const separator of providerSeparators) {\n\t\t\tconst separatorIdx = baseModel.indexOf(separator);\n\t\t\tif (separatorIdx <= 0) continue;\n\t\t\tconst providerPart = normalizeModelSegment(baseModel.slice(0, separatorIdx));\n\t\t\tif (!availableModels.some((entry) => normalizeModelSegment(entry.provider) === providerPart)) continue;\n\t\t\tqueryProvider = providerPart;\n\t\t\tqueryIdRaw = baseModel.slice(separatorIdx + 1);\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst queryId = normalizeModelSegment(queryIdRaw);\n\tconst queryIdNoDate = stripTrailingDateStamp(queryId);\n\n\tconst candidates = availableModels.filter((entry) => {\n\t\tconst entryId = normalizeModelSegment(entry.id);\n\t\tif (entryId !== queryId && stripTrailingDateStamp(entryId) !== queryIdNoDate) return false;\n\t\tif (queryProvider !== undefined && normalizeModelSegment(entry.provider) !== queryProvider) return false;\n\t\treturn true;\n\t});\n\tif (candidates.length === 0) return undefined;\n\tif (preferredProvider) {\n\t\tconst preferredProviderNorm = normalizeModelSegment(preferredProvider);\n\t\tconst preferred = candidates.find((entry) => normalizeModelSegment(entry.provider) === preferredProviderNorm);\n\t\tif (preferred) return preferred.fullId;\n\t}\n\tif (candidates.length === 1) return candidates[0]!.fullId;\n\treturn undefined;\n}\n\n/**\n * Resolve a possibly-loose model id to a canonical `provider/id` (plus any\n * thinking suffix). Exact registry matches win; fuzzy normalization\n * (separator/case/date-stamp via {@link fuzzyResolveModel}) is a fallback so\n * spelling differences still resolve. Never switches providers for a qualified\n * query. Pure.\n */\nexport function resolveModelCandidate(\n\tmodel: string | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n): string | undefined {\n\tif (!model) return undefined;\n\tif (!availableModels || availableModels.length === 0) return model;\n\n\tconst resolvedWhole = resolveBaseModelCandidate(model, availableModels, preferredProvider);\n\tif (resolvedWhole) return resolvedWhole;\n\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(model);\n\tif (!thinkingSuffix) return model;\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (resolvedBase) return `${resolvedBase}${thinkingSuffix}`;\n\treturn model;\n}\n\nexport interface ResolveSubagentModelOverrideOptions {\n\t/** When set with `enforce: true`, out-of-scope models are rejected. */\n\tscope?: ModelScopeConfig;\n\t/** Origin of the requested model: explicit caller-supplied (hard error) vs inherited (warn). Defaults to `\"inherited\"`. */\n\tsource?: ModelSource;\n\t/** Called for warn-severity violations instead of `console.warn`. */\n\tonWarn?: (violation: ModelScopeViolation) => void;\n}\n\nfunction defaultScopeWarn(violation: ModelScopeViolation): void {\n\tconsole.warn(`[pi-subagents] ${violation.message}`);\n}\n\n/**\n * Resolve the `--model` override passed to a spawned subagent.\n *\n * When no model is requested (`undefined`, `false`, empty, or the `\"inherit\"`\n * sentinel), the child must inherit the parent session's *in-memory* model\n * (`provider/id`) instead of being left to resolve its own model. Without an\n * explicit `provider/id`, the child falls back to the global\n * `~/.pi/agent/settings.json` default, which is shared across every open PI\n * session — so a different session that last changed its model in the TUI would\n * silently contaminate this session's subagents (see issue #266). Passing an\n * explicit `provider/id` keeps each session's children isolated to that\n * session's model.\n *\n * An explicitly requested model string is resolved via {@link resolveModelCandidate}.\n * When `options.scope.enforce` is on, an out-of-scope resolved model throws for\n * an explicit (`source: \"explicit\"`) request and warns for an inherited one.\n */\nexport function resolveSubagentModelOverride(\n\trequestedModel: string | boolean | undefined,\n\tparentModel: ParentModel | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: ResolveSubagentModelOverrideOptions,\n): string | undefined {\n\tconst trimmed = typeof requestedModel === \"string\" ? requestedModel.trim() : \"\";\n\tconst explicit = trimmed && trimmed !== INHERIT_MODEL ? trimmed : undefined;\n\tlet resolved: string | undefined;\n\tif (explicit === undefined) {\n\t\tresolved = parentModel ? `${parentModel.provider}/${parentModel.id}` : undefined;\n\t} else {\n\t\tresolved = resolveModelCandidate(explicit, availableModels, preferredProvider);\n\t}\n\tif (resolved && options?.scope?.enforce) {\n\t\tconst source: ModelSource = explicit === undefined ? \"inherited\" : (options.source ?? \"inherited\");\n\t\tconst violation = checkModelScope(resolved, options.scope, source);\n\t\tif (violation) {\n\t\t\tif (violation.severity === \"error\") throw new Error(violation.message);\n\t\t\t(options.onWarn ?? defaultScopeWarn)(violation);\n\t\t}\n\t}\n\treturn resolved;\n}\n\nexport function resolveEffectiveSubagentModel(\n\texplicitModel: string | boolean | undefined,\n\tagentModel: string | boolean | undefined,\n\tparentModel: ParentModel | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: Omit<ResolveSubagentModelOverrideOptions, \"source\">,\n): string | undefined {\n\tconst resolved = resolveSubagentModelOverride(\n\t\texplicitModel ?? agentModel,\n\t\tparentModel,\n\t\tavailableModels,\n\t\tpreferredProvider,\n\t\t{ ...options, source: explicitModel !== undefined ? \"explicit\" : \"inherited\" },\n\t);\n\tif (resolved || explicitModel === undefined) return resolved;\n\treturn resolveSubagentModelOverride(\n\t\tagentModel,\n\t\tparentModel,\n\t\tavailableModels,\n\t\tpreferredProvider,\n\t\t{ ...options, source: \"inherited\" },\n\t);\n}\n\n// lunr: model tier bridge — every executable child must resolve one configured tier.\nexport function resolveTierModelOverride(tier: unknown): string | undefined {\n\tif (tier !== \"light\" && tier !== \"standard\" && tier !== \"heavy\") {\n\t\tthrow new Error(\"Every subagent execution requires tier: \\\"light\\\", \\\"standard\\\", or \\\"heavy\\\".\");\n\t}\n\tconst tierName = tier.trim();\n\ttry {\n\t\tconst bridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t\t| { getTierModel?: (tier: string) => unknown; isTierModeEnabled?: () => unknown }\n\t\t\t| undefined;\n\t\tif (typeof bridge?.isTierModeEnabled !== \"function\" || typeof bridge?.getTierModel !== \"function\") {\n\t\t\tthrow new Error(\"Model tier settings are unavailable. Reload lunR and try again.\");\n\t\t}\n\t\tif (bridge.isTierModeEnabled() !== true) {\n\t\t\tthrow new Error(\"Model tiers are disabled. Enable them in /settings before launching a subagent.\");\n\t\t}\n\t\tconst model = bridge.getTierModel(tierName);\n\t\tif (typeof model !== \"string\" || !model.trim()) {\n\t\t\tthrow new Error(`Model tier '${tierName}' has no configured model. Configure it in /settings before launching a subagent.`);\n\t\t}\n\t\tconst trimmed = model.trim();\n\t\tconst thinking =\n\t\t\ttypeof bridge.getTierThinking === \"function\" ? bridge.getTierThinking(tierName) : undefined;\n\t\tconst parent = typeof bridge.getParentThinking === \"function\" ? bridge.getParentThinking() : undefined;\n\t\tconst level = (typeof thinking === \"string\" && thinking ? thinking : undefined) ?? (typeof parent === \"string\" && parent ? parent : undefined);\n\t\tif (!level) return trimmed;\n\t\treturn applyThinkingSuffix(trimmed, level, true) ?? trimmed;\n\t} catch (error) {\n\t\tthrow error instanceof Error ? error : new Error(String(error));\n\t}\n}\n\n/** Resolve a required tier and prove its configured model is available to this session. */\nexport function resolveRequiredTierModel(\n\ttier: unknown,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n): string {\n\tconst configured = resolveTierModelOverride(tier);\n\tif (!configured) throw new Error(`Model tier '${String(tier)}' could not be resolved.`);\n\tif (!availableModels?.length) {\n\t\tthrow new Error(`Model tier '${String(tier)}' cannot launch because no authenticated models are available.`);\n\t}\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(configured);\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (!resolvedBase) {\n\t\tthrow new Error(\n\t\t\t`Model tier '${String(tier)}' resolves to '${baseModel}', but that model is unavailable or unauthenticated. Configure an available model in /settings.`,\n\t\t);\n\t}\n\treturn `${resolvedBase}${thinkingSuffix}`;\n}\n\nfunction requestedModelString(model: unknown): string | undefined {\n\treturn typeof model === \"string\" && model.trim() && model.trim() !== INHERIT_MODEL ? model.trim() : undefined;\n}\n\nfunction requestedTier(tier: unknown): ChildTier | undefined {\n\treturn tier === \"light\" || tier === \"standard\" || tier === \"heavy\" ? tier : undefined;\n}\n\nfunction parseExplicitThinking(value: unknown, pathLabel = \"thinking\"): ThinkingLevel | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === false || value === \"off\") return \"off\";\n\tif (typeof value !== \"string\" || !(THINKING_LEVELS as readonly string[]).includes(value)) {\n\t\tthrow new Error(`${pathLabel} must be one of ${THINKING_LEVELS.join(\", \")}.`);\n\t}\n\treturn value as ThinkingLevel;\n}\n\n/**\n * Capture how a child model was selected from the original requested params.\n * Must run before callers replace `model` with a resolved override.\n * Exactly one of tier or model; inherit and both are rejected.\n */\nexport function captureModelSelection(input: { model?: unknown; tier?: unknown }): ModelSelection {\n\tconst model = typeof input.model === \"string\" ? input.model.trim() : \"\";\n\tconst hasModel = Boolean(model);\n\tconst tier = requestedTier(input.tier);\n\tif (hasModel && model === INHERIT_MODEL) {\n\t\tthrow new Error('model \"inherit\" is not supported; choose tier: \"light\", \"standard\", or \"heavy\", or an explicit provider/model.');\n\t}\n\tif (hasModel && tier) {\n\t\tthrow new Error('Choose exactly one of tier or model; do not pass both.');\n\t}\n\tif (hasModel) return { kind: \"model\", model };\n\tif (tier) return { kind: \"tier\", tier };\n\tthrow new Error('Every executable child requires tier: \"light\", \"standard\", or \"heavy\", or an explicit model when the user names one.');\n}\n\n/** Resolve and validate an explicit provider/model (+ optional thinking) with no silent fallback. */\nexport function resolveRequiredExplicitModel(\n\tmodel: unknown,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\tthinking?: unknown,\n): string {\n\tconst requested = requestedModelString(model);\n\tif (!requested) {\n\t\tthrow new Error('Explicit model selection requires model as \"provider/id\".');\n\t}\n\tif (!availableModels?.length) {\n\t\tthrow new Error(`Model '${requested}' cannot launch because no authenticated models are available.`);\n\t}\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(requested);\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (!resolvedBase) {\n\t\tthrow new Error(\n\t\t\t`Model '${baseModel}' is unavailable or unauthenticated. Choose an available provider/model or a configured tier.`,\n\t\t);\n\t}\n\tconst fromSuffix = thinkingSuffix ? thinkingSuffix.slice(1) : undefined;\n\tconst fromParam = parseExplicitThinking(thinking);\n\tif (fromSuffix && fromParam && fromSuffix !== fromParam) {\n\t\tthrow new Error(`Conflicting thinking levels '${fromSuffix}' and '${fromParam}' for model '${requested}'.`);\n\t}\n\tconst level = fromParam ?? fromSuffix;\n\tif (!level) return resolvedBase;\n\tconst info = availableModels.find((entry) => entry.fullId === resolvedBase);\n\tconst supported = getSupportedThinkingLevels(info);\n\tif (!supported.includes(level as ThinkingLevel)) {\n\t\tthrow new Error(\n\t\t\t`Thinking level '${level}' is not supported by '${resolvedBase}'. Supported: ${supported.join(\", \") || \"none\"}.`,\n\t\t);\n\t}\n\treturn applyThinkingSuffix(resolvedBase, level, true) ?? resolvedBase;\n}\n\n/** Resolve the launch model from a captured selection. Tier uses configured thinking; model uses optional explicit thinking. */\nexport function resolveExecutableChildModel(input: {\n\tmodelSelection?: ModelSelection;\n\ttier?: unknown;\n\tmodel?: unknown;\n\tthinking?: unknown;\n\tavailableModels?: AvailableModelInfo[];\n\tpreferredProvider?: string;\n}): string {\n\tconst selection = input.modelSelection ?? captureModelSelection({ model: input.model, tier: input.tier });\n\tif (selection.kind === \"tier\") {\n\t\tif (input.thinking !== undefined) {\n\t\t\tthrow new Error('thinking is only valid with an explicit model; tier children use the configured tier thinking level.');\n\t\t}\n\t\treturn resolveRequiredTierModel(selection.tier, input.availableModels, input.preferredProvider);\n\t}\n\treturn resolveRequiredExplicitModel(input.model, input.availableModels, input.preferredProvider, input.thinking);\n}\n\nexport interface BuildModelCandidatesOptions {\n\t/** Fallback models are inherited agent config and warn, rather than error, when out of scope. */\n\tscope?: ModelScopeConfig;\n\tonWarn?: (violation: ModelScopeViolation) => void;\n}\n\nexport function buildModelCandidates(\n\tprimaryModel: string | undefined,\n\tfallbackModels: string[] | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: BuildModelCandidatesOptions,\n): string[] {\n\tconst seen = new Set<string>();\n\tconst candidates: string[] = [];\n\tconst rawCandidates = [primaryModel, ...(fallbackModels ?? [])];\n\tfor (let index = 0; index < rawCandidates.length; index++) {\n\t\tconst raw = rawCandidates[index];\n\t\tif (!raw) continue;\n\t\tconst normalized = resolveModelCandidate(raw.trim(), availableModels, preferredProvider);\n\t\tif (!normalized || seen.has(normalized)) continue;\n\t\tif (index > 0 && options?.scope?.enforce) {\n\t\t\tconst violation = checkModelScope(normalized, options.scope, \"inherited\");\n\t\t\tif (violation) (options.onWarn ?? defaultScopeWarn)(violation);\n\t\t}\n\t\tseen.add(normalized);\n\t\tcandidates.push(normalized);\n\t}\n\treturn candidates;\n}\n\nconst RETRYABLE_MODEL_FAILURE_PATTERNS = [\n\t/rate\\s*limit/i,\n\t/too many requests/i,\n\t/\\b429\\b/,\n\t/quota/i,\n\t/billing/i,\n\t/credit/i,\n\t/auth(?:entication)?/i,\n\t/unauthori[sz]ed/i,\n\t/forbidden/i,\n\t/api key/i,\n\t/token expired/i,\n\t/invalid key/i,\n\t/provider.*unavailable/i,\n\t/model.*unavailable/i,\n\t/model.*disabled/i,\n\t/model.*not found/i,\n\t/unknown model/i,\n\t/overloaded/i,\n\t/service unavailable/i,\n\t/temporar(?:ily)? unavailable/i,\n\t/connection refused/i,\n\t/fetch failed/i,\n\t/network error/i,\n\t/socket hang up/i,\n\t/stream ended without finish_reason/i,\n\t/upstream/i,\n\t/timed? out/i,\n\t/timeout/i,\n\t/\\b502\\b/,\n\t/\\b503\\b/,\n\t/\\b504\\b/,\n\t/cold.?start/i,\n\t/empty response/i,\n\t/no output/i,\n\t/model.*(?:load|fail|error)/i,\n];\n\n/**\n * Failures reported as `<tool> failed (exit N): ...` or `<tool> failed with\n * exit code N` come from a tool call inside the child's task, not from the\n * provider/model, however network-flavored their details read. Retrying a\n * different model cannot fix them and would rerun the whole task. Tool names\n * include namespaced forms like `mcp.server/write`.\n */\nconst TOOL_FAILURE_PREFIX = /^[\\w.:@/-]+ failed (?:(?:\\(exit \\d+\\):)|(?:with exit code \\d+))(?:\\s|$)/i;\n\nexport function isRetryableModelFailure(error: string | undefined): boolean {\n\tif (!error) return false;\n\tif (TOOL_FAILURE_PREFIX.test(error.trim())) return false;\n\treturn RETRYABLE_MODEL_FAILURE_PATTERNS.some((pattern) => pattern.test(error));\n}\n\nexport function formatModelAttemptNote(attempt: ModelAttemptSummary, nextModel?: string): string {\n\tconst failure = attempt.error?.trim() || `exit ${attempt.exitCode ?? 1}`;\n\treturn nextModel\n\t\t? `[fallback] ${attempt.model} failed: ${failure}. Retrying with ${nextModel}.`\n\t\t: `[fallback] ${attempt.model} failed: ${failure}.`;\n}\n"]}
1
+ {"version":3,"file":"model-fallback.d.ts","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { ModelInfo as AvailableModelInfo } from \"../../shared/model-info.ts\";\nimport { getSupportedThinkingLevels, splitKnownThinkingSuffix, THINKING_LEVELS, type ThinkingLevel } from \"../../shared/model-info.ts\";\nimport type { ChildTier, ModelSelection, Usage } from \"../../shared/types.ts\";\nimport { checkModelScope, type ModelScopeConfig, type ModelScopeViolation, type ModelSource } from \"./model-scope.ts\";\nimport { applyThinkingSuffix } from \"./pi-args.ts\";\n\nexport type { AvailableModelInfo };\n\ninterface ModelAttemptSummary {\n\tmodel: string;\n\tsuccess: boolean;\n\texitCode?: number | null;\n\terror?: string;\n\tusage?: Usage;\n}\n\n/** Strip only a known thinking suffix so model ids that contain colons stay intact. */\nexport function splitThinkingSuffix(model: string): { baseModel: string; thinkingSuffix: string } {\n\treturn splitKnownThinkingSuffix(model);\n}\n\n/** Sentinel model value requesting that a subagent inherit the parent session's model. */\nexport const INHERIT_MODEL = \"inherit\";\n\n/** Minimal shape of the parent session's in-memory model (`ctx.model`). */\nexport interface ParentModel {\n\tprovider: string;\n\tid: string;\n}\n\n/**\n * Normalize a model id or provider segment for fuzzy comparison: case-fold,\n * treat dots/underscores as dashes (so `4.5` matches `4-5`), and collapse\n * repeated separators. Pure.\n */\nexport function normalizeModelSegment(segment: string): string {\n\treturn segment\n\t\t.toLowerCase()\n\t\t.replace(/[._]+/g, \"-\")\n\t\t.replace(/-+/g, \"-\")\n\t\t.replace(/^-|-$/g, \"\");\n}\n\nfunction isPlausibleDateStamp(year: string, month: string, day: string): boolean {\n\tconst yyyy = Number(year);\n\tconst mm = Number(month);\n\tconst dd = Number(day);\n\treturn yyyy >= 1900 && yyyy <= 2099 && mm >= 1 && mm <= 12 && dd >= 1 && dd <= 31;\n}\n\n/** Drop a trailing date stamp (`-20251001` or `-2025-10-01`) so dated and undated ids match. Pure. */\nfunction stripTrailingDateStamp(segment: string): string {\n\tconst dashed = /^(.*)-(\\d{4})-(\\d{2})-(\\d{2})$/.exec(segment);\n\tif (dashed && isPlausibleDateStamp(dashed[2]!, dashed[3]!, dashed[4]!)) return dashed[1]!;\n\tconst compact = /^(.*)-(\\d{4})(\\d{2})(\\d{2})$/.exec(segment);\n\tif (compact && isPlausibleDateStamp(compact[2]!, compact[3]!, compact[4]!)) return compact[1]!;\n\treturn segment;\n}\n\nfunction resolveBaseModelCandidate(\n\tbaseModel: string,\n\tavailableModels: AvailableModelInfo[],\n\tpreferredProvider?: string,\n): string | undefined {\n\tif (baseModel.includes(\"/\")) {\n\t\tconst exact = availableModels.find((entry) => entry.fullId === baseModel);\n\t\tif (exact) return exact.fullId;\n\t} else {\n\t\tconst exactMatches = availableModels.filter((entry) => entry.id === baseModel);\n\t\tif (preferredProvider) {\n\t\t\tconst preferredMatch = exactMatches.find((entry) => entry.provider === preferredProvider);\n\t\t\tif (preferredMatch) return preferredMatch.fullId;\n\t\t}\n\t\tif (exactMatches.length === 1) return exactMatches[0]!.fullId;\n\t}\n\n\treturn fuzzyResolveModel(baseModel, availableModels, preferredProvider);\n}\n\n/**\n * Fuzzy-resolve a base model id (thinking suffix already stripped) against the\n * registry, tolerating separator, case, and optional date-stamp differences so\n * users do not have to spell provider/model exactly. A qualified `provider/id`\n * query only matches within the named provider — this never silently switches\n * providers for security/cost-sensitive configs. Returns the matched `fullId`,\n * or `undefined` when there is no match or the match is ambiguous across\n * providers (and no `preferredProvider` disambiguates). Pure.\n */\nexport function fuzzyResolveModel(\n\tbaseModel: string,\n\tavailableModels: AvailableModelInfo[],\n\tpreferredProvider?: string,\n): string | undefined {\n\tlet queryProvider: string | undefined;\n\tlet queryIdRaw = baseModel;\n\tconst slashIdx = baseModel.indexOf(\"/\");\n\tif (slashIdx !== -1) {\n\t\tqueryProvider = normalizeModelSegment(baseModel.slice(0, slashIdx));\n\t\tqueryIdRaw = baseModel.slice(slashIdx + 1);\n\t} else {\n\t\tconst providerSeparators = [\":\", \".\"];\n\t\tfor (const separator of providerSeparators) {\n\t\t\tconst separatorIdx = baseModel.indexOf(separator);\n\t\t\tif (separatorIdx <= 0) continue;\n\t\t\tconst providerPart = normalizeModelSegment(baseModel.slice(0, separatorIdx));\n\t\t\tif (!availableModels.some((entry) => normalizeModelSegment(entry.provider) === providerPart)) continue;\n\t\t\tqueryProvider = providerPart;\n\t\t\tqueryIdRaw = baseModel.slice(separatorIdx + 1);\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst queryId = normalizeModelSegment(queryIdRaw);\n\tconst queryIdNoDate = stripTrailingDateStamp(queryId);\n\n\tconst candidates = availableModels.filter((entry) => {\n\t\tconst entryId = normalizeModelSegment(entry.id);\n\t\tif (entryId !== queryId && stripTrailingDateStamp(entryId) !== queryIdNoDate) return false;\n\t\tif (queryProvider !== undefined && normalizeModelSegment(entry.provider) !== queryProvider) return false;\n\t\treturn true;\n\t});\n\tif (candidates.length === 0) return undefined;\n\tif (preferredProvider) {\n\t\tconst preferredProviderNorm = normalizeModelSegment(preferredProvider);\n\t\tconst preferred = candidates.find((entry) => normalizeModelSegment(entry.provider) === preferredProviderNorm);\n\t\tif (preferred) return preferred.fullId;\n\t}\n\tif (candidates.length === 1) return candidates[0]!.fullId;\n\treturn undefined;\n}\n\n/**\n * Resolve a possibly-loose model id to a canonical `provider/id` (plus any\n * thinking suffix). Exact registry matches win; fuzzy normalization\n * (separator/case/date-stamp via {@link fuzzyResolveModel}) is a fallback so\n * spelling differences still resolve. Never switches providers for a qualified\n * query. Pure.\n */\nexport function resolveModelCandidate(\n\tmodel: string | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n): string | undefined {\n\tif (!model) return undefined;\n\tif (!availableModels || availableModels.length === 0) return model;\n\n\tconst resolvedWhole = resolveBaseModelCandidate(model, availableModels, preferredProvider);\n\tif (resolvedWhole) return resolvedWhole;\n\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(model);\n\tif (!thinkingSuffix) return model;\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (resolvedBase) return `${resolvedBase}${thinkingSuffix}`;\n\treturn model;\n}\n\nexport interface ResolveSubagentModelOverrideOptions {\n\t/** When set with `enforce: true`, out-of-scope models are rejected. */\n\tscope?: ModelScopeConfig;\n\t/** Origin of the requested model: explicit caller-supplied (hard error) vs inherited (warn). Defaults to `\"inherited\"`. */\n\tsource?: ModelSource;\n\t/** Called for warn-severity violations instead of `console.warn`. */\n\tonWarn?: (violation: ModelScopeViolation) => void;\n}\n\nfunction defaultScopeWarn(violation: ModelScopeViolation): void {\n\tconsole.warn(`[pi-subagents] ${violation.message}`);\n}\n\n/**\n * Resolve the `--model` override passed to a spawned subagent.\n *\n * When no model is requested (`undefined`, `false`, empty, or the `\"inherit\"`\n * sentinel), the child must inherit the parent session's *in-memory* model\n * (`provider/id`) instead of being left to resolve its own model. Without an\n * explicit `provider/id`, the child falls back to the global\n * `~/.lunr/agent/settings.json` default, which is shared across every open lunR\n * session — so a different session that last changed its model in the TUI would\n * silently contaminate this session's subagents (see issue #266). Passing an\n * explicit `provider/id` keeps each session's children isolated to that\n * session's model.\n *\n * An explicitly requested model string is resolved via {@link resolveModelCandidate}.\n * When `options.scope.enforce` is on, an out-of-scope resolved model throws for\n * an explicit (`source: \"explicit\"`) request and warns for an inherited one.\n */\nexport function resolveSubagentModelOverride(\n\trequestedModel: string | boolean | undefined,\n\tparentModel: ParentModel | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: ResolveSubagentModelOverrideOptions,\n): string | undefined {\n\tconst trimmed = typeof requestedModel === \"string\" ? requestedModel.trim() : \"\";\n\tconst explicit = trimmed && trimmed !== INHERIT_MODEL ? trimmed : undefined;\n\tlet resolved: string | undefined;\n\tif (explicit === undefined) {\n\t\tresolved = parentModel ? `${parentModel.provider}/${parentModel.id}` : undefined;\n\t} else {\n\t\tresolved = resolveModelCandidate(explicit, availableModels, preferredProvider);\n\t}\n\tif (resolved && options?.scope?.enforce) {\n\t\tconst source: ModelSource = explicit === undefined ? \"inherited\" : (options.source ?? \"inherited\");\n\t\tconst violation = checkModelScope(resolved, options.scope, source);\n\t\tif (violation) {\n\t\t\tif (violation.severity === \"error\") throw new Error(violation.message);\n\t\t\t(options.onWarn ?? defaultScopeWarn)(violation);\n\t\t}\n\t}\n\treturn resolved;\n}\n\nexport function resolveEffectiveSubagentModel(\n\texplicitModel: string | boolean | undefined,\n\tagentModel: string | boolean | undefined,\n\tparentModel: ParentModel | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: Omit<ResolveSubagentModelOverrideOptions, \"source\">,\n): string | undefined {\n\tconst resolved = resolveSubagentModelOverride(\n\t\texplicitModel ?? agentModel,\n\t\tparentModel,\n\t\tavailableModels,\n\t\tpreferredProvider,\n\t\t{ ...options, source: explicitModel !== undefined ? \"explicit\" : \"inherited\" },\n\t);\n\tif (resolved || explicitModel === undefined) return resolved;\n\treturn resolveSubagentModelOverride(\n\t\tagentModel,\n\t\tparentModel,\n\t\tavailableModels,\n\t\tpreferredProvider,\n\t\t{ ...options, source: \"inherited\" },\n\t);\n}\n\n// lunr: model tier bridge — every executable child must resolve one configured tier.\nexport function resolveTierModelOverride(tier: unknown): string | undefined {\n\tif (tier !== \"light\" && tier !== \"standard\" && tier !== \"heavy\") {\n\t\tthrow new Error(\"Every subagent execution requires tier: \\\"light\\\", \\\"standard\\\", or \\\"heavy\\\".\");\n\t}\n\tconst tierName = tier.trim();\n\ttry {\n\t\tconst bridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t\t| { getTierModel?: (tier: string) => unknown; isTierModeEnabled?: () => unknown }\n\t\t\t| undefined;\n\t\tif (typeof bridge?.isTierModeEnabled !== \"function\" || typeof bridge?.getTierModel !== \"function\") {\n\t\t\tthrow new Error(\"Model tier settings are unavailable. Reload lunR and try again.\");\n\t\t}\n\t\tif (bridge.isTierModeEnabled() !== true) {\n\t\t\tthrow new Error(\"Model tiers are disabled. Enable them in /settings before launching a subagent.\");\n\t\t}\n\t\tconst model = bridge.getTierModel(tierName);\n\t\tif (typeof model !== \"string\" || !model.trim()) {\n\t\t\tthrow new Error(`Model tier '${tierName}' has no configured model. Configure it in /settings before launching a subagent.`);\n\t\t}\n\t\tconst trimmed = model.trim();\n\t\tconst thinking =\n\t\t\ttypeof bridge.getTierThinking === \"function\" ? bridge.getTierThinking(tierName) : undefined;\n\t\tconst parent = typeof bridge.getParentThinking === \"function\" ? bridge.getParentThinking() : undefined;\n\t\tconst level = (typeof thinking === \"string\" && thinking ? thinking : undefined) ?? (typeof parent === \"string\" && parent ? parent : undefined);\n\t\tif (!level) return trimmed;\n\t\treturn applyThinkingSuffix(trimmed, level, true) ?? trimmed;\n\t} catch (error) {\n\t\tthrow error instanceof Error ? error : new Error(String(error));\n\t}\n}\n\n/** Resolve a required tier and prove its configured model is available to this session. */\nexport function resolveRequiredTierModel(\n\ttier: unknown,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n): string {\n\tconst configured = resolveTierModelOverride(tier);\n\tif (!configured) throw new Error(`Model tier '${String(tier)}' could not be resolved.`);\n\tif (!availableModels?.length) {\n\t\tthrow new Error(`Model tier '${String(tier)}' cannot launch because no authenticated models are available.`);\n\t}\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(configured);\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (!resolvedBase) {\n\t\tthrow new Error(\n\t\t\t`Model tier '${String(tier)}' resolves to '${baseModel}', but that model is unavailable or unauthenticated. Configure an available model in /settings.`,\n\t\t);\n\t}\n\treturn `${resolvedBase}${thinkingSuffix}`;\n}\n\nfunction requestedModelString(model: unknown): string | undefined {\n\treturn typeof model === \"string\" && model.trim() && model.trim() !== INHERIT_MODEL ? model.trim() : undefined;\n}\n\nfunction requestedTier(tier: unknown): ChildTier | undefined {\n\treturn tier === \"light\" || tier === \"standard\" || tier === \"heavy\" ? tier : undefined;\n}\n\nfunction parseExplicitThinking(value: unknown, pathLabel = \"thinking\"): ThinkingLevel | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === false || value === \"off\") return \"off\";\n\tif (typeof value !== \"string\" || !(THINKING_LEVELS as readonly string[]).includes(value)) {\n\t\tthrow new Error(`${pathLabel} must be one of ${THINKING_LEVELS.join(\", \")}.`);\n\t}\n\treturn value as ThinkingLevel;\n}\n\n/**\n * Capture how a child model was selected from the original requested params.\n * Must run before callers replace `model` with a resolved override.\n * Exactly one of tier or model; inherit and both are rejected.\n */\nexport function captureModelSelection(input: { model?: unknown; tier?: unknown }): ModelSelection {\n\tconst model = typeof input.model === \"string\" ? input.model.trim() : \"\";\n\tconst hasModel = Boolean(model);\n\tconst tier = requestedTier(input.tier);\n\tif (hasModel && model === INHERIT_MODEL) {\n\t\tthrow new Error('model \"inherit\" is not supported; choose tier: \"light\", \"standard\", or \"heavy\", or an explicit provider/model.');\n\t}\n\tif (hasModel && tier) {\n\t\tthrow new Error('Choose exactly one of tier or model; do not pass both.');\n\t}\n\tif (hasModel) return { kind: \"model\", model };\n\tif (tier) return { kind: \"tier\", tier };\n\tthrow new Error('Every executable child requires tier: \"light\", \"standard\", or \"heavy\", or an explicit model when the user names one.');\n}\n\n/** Resolve and validate an explicit provider/model (+ optional thinking) with no silent fallback. */\nexport function resolveRequiredExplicitModel(\n\tmodel: unknown,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\tthinking?: unknown,\n): string {\n\tconst requested = requestedModelString(model);\n\tif (!requested) {\n\t\tthrow new Error('Explicit model selection requires model as \"provider/id\".');\n\t}\n\tif (!availableModels?.length) {\n\t\tthrow new Error(`Model '${requested}' cannot launch because no authenticated models are available.`);\n\t}\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(requested);\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (!resolvedBase) {\n\t\tthrow new Error(\n\t\t\t`Model '${baseModel}' is unavailable or unauthenticated. Choose an available provider/model or a configured tier.`,\n\t\t);\n\t}\n\tconst fromSuffix = thinkingSuffix ? thinkingSuffix.slice(1) : undefined;\n\tconst fromParam = parseExplicitThinking(thinking);\n\tif (fromSuffix && fromParam && fromSuffix !== fromParam) {\n\t\tthrow new Error(`Conflicting thinking levels '${fromSuffix}' and '${fromParam}' for model '${requested}'.`);\n\t}\n\tconst level = fromParam ?? fromSuffix;\n\tif (!level) return resolvedBase;\n\tconst info = availableModels.find((entry) => entry.fullId === resolvedBase);\n\tconst supported = getSupportedThinkingLevels(info);\n\tif (!supported.includes(level as ThinkingLevel)) {\n\t\tthrow new Error(\n\t\t\t`Thinking level '${level}' is not supported by '${resolvedBase}'. Supported: ${supported.join(\", \") || \"none\"}.`,\n\t\t);\n\t}\n\treturn applyThinkingSuffix(resolvedBase, level, true) ?? resolvedBase;\n}\n\n/** Resolve the launch model from a captured selection. Tier uses configured thinking; model uses optional explicit thinking. */\nexport function resolveExecutableChildModel(input: {\n\tmodelSelection?: ModelSelection;\n\ttier?: unknown;\n\tmodel?: unknown;\n\tthinking?: unknown;\n\tavailableModels?: AvailableModelInfo[];\n\tpreferredProvider?: string;\n}): string {\n\tconst selection = input.modelSelection ?? captureModelSelection({ model: input.model, tier: input.tier });\n\tif (selection.kind === \"tier\") {\n\t\tif (input.thinking !== undefined) {\n\t\t\tthrow new Error('thinking is only valid with an explicit model; tier children use the configured tier thinking level.');\n\t\t}\n\t\treturn resolveRequiredTierModel(selection.tier, input.availableModels, input.preferredProvider);\n\t}\n\treturn resolveRequiredExplicitModel(input.model, input.availableModels, input.preferredProvider, input.thinking);\n}\n\nexport interface BuildModelCandidatesOptions {\n\t/** Fallback models are inherited agent config and warn, rather than error, when out of scope. */\n\tscope?: ModelScopeConfig;\n\tonWarn?: (violation: ModelScopeViolation) => void;\n}\n\nexport function buildModelCandidates(\n\tprimaryModel: string | undefined,\n\tfallbackModels: string[] | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: BuildModelCandidatesOptions,\n): string[] {\n\tconst seen = new Set<string>();\n\tconst candidates: string[] = [];\n\tconst rawCandidates = [primaryModel, ...(fallbackModels ?? [])];\n\tfor (let index = 0; index < rawCandidates.length; index++) {\n\t\tconst raw = rawCandidates[index];\n\t\tif (!raw) continue;\n\t\tconst normalized = resolveModelCandidate(raw.trim(), availableModels, preferredProvider);\n\t\tif (!normalized || seen.has(normalized)) continue;\n\t\tif (index > 0 && options?.scope?.enforce) {\n\t\t\tconst violation = checkModelScope(normalized, options.scope, \"inherited\");\n\t\t\tif (violation) (options.onWarn ?? defaultScopeWarn)(violation);\n\t\t}\n\t\tseen.add(normalized);\n\t\tcandidates.push(normalized);\n\t}\n\treturn candidates;\n}\n\nconst RETRYABLE_MODEL_FAILURE_PATTERNS = [\n\t/rate\\s*limit/i,\n\t/too many requests/i,\n\t/\\b429\\b/,\n\t/quota/i,\n\t/billing/i,\n\t/credit/i,\n\t/auth(?:entication)?/i,\n\t/unauthori[sz]ed/i,\n\t/forbidden/i,\n\t/api key/i,\n\t/token expired/i,\n\t/invalid key/i,\n\t/provider.*unavailable/i,\n\t/model.*unavailable/i,\n\t/model.*disabled/i,\n\t/model.*not found/i,\n\t/unknown model/i,\n\t/overloaded/i,\n\t/service unavailable/i,\n\t/temporar(?:ily)? unavailable/i,\n\t/connection refused/i,\n\t/fetch failed/i,\n\t/network error/i,\n\t/socket hang up/i,\n\t/stream ended without finish_reason/i,\n\t/upstream/i,\n\t/timed? out/i,\n\t/timeout/i,\n\t/\\b502\\b/,\n\t/\\b503\\b/,\n\t/\\b504\\b/,\n\t/cold.?start/i,\n\t/empty response/i,\n\t/no output/i,\n\t/model.*(?:load|fail|error)/i,\n];\n\n/**\n * Failures reported as `<tool> failed (exit N): ...` or `<tool> failed with\n * exit code N` come from a tool call inside the child's task, not from the\n * provider/model, however network-flavored their details read. Retrying a\n * different model cannot fix them and would rerun the whole task. Tool names\n * include namespaced forms like `mcp.server/write`.\n */\nconst TOOL_FAILURE_PREFIX = /^[\\w.:@/-]+ failed (?:(?:\\(exit \\d+\\):)|(?:with exit code \\d+))(?:\\s|$)/i;\n\nexport function isRetryableModelFailure(error: string | undefined): boolean {\n\tif (!error) return false;\n\tif (TOOL_FAILURE_PREFIX.test(error.trim())) return false;\n\treturn RETRYABLE_MODEL_FAILURE_PATTERNS.some((pattern) => pattern.test(error));\n}\n\nexport function formatModelAttemptNote(attempt: ModelAttemptSummary, nextModel?: string): string {\n\tconst failure = attempt.error?.trim() || `exit ${attempt.exitCode ?? 1}`;\n\treturn nextModel\n\t\t? `[fallback] ${attempt.model} failed: ${failure}. Retrying with ${nextModel}.`\n\t\t: `[fallback] ${attempt.model} failed: ${failure}.`;\n}\n"]}
@@ -139,7 +139,7 @@ function defaultScopeWarn(violation) {
139
139
  * sentinel), the child must inherit the parent session's *in-memory* model
140
140
  * (`provider/id`) instead of being left to resolve its own model. Without an
141
141
  * explicit `provider/id`, the child falls back to the global
142
- * `~/.pi/agent/settings.json` default, which is shared across every open PI
142
+ * `~/.lunr/agent/settings.json` default, which is shared across every open lunR
143
143
  * session — so a different session that last changed its model in the TUI would
144
144
  * silently contaminate this session's subagents (see issue #266). Passing an
145
145
  * explicit `provider/id` keeps each session's children isolated to that
@@ -1 +1 @@
1
- {"version":3,"file":"model-fallback.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { ModelInfo as AvailableModelInfo } from \"../../shared/model-info.ts\";\nimport { getSupportedThinkingLevels, splitKnownThinkingSuffix, THINKING_LEVELS, type ThinkingLevel } from \"../../shared/model-info.ts\";\nimport type { ChildTier, ModelSelection, Usage } from \"../../shared/types.ts\";\nimport { checkModelScope, type ModelScopeConfig, type ModelScopeViolation, type ModelSource } from \"./model-scope.ts\";\nimport { applyThinkingSuffix } from \"./pi-args.ts\";\n\nexport type { AvailableModelInfo };\n\ninterface ModelAttemptSummary {\n\tmodel: string;\n\tsuccess: boolean;\n\texitCode?: number | null;\n\terror?: string;\n\tusage?: Usage;\n}\n\n/** Strip only a known thinking suffix so model ids that contain colons stay intact. */\nexport function splitThinkingSuffix(model: string): { baseModel: string; thinkingSuffix: string } {\n\treturn splitKnownThinkingSuffix(model);\n}\n\n/** Sentinel model value requesting that a subagent inherit the parent session's model. */\nexport const INHERIT_MODEL = \"inherit\";\n\n/** Minimal shape of the parent session's in-memory model (`ctx.model`). */\nexport interface ParentModel {\n\tprovider: string;\n\tid: string;\n}\n\n/**\n * Normalize a model id or provider segment for fuzzy comparison: case-fold,\n * treat dots/underscores as dashes (so `4.5` matches `4-5`), and collapse\n * repeated separators. Pure.\n */\nexport function normalizeModelSegment(segment: string): string {\n\treturn segment\n\t\t.toLowerCase()\n\t\t.replace(/[._]+/g, \"-\")\n\t\t.replace(/-+/g, \"-\")\n\t\t.replace(/^-|-$/g, \"\");\n}\n\nfunction isPlausibleDateStamp(year: string, month: string, day: string): boolean {\n\tconst yyyy = Number(year);\n\tconst mm = Number(month);\n\tconst dd = Number(day);\n\treturn yyyy >= 1900 && yyyy <= 2099 && mm >= 1 && mm <= 12 && dd >= 1 && dd <= 31;\n}\n\n/** Drop a trailing date stamp (`-20251001` or `-2025-10-01`) so dated and undated ids match. Pure. */\nfunction stripTrailingDateStamp(segment: string): string {\n\tconst dashed = /^(.*)-(\\d{4})-(\\d{2})-(\\d{2})$/.exec(segment);\n\tif (dashed && isPlausibleDateStamp(dashed[2]!, dashed[3]!, dashed[4]!)) return dashed[1]!;\n\tconst compact = /^(.*)-(\\d{4})(\\d{2})(\\d{2})$/.exec(segment);\n\tif (compact && isPlausibleDateStamp(compact[2]!, compact[3]!, compact[4]!)) return compact[1]!;\n\treturn segment;\n}\n\nfunction resolveBaseModelCandidate(\n\tbaseModel: string,\n\tavailableModels: AvailableModelInfo[],\n\tpreferredProvider?: string,\n): string | undefined {\n\tif (baseModel.includes(\"/\")) {\n\t\tconst exact = availableModels.find((entry) => entry.fullId === baseModel);\n\t\tif (exact) return exact.fullId;\n\t} else {\n\t\tconst exactMatches = availableModels.filter((entry) => entry.id === baseModel);\n\t\tif (preferredProvider) {\n\t\t\tconst preferredMatch = exactMatches.find((entry) => entry.provider === preferredProvider);\n\t\t\tif (preferredMatch) return preferredMatch.fullId;\n\t\t}\n\t\tif (exactMatches.length === 1) return exactMatches[0]!.fullId;\n\t}\n\n\treturn fuzzyResolveModel(baseModel, availableModels, preferredProvider);\n}\n\n/**\n * Fuzzy-resolve a base model id (thinking suffix already stripped) against the\n * registry, tolerating separator, case, and optional date-stamp differences so\n * users do not have to spell provider/model exactly. A qualified `provider/id`\n * query only matches within the named provider — this never silently switches\n * providers for security/cost-sensitive configs. Returns the matched `fullId`,\n * or `undefined` when there is no match or the match is ambiguous across\n * providers (and no `preferredProvider` disambiguates). Pure.\n */\nexport function fuzzyResolveModel(\n\tbaseModel: string,\n\tavailableModels: AvailableModelInfo[],\n\tpreferredProvider?: string,\n): string | undefined {\n\tlet queryProvider: string | undefined;\n\tlet queryIdRaw = baseModel;\n\tconst slashIdx = baseModel.indexOf(\"/\");\n\tif (slashIdx !== -1) {\n\t\tqueryProvider = normalizeModelSegment(baseModel.slice(0, slashIdx));\n\t\tqueryIdRaw = baseModel.slice(slashIdx + 1);\n\t} else {\n\t\tconst providerSeparators = [\":\", \".\"];\n\t\tfor (const separator of providerSeparators) {\n\t\t\tconst separatorIdx = baseModel.indexOf(separator);\n\t\t\tif (separatorIdx <= 0) continue;\n\t\t\tconst providerPart = normalizeModelSegment(baseModel.slice(0, separatorIdx));\n\t\t\tif (!availableModels.some((entry) => normalizeModelSegment(entry.provider) === providerPart)) continue;\n\t\t\tqueryProvider = providerPart;\n\t\t\tqueryIdRaw = baseModel.slice(separatorIdx + 1);\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst queryId = normalizeModelSegment(queryIdRaw);\n\tconst queryIdNoDate = stripTrailingDateStamp(queryId);\n\n\tconst candidates = availableModels.filter((entry) => {\n\t\tconst entryId = normalizeModelSegment(entry.id);\n\t\tif (entryId !== queryId && stripTrailingDateStamp(entryId) !== queryIdNoDate) return false;\n\t\tif (queryProvider !== undefined && normalizeModelSegment(entry.provider) !== queryProvider) return false;\n\t\treturn true;\n\t});\n\tif (candidates.length === 0) return undefined;\n\tif (preferredProvider) {\n\t\tconst preferredProviderNorm = normalizeModelSegment(preferredProvider);\n\t\tconst preferred = candidates.find((entry) => normalizeModelSegment(entry.provider) === preferredProviderNorm);\n\t\tif (preferred) return preferred.fullId;\n\t}\n\tif (candidates.length === 1) return candidates[0]!.fullId;\n\treturn undefined;\n}\n\n/**\n * Resolve a possibly-loose model id to a canonical `provider/id` (plus any\n * thinking suffix). Exact registry matches win; fuzzy normalization\n * (separator/case/date-stamp via {@link fuzzyResolveModel}) is a fallback so\n * spelling differences still resolve. Never switches providers for a qualified\n * query. Pure.\n */\nexport function resolveModelCandidate(\n\tmodel: string | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n): string | undefined {\n\tif (!model) return undefined;\n\tif (!availableModels || availableModels.length === 0) return model;\n\n\tconst resolvedWhole = resolveBaseModelCandidate(model, availableModels, preferredProvider);\n\tif (resolvedWhole) return resolvedWhole;\n\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(model);\n\tif (!thinkingSuffix) return model;\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (resolvedBase) return `${resolvedBase}${thinkingSuffix}`;\n\treturn model;\n}\n\nexport interface ResolveSubagentModelOverrideOptions {\n\t/** When set with `enforce: true`, out-of-scope models are rejected. */\n\tscope?: ModelScopeConfig;\n\t/** Origin of the requested model: explicit caller-supplied (hard error) vs inherited (warn). Defaults to `\"inherited\"`. */\n\tsource?: ModelSource;\n\t/** Called for warn-severity violations instead of `console.warn`. */\n\tonWarn?: (violation: ModelScopeViolation) => void;\n}\n\nfunction defaultScopeWarn(violation: ModelScopeViolation): void {\n\tconsole.warn(`[pi-subagents] ${violation.message}`);\n}\n\n/**\n * Resolve the `--model` override passed to a spawned subagent.\n *\n * When no model is requested (`undefined`, `false`, empty, or the `\"inherit\"`\n * sentinel), the child must inherit the parent session's *in-memory* model\n * (`provider/id`) instead of being left to resolve its own model. Without an\n * explicit `provider/id`, the child falls back to the global\n * `~/.pi/agent/settings.json` default, which is shared across every open PI\n * session — so a different session that last changed its model in the TUI would\n * silently contaminate this session's subagents (see issue #266). Passing an\n * explicit `provider/id` keeps each session's children isolated to that\n * session's model.\n *\n * An explicitly requested model string is resolved via {@link resolveModelCandidate}.\n * When `options.scope.enforce` is on, an out-of-scope resolved model throws for\n * an explicit (`source: \"explicit\"`) request and warns for an inherited one.\n */\nexport function resolveSubagentModelOverride(\n\trequestedModel: string | boolean | undefined,\n\tparentModel: ParentModel | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: ResolveSubagentModelOverrideOptions,\n): string | undefined {\n\tconst trimmed = typeof requestedModel === \"string\" ? requestedModel.trim() : \"\";\n\tconst explicit = trimmed && trimmed !== INHERIT_MODEL ? trimmed : undefined;\n\tlet resolved: string | undefined;\n\tif (explicit === undefined) {\n\t\tresolved = parentModel ? `${parentModel.provider}/${parentModel.id}` : undefined;\n\t} else {\n\t\tresolved = resolveModelCandidate(explicit, availableModels, preferredProvider);\n\t}\n\tif (resolved && options?.scope?.enforce) {\n\t\tconst source: ModelSource = explicit === undefined ? \"inherited\" : (options.source ?? \"inherited\");\n\t\tconst violation = checkModelScope(resolved, options.scope, source);\n\t\tif (violation) {\n\t\t\tif (violation.severity === \"error\") throw new Error(violation.message);\n\t\t\t(options.onWarn ?? defaultScopeWarn)(violation);\n\t\t}\n\t}\n\treturn resolved;\n}\n\nexport function resolveEffectiveSubagentModel(\n\texplicitModel: string | boolean | undefined,\n\tagentModel: string | boolean | undefined,\n\tparentModel: ParentModel | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: Omit<ResolveSubagentModelOverrideOptions, \"source\">,\n): string | undefined {\n\tconst resolved = resolveSubagentModelOverride(\n\t\texplicitModel ?? agentModel,\n\t\tparentModel,\n\t\tavailableModels,\n\t\tpreferredProvider,\n\t\t{ ...options, source: explicitModel !== undefined ? \"explicit\" : \"inherited\" },\n\t);\n\tif (resolved || explicitModel === undefined) return resolved;\n\treturn resolveSubagentModelOverride(\n\t\tagentModel,\n\t\tparentModel,\n\t\tavailableModels,\n\t\tpreferredProvider,\n\t\t{ ...options, source: \"inherited\" },\n\t);\n}\n\n// lunr: model tier bridge — every executable child must resolve one configured tier.\nexport function resolveTierModelOverride(tier: unknown): string | undefined {\n\tif (tier !== \"light\" && tier !== \"standard\" && tier !== \"heavy\") {\n\t\tthrow new Error(\"Every subagent execution requires tier: \\\"light\\\", \\\"standard\\\", or \\\"heavy\\\".\");\n\t}\n\tconst tierName = tier.trim();\n\ttry {\n\t\tconst bridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t\t| { getTierModel?: (tier: string) => unknown; isTierModeEnabled?: () => unknown }\n\t\t\t| undefined;\n\t\tif (typeof bridge?.isTierModeEnabled !== \"function\" || typeof bridge?.getTierModel !== \"function\") {\n\t\t\tthrow new Error(\"Model tier settings are unavailable. Reload lunR and try again.\");\n\t\t}\n\t\tif (bridge.isTierModeEnabled() !== true) {\n\t\t\tthrow new Error(\"Model tiers are disabled. Enable them in /settings before launching a subagent.\");\n\t\t}\n\t\tconst model = bridge.getTierModel(tierName);\n\t\tif (typeof model !== \"string\" || !model.trim()) {\n\t\t\tthrow new Error(`Model tier '${tierName}' has no configured model. Configure it in /settings before launching a subagent.`);\n\t\t}\n\t\tconst trimmed = model.trim();\n\t\tconst thinking =\n\t\t\ttypeof bridge.getTierThinking === \"function\" ? bridge.getTierThinking(tierName) : undefined;\n\t\tconst parent = typeof bridge.getParentThinking === \"function\" ? bridge.getParentThinking() : undefined;\n\t\tconst level = (typeof thinking === \"string\" && thinking ? thinking : undefined) ?? (typeof parent === \"string\" && parent ? parent : undefined);\n\t\tif (!level) return trimmed;\n\t\treturn applyThinkingSuffix(trimmed, level, true) ?? trimmed;\n\t} catch (error) {\n\t\tthrow error instanceof Error ? error : new Error(String(error));\n\t}\n}\n\n/** Resolve a required tier and prove its configured model is available to this session. */\nexport function resolveRequiredTierModel(\n\ttier: unknown,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n): string {\n\tconst configured = resolveTierModelOverride(tier);\n\tif (!configured) throw new Error(`Model tier '${String(tier)}' could not be resolved.`);\n\tif (!availableModels?.length) {\n\t\tthrow new Error(`Model tier '${String(tier)}' cannot launch because no authenticated models are available.`);\n\t}\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(configured);\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (!resolvedBase) {\n\t\tthrow new Error(\n\t\t\t`Model tier '${String(tier)}' resolves to '${baseModel}', but that model is unavailable or unauthenticated. Configure an available model in /settings.`,\n\t\t);\n\t}\n\treturn `${resolvedBase}${thinkingSuffix}`;\n}\n\nfunction requestedModelString(model: unknown): string | undefined {\n\treturn typeof model === \"string\" && model.trim() && model.trim() !== INHERIT_MODEL ? model.trim() : undefined;\n}\n\nfunction requestedTier(tier: unknown): ChildTier | undefined {\n\treturn tier === \"light\" || tier === \"standard\" || tier === \"heavy\" ? tier : undefined;\n}\n\nfunction parseExplicitThinking(value: unknown, pathLabel = \"thinking\"): ThinkingLevel | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === false || value === \"off\") return \"off\";\n\tif (typeof value !== \"string\" || !(THINKING_LEVELS as readonly string[]).includes(value)) {\n\t\tthrow new Error(`${pathLabel} must be one of ${THINKING_LEVELS.join(\", \")}.`);\n\t}\n\treturn value as ThinkingLevel;\n}\n\n/**\n * Capture how a child model was selected from the original requested params.\n * Must run before callers replace `model` with a resolved override.\n * Exactly one of tier or model; inherit and both are rejected.\n */\nexport function captureModelSelection(input: { model?: unknown; tier?: unknown }): ModelSelection {\n\tconst model = typeof input.model === \"string\" ? input.model.trim() : \"\";\n\tconst hasModel = Boolean(model);\n\tconst tier = requestedTier(input.tier);\n\tif (hasModel && model === INHERIT_MODEL) {\n\t\tthrow new Error('model \"inherit\" is not supported; choose tier: \"light\", \"standard\", or \"heavy\", or an explicit provider/model.');\n\t}\n\tif (hasModel && tier) {\n\t\tthrow new Error('Choose exactly one of tier or model; do not pass both.');\n\t}\n\tif (hasModel) return { kind: \"model\", model };\n\tif (tier) return { kind: \"tier\", tier };\n\tthrow new Error('Every executable child requires tier: \"light\", \"standard\", or \"heavy\", or an explicit model when the user names one.');\n}\n\n/** Resolve and validate an explicit provider/model (+ optional thinking) with no silent fallback. */\nexport function resolveRequiredExplicitModel(\n\tmodel: unknown,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\tthinking?: unknown,\n): string {\n\tconst requested = requestedModelString(model);\n\tif (!requested) {\n\t\tthrow new Error('Explicit model selection requires model as \"provider/id\".');\n\t}\n\tif (!availableModels?.length) {\n\t\tthrow new Error(`Model '${requested}' cannot launch because no authenticated models are available.`);\n\t}\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(requested);\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (!resolvedBase) {\n\t\tthrow new Error(\n\t\t\t`Model '${baseModel}' is unavailable or unauthenticated. Choose an available provider/model or a configured tier.`,\n\t\t);\n\t}\n\tconst fromSuffix = thinkingSuffix ? thinkingSuffix.slice(1) : undefined;\n\tconst fromParam = parseExplicitThinking(thinking);\n\tif (fromSuffix && fromParam && fromSuffix !== fromParam) {\n\t\tthrow new Error(`Conflicting thinking levels '${fromSuffix}' and '${fromParam}' for model '${requested}'.`);\n\t}\n\tconst level = fromParam ?? fromSuffix;\n\tif (!level) return resolvedBase;\n\tconst info = availableModels.find((entry) => entry.fullId === resolvedBase);\n\tconst supported = getSupportedThinkingLevels(info);\n\tif (!supported.includes(level as ThinkingLevel)) {\n\t\tthrow new Error(\n\t\t\t`Thinking level '${level}' is not supported by '${resolvedBase}'. Supported: ${supported.join(\", \") || \"none\"}.`,\n\t\t);\n\t}\n\treturn applyThinkingSuffix(resolvedBase, level, true) ?? resolvedBase;\n}\n\n/** Resolve the launch model from a captured selection. Tier uses configured thinking; model uses optional explicit thinking. */\nexport function resolveExecutableChildModel(input: {\n\tmodelSelection?: ModelSelection;\n\ttier?: unknown;\n\tmodel?: unknown;\n\tthinking?: unknown;\n\tavailableModels?: AvailableModelInfo[];\n\tpreferredProvider?: string;\n}): string {\n\tconst selection = input.modelSelection ?? captureModelSelection({ model: input.model, tier: input.tier });\n\tif (selection.kind === \"tier\") {\n\t\tif (input.thinking !== undefined) {\n\t\t\tthrow new Error('thinking is only valid with an explicit model; tier children use the configured tier thinking level.');\n\t\t}\n\t\treturn resolveRequiredTierModel(selection.tier, input.availableModels, input.preferredProvider);\n\t}\n\treturn resolveRequiredExplicitModel(input.model, input.availableModels, input.preferredProvider, input.thinking);\n}\n\nexport interface BuildModelCandidatesOptions {\n\t/** Fallback models are inherited agent config and warn, rather than error, when out of scope. */\n\tscope?: ModelScopeConfig;\n\tonWarn?: (violation: ModelScopeViolation) => void;\n}\n\nexport function buildModelCandidates(\n\tprimaryModel: string | undefined,\n\tfallbackModels: string[] | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: BuildModelCandidatesOptions,\n): string[] {\n\tconst seen = new Set<string>();\n\tconst candidates: string[] = [];\n\tconst rawCandidates = [primaryModel, ...(fallbackModels ?? [])];\n\tfor (let index = 0; index < rawCandidates.length; index++) {\n\t\tconst raw = rawCandidates[index];\n\t\tif (!raw) continue;\n\t\tconst normalized = resolveModelCandidate(raw.trim(), availableModels, preferredProvider);\n\t\tif (!normalized || seen.has(normalized)) continue;\n\t\tif (index > 0 && options?.scope?.enforce) {\n\t\t\tconst violation = checkModelScope(normalized, options.scope, \"inherited\");\n\t\t\tif (violation) (options.onWarn ?? defaultScopeWarn)(violation);\n\t\t}\n\t\tseen.add(normalized);\n\t\tcandidates.push(normalized);\n\t}\n\treturn candidates;\n}\n\nconst RETRYABLE_MODEL_FAILURE_PATTERNS = [\n\t/rate\\s*limit/i,\n\t/too many requests/i,\n\t/\\b429\\b/,\n\t/quota/i,\n\t/billing/i,\n\t/credit/i,\n\t/auth(?:entication)?/i,\n\t/unauthori[sz]ed/i,\n\t/forbidden/i,\n\t/api key/i,\n\t/token expired/i,\n\t/invalid key/i,\n\t/provider.*unavailable/i,\n\t/model.*unavailable/i,\n\t/model.*disabled/i,\n\t/model.*not found/i,\n\t/unknown model/i,\n\t/overloaded/i,\n\t/service unavailable/i,\n\t/temporar(?:ily)? unavailable/i,\n\t/connection refused/i,\n\t/fetch failed/i,\n\t/network error/i,\n\t/socket hang up/i,\n\t/stream ended without finish_reason/i,\n\t/upstream/i,\n\t/timed? out/i,\n\t/timeout/i,\n\t/\\b502\\b/,\n\t/\\b503\\b/,\n\t/\\b504\\b/,\n\t/cold.?start/i,\n\t/empty response/i,\n\t/no output/i,\n\t/model.*(?:load|fail|error)/i,\n];\n\n/**\n * Failures reported as `<tool> failed (exit N): ...` or `<tool> failed with\n * exit code N` come from a tool call inside the child's task, not from the\n * provider/model, however network-flavored their details read. Retrying a\n * different model cannot fix them and would rerun the whole task. Tool names\n * include namespaced forms like `mcp.server/write`.\n */\nconst TOOL_FAILURE_PREFIX = /^[\\w.:@/-]+ failed (?:(?:\\(exit \\d+\\):)|(?:with exit code \\d+))(?:\\s|$)/i;\n\nexport function isRetryableModelFailure(error: string | undefined): boolean {\n\tif (!error) return false;\n\tif (TOOL_FAILURE_PREFIX.test(error.trim())) return false;\n\treturn RETRYABLE_MODEL_FAILURE_PATTERNS.some((pattern) => pattern.test(error));\n}\n\nexport function formatModelAttemptNote(attempt: ModelAttemptSummary, nextModel?: string): string {\n\tconst failure = attempt.error?.trim() || `exit ${attempt.exitCode ?? 1}`;\n\treturn nextModel\n\t\t? `[fallback] ${attempt.model} failed: ${failure}. Retrying with ${nextModel}.`\n\t\t: `[fallback] ${attempt.model} failed: ${failure}.`;\n}\n"]}
1
+ {"version":3,"file":"model-fallback.js","sourceRoot":"","sources":["../../../../../../src/builtin-extensions/pi-subagents/src/runs/shared/model-fallback.ts"],"names":[],"mappings":"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","sourcesContent":["// @ts-nocheck\nimport type { ModelInfo as AvailableModelInfo } from \"../../shared/model-info.ts\";\nimport { getSupportedThinkingLevels, splitKnownThinkingSuffix, THINKING_LEVELS, type ThinkingLevel } from \"../../shared/model-info.ts\";\nimport type { ChildTier, ModelSelection, Usage } from \"../../shared/types.ts\";\nimport { checkModelScope, type ModelScopeConfig, type ModelScopeViolation, type ModelSource } from \"./model-scope.ts\";\nimport { applyThinkingSuffix } from \"./pi-args.ts\";\n\nexport type { AvailableModelInfo };\n\ninterface ModelAttemptSummary {\n\tmodel: string;\n\tsuccess: boolean;\n\texitCode?: number | null;\n\terror?: string;\n\tusage?: Usage;\n}\n\n/** Strip only a known thinking suffix so model ids that contain colons stay intact. */\nexport function splitThinkingSuffix(model: string): { baseModel: string; thinkingSuffix: string } {\n\treturn splitKnownThinkingSuffix(model);\n}\n\n/** Sentinel model value requesting that a subagent inherit the parent session's model. */\nexport const INHERIT_MODEL = \"inherit\";\n\n/** Minimal shape of the parent session's in-memory model (`ctx.model`). */\nexport interface ParentModel {\n\tprovider: string;\n\tid: string;\n}\n\n/**\n * Normalize a model id or provider segment for fuzzy comparison: case-fold,\n * treat dots/underscores as dashes (so `4.5` matches `4-5`), and collapse\n * repeated separators. Pure.\n */\nexport function normalizeModelSegment(segment: string): string {\n\treturn segment\n\t\t.toLowerCase()\n\t\t.replace(/[._]+/g, \"-\")\n\t\t.replace(/-+/g, \"-\")\n\t\t.replace(/^-|-$/g, \"\");\n}\n\nfunction isPlausibleDateStamp(year: string, month: string, day: string): boolean {\n\tconst yyyy = Number(year);\n\tconst mm = Number(month);\n\tconst dd = Number(day);\n\treturn yyyy >= 1900 && yyyy <= 2099 && mm >= 1 && mm <= 12 && dd >= 1 && dd <= 31;\n}\n\n/** Drop a trailing date stamp (`-20251001` or `-2025-10-01`) so dated and undated ids match. Pure. */\nfunction stripTrailingDateStamp(segment: string): string {\n\tconst dashed = /^(.*)-(\\d{4})-(\\d{2})-(\\d{2})$/.exec(segment);\n\tif (dashed && isPlausibleDateStamp(dashed[2]!, dashed[3]!, dashed[4]!)) return dashed[1]!;\n\tconst compact = /^(.*)-(\\d{4})(\\d{2})(\\d{2})$/.exec(segment);\n\tif (compact && isPlausibleDateStamp(compact[2]!, compact[3]!, compact[4]!)) return compact[1]!;\n\treturn segment;\n}\n\nfunction resolveBaseModelCandidate(\n\tbaseModel: string,\n\tavailableModels: AvailableModelInfo[],\n\tpreferredProvider?: string,\n): string | undefined {\n\tif (baseModel.includes(\"/\")) {\n\t\tconst exact = availableModels.find((entry) => entry.fullId === baseModel);\n\t\tif (exact) return exact.fullId;\n\t} else {\n\t\tconst exactMatches = availableModels.filter((entry) => entry.id === baseModel);\n\t\tif (preferredProvider) {\n\t\t\tconst preferredMatch = exactMatches.find((entry) => entry.provider === preferredProvider);\n\t\t\tif (preferredMatch) return preferredMatch.fullId;\n\t\t}\n\t\tif (exactMatches.length === 1) return exactMatches[0]!.fullId;\n\t}\n\n\treturn fuzzyResolveModel(baseModel, availableModels, preferredProvider);\n}\n\n/**\n * Fuzzy-resolve a base model id (thinking suffix already stripped) against the\n * registry, tolerating separator, case, and optional date-stamp differences so\n * users do not have to spell provider/model exactly. A qualified `provider/id`\n * query only matches within the named provider — this never silently switches\n * providers for security/cost-sensitive configs. Returns the matched `fullId`,\n * or `undefined` when there is no match or the match is ambiguous across\n * providers (and no `preferredProvider` disambiguates). Pure.\n */\nexport function fuzzyResolveModel(\n\tbaseModel: string,\n\tavailableModels: AvailableModelInfo[],\n\tpreferredProvider?: string,\n): string | undefined {\n\tlet queryProvider: string | undefined;\n\tlet queryIdRaw = baseModel;\n\tconst slashIdx = baseModel.indexOf(\"/\");\n\tif (slashIdx !== -1) {\n\t\tqueryProvider = normalizeModelSegment(baseModel.slice(0, slashIdx));\n\t\tqueryIdRaw = baseModel.slice(slashIdx + 1);\n\t} else {\n\t\tconst providerSeparators = [\":\", \".\"];\n\t\tfor (const separator of providerSeparators) {\n\t\t\tconst separatorIdx = baseModel.indexOf(separator);\n\t\t\tif (separatorIdx <= 0) continue;\n\t\t\tconst providerPart = normalizeModelSegment(baseModel.slice(0, separatorIdx));\n\t\t\tif (!availableModels.some((entry) => normalizeModelSegment(entry.provider) === providerPart)) continue;\n\t\t\tqueryProvider = providerPart;\n\t\t\tqueryIdRaw = baseModel.slice(separatorIdx + 1);\n\t\t\tbreak;\n\t\t}\n\t}\n\tconst queryId = normalizeModelSegment(queryIdRaw);\n\tconst queryIdNoDate = stripTrailingDateStamp(queryId);\n\n\tconst candidates = availableModels.filter((entry) => {\n\t\tconst entryId = normalizeModelSegment(entry.id);\n\t\tif (entryId !== queryId && stripTrailingDateStamp(entryId) !== queryIdNoDate) return false;\n\t\tif (queryProvider !== undefined && normalizeModelSegment(entry.provider) !== queryProvider) return false;\n\t\treturn true;\n\t});\n\tif (candidates.length === 0) return undefined;\n\tif (preferredProvider) {\n\t\tconst preferredProviderNorm = normalizeModelSegment(preferredProvider);\n\t\tconst preferred = candidates.find((entry) => normalizeModelSegment(entry.provider) === preferredProviderNorm);\n\t\tif (preferred) return preferred.fullId;\n\t}\n\tif (candidates.length === 1) return candidates[0]!.fullId;\n\treturn undefined;\n}\n\n/**\n * Resolve a possibly-loose model id to a canonical `provider/id` (plus any\n * thinking suffix). Exact registry matches win; fuzzy normalization\n * (separator/case/date-stamp via {@link fuzzyResolveModel}) is a fallback so\n * spelling differences still resolve. Never switches providers for a qualified\n * query. Pure.\n */\nexport function resolveModelCandidate(\n\tmodel: string | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n): string | undefined {\n\tif (!model) return undefined;\n\tif (!availableModels || availableModels.length === 0) return model;\n\n\tconst resolvedWhole = resolveBaseModelCandidate(model, availableModels, preferredProvider);\n\tif (resolvedWhole) return resolvedWhole;\n\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(model);\n\tif (!thinkingSuffix) return model;\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (resolvedBase) return `${resolvedBase}${thinkingSuffix}`;\n\treturn model;\n}\n\nexport interface ResolveSubagentModelOverrideOptions {\n\t/** When set with `enforce: true`, out-of-scope models are rejected. */\n\tscope?: ModelScopeConfig;\n\t/** Origin of the requested model: explicit caller-supplied (hard error) vs inherited (warn). Defaults to `\"inherited\"`. */\n\tsource?: ModelSource;\n\t/** Called for warn-severity violations instead of `console.warn`. */\n\tonWarn?: (violation: ModelScopeViolation) => void;\n}\n\nfunction defaultScopeWarn(violation: ModelScopeViolation): void {\n\tconsole.warn(`[pi-subagents] ${violation.message}`);\n}\n\n/**\n * Resolve the `--model` override passed to a spawned subagent.\n *\n * When no model is requested (`undefined`, `false`, empty, or the `\"inherit\"`\n * sentinel), the child must inherit the parent session's *in-memory* model\n * (`provider/id`) instead of being left to resolve its own model. Without an\n * explicit `provider/id`, the child falls back to the global\n * `~/.lunr/agent/settings.json` default, which is shared across every open lunR\n * session — so a different session that last changed its model in the TUI would\n * silently contaminate this session's subagents (see issue #266). Passing an\n * explicit `provider/id` keeps each session's children isolated to that\n * session's model.\n *\n * An explicitly requested model string is resolved via {@link resolveModelCandidate}.\n * When `options.scope.enforce` is on, an out-of-scope resolved model throws for\n * an explicit (`source: \"explicit\"`) request and warns for an inherited one.\n */\nexport function resolveSubagentModelOverride(\n\trequestedModel: string | boolean | undefined,\n\tparentModel: ParentModel | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: ResolveSubagentModelOverrideOptions,\n): string | undefined {\n\tconst trimmed = typeof requestedModel === \"string\" ? requestedModel.trim() : \"\";\n\tconst explicit = trimmed && trimmed !== INHERIT_MODEL ? trimmed : undefined;\n\tlet resolved: string | undefined;\n\tif (explicit === undefined) {\n\t\tresolved = parentModel ? `${parentModel.provider}/${parentModel.id}` : undefined;\n\t} else {\n\t\tresolved = resolveModelCandidate(explicit, availableModels, preferredProvider);\n\t}\n\tif (resolved && options?.scope?.enforce) {\n\t\tconst source: ModelSource = explicit === undefined ? \"inherited\" : (options.source ?? \"inherited\");\n\t\tconst violation = checkModelScope(resolved, options.scope, source);\n\t\tif (violation) {\n\t\t\tif (violation.severity === \"error\") throw new Error(violation.message);\n\t\t\t(options.onWarn ?? defaultScopeWarn)(violation);\n\t\t}\n\t}\n\treturn resolved;\n}\n\nexport function resolveEffectiveSubagentModel(\n\texplicitModel: string | boolean | undefined,\n\tagentModel: string | boolean | undefined,\n\tparentModel: ParentModel | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: Omit<ResolveSubagentModelOverrideOptions, \"source\">,\n): string | undefined {\n\tconst resolved = resolveSubagentModelOverride(\n\t\texplicitModel ?? agentModel,\n\t\tparentModel,\n\t\tavailableModels,\n\t\tpreferredProvider,\n\t\t{ ...options, source: explicitModel !== undefined ? \"explicit\" : \"inherited\" },\n\t);\n\tif (resolved || explicitModel === undefined) return resolved;\n\treturn resolveSubagentModelOverride(\n\t\tagentModel,\n\t\tparentModel,\n\t\tavailableModels,\n\t\tpreferredProvider,\n\t\t{ ...options, source: \"inherited\" },\n\t);\n}\n\n// lunr: model tier bridge — every executable child must resolve one configured tier.\nexport function resolveTierModelOverride(tier: unknown): string | undefined {\n\tif (tier !== \"light\" && tier !== \"standard\" && tier !== \"heavy\") {\n\t\tthrow new Error(\"Every subagent execution requires tier: \\\"light\\\", \\\"standard\\\", or \\\"heavy\\\".\");\n\t}\n\tconst tierName = tier.trim();\n\ttry {\n\t\tconst bridge = (globalThis as Record<symbol, unknown>)[Symbol.for(\"@lunr/model-tiers\")] as\n\t\t\t| { getTierModel?: (tier: string) => unknown; isTierModeEnabled?: () => unknown }\n\t\t\t| undefined;\n\t\tif (typeof bridge?.isTierModeEnabled !== \"function\" || typeof bridge?.getTierModel !== \"function\") {\n\t\t\tthrow new Error(\"Model tier settings are unavailable. Reload lunR and try again.\");\n\t\t}\n\t\tif (bridge.isTierModeEnabled() !== true) {\n\t\t\tthrow new Error(\"Model tiers are disabled. Enable them in /settings before launching a subagent.\");\n\t\t}\n\t\tconst model = bridge.getTierModel(tierName);\n\t\tif (typeof model !== \"string\" || !model.trim()) {\n\t\t\tthrow new Error(`Model tier '${tierName}' has no configured model. Configure it in /settings before launching a subagent.`);\n\t\t}\n\t\tconst trimmed = model.trim();\n\t\tconst thinking =\n\t\t\ttypeof bridge.getTierThinking === \"function\" ? bridge.getTierThinking(tierName) : undefined;\n\t\tconst parent = typeof bridge.getParentThinking === \"function\" ? bridge.getParentThinking() : undefined;\n\t\tconst level = (typeof thinking === \"string\" && thinking ? thinking : undefined) ?? (typeof parent === \"string\" && parent ? parent : undefined);\n\t\tif (!level) return trimmed;\n\t\treturn applyThinkingSuffix(trimmed, level, true) ?? trimmed;\n\t} catch (error) {\n\t\tthrow error instanceof Error ? error : new Error(String(error));\n\t}\n}\n\n/** Resolve a required tier and prove its configured model is available to this session. */\nexport function resolveRequiredTierModel(\n\ttier: unknown,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n): string {\n\tconst configured = resolveTierModelOverride(tier);\n\tif (!configured) throw new Error(`Model tier '${String(tier)}' could not be resolved.`);\n\tif (!availableModels?.length) {\n\t\tthrow new Error(`Model tier '${String(tier)}' cannot launch because no authenticated models are available.`);\n\t}\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(configured);\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (!resolvedBase) {\n\t\tthrow new Error(\n\t\t\t`Model tier '${String(tier)}' resolves to '${baseModel}', but that model is unavailable or unauthenticated. Configure an available model in /settings.`,\n\t\t);\n\t}\n\treturn `${resolvedBase}${thinkingSuffix}`;\n}\n\nfunction requestedModelString(model: unknown): string | undefined {\n\treturn typeof model === \"string\" && model.trim() && model.trim() !== INHERIT_MODEL ? model.trim() : undefined;\n}\n\nfunction requestedTier(tier: unknown): ChildTier | undefined {\n\treturn tier === \"light\" || tier === \"standard\" || tier === \"heavy\" ? tier : undefined;\n}\n\nfunction parseExplicitThinking(value: unknown, pathLabel = \"thinking\"): ThinkingLevel | undefined {\n\tif (value === undefined) return undefined;\n\tif (value === false || value === \"off\") return \"off\";\n\tif (typeof value !== \"string\" || !(THINKING_LEVELS as readonly string[]).includes(value)) {\n\t\tthrow new Error(`${pathLabel} must be one of ${THINKING_LEVELS.join(\", \")}.`);\n\t}\n\treturn value as ThinkingLevel;\n}\n\n/**\n * Capture how a child model was selected from the original requested params.\n * Must run before callers replace `model` with a resolved override.\n * Exactly one of tier or model; inherit and both are rejected.\n */\nexport function captureModelSelection(input: { model?: unknown; tier?: unknown }): ModelSelection {\n\tconst model = typeof input.model === \"string\" ? input.model.trim() : \"\";\n\tconst hasModel = Boolean(model);\n\tconst tier = requestedTier(input.tier);\n\tif (hasModel && model === INHERIT_MODEL) {\n\t\tthrow new Error('model \"inherit\" is not supported; choose tier: \"light\", \"standard\", or \"heavy\", or an explicit provider/model.');\n\t}\n\tif (hasModel && tier) {\n\t\tthrow new Error('Choose exactly one of tier or model; do not pass both.');\n\t}\n\tif (hasModel) return { kind: \"model\", model };\n\tif (tier) return { kind: \"tier\", tier };\n\tthrow new Error('Every executable child requires tier: \"light\", \"standard\", or \"heavy\", or an explicit model when the user names one.');\n}\n\n/** Resolve and validate an explicit provider/model (+ optional thinking) with no silent fallback. */\nexport function resolveRequiredExplicitModel(\n\tmodel: unknown,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\tthinking?: unknown,\n): string {\n\tconst requested = requestedModelString(model);\n\tif (!requested) {\n\t\tthrow new Error('Explicit model selection requires model as \"provider/id\".');\n\t}\n\tif (!availableModels?.length) {\n\t\tthrow new Error(`Model '${requested}' cannot launch because no authenticated models are available.`);\n\t}\n\tconst { baseModel, thinkingSuffix } = splitThinkingSuffix(requested);\n\tconst resolvedBase = resolveBaseModelCandidate(baseModel, availableModels, preferredProvider);\n\tif (!resolvedBase) {\n\t\tthrow new Error(\n\t\t\t`Model '${baseModel}' is unavailable or unauthenticated. Choose an available provider/model or a configured tier.`,\n\t\t);\n\t}\n\tconst fromSuffix = thinkingSuffix ? thinkingSuffix.slice(1) : undefined;\n\tconst fromParam = parseExplicitThinking(thinking);\n\tif (fromSuffix && fromParam && fromSuffix !== fromParam) {\n\t\tthrow new Error(`Conflicting thinking levels '${fromSuffix}' and '${fromParam}' for model '${requested}'.`);\n\t}\n\tconst level = fromParam ?? fromSuffix;\n\tif (!level) return resolvedBase;\n\tconst info = availableModels.find((entry) => entry.fullId === resolvedBase);\n\tconst supported = getSupportedThinkingLevels(info);\n\tif (!supported.includes(level as ThinkingLevel)) {\n\t\tthrow new Error(\n\t\t\t`Thinking level '${level}' is not supported by '${resolvedBase}'. Supported: ${supported.join(\", \") || \"none\"}.`,\n\t\t);\n\t}\n\treturn applyThinkingSuffix(resolvedBase, level, true) ?? resolvedBase;\n}\n\n/** Resolve the launch model from a captured selection. Tier uses configured thinking; model uses optional explicit thinking. */\nexport function resolveExecutableChildModel(input: {\n\tmodelSelection?: ModelSelection;\n\ttier?: unknown;\n\tmodel?: unknown;\n\tthinking?: unknown;\n\tavailableModels?: AvailableModelInfo[];\n\tpreferredProvider?: string;\n}): string {\n\tconst selection = input.modelSelection ?? captureModelSelection({ model: input.model, tier: input.tier });\n\tif (selection.kind === \"tier\") {\n\t\tif (input.thinking !== undefined) {\n\t\t\tthrow new Error('thinking is only valid with an explicit model; tier children use the configured tier thinking level.');\n\t\t}\n\t\treturn resolveRequiredTierModel(selection.tier, input.availableModels, input.preferredProvider);\n\t}\n\treturn resolveRequiredExplicitModel(input.model, input.availableModels, input.preferredProvider, input.thinking);\n}\n\nexport interface BuildModelCandidatesOptions {\n\t/** Fallback models are inherited agent config and warn, rather than error, when out of scope. */\n\tscope?: ModelScopeConfig;\n\tonWarn?: (violation: ModelScopeViolation) => void;\n}\n\nexport function buildModelCandidates(\n\tprimaryModel: string | undefined,\n\tfallbackModels: string[] | undefined,\n\tavailableModels: AvailableModelInfo[] | undefined,\n\tpreferredProvider?: string,\n\toptions?: BuildModelCandidatesOptions,\n): string[] {\n\tconst seen = new Set<string>();\n\tconst candidates: string[] = [];\n\tconst rawCandidates = [primaryModel, ...(fallbackModels ?? [])];\n\tfor (let index = 0; index < rawCandidates.length; index++) {\n\t\tconst raw = rawCandidates[index];\n\t\tif (!raw) continue;\n\t\tconst normalized = resolveModelCandidate(raw.trim(), availableModels, preferredProvider);\n\t\tif (!normalized || seen.has(normalized)) continue;\n\t\tif (index > 0 && options?.scope?.enforce) {\n\t\t\tconst violation = checkModelScope(normalized, options.scope, \"inherited\");\n\t\t\tif (violation) (options.onWarn ?? defaultScopeWarn)(violation);\n\t\t}\n\t\tseen.add(normalized);\n\t\tcandidates.push(normalized);\n\t}\n\treturn candidates;\n}\n\nconst RETRYABLE_MODEL_FAILURE_PATTERNS = [\n\t/rate\\s*limit/i,\n\t/too many requests/i,\n\t/\\b429\\b/,\n\t/quota/i,\n\t/billing/i,\n\t/credit/i,\n\t/auth(?:entication)?/i,\n\t/unauthori[sz]ed/i,\n\t/forbidden/i,\n\t/api key/i,\n\t/token expired/i,\n\t/invalid key/i,\n\t/provider.*unavailable/i,\n\t/model.*unavailable/i,\n\t/model.*disabled/i,\n\t/model.*not found/i,\n\t/unknown model/i,\n\t/overloaded/i,\n\t/service unavailable/i,\n\t/temporar(?:ily)? unavailable/i,\n\t/connection refused/i,\n\t/fetch failed/i,\n\t/network error/i,\n\t/socket hang up/i,\n\t/stream ended without finish_reason/i,\n\t/upstream/i,\n\t/timed? out/i,\n\t/timeout/i,\n\t/\\b502\\b/,\n\t/\\b503\\b/,\n\t/\\b504\\b/,\n\t/cold.?start/i,\n\t/empty response/i,\n\t/no output/i,\n\t/model.*(?:load|fail|error)/i,\n];\n\n/**\n * Failures reported as `<tool> failed (exit N): ...` or `<tool> failed with\n * exit code N` come from a tool call inside the child's task, not from the\n * provider/model, however network-flavored their details read. Retrying a\n * different model cannot fix them and would rerun the whole task. Tool names\n * include namespaced forms like `mcp.server/write`.\n */\nconst TOOL_FAILURE_PREFIX = /^[\\w.:@/-]+ failed (?:(?:\\(exit \\d+\\):)|(?:with exit code \\d+))(?:\\s|$)/i;\n\nexport function isRetryableModelFailure(error: string | undefined): boolean {\n\tif (!error) return false;\n\tif (TOOL_FAILURE_PREFIX.test(error.trim())) return false;\n\treturn RETRYABLE_MODEL_FAILURE_PATTERNS.some((pattern) => pattern.test(error));\n}\n\nexport function formatModelAttemptNote(attempt: ModelAttemptSummary, nextModel?: string): string {\n\tconst failure = attempt.error?.trim() || `exit ${attempt.exitCode ?? 1}`;\n\treturn nextModel\n\t\t? `[fallback] ${attempt.model} failed: ${failure}. Retrying with ${nextModel}.`\n\t\t: `[fallback] ${attempt.model} failed: ${failure}.`;\n}\n"]}
@@ -78,20 +78,19 @@ export declare function isParallelGroup(step: RunnerStep): step is ParallelStepG
78
78
  export declare function isDynamicRunnerGroup(step: RunnerStep): step is DynamicRunnerGroup;
79
79
  export declare function flattenSteps(steps: RunnerStep[]): RunnerSubagentStep[];
80
80
  export declare const DEFAULT_GLOBAL_CONCURRENCY_LIMIT: number;
81
- /**
82
- * A promise-based semaphore for limiting concurrent access across multiple
83
- * mapConcurrent calls within a single run. Enforces a global cap on the total
84
- * number of subagent tasks executing simultaneously, regardless of each step's
85
- * per-step concurrency limit.
86
- */
81
+ export declare const PARALLEL_COLD_START_ALLOWANCE_MS = 1000;
82
+ /** Run-wide concurrency cap, with removable waits for cancelled launches. */
87
83
  export declare class Semaphore {
88
84
  private available;
89
85
  private readonly queue;
90
86
  constructor(limit: number);
91
- acquire(): Promise<void>;
87
+ acquire(signal?: AbortSignal): Promise<void>;
92
88
  release(): void;
93
89
  }
94
- export declare function mapConcurrent<T, R>(items: T[], limit: number, fn: (item: T, i: number) => Promise<R>, globalSemaphore?: Semaphore): Promise<R[]>;
90
+ export declare function mapConcurrent<T, R>(items: T[], limit: number, fn: (item: T, i: number) => Promise<R>, globalSemaphore?: Semaphore, cancellation?: {
91
+ signal?: AbortSignal;
92
+ onAbort: (item: T, i: number) => R;
93
+ }): Promise<R[]>;
95
94
  export interface ParallelTaskResult {
96
95
  agent: string;
97
96
  taskIndex?: number;
@@ -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":"AACA,MAAM,WAAW,kBAAkB;IAClC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oFAAoF;IACpF,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,wDAAwD;IACxD,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,GAAG,WAAW,CAAC;IACnC,IAAI,CAAC,EAAE,OAAO,uBAAuB,EAAE,SAAS,CAAC;IACjD,IAAI,EAAE,MAAM,CAAC;IACb,eAAe,CAAC,EAAE;QACjB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,KAAK,EAAE,MAAM,CAAC;KACd,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,uBAAuB,EAAE,cAAc,CAAC;IAChE,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,sBAAsB,CAAC,EAAE,MAAM,EAAE,CAAC;IAClC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,gBAAgB,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IACxC,qBAAqB,EAAE,OAAO,CAAC;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,8FAA8F;IAC9F,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,UAAU,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,gBAAgB,CAAC,EAAE;QAClB,MAAM,EAAE,OAAO,uBAAuB,EAAE,gBAAgB,CAAC;QACzD,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,sBAAsB,CAAC,EAAE,OAAO,uBAAuB,EAAE,gBAAgB,CAAC;IAC1E,mBAAmB,CAAC,EAAE,OAAO,uBAAuB,EAAE,wBAAwB,CAAC;IAC/E,eAAe,CAAC,EAAE,OAAO,uBAAuB,EAAE,eAAe,CAAC;IAClE,cAAc,CAAC,EAAE,OAAO,uBAAuB,EAAE,cAAc,CAAC;IAChE,UAAU,CAAC,EAAE,OAAO,uBAAuB,EAAE,kBAAkB,CAAC;CAChE;AAED,MAAM,WAAW,iBAAiB;IACjC,QAAQ,EAAE,kBAAkB,EAAE,CAAC;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAClC,MAAM,EAAE,OAAO,0BAA0B,EAAE,iBAAiB,CAAC;IAC7D,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,OAAO,EAAE,OAAO,0BAA0B,EAAE,kBAAkB,CAAC;IAC/D,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IACtC,iBAAiB,CAAC,EAAE,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC;IAC3C,mBAAmB,CAAC,EAAE,OAAO,uBAAuB,EAAE,wBAAwB,CAAC;IAC/E,eAAe,CAAC,EAAE,OAAO,uBAAuB,EAAE,eAAe,CAAC;IAClE,cAAc,CAAC,EAAE,OAAO,uBAAuB,EAAE,cAAc,CAAC;CAChE;AAED,MAAM,MAAM,UAAU,GAAG,kBAAkB,GAAG,iBAAiB,GAAG,kBAAkB,CAAC;AAErF,wBAAgB,eAAe,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,IAAI,iBAAiB,CAE3E;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,IAAI,kBAAkB,CAEjF;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,kBAAkB,EAAE,CAYtE;AAED,eAAO,MAAM,gCAAgC,QAA0B,CAAC;AAOxE;;;;;GAKG;AACH,qBAAa,SAAS;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAyB;IAE/C,YAAY,KAAK,EAAE,MAAM,EAExB;IAED,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAQvB;IAED,OAAO,IAAI,IAAI,CAOd;CACD;AAED,wBAAsB,aAAa,CAAC,CAAC,EAAE,CAAC,EACvC,KAAK,EAAE,CAAC,EAAE,EACV,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,EACtC,eAAe,CAAC,EAAE,SAAS,GACzB,OAAO,CAAC,CAAC,EAAE,CAAC,CA8Bd;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,wBAAgB,wBAAwB,CACvC,OAAO,EAAE,kBAAkB,EAAE,EAC7B,YAAY,GAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,KAAK,MACJ,GAC1C,MAAM,CAuBR;AAED,eAAO,MAAM,wBAAwB,QAA0B,CAAC","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
+ {"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// Give the first child a small head start for prompt-cache creation. All\n// siblings share this one deadline, even when bounded workers reuse slots.\nexport const PARALLEL_COLD_START_ALLOWANCE_MS = 1000;\n\n/** Run-wide concurrency cap, with removable waits for cancelled launches. */\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(signal?: AbortSignal): Promise<void> {\n\t\tsignal?.throwIfAborted();\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, reject) => {\n\t\t\tconst grant = () => {\n\t\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\t\tresolve();\n\t\t\t};\n\t\t\tconst abort = () => {\n\t\t\t\tconst index = this.queue.indexOf(grant);\n\t\t\t\tif (index !== -1) this.queue.splice(index, 1);\n\t\t\t\treject(signal?.reason);\n\t\t\t};\n\t\t\tthis.queue.push(grant);\n\t\t\tsignal?.addEventListener(\"abort\", abort, { once: true });\n\t\t});\n\t}\n\n\trelease(): void {\n\t\tconst next = this.queue.shift();\n\t\tif (next) next();\n\t\telse this.available++;\n\t}\n}\n\nfunction waitForLaunch(delayMs: number, signal?: AbortSignal): Promise<void> {\n\tsignal?.throwIfAborted();\n\tif (delayMs <= 0) return Promise.resolve();\n\treturn new Promise<void>((resolve, reject) => {\n\t\tconst timer = setTimeout(() => {\n\t\t\tsignal?.removeEventListener(\"abort\", abort);\n\t\t\tresolve();\n\t\t}, delayMs);\n\t\tconst abort = () => {\n\t\t\tclearTimeout(timer);\n\t\t\treject(signal?.reason);\n\t\t};\n\t\tsignal?.addEventListener(\"abort\", abort, { once: true });\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\tcancellation?: { signal?: AbortSignal; onAbort: (item: T, i: number) => R },\n): Promise<R[]> {\n\tconst safeLimit = Math.max(1, Math.floor(limit) || 1);\n\tconst results: R[] = new Array(items.length);\n\tconst launchDeadline = Date.now() + (safeLimit > 1 ? PARALLEL_COLD_START_ALLOWANCE_MS : 0);\n\tconst signal = cancellation?.signal;\n\tlet launchReady: Promise<void> | undefined;\n\tlet next = 0;\n\n\tasync function worker(): Promise<void> {\n\t\twhile (next < items.length) {\n\t\t\tconst i = next++;\n\t\t\tlet acquired = false;\n\t\t\ttry {\n\t\t\t\ttry {\n\t\t\t\t\tawait (i === 0 ? waitForLaunch(0, signal) : launchReady ??= waitForLaunch(launchDeadline - Date.now(), signal));\n\t\t\t\t\tif (globalSemaphore) {\n\t\t\t\t\t\tawait globalSemaphore.acquire(signal);\n\t\t\t\t\t\tacquired = true;\n\t\t\t\t\t}\n\t\t\t\t\tsignal?.throwIfAborted();\n\t\t\t\t} catch (error) {\n\t\t\t\t\tif (!signal?.aborted || !cancellation) throw error;\n\t\t\t\t\tresults[i] = cancellation.onAbort(items[i], i);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tresults[i] = await fn(items[i], i);\n\t\t\t} finally {\n\t\t\t\tif (acquired) globalSemaphore!.release();\n\t\t\t}\n\t\t}\n\t}\n\n\tawait Promise.all(Array.from({ length: Math.min(safeLimit, items.length) }, () => worker()));\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"]}