@bastani/atomic 0.9.24-alpha.1 → 0.9.25-alpha.1

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 (416) hide show
  1. package/CHANGELOG.md +54 -0
  2. package/dist/builtin/intercom/index.bundle.mjs +5 -0
  3. package/dist/builtin/intercom/package.json +2 -2
  4. package/dist/builtin/mcp/CHANGELOG.md +17 -0
  5. package/dist/builtin/mcp/index.bundle.mjs +219 -71
  6. package/dist/builtin/mcp/package.json +6 -2
  7. package/dist/builtin/subagents/package.json +3 -3
  8. package/dist/builtin/subagents/src/extension/index.bundle.mjs +1 -0
  9. package/dist/builtin/web-access/index.bundle.mjs +7 -6
  10. package/dist/builtin/web-access/package.json +2 -2
  11. package/dist/builtin/workflows/CHANGELOG.md +17 -0
  12. package/dist/builtin/workflows/package.json +2 -2
  13. package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +1 -0
  14. package/dist/builtin/workflows/skills/prompt-engineer/references/gpt_6_1_sol.md +66 -0
  15. package/dist/builtin/workflows/src/extension/index.bundle.mjs +1 -0
  16. package/dist/cli/startup-ui.d.ts +3 -4
  17. package/dist/cli/startup-ui.d.ts.map +1 -1
  18. package/dist/cli/startup-ui.js +3 -4
  19. package/dist/cli/startup-ui.js.map +1 -1
  20. package/dist/config.d.ts +3 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +17 -0
  23. package/dist/config.js.map +1 -1
  24. package/dist/core/agent-session-events.d.ts.map +1 -1
  25. package/dist/core/agent-session-events.js +5 -0
  26. package/dist/core/agent-session-events.js.map +1 -1
  27. package/dist/core/agent-session-export.d.ts.map +1 -1
  28. package/dist/core/agent-session-export.js +3 -0
  29. package/dist/core/agent-session-export.js.map +1 -1
  30. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  31. package/dist/core/agent-session-extension-bindings.js +4 -0
  32. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  33. package/dist/core/agent-session-methods.d.ts +2 -1
  34. package/dist/core/agent-session-methods.d.ts.map +1 -1
  35. package/dist/core/agent-session-methods.js.map +1 -1
  36. package/dist/core/agent-session-nested-tools.d.ts +10 -0
  37. package/dist/core/agent-session-nested-tools.d.ts.map +1 -0
  38. package/dist/core/agent-session-nested-tools.js +76 -0
  39. package/dist/core/agent-session-nested-tools.js.map +1 -0
  40. package/dist/core/agent-session-runtime-auth.js +3 -1
  41. package/dist/core/agent-session-runtime-auth.js.map +1 -1
  42. package/dist/core/agent-session-state.d.ts +2 -0
  43. package/dist/core/agent-session-state.d.ts.map +1 -1
  44. package/dist/core/agent-session-state.js +11 -11
  45. package/dist/core/agent-session-state.js.map +1 -1
  46. package/dist/core/agent-session-tool-hooks.d.ts.map +1 -1
  47. package/dist/core/agent-session-tool-hooks.js +18 -3
  48. package/dist/core/agent-session-tool-hooks.js.map +1 -1
  49. package/dist/core/agent-session-tool-registry.d.ts.map +1 -1
  50. package/dist/core/agent-session-tool-registry.js +15 -3
  51. package/dist/core/agent-session-tool-registry.js.map +1 -1
  52. package/dist/core/agent-session-types.d.ts +6 -2
  53. package/dist/core/agent-session-types.d.ts.map +1 -1
  54. package/dist/core/agent-session-types.js.map +1 -1
  55. package/dist/core/compaction/utils.d.ts +1 -1
  56. package/dist/core/compaction/utils.d.ts.map +1 -1
  57. package/dist/core/compaction/utils.js +18 -18
  58. package/dist/core/compaction/utils.js.map +1 -1
  59. package/dist/core/execution-model-router.d.ts.map +1 -1
  60. package/dist/core/execution-model-router.js +24 -8
  61. package/dist/core/execution-model-router.js.map +1 -1
  62. package/dist/core/export-html/template.js +12 -0
  63. package/dist/core/extensions/agent-events.d.ts +3 -0
  64. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  65. package/dist/core/extensions/agent-events.js.map +1 -1
  66. package/dist/core/extensions/api-types.d.ts +2 -0
  67. package/dist/core/extensions/api-types.d.ts.map +1 -1
  68. package/dist/core/extensions/api-types.js.map +1 -1
  69. package/dist/core/extensions/context-types.d.ts +9 -0
  70. package/dist/core/extensions/context-types.d.ts.map +1 -1
  71. package/dist/core/extensions/context-types.js.map +1 -1
  72. package/dist/core/extensions/event-results.d.ts +3 -0
  73. package/dist/core/extensions/event-results.d.ts.map +1 -1
  74. package/dist/core/extensions/event-results.js.map +1 -1
  75. package/dist/core/extensions/index.d.ts +2 -0
  76. package/dist/core/extensions/index.d.ts.map +1 -1
  77. package/dist/core/extensions/index.js.map +1 -1
  78. package/dist/core/extensions/loader-api.d.ts.map +1 -1
  79. package/dist/core/extensions/loader-api.js +4 -0
  80. package/dist/core/extensions/loader-api.js.map +1 -1
  81. package/dist/core/extensions/loader-core.d.ts.map +1 -1
  82. package/dist/core/extensions/loader-core.js +3 -5
  83. package/dist/core/extensions/loader-core.js.map +1 -1
  84. package/dist/core/extensions/loader-host-modules.d.ts.map +1 -1
  85. package/dist/core/extensions/loader-host-modules.js +7 -1
  86. package/dist/core/extensions/loader-host-modules.js.map +1 -1
  87. package/dist/core/extensions/loader-runtime.d.ts.map +1 -1
  88. package/dist/core/extensions/loader-runtime.js +3 -0
  89. package/dist/core/extensions/loader-runtime.js.map +1 -1
  90. package/dist/core/extensions/loader-virtual-modules.d.ts.map +1 -1
  91. package/dist/core/extensions/loader-virtual-modules.js +4 -0
  92. package/dist/core/extensions/loader-virtual-modules.js.map +1 -1
  93. package/dist/core/extensions/provider-types.d.ts +2 -0
  94. package/dist/core/extensions/provider-types.d.ts.map +1 -1
  95. package/dist/core/extensions/provider-types.js.map +1 -1
  96. package/dist/core/extensions/runner-events.d.ts.map +1 -1
  97. package/dist/core/extensions/runner-events.js +16 -1
  98. package/dist/core/extensions/runner-events.js.map +1 -1
  99. package/dist/core/extensions/runner.d.ts +5 -0
  100. package/dist/core/extensions/runner.d.ts.map +1 -1
  101. package/dist/core/extensions/runner.js +34 -0
  102. package/dist/core/extensions/runner.js.map +1 -1
  103. package/dist/core/extensions/runtime-types.d.ts +5 -0
  104. package/dist/core/extensions/runtime-types.d.ts.map +1 -1
  105. package/dist/core/extensions/runtime-types.js.map +1 -1
  106. package/dist/core/extensions/tool-events.d.ts +4 -0
  107. package/dist/core/extensions/tool-events.d.ts.map +1 -1
  108. package/dist/core/extensions/tool-events.js.map +1 -1
  109. package/dist/core/extensions/tool-types.d.ts +34 -3
  110. package/dist/core/extensions/tool-types.d.ts.map +1 -1
  111. package/dist/core/extensions/tool-types.js.map +1 -1
  112. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  113. package/dist/core/extensions/wrapper.js +14 -2
  114. package/dist/core/extensions/wrapper.js.map +1 -1
  115. package/dist/core/fast-model-routing-transport.d.ts.map +1 -1
  116. package/dist/core/fast-model-routing-transport.js +2 -1
  117. package/dist/core/fast-model-routing-transport.js.map +1 -1
  118. package/dist/core/fast-model-routing.d.ts +1 -2
  119. package/dist/core/fast-model-routing.d.ts.map +1 -1
  120. package/dist/core/fast-model-routing.js +13 -11
  121. package/dist/core/fast-model-routing.js.map +1 -1
  122. package/dist/core/fast-model-variants.d.ts +4 -1
  123. package/dist/core/fast-model-variants.d.ts.map +1 -1
  124. package/dist/core/fast-model-variants.js +42 -17
  125. package/dist/core/fast-model-variants.js.map +1 -1
  126. package/dist/core/model-registry.d.ts +4 -1
  127. package/dist/core/model-registry.d.ts.map +1 -1
  128. package/dist/core/model-registry.js +9 -0
  129. package/dist/core/model-registry.js.map +1 -1
  130. package/dist/core/model-resolver-defaults.js +1 -1
  131. package/dist/core/model-resolver-defaults.js.map +1 -1
  132. package/dist/core/model-routing-candidates.d.ts +4 -0
  133. package/dist/core/model-routing-candidates.d.ts.map +1 -1
  134. package/dist/core/model-routing-candidates.js +8 -3
  135. package/dist/core/model-routing-candidates.js.map +1 -1
  136. package/dist/core/model-routing-evals.d.ts.map +1 -1
  137. package/dist/core/model-routing-evals.js +4 -5
  138. package/dist/core/model-routing-evals.js.map +1 -1
  139. package/dist/core/model-runtime.d.ts +3 -2
  140. package/dist/core/model-runtime.d.ts.map +1 -1
  141. package/dist/core/model-runtime.js +19 -25
  142. package/dist/core/model-runtime.js.map +1 -1
  143. package/dist/core/nested-tool-calls.d.ts +64 -0
  144. package/dist/core/nested-tool-calls.d.ts.map +1 -0
  145. package/dist/core/nested-tool-calls.js +132 -0
  146. package/dist/core/nested-tool-calls.js.map +1 -0
  147. package/dist/core/package-manager-resolver.d.ts.map +1 -1
  148. package/dist/core/package-manager-resolver.js +21 -3
  149. package/dist/core/package-manager-resolver.js.map +1 -1
  150. package/dist/core/package-manager-resource-accumulator.d.ts.map +1 -1
  151. package/dist/core/package-manager-resource-accumulator.js +2 -0
  152. package/dist/core/package-manager-resource-accumulator.js.map +1 -1
  153. package/dist/core/package-manager-types.d.ts +2 -0
  154. package/dist/core/package-manager-types.d.ts.map +1 -1
  155. package/dist/core/package-manager-types.js.map +1 -1
  156. package/dist/core/package-manager.d.ts.map +1 -1
  157. package/dist/core/package-manager.js +1 -0
  158. package/dist/core/package-manager.js.map +1 -1
  159. package/dist/core/resource-loader-core.d.ts.map +1 -1
  160. package/dist/core/resource-loader-core.js +12 -6
  161. package/dist/core/resource-loader-core.js.map +1 -1
  162. package/dist/core/resource-loader-extensions.d.ts +1 -0
  163. package/dist/core/resource-loader-extensions.d.ts.map +1 -1
  164. package/dist/core/resource-loader-extensions.js +64 -4
  165. package/dist/core/resource-loader-extensions.js.map +1 -1
  166. package/dist/core/resource-loader-paths.d.ts.map +1 -1
  167. package/dist/core/resource-loader-paths.js +2 -1
  168. package/dist/core/resource-loader-paths.js.map +1 -1
  169. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  170. package/dist/core/resource-loader-reload.js +5 -4
  171. package/dist/core/resource-loader-reload.js.map +1 -1
  172. package/dist/core/resource-loader-source-info.d.ts.map +1 -1
  173. package/dist/core/resource-loader-source-info.js +7 -5
  174. package/dist/core/resource-loader-source-info.js.map +1 -1
  175. package/dist/core/sdk-types.d.ts +1 -1
  176. package/dist/core/sdk-types.js.map +1 -1
  177. package/dist/core/session-manager-core.d.ts +2 -0
  178. package/dist/core/session-manager-core.d.ts.map +1 -1
  179. package/dist/core/session-manager-core.js +5 -1
  180. package/dist/core/session-manager-core.js.map +1 -1
  181. package/dist/core/session-manager-entries.d.ts +1 -1
  182. package/dist/core/session-manager-entries.d.ts.map +1 -1
  183. package/dist/core/session-manager-entries.js.map +1 -1
  184. package/dist/core/settings-manager-basic-accessors.d.ts +4 -0
  185. package/dist/core/settings-manager-basic-accessors.d.ts.map +1 -1
  186. package/dist/core/settings-manager-basic-accessors.js +27 -1
  187. package/dist/core/settings-manager-basic-accessors.js.map +1 -1
  188. package/dist/core/settings-manager-core.d.ts +2 -0
  189. package/dist/core/settings-manager-core.d.ts.map +1 -1
  190. package/dist/core/settings-manager-core.js +4 -0
  191. package/dist/core/settings-manager-core.js.map +1 -1
  192. package/dist/core/settings-manager-ui-accessors.d.ts +3 -1
  193. package/dist/core/settings-manager-ui-accessors.d.ts.map +1 -1
  194. package/dist/core/settings-manager-ui-accessors.js +13 -0
  195. package/dist/core/settings-manager-ui-accessors.js.map +1 -1
  196. package/dist/core/settings-manager.d.ts +1 -1
  197. package/dist/core/settings-manager.d.ts.map +1 -1
  198. package/dist/core/settings-manager.js.map +1 -1
  199. package/dist/core/settings-merge.d.ts +1 -0
  200. package/dist/core/settings-merge.d.ts.map +1 -1
  201. package/dist/core/settings-merge.js +30 -1
  202. package/dist/core/settings-merge.js.map +1 -1
  203. package/dist/core/settings-types.d.ts +8 -1
  204. package/dist/core/settings-types.d.ts.map +1 -1
  205. package/dist/core/settings-types.js.map +1 -1
  206. package/dist/core/source-info.d.ts +3 -0
  207. package/dist/core/source-info.d.ts.map +1 -1
  208. package/dist/core/source-info.js +11 -0
  209. package/dist/core/source-info.js.map +1 -1
  210. package/dist/core/tool-loadout.d.ts +6 -0
  211. package/dist/core/tool-loadout.d.ts.map +1 -0
  212. package/dist/core/tool-loadout.js +63 -0
  213. package/dist/core/tool-loadout.js.map +1 -0
  214. package/dist/core/tools/ask-user-question/ask-user-question.d.ts.map +1 -1
  215. package/dist/core/tools/ask-user-question/ask-user-question.js +1 -0
  216. package/dist/core/tools/ask-user-question/ask-user-question.js.map +1 -1
  217. package/dist/core/tools/bash.d.ts.map +1 -1
  218. package/dist/core/tools/bash.js +31 -11
  219. package/dist/core/tools/bash.js.map +1 -1
  220. package/dist/core/tools/output-accumulator.d.ts +4 -0
  221. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  222. package/dist/core/tools/output-accumulator.js +32 -0
  223. package/dist/core/tools/output-accumulator.js.map +1 -1
  224. package/dist/core/tools/powershell.d.ts +27 -21
  225. package/dist/core/tools/powershell.d.ts.map +1 -1
  226. package/dist/core/tools/render-utils.d.ts +4 -0
  227. package/dist/core/tools/render-utils.d.ts.map +1 -1
  228. package/dist/core/tools/render-utils.js +19 -0
  229. package/dist/core/tools/render-utils.js.map +1 -1
  230. package/dist/core/tools/tool-concurrency.d.ts +1 -1
  231. package/dist/core/tools/tool-concurrency.d.ts.map +1 -1
  232. package/dist/core/tools/tool-concurrency.js +28 -3
  233. package/dist/core/tools/tool-concurrency.js.map +1 -1
  234. package/dist/core/tools/tool-definition-wrapper.d.ts +1 -1
  235. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  236. package/dist/core/tools/tool-definition-wrapper.js +4 -1
  237. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  238. package/dist/core/usage-totals.d.ts +2 -0
  239. package/dist/core/usage-totals.d.ts.map +1 -1
  240. package/dist/core/usage-totals.js +23 -0
  241. package/dist/core/usage-totals.js.map +1 -1
  242. package/dist/extensions/codemode/execute.d.ts +10 -0
  243. package/dist/extensions/codemode/execute.d.ts.map +1 -0
  244. package/dist/extensions/codemode/execute.js +313 -0
  245. package/dist/extensions/codemode/execute.js.map +1 -0
  246. package/dist/extensions/codemode/index.d.ts +11 -0
  247. package/dist/extensions/codemode/index.d.ts.map +1 -0
  248. package/dist/extensions/codemode/index.js +14 -0
  249. package/dist/extensions/codemode/index.js.map +1 -0
  250. package/dist/extensions/codemode/renderer.d.ts +4 -0
  251. package/dist/extensions/codemode/renderer.d.ts.map +1 -0
  252. package/dist/extensions/codemode/renderer.js +78 -0
  253. package/dist/extensions/codemode/renderer.js.map +1 -0
  254. package/dist/extensions/codemode/tool.d.ts +51 -0
  255. package/dist/extensions/codemode/tool.d.ts.map +1 -0
  256. package/dist/extensions/codemode/tool.js +134 -0
  257. package/dist/extensions/codemode/tool.js.map +1 -0
  258. package/dist/extensions/codemode/worker.d.ts +2 -0
  259. package/dist/extensions/codemode/worker.d.ts.map +1 -0
  260. package/dist/extensions/codemode/worker.js +2 -0
  261. package/dist/extensions/codemode/worker.js.map +1 -0
  262. package/dist/extensions/index.d.ts.map +1 -1
  263. package/dist/extensions/index.js +5 -1
  264. package/dist/extensions/index.js.map +1 -1
  265. package/dist/extensions/llama/provider.d.ts.map +1 -1
  266. package/dist/extensions/llama/provider.js +31 -10
  267. package/dist/extensions/llama/provider.js.map +1 -1
  268. package/dist/extensions/tool-search/index.d.ts +5 -0
  269. package/dist/extensions/tool-search/index.d.ts.map +1 -0
  270. package/dist/extensions/tool-search/index.js +6 -0
  271. package/dist/extensions/tool-search/index.js.map +1 -0
  272. package/dist/extensions/tool-search/tool.d.ts +41 -0
  273. package/dist/extensions/tool-search/tool.d.ts.map +1 -0
  274. package/dist/extensions/tool-search/tool.js +161 -0
  275. package/dist/extensions/tool-search/tool.js.map +1 -0
  276. package/dist/index.d.ts +7 -0
  277. package/dist/index.d.ts.map +1 -1
  278. package/dist/index.js +5 -0
  279. package/dist/index.js.map +1 -1
  280. package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -0
  281. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  282. package/dist/modes/interactive/components/chat-message-renderer.js +2 -0
  283. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  284. package/dist/modes/interactive/components/config-selector-list.d.ts.map +1 -1
  285. package/dist/modes/interactive/components/config-selector-list.js +9 -1
  286. package/dist/modes/interactive/components/config-selector-list.js.map +1 -1
  287. package/dist/modes/interactive/components/config-selector-project-scope.d.ts.map +1 -1
  288. package/dist/modes/interactive/components/config-selector-project-scope.js +4 -1
  289. package/dist/modes/interactive/components/config-selector-project-scope.js.map +1 -1
  290. package/dist/modes/interactive/components/first-time-setup.d.ts +2 -2
  291. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  292. package/dist/modes/interactive/components/first-time-setup.js +1 -0
  293. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  294. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  295. package/dist/modes/interactive/components/footer.js +42 -7
  296. package/dist/modes/interactive/components/footer.js.map +1 -1
  297. package/dist/modes/interactive/components/settings-selector-handlers.d.ts.map +1 -1
  298. package/dist/modes/interactive/components/settings-selector-handlers.js +3 -0
  299. package/dist/modes/interactive/components/settings-selector-handlers.js.map +1 -1
  300. package/dist/modes/interactive/components/settings-selector-items.d.ts.map +1 -1
  301. package/dist/modes/interactive/components/settings-selector-items.js +13 -0
  302. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  303. package/dist/modes/interactive/components/settings-selector-submenus.d.ts.map +1 -1
  304. package/dist/modes/interactive/components/settings-selector-submenus.js +3 -1
  305. package/dist/modes/interactive/components/settings-selector-submenus.js.map +1 -1
  306. package/dist/modes/interactive/components/settings-selector-types.d.ts +3 -1
  307. package/dist/modes/interactive/components/settings-selector-types.d.ts.map +1 -1
  308. package/dist/modes/interactive/components/settings-selector-types.js.map +1 -1
  309. package/dist/modes/interactive/components/themed-text.d.ts +8 -0
  310. package/dist/modes/interactive/components/themed-text.d.ts.map +1 -0
  311. package/dist/modes/interactive/components/themed-text.js +14 -0
  312. package/dist/modes/interactive/components/themed-text.js.map +1 -0
  313. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  314. package/dist/modes/interactive/components/tool-execution.js +5 -3
  315. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  316. package/dist/modes/interactive/interactive-agent-events.js +2 -0
  317. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  318. package/dist/modes/interactive/interactive-mode-base.d.ts +2 -1
  319. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  320. package/dist/modes/interactive/interactive-mode-base.js +5 -0
  321. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  322. package/dist/modes/interactive/interactive-resource-rendering.js +7 -10
  323. package/dist/modes/interactive/interactive-resource-rendering.js.map +1 -1
  324. package/dist/modes/interactive/interactive-selectors.js +5 -0
  325. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  326. package/dist/modes/interactive/interactive-session-runtime.js +1 -0
  327. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  328. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  329. package/dist/modes/interactive/interactive-startup.js +8 -3
  330. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  331. package/dist/modes/interactive/interactive-tui.d.ts +2 -1
  332. package/dist/modes/interactive/interactive-tui.d.ts.map +1 -1
  333. package/dist/modes/interactive/interactive-tui.js +1 -0
  334. package/dist/modes/interactive/interactive-tui.js.map +1 -1
  335. package/dist/modes/interactive/theme/color-utils.d.ts.map +1 -1
  336. package/dist/modes/interactive/theme/color-utils.js +3 -0
  337. package/dist/modes/interactive/theme/color-utils.js.map +1 -1
  338. package/dist/modes/interactive/theme/export-colors.d.ts.map +1 -1
  339. package/dist/modes/interactive/theme/export-colors.js +4 -1
  340. package/dist/modes/interactive/theme/export-colors.js.map +1 -1
  341. package/dist/modes/interactive/theme/system-theme.d.ts +23 -0
  342. package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -0
  343. package/dist/modes/interactive/theme/system-theme.js +462 -0
  344. package/dist/modes/interactive/theme/system-theme.js.map +1 -0
  345. package/dist/modes/interactive/theme/terminal-colors.d.ts +10 -0
  346. package/dist/modes/interactive/theme/terminal-colors.d.ts.map +1 -0
  347. package/dist/modes/interactive/theme/terminal-colors.js +36 -0
  348. package/dist/modes/interactive/theme/terminal-colors.js.map +1 -0
  349. package/dist/modes/interactive/theme/terminal-detection.d.ts +4 -6
  350. package/dist/modes/interactive/theme/terminal-detection.d.ts.map +1 -1
  351. package/dist/modes/interactive/theme/terminal-detection.js +12 -46
  352. package/dist/modes/interactive/theme/terminal-detection.js.map +1 -1
  353. package/dist/modes/interactive/theme/theme-class.d.ts +1 -0
  354. package/dist/modes/interactive/theme/theme-class.d.ts.map +1 -1
  355. package/dist/modes/interactive/theme/theme-class.js +2 -2
  356. package/dist/modes/interactive/theme/theme-class.js.map +1 -1
  357. package/dist/modes/interactive/theme/theme-controller.d.ts +16 -8
  358. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  359. package/dist/modes/interactive/theme/theme-controller.js +106 -64
  360. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  361. package/dist/modes/interactive/theme/theme-loading.d.ts.map +1 -1
  362. package/dist/modes/interactive/theme/theme-loading.js +23 -2
  363. package/dist/modes/interactive/theme/theme-loading.js.map +1 -1
  364. package/dist/modes/interactive/theme/theme-schema.js +1 -1
  365. package/dist/modes/interactive/theme/theme-schema.js.map +1 -1
  366. package/dist/modes/interactive/theme/theme-schema.json +2 -2
  367. package/dist/modes/interactive/theme/theme.d.ts +2 -0
  368. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  369. package/dist/modes/interactive/theme/theme.js +2 -0
  370. package/dist/modes/interactive/theme/theme.js.map +1 -1
  371. package/dist/modes/interactive-engine/engine-session-stats.d.ts +26 -0
  372. package/dist/modes/interactive-engine/engine-session-stats.d.ts.map +1 -0
  373. package/dist/modes/interactive-engine/engine-session-stats.js +71 -0
  374. package/dist/modes/interactive-engine/engine-session-stats.js.map +1 -0
  375. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +2 -0
  376. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
  377. package/dist/modes/interactive-engine/extension-ui-bridge.js +4 -0
  378. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
  379. package/dist/modes/interactive-engine/isolated-runtime.d.ts +3 -0
  380. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  381. package/dist/modes/interactive-engine/isolated-runtime.js +27 -5
  382. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  383. package/dist/modes/rpc/rpc-provider-auth.d.ts.map +1 -1
  384. package/dist/modes/rpc/rpc-provider-auth.js +3 -1
  385. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  386. package/dist/package-manager-cli.d.ts.map +1 -1
  387. package/dist/package-manager-cli.js +8 -2
  388. package/dist/package-manager-cli.js.map +1 -1
  389. package/dist/utils/paths.d.ts.map +1 -1
  390. package/dist/utils/paths.js +2 -1
  391. package/dist/utils/paths.js.map +1 -1
  392. package/dist/utils/shell.d.ts +1 -3
  393. package/dist/utils/shell.d.ts.map +1 -1
  394. package/dist/utils/shell.js +3 -30
  395. package/dist/utils/shell.js.map +1 -1
  396. package/docs/extensions/api-reference.md +5 -1
  397. package/docs/extensions/authoring.md +31 -1
  398. package/docs/extensions/events.md +3 -1
  399. package/docs/extensions.md +14 -0
  400. package/docs/models/evals.md +45 -2
  401. package/docs/models/reference.md +33 -2
  402. package/docs/models.md +1 -0
  403. package/docs/packages.md +2 -0
  404. package/docs/providers.md +34 -7
  405. package/docs/reference/cli.md +4 -0
  406. package/docs/rpc/protocol.md +10 -0
  407. package/docs/sdk/reference.md +5 -1
  408. package/docs/sdk/structured-decisions.md +2 -2
  409. package/docs/session-format.md +5 -0
  410. package/docs/settings.md +19 -5
  411. package/docs/skills.md +1 -1
  412. package/docs/themes/reference.md +2 -1
  413. package/docs/themes.md +4 -2
  414. package/docs/tools.md +39 -0
  415. package/npm-shrinkwrap.json +115 -113
  416. package/package.json +12 -9
@@ -1 +1 @@
1
- {"version":3,"file":"render-utils.js","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as os from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ImageContent, TextContent } from \"@bastani/pi-ai/compat\";\nimport { getCapabilities, getImageDimensions, hyperlink, imageFallback } from \"@earendil-works/pi-tui\";\nimport type { ThemeColor } from \"../../modes/interactive/theme/theme.js\";\nimport { stripAnsi } from \"../../utils/ansi.js\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\n\nexport function shortenPath(path: unknown): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\treturn `~${path.slice(home.length)}`;\n\t}\n\treturn path;\n}\n\nexport function linkPath(styledText: string, rawPath: string, cwd: string): string {\n\tif (!getCapabilities().hyperlinks) return styledText;\n\tconst absolutePath = resolvePath(rawPath, cwd);\n\treturn hyperlink(styledText, pathToFileURL(absolutePath).href);\n}\n\nexport function renderToolPath(\n\trawPath: string | null,\n\ttheme: { fg: (name: ThemeColor, text: string) => string },\n\tcwd: string,\n\toptions?: { emptyFallback?: string },\n): string {\n\tif (rawPath === null) return invalidArgText(theme);\n\tconst value = rawPath || options?.emptyFallback;\n\tif (!value) return theme.fg(\"toolOutput\", \"...\");\n\treturn linkPath(theme.fg(\"accent\", shortenPath(value)), value, cwd);\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport function getTextOutput(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> } | undefined,\n\tshowImages: boolean,\n): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function invalidArgText(theme: { fg: (name: ThemeColor, text: string) => string }): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n"]}
1
+ {"version":3,"file":"render-utils.js","sourceRoot":"","sources":["../../../src/core/tools/render-utils.ts"],"names":[],"mappings":"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","sourcesContent":["import * as os from \"node:os\";\nimport { pathToFileURL } from \"node:url\";\nimport type { ImageContent, TextContent } from \"@bastani/pi-ai/compat\";\nimport { getCapabilities, getImageDimensions, hyperlink, imageFallback } from \"@earendil-works/pi-tui\";\nimport type { ThemeColor } from \"../../modes/interactive/theme/theme.js\";\nimport { stripAnsi } from \"../../utils/ansi.js\";\nimport { resolvePath } from \"../../utils/paths.ts\";\nimport { sanitizeBinaryOutput } from \"../../utils/shell.ts\";\n\nexport function shortenPath(path: unknown): string {\n\tif (typeof path !== \"string\") return \"\";\n\tconst home = os.homedir();\n\tif (path.startsWith(home)) {\n\t\treturn `~${path.slice(home.length)}`;\n\t}\n\treturn path;\n}\n\nexport function linkPath(styledText: string, rawPath: string, cwd: string): string {\n\tif (!getCapabilities().hyperlinks) return styledText;\n\tconst absolutePath = resolvePath(rawPath, cwd);\n\treturn hyperlink(styledText, pathToFileURL(absolutePath).href);\n}\n\nexport function renderToolPath(\n\trawPath: string | null,\n\ttheme: { fg: (name: ThemeColor, text: string) => string },\n\tcwd: string,\n\toptions?: { emptyFallback?: string },\n): string {\n\tif (rawPath === null) return invalidArgText(theme);\n\tconst value = rawPath || options?.emptyFallback;\n\tif (!value) return theme.fg(\"toolOutput\", \"...\");\n\treturn linkPath(theme.fg(\"accent\", shortenPath(value)), value, cwd);\n}\n\nexport function str(value: unknown): string | null {\n\tif (typeof value === \"string\") return value;\n\tif (value == null) return \"\";\n\treturn null;\n}\n\nexport function replaceTabs(text: string): string {\n\treturn text.replace(/\\t/g, \" \");\n}\n\nexport function normalizeDisplayText(text: string): string {\n\treturn text.replace(/\\r/g, \"\");\n}\n\nexport function getTextOutput(\n\tresult: { content: Array<{ type: string; text?: string; data?: string; mimeType?: string }> } | undefined,\n\tshowImages: boolean,\n): string {\n\tif (!result) return \"\";\n\n\tconst textBlocks = result.content.filter((c) => c.type === \"text\");\n\tconst imageBlocks = result.content.filter((c) => c.type === \"image\");\n\n\tlet output = textBlocks.map((c) => sanitizeBinaryOutput(stripAnsi(c.text || \"\")).replace(/\\r/g, \"\")).join(\"\\n\");\n\n\tconst caps = getCapabilities();\n\tif (imageBlocks.length > 0 && (!caps.images || !showImages)) {\n\t\tconst imageIndicators = imageBlocks\n\t\t\t.map((img) => {\n\t\t\t\tconst mimeType = img.mimeType ?? \"image/unknown\";\n\t\t\t\tconst dims =\n\t\t\t\t\timg.data && img.mimeType ? (getImageDimensions(img.data, img.mimeType) ?? undefined) : undefined;\n\t\t\t\treturn imageFallback(mimeType, dims);\n\t\t\t})\n\t\t\t.join(\"\\n\");\n\t\toutput = output ? `${output}\\n${imageIndicators}` : imageIndicators;\n\t}\n\n\treturn output;\n}\n\nexport type ToolRenderResultLike<TDetails> = {\n\tcontent: (TextContent | ImageContent)[];\n\tdetails: TDetails;\n};\n\nexport function formatToolCallWithArgs(\n\ttitle: string,\n\targs: unknown,\n\ttheme: { fg: (name: ThemeColor, text: string) => string; bold: (text: string) => string },\n\texpanded: boolean,\n): string {\n\tconst clean = (text: string) => sanitizeBinaryOutput(stripAnsi(text));\n\tconst header = theme.fg(\"toolTitle\", theme.bold(clean(title)));\n\tif (args == null) return header;\n\tconst entries = typeof args === \"object\" && !Array.isArray(args) ? Object.entries(args) : [[\"args\", args]];\n\tif (entries.length === 0) return header;\n\tif (expanded) {\n\t\tconst lines = entries.map(([key, value]) => {\n\t\t\tconst text = typeof value === \"string\" ? value : (JSON.stringify(value, null, 2) ?? String(value));\n\t\t\treturn ` ${clean(String(key))}: ${replaceTabs(clean(text)).replace(/\\r/g, \"\").split(\"\\n\").join(\"\\n \")}`;\n\t\t});\n\t\treturn `${header}\\n${theme.fg(\"muted\", lines.join(\"\\n\"))}`;\n\t}\n\tconst pairs = clean(entries.map(([key, value]) => `${key}=${JSON.stringify(value) ?? String(value)}`).join(\" \"));\n\tconst preview = pairs.length > 100 ? `${pairs.slice(0, 97)}...` : pairs;\n\treturn `${header} ${theme.fg(\"muted\", preview)}`;\n}\n\nexport function invalidArgText(theme: { fg: (name: ThemeColor, text: string) => string }): string {\n\treturn theme.fg(\"error\", \"[invalid arg]\");\n}\n"]}
@@ -19,5 +19,5 @@ export declare class ToolExecutionScheduler {
19
19
  schedule<T>(mode: ToolConcurrencyMode, run: () => Promise<T>): Promise<T>;
20
20
  }
21
21
  /** Route a tool's executions through a session scheduler according to its declared concurrency. */
22
- export declare function scheduleToolExecution(tool: AgentTool, scheduler: ToolExecutionScheduler): AgentTool;
22
+ export declare function scheduleToolExecution(tool: AgentTool, scheduler: ToolExecutionScheduler, abortError?: () => Error): AgentTool;
23
23
  //# sourceMappingURL=tool-concurrency.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-concurrency.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-concurrency.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,WAAW,CAAC;AACzD,MAAM,MAAM,eAAe,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACxD,mBAAmB,GACnB,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,mBAAmB,CAAC,CAAC;AAEnD,wBAAgB,sBAAsB,CAAC,KAAK,EAC3C,WAAW,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,SAAS,EAC/C,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAClB,mBAAmB,CAOrB;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;;IAIlC,0GAA0G;IAC1G,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAuBxE;CACD;AAUD,mGAAmG;AACnG,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,sBAAsB,GAAG,SAAS,CAQnG"}
1
+ {"version":3,"file":"tool-concurrency.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-concurrency.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAE/D;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,QAAQ,GAAG,WAAW,CAAC;AACzD,MAAM,MAAM,eAAe,CAAC,KAAK,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACxD,mBAAmB,GACnB,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,KAAK,mBAAmB,CAAC,CAAC;AAEnD,wBAAgB,sBAAsB,CAAC,KAAK,EAC3C,WAAW,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,SAAS,EAC/C,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,GAClB,mBAAmB,CAOrB;AAED;;;;GAIG;AACH,qBAAa,sBAAsB;;IASlC,0GAA0G;IAC1G,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,mBAAmB,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CA2CxE;CACD;AAUD,mGAAmG;AACnG,wBAAgB,qBAAqB,CACpC,IAAI,EAAE,SAAS,EACf,SAAS,EAAE,sBAAsB,EACjC,UAAU,CAAC,EAAE,MAAM,KAAK,GACtB,SAAS,CASX"}
@@ -1,3 +1,4 @@
1
+ import { AsyncLocalStorage } from "node:async_hooks";
1
2
  export function resolveToolConcurrency(concurrency, args) {
2
3
  if (typeof concurrency !== "function")
3
4
  return concurrency ?? "shared";
@@ -16,14 +17,34 @@ export function resolveToolConcurrency(concurrency, args) {
16
17
  export class ToolExecutionScheduler {
17
18
  #lastExclusive;
18
19
  #sharedSinceExclusive = new Set();
20
+ #scope = new AsyncLocalStorage();
19
21
  /** Runs `run` synchronously when nothing earlier blocks it, so its abort listeners attach immediately. */
20
22
  schedule(mode, run) {
23
+ const parent = this.#scope.getStore();
24
+ if (parent?.active) {
25
+ if (parent.mode === "shared" && mode === "exclusive") {
26
+ return Promise.reject(new Error("Nested exclusive tools require the orchestrating tool to declare concurrency: 'exclusive'"));
27
+ }
28
+ parent.children ??= new ToolExecutionScheduler();
29
+ return parent.children.schedule(mode, run);
30
+ }
21
31
  const blockers = mode === "exclusive"
22
32
  ? [...(this.#lastExclusive ? [this.#lastExclusive] : []), ...this.#sharedSinceExclusive]
23
33
  : this.#lastExclusive
24
34
  ? [this.#lastExclusive]
25
35
  : [];
26
- const task = blockers.length === 0 ? invoke(run) : Promise.all(blockers).then(run);
36
+ const execute = () => {
37
+ const scope = { mode, active: true };
38
+ return this.#scope.run(scope, async () => {
39
+ try {
40
+ return await run();
41
+ }
42
+ finally {
43
+ scope.active = false;
44
+ }
45
+ });
46
+ };
47
+ const task = blockers.length === 0 ? invoke(execute) : Promise.all(blockers).then(execute);
27
48
  const settled = task.then(() => undefined, () => undefined);
28
49
  if (mode === "exclusive") {
29
50
  this.#lastExclusive = settled;
@@ -49,10 +70,14 @@ function invoke(run) {
49
70
  }
50
71
  }
51
72
  /** Route a tool's executions through a session scheduler according to its declared concurrency. */
52
- export function scheduleToolExecution(tool, scheduler) {
73
+ export function scheduleToolExecution(tool, scheduler, abortError) {
53
74
  return {
54
75
  ...tool,
55
- execute: (...args) => scheduler.schedule(resolveToolConcurrency(tool.concurrency, args[1]), () => tool.execute(...args)),
76
+ execute: (...args) => scheduler.schedule(resolveToolConcurrency(tool.concurrency, args[1]), () => {
77
+ if (args[2]?.aborted)
78
+ throw abortError?.() ?? new Error("Operation aborted");
79
+ return tool.execute(...args);
80
+ }),
56
81
  };
57
82
  }
58
83
  //# sourceMappingURL=tool-concurrency.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"tool-concurrency.js","sourceRoot":"","sources":["../../../src/core/tools/tool-concurrency.ts"],"names":[],"mappings":"AAaA,MAAM,UAAU,sBAAsB,CACrC,WAA+C,EAC/C,IAAoB;IAEpB,IAAI,OAAO,WAAW,KAAK,UAAU;QAAE,OAAO,WAAW,IAAI,QAAQ,CAAC;IACtE,IAAI,CAAC;QACJ,OAAO,WAAW,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,WAAW,CAAC;IACpB,CAAC;AACF,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,sBAAsB;IAClC,cAAc,CAA4B;IACjC,qBAAqB,GAAG,IAAI,GAAG,EAAiB,CAAC;IAE1D,0GAA0G;IAC1G,QAAQ,CAAI,IAAyB,EAAE,GAAqB;QAC3D,MAAM,QAAQ,GACb,IAAI,KAAK,WAAW;YACnB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,GAAG,IAAI,CAAC,qBAAqB,CAAC;YACxF,CAAC,CAAC,IAAI,CAAC,cAAc;gBACpB,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC;gBACvB,CAAC,CAAC,EAAE,CAAC;QACR,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnF,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CACxB,GAAG,EAAE,CAAC,SAAS,EACf,GAAG,EAAE,CAAC,SAAS,CACf,CAAC;QACF,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;YAC1B,IAAI,CAAC,cAAc,GAAG,OAAO,CAAC;YAC9B,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,CAAC;YACnC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE;gBACtB,IAAI,IAAI,CAAC,cAAc,KAAK,OAAO;oBAAE,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC;YACtE,CAAC,CAAC,CAAC;QACJ,CAAC;aAAM,CAAC;YACP,IAAI,CAAC,qBAAqB,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACxC,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;CACD;AAED,SAAS,MAAM,CAAI,GAAqB;IACvC,IAAI,CAAC;QACJ,OAAO,GAAG,EAAE,CAAC;IACd,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACF,CAAC;AAED,mGAAmG;AACnG,MAAM,UAAU,qBAAqB,CAAC,IAAe,EAAE,SAAiC;IACvF,OAAO;QACN,GAAG,IAAI;QACP,OAAO,EAAE,CAAC,GAAG,IAAsC,EAAE,EAAE,CACtD,SAAS,CAAC,QAAQ,CAAC,sBAAsB,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC,CAA4B,CAAC,EAAE,GAAG,EAAE,CACrG,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CACrB;KACF,CAAC;AACH,CAAC","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\n\n/**\n * How a tool call is ordered against the other calls of the same assistant message.\n * - \"shared\": may overlap other shared calls; waits for the latest earlier exclusive call (default)\n * - \"exclusive\": waits for every earlier call; later calls wait for it\n * - function: resolved per call from its prepared arguments; a throwing resolver means \"exclusive\"\n */\nexport type ToolConcurrencyMode = \"shared\" | \"exclusive\";\nexport type ToolConcurrency<TArgs = Record<string, unknown>> =\n\t| ToolConcurrencyMode\n\t| ((args: Partial<TArgs>) => ToolConcurrencyMode);\n\nexport function resolveToolConcurrency<TArgs>(\n\tconcurrency: ToolConcurrency<TArgs> | undefined,\n\targs: Partial<TArgs>,\n): ToolConcurrencyMode {\n\tif (typeof concurrency !== \"function\") return concurrency ?? \"shared\";\n\ttry {\n\t\treturn concurrency(args);\n\t} catch {\n\t\treturn \"exclusive\";\n\t}\n}\n\n/**\n * Orders tool executions in the order they start. The agent loop starts a batch's calls in\n * assistant-message order, so an exclusive call observes every earlier call's effects and no\n * later call observes the state from before it.\n */\nexport class ToolExecutionScheduler {\n\t#lastExclusive: Promise<void> | undefined;\n\treadonly #sharedSinceExclusive = new Set<Promise<void>>();\n\n\t/** Runs `run` synchronously when nothing earlier blocks it, so its abort listeners attach immediately. */\n\tschedule<T>(mode: ToolConcurrencyMode, run: () => Promise<T>): Promise<T> {\n\t\tconst blockers =\n\t\t\tmode === \"exclusive\"\n\t\t\t\t? [...(this.#lastExclusive ? [this.#lastExclusive] : []), ...this.#sharedSinceExclusive]\n\t\t\t\t: this.#lastExclusive\n\t\t\t\t\t? [this.#lastExclusive]\n\t\t\t\t\t: [];\n\t\tconst task = blockers.length === 0 ? invoke(run) : Promise.all(blockers).then(run);\n\t\tconst settled = task.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\tif (mode === \"exclusive\") {\n\t\t\tthis.#lastExclusive = settled;\n\t\t\tthis.#sharedSinceExclusive.clear();\n\t\t\tvoid settled.then(() => {\n\t\t\t\tif (this.#lastExclusive === settled) this.#lastExclusive = undefined;\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#sharedSinceExclusive.add(settled);\n\t\t\tvoid settled.then(() => this.#sharedSinceExclusive.delete(settled));\n\t\t}\n\t\treturn task;\n\t}\n}\n\nfunction invoke<T>(run: () => Promise<T>): Promise<T> {\n\ttry {\n\t\treturn run();\n\t} catch (error) {\n\t\treturn Promise.reject(error);\n\t}\n}\n\n/** Route a tool's executions through a session scheduler according to its declared concurrency. */\nexport function scheduleToolExecution(tool: AgentTool, scheduler: ToolExecutionScheduler): AgentTool {\n\treturn {\n\t\t...tool,\n\t\texecute: (...args: Parameters<AgentTool[\"execute\"]>) =>\n\t\t\tscheduler.schedule(resolveToolConcurrency(tool.concurrency, args[1] as Record<string, unknown>), () =>\n\t\t\t\ttool.execute(...args),\n\t\t\t),\n\t};\n}\n"]}
1
+ {"version":3,"file":"tool-concurrency.js","sourceRoot":"","sources":["../../../src/core/tools/tool-concurrency.ts"],"names":[],"mappings":"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","sourcesContent":["import { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\n\n/**\n * How a tool call is ordered against the other calls of the same assistant message.\n * - \"shared\": may overlap other shared calls; waits for the latest earlier exclusive call (default)\n * - \"exclusive\": waits for every earlier call; later calls wait for it\n * - function: resolved per call from its prepared arguments; a throwing resolver means \"exclusive\"\n */\nexport type ToolConcurrencyMode = \"shared\" | \"exclusive\";\nexport type ToolConcurrency<TArgs = Record<string, unknown>> =\n\t| ToolConcurrencyMode\n\t| ((args: Partial<TArgs>) => ToolConcurrencyMode);\n\nexport function resolveToolConcurrency<TArgs>(\n\tconcurrency: ToolConcurrency<TArgs> | undefined,\n\targs: Partial<TArgs>,\n): ToolConcurrencyMode {\n\tif (typeof concurrency !== \"function\") return concurrency ?? \"shared\";\n\ttry {\n\t\treturn concurrency(args);\n\t} catch {\n\t\treturn \"exclusive\";\n\t}\n}\n\n/**\n * Orders tool executions in the order they start. The agent loop starts a batch's calls in\n * assistant-message order, so an exclusive call observes every earlier call's effects and no\n * later call observes the state from before it.\n */\nexport class ToolExecutionScheduler {\n\t#lastExclusive: Promise<void> | undefined;\n\treadonly #sharedSinceExclusive = new Set<Promise<void>>();\n\treadonly #scope = new AsyncLocalStorage<{\n\t\tmode: ToolConcurrencyMode;\n\t\tactive: boolean;\n\t\tchildren?: ToolExecutionScheduler;\n\t}>();\n\n\t/** Runs `run` synchronously when nothing earlier blocks it, so its abort listeners attach immediately. */\n\tschedule<T>(mode: ToolConcurrencyMode, run: () => Promise<T>): Promise<T> {\n\t\tconst parent = this.#scope.getStore();\n\t\tif (parent?.active) {\n\t\t\tif (parent.mode === \"shared\" && mode === \"exclusive\") {\n\t\t\t\treturn Promise.reject(\n\t\t\t\t\tnew Error(\"Nested exclusive tools require the orchestrating tool to declare concurrency: 'exclusive'\"),\n\t\t\t\t);\n\t\t\t}\n\t\t\tparent.children ??= new ToolExecutionScheduler();\n\t\t\treturn parent.children.schedule(mode, run);\n\t\t}\n\t\tconst blockers =\n\t\t\tmode === \"exclusive\"\n\t\t\t\t? [...(this.#lastExclusive ? [this.#lastExclusive] : []), ...this.#sharedSinceExclusive]\n\t\t\t\t: this.#lastExclusive\n\t\t\t\t\t? [this.#lastExclusive]\n\t\t\t\t\t: [];\n\t\tconst execute = () => {\n\t\t\tconst scope = { mode, active: true };\n\t\t\treturn this.#scope.run(scope, async () => {\n\t\t\t\ttry {\n\t\t\t\t\treturn await run();\n\t\t\t\t} finally {\n\t\t\t\t\tscope.active = false;\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\t\tconst task = blockers.length === 0 ? invoke(execute) : Promise.all(blockers).then(execute);\n\t\tconst settled = task.then(\n\t\t\t() => undefined,\n\t\t\t() => undefined,\n\t\t);\n\t\tif (mode === \"exclusive\") {\n\t\t\tthis.#lastExclusive = settled;\n\t\t\tthis.#sharedSinceExclusive.clear();\n\t\t\tvoid settled.then(() => {\n\t\t\t\tif (this.#lastExclusive === settled) this.#lastExclusive = undefined;\n\t\t\t});\n\t\t} else {\n\t\t\tthis.#sharedSinceExclusive.add(settled);\n\t\t\tvoid settled.then(() => this.#sharedSinceExclusive.delete(settled));\n\t\t}\n\t\treturn task;\n\t}\n}\n\nfunction invoke<T>(run: () => Promise<T>): Promise<T> {\n\ttry {\n\t\treturn run();\n\t} catch (error) {\n\t\treturn Promise.reject(error);\n\t}\n}\n\n/** Route a tool's executions through a session scheduler according to its declared concurrency. */\nexport function scheduleToolExecution(\n\ttool: AgentTool,\n\tscheduler: ToolExecutionScheduler,\n\tabortError?: () => Error,\n): AgentTool {\n\treturn {\n\t\t...tool,\n\t\texecute: (...args: Parameters<AgentTool[\"execute\"]>) =>\n\t\t\tscheduler.schedule(resolveToolConcurrency(tool.concurrency, args[1] as Record<string, unknown>), () => {\n\t\t\t\tif (args[2]?.aborted) throw abortError?.() ?? new Error(\"Operation aborted\");\n\t\t\t\treturn tool.execute(...args);\n\t\t\t}),\n\t};\n}\n"]}
@@ -14,7 +14,7 @@ declare module "@earendil-works/pi-agent-core" {
14
14
  }
15
15
  }
16
16
  /** Wrap a ToolDefinition into an AgentTool for the core runtime. */
17
- export declare function wrapToolDefinition<TParams extends TSchema, TDetails = unknown>(definition: ToolDefinition<TParams, TDetails>, ctxFactory?: () => ExtensionContext): AgentTool<TParams, TDetails>;
17
+ export declare function wrapToolDefinition<TParams extends TSchema, TDetails = unknown>(definition: ToolDefinition<TParams, TDetails>, ctxFactory?: (toolCallId: string, signal: AbortSignal | undefined) => ExtensionContext): AgentTool<TParams, TDetails>;
18
18
  /** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */
19
19
  export declare function wrapToolDefinitions(definitions: ToolDefinition<TSchema, unknown>[], ctxFactory?: () => ExtensionContext): AgentTool<TSchema, unknown>[];
20
20
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"tool-definition-wrapper.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,QAAQ,+BAA+B,CAAC;IAC9C,UAAU,SAAS,CAAC,WAAW,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,GAAG;QACxE,qGAAqG;QACrG,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,2FAA2F;QAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5B,sGAAsG;QACtG,WAAW,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;KACnD;CACD;AAYD,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,OAAO,SAAS,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC7E,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC7C,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAgC9B;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAC/C,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAE/B;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EACtG,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,GAChC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAsBnC"}
1
+ {"version":3,"file":"tool-definition-wrapper.d.ts","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAC/D,OAAO,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAE/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC/E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,OAAO,QAAQ,+BAA+B,CAAC;IAC9C,UAAU,SAAS,CAAC,WAAW,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,GAAG;QACxE,qGAAqG;QACrG,kBAAkB,CAAC,EAAE,MAAM,CAAC;QAC5B,2FAA2F;QAC3F,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;QAC5B,sGAAsG;QACtG,WAAW,CAAC,EAAE,eAAe,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC;KACnD;CACD;AAYD,oEAAoE;AACpE,wBAAgB,kBAAkB,CAAC,OAAO,SAAS,OAAO,EAAE,QAAQ,GAAG,OAAO,EAC7E,UAAU,EAAE,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC7C,UAAU,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,SAAS,KAAK,gBAAgB,GACpF,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAkC9B;AAED,0EAA0E;AAC1E,wBAAgB,mBAAmB,CAClC,WAAW,EAAE,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAC/C,UAAU,CAAC,EAAE,MAAM,gBAAgB,GACjC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,CAE/B;AAED;;;;;GAKG;AACH,wBAAgB,iCAAiC,CAAC,OAAO,SAAS,OAAO,GAAG,OAAO,EAAE,QAAQ,GAAG,OAAO,EACtG,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,GAChC,cAAc,CAAC,OAAO,EAAE,QAAQ,CAAC,CAuBnC"}
@@ -6,6 +6,7 @@ export function wrapToolDefinition(definition, ctxFactory) {
6
6
  label: definition.label,
7
7
  description: definition.description,
8
8
  parameters: definition.parameters,
9
+ outputSchema: definition.outputSchema,
9
10
  ...(Object.hasOwn(definition, "constrainedSampling")
10
11
  ? { constrainedSampling: definition.constrainedSampling }
11
12
  : {}),
@@ -17,7 +18,8 @@ export function wrapToolDefinition(definition, ctxFactory) {
17
18
  : undefined,
18
19
  executionMode: definition.executionMode,
19
20
  concurrency: definition.concurrency,
20
- execute: (toolCallId, params, signal, onUpdate, context) => runCallback({ kind: "tool.execute", name: definition.name, toolCallId }, () => definition.execute(toolCallId, params, signal, onUpdate, context ?? ctxFactory?.())),
21
+ execute: (toolCallId, params, signal, onUpdate, context) => runCallback({ kind: "tool.execute", name: definition.name, toolCallId }, () => definition.execute(toolCallId, params, signal, onUpdate, (context ??
22
+ ctxFactory?.(toolCallId, signal)))),
21
23
  };
22
24
  }
23
25
  /** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */
@@ -36,6 +38,7 @@ export function createToolDefinitionFromAgentTool(tool) {
36
38
  label: tool.label,
37
39
  description: tool.description,
38
40
  parameters: tool.parameters,
41
+ outputSchema: tool.outputSchema,
39
42
  ...(Object.hasOwn(tool, "constrainedSampling") ? { constrainedSampling: tool.constrainedSampling } : {}),
40
43
  promptSnippet: tool.promptSnippet,
41
44
  promptGuidelines: tool.promptGuidelines,
@@ -1 +1 @@
1
- {"version":3,"file":"tool-definition-wrapper.js","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC;AA0B9E,oEAAoE;AACpE,MAAM,UAAU,kBAAkB,CACjC,UAA6C,EAC7C,UAAmC;IAEnC,OAAO;QACN,IAAI,EAAE,UAAU,CAAC,IAAI;QACrB,KAAK,EAAE,UAAU,CAAC,KAAK;QACvB,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,UAAU,EAAE,UAAU,CAAC,UAAU;QACjC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,qBAAqB,CAAC;YACnD,CAAC,CAAC,EAAE,mBAAmB,EAAE,UAAU,CAAC,mBAAmB,EAAE;YACzD,CAAC,CAAC,EAAE,CAAC;QACN,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,gBAAgB,EAAE,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS;QAC5F,kBAAkB,EAAE,UAAU,CAAC,kBAAkB;QACjD,gBAAgB,EAAE,UAAU,CAAC,gBAAgB;YAC5C,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CACT,sBAAsB,CACrB,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,EAC/C,GAAG,EAAE,CAAC,UAAU,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAA8B,CACtE;YACH,CAAC,CAAC,SAAS;QACZ,aAAa,EAAE,UAAU,CAAC,aAAa;QACvC,WAAW,EAAE,UAAU,CAAC,WAAW;QACnC,OAAO,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAA0B,EAAE,EAAE,CAC7E,WAAW,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,GAAG,EAAE,CAC7E,UAAU,CAAC,OAAO,CACjB,UAAU,EACV,MAAyB,EACzB,MAAM,EACN,QAAQ,EACR,OAAO,IAAK,UAAU,EAAE,EAAuB,CAC/C,CACD;KACF,CAAC;AACH,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,mBAAmB,CAClC,WAA+C,EAC/C,UAAmC;IAEnC,OAAO,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,kBAAkB,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AACpF,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iCAAiC,CAChD,IAAkC;IAElC,OAAO;QACN,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,mBAAmB,EAAE,IAAI,CAAC,mBAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxG,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;QACvC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;QAC3C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,IAAI,CAAoB,CAAC,CAAC,CAAC,SAAS;QAChH,aAAa,EAAE,IAAI,CAAC,aAAa;QACjC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,CAC/D,IAAI,CAAC,OAAqD,CAC1D,UAAU,EACV,MAA+B,EAC/B,MAAM,EACN,QAAQ,EACR,OAAO,CACP;KACF,CAAC;AACH,CAAC","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { Static, TSchema } from \"typebox\";\nimport { runCallback, runSynchronousCallback } from \"../callback-activity.ts\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\nimport type { ToolConcurrency } from \"./tool-concurrency.ts\";\n\ndeclare module \"@earendil-works/pi-agent-core\" {\n\tinterface AgentTool<TParameters extends TSchema = TSchema, TDetails = any> {\n\t\t/** Optional per-tool character cap for model-visible result persistence. Use Infinity to opt out. */\n\t\tmaxResultSizeChars?: number;\n\t\t/** Optional prompt metadata retained by factory-created tools registered as extensions. */\n\t\tpromptSnippet?: string;\n\t\tpromptGuidelines?: string[];\n\t\t/** Ordering against the other calls of the same assistant message; see ToolDefinition.concurrency. */\n\t\tconcurrency?: ToolConcurrency<Static<TParameters>>;\n\t}\n}\n\ntype PiToolParams<TParams extends TSchema> = Parameters<AgentTool<TParams>[\"execute\"]>[1];\ntype PiPreparedParams<TParams extends TSchema> = ReturnType<NonNullable<AgentTool<TParams>[\"prepareArguments\"]>>;\ntype ContextualAgentExecute<TParams extends TSchema, TDetails> = (\n\ttoolCallId: string,\n\tparams: PiToolParams<TParams>,\n\tsignal?: AbortSignal,\n\tonUpdate?: Parameters<AgentTool<TParams, TDetails>[\"execute\"]>[3],\n\tcontext?: ExtensionContext,\n) => ReturnType<AgentTool<TParams, TDetails>[\"execute\"]>;\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TParams extends TSchema, TDetails = unknown>(\n\tdefinition: ToolDefinition<TParams, TDetails>,\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<TParams, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\t...(Object.hasOwn(definition, \"constrainedSampling\")\n\t\t\t? { constrainedSampling: definition.constrainedSampling }\n\t\t\t: {}),\n\t\tpromptSnippet: definition.promptSnippet,\n\t\tpromptGuidelines: definition.promptGuidelines ? [...definition.promptGuidelines] : undefined,\n\t\tmaxResultSizeChars: definition.maxResultSizeChars,\n\t\tprepareArguments: definition.prepareArguments\n\t\t\t? (args) =>\n\t\t\t\t\trunSynchronousCallback(\n\t\t\t\t\t\t{ kind: \"tool.prepare\", name: definition.name },\n\t\t\t\t\t\t() => definition.prepareArguments?.(args) as PiPreparedParams<TParams>,\n\t\t\t\t\t)\n\t\t\t: undefined,\n\t\texecutionMode: definition.executionMode,\n\t\tconcurrency: definition.concurrency,\n\t\texecute: (toolCallId, params, signal, onUpdate, context?: ExtensionContext) =>\n\t\t\trunCallback({ kind: \"tool.execute\", name: definition.name, toolCallId }, () =>\n\t\t\t\tdefinition.execute(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\tparams as Static<TParams>,\n\t\t\t\t\tsignal,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\tcontext ?? (ctxFactory?.() as ExtensionContext),\n\t\t\t\t),\n\t\t\t),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<TSchema, unknown>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<TSchema, unknown>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool<TParams extends TSchema = TSchema, TDetails = unknown>(\n\ttool: AgentTool<TParams, TDetails>,\n): ToolDefinition<TParams, TDetails> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters,\n\t\t...(Object.hasOwn(tool, \"constrainedSampling\") ? { constrainedSampling: tool.constrainedSampling } : {}),\n\t\tpromptSnippet: tool.promptSnippet,\n\t\tpromptGuidelines: tool.promptGuidelines,\n\t\tmaxResultSizeChars: tool.maxResultSizeChars,\n\t\tprepareArguments: tool.prepareArguments ? (args) => tool.prepareArguments?.(args) as Static<TParams> : undefined,\n\t\texecutionMode: tool.executionMode,\n\t\tconcurrency: tool.concurrency,\n\t\texecute: async (toolCallId, params, signal, onUpdate, context) =>\n\t\t\t(tool.execute as ContextualAgentExecute<TParams, TDetails>)(\n\t\t\t\ttoolCallId,\n\t\t\t\tparams as PiToolParams<TParams>,\n\t\t\t\tsignal,\n\t\t\t\tonUpdate,\n\t\t\t\tcontext,\n\t\t\t),\n\t};\n}\n"]}
1
+ {"version":3,"file":"tool-definition-wrapper.js","sourceRoot":"","sources":["../../../src/core/tools/tool-definition-wrapper.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { Static, TSchema } from \"typebox\";\nimport { runCallback, runSynchronousCallback } from \"../callback-activity.ts\";\nimport type { ExtensionContext, ToolDefinition } from \"../extensions/types.ts\";\nimport type { ToolConcurrency } from \"./tool-concurrency.ts\";\n\ndeclare module \"@earendil-works/pi-agent-core\" {\n\tinterface AgentTool<TParameters extends TSchema = TSchema, TDetails = any> {\n\t\t/** Optional per-tool character cap for model-visible result persistence. Use Infinity to opt out. */\n\t\tmaxResultSizeChars?: number;\n\t\t/** Optional prompt metadata retained by factory-created tools registered as extensions. */\n\t\tpromptSnippet?: string;\n\t\tpromptGuidelines?: string[];\n\t\t/** Ordering against the other calls of the same assistant message; see ToolDefinition.concurrency. */\n\t\tconcurrency?: ToolConcurrency<Static<TParameters>>;\n\t}\n}\n\ntype PiToolParams<TParams extends TSchema> = Parameters<AgentTool<TParams>[\"execute\"]>[1];\ntype PiPreparedParams<TParams extends TSchema> = ReturnType<NonNullable<AgentTool<TParams>[\"prepareArguments\"]>>;\ntype ContextualAgentExecute<TParams extends TSchema, TDetails> = (\n\ttoolCallId: string,\n\tparams: PiToolParams<TParams>,\n\tsignal?: AbortSignal,\n\tonUpdate?: Parameters<AgentTool<TParams, TDetails>[\"execute\"]>[3],\n\tcontext?: ExtensionContext,\n) => ReturnType<AgentTool<TParams, TDetails>[\"execute\"]>;\n\n/** Wrap a ToolDefinition into an AgentTool for the core runtime. */\nexport function wrapToolDefinition<TParams extends TSchema, TDetails = unknown>(\n\tdefinition: ToolDefinition<TParams, TDetails>,\n\tctxFactory?: (toolCallId: string, signal: AbortSignal | undefined) => ExtensionContext,\n): AgentTool<TParams, TDetails> {\n\treturn {\n\t\tname: definition.name,\n\t\tlabel: definition.label,\n\t\tdescription: definition.description,\n\t\tparameters: definition.parameters,\n\t\toutputSchema: definition.outputSchema,\n\t\t...(Object.hasOwn(definition, \"constrainedSampling\")\n\t\t\t? { constrainedSampling: definition.constrainedSampling }\n\t\t\t: {}),\n\t\tpromptSnippet: definition.promptSnippet,\n\t\tpromptGuidelines: definition.promptGuidelines ? [...definition.promptGuidelines] : undefined,\n\t\tmaxResultSizeChars: definition.maxResultSizeChars,\n\t\tprepareArguments: definition.prepareArguments\n\t\t\t? (args) =>\n\t\t\t\t\trunSynchronousCallback(\n\t\t\t\t\t\t{ kind: \"tool.prepare\", name: definition.name },\n\t\t\t\t\t\t() => definition.prepareArguments?.(args) as PiPreparedParams<TParams>,\n\t\t\t\t\t)\n\t\t\t: undefined,\n\t\texecutionMode: definition.executionMode,\n\t\tconcurrency: definition.concurrency,\n\t\texecute: (toolCallId, params, signal, onUpdate, context?: ExtensionContext) =>\n\t\t\trunCallback({ kind: \"tool.execute\", name: definition.name, toolCallId }, () =>\n\t\t\t\tdefinition.execute(\n\t\t\t\t\ttoolCallId,\n\t\t\t\t\tparams as Static<TParams>,\n\t\t\t\t\tsignal,\n\t\t\t\t\tonUpdate,\n\t\t\t\t\t(context ??\n\t\t\t\t\t\tctxFactory?.(toolCallId, signal)) as import(\"../extensions/context-types.ts\").ExtensionToolContext,\n\t\t\t\t),\n\t\t\t),\n\t};\n}\n\n/** Wrap multiple ToolDefinitions into AgentTools for the core runtime. */\nexport function wrapToolDefinitions(\n\tdefinitions: ToolDefinition<TSchema, unknown>[],\n\tctxFactory?: () => ExtensionContext,\n): AgentTool<TSchema, unknown>[] {\n\treturn definitions.map((definition) => wrapToolDefinition(definition, ctxFactory));\n}\n\n/**\n * Synthesize a minimal ToolDefinition from an AgentTool.\n *\n * This keeps AgentSession's internal registry definition-first even when a caller\n * provides plain AgentTool overrides that do not include prompt metadata or renderers.\n */\nexport function createToolDefinitionFromAgentTool<TParams extends TSchema = TSchema, TDetails = unknown>(\n\ttool: AgentTool<TParams, TDetails>,\n): ToolDefinition<TParams, TDetails> {\n\treturn {\n\t\tname: tool.name,\n\t\tlabel: tool.label,\n\t\tdescription: tool.description,\n\t\tparameters: tool.parameters,\n\t\toutputSchema: tool.outputSchema,\n\t\t...(Object.hasOwn(tool, \"constrainedSampling\") ? { constrainedSampling: tool.constrainedSampling } : {}),\n\t\tpromptSnippet: tool.promptSnippet,\n\t\tpromptGuidelines: tool.promptGuidelines,\n\t\tmaxResultSizeChars: tool.maxResultSizeChars,\n\t\tprepareArguments: tool.prepareArguments ? (args) => tool.prepareArguments?.(args) as Static<TParams> : undefined,\n\t\texecutionMode: tool.executionMode,\n\t\tconcurrency: tool.concurrency,\n\t\texecute: async (toolCallId, params, signal, onUpdate, context) =>\n\t\t\t(tool.execute as ContextualAgentExecute<TParams, TDetails>)(\n\t\t\t\ttoolCallId,\n\t\t\t\tparams as PiToolParams<TParams>,\n\t\t\t\tsignal,\n\t\t\t\tonUpdate,\n\t\t\t\tcontext,\n\t\t\t),\n\t};\n}\n"]}
@@ -9,6 +9,8 @@ export interface UsageTotals {
9
9
  }
10
10
  export declare function createUsageTotals(): UsageTotals;
11
11
  export declare function addUsageToTotals(totals: UsageTotals, usage: Usage): void;
12
+ /** Sum nested/classifier usage without losing optional token splits. */
13
+ export declare function combineUsage(first: Usage, second: Usage): Usage;
12
14
  export interface UsageCostBreakdownEntry {
13
15
  key: string;
14
16
  cost: number;
@@ -1 +1 @@
1
- {"version":3,"file":"usage-totals.d.ts","sourceRoot":"","sources":["../../src/core/usage-totals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAMxE;AAED,MAAM,WAAW,uBAAuB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,uBAAuB,EAAE,CAmCxF"}
1
+ {"version":3,"file":"usage-totals.d.ts","sourceRoot":"","sources":["../../src/core/usage-totals.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAEzD,MAAM,WAAW,WAAW;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,iBAAiB,IAAI,WAAW,CAE/C;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAMxE;AAED,wEAAwE;AACxE,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,GAAG,KAAK,CAqB/D;AAED,MAAM,WAAW,uBAAuB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,uBAAuB,EAAE,CAmCxF"}
@@ -8,6 +8,29 @@ export function addUsageToTotals(totals, usage) {
8
8
  totals.cacheWrite += usage.cacheWrite;
9
9
  totals.cost += usage.cost.total;
10
10
  }
11
+ /** Sum nested/classifier usage without losing optional token splits. */
12
+ export function combineUsage(first, second) {
13
+ return {
14
+ input: first.input + second.input,
15
+ output: first.output + second.output,
16
+ cacheRead: first.cacheRead + second.cacheRead,
17
+ cacheWrite: first.cacheWrite + second.cacheWrite,
18
+ ...(first.cacheWrite1h !== undefined || second.cacheWrite1h !== undefined
19
+ ? { cacheWrite1h: (first.cacheWrite1h ?? 0) + (second.cacheWrite1h ?? 0) }
20
+ : {}),
21
+ ...(first.reasoning !== undefined || second.reasoning !== undefined
22
+ ? { reasoning: (first.reasoning ?? 0) + (second.reasoning ?? 0) }
23
+ : {}),
24
+ totalTokens: first.totalTokens + second.totalTokens,
25
+ cost: {
26
+ input: first.cost.input + second.cost.input,
27
+ output: first.cost.output + second.cost.output,
28
+ cacheRead: first.cost.cacheRead + second.cost.cacheRead,
29
+ cacheWrite: first.cost.cacheWrite + second.cost.cacheWrite,
30
+ total: first.cost.total + second.cost.total,
31
+ },
32
+ };
33
+ }
11
34
  export function getUsageCostBreakdown(entries) {
12
35
  const totalsByKey = new Map();
13
36
  for (const entry of entries) {
@@ -1 +1 @@
1
- {"version":3,"file":"usage-totals.js","sourceRoot":"","sources":["../../src/core/usage-totals.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Usage } from \"@bastani/pi-ai/compat\";\nimport type { SessionEntry } from \"./session-manager.ts\";\n\nexport interface UsageTotals {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n}\n\nexport function createUsageTotals(): UsageTotals {\n\treturn { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0 };\n}\n\nexport function addUsageToTotals(totals: UsageTotals, usage: Usage): void {\n\ttotals.input += usage.input;\n\ttotals.output += usage.output;\n\ttotals.cacheRead += usage.cacheRead;\n\ttotals.cacheWrite += usage.cacheWrite;\n\ttotals.cost += usage.cost.total;\n}\n\nexport interface UsageCostBreakdownEntry {\n\tkey: string;\n\tcost: number;\n\ttokens: number;\n}\n\ntype MessageWithUsage = { role: \"toolResult\"; usage?: Usage };\n\nexport function getUsageCostBreakdown(entries: SessionEntry[]): UsageCostBreakdownEntry[] {\n\tconst totalsByKey = new Map<string, UsageTotals>();\n\tfor (const entry of entries) {\n\t\tlet key: string | undefined;\n\t\tlet usage: Usage | undefined;\n\t\tif (entry.type === \"usage\") {\n\t\t\tkey = `${entry.provider}/${entry.model}`;\n\t\t\tusage = entry.usage;\n\t\t}\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tkey = `${entry.message.provider}/${entry.message.responseModel ?? entry.message.model}`;\n\t\t\tusage = entry.message.usage;\n\t\t} else if (entry.type === \"message\" && entry.message.role === \"toolResult\") {\n\t\t\tusage = (entry.message as MessageWithUsage).usage;\n\t\t\tkey = usage ? \"Tools/summaries\" : undefined;\n\t\t} else if (\n\t\t\t(entry.type === \"branch_summary\" || entry.type === \"session_summary\" || entry.type === \"compaction\") &&\n\t\t\tentry.usage\n\t\t) {\n\t\t\tkey = \"Tools/summaries\";\n\t\t\tusage = entry.usage;\n\t\t}\n\t\tif (!key || !usage) continue;\n\t\tconst totals = totalsByKey.get(key) ?? createUsageTotals();\n\t\taddUsageToTotals(totals, usage);\n\t\ttotalsByKey.set(key, totals);\n\t}\n\treturn [...totalsByKey]\n\t\t.map(([key, totals]) => ({\n\t\t\tkey,\n\t\t\tcost: totals.cost,\n\t\t\ttokens: totals.input + totals.output + totals.cacheRead + totals.cacheWrite,\n\t\t}))\n\t\t.filter((entry) => entry.cost > 0 || entry.tokens > 0)\n\t\t.sort((a, b) => b.cost - a.cost);\n}\n"]}
1
+ {"version":3,"file":"usage-totals.js","sourceRoot":"","sources":["../../src/core/usage-totals.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Usage } from \"@bastani/pi-ai/compat\";\nimport type { SessionEntry } from \"./session-manager.ts\";\n\nexport interface UsageTotals {\n\tinput: number;\n\toutput: number;\n\tcacheRead: number;\n\tcacheWrite: number;\n\tcost: number;\n}\n\nexport function createUsageTotals(): UsageTotals {\n\treturn { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, cost: 0 };\n}\n\nexport function addUsageToTotals(totals: UsageTotals, usage: Usage): void {\n\ttotals.input += usage.input;\n\ttotals.output += usage.output;\n\ttotals.cacheRead += usage.cacheRead;\n\ttotals.cacheWrite += usage.cacheWrite;\n\ttotals.cost += usage.cost.total;\n}\n\n/** Sum nested/classifier usage without losing optional token splits. */\nexport function combineUsage(first: Usage, second: Usage): Usage {\n\treturn {\n\t\tinput: first.input + second.input,\n\t\toutput: first.output + second.output,\n\t\tcacheRead: first.cacheRead + second.cacheRead,\n\t\tcacheWrite: first.cacheWrite + second.cacheWrite,\n\t\t...(first.cacheWrite1h !== undefined || second.cacheWrite1h !== undefined\n\t\t\t? { cacheWrite1h: (first.cacheWrite1h ?? 0) + (second.cacheWrite1h ?? 0) }\n\t\t\t: {}),\n\t\t...(first.reasoning !== undefined || second.reasoning !== undefined\n\t\t\t? { reasoning: (first.reasoning ?? 0) + (second.reasoning ?? 0) }\n\t\t\t: {}),\n\t\ttotalTokens: first.totalTokens + second.totalTokens,\n\t\tcost: {\n\t\t\tinput: first.cost.input + second.cost.input,\n\t\t\toutput: first.cost.output + second.cost.output,\n\t\t\tcacheRead: first.cost.cacheRead + second.cost.cacheRead,\n\t\t\tcacheWrite: first.cost.cacheWrite + second.cost.cacheWrite,\n\t\t\ttotal: first.cost.total + second.cost.total,\n\t\t},\n\t};\n}\n\nexport interface UsageCostBreakdownEntry {\n\tkey: string;\n\tcost: number;\n\ttokens: number;\n}\n\ntype MessageWithUsage = { role: \"toolResult\"; usage?: Usage };\n\nexport function getUsageCostBreakdown(entries: SessionEntry[]): UsageCostBreakdownEntry[] {\n\tconst totalsByKey = new Map<string, UsageTotals>();\n\tfor (const entry of entries) {\n\t\tlet key: string | undefined;\n\t\tlet usage: Usage | undefined;\n\t\tif (entry.type === \"usage\") {\n\t\t\tkey = `${entry.provider}/${entry.model}`;\n\t\t\tusage = entry.usage;\n\t\t}\n\t\tif (entry.type === \"message\" && entry.message.role === \"assistant\") {\n\t\t\tkey = `${entry.message.provider}/${entry.message.responseModel ?? entry.message.model}`;\n\t\t\tusage = entry.message.usage;\n\t\t} else if (entry.type === \"message\" && entry.message.role === \"toolResult\") {\n\t\t\tusage = (entry.message as MessageWithUsage).usage;\n\t\t\tkey = usage ? \"Tools/summaries\" : undefined;\n\t\t} else if (\n\t\t\t(entry.type === \"branch_summary\" || entry.type === \"session_summary\" || entry.type === \"compaction\") &&\n\t\t\tentry.usage\n\t\t) {\n\t\t\tkey = \"Tools/summaries\";\n\t\t\tusage = entry.usage;\n\t\t}\n\t\tif (!key || !usage) continue;\n\t\tconst totals = totalsByKey.get(key) ?? createUsageTotals();\n\t\taddUsageToTotals(totals, usage);\n\t\ttotalsByKey.set(key, totals);\n\t}\n\treturn [...totalsByKey]\n\t\t.map(([key, totals]) => ({\n\t\t\tkey,\n\t\t\tcost: totals.cost,\n\t\t\ttokens: totals.input + totals.output + totals.cacheRead + totals.cacheWrite,\n\t\t}))\n\t\t.filter((entry) => entry.cost > 0 || entry.tokens > 0)\n\t\t.sort((a, b) => b.cost - a.cost);\n}\n"]}
@@ -0,0 +1,10 @@
1
+ import type { AnyModel } from "@bastani/pi-ai";
2
+ import type { AgentToolResult } from "@earendil-works/pi-agent-core";
3
+ import type { ExtensionToolContext } from "../../core/extensions/context-types.ts";
4
+ import type { SessionEntry } from "../../core/session-manager.ts";
5
+ import { type CodemodeToolDetails, type CodemodeToolInput, type CodemodeToolOptions } from "./tool.js";
6
+ export declare function readCodemodeStore(branch: readonly SessionEntry[]): Record<string, unknown>;
7
+ /** Explicit public catalog fields. Provider configuration and credential-bearing URLs never cross into the VM. */
8
+ export declare function toCodemodeModelInfo(model: AnyModel): Record<string, unknown>;
9
+ export declare function executeCodemode(id: string, input: CodemodeToolInput, signal: AbortSignal | undefined, update: ((result: AgentToolResult<CodemodeToolDetails>) => void) | undefined, ctx: ExtensionToolContext | undefined, options?: CodemodeToolOptions): Promise<AgentToolResult<CodemodeToolDetails>>;
10
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/execute.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAkE,MAAM,gBAAgB,CAAC;AAC/G,OAAO,KAAK,EAAa,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAWhF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,EAGN,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EAGxB,MAAM,WAAW,CAAC;AAEnB,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAsB1F;AAOD,kHAAkH;AAClH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,QAAQ,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAa5E;AAgJD,wBAAsB,eAAe,CACpC,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,EAC5E,GAAG,EAAE,oBAAoB,GAAG,SAAS,EACrC,OAAO,GAAE,mBAAwB,GAC/B,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAiH/C"}
@@ -0,0 +1,313 @@
1
+ import { randomBytes } from "node:crypto";
2
+ import { writeFile } from "node:fs/promises";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { CodemodeSandbox, loadQuickJSWasm, parseCodemodeSource, renderToolSample, toCodemodeIdentifier, } from "@earendil-works/pi-codemode";
6
+ import { getCodemodeWorkerUrl, getQuickJSWasmPath } from "../../config.js";
7
+ import { combineUsage } from "../../core/usage-totals.js";
8
+ import { Bm25Ranker, createToolSearchDocument, DEFAULT_TOOL_SEARCH_LIMIT } from "../tool-search/tool.js";
9
+ import { CODEMODE_STORE_ENTRY_TYPE, getCodemodeCallableTools, toCodemodeDeclaration, } from "./tool.js";
10
+ export function readCodemodeStore(branch) {
11
+ const store = new Map();
12
+ for (const entry of branch) {
13
+ if (entry.type !== "custom" ||
14
+ entry.customType !== CODEMODE_STORE_ENTRY_TYPE ||
15
+ typeof entry.data !== "object" ||
16
+ entry.data === null)
17
+ continue;
18
+ const data = entry.data;
19
+ if (!data.set ||
20
+ typeof data.set !== "object" ||
21
+ !Array.isArray(data.delete) ||
22
+ !data.delete.every((key) => typeof key === "string"))
23
+ continue;
24
+ for (const key of data.delete)
25
+ store.delete(key);
26
+ for (const [key, value] of Object.entries(data.set))
27
+ store.set(key, value);
28
+ }
29
+ return Object.fromEntries(store);
30
+ }
31
+ function textOf(result) {
32
+ return result.content
33
+ .filter((block) => block.type === "text")
34
+ .map((block) => block.text)
35
+ .join("\n");
36
+ }
37
+ /** Explicit public catalog fields. Provider configuration and credential-bearing URLs never cross into the VM. */
38
+ export function toCodemodeModelInfo(model) {
39
+ return {
40
+ type: model.type,
41
+ provider: model.provider,
42
+ id: model.id,
43
+ name: model.name,
44
+ api: model.api,
45
+ input: model.input,
46
+ ...("reasoning" in model ? { reasoning: model.reasoning } : {}),
47
+ ...("contextWindow" in model ? { contextWindow: model.contextWindow } : {}),
48
+ ...("maxTokens" in model ? { maxTokens: model.maxTokens } : {}),
49
+ cost: model.cost,
50
+ };
51
+ }
52
+ function modelType(value) {
53
+ if (value === "chat" || value === "image" || value === "classifier")
54
+ return value;
55
+ throw new Error('Model type must be "chat", "image", or "classifier"');
56
+ }
57
+ function provider(value) {
58
+ if (value === undefined || value === null)
59
+ return undefined;
60
+ if (typeof value === "string")
61
+ return value;
62
+ throw new Error("provider must be a string");
63
+ }
64
+ function preview(args) {
65
+ try {
66
+ return (JSON.stringify(args) ?? "").slice(0, 200);
67
+ }
68
+ catch {
69
+ return "";
70
+ }
71
+ }
72
+ function createLimiter(limit) {
73
+ let active = 0;
74
+ const waiting = [];
75
+ return async (run) => {
76
+ if (active >= limit)
77
+ await new Promise((resolve) => waiting.push(resolve));
78
+ active++;
79
+ try {
80
+ return await run();
81
+ }
82
+ finally {
83
+ active--;
84
+ waiting.shift()?.();
85
+ }
86
+ };
87
+ }
88
+ function discoveryGlobals(tools, samples, options) {
89
+ const entry = (name) => ({ name: toCodemodeIdentifier(name), description: samples.get(name) ?? "" });
90
+ return [
91
+ {
92
+ name: "searchTools",
93
+ spread: true,
94
+ execute: (args) => {
95
+ const [query, config] = args;
96
+ if (typeof query !== "string")
97
+ throw new Error("searchTools() expects a query string");
98
+ const limit = config?.limit ?? DEFAULT_TOOL_SEARCH_LIMIT;
99
+ if (typeof limit !== "number" || !Number.isInteger(limit) || limit <= 0)
100
+ throw new Error("searchTools() limit must be a positive integer");
101
+ if (config?.namespace !== undefined && typeof config.namespace !== "string")
102
+ throw new Error("searchTools() namespace must be a string");
103
+ const docs = tools.flatMap((tool) => {
104
+ const namespace = options.getToolNamespace?.(tool.name);
105
+ return config?.namespace && namespace?.name !== config.namespace
106
+ ? []
107
+ : [createToolSearchDocument(tool, namespace)];
108
+ });
109
+ return new Bm25Ranker().rank(query, docs, limit).map((match) => entry(match.name));
110
+ },
111
+ },
112
+ {
113
+ name: "describeTool",
114
+ spread: true,
115
+ execute: (args) => {
116
+ const [name] = args;
117
+ if (typeof name !== "string")
118
+ throw new Error("describeTool() expects a tool name");
119
+ const tool = tools.find((tool) => tool.name === name || toCodemodeIdentifier(tool.name) === name);
120
+ return tool ? samples.get(tool.name) : undefined;
121
+ },
122
+ },
123
+ ];
124
+ }
125
+ function modelGlobals(ctx, id, calls, publish, addUsage) {
126
+ const models = ctx.modelRegistry;
127
+ const limit = createLimiter(4);
128
+ let count = 0;
129
+ return [
130
+ {
131
+ name: "models.getModelsOfType",
132
+ spread: true,
133
+ execute: (args) => {
134
+ const [type, source] = args;
135
+ return models.getModelsOfType(modelType(type), provider(source)).map(toCodemodeModelInfo);
136
+ },
137
+ },
138
+ {
139
+ name: "models.getAvailableOfType",
140
+ spread: true,
141
+ execute: async (args, { signal }) => {
142
+ const [type, source] = args;
143
+ return (await models.getAvailableOfType(modelType(type), provider(source), { signal })).map(toCodemodeModelInfo);
144
+ },
145
+ },
146
+ {
147
+ name: "models.getModelOfType",
148
+ spread: true,
149
+ execute: (args) => {
150
+ const [type, source, modelId] = args;
151
+ if (typeof source !== "string" || typeof modelId !== "string")
152
+ throw new Error("models.getModelOfType() expects type, provider, and id");
153
+ const model = models.getModelOfType(modelType(type), source, modelId);
154
+ return model ? toCodemodeModelInfo(model) : undefined;
155
+ },
156
+ },
157
+ {
158
+ name: "models.classify",
159
+ spread: true,
160
+ execute: async (args, { signal }) => {
161
+ const [ref, context] = args;
162
+ if (!ref || typeof ref.provider !== "string" || typeof ref.id !== "string")
163
+ throw new Error("models.classify() expects a catalog model reference");
164
+ const model = models.getModelOfType("classifier", ref.provider, ref.id);
165
+ if (!model)
166
+ throw new Error(`Unknown classifier model ${ref.provider}/${ref.id}`);
167
+ const record = {
168
+ id: `${id}/models.classify/${++count}`,
169
+ name: "models.classify",
170
+ args: `${model.provider}/${model.id}`,
171
+ status: "running",
172
+ };
173
+ calls.push(record);
174
+ publish();
175
+ const start = performance.now();
176
+ const result = await limit(() => models.classify(model, context, { signal }));
177
+ record.durationMs = performance.now() - start;
178
+ record.status =
179
+ result.stopReason === "stop" ? "ok" : result.stopReason === "aborted" ? "cancelled" : "error";
180
+ if (result.errorMessage)
181
+ record.error = result.errorMessage.slice(0, 500);
182
+ if (result.usage) {
183
+ record.cost = result.usage.cost.total;
184
+ addUsage(result.usage);
185
+ }
186
+ publish();
187
+ return result;
188
+ },
189
+ },
190
+ ];
191
+ }
192
+ export async function executeCodemode(id, input, signal, update, ctx, options = {}) {
193
+ const start = performance.now();
194
+ const { code, options: source } = parseCodemodeSource(input.code);
195
+ const calls = [];
196
+ let usage;
197
+ const snapshot = () => ({ calls: calls.map((call) => ({ ...call })) });
198
+ const publish = () => update?.({ content: [], details: snapshot() });
199
+ const callable = ctx ? getCodemodeCallableTools(ctx.tools) : [];
200
+ const samples = new Map(callable.map((tool) => [tool.name, renderToolSample(toCodemodeDeclaration(tool))]));
201
+ const sandbox = new CodemodeSandbox({
202
+ tools: callable.map((tool) => ({
203
+ name: tool.name,
204
+ description: samples.get(tool.name),
205
+ execute: async (args, { signal: callSignal }) => {
206
+ const record = {
207
+ id: `${id}/?`,
208
+ name: tool.name,
209
+ args: preview(args),
210
+ status: "running",
211
+ };
212
+ calls.push(record);
213
+ publish();
214
+ const started = performance.now();
215
+ if (!ctx)
216
+ throw new Error("Tool calls need a session");
217
+ const outcome = await ctx.executeTool(tool.name, args, { signal: callSignal });
218
+ record.id = outcome.toolCall.id;
219
+ record.durationMs = performance.now() - started;
220
+ record.status = outcome.isError ? (callSignal.aborted ? "cancelled" : "error") : "ok";
221
+ const text = textOf(outcome.result);
222
+ if (outcome.isError)
223
+ record.error = (text || `Tool ${tool.name} failed`).slice(0, 500);
224
+ publish();
225
+ if (tool.outputSchema && outcome.result.structuredContent !== undefined)
226
+ return outcome.result.structuredContent;
227
+ if (outcome.isError)
228
+ throw new Error(text || `Tool ${tool.name} failed`);
229
+ return text;
230
+ },
231
+ })),
232
+ globals: [
233
+ ...discoveryGlobals(callable, samples, options),
234
+ ...(options.models && ctx
235
+ ? modelGlobals(ctx, id, calls, publish, (extra) => {
236
+ usage = usage ? combineUsage(usage, extra) : extra;
237
+ })
238
+ : []),
239
+ ],
240
+ timeoutMs: source.timeoutMs ?? Number.POSITIVE_INFINITY,
241
+ memoryLimitBytes: 256 * 1024 * 1024,
242
+ wasm: loadQuickJSWasm(getQuickJSWasmPath()),
243
+ workerUrl: getCodemodeWorkerUrl(),
244
+ });
245
+ let result;
246
+ try {
247
+ result = await sandbox.execute(code, {
248
+ signal,
249
+ store: ctx ? readCodemodeStore(ctx.sessionManager.getBranch()) : {},
250
+ });
251
+ }
252
+ finally {
253
+ await sandbox.close();
254
+ }
255
+ for (const call of calls)
256
+ if (call.status === "running")
257
+ call.status = "cancelled";
258
+ let content = [...result.output];
259
+ if (result.ok) {
260
+ if (Object.keys(result.storeWrites.set).length || result.storeWrites.delete.length)
261
+ options.appendEntry?.(CODEMODE_STORE_ENTRY_TYPE, result.storeWrites);
262
+ if (result.value !== undefined)
263
+ content.push({
264
+ type: "text",
265
+ text: typeof result.value === "string" ? result.value : (JSON.stringify(result.value) ?? String(result.value)),
266
+ });
267
+ }
268
+ else
269
+ content.push({
270
+ type: "text",
271
+ text: `Script error:\n${result.error.stack ?? result.error.message}\n\nTool calls made before the failure (they are not undone): ${calls.map((call) => `${call.name} (${call.status})`).join(", ") || "none"}`,
272
+ });
273
+ const text = content
274
+ .filter((block) => block.type === "text")
275
+ .map((block) => block.text)
276
+ .join("\n");
277
+ const budget = (source.maxOutputTokens ?? 10_000) * 4;
278
+ const details = snapshot();
279
+ if (text.length > budget) {
280
+ const path = join(tmpdir(), `atomic-codemode-${randomBytes(8).toString("hex")}.txt`);
281
+ let notice;
282
+ try {
283
+ await writeFile(path, text);
284
+ details.fullOutputPath = path;
285
+ notice = `Full output: ${path}`;
286
+ }
287
+ catch (error) {
288
+ notice = `Could not save full output: ${error instanceof Error ? error.message : String(error)}`;
289
+ }
290
+ const head = Math.floor(budget / 2);
291
+ const tail = budget - head;
292
+ content = [
293
+ {
294
+ type: "text",
295
+ text: `Warning: truncated output (original token count: ${Math.ceil(text.length / 4)})\n${text.slice(0, head)}\n... output truncated ...\n${tail ? text.slice(-tail) : ""}\n${notice}`,
296
+ },
297
+ ...content.filter((block) => block.type === "image"),
298
+ ];
299
+ }
300
+ return {
301
+ content: [
302
+ {
303
+ type: "text",
304
+ text: `${result.ok ? "Script completed" : "Script failed"}\nWall time ${((performance.now() - start) / 1000).toFixed(1)} seconds\nOutput:\n`,
305
+ },
306
+ ...content,
307
+ ],
308
+ details,
309
+ ...(usage ? { usage } : {}),
310
+ ...(result.ok ? {} : { isError: true }),
311
+ };
312
+ }
313
+ //# sourceMappingURL=execute.js.map