@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/codemode/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"node:crypto\";\nimport { writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AnyModel, ClassifierContext, ImageContent, ModelType, TextContent, Usage } from \"@bastani/pi-ai\";\nimport type { AgentTool, AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype CodemodeResult,\n\tCodemodeSandbox,\n\ttype CodemodeTool,\n\tloadQuickJSWasm,\n\tparseCodemodeSource,\n\trenderToolSample,\n\ttoCodemodeIdentifier,\n} from \"@earendil-works/pi-codemode\";\nimport { getCodemodeWorkerUrl, getQuickJSWasmPath } from \"../../config.js\";\nimport type { ExtensionToolContext } from \"../../core/extensions/context-types.ts\";\nimport type { SessionEntry } from \"../../core/session-manager.ts\";\nimport { combineUsage } from \"../../core/usage-totals.ts\";\nimport { Bm25Ranker, createToolSearchDocument, DEFAULT_TOOL_SEARCH_LIMIT } from \"../tool-search/tool.js\";\nimport {\n\tCODEMODE_STORE_ENTRY_TYPE,\n\ttype CodemodeNestedCall,\n\ttype CodemodeToolDetails,\n\ttype CodemodeToolInput,\n\ttype CodemodeToolOptions,\n\tgetCodemodeCallableTools,\n\ttoCodemodeDeclaration,\n} from \"./tool.js\";\n\nexport function readCodemodeStore(branch: readonly SessionEntry[]): Record<string, unknown> {\n\tconst store = new Map<string, unknown>();\n\tfor (const entry of branch) {\n\t\tif (\n\t\t\tentry.type !== \"custom\" ||\n\t\t\tentry.customType !== CODEMODE_STORE_ENTRY_TYPE ||\n\t\t\ttypeof entry.data !== \"object\" ||\n\t\t\tentry.data === null\n\t\t)\n\t\t\tcontinue;\n\t\tconst data = entry.data as { set?: Record<string, unknown>; delete?: string[] };\n\t\tif (\n\t\t\t!data.set ||\n\t\t\ttypeof data.set !== \"object\" ||\n\t\t\t!Array.isArray(data.delete) ||\n\t\t\t!data.delete.every((key) => typeof key === \"string\")\n\t\t)\n\t\t\tcontinue;\n\t\tfor (const key of data.delete) store.delete(key);\n\t\tfor (const [key, value] of Object.entries(data.set)) store.set(key, value);\n\t}\n\treturn Object.fromEntries(store);\n}\nfunction textOf(result: AgentToolResult<unknown>): string {\n\treturn result.content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\");\n}\n/** Explicit public catalog fields. Provider configuration and credential-bearing URLs never cross into the VM. */\nexport function toCodemodeModelInfo(model: AnyModel): Record<string, unknown> {\n\treturn {\n\t\ttype: model.type,\n\t\tprovider: model.provider,\n\t\tid: model.id,\n\t\tname: model.name,\n\t\tapi: model.api,\n\t\tinput: model.input,\n\t\t...(\"reasoning\" in model ? { reasoning: model.reasoning } : {}),\n\t\t...(\"contextWindow\" in model ? { contextWindow: model.contextWindow } : {}),\n\t\t...(\"maxTokens\" in model ? { maxTokens: model.maxTokens } : {}),\n\t\tcost: model.cost,\n\t};\n}\nfunction modelType(value: unknown): ModelType {\n\tif (value === \"chat\" || value === \"image\" || value === \"classifier\") return value;\n\tthrow new Error('Model type must be \"chat\", \"image\", or \"classifier\"');\n}\nfunction provider(value: unknown): string | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value === \"string\") return value;\n\tthrow new Error(\"provider must be a string\");\n}\nfunction preview(args: unknown): string {\n\ttry {\n\t\treturn (JSON.stringify(args) ?? \"\").slice(0, 200);\n\t} catch {\n\t\treturn \"\";\n\t}\n}\nfunction createLimiter(limit: number) {\n\tlet active = 0;\n\tconst waiting: (() => void)[] = [];\n\treturn async <T>(run: () => Promise<T>): Promise<T> => {\n\t\tif (active >= limit) await new Promise<void>((resolve) => waiting.push(resolve));\n\t\tactive++;\n\t\ttry {\n\t\t\treturn await run();\n\t\t} finally {\n\t\t\tactive--;\n\t\t\twaiting.shift()?.();\n\t\t}\n\t};\n}\nfunction discoveryGlobals(\n\ttools: readonly AgentTool[],\n\tsamples: ReadonlyMap<string, string>,\n\toptions: CodemodeToolOptions,\n): CodemodeTool[] {\n\tconst entry = (name: string) => ({ name: toCodemodeIdentifier(name), description: samples.get(name) ?? \"\" });\n\treturn [\n\t\t{\n\t\t\tname: \"searchTools\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [query, config] = args as [unknown, { limit?: unknown; namespace?: unknown } | undefined];\n\t\t\t\tif (typeof query !== \"string\") throw new Error(\"searchTools() expects a query string\");\n\t\t\t\tconst limit = config?.limit ?? DEFAULT_TOOL_SEARCH_LIMIT;\n\t\t\t\tif (typeof limit !== \"number\" || !Number.isInteger(limit) || limit <= 0)\n\t\t\t\t\tthrow new Error(\"searchTools() limit must be a positive integer\");\n\t\t\t\tif (config?.namespace !== undefined && typeof config.namespace !== \"string\")\n\t\t\t\t\tthrow new Error(\"searchTools() namespace must be a string\");\n\t\t\t\tconst docs = tools.flatMap((tool) => {\n\t\t\t\t\tconst namespace = options.getToolNamespace?.(tool.name);\n\t\t\t\t\treturn config?.namespace && namespace?.name !== config.namespace\n\t\t\t\t\t\t? []\n\t\t\t\t\t\t: [createToolSearchDocument(tool, namespace)];\n\t\t\t\t});\n\t\t\t\treturn new Bm25Ranker().rank(query, docs, limit).map((match) => entry(match.name));\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"describeTool\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [name] = args as unknown[];\n\t\t\t\tif (typeof name !== \"string\") throw new Error(\"describeTool() expects a tool name\");\n\t\t\t\tconst tool = tools.find((tool) => tool.name === name || toCodemodeIdentifier(tool.name) === name);\n\t\t\t\treturn tool ? samples.get(tool.name) : undefined;\n\t\t\t},\n\t\t},\n\t];\n}\nfunction modelGlobals(\n\tctx: ExtensionToolContext,\n\tid: string,\n\tcalls: CodemodeNestedCall[],\n\tpublish: () => void,\n\taddUsage: (usage: Usage) => void,\n): CodemodeTool[] {\n\tconst models = ctx.modelRegistry;\n\tconst limit = createLimiter(4);\n\tlet count = 0;\n\treturn [\n\t\t{\n\t\t\tname: \"models.getModelsOfType\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [type, source] = args as unknown[];\n\t\t\t\treturn models.getModelsOfType(modelType(type), provider(source)).map(toCodemodeModelInfo);\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"models.getAvailableOfType\",\n\t\t\tspread: true,\n\t\t\texecute: async (args, { signal }) => {\n\t\t\t\tconst [type, source] = args as unknown[];\n\t\t\t\treturn (await models.getAvailableOfType(modelType(type), provider(source), { signal })).map(\n\t\t\t\t\ttoCodemodeModelInfo,\n\t\t\t\t);\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"models.getModelOfType\",\n\t\t\tspread: true,\n\t\t\texecute: (args) => {\n\t\t\t\tconst [type, source, modelId] = args as unknown[];\n\t\t\t\tif (typeof source !== \"string\" || typeof modelId !== \"string\")\n\t\t\t\t\tthrow new Error(\"models.getModelOfType() expects type, provider, and id\");\n\t\t\t\tconst model = models.getModelOfType(modelType(type), source, modelId);\n\t\t\t\treturn model ? toCodemodeModelInfo(model) : undefined;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"models.classify\",\n\t\t\tspread: true,\n\t\t\texecute: async (args, { signal }) => {\n\t\t\t\tconst [ref, context] = args as [{ provider?: string; id?: string } | null, unknown];\n\t\t\t\tif (!ref || typeof ref.provider !== \"string\" || typeof ref.id !== \"string\")\n\t\t\t\t\tthrow new Error(\"models.classify() expects a catalog model reference\");\n\t\t\t\tconst model = models.getModelOfType(\"classifier\", ref.provider, ref.id);\n\t\t\t\tif (!model) throw new Error(`Unknown classifier model ${ref.provider}/${ref.id}`);\n\t\t\t\tconst record: CodemodeNestedCall = {\n\t\t\t\t\tid: `${id}/models.classify/${++count}`,\n\t\t\t\t\tname: \"models.classify\",\n\t\t\t\t\targs: `${model.provider}/${model.id}`,\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t};\n\t\t\t\tcalls.push(record);\n\t\t\t\tpublish();\n\t\t\t\tconst start = performance.now();\n\t\t\t\tconst result = await limit(() => models.classify(model, context as ClassifierContext, { signal }));\n\t\t\t\trecord.durationMs = performance.now() - start;\n\t\t\t\trecord.status =\n\t\t\t\t\tresult.stopReason === \"stop\" ? \"ok\" : result.stopReason === \"aborted\" ? \"cancelled\" : \"error\";\n\t\t\t\tif (result.errorMessage) record.error = result.errorMessage.slice(0, 500);\n\t\t\t\tif (result.usage) {\n\t\t\t\t\trecord.cost = result.usage.cost.total;\n\t\t\t\t\taddUsage(result.usage);\n\t\t\t\t}\n\t\t\t\tpublish();\n\t\t\t\treturn result;\n\t\t\t},\n\t\t},\n\t];\n}\n\nexport async function executeCodemode(\n\tid: string,\n\tinput: CodemodeToolInput,\n\tsignal: AbortSignal | undefined,\n\tupdate: ((result: AgentToolResult<CodemodeToolDetails>) => void) | undefined,\n\tctx: ExtensionToolContext | undefined,\n\toptions: CodemodeToolOptions = {},\n): Promise<AgentToolResult<CodemodeToolDetails>> {\n\tconst start = performance.now();\n\tconst { code, options: source } = parseCodemodeSource(input.code);\n\tconst calls: CodemodeNestedCall[] = [];\n\tlet usage: Usage | undefined;\n\tconst snapshot = (): CodemodeToolDetails => ({ calls: calls.map((call) => ({ ...call })) });\n\tconst publish = () => update?.({ content: [], details: snapshot() });\n\tconst callable = ctx ? getCodemodeCallableTools(ctx.tools) : [];\n\tconst samples = new Map(callable.map((tool) => [tool.name, renderToolSample(toCodemodeDeclaration(tool))]));\n\tconst sandbox = new CodemodeSandbox({\n\t\ttools: callable.map((tool) => ({\n\t\t\tname: tool.name,\n\t\t\tdescription: samples.get(tool.name),\n\t\t\texecute: async (args, { signal: callSignal }) => {\n\t\t\t\tconst record: CodemodeNestedCall = {\n\t\t\t\t\tid: `${id}/?`,\n\t\t\t\t\tname: tool.name,\n\t\t\t\t\targs: preview(args),\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t};\n\t\t\t\tcalls.push(record);\n\t\t\t\tpublish();\n\t\t\t\tconst started = performance.now();\n\t\t\t\tif (!ctx) throw new Error(\"Tool calls need a session\");\n\t\t\t\tconst outcome = await ctx.executeTool(tool.name, args, { signal: callSignal });\n\t\t\t\trecord.id = outcome.toolCall.id;\n\t\t\t\trecord.durationMs = performance.now() - started;\n\t\t\t\trecord.status = outcome.isError ? (callSignal.aborted ? \"cancelled\" : \"error\") : \"ok\";\n\t\t\t\tconst text = textOf(outcome.result);\n\t\t\t\tif (outcome.isError) record.error = (text || `Tool ${tool.name} failed`).slice(0, 500);\n\t\t\t\tpublish();\n\t\t\t\tif (tool.outputSchema && outcome.result.structuredContent !== undefined)\n\t\t\t\t\treturn outcome.result.structuredContent;\n\t\t\t\tif (outcome.isError) throw new Error(text || `Tool ${tool.name} failed`);\n\t\t\t\treturn text;\n\t\t\t},\n\t\t})),\n\t\tglobals: [\n\t\t\t...discoveryGlobals(callable, samples, options),\n\t\t\t...(options.models && ctx\n\t\t\t\t? modelGlobals(ctx, id, calls, publish, (extra) => {\n\t\t\t\t\t\tusage = usage ? combineUsage(usage, extra) : extra;\n\t\t\t\t\t})\n\t\t\t\t: []),\n\t\t],\n\t\ttimeoutMs: source.timeoutMs ?? Number.POSITIVE_INFINITY,\n\t\tmemoryLimitBytes: 256 * 1024 * 1024,\n\t\twasm: loadQuickJSWasm(getQuickJSWasmPath()),\n\t\tworkerUrl: getCodemodeWorkerUrl(),\n\t});\n\tlet result: CodemodeResult;\n\ttry {\n\t\tresult = await sandbox.execute(code, {\n\t\t\tsignal,\n\t\t\tstore: ctx ? readCodemodeStore(ctx.sessionManager.getBranch()) : {},\n\t\t});\n\t} finally {\n\t\tawait sandbox.close();\n\t}\n\tfor (const call of calls) if (call.status === \"running\") call.status = \"cancelled\";\n\tlet content: (TextContent | ImageContent)[] = [...result.output];\n\tif (result.ok) {\n\t\tif (Object.keys(result.storeWrites.set).length || result.storeWrites.delete.length)\n\t\t\toptions.appendEntry?.(CODEMODE_STORE_ENTRY_TYPE, result.storeWrites);\n\t\tif (result.value !== undefined)\n\t\t\tcontent.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext:\n\t\t\t\t\ttypeof result.value === \"string\" ? result.value : (JSON.stringify(result.value) ?? String(result.value)),\n\t\t\t});\n\t} else\n\t\tcontent.push({\n\t\t\ttype: \"text\",\n\t\t\ttext: `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\"}`,\n\t\t});\n\tconst text = content\n\t\t.filter((block): block is TextContent => block.type === \"text\")\n\t\t.map((block) => block.text)\n\t\t.join(\"\\n\");\n\tconst budget = (source.maxOutputTokens ?? 10_000) * 4;\n\tconst details = snapshot();\n\tif (text.length > budget) {\n\t\tconst path = join(tmpdir(), `atomic-codemode-${randomBytes(8).toString(\"hex\")}.txt`);\n\t\tlet notice: string;\n\t\ttry {\n\t\t\tawait writeFile(path, text);\n\t\t\tdetails.fullOutputPath = path;\n\t\t\tnotice = `Full output: ${path}`;\n\t\t} catch (error) {\n\t\t\tnotice = `Could not save full output: ${error instanceof Error ? error.message : String(error)}`;\n\t\t}\n\t\tconst head = Math.floor(budget / 2);\n\t\tconst tail = budget - head;\n\t\tcontent = [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `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}`,\n\t\t\t},\n\t\t\t...content.filter((block) => block.type === \"image\"),\n\t\t];\n\t}\n\treturn {\n\t\tcontent: [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: `${result.ok ? \"Script completed\" : \"Script failed\"}\\nWall time ${((performance.now() - start) / 1000).toFixed(1)} seconds\\nOutput:\\n`,\n\t\t\t},\n\t\t\t...content,\n\t\t],\n\t\tdetails,\n\t\t...(usage ? { usage } : {}),\n\t\t...(result.ok ? {} : { isError: true }),\n\t};\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import type { ExtensionFactory } from "../../core/extensions/types.ts";
2
+ import type { CodemodeMode } from "../../core/settings-manager.ts";
3
+ export interface CodemodeExtensionOptions {
4
+ mode?: CodemodeMode;
5
+ inlineBudget?: number;
6
+ models?: boolean;
7
+ }
8
+ export declare function createCodemodeExtension(options?: CodemodeExtensionOptions): ExtensionFactory;
9
+ declare const _default: ExtensionFactory;
10
+ export default _default;
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAGnE,MAAM,WAAW,wBAAwB;IACxC,IAAI,CAAC,EAAE,YAAY,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,wBAAgB,uBAAuB,CAAC,OAAO,GAAE,wBAA6B,GAAG,gBAAgB,CAYhG"}
@@ -0,0 +1,14 @@
1
+ import { createCodemodeToolDefinition } from "./tool.js";
2
+ export function createCodemodeExtension(options = {}) {
3
+ return (pi) => {
4
+ pi.registerTool(createCodemodeToolDefinition({
5
+ models: options.models ?? true,
6
+ appendEntry: (type, data) => pi.appendEntry(type, data),
7
+ getToolNamespace: (name) => pi.getAllTools().find((tool) => tool.name === name)?.namespace,
8
+ getMode: () => options.mode ?? (pi.getSettings().codemode?.mode === "only" ? "only" : "on"),
9
+ getInlineBudget: () => options.inlineBudget ?? pi.getSettings().codemode?.inlineBudget,
10
+ }));
11
+ };
12
+ }
13
+ export default createCodemodeExtension();
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/extensions/codemode/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,4BAA4B,EAAE,MAAM,WAAW,CAAC;AAOzD,MAAM,UAAU,uBAAuB,CAAC,OAAO,GAA6B,EAAE;IAC7E,OAAO,CAAC,EAAE,EAAE,EAAE;QACb,EAAE,CAAC,YAAY,CACd,4BAA4B,CAAC;YAC5B,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,IAAI;YAC9B,WAAW,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC;YACvD,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC,EAAE,SAAS;YAC1F,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAC3F,eAAe,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE,YAAY;SACtF,CAAC,CACF,CAAC;IACH,CAAC,CAAC;AACH,CAAC;AACD,eAAe,uBAAuB,EAAE,CAAC","sourcesContent":["import type { ExtensionFactory } from \"../../core/extensions/types.ts\";\nimport type { CodemodeMode } from \"../../core/settings-manager.ts\";\nimport { createCodemodeToolDefinition } from \"./tool.js\";\n\nexport interface CodemodeExtensionOptions {\n\tmode?: CodemodeMode;\n\tinlineBudget?: number;\n\tmodels?: boolean;\n}\nexport function createCodemodeExtension(options: CodemodeExtensionOptions = {}): ExtensionFactory {\n\treturn (pi) => {\n\t\tpi.registerTool(\n\t\t\tcreateCodemodeToolDefinition({\n\t\t\t\tmodels: options.models ?? true,\n\t\t\t\tappendEntry: (type, data) => pi.appendEntry(type, data),\n\t\t\t\tgetToolNamespace: (name) => pi.getAllTools().find((tool) => tool.name === name)?.namespace,\n\t\t\t\tgetMode: () => options.mode ?? (pi.getSettings().codemode?.mode === \"only\" ? \"only\" : \"on\"),\n\t\t\t\tgetInlineBudget: () => options.inlineBudget ?? pi.getSettings().codemode?.inlineBudget,\n\t\t\t}),\n\t\t);\n\t};\n}\nexport default createCodemodeExtension();\n"]}
@@ -0,0 +1,4 @@
1
+ import type { ToolDefinition } from "../../core/extensions/types.ts";
2
+ import type { CodemodeToolDetails, codemodeSchema } from "./tool.js";
3
+ export declare const codemodeRenderers: Pick<ToolDefinition<typeof codemodeSchema, CodemodeToolDetails>, "renderCall" | "renderResult">;
4
+ //# sourceMappingURL=renderer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/renderer.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAIrE,OAAO,KAAK,EAAsB,mBAAmB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AA0BzF,eAAO,MAAM,iBAAiB,EAAE,IAAI,CACnC,cAAc,CAAC,OAAO,cAAc,EAAE,mBAAmB,CAAC,EAC1D,YAAY,GAAG,cAAc,CA8C7B,CAAC"}
@@ -0,0 +1,78 @@
1
+ import { Text } from "@earendil-works/pi-tui";
2
+ import { getTextOutput, replaceTabs, str } from "../../core/tools/render-utils.js";
3
+ import { keyHint } from "../../modes/interactive/components/keybinding-hints.js";
4
+ import { highlightCode } from "../../modes/interactive/theme/theme.js";
5
+ const SCRIPT_HEADER = /^Script (completed|failed)\nWall time [\d.]+ seconds\nOutput:\n$/;
6
+ function hint(theme, count, noun) {
7
+ return `${theme.fg("muted", `... (${count} more ${noun},`)} ${keyHint("app.tools.expand", "to expand")}${theme.fg("muted", ")")}`;
8
+ }
9
+ function cost(value) {
10
+ return `$${value >= 0.01 ? value.toFixed(2) : value.toPrecision(2)}`;
11
+ }
12
+ function formatCall(call, theme, expanded) {
13
+ const icon = call.status === "running"
14
+ ? theme.fg("warning", "…")
15
+ : call.status === "ok"
16
+ ? theme.fg("success", "✓")
17
+ : call.status === "error"
18
+ ? theme.fg("error", "✗")
19
+ : theme.fg("muted", "⊘");
20
+ const args = !expanded && call.args.length > 80 ? `${call.args.slice(0, 77)}...` : call.args;
21
+ let text = `${icon} ${theme.fg("toolTitle", call.name)}${args ? ` ${theme.fg("muted", args)}` : ""}`;
22
+ if (call.durationMs !== undefined)
23
+ text += ` ${theme.fg("dim", call.durationMs < 1000 ? `${Math.round(call.durationMs)}ms` : `${(call.durationMs / 1000).toFixed(1)}s`)}`;
24
+ if (call.cost)
25
+ text += ` ${theme.fg("dim", cost(call.cost))}`;
26
+ if (expanded && call.error)
27
+ text += `\n ${theme.fg("error", call.error.split("\n").join("\n "))}`;
28
+ return text;
29
+ }
30
+ export const codemodeRenderers = {
31
+ renderCall(args, theme, context) {
32
+ const code = str(args?.code);
33
+ let text = theme.fg("toolTitle", theme.bold("codemode"));
34
+ if (code === null)
35
+ text += ` ${theme.fg("error", "[invalid arg]")}`;
36
+ else if (code) {
37
+ const lines = highlightCode(replaceTabs(code.replace(/\r/g, "").trimEnd()), "javascript");
38
+ const shown = context.expanded ? lines : lines.slice(0, 10);
39
+ text += `\n${shown.join("\n")}`;
40
+ if (shown.length < lines.length)
41
+ text += `\n${hint(theme, lines.length - shown.length, "lines")}`;
42
+ }
43
+ const component = context.lastComponent ?? new Text("", 0, 0);
44
+ component.setText(text);
45
+ return component;
46
+ },
47
+ renderResult(result, options, theme, context) {
48
+ const sections = [];
49
+ const calls = result.details?.calls ?? [];
50
+ if (calls.length) {
51
+ const shown = options.expanded ? calls : calls.slice(-8);
52
+ const lines = shown.map((call) => formatCall(call, theme, options.expanded));
53
+ if (shown.length < calls.length)
54
+ lines.unshift(hint(theme, calls.length - shown.length, "earlier calls"));
55
+ const priced = calls.filter((call) => call.cost);
56
+ if (priced.length > 1)
57
+ lines.push(theme.fg("muted", `Model calls: ${cost(priced.reduce((sum, call) => sum + (call.cost ?? 0), 0))}`));
58
+ sections.push(lines.join("\n"));
59
+ }
60
+ const [first, ...rest] = result.content;
61
+ const content = first?.type === "text" && SCRIPT_HEADER.test(first.text) ? rest : result.content;
62
+ const output = options.isPartial ? "" : getTextOutput({ ...result, content }, context.showImages).trim();
63
+ if (output) {
64
+ const lines = replaceTabs(output).split("\n");
65
+ const shown = options.expanded ? lines : lines.slice(0, 5);
66
+ let text = shown.map((line) => theme.fg(context.isError ? "error" : "toolOutput", line)).join("\n");
67
+ if (shown.length < lines.length)
68
+ text += `\n${hint(theme, lines.length - shown.length, "lines")}`;
69
+ if (result.details?.fullOutputPath && !options.expanded)
70
+ text += `\n${theme.fg("muted", `Full output: ${result.details.fullOutputPath}`)}`;
71
+ sections.push(text);
72
+ }
73
+ const component = context.lastComponent ?? new Text("", 0, 0);
74
+ component.setText(sections.length ? `\n${sections.join("\n\n")}` : "");
75
+ return component;
76
+ },
77
+ };
78
+ //# sourceMappingURL=renderer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../../../src/extensions/codemode/renderer.ts"],"names":[],"mappings":"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","sourcesContent":["import { Text } from \"@earendil-works/pi-tui\";\nimport type { ToolDefinition } from \"../../core/extensions/types.ts\";\nimport { getTextOutput, replaceTabs, str } from \"../../core/tools/render-utils.ts\";\nimport { keyHint } from \"../../modes/interactive/components/keybinding-hints.js\";\nimport { highlightCode, type Theme } from \"../../modes/interactive/theme/theme.js\";\nimport type { CodemodeNestedCall, CodemodeToolDetails, codemodeSchema } from \"./tool.js\";\n\nconst SCRIPT_HEADER = /^Script (completed|failed)\\nWall time [\\d.]+ seconds\\nOutput:\\n$/;\nfunction hint(theme: Theme, count: number, noun: string): string {\n\treturn `${theme.fg(\"muted\", `... (${count} more ${noun},`)} ${keyHint(\"app.tools.expand\", \"to expand\")}${theme.fg(\"muted\", \")\")}`;\n}\nfunction cost(value: number): string {\n\treturn `$${value >= 0.01 ? value.toFixed(2) : value.toPrecision(2)}`;\n}\nfunction formatCall(call: CodemodeNestedCall, theme: Theme, expanded: boolean): string {\n\tconst icon =\n\t\tcall.status === \"running\"\n\t\t\t? theme.fg(\"warning\", \"…\")\n\t\t\t: call.status === \"ok\"\n\t\t\t\t? theme.fg(\"success\", \"✓\")\n\t\t\t\t: call.status === \"error\"\n\t\t\t\t\t? theme.fg(\"error\", \"✗\")\n\t\t\t\t\t: theme.fg(\"muted\", \"⊘\");\n\tconst args = !expanded && call.args.length > 80 ? `${call.args.slice(0, 77)}...` : call.args;\n\tlet text = `${icon} ${theme.fg(\"toolTitle\", call.name)}${args ? ` ${theme.fg(\"muted\", args)}` : \"\"}`;\n\tif (call.durationMs !== undefined)\n\t\ttext += ` ${theme.fg(\"dim\", call.durationMs < 1000 ? `${Math.round(call.durationMs)}ms` : `${(call.durationMs / 1000).toFixed(1)}s`)}`;\n\tif (call.cost) text += ` ${theme.fg(\"dim\", cost(call.cost))}`;\n\tif (expanded && call.error) text += `\\n ${theme.fg(\"error\", call.error.split(\"\\n\").join(\"\\n \"))}`;\n\treturn text;\n}\nexport const codemodeRenderers: Pick<\n\tToolDefinition<typeof codemodeSchema, CodemodeToolDetails>,\n\t\"renderCall\" | \"renderResult\"\n> = {\n\trenderCall(args, theme, context) {\n\t\tconst code = str(args?.code);\n\t\tlet text = theme.fg(\"toolTitle\", theme.bold(\"codemode\"));\n\t\tif (code === null) text += ` ${theme.fg(\"error\", \"[invalid arg]\")}`;\n\t\telse if (code) {\n\t\t\tconst lines = highlightCode(replaceTabs(code.replace(/\\r/g, \"\").trimEnd()), \"javascript\");\n\t\t\tconst shown = context.expanded ? lines : lines.slice(0, 10);\n\t\t\ttext += `\\n${shown.join(\"\\n\")}`;\n\t\t\tif (shown.length < lines.length) text += `\\n${hint(theme, lines.length - shown.length, \"lines\")}`;\n\t\t}\n\t\tconst component = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\tcomponent.setText(text);\n\t\treturn component;\n\t},\n\trenderResult(result, options, theme, context) {\n\t\tconst sections: string[] = [];\n\t\tconst calls = result.details?.calls ?? [];\n\t\tif (calls.length) {\n\t\t\tconst shown = options.expanded ? calls : calls.slice(-8);\n\t\t\tconst lines = shown.map((call) => formatCall(call, theme, options.expanded));\n\t\t\tif (shown.length < calls.length) lines.unshift(hint(theme, calls.length - shown.length, \"earlier calls\"));\n\t\t\tconst priced = calls.filter((call) => call.cost);\n\t\t\tif (priced.length > 1)\n\t\t\t\tlines.push(\n\t\t\t\t\ttheme.fg(\"muted\", `Model calls: ${cost(priced.reduce((sum, call) => sum + (call.cost ?? 0), 0))}`),\n\t\t\t\t);\n\t\t\tsections.push(lines.join(\"\\n\"));\n\t\t}\n\t\tconst [first, ...rest] = result.content;\n\t\tconst content = first?.type === \"text\" && SCRIPT_HEADER.test(first.text) ? rest : result.content;\n\t\tconst output = options.isPartial ? \"\" : getTextOutput({ ...result, content }, context.showImages).trim();\n\t\tif (output) {\n\t\t\tconst lines = replaceTabs(output).split(\"\\n\");\n\t\t\tconst shown = options.expanded ? lines : lines.slice(0, 5);\n\t\t\tlet text = shown.map((line) => theme.fg(context.isError ? \"error\" : \"toolOutput\", line)).join(\"\\n\");\n\t\t\tif (shown.length < lines.length) text += `\\n${hint(theme, lines.length - shown.length, \"lines\")}`;\n\t\t\tif (result.details?.fullOutputPath && !options.expanded)\n\t\t\t\ttext += `\\n${theme.fg(\"muted\", `Full output: ${result.details.fullOutputPath}`)}`;\n\t\t\tsections.push(text);\n\t\t}\n\t\tconst component = (context.lastComponent as Text | undefined) ?? new Text(\"\", 0, 0);\n\t\tcomponent.setText(sections.length ? `\\n${sections.join(\"\\n\\n\")}` : \"\");\n\t\treturn component;\n\t},\n};\n"]}
@@ -0,0 +1,51 @@
1
+ import type { AgentTool } from "@earendil-works/pi-agent-core";
2
+ import type { CodemodeTool } from "@earendil-works/pi-codemode";
3
+ import { type Static, Type } from "typebox";
4
+ import type { ToolDefinition, ToolInfo, ToolNamespace } from "../../core/extensions/types.ts";
5
+ import type { ModelRegistry } from "../../core/model-registry.ts";
6
+ import type { CodemodeMode } from "../../core/settings-manager.ts";
7
+ export declare const CODEMODE_TOOL_NAME = "codemode";
8
+ export declare const CODEMODE_STORE_ENTRY_TYPE = "codemode-store";
9
+ export declare const DEFAULT_CODEMODE_INLINE_BUDGET = 3000;
10
+ export interface CodemodeStoreEntryData {
11
+ set: Record<string, unknown>;
12
+ delete: string[];
13
+ }
14
+ export type CodemodeModelRuntime = Pick<ModelRegistry, "getModelsOfType" | "getAvailableOfType" | "getModelOfType" | "classify">;
15
+ export interface CodemodeToolOptions {
16
+ getToolNamespace?: (name: string) => ToolNamespace | undefined;
17
+ models?: boolean;
18
+ appendEntry?: (type: string, data: CodemodeStoreEntryData) => void;
19
+ getMode?: () => CodemodeMode;
20
+ getInlineBudget?: () => number | undefined;
21
+ }
22
+ export declare const codemodeSchema: Type.TObject<{
23
+ code: Type.TString;
24
+ }>;
25
+ export type CodemodeToolInput = Static<typeof codemodeSchema>;
26
+ export declare function isCodemodeTool(tool: Pick<ToolInfo, "name" | "parameters">): boolean;
27
+ export interface CodemodeNestedCall {
28
+ id: string;
29
+ name: string;
30
+ args: string;
31
+ status: "running" | "ok" | "error" | "cancelled";
32
+ durationMs?: number;
33
+ error?: string;
34
+ cost?: number;
35
+ }
36
+ export interface CodemodeToolDetails {
37
+ calls: CodemodeNestedCall[];
38
+ fullOutputPath?: string;
39
+ }
40
+ export declare function toCodemodeDeclaration(tool: AgentTool): Omit<CodemodeTool, "execute">;
41
+ export declare function getCodemodeCallableTools(tools: readonly AgentTool[]): AgentTool[];
42
+ export interface CodemodeDescriptionOptions {
43
+ models?: boolean;
44
+ namespaces?: ReadonlyMap<string, ToolNamespace>;
45
+ deferred?: ReadonlySet<string>;
46
+ inlineBudget?: number;
47
+ }
48
+ export declare function createCodemodeDescription(tools: readonly AgentTool[], options?: CodemodeDescriptionOptions): string;
49
+ export declare function createCodemodeToolDefinition(options?: CodemodeToolOptions): ToolDefinition<typeof codemodeSchema, CodemodeToolDetails>;
50
+ export declare function createCodemodeTool(tools?: readonly AgentTool[], options?: CodemodeToolOptions): AgentTool<typeof codemodeSchema>;
51
+ //# sourceMappingURL=tool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/tool.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,134 @@
1
+ import { renderToolSample, toCodemodeIdentifier } from "@earendil-works/pi-codemode/declarations";
2
+ import { CODEMODE_SOURCE_GRAMMAR } from "@earendil-works/pi-codemode/source";
3
+ import { Type } from "typebox";
4
+ import { wrapToolDefinition } from "../../core/tools/tool-definition-wrapper.js";
5
+ import { codemodeRenderers } from "./renderer.js";
6
+ export const CODEMODE_TOOL_NAME = "codemode";
7
+ export const CODEMODE_STORE_ENTRY_TYPE = "codemode-store";
8
+ export const DEFAULT_CODEMODE_INLINE_BUDGET = 3000;
9
+ export const codemodeSchema = Type.Object({
10
+ code: Type.String({
11
+ description: 'Raw JavaScript source with top-level await and return. Optional first line // @options: {"max_output_tokens": 1000, "timeout_ms": 60000}',
12
+ }),
13
+ });
14
+ export function isCodemodeTool(tool) {
15
+ return tool.name === CODEMODE_TOOL_NAME && tool.parameters === codemodeSchema;
16
+ }
17
+ export function toCodemodeDeclaration(tool) {
18
+ return {
19
+ name: tool.name,
20
+ description: tool.description,
21
+ inputSchema: tool.parameters,
22
+ outputSchema: tool.outputSchema ?? { type: "string" },
23
+ };
24
+ }
25
+ export function getCodemodeCallableTools(tools) {
26
+ return tools.filter((tool) => tool.name !== CODEMODE_TOOL_NAME);
27
+ }
28
+ const INTRO = `Run JavaScript that composes tool calls in a fresh QuickJS worker sandbox.
29
+ Top-level await and return work. Use tools.name(args), or tools["raw-name"](args). Tool names normalize to JavaScript identifiers.
30
+ No Node, filesystem, network, timers, modules or credentials are available directly. Calls go through session validation and permission hooks. They have real side effects and are not undone after script failure.
31
+ Tools with output schemas resolve to structuredContent; others resolve to text. Failed or blocked calls throw. Scripts have a 256 MB memory limit.
32
+ Globals: ALL_TOOLS, text(value), image(base64DataUrlOrImageContent), exit(), console.log(...), store(key, value), load(key), searchTools(query, {limit?, namespace?}), describeTool(name).
33
+ Successful scripts persist store writes on the current session branch; failed scripts discard writes. Unawaited calls are cancelled when the script ends.
34
+ Optional first line: // @options: {"max_output_tokens": 1000, "timeout_ms": 60000}. Output defaults to 10000 tokens; there is no default deadline.`;
35
+ export function createCodemodeDescription(tools, options = {}) {
36
+ const groups = new Map();
37
+ for (const tool of getCodemodeCallableTools(tools)) {
38
+ const namespace = options.namespaces?.get(tool.name);
39
+ const key = namespace?.name ?? "";
40
+ let group = groups.get(key);
41
+ if (!group) {
42
+ group = { namespace, entries: [] };
43
+ groups.set(key, group);
44
+ }
45
+ const id = toCodemodeIdentifier(tool.name);
46
+ const section = `### \`${id}\`${id === tool.name ? "" : ` (\`${tool.name}\`)`}\n${renderToolSample(toCodemodeDeclaration(tool)).trim()}`;
47
+ group.entries.push({
48
+ name: tool.name,
49
+ section,
50
+ cost: Math.ceil(section.length / 4),
51
+ deferred: options.deferred?.has(tool.name) === true,
52
+ });
53
+ }
54
+ const ordered = [...groups.values()].sort((a, b) => a.namespace === undefined ? -1 : b.namespace === undefined ? 1 : a.namespace.name.localeCompare(b.namespace.name));
55
+ const shown = new Set();
56
+ let remaining = options.inlineBudget ?? Number.POSITIVE_INFINITY;
57
+ let queues = ordered
58
+ .map((group) => group.entries.filter((entry) => !entry.deferred).sort((a, b) => a.cost - b.cost))
59
+ .filter((queue) => queue.length);
60
+ while (queues.length)
61
+ queues = queues.filter((queue) => {
62
+ const next = queue[0];
63
+ if (next.cost > remaining)
64
+ return false;
65
+ remaining -= next.cost;
66
+ shown.add(next.name);
67
+ queue.shift();
68
+ return queue.length > 0;
69
+ });
70
+ const sections = [INTRO];
71
+ if (options.models)
72
+ sections.push("Model API: models.getModelsOfType(type, provider?), models.getAvailableOfType(type, provider?), models.getModelOfType(type, provider, id), models.classify(model, context). Types are chat, image, classifier. Catalog entries exclude headers; classifier calls resolve credentials on the host.");
73
+ const count = getCodemodeCallableTools(tools).length;
74
+ sections.push(shown.size === count
75
+ ? `Nested tools: COMPLETE list (${count} tools).`
76
+ : `Nested tools: PARTIAL - ${shown.size} of ${count} shown. Use searchTools(), describeTool(), or ALL_TOOLS for omitted/deferred tools.`);
77
+ for (const group of ordered) {
78
+ if (group.namespace)
79
+ sections.push(`## ${group.namespace.name} (${group.entries.length} tools)\n${group.namespace.description ?? ""}`);
80
+ for (const entry of group.entries)
81
+ if (shown.has(entry.name))
82
+ sections.push(entry.section);
83
+ }
84
+ return sections.join("\n\n");
85
+ }
86
+ function prepareLoadout(loadout, options) {
87
+ const only = options.getMode?.() === "only";
88
+ const callable = getCodemodeCallableTools(loadout.callable);
89
+ const descriptions = {};
90
+ if (!only)
91
+ for (const tool of loadout.declared)
92
+ if (callable.some((candidate) => candidate.name === tool.name))
93
+ descriptions[tool.name] = renderToolSample(toCodemodeDeclaration(tool));
94
+ const listed = only ? callable : callable.filter((tool) => loadout.getExposure(tool.name) !== "direct");
95
+ const namespaces = new Map(listed.flatMap((tool) => {
96
+ const namespace = loadout.getNamespace(tool.name);
97
+ return namespace ? [[tool.name, namespace]] : [];
98
+ }));
99
+ descriptions[CODEMODE_TOOL_NAME] = createCodemodeDescription(listed, {
100
+ models: options.models,
101
+ namespaces,
102
+ deferred: new Set(listed.filter((tool) => loadout.getExposure(tool.name) === "deferred").map((tool) => tool.name)),
103
+ inlineBudget: options.getInlineBudget?.() ?? DEFAULT_CODEMODE_INLINE_BUDGET,
104
+ });
105
+ return {
106
+ descriptions,
107
+ hiddenDeclarations: only
108
+ ? callable.filter((tool) => loadout.getExposure(tool.name) === "direct").map((tool) => tool.name)
109
+ : [],
110
+ };
111
+ }
112
+ export function createCodemodeToolDefinition(options = {}) {
113
+ return {
114
+ name: CODEMODE_TOOL_NAME,
115
+ label: CODEMODE_TOOL_NAME,
116
+ description: createCodemodeDescription([], options),
117
+ parameters: codemodeSchema,
118
+ exposure: "model-only",
119
+ concurrency: "exclusive",
120
+ defaultActive: false,
121
+ promptSnippet: "Run JavaScript that calls other tools, filters results, or batches independent calls",
122
+ prepareLoadout: (loadout) => prepareLoadout(loadout, options),
123
+ constrainedSampling: { type: "grammar", variants: { openai_lark: CODEMODE_SOURCE_GRAMMAR } },
124
+ execute: async (id, input, signal, update, ctx) => (await import("./execute.js")).executeCodemode(id, input, signal, update, ctx, options),
125
+ ...codemodeRenderers,
126
+ };
127
+ }
128
+ export function createCodemodeTool(tools = [], options = {}) {
129
+ return {
130
+ ...wrapToolDefinition(createCodemodeToolDefinition(options)),
131
+ description: createCodemodeDescription(tools, options),
132
+ };
133
+ }
134
+ //# sourceMappingURL=tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/extensions/codemode/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { CodemodeJsonSchema, CodemodeTool } from \"@earendil-works/pi-codemode\";\nimport { renderToolSample, toCodemodeIdentifier } from \"@earendil-works/pi-codemode/declarations\";\nimport { CODEMODE_SOURCE_GRAMMAR } from \"@earendil-works/pi-codemode/source\";\nimport { type Static, Type } from \"typebox\";\nimport type { ToolDefinition, ToolInfo, ToolLoadout, ToolNamespace } from \"../../core/extensions/types.ts\";\nimport type { ModelRegistry } from \"../../core/model-registry.ts\";\nimport type { CodemodeMode } from \"../../core/settings-manager.ts\";\nimport { wrapToolDefinition } from \"../../core/tools/tool-definition-wrapper.ts\";\nimport { codemodeRenderers } from \"./renderer.js\";\n\nexport const CODEMODE_TOOL_NAME = \"codemode\";\nexport const CODEMODE_STORE_ENTRY_TYPE = \"codemode-store\";\nexport const DEFAULT_CODEMODE_INLINE_BUDGET = 3000;\nexport interface CodemodeStoreEntryData {\n\tset: Record<string, unknown>;\n\tdelete: string[];\n}\nexport type CodemodeModelRuntime = Pick<\n\tModelRegistry,\n\t\"getModelsOfType\" | \"getAvailableOfType\" | \"getModelOfType\" | \"classify\"\n>;\nexport interface CodemodeToolOptions {\n\tgetToolNamespace?: (name: string) => ToolNamespace | undefined;\n\tmodels?: boolean;\n\tappendEntry?: (type: string, data: CodemodeStoreEntryData) => void;\n\tgetMode?: () => CodemodeMode;\n\tgetInlineBudget?: () => number | undefined;\n}\nexport const codemodeSchema = Type.Object({\n\tcode: Type.String({\n\t\tdescription:\n\t\t\t'Raw JavaScript source with top-level await and return. Optional first line // @options: {\"max_output_tokens\": 1000, \"timeout_ms\": 60000}',\n\t}),\n});\nexport type CodemodeToolInput = Static<typeof codemodeSchema>;\nexport function isCodemodeTool(tool: Pick<ToolInfo, \"name\" | \"parameters\">): boolean {\n\treturn tool.name === CODEMODE_TOOL_NAME && tool.parameters === codemodeSchema;\n}\nexport interface CodemodeNestedCall {\n\tid: string;\n\tname: string;\n\targs: string;\n\tstatus: \"running\" | \"ok\" | \"error\" | \"cancelled\";\n\tdurationMs?: number;\n\terror?: string;\n\tcost?: number;\n}\nexport interface CodemodeToolDetails {\n\tcalls: CodemodeNestedCall[];\n\tfullOutputPath?: string;\n}\nexport function toCodemodeDeclaration(tool: AgentTool): Omit<CodemodeTool, \"execute\"> {\n\treturn {\n\t\tname: tool.name,\n\t\tdescription: tool.description,\n\t\tinputSchema: tool.parameters as CodemodeJsonSchema,\n\t\toutputSchema: (tool.outputSchema as CodemodeJsonSchema | undefined) ?? { type: \"string\" },\n\t};\n}\nexport function getCodemodeCallableTools(tools: readonly AgentTool[]): AgentTool[] {\n\treturn tools.filter((tool) => tool.name !== CODEMODE_TOOL_NAME);\n}\nexport interface CodemodeDescriptionOptions {\n\tmodels?: boolean;\n\tnamespaces?: ReadonlyMap<string, ToolNamespace>;\n\tdeferred?: ReadonlySet<string>;\n\tinlineBudget?: number;\n}\nconst INTRO = `Run JavaScript that composes tool calls in a fresh QuickJS worker sandbox.\nTop-level await and return work. Use tools.name(args), or tools[\"raw-name\"](args). Tool names normalize to JavaScript identifiers.\nNo Node, filesystem, network, timers, modules or credentials are available directly. Calls go through session validation and permission hooks. They have real side effects and are not undone after script failure.\nTools with output schemas resolve to structuredContent; others resolve to text. Failed or blocked calls throw. Scripts have a 256 MB memory limit.\nGlobals: ALL_TOOLS, text(value), image(base64DataUrlOrImageContent), exit(), console.log(...), store(key, value), load(key), searchTools(query, {limit?, namespace?}), describeTool(name).\nSuccessful scripts persist store writes on the current session branch; failed scripts discard writes. Unawaited calls are cancelled when the script ends.\nOptional first line: // @options: {\"max_output_tokens\": 1000, \"timeout_ms\": 60000}. Output defaults to 10000 tokens; there is no default deadline.`;\n\nexport function createCodemodeDescription(\n\ttools: readonly AgentTool[],\n\toptions: CodemodeDescriptionOptions = {},\n): string {\n\tconst groups = new Map<\n\t\tstring,\n\t\t{ namespace?: ToolNamespace; entries: { name: string; section: string; cost: number; deferred: boolean }[] }\n\t>();\n\tfor (const tool of getCodemodeCallableTools(tools)) {\n\t\tconst namespace = options.namespaces?.get(tool.name);\n\t\tconst key = namespace?.name ?? \"\";\n\t\tlet group = groups.get(key);\n\t\tif (!group) {\n\t\t\tgroup = { namespace, entries: [] };\n\t\t\tgroups.set(key, group);\n\t\t}\n\t\tconst id = toCodemodeIdentifier(tool.name);\n\t\tconst section = `### \\`${id}\\`${id === tool.name ? \"\" : ` (\\`${tool.name}\\`)`}\\n${renderToolSample(toCodemodeDeclaration(tool)).trim()}`;\n\t\tgroup.entries.push({\n\t\t\tname: tool.name,\n\t\t\tsection,\n\t\t\tcost: Math.ceil(section.length / 4),\n\t\t\tdeferred: options.deferred?.has(tool.name) === true,\n\t\t});\n\t}\n\tconst ordered = [...groups.values()].sort((a, b) =>\n\t\ta.namespace === undefined ? -1 : b.namespace === undefined ? 1 : a.namespace.name.localeCompare(b.namespace.name),\n\t);\n\tconst shown = new Set<string>();\n\tlet remaining = options.inlineBudget ?? Number.POSITIVE_INFINITY;\n\tlet queues = ordered\n\t\t.map((group) => group.entries.filter((entry) => !entry.deferred).sort((a, b) => a.cost - b.cost))\n\t\t.filter((queue) => queue.length);\n\twhile (queues.length)\n\t\tqueues = queues.filter((queue) => {\n\t\t\tconst next = queue[0];\n\t\t\tif (next.cost > remaining) return false;\n\t\t\tremaining -= next.cost;\n\t\t\tshown.add(next.name);\n\t\t\tqueue.shift();\n\t\t\treturn queue.length > 0;\n\t\t});\n\tconst sections = [INTRO];\n\tif (options.models)\n\t\tsections.push(\n\t\t\t\"Model API: models.getModelsOfType(type, provider?), models.getAvailableOfType(type, provider?), models.getModelOfType(type, provider, id), models.classify(model, context). Types are chat, image, classifier. Catalog entries exclude headers; classifier calls resolve credentials on the host.\",\n\t\t);\n\tconst count = getCodemodeCallableTools(tools).length;\n\tsections.push(\n\t\tshown.size === count\n\t\t\t? `Nested tools: COMPLETE list (${count} tools).`\n\t\t\t: `Nested tools: PARTIAL - ${shown.size} of ${count} shown. Use searchTools(), describeTool(), or ALL_TOOLS for omitted/deferred tools.`,\n\t);\n\tfor (const group of ordered) {\n\t\tif (group.namespace)\n\t\t\tsections.push(\n\t\t\t\t`## ${group.namespace.name} (${group.entries.length} tools)\\n${group.namespace.description ?? \"\"}`,\n\t\t\t);\n\t\tfor (const entry of group.entries) if (shown.has(entry.name)) sections.push(entry.section);\n\t}\n\treturn sections.join(\"\\n\\n\");\n}\nfunction prepareLoadout(loadout: ToolLoadout, options: CodemodeToolOptions) {\n\tconst only = options.getMode?.() === \"only\";\n\tconst callable = getCodemodeCallableTools(loadout.callable);\n\tconst descriptions: Record<string, string> = {};\n\tif (!only)\n\t\tfor (const tool of loadout.declared)\n\t\t\tif (callable.some((candidate) => candidate.name === tool.name))\n\t\t\t\tdescriptions[tool.name] = renderToolSample(toCodemodeDeclaration(tool));\n\tconst listed = only ? callable : callable.filter((tool) => loadout.getExposure(tool.name) !== \"direct\");\n\tconst namespaces = new Map(\n\t\tlisted.flatMap((tool) => {\n\t\t\tconst namespace = loadout.getNamespace(tool.name);\n\t\t\treturn namespace ? [[tool.name, namespace] as const] : [];\n\t\t}),\n\t);\n\tdescriptions[CODEMODE_TOOL_NAME] = createCodemodeDescription(listed, {\n\t\tmodels: options.models,\n\t\tnamespaces,\n\t\tdeferred: new Set(\n\t\t\tlisted.filter((tool) => loadout.getExposure(tool.name) === \"deferred\").map((tool) => tool.name),\n\t\t),\n\t\tinlineBudget: options.getInlineBudget?.() ?? DEFAULT_CODEMODE_INLINE_BUDGET,\n\t});\n\treturn {\n\t\tdescriptions,\n\t\thiddenDeclarations: only\n\t\t\t? callable.filter((tool) => loadout.getExposure(tool.name) === \"direct\").map((tool) => tool.name)\n\t\t\t: [],\n\t};\n}\nexport function createCodemodeToolDefinition(\n\toptions: CodemodeToolOptions = {},\n): ToolDefinition<typeof codemodeSchema, CodemodeToolDetails> {\n\treturn {\n\t\tname: CODEMODE_TOOL_NAME,\n\t\tlabel: CODEMODE_TOOL_NAME,\n\t\tdescription: createCodemodeDescription([], options),\n\t\tparameters: codemodeSchema,\n\t\texposure: \"model-only\",\n\t\tconcurrency: \"exclusive\",\n\t\tdefaultActive: false,\n\t\tpromptSnippet: \"Run JavaScript that calls other tools, filters results, or batches independent calls\",\n\t\tprepareLoadout: (loadout) => prepareLoadout(loadout, options),\n\t\tconstrainedSampling: { type: \"grammar\", variants: { openai_lark: CODEMODE_SOURCE_GRAMMAR } },\n\t\texecute: async (id, input, signal, update, ctx) =>\n\t\t\t(await import(\"./execute.js\")).executeCodemode(id, input, signal, update, ctx, options),\n\t\t...codemodeRenderers,\n\t};\n}\nexport function createCodemodeTool(\n\ttools: readonly AgentTool[] = [],\n\toptions: CodemodeToolOptions = {},\n): AgentTool<typeof codemodeSchema> {\n\treturn {\n\t\t...wrapToolDefinition(createCodemodeToolDefinition(options)),\n\t\tdescription: createCodemodeDescription(tools, options),\n\t};\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import "@earendil-works/pi-codemode/worker";
2
+ //# sourceMappingURL=worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/worker.ts"],"names":[],"mappings":"AAAA,OAAO,oCAAoC,CAAC"}
@@ -0,0 +1,2 @@
1
+ import "@earendil-works/pi-codemode/worker";
2
+ //# sourceMappingURL=worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker.js","sourceRoot":"","sources":["../../../src/extensions/codemode/worker.ts"],"names":[],"mappings":"AAAA,OAAO,oCAAoC,CAAC","sourcesContent":["import \"@earendil-works/pi-codemode/worker\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAInE,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAG9C,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAMnE,eAAO,MAAM,iBAAiB,EAAE,eAAe,EAK9C,CAAC"}
@@ -1,7 +1,11 @@
1
+ import codemodeExtension from "./codemode/index.js";
1
2
  import herdrExtension from "./herdr/index.js";
2
3
  import llamaExtension from "./llama/index.js";
4
+ import toolSearchExtension from "./tool-search/index.js";
3
5
  export const builtInExtensions = [
4
- { name: "llama.cpp", factory: llamaExtension, hidden: true, bundled: true },
6
+ { name: "llama.cpp", factory: llamaExtension, builtin: true, bundled: true },
7
+ { name: "codemode", factory: codemodeExtension, builtin: true, replaceable: true, bundled: true },
8
+ { name: "tool-search", factory: toolSearchExtension, builtin: true, replaceable: true, bundled: true },
5
9
  { name: "Herdr", factory: herdrExtension, hidden: true, bundled: true },
6
10
  ];
7
11
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AACA,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAE9C,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAC3E,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;CACvE,CAAC","sourcesContent":["import type { InlineExtension } from \"../core/extensions/types.ts\";\nimport herdrExtension from \"./herdr/index.js\";\nimport llamaExtension from \"./llama/index.js\";\n\nexport const builtInExtensions: InlineExtension[] = [\n\t{ name: \"llama.cpp\", factory: llamaExtension, hidden: true, bundled: true },\n\t{ name: \"Herdr\", factory: herdrExtension, hidden: true, bundled: true },\n];\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/extensions/index.ts"],"names":[],"mappings":"AACA,OAAO,iBAAiB,MAAM,qBAAqB,CAAC;AACpD,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,cAAc,MAAM,kBAAkB,CAAC;AAC9C,OAAO,mBAAmB,MAAM,wBAAwB,CAAC;AAEzD,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IACnD,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IAC5E,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACjG,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;IACtG,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE;CACvE,CAAC","sourcesContent":["import type { InlineExtension } from \"../core/extensions/types.ts\";\nimport codemodeExtension from \"./codemode/index.js\";\nimport herdrExtension from \"./herdr/index.js\";\nimport llamaExtension from \"./llama/index.js\";\nimport toolSearchExtension from \"./tool-search/index.js\";\n\nexport const builtInExtensions: InlineExtension[] = [\n\t{ name: \"llama.cpp\", factory: llamaExtension, builtin: true, bundled: true },\n\t{ name: \"codemode\", factory: codemodeExtension, builtin: true, replaceable: true, bundled: true },\n\t{ name: \"tool-search\", factory: toolSearchExtension, builtin: true, replaceable: true, bundled: true },\n\t{ name: \"Herdr\", factory: herdrExtension, hidden: true, bundled: true },\n];\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/extensions/llama/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAON,KAAK,QAAQ,EAGb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAEN,KAAK,cAAc,EAInB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAC7C,eAAO,MAAM,wBAAwB,0BAA0B,CAAC;AAiFhE,MAAM,WAAW,uBAAuB;IACvC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACzC,UAAU,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC/G;AAED,wBAAgB,mBAAmB,IAAI,uBAAuB,CAuH7D"}
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../../../src/extensions/llama/provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAON,KAAK,QAAQ,EAGb,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAEN,KAAK,cAAc,EAInB,MAAM,aAAa,CAAC;AAErB,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAC7C,eAAO,MAAM,wBAAwB,0BAA0B,CAAC;AAuGhE,MAAM,WAAW,uBAAuB;IACvC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,CAAC;IACzC,UAAU,CAAC,MAAM,EAAE,SAAS,cAAc,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,IAAI,CAAC;CAC/G;AAED,wBAAgB,mBAAmB,IAAI,uBAAuB,CAkI7D"}
@@ -27,12 +27,29 @@ async function routerAutoloadEnabled(client, catalog, signal) {
27
27
  return false;
28
28
  }
29
29
  }
30
- function contextWindowOf(model) {
31
- const reportedContextWindow = model.meta?.n_ctx ?? model.meta?.n_ctx_train;
32
- return reportedContextWindow && reportedContextWindow > 0 ? reportedContextWindow : 128000;
30
+ function configuredContextWindow(model) {
31
+ const args = model.status.args ?? [];
32
+ for (let index = 0; index < args.length - 1; index++) {
33
+ if (!["--ctx-size", "-c", "-ctx"].includes(args[index]))
34
+ continue;
35
+ const contextWindow = Number(args[index + 1]);
36
+ if (Number.isSafeInteger(contextWindow) && contextWindow > 0)
37
+ return contextWindow;
38
+ }
39
+ return undefined;
40
+ }
41
+ function contextWindowOf(model, cachedContextWindow) {
42
+ if (model.meta?.n_ctx && model.meta.n_ctx > 0)
43
+ return model.meta.n_ctx;
44
+ const configured = configuredContextWindow(model);
45
+ if (configured)
46
+ return configured;
47
+ if (cachedContextWindow && cachedContextWindow > 0)
48
+ return cachedContextWindow;
49
+ return model.meta?.n_ctx_train && model.meta.n_ctx_train > 0 ? model.meta.n_ctx_train : 128000;
33
50
  }
34
51
  /** The same llama.cpp model used as a classifier: answers are read from next-token label probabilities. */
35
- function toPiClassifierModel(model, serverUrl) {
52
+ function toPiClassifierModel(model, serverUrl, cachedContextWindow) {
36
53
  return {
37
54
  type: "classifier",
38
55
  id: model.id,
@@ -42,11 +59,11 @@ function toPiClassifierModel(model, serverUrl) {
42
59
  baseUrl: serverUrl,
43
60
  input: ["text"],
44
61
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
45
- contextWindow: contextWindowOf(model),
62
+ contextWindow: contextWindowOf(model, cachedContextWindow),
46
63
  };
47
64
  }
48
- function toPiModel(model, serverUrl, props) {
49
- const contextWindow = contextWindowOf(model);
65
+ function toPiModel(model, serverUrl, props, cachedContextWindow) {
66
+ const contextWindow = contextWindowOf(model, cachedContextWindow);
50
67
  const reasoning = props?.chat_template?.includes("enable_thinking") === true;
51
68
  return {
52
69
  id: model.id,
@@ -129,10 +146,13 @@ export function createLlamaProvider() {
129
146
  getModels: () => models,
130
147
  getAllModels: () => [...models, ...classifiers],
131
148
  refreshModels: async (context) => {
149
+ const cachedContextWindows = new Map();
132
150
  if (context.stored) {
133
151
  const stored = context.stored.models.filter((model) => model.provider === LLAMA_PROVIDER_ID);
134
152
  const restored = stored.filter((model) => isModelType(model, "chat") && model.api === "openai-completions");
135
153
  const restoredClassifiers = stored.filter((model) => isModelType(model, "classifier") && model.api === "llama-cpp-classify");
154
+ for (const model of [...restored, ...restoredClassifiers])
155
+ cachedContextWindows.set(model.id, model.contextWindow);
136
156
  if (!(await context.publish({
137
157
  update: () => {
138
158
  models = restored;
@@ -157,11 +177,12 @@ export function createLlamaProvider() {
157
177
  const selectable = catalog.filter((model) => modelIsSelectable(model, routerAutoload));
158
178
  const refreshed = await Promise.all(selectable.map(async (model) => {
159
179
  // Query only loaded models: sleeping and autoload presets must not be woken by discovery.
180
+ const cachedContextWindow = cachedContextWindows.get(model.id);
160
181
  if (model.status.value !== "loaded")
161
- return toPiModel(model, serverUrl);
162
- return toPiModel(model, serverUrl, await client.props({ model: model.id, signal: context.signal }));
182
+ return toPiModel(model, serverUrl, undefined, cachedContextWindow);
183
+ return toPiModel(model, serverUrl, await client.props({ model: model.id, signal: context.signal }), cachedContextWindow);
163
184
  }));
164
- const refreshedClassifiers = selectable.map((model) => toPiClassifierModel(model, serverUrl));
185
+ const refreshedClassifiers = selectable.map((model) => toPiClassifierModel(model, serverUrl, cachedContextWindows.get(model.id)));
165
186
  if (context.signal.aborted)
166
187
  return;
167
188
  await context.publish({