@bastani/atomic 0.9.28-alpha.3 → 0.9.28-alpha.5

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 (311) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/dist/builtin/intercom/CHANGELOG.md +6 -0
  3. package/dist/builtin/intercom/README.md +3 -2
  4. package/dist/builtin/intercom/broker/broker.ts +90 -14
  5. package/dist/builtin/intercom/broker/paths.ts +4 -0
  6. package/dist/builtin/intercom/broker/socket-liveness.ts +32 -0
  7. package/dist/builtin/intercom/broker/socket-replacement-lock.ts +104 -0
  8. package/dist/builtin/intercom/broker/spawn.ts +108 -63
  9. package/dist/builtin/intercom/index.bundle.mjs +114 -61
  10. package/dist/builtin/intercom/package.json +2 -2
  11. package/dist/builtin/mcp/package.json +1 -1
  12. package/dist/builtin/subagents/CHANGELOG.md +6 -0
  13. package/dist/builtin/subagents/package.json +3 -3
  14. package/dist/builtin/subagents/skills/agent-browser/SKILL.md +1 -1
  15. package/dist/builtin/subagents/skills/cua-driver/BROWSER.md +60 -39
  16. package/dist/builtin/subagents/skills/cua-driver/EMBEDDING.md +119 -36
  17. package/dist/builtin/subagents/skills/cua-driver/LINUX.md +225 -183
  18. package/dist/builtin/subagents/skills/cua-driver/MACOS.md +120 -89
  19. package/dist/builtin/subagents/skills/cua-driver/README.md +16 -7
  20. package/dist/builtin/subagents/skills/cua-driver/RECORDING.md +85 -115
  21. package/dist/builtin/subagents/skills/cua-driver/RUNTIME.md +113 -0
  22. package/dist/builtin/subagents/skills/cua-driver/SKILL.md +55 -1071
  23. package/dist/builtin/subagents/skills/cua-driver/VISUAL.md +125 -0
  24. package/dist/builtin/subagents/skills/cua-driver/WINDOWS.md +145 -185
  25. package/dist/builtin/subagents/skills/cua-driver/WORKFLOW.md +173 -0
  26. package/dist/builtin/web-access/package.json +2 -2
  27. package/dist/builtin/workflows/CHANGELOG.md +16 -0
  28. package/dist/builtin/workflows/README.md +1 -1
  29. package/dist/builtin/workflows/builtin/{chunk-aqv8ny38.js → chunk-9ywkdsa9.js} +1 -1
  30. package/dist/builtin/workflows/builtin/{chunk-p6jagvyf.js → chunk-bnz4knhy.js} +1 -1
  31. package/dist/builtin/workflows/builtin/{chunk-br4ac9a3.js → chunk-dx5sjaxe.js} +1 -1
  32. package/dist/builtin/workflows/builtin/{chunk-p3xmajmj.js → chunk-v4scsq3y.js} +41 -13
  33. package/dist/builtin/workflows/builtin/goal.js +2 -2
  34. package/dist/builtin/workflows/builtin/index.js +3 -3
  35. package/dist/builtin/workflows/builtin/ralph.js +2 -2
  36. package/dist/builtin/workflows/package.json +2 -2
  37. package/dist/builtin/workflows/skills/impeccable/SKILL.md +8 -2
  38. package/dist/builtin/workflows/skills/impeccable/reference/adapt.md +6 -0
  39. package/dist/builtin/workflows/skills/impeccable/reference/audit.md +2 -1
  40. package/dist/builtin/workflows/skills/impeccable/reference/component-review.md +63 -0
  41. package/dist/builtin/workflows/skills/impeccable/reference/degraded/asset-producer.md +5 -0
  42. package/dist/builtin/workflows/skills/impeccable/reference/degraded/finish-reviewer.md +1 -1
  43. package/dist/builtin/workflows/skills/impeccable/reference/generate.md +101 -0
  44. package/dist/builtin/workflows/skills/impeccable/reference/harden.md +9 -0
  45. package/dist/builtin/workflows/skills/impeccable/reference/hooks.md +3 -1
  46. package/dist/builtin/workflows/skills/impeccable/reference/mode-operate.md +21 -0
  47. package/dist/builtin/workflows/skills/impeccable/reference/mode-persuade.md +19 -0
  48. package/dist/builtin/workflows/skills/impeccable/reference/mode-read.md +21 -0
  49. package/dist/builtin/workflows/skills/impeccable/reference/new-work.md +19 -12
  50. package/dist/builtin/workflows/skills/impeccable/reference/region-map.md +26 -0
  51. package/dist/builtin/workflows/skills/impeccable/reference/routing.md +1 -1
  52. package/dist/builtin/workflows/skills/impeccable/reference/visualize.md +5 -5
  53. package/dist/builtin/workflows/skills/impeccable/scripts/VERSION +1 -1
  54. package/dist/builtin/workflows/skills/impeccable/scripts/command-metadata.json +4 -0
  55. package/dist/builtin/workflows/skills/impeccable/scripts/impeccable.cmd +2 -2
  56. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser-session.js +5 -1
  57. package/dist/builtin/workflows/skills/impeccable/scripts/live-browser.js +524 -4
  58. package/dist/builtin/workflows/skills/prompt-engineer/SKILL.md +1 -0
  59. package/dist/builtin/workflows/skills/prompt-engineer/references/claude_haiku_5_5.md +81 -0
  60. package/dist/builtin/workflows/src/extension/index.bundle.mjs +38 -14
  61. package/dist/builtin/workflows/src/index.js +38 -14
  62. package/dist/cli/startup-ui.d.ts +3 -2
  63. package/dist/cli/startup-ui.d.ts.map +1 -1
  64. package/dist/cli/startup-ui.js +19 -4
  65. package/dist/cli/startup-ui.js.map +1 -1
  66. package/dist/codemode-worker.js +2 -2
  67. package/dist/core/agent-session-compaction.d.ts +3 -3
  68. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  69. package/dist/core/agent-session-compaction.js +5 -1
  70. package/dist/core/agent-session-compaction.js.map +1 -1
  71. package/dist/core/agent-session-events.d.ts.map +1 -1
  72. package/dist/core/agent-session-events.js +1 -0
  73. package/dist/core/agent-session-events.js.map +1 -1
  74. package/dist/core/agent-session-extension-bindings.d.ts.map +1 -1
  75. package/dist/core/agent-session-extension-bindings.js +4 -0
  76. package/dist/core/agent-session-extension-bindings.js.map +1 -1
  77. package/dist/core/agent-session-methods.d.ts +6 -1
  78. package/dist/core/agent-session-methods.d.ts.map +1 -1
  79. package/dist/core/agent-session-methods.js.map +1 -1
  80. package/dist/core/agent-session-prompt.d.ts.map +1 -1
  81. package/dist/core/agent-session-prompt.js +3 -2
  82. package/dist/core/agent-session-prompt.js.map +1 -1
  83. package/dist/core/agent-session-runtime.d.ts +5 -1
  84. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  85. package/dist/core/agent-session-runtime.js +13 -9
  86. package/dist/core/agent-session-runtime.js.map +1 -1
  87. package/dist/core/agent-session-types.d.ts +1 -0
  88. package/dist/core/agent-session-types.d.ts.map +1 -1
  89. package/dist/core/agent-session-types.js.map +1 -1
  90. package/dist/core/agent-session.d.ts +1 -0
  91. package/dist/core/agent-session.d.ts.map +1 -1
  92. package/dist/core/agent-session.js.map +1 -1
  93. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  94. package/dist/core/export-html/tool-renderer.js +2 -0
  95. package/dist/core/export-html/tool-renderer.js.map +1 -1
  96. package/dist/core/extensions/agent-events.d.ts +2 -0
  97. package/dist/core/extensions/agent-events.d.ts.map +1 -1
  98. package/dist/core/extensions/agent-events.js.map +1 -1
  99. package/dist/core/extensions/context-types.d.ts +2 -0
  100. package/dist/core/extensions/context-types.d.ts.map +1 -1
  101. package/dist/core/extensions/context-types.js.map +1 -1
  102. package/dist/core/extensions/mcp-server-registry.d.ts +4 -1
  103. package/dist/core/extensions/mcp-server-registry.d.ts.map +1 -1
  104. package/dist/core/extensions/mcp-server-registry.js +7 -4
  105. package/dist/core/extensions/mcp-server-registry.js.map +1 -1
  106. package/dist/core/extensions/runner.d.ts +3 -0
  107. package/dist/core/extensions/runner.d.ts.map +1 -1
  108. package/dist/core/extensions/runner.js +19 -0
  109. package/dist/core/extensions/runner.js.map +1 -1
  110. package/dist/core/extensions/session-events.d.ts +2 -0
  111. package/dist/core/extensions/session-events.d.ts.map +1 -1
  112. package/dist/core/extensions/session-events.js.map +1 -1
  113. package/dist/core/extensions/tool-types.d.ts +2 -0
  114. package/dist/core/extensions/tool-types.d.ts.map +1 -1
  115. package/dist/core/extensions/tool-types.js.map +1 -1
  116. package/dist/core/fast-model-variants.d.ts.map +1 -1
  117. package/dist/core/fast-model-variants.js +3 -2
  118. package/dist/core/fast-model-variants.js.map +1 -1
  119. package/dist/core/model-resolver-defaults.d.ts.map +1 -1
  120. package/dist/core/model-resolver-defaults.js +2 -0
  121. package/dist/core/model-resolver-defaults.js.map +1 -1
  122. package/dist/core/nested-tool-calls.d.ts +1 -0
  123. package/dist/core/nested-tool-calls.d.ts.map +1 -1
  124. package/dist/core/nested-tool-calls.js +1 -0
  125. package/dist/core/nested-tool-calls.js.map +1 -1
  126. package/dist/core/provider-alias.d.ts.map +1 -1
  127. package/dist/core/provider-alias.js +8 -0
  128. package/dist/core/provider-alias.js.map +1 -1
  129. package/dist/core/provider-composer-internal.d.ts.map +1 -1
  130. package/dist/core/provider-composer-internal.js +6 -3
  131. package/dist/core/provider-composer-internal.js.map +1 -1
  132. package/dist/core/resource-loader-reload.d.ts.map +1 -1
  133. package/dist/core/resource-loader-reload.js +1 -0
  134. package/dist/core/resource-loader-reload.js.map +1 -1
  135. package/dist/core/resource-loader-types.d.ts +1 -0
  136. package/dist/core/resource-loader-types.d.ts.map +1 -1
  137. package/dist/core/resource-loader-types.js.map +1 -1
  138. package/dist/core/settings-types.js.map +1 -1
  139. package/dist/core/tools/bash.d.ts.map +1 -1
  140. package/dist/core/tools/bash.js +7 -3
  141. package/dist/core/tools/bash.js.map +1 -1
  142. package/dist/core/tools/edit.js +1 -1
  143. package/dist/core/tools/edit.js.map +1 -1
  144. package/dist/extensions/codemode/execute.d.ts.map +1 -1
  145. package/dist/extensions/codemode/execute.js +55 -7
  146. package/dist/extensions/codemode/execute.js.map +1 -1
  147. package/dist/extensions/codemode/index.d.ts.map +1 -1
  148. package/dist/extensions/codemode/index.js +7 -0
  149. package/dist/extensions/codemode/index.js.map +1 -1
  150. package/dist/extensions/codemode/tool.d.ts +2 -0
  151. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  152. package/dist/extensions/codemode/tool.js +2 -0
  153. package/dist/extensions/codemode/tool.js.map +1 -1
  154. package/dist/extensions/herdr/index.d.ts.map +1 -1
  155. package/dist/extensions/herdr/index.js +20 -2
  156. package/dist/extensions/herdr/index.js.map +1 -1
  157. package/dist/extensions/herdr/pane-owner.d.ts +7 -0
  158. package/dist/extensions/herdr/pane-owner.d.ts.map +1 -1
  159. package/dist/extensions/herdr/pane-owner.js +53 -11
  160. package/dist/extensions/herdr/pane-owner.js.map +1 -1
  161. package/dist/index.d.ts +1 -1
  162. package/dist/index.d.ts.map +1 -1
  163. package/dist/index.js.map +1 -1
  164. package/dist/main-deferred-startup.d.ts +8 -0
  165. package/dist/main-deferred-startup.d.ts.map +1 -1
  166. package/dist/main-deferred-startup.js +6 -0
  167. package/dist/main-deferred-startup.js.map +1 -1
  168. package/dist/main.d.ts.map +1 -1
  169. package/dist/main.js +11 -3
  170. package/dist/main.js.map +1 -1
  171. package/dist/modes/interactive/components/bash-execution.d.ts +5 -1
  172. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  173. package/dist/modes/interactive/components/bash-execution.js +17 -14
  174. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  175. package/dist/modes/interactive/components/branch-summary-message.d.ts +2 -1
  176. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  177. package/dist/modes/interactive/components/branch-summary-message.js +5 -2
  178. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  179. package/dist/modes/interactive/components/chat-message-renderer.d.ts +1 -0
  180. package/dist/modes/interactive/components/chat-message-renderer.d.ts.map +1 -1
  181. package/dist/modes/interactive/components/chat-message-renderer.js +19 -8
  182. package/dist/modes/interactive/components/chat-message-renderer.js.map +1 -1
  183. package/dist/modes/interactive/components/compaction-boundary-message.d.ts +3 -2
  184. package/dist/modes/interactive/components/compaction-boundary-message.d.ts.map +1 -1
  185. package/dist/modes/interactive/components/compaction-boundary-message.js +7 -4
  186. package/dist/modes/interactive/components/compaction-boundary-message.js.map +1 -1
  187. package/dist/modes/interactive/components/custom-entry.d.ts +3 -1
  188. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  189. package/dist/modes/interactive/components/custom-entry.js +8 -2
  190. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  191. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  192. package/dist/modes/interactive/components/custom-message.js +1 -0
  193. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  194. package/dist/modes/interactive/components/settings-selector-items.js +1 -1
  195. package/dist/modes/interactive/components/settings-selector-items.js.map +1 -1
  196. package/dist/modes/interactive/components/skill-invocation-message.d.ts +2 -1
  197. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  198. package/dist/modes/interactive/components/skill-invocation-message.js +5 -2
  199. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  200. package/dist/modes/interactive/components/tool-execution.d.ts +4 -0
  201. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  202. package/dist/modes/interactive/components/tool-execution.js +10 -0
  203. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  204. package/dist/modes/interactive/interactive-agent-events.js +3 -1
  205. package/dist/modes/interactive/interactive-agent-events.js.map +1 -1
  206. package/dist/modes/interactive/interactive-auth-login.js +6 -0
  207. package/dist/modes/interactive/interactive-auth-login.js.map +1 -1
  208. package/dist/modes/interactive/interactive-auth-routing.js +2 -2
  209. package/dist/modes/interactive/interactive-auth-routing.js.map +1 -1
  210. package/dist/modes/interactive/interactive-bash-compact.js +2 -2
  211. package/dist/modes/interactive/interactive-bash-compact.js.map +1 -1
  212. package/dist/modes/interactive/interactive-extension-dialogs.js +19 -2
  213. package/dist/modes/interactive/interactive-extension-dialogs.js.map +1 -1
  214. package/dist/modes/interactive/interactive-mode-base.d.ts +4 -0
  215. package/dist/modes/interactive/interactive-mode-base.d.ts.map +1 -1
  216. package/dist/modes/interactive/interactive-mode-base.js +7 -0
  217. package/dist/modes/interactive/interactive-mode-base.js.map +1 -1
  218. package/dist/modes/interactive/interactive-mode-helpers.js +1 -1
  219. package/dist/modes/interactive/interactive-mode-helpers.js.map +1 -1
  220. package/dist/modes/interactive/interactive-mode-surface.d.ts +2 -1
  221. package/dist/modes/interactive/interactive-mode-surface.d.ts.map +1 -1
  222. package/dist/modes/interactive/interactive-mode-surface.js.map +1 -1
  223. package/dist/modes/interactive/interactive-mode-types.d.ts +1 -0
  224. package/dist/modes/interactive/interactive-mode-types.d.ts.map +1 -1
  225. package/dist/modes/interactive/interactive-mode-types.js.map +1 -1
  226. package/dist/modes/interactive/interactive-process-lifecycle.js +1 -1
  227. package/dist/modes/interactive/interactive-process-lifecycle.js.map +1 -1
  228. package/dist/modes/interactive/interactive-render-chat.js +7 -5
  229. package/dist/modes/interactive/interactive-render-chat.js.map +1 -1
  230. package/dist/modes/interactive/interactive-selectors.js +8 -1
  231. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  232. package/dist/modes/interactive/interactive-session-runtime.js +1 -0
  233. package/dist/modes/interactive/interactive-session-runtime.js.map +1 -1
  234. package/dist/modes/interactive/interactive-startup-trust.d.ts +6 -0
  235. package/dist/modes/interactive/interactive-startup-trust.d.ts.map +1 -0
  236. package/dist/modes/interactive/interactive-startup-trust.js +15 -0
  237. package/dist/modes/interactive/interactive-startup-trust.js.map +1 -0
  238. package/dist/modes/interactive/interactive-startup.d.ts.map +1 -1
  239. package/dist/modes/interactive/interactive-startup.js +4 -0
  240. package/dist/modes/interactive/interactive-startup.js.map +1 -1
  241. package/dist/modes/interactive/program-status-reporter.d.ts +24 -0
  242. package/dist/modes/interactive/program-status-reporter.d.ts.map +1 -0
  243. package/dist/modes/interactive/program-status-reporter.js +96 -0
  244. package/dist/modes/interactive/program-status-reporter.js.map +1 -0
  245. package/dist/modes/interactive-engine/engine-child-liveness.d.ts +1 -0
  246. package/dist/modes/interactive-engine/engine-child-liveness.d.ts.map +1 -1
  247. package/dist/modes/interactive-engine/engine-child-liveness.js +15 -1
  248. package/dist/modes/interactive-engine/engine-child-liveness.js.map +1 -1
  249. package/dist/modes/interactive-engine/engine-custom-ui.d.ts.map +1 -1
  250. package/dist/modes/interactive-engine/engine-custom-ui.js +1 -0
  251. package/dist/modes/interactive-engine/engine-custom-ui.js.map +1 -1
  252. package/dist/modes/interactive-engine/engine-monitor.d.ts +4 -0
  253. package/dist/modes/interactive-engine/engine-monitor.d.ts.map +1 -1
  254. package/dist/modes/interactive-engine/engine-monitor.js +17 -0
  255. package/dist/modes/interactive-engine/engine-monitor.js.map +1 -1
  256. package/dist/modes/interactive-engine/engine-quit-intent.d.ts +16 -0
  257. package/dist/modes/interactive-engine/engine-quit-intent.d.ts.map +1 -0
  258. package/dist/modes/interactive-engine/engine-quit-intent.js +27 -0
  259. package/dist/modes/interactive-engine/engine-quit-intent.js.map +1 -0
  260. package/dist/modes/interactive-engine/engine-render-service.d.ts.map +1 -1
  261. package/dist/modes/interactive-engine/engine-render-service.js +3 -1
  262. package/dist/modes/interactive-engine/engine-render-service.js.map +1 -1
  263. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts +1 -0
  264. package/dist/modes/interactive-engine/extension-ui-bridge.d.ts.map +1 -1
  265. package/dist/modes/interactive-engine/extension-ui-bridge.js +5 -0
  266. package/dist/modes/interactive-engine/extension-ui-bridge.js.map +1 -1
  267. package/dist/modes/interactive-engine/isolated-runtime.d.ts +4 -1
  268. package/dist/modes/interactive-engine/isolated-runtime.d.ts.map +1 -1
  269. package/dist/modes/interactive-engine/isolated-runtime.js +19 -2
  270. package/dist/modes/interactive-engine/isolated-runtime.js.map +1 -1
  271. package/dist/modes/interactive-engine/protocol.d.ts +19 -1
  272. package/dist/modes/interactive-engine/protocol.d.ts.map +1 -1
  273. package/dist/modes/interactive-engine/protocol.js +7 -0
  274. package/dist/modes/interactive-engine/protocol.js.map +1 -1
  275. package/dist/modes/interactive-engine/remote-renderer.d.ts +3 -0
  276. package/dist/modes/interactive-engine/remote-renderer.d.ts.map +1 -1
  277. package/dist/modes/interactive-engine/remote-renderer.js +7 -0
  278. package/dist/modes/interactive-engine/remote-renderer.js.map +1 -1
  279. package/dist/modes/rpc/rpc-client.d.ts +11 -0
  280. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  281. package/dist/modes/rpc/rpc-client.js +42 -0
  282. package/dist/modes/rpc/rpc-client.js.map +1 -1
  283. package/dist/modes/rpc/rpc-input-scheduler.js +2 -2
  284. package/dist/modes/rpc/rpc-input-scheduler.js.map +1 -1
  285. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  286. package/dist/modes/rpc/rpc-mode.js +23 -6
  287. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  288. package/dist/modes/rpc/rpc-provider-auth.js +1 -1
  289. package/dist/modes/rpc/rpc-provider-auth.js.map +1 -1
  290. package/docs/codemode.md +10 -6
  291. package/docs/compaction.md +1 -1
  292. package/docs/computer-use.md +9 -9
  293. package/docs/custom-provider/streaming.md +4 -0
  294. package/docs/environment-variables.md +2 -0
  295. package/docs/extensions/api-reference.md +1 -1
  296. package/docs/extensions/authoring.md +2 -0
  297. package/docs/extensions/events.md +8 -1
  298. package/docs/getting-started/first-session.md +1 -1
  299. package/docs/herdr.md +11 -2
  300. package/docs/json.md +6 -1
  301. package/docs/models/evals.md +34 -3
  302. package/docs/models.md +1 -1
  303. package/docs/providers.md +10 -0
  304. package/docs/sdk.md +8 -2
  305. package/docs/settings.md +2 -2
  306. package/docs/skills.md +1 -1
  307. package/docs/terminal-setup.md +14 -0
  308. package/docs/workflows/authoring.md +3 -3
  309. package/examples/extensions/sandbox/package-lock.json +3 -3
  310. package/npm-shrinkwrap.json +67 -67
  311. package/package.json +8 -8
@@ -4,7 +4,7 @@ import { formatSize } from "../../core/tools/truncate.js";
4
4
  import { combineUsage } from "../../core/usage-totals.js";
5
5
  import { writeOutputFile } from "../../utils/output-files.js";
6
6
  import { Bm25Ranker, createToolSearchDocument, DEFAULT_TOOL_SEARCH_LIMIT } from "../tool-search/tool.js";
7
- import { CODEMODE_DOCS_PATH, CODEMODE_STORE_ENTRY_TYPE, getCodemodeCallableTools, toCodemodeDeclaration, } from "./tool.js";
7
+ import { CODEMODE_DOCS_PATH, CODEMODE_STORE_ENTRY_TYPE, CODEMODE_TOOL_NAME, getCodemodeCallableTools, toCodemodeDeclaration, } from "./tool.js";
8
8
  const IMAGE_EXTENSIONS = {
9
9
  "image/png": ".png",
10
10
  "image/jpeg": ".jpg",
@@ -81,6 +81,40 @@ export function toCodemodeModelInfo(model) {
81
81
  cost: model.cost,
82
82
  };
83
83
  }
84
+ /** Separate text items and collect console calls after the script's other output. */
85
+ function formatOutput(output) {
86
+ const total = output.filter((item) => item.type === "text" && !item.console).length;
87
+ const items = [];
88
+ const consoleLines = [];
89
+ let index = 0;
90
+ for (const item of output) {
91
+ if (item.type === "image")
92
+ items.push(item);
93
+ else if (item.console)
94
+ consoleLines.push(item.text);
95
+ else {
96
+ index++;
97
+ items.push({ type: "text", text: total > 1 ? `==> text ${index}/${total} <==\n${item.text}` : item.text });
98
+ }
99
+ }
100
+ if (consoleLines.length > 0)
101
+ items.push({ type: "text", text: `<console_output>\n${consoleLines.join("\n")}\n</console_output>` });
102
+ return items;
103
+ }
104
+ /** Providers may concatenate adjacent text blocks without a separator. */
105
+ function joinAdjacentText(items) {
106
+ const joined = [];
107
+ for (const item of items) {
108
+ const last = joined.at(-1);
109
+ if (item.type === "text" && last?.type === "text") {
110
+ const separator = last.text === "" || last.text.endsWith("\n") ? "" : "\n";
111
+ joined[joined.length - 1] = { type: "text", text: `${last.text}${separator}${item.text}` };
112
+ }
113
+ else
114
+ joined.push(item);
115
+ }
116
+ return joined;
117
+ }
84
118
  const MODEL_TYPES = ["chat", "image", "classifier"];
85
119
  function modelType(value) {
86
120
  if (value === "chat" || value === "image" || value === "classifier")
@@ -207,6 +241,16 @@ function createLimiter(limit) {
207
241
  }
208
242
  function discoveryGlobals(tools, samples, options) {
209
243
  const entry = (name) => ({ name: toCodemodeIdentifier(name), description: samples.get(name) ?? "" });
244
+ const modelOnly = (query) => {
245
+ const wanted = query.trim().toLowerCase();
246
+ const name = options
247
+ .getModelOnlyTools?.()
248
+ .find((name) => name !== CODEMODE_TOOL_NAME &&
249
+ [name, toCodemodeIdentifier(name)].some((candidate) => candidate.toLowerCase() === wanted));
250
+ return name
251
+ ? { name, description: `\`${name}\` is model-only: call it directly, not from a script.` }
252
+ : undefined;
253
+ };
210
254
  return [
211
255
  {
212
256
  name: "searchTools",
@@ -226,7 +270,9 @@ function discoveryGlobals(tools, samples, options) {
226
270
  ? []
227
271
  : [createToolSearchDocument(tool, namespace)];
228
272
  });
229
- return new Bm25Ranker().rank(query, docs, limit).map((match) => entry(match.name));
273
+ const hint = config?.namespace ? undefined : modelOnly(query);
274
+ const matches = new Bm25Ranker().rank(query, docs, limit).map((match) => entry(match.name));
275
+ return hint ? [hint, ...matches].slice(0, limit) : matches;
230
276
  },
231
277
  },
232
278
  {
@@ -237,7 +283,7 @@ function discoveryGlobals(tools, samples, options) {
237
283
  if (typeof name !== "string")
238
284
  throw new Error("describeTool() expects a tool name");
239
285
  const tool = tools.find((tool) => tool.name === name || toCodemodeIdentifier(tool.name) === name);
240
- return tool ? samples.get(tool.name) : undefined;
286
+ return tool ? samples.get(tool.name) : modelOnly(name)?.description;
241
287
  },
242
288
  },
243
289
  {
@@ -424,17 +470,18 @@ export async function executeCodemode(id, input, signal, update, ctx, options =
424
470
  for (const call of calls)
425
471
  if (call.status === "running")
426
472
  call.status = "cancelled";
427
- let content = [...result.output];
473
+ const scriptOutput = [...result.output];
428
474
  if (result.ok) {
429
475
  if (Object.keys(result.storeWrites.set).length || result.storeWrites.delete.length)
430
476
  options.appendEntry?.(CODEMODE_STORE_ENTRY_TYPE, result.storeWrites);
431
477
  if (result.value !== undefined)
432
- content.push({
478
+ scriptOutput.push({
433
479
  type: "text",
434
480
  text: typeof result.value === "string" ? result.value : (JSON.stringify(result.value) ?? String(result.value)),
435
481
  });
436
482
  }
437
- else
483
+ let content = formatOutput(scriptOutput);
484
+ if (!result.ok)
438
485
  content.push({
439
486
  type: "text",
440
487
  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"}`,
@@ -444,6 +491,7 @@ export async function executeCodemode(id, input, signal, update, ctx, options =
444
491
  type: "text",
445
492
  text: `Note: models.generateImages() returned ${generatedImages} image${generatedImages === 1 ? "" : "s"} that the script did not show. Show each image block of result.output with image(block).`,
446
493
  });
494
+ content = joinAdjacentText(content);
447
495
  const text = content
448
496
  .filter((block) => block.type === "text")
449
497
  .map((block) => block.text)
@@ -472,7 +520,7 @@ export async function executeCodemode(id, input, signal, update, ctx, options =
472
520
  ];
473
521
  }
474
522
  // Save after truncation so labels cannot be cut or separated from their images.
475
- content = await saveImages(content);
523
+ content = joinAdjacentText(await saveImages(content));
476
524
  return {
477
525
  content: [
478
526
  {
@@ -1 +1 @@
1
- {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/codemode/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tAnyModel,\n\tClassifierContext,\n\tImageContent,\n\tImagesContext,\n\tModelType,\n\tModelTypeMap,\n\tTextContent,\n\tUsage,\n} 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 { ToolNamespace } from \"../../core/extensions/tool-types.ts\";\nimport type { SessionEntry } from \"../../core/session-manager.ts\";\nimport { formatSize } from \"../../core/tools/truncate.ts\";\nimport { combineUsage } from \"../../core/usage-totals.ts\";\nimport { writeOutputFile } from \"../../utils/output-files.js\";\nimport { Bm25Ranker, createToolSearchDocument, DEFAULT_TOOL_SEARCH_LIMIT } from \"../tool-search/tool.js\";\nimport {\n\tCODEMODE_DOCS_PATH,\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\nconst IMAGE_EXTENSIONS: Record<string, string> = {\n\t\"image/png\": \".png\",\n\t\"image/jpeg\": \".jpg\",\n\t\"image/gif\": \".gif\",\n\t\"image/webp\": \".webp\",\n};\n\nasync function saveImages(items: (TextContent | ImageContent)[]): Promise<(TextContent | ImageContent)[]> {\n\tconst labels = new Map<string, Promise<string>>();\n\tconst label = async ({ data, mimeType }: ImageContent): Promise<string> => {\n\t\tconst bytes = Buffer.from(data, \"base64\");\n\t\tconst kind = `${mimeType}, ${formatSize(bytes.length)}`;\n\t\tconst extension = IMAGE_EXTENSIONS[mimeType];\n\t\tif (!extension) throw new Error(`No file extension for image type ${mimeType}`);\n\t\ttry {\n\t\t\tconst path = await writeOutputFile(\"atomic-codemode\", extension, bytes);\n\t\t\treturn `[Image saved to ${path} (${kind})]`;\n\t\t} catch (error) {\n\t\t\treturn `[Image (${kind}) could not be saved: ${error instanceof Error ? error.message : String(error)}]`;\n\t\t}\n\t};\n\tconst result = await Promise.all(\n\t\titems.map(async (item): Promise<(TextContent | ImageContent)[]> => {\n\t\t\tif (item.type !== \"image\") return [item];\n\t\t\tlet pending = labels.get(item.data);\n\t\t\tif (!pending) {\n\t\t\t\tpending = label(item);\n\t\t\t\tlabels.set(item.data, pending);\n\t\t\t}\n\t\t\treturn [{ type: \"text\", text: await pending }, item];\n\t\t}),\n\t);\n\treturn result.flat();\n}\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}\nconst MODEL_TYPES = [\"chat\", \"image\", \"classifier\"] as const;\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 withArticle(word: string): string {\n\treturn `${/^[aeiou]/.test(word) ? \"an\" : \"a\"} ${word}`;\n}\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction describeValue(value: unknown): string {\n\tif (value === undefined || value === null) return String(value);\n\tif (Array.isArray(value)) return value.length === 0 ? \"an empty array\" : \"an array\";\n\tif (typeof value === \"object\") {\n\t\tconst keys = Object.keys(value);\n\t\tif (keys.length === 0) return \"{}\";\n\t\treturn `{ ${keys.slice(0, 6).join(\", \")}${keys.length > 6 ? \", ...\" : \"\"} }`;\n\t}\n\treturn typeof value === \"string\" ? \"a string\" : `a ${typeof value}`;\n}\nconst CLASSIFIER_CONTEXT_SHAPE =\n\t'{ state: { ... }, images?: [{ type: \"image\", data: <base64>, mimeType }], questions: { <id>: { type: \"choice\", instructions, criteria: { <label>: <meaning> } } | { type: \"score\", instructions, criteria: [<lowest level>, ..., <highest level>] } | { type: \"bool\", instructions, criteria: { true: <meaning>, false: <meaning> } } } }';\nfunction checkClassifierContext(context: unknown): ClassifierContext {\n\tconst fail = (problem: string) =>\n\t\tnew Error(\n\t\t\t`models.classify() ${problem}. Expected context: ${CLASSIFIER_CONTEXT_SHAPE}. See \"Classify\" in ${CODEMODE_DOCS_PATH}.`,\n\t\t);\n\tif (!isRecord(context)) throw fail(`expects a context object as its second argument, got ${describeValue(context)}`);\n\tif (!isRecord(context.state)) throw fail(`context.state must be an object, got ${describeValue(context.state)}`);\n\tconst { images } = context;\n\tif (images !== undefined) {\n\t\tif (!Array.isArray(images)) throw fail(`context.images must be an array, got ${describeValue(images)}`);\n\t\timages.forEach((image, index) => {\n\t\t\tif (\n\t\t\t\t!isRecord(image) ||\n\t\t\t\timage.type !== \"image\" ||\n\t\t\t\ttypeof image.data !== \"string\" ||\n\t\t\t\ttypeof image.mimeType !== \"string\"\n\t\t\t) {\n\t\t\t\tthrow fail(`context.images[${index}] must be an image block, got ${describeValue(image)}`);\n\t\t\t}\n\t\t});\n\t}\n\tconst { questions } = context;\n\tif (!isRecord(questions) || Object.keys(questions).length === 0)\n\t\tthrow fail(`context.questions must map question IDs to questions, got ${describeValue(questions)}`);\n\tconst isStrings = (values: unknown[]) => values.length > 0 && values.every((value) => typeof value === \"string\");\n\tfor (const [questionId, question] of Object.entries(questions)) {\n\t\tconst at = `context.questions.${questionId}`;\n\t\tif (!isRecord(question)) throw fail(`${at} must be a question object, got ${describeValue(question)}`);\n\t\tif (typeof question.instructions !== \"string\") throw fail(`${at}.instructions must be a string`);\n\t\tconst { criteria } = question;\n\t\tif (question.type === \"choice\") {\n\t\t\tif (!isRecord(criteria) || !isStrings(Object.values(criteria)))\n\t\t\t\tthrow fail(`${at} is a \"choice\" question, so criteria must map each label to its meaning`);\n\t\t} else if (question.type === \"score\") {\n\t\t\tif (!Array.isArray(criteria) || !isStrings(criteria))\n\t\t\t\tthrow fail(`${at} is a \"score\" question, so criteria must list the levels as strings, lowest first`);\n\t\t} else if (question.type === \"bool\") {\n\t\t\tif (!isRecord(criteria) || typeof criteria.true !== \"string\" || typeof criteria.false !== \"string\")\n\t\t\t\tthrow fail(`${at} is a \"bool\" question, so criteria must be { true: string, false: string }`);\n\t\t} else {\n\t\t\tthrow fail(`${at}.type must be \"choice\", \"score\", or \"bool\", got ${JSON.stringify(question.type)}`);\n\t\t}\n\t}\n\treturn context as unknown as ClassifierContext;\n}\nfunction checkImagesContext(context: unknown): ImagesContext {\n\tconst fail = (problem: string) =>\n\t\tnew Error(\n\t\t\t`models.generateImages() ${problem}. Expected context: { input: [{ type: \"text\", text: <prompt> }, ...optional { type: \"image\", data: <base64>, mimeType } references] }. See \"Generate images\" in ${CODEMODE_DOCS_PATH}.`,\n\t\t);\n\tif (!isRecord(context)) throw fail(`expects a context object as its second argument, got ${describeValue(context)}`);\n\tconst { input } = context;\n\tif (!Array.isArray(input) || input.length === 0)\n\t\tthrow fail(`context.input must be a non-empty array of blocks, got ${describeValue(input)}`);\n\tinput.forEach((block: unknown, index) => {\n\t\tif (isRecord(block) && block.type === \"text\" && typeof block.text === \"string\") return;\n\t\tif (\n\t\t\tisRecord(block) &&\n\t\t\tblock.type === \"image\" &&\n\t\t\ttypeof block.data === \"string\" &&\n\t\t\ttypeof block.mimeType === \"string\"\n\t\t)\n\t\t\treturn;\n\t\tthrow fail(`context.input[${index}] must be a text or image block, got ${describeValue(block)}`);\n\t});\n\treturn context as unknown as ImagesContext;\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}\ninterface ModelCallResult {\n\tstopReason: \"stop\" | \"error\" | \"aborted\";\n\terrorMessage?: string;\n\tusage?: Usage;\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\t{\n\t\t\tname: \"describeNamespace\",\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(\"describeNamespace() expects a namespace name\");\n\t\t\t\tlet namespace: ToolNamespace | undefined;\n\t\t\t\tconst names: string[] = [];\n\t\t\t\tfor (const tool of tools) {\n\t\t\t\t\tconst toolNamespace = options.getToolNamespace?.(tool.name);\n\t\t\t\t\tif (toolNamespace?.name !== name) continue;\n\t\t\t\t\tnamespace ??= toolNamespace;\n\t\t\t\t\tnames.push(toCodemodeIdentifier(tool.name));\n\t\t\t\t}\n\t\t\t\tif (!namespace) return undefined;\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\t...(namespace.description ? { description: namespace.description } : {}),\n\t\t\t\t\t...(namespace.instructions ? { instructions: namespace.instructions } : {}),\n\t\t\t\t\ttools: names,\n\t\t\t\t};\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\taddGeneratedImages: (count: number) => void,\n): CodemodeTool[] {\n\tconst models = ctx.modelRegistry;\n\tconst limit = createLimiter(4);\n\tlet count = 0;\n\tconst runModelCall = async <TType extends \"classifier\" | \"image\", TContext, TResult extends ModelCallResult>(\n\t\tname: string,\n\t\ttype: TType,\n\t\t[ref, context]: unknown[],\n\t\tcheckContext: (context: unknown) => TContext,\n\t\trun: (model: ModelTypeMap[TType], context: TContext) => Promise<TResult>,\n\t): Promise<TResult> => {\n\t\tconst listHint = `List the ${type} models you can use with models.getAvailableOfType(\"${type}\").`;\n\t\tif (!isRecord(ref) || typeof ref.provider !== \"string\" || typeof ref.id !== \"string\") {\n\t\t\tconst undefinedHint =\n\t\t\t\tref === undefined || ref === null\n\t\t\t\t\t? \" models.getModelOfType() returns undefined for an unknown provider or id.\"\n\t\t\t\t\t: \"\";\n\t\t\tthrow new Error(\n\t\t\t\t`${name}() expects ${withArticle(type)} model as its first argument, got ${describeValue(ref)}.${undefinedHint} ${listHint}`,\n\t\t\t);\n\t\t}\n\t\tconst { provider: providerId, id: modelId } = ref;\n\t\tconst model = models.getModelOfType(type, providerId, modelId);\n\t\tif (!model) {\n\t\t\tconst actualType = MODEL_TYPES.find(\n\t\t\t\t(other) => other !== type && models.getModelOfType(other, providerId, modelId) !== undefined,\n\t\t\t);\n\t\t\tthrow new Error(\n\t\t\t\tactualType\n\t\t\t\t\t? `\"${providerId}/${modelId}\" is ${withArticle(actualType)} model, not ${withArticle(type)} model. ${listHint}`\n\t\t\t\t\t: `Unknown ${type} model \"${providerId}/${modelId}\". ${listHint}`,\n\t\t\t);\n\t\t}\n\t\tconst checked = checkContext(context);\n\t\tconst record: CodemodeNestedCall = {\n\t\t\tid: `${id}/${name}/${++count}`,\n\t\t\tname,\n\t\t\targs: `${model.provider}/${model.id}`,\n\t\t\tstatus: \"running\",\n\t\t};\n\t\tcalls.push(record);\n\t\tpublish();\n\t\tconst start = performance.now();\n\t\tconst result = await limit(() => run(model, checked));\n\t\trecord.durationMs = performance.now() - start;\n\t\trecord.status = result.stopReason === \"stop\" ? \"ok\" : result.stopReason === \"aborted\" ? \"cancelled\" : \"error\";\n\t\tif (result.errorMessage) record.error = result.errorMessage.slice(0, 500);\n\t\tif (result.usage) {\n\t\t\trecord.cost = result.usage.cost.total;\n\t\t\taddUsage(result.usage);\n\t\t}\n\t\tpublish();\n\t\treturn result;\n\t};\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(\n\t\t\t\t\t\t`models.getModelOfType(type, provider, id) expects three strings, got (${(args as unknown[]).map(describeValue).join(\", \")}). The provider and the id are separate arguments, for example models.getModelOfType(\"classifier\", \"typesafe\", \"jev-latest\").`,\n\t\t\t\t\t);\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: (args, { signal }) =>\n\t\t\t\trunModelCall(\"models.classify\", \"classifier\", args as unknown[], checkClassifierContext, (model, context) =>\n\t\t\t\t\tmodels.classify(model, context, { signal }),\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname: \"models.generateImages\",\n\t\t\tspread: true,\n\t\t\texecute: (args, { signal }) =>\n\t\t\t\trunModelCall(\n\t\t\t\t\t\"models.generateImages\",\n\t\t\t\t\t\"image\",\n\t\t\t\t\targs as unknown[],\n\t\t\t\t\tcheckImagesContext,\n\t\t\t\t\tasync (model, context) => {\n\t\t\t\t\t\tconst result = await models.generateImages(model, context, { signal });\n\t\t\t\t\t\taddGeneratedImages(result.output.filter((block) => block.type === \"image\").length);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t},\n\t\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\tlet generatedImages = 0;\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 guidelines = options.getToolGuidelines?.();\n\tconst samples = new Map(\n\t\tcallable.map((tool) => [tool.name, renderToolSample(toCodemodeDeclaration(tool, guidelines?.get(tool.name)))]),\n\t);\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(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tcalls,\n\t\t\t\t\t\tpublish,\n\t\t\t\t\t\t(extra) => {\n\t\t\t\t\t\t\tusage = usage ? combineUsage(usage, extra) : extra;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(count) => {\n\t\t\t\t\t\t\tgeneratedImages += count;\n\t\t\t\t\t\t},\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\tif (generatedImages > 0 && !content.some((block) => block.type === \"image\"))\n\t\tcontent.push({\n\t\t\ttype: \"text\",\n\t\t\ttext: `Note: models.generateImages() returned ${generatedImages} image${generatedImages === 1 ? \"\" : \"s\"} that the script did not show. Show each image block of result.output with image(block).`,\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\tlet path: string;\n\t\tlet notice: string;\n\t\ttry {\n\t\t\tpath = await writeOutputFile(\"atomic-codemode\", \".txt\", 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\t// Save after truncation so labels cannot be cut or separated from their images.\n\tcontent = await saveImages(content);\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"]}
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/codemode/execute.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tAnyModel,\n\tClassifierContext,\n\tImageContent,\n\tImagesContext,\n\tModelType,\n\tModelTypeMap,\n\tTextContent,\n\tUsage,\n} from \"@bastani/pi-ai\";\nimport type { AgentTool, AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype CodemodeOutputItem,\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 { ToolNamespace } from \"../../core/extensions/tool-types.ts\";\nimport type { SessionEntry } from \"../../core/session-manager.ts\";\nimport { formatSize } from \"../../core/tools/truncate.ts\";\nimport { combineUsage } from \"../../core/usage-totals.ts\";\nimport { writeOutputFile } from \"../../utils/output-files.js\";\nimport { Bm25Ranker, createToolSearchDocument, DEFAULT_TOOL_SEARCH_LIMIT } from \"../tool-search/tool.js\";\nimport {\n\tCODEMODE_DOCS_PATH,\n\tCODEMODE_STORE_ENTRY_TYPE,\n\tCODEMODE_TOOL_NAME,\n\ttype CodemodeNestedCall,\n\ttype CodemodeToolDetails,\n\ttype CodemodeToolInput,\n\ttype CodemodeToolOptions,\n\tgetCodemodeCallableTools,\n\ttoCodemodeDeclaration,\n} from \"./tool.js\";\n\nconst IMAGE_EXTENSIONS: Record<string, string> = {\n\t\"image/png\": \".png\",\n\t\"image/jpeg\": \".jpg\",\n\t\"image/gif\": \".gif\",\n\t\"image/webp\": \".webp\",\n};\n\nasync function saveImages(items: (TextContent | ImageContent)[]): Promise<(TextContent | ImageContent)[]> {\n\tconst labels = new Map<string, Promise<string>>();\n\tconst label = async ({ data, mimeType }: ImageContent): Promise<string> => {\n\t\tconst bytes = Buffer.from(data, \"base64\");\n\t\tconst kind = `${mimeType}, ${formatSize(bytes.length)}`;\n\t\tconst extension = IMAGE_EXTENSIONS[mimeType];\n\t\tif (!extension) throw new Error(`No file extension for image type ${mimeType}`);\n\t\ttry {\n\t\t\tconst path = await writeOutputFile(\"atomic-codemode\", extension, bytes);\n\t\t\treturn `[Image saved to ${path} (${kind})]`;\n\t\t} catch (error) {\n\t\t\treturn `[Image (${kind}) could not be saved: ${error instanceof Error ? error.message : String(error)}]`;\n\t\t}\n\t};\n\tconst result = await Promise.all(\n\t\titems.map(async (item): Promise<(TextContent | ImageContent)[]> => {\n\t\t\tif (item.type !== \"image\") return [item];\n\t\t\tlet pending = labels.get(item.data);\n\t\t\tif (!pending) {\n\t\t\t\tpending = label(item);\n\t\t\t\tlabels.set(item.data, pending);\n\t\t\t}\n\t\t\treturn [{ type: \"text\", text: await pending }, item];\n\t\t}),\n\t);\n\treturn result.flat();\n}\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}\n/** Separate text items and collect console calls after the script's other output. */\nfunction formatOutput(output: readonly CodemodeOutputItem[]): (TextContent | ImageContent)[] {\n\tconst total = output.filter((item) => item.type === \"text\" && !item.console).length;\n\tconst items: (TextContent | ImageContent)[] = [];\n\tconst consoleLines: string[] = [];\n\tlet index = 0;\n\tfor (const item of output) {\n\t\tif (item.type === \"image\") items.push(item);\n\t\telse if (item.console) consoleLines.push(item.text);\n\t\telse {\n\t\t\tindex++;\n\t\t\titems.push({ type: \"text\", text: total > 1 ? `==> text ${index}/${total} <==\\n${item.text}` : item.text });\n\t\t}\n\t}\n\tif (consoleLines.length > 0)\n\t\titems.push({ type: \"text\", text: `<console_output>\\n${consoleLines.join(\"\\n\")}\\n</console_output>` });\n\treturn items;\n}\n\n/** Providers may concatenate adjacent text blocks without a separator. */\nfunction joinAdjacentText(items: (TextContent | ImageContent)[]): (TextContent | ImageContent)[] {\n\tconst joined: (TextContent | ImageContent)[] = [];\n\tfor (const item of items) {\n\t\tconst last = joined.at(-1);\n\t\tif (item.type === \"text\" && last?.type === \"text\") {\n\t\t\tconst separator = last.text === \"\" || last.text.endsWith(\"\\n\") ? \"\" : \"\\n\";\n\t\t\tjoined[joined.length - 1] = { type: \"text\", text: `${last.text}${separator}${item.text}` };\n\t\t} else joined.push(item);\n\t}\n\treturn joined;\n}\n\nconst MODEL_TYPES = [\"chat\", \"image\", \"classifier\"] as const;\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 withArticle(word: string): string {\n\treturn `${/^[aeiou]/.test(word) ? \"an\" : \"a\"} ${word}`;\n}\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\nfunction describeValue(value: unknown): string {\n\tif (value === undefined || value === null) return String(value);\n\tif (Array.isArray(value)) return value.length === 0 ? \"an empty array\" : \"an array\";\n\tif (typeof value === \"object\") {\n\t\tconst keys = Object.keys(value);\n\t\tif (keys.length === 0) return \"{}\";\n\t\treturn `{ ${keys.slice(0, 6).join(\", \")}${keys.length > 6 ? \", ...\" : \"\"} }`;\n\t}\n\treturn typeof value === \"string\" ? \"a string\" : `a ${typeof value}`;\n}\nconst CLASSIFIER_CONTEXT_SHAPE =\n\t'{ state: { ... }, images?: [{ type: \"image\", data: <base64>, mimeType }], questions: { <id>: { type: \"choice\", instructions, criteria: { <label>: <meaning> } } | { type: \"score\", instructions, criteria: [<lowest level>, ..., <highest level>] } | { type: \"bool\", instructions, criteria: { true: <meaning>, false: <meaning> } } } }';\nfunction checkClassifierContext(context: unknown): ClassifierContext {\n\tconst fail = (problem: string) =>\n\t\tnew Error(\n\t\t\t`models.classify() ${problem}. Expected context: ${CLASSIFIER_CONTEXT_SHAPE}. See \"Classify\" in ${CODEMODE_DOCS_PATH}.`,\n\t\t);\n\tif (!isRecord(context)) throw fail(`expects a context object as its second argument, got ${describeValue(context)}`);\n\tif (!isRecord(context.state)) throw fail(`context.state must be an object, got ${describeValue(context.state)}`);\n\tconst { images } = context;\n\tif (images !== undefined) {\n\t\tif (!Array.isArray(images)) throw fail(`context.images must be an array, got ${describeValue(images)}`);\n\t\timages.forEach((image, index) => {\n\t\t\tif (\n\t\t\t\t!isRecord(image) ||\n\t\t\t\timage.type !== \"image\" ||\n\t\t\t\ttypeof image.data !== \"string\" ||\n\t\t\t\ttypeof image.mimeType !== \"string\"\n\t\t\t) {\n\t\t\t\tthrow fail(`context.images[${index}] must be an image block, got ${describeValue(image)}`);\n\t\t\t}\n\t\t});\n\t}\n\tconst { questions } = context;\n\tif (!isRecord(questions) || Object.keys(questions).length === 0)\n\t\tthrow fail(`context.questions must map question IDs to questions, got ${describeValue(questions)}`);\n\tconst isStrings = (values: unknown[]) => values.length > 0 && values.every((value) => typeof value === \"string\");\n\tfor (const [questionId, question] of Object.entries(questions)) {\n\t\tconst at = `context.questions.${questionId}`;\n\t\tif (!isRecord(question)) throw fail(`${at} must be a question object, got ${describeValue(question)}`);\n\t\tif (typeof question.instructions !== \"string\") throw fail(`${at}.instructions must be a string`);\n\t\tconst { criteria } = question;\n\t\tif (question.type === \"choice\") {\n\t\t\tif (!isRecord(criteria) || !isStrings(Object.values(criteria)))\n\t\t\t\tthrow fail(`${at} is a \"choice\" question, so criteria must map each label to its meaning`);\n\t\t} else if (question.type === \"score\") {\n\t\t\tif (!Array.isArray(criteria) || !isStrings(criteria))\n\t\t\t\tthrow fail(`${at} is a \"score\" question, so criteria must list the levels as strings, lowest first`);\n\t\t} else if (question.type === \"bool\") {\n\t\t\tif (!isRecord(criteria) || typeof criteria.true !== \"string\" || typeof criteria.false !== \"string\")\n\t\t\t\tthrow fail(`${at} is a \"bool\" question, so criteria must be { true: string, false: string }`);\n\t\t} else {\n\t\t\tthrow fail(`${at}.type must be \"choice\", \"score\", or \"bool\", got ${JSON.stringify(question.type)}`);\n\t\t}\n\t}\n\treturn context as unknown as ClassifierContext;\n}\nfunction checkImagesContext(context: unknown): ImagesContext {\n\tconst fail = (problem: string) =>\n\t\tnew Error(\n\t\t\t`models.generateImages() ${problem}. Expected context: { input: [{ type: \"text\", text: <prompt> }, ...optional { type: \"image\", data: <base64>, mimeType } references] }. See \"Generate images\" in ${CODEMODE_DOCS_PATH}.`,\n\t\t);\n\tif (!isRecord(context)) throw fail(`expects a context object as its second argument, got ${describeValue(context)}`);\n\tconst { input } = context;\n\tif (!Array.isArray(input) || input.length === 0)\n\t\tthrow fail(`context.input must be a non-empty array of blocks, got ${describeValue(input)}`);\n\tinput.forEach((block: unknown, index) => {\n\t\tif (isRecord(block) && block.type === \"text\" && typeof block.text === \"string\") return;\n\t\tif (\n\t\t\tisRecord(block) &&\n\t\t\tblock.type === \"image\" &&\n\t\t\ttypeof block.data === \"string\" &&\n\t\t\ttypeof block.mimeType === \"string\"\n\t\t)\n\t\t\treturn;\n\t\tthrow fail(`context.input[${index}] must be a text or image block, got ${describeValue(block)}`);\n\t});\n\treturn context as unknown as ImagesContext;\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}\ninterface ModelCallResult {\n\tstopReason: \"stop\" | \"error\" | \"aborted\";\n\terrorMessage?: string;\n\tusage?: Usage;\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\tconst modelOnly = (query: string) => {\n\t\tconst wanted = query.trim().toLowerCase();\n\t\tconst name = options\n\t\t\t.getModelOnlyTools?.()\n\t\t\t.find(\n\t\t\t\t(name) =>\n\t\t\t\t\tname !== CODEMODE_TOOL_NAME &&\n\t\t\t\t\t[name, toCodemodeIdentifier(name)].some((candidate) => candidate.toLowerCase() === wanted),\n\t\t\t);\n\t\treturn name\n\t\t\t? { name, description: `\\`${name}\\` is model-only: call it directly, not from a script.` }\n\t\t\t: undefined;\n\t};\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\tconst hint = config?.namespace ? undefined : modelOnly(query);\n\t\t\t\tconst matches = new Bm25Ranker().rank(query, docs, limit).map((match) => entry(match.name));\n\t\t\t\treturn hint ? [hint, ...matches].slice(0, limit) : matches;\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) : modelOnly(name)?.description;\n\t\t\t},\n\t\t},\n\t\t{\n\t\t\tname: \"describeNamespace\",\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(\"describeNamespace() expects a namespace name\");\n\t\t\t\tlet namespace: ToolNamespace | undefined;\n\t\t\t\tconst names: string[] = [];\n\t\t\t\tfor (const tool of tools) {\n\t\t\t\t\tconst toolNamespace = options.getToolNamespace?.(tool.name);\n\t\t\t\t\tif (toolNamespace?.name !== name) continue;\n\t\t\t\t\tnamespace ??= toolNamespace;\n\t\t\t\t\tnames.push(toCodemodeIdentifier(tool.name));\n\t\t\t\t}\n\t\t\t\tif (!namespace) return undefined;\n\t\t\t\treturn {\n\t\t\t\t\tname,\n\t\t\t\t\t...(namespace.description ? { description: namespace.description } : {}),\n\t\t\t\t\t...(namespace.instructions ? { instructions: namespace.instructions } : {}),\n\t\t\t\t\ttools: names,\n\t\t\t\t};\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\taddGeneratedImages: (count: number) => void,\n): CodemodeTool[] {\n\tconst models = ctx.modelRegistry;\n\tconst limit = createLimiter(4);\n\tlet count = 0;\n\tconst runModelCall = async <TType extends \"classifier\" | \"image\", TContext, TResult extends ModelCallResult>(\n\t\tname: string,\n\t\ttype: TType,\n\t\t[ref, context]: unknown[],\n\t\tcheckContext: (context: unknown) => TContext,\n\t\trun: (model: ModelTypeMap[TType], context: TContext) => Promise<TResult>,\n\t): Promise<TResult> => {\n\t\tconst listHint = `List the ${type} models you can use with models.getAvailableOfType(\"${type}\").`;\n\t\tif (!isRecord(ref) || typeof ref.provider !== \"string\" || typeof ref.id !== \"string\") {\n\t\t\tconst undefinedHint =\n\t\t\t\tref === undefined || ref === null\n\t\t\t\t\t? \" models.getModelOfType() returns undefined for an unknown provider or id.\"\n\t\t\t\t\t: \"\";\n\t\t\tthrow new Error(\n\t\t\t\t`${name}() expects ${withArticle(type)} model as its first argument, got ${describeValue(ref)}.${undefinedHint} ${listHint}`,\n\t\t\t);\n\t\t}\n\t\tconst { provider: providerId, id: modelId } = ref;\n\t\tconst model = models.getModelOfType(type, providerId, modelId);\n\t\tif (!model) {\n\t\t\tconst actualType = MODEL_TYPES.find(\n\t\t\t\t(other) => other !== type && models.getModelOfType(other, providerId, modelId) !== undefined,\n\t\t\t);\n\t\t\tthrow new Error(\n\t\t\t\tactualType\n\t\t\t\t\t? `\"${providerId}/${modelId}\" is ${withArticle(actualType)} model, not ${withArticle(type)} model. ${listHint}`\n\t\t\t\t\t: `Unknown ${type} model \"${providerId}/${modelId}\". ${listHint}`,\n\t\t\t);\n\t\t}\n\t\tconst checked = checkContext(context);\n\t\tconst record: CodemodeNestedCall = {\n\t\t\tid: `${id}/${name}/${++count}`,\n\t\t\tname,\n\t\t\targs: `${model.provider}/${model.id}`,\n\t\t\tstatus: \"running\",\n\t\t};\n\t\tcalls.push(record);\n\t\tpublish();\n\t\tconst start = performance.now();\n\t\tconst result = await limit(() => run(model, checked));\n\t\trecord.durationMs = performance.now() - start;\n\t\trecord.status = result.stopReason === \"stop\" ? \"ok\" : result.stopReason === \"aborted\" ? \"cancelled\" : \"error\";\n\t\tif (result.errorMessage) record.error = result.errorMessage.slice(0, 500);\n\t\tif (result.usage) {\n\t\t\trecord.cost = result.usage.cost.total;\n\t\t\taddUsage(result.usage);\n\t\t}\n\t\tpublish();\n\t\treturn result;\n\t};\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(\n\t\t\t\t\t\t`models.getModelOfType(type, provider, id) expects three strings, got (${(args as unknown[]).map(describeValue).join(\", \")}). The provider and the id are separate arguments, for example models.getModelOfType(\"classifier\", \"typesafe\", \"jev-latest\").`,\n\t\t\t\t\t);\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: (args, { signal }) =>\n\t\t\t\trunModelCall(\"models.classify\", \"classifier\", args as unknown[], checkClassifierContext, (model, context) =>\n\t\t\t\t\tmodels.classify(model, context, { signal }),\n\t\t\t\t),\n\t\t},\n\t\t{\n\t\t\tname: \"models.generateImages\",\n\t\t\tspread: true,\n\t\t\texecute: (args, { signal }) =>\n\t\t\t\trunModelCall(\n\t\t\t\t\t\"models.generateImages\",\n\t\t\t\t\t\"image\",\n\t\t\t\t\targs as unknown[],\n\t\t\t\t\tcheckImagesContext,\n\t\t\t\t\tasync (model, context) => {\n\t\t\t\t\t\tconst result = await models.generateImages(model, context, { signal });\n\t\t\t\t\t\taddGeneratedImages(result.output.filter((block) => block.type === \"image\").length);\n\t\t\t\t\t\treturn result;\n\t\t\t\t\t},\n\t\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\tlet generatedImages = 0;\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 guidelines = options.getToolGuidelines?.();\n\tconst samples = new Map(\n\t\tcallable.map((tool) => [tool.name, renderToolSample(toCodemodeDeclaration(tool, guidelines?.get(tool.name)))]),\n\t);\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(\n\t\t\t\t\t\tctx,\n\t\t\t\t\t\tid,\n\t\t\t\t\t\tcalls,\n\t\t\t\t\t\tpublish,\n\t\t\t\t\t\t(extra) => {\n\t\t\t\t\t\t\tusage = usage ? combineUsage(usage, extra) : extra;\n\t\t\t\t\t\t},\n\t\t\t\t\t\t(count) => {\n\t\t\t\t\t\t\tgeneratedImages += count;\n\t\t\t\t\t\t},\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\tconst scriptOutput = [...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\tscriptOutput.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}\n\tlet content = formatOutput(scriptOutput);\n\tif (!result.ok)\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\tif (generatedImages > 0 && !content.some((block) => block.type === \"image\"))\n\t\tcontent.push({\n\t\t\ttype: \"text\",\n\t\t\ttext: `Note: models.generateImages() returned ${generatedImages} image${generatedImages === 1 ? \"\" : \"s\"} that the script did not show. Show each image block of result.output with image(block).`,\n\t\t});\n\tcontent = joinAdjacentText(content);\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\tlet path: string;\n\t\tlet notice: string;\n\t\ttry {\n\t\t\tpath = await writeOutputFile(\"atomic-codemode\", \".txt\", 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\t// Save after truncation so labels cannot be cut or separated from their images.\n\tcontent = joinAdjacentText(await saveImages(content));\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"]}
@@ -1 +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,CAchG"}
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,CAqBhG"}
@@ -8,6 +8,13 @@ export function createCodemodeExtension(options = {}) {
8
8
  getToolGuidelines: () => new Map(pi.getAllTools().map((tool) => [tool.name, tool.promptGuidelines ?? []])),
9
9
  getMode: () => options.mode ?? (pi.getSettings().codemode?.mode === "only" ? "only" : "on"),
10
10
  getInlineBudget: () => options.inlineBudget ?? pi.getSettings().codemode?.inlineBudget,
11
+ getModelOnlyTools: () => {
12
+ const active = new Set(pi.getActiveTools());
13
+ return pi
14
+ .getAllTools()
15
+ .filter((tool) => tool.exposure === "model-only" && active.has(tool.name))
16
+ .map((tool) => tool.name);
17
+ },
11
18
  }));
12
19
  };
13
20
  }
@@ -1 +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,iBAAiB,EAAE,GAAG,EAAE,CACvB,IAAI,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAU,CAAC,CAAC;YAC3F,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\tgetToolGuidelines: () =>\n\t\t\t\t\tnew Map(pi.getAllTools().map((tool) => [tool.name, tool.promptGuidelines ?? []] as const)),\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"]}
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,iBAAiB,EAAE,GAAG,EAAE,CACvB,IAAI,GAAG,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE,CAAU,CAAC,CAAC;YAC3F,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;YACtF,iBAAiB,EAAE,GAAG,EAAE;gBACvB,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC,cAAc,EAAE,CAAC,CAAC;gBAC5C,OAAO,EAAE;qBACP,WAAW,EAAE;qBACb,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,KAAK,YAAY,IAAI,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;qBACzE,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;SACD,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\tgetToolGuidelines: () =>\n\t\t\t\t\tnew Map(pi.getAllTools().map((tool) => [tool.name, tool.promptGuidelines ?? []] as const)),\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\tgetModelOnlyTools: () => {\n\t\t\t\t\tconst active = new Set(pi.getActiveTools());\n\t\t\t\t\treturn pi\n\t\t\t\t\t\t.getAllTools()\n\t\t\t\t\t\t.filter((tool) => tool.exposure === \"model-only\" && active.has(tool.name))\n\t\t\t\t\t\t.map((tool) => tool.name);\n\t\t\t\t},\n\t\t\t}),\n\t\t);\n\t};\n}\nexport default createCodemodeExtension();\n"]}
@@ -21,6 +21,8 @@ export interface CodemodeToolOptions {
21
21
  appendEntry?: (type: string, data: CodemodeStoreEntryData) => void;
22
22
  getMode?: () => CodemodeMode;
23
23
  getInlineBudget?: () => number | undefined;
24
+ /** Active model-only tools. Scripts cannot call them, so discovery answers an exact name with a hint. */
25
+ getModelOnlyTools?: () => readonly string[];
24
26
  }
25
27
  export declare const codemodeSchema: Type.TObject<{
26
28
  code: Type.TString;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/tool.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tool.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/tool.ts"],"names":[],"mappings":"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"}
@@ -34,6 +34,8 @@ Top-level await and return work. Use tools.name(args), or tools["raw-name"](args
34
34
  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.
35
35
  Tools with output schemas resolve to structuredContent; others resolve to text. Failed or blocked calls throw. Scripts have a 256 MB memory limit.
36
36
  Globals: ALL_TOOLS, text(value), image(base64DataUrlOrImageContent), exit(), console.log(...), store(key, value), load(key), await searchTools(query, {limit?, namespace?}), await describeTool(name), await describeNamespace(name).
37
+ tools, ALL_TOOLS and searchTools() matches cover only script-callable tools. Model-only tools such as subagent, workflow, intercom, and ask_user_question are excluded from them, but you can still call them directly. searchTools() and describeTool() answer the exact name of an active model-only tool with a hint to call it directly, not from a script.
38
+ With several text items, each starts with a ==> text N/M <== line. Console calls follow the other output in one <console_output> block, with one line per call.
37
39
  image() also saves each image to a temp file and the result names its path before the image.
38
40
  Successful scripts persist store writes on the current session branch; failed scripts discard writes. Unawaited calls are cancelled when the script ends.
39
41
  Optional first line: // @options: {"max_output_tokens": 1000, "timeout_ms": 60000}. Output defaults to 10000 tokens; there is no default deadline.`;
@@ -1 +1 @@
1
- {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/extensions/codemode/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { CodemodeJsonSchema, CodemodeTool } from \"@earendil-works/pi-codemode\";\nimport {\n\tmcpStructuredContentSchema,\n\trenderToolOutputType,\n\trenderToolSample,\n\ttoCodemodeIdentifier,\n} from \"@earendil-works/pi-codemode/declarations\";\nimport { CODEMODE_SOURCE_GRAMMAR } from \"@earendil-works/pi-codemode/source\";\nimport { type Static, Type } from \"typebox\";\nimport { getDocsPath } from \"../../config.js\";\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_DOCS_PATH = join(getDocsPath(), \"codemode.md\");\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\" | \"generateImages\"\n>;\nexport interface CodemodeToolOptions {\n\tgetToolNamespace?: (name: string) => ToolNamespace | undefined;\n\t/** Prompt guidelines shown with tool declarations in describeTool() and ALL_TOOLS. */\n\tgetToolGuidelines?: () => ReadonlyMap<string, readonly string[]>;\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(\n\ttool: AgentTool,\n\tguidelines: readonly string[] = [],\n): Omit<CodemodeTool, \"execute\"> {\n\tconst bullets = guidelines.flatMap((guideline) => (guideline.trim() ? [`- ${guideline.trim()}`] : []));\n\treturn {\n\t\tname: tool.name,\n\t\tdescription: bullets.length > 0 ? `${tool.description.trim()}\\n\\n${bullets.join(\"\\n\")}` : 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\tguidelines?: ReadonlyMap<string, readonly 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), await searchTools(query, {limit?, namespace?}), await describeTool(name), await describeNamespace(name).\nimage() also saves each image to a temp file and the result names its path before the image.\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 }[] }\n\t>();\n\tfor (const tool of getCodemodeCallableTools(tools)) {\n\t\tif (options.deferred?.has(tool.name)) continue;\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, options.guidelines?.get(tool.name))).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});\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].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 = [\n\t\tINTRO,\n\t\t\"Some nested tools may be omitted, including deferred tools. They remain available through tools and ALL_TOOLS. Use await searchTools(query), await describeTool(name), or await describeNamespace(name) to discover them.\",\n\t];\n\tif (options.models)\n\t\tsections.push(\n\t\t\t`Model API: \\`models\\` lists and runs classifier and image models with the session's credentials. Read ${CODEMODE_DOCS_PATH} before using it.`,\n\t\t);\n\tif (ordered.length === 0) return sections.join(\"\\n\\n\");\n\tsections.push(\"Nested tools:\");\n\tfor (const group of ordered) {\n\t\tif (group.namespace) {\n\t\t\tconst visible = group.entries.filter((entry) => shown.has(entry.name));\n\t\t\tconst listing =\n\t\t\t\tvisible.length === group.entries.length\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: visible.length === 0\n\t\t\t\t\t\t? \" (tools not listed)\"\n\t\t\t\t\t\t: \" (some tools not listed)\";\n\t\t\tconst description = group.namespace.description?.trim();\n\t\t\tsections.push(`## ${group.namespace.name}${listing}${description ? `\\n${description}` : \"\"}`);\n\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 describeOutput(schema: CodemodeJsonSchema | undefined): string {\n\tconst type = renderToolOutputType(schema);\n\tif (type === \"string\") return \"a string\";\n\tconst object = typeof schema === \"object\" ? schema : undefined;\n\tconst properties = object?.properties;\n\tif (\n\t\tobject?.type === \"object\" &&\n\t\ttypeof properties === \"object\" &&\n\t\tproperties !== null &&\n\t\tmcpStructuredContentSchema(schema) === undefined\n\t) {\n\t\tconst required = new Set(Array.isArray(object.required) ? object.required : []);\n\t\tconst fields = Object.keys(properties).map((name) => (required.has(name) ? name : `${name}?`));\n\t\treturn `\\`{ ${fields.join(\", \")} }\\``;\n\t}\n\treturn `\\`${type.replace(/\\s+/g, \" \")}\\``;\n}\nfunction describeScriptCall(tool: AgentTool): string {\n\treturn `${tool.description.trim()}\\n\\nCodemode: \\`tools.${toCodemodeIdentifier(tool.name)}(args)\\` resolves to ${describeOutput(toCodemodeDeclaration(tool).outputSchema)}.`;\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] = describeScriptCall(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\tconst guidelines = new Map(listed.map((tool) => [tool.name, loadout.getPromptGuidelines(tool.name)] as const));\n\tdescriptions[CODEMODE_TOOL_NAME] = createCodemodeDescription(listed, {\n\t\tmodels: options.models,\n\t\tnamespaces,\n\t\tguidelines,\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"]}
1
+ {"version":3,"file":"tool.js","sourceRoot":"","sources":["../../../src/extensions/codemode/tool.ts"],"names":[],"mappings":"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","sourcesContent":["import { join } from \"node:path\";\nimport type { AgentTool } from \"@earendil-works/pi-agent-core\";\nimport type { CodemodeJsonSchema, CodemodeTool } from \"@earendil-works/pi-codemode\";\nimport {\n\tmcpStructuredContentSchema,\n\trenderToolOutputType,\n\trenderToolSample,\n\ttoCodemodeIdentifier,\n} from \"@earendil-works/pi-codemode/declarations\";\nimport { CODEMODE_SOURCE_GRAMMAR } from \"@earendil-works/pi-codemode/source\";\nimport { type Static, Type } from \"typebox\";\nimport { getDocsPath } from \"../../config.js\";\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_DOCS_PATH = join(getDocsPath(), \"codemode.md\");\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\" | \"generateImages\"\n>;\nexport interface CodemodeToolOptions {\n\tgetToolNamespace?: (name: string) => ToolNamespace | undefined;\n\t/** Prompt guidelines shown with tool declarations in describeTool() and ALL_TOOLS. */\n\tgetToolGuidelines?: () => ReadonlyMap<string, readonly string[]>;\n\tmodels?: boolean;\n\tappendEntry?: (type: string, data: CodemodeStoreEntryData) => void;\n\tgetMode?: () => CodemodeMode;\n\tgetInlineBudget?: () => number | undefined;\n\t/** Active model-only tools. Scripts cannot call them, so discovery answers an exact name with a hint. */\n\tgetModelOnlyTools?: () => readonly string[];\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(\n\ttool: AgentTool,\n\tguidelines: readonly string[] = [],\n): Omit<CodemodeTool, \"execute\"> {\n\tconst bullets = guidelines.flatMap((guideline) => (guideline.trim() ? [`- ${guideline.trim()}`] : []));\n\treturn {\n\t\tname: tool.name,\n\t\tdescription: bullets.length > 0 ? `${tool.description.trim()}\\n\\n${bullets.join(\"\\n\")}` : 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\tguidelines?: ReadonlyMap<string, readonly 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), await searchTools(query, {limit?, namespace?}), await describeTool(name), await describeNamespace(name).\ntools, ALL_TOOLS and searchTools() matches cover only script-callable tools. Model-only tools such as subagent, workflow, intercom, and ask_user_question are excluded from them, but you can still call them directly. searchTools() and describeTool() answer the exact name of an active model-only tool with a hint to call it directly, not from a script.\nWith several text items, each starts with a ==> text N/M <== line. Console calls follow the other output in one <console_output> block, with one line per call.\nimage() also saves each image to a temp file and the result names its path before the image.\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 }[] }\n\t>();\n\tfor (const tool of getCodemodeCallableTools(tools)) {\n\t\tif (options.deferred?.has(tool.name)) continue;\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, options.guidelines?.get(tool.name))).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});\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].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 = [\n\t\tINTRO,\n\t\t\"Some nested tools may be omitted, including deferred tools. They remain available through tools and ALL_TOOLS. Use await searchTools(query), await describeTool(name), or await describeNamespace(name) to discover them.\",\n\t];\n\tif (options.models)\n\t\tsections.push(\n\t\t\t`Model API: \\`models\\` lists and runs classifier and image models with the session's credentials. Read ${CODEMODE_DOCS_PATH} before using it.`,\n\t\t);\n\tif (ordered.length === 0) return sections.join(\"\\n\\n\");\n\tsections.push(\"Nested tools:\");\n\tfor (const group of ordered) {\n\t\tif (group.namespace) {\n\t\t\tconst visible = group.entries.filter((entry) => shown.has(entry.name));\n\t\t\tconst listing =\n\t\t\t\tvisible.length === group.entries.length\n\t\t\t\t\t? \"\"\n\t\t\t\t\t: visible.length === 0\n\t\t\t\t\t\t? \" (tools not listed)\"\n\t\t\t\t\t\t: \" (some tools not listed)\";\n\t\t\tconst description = group.namespace.description?.trim();\n\t\t\tsections.push(`## ${group.namespace.name}${listing}${description ? `\\n${description}` : \"\"}`);\n\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 describeOutput(schema: CodemodeJsonSchema | undefined): string {\n\tconst type = renderToolOutputType(schema);\n\tif (type === \"string\") return \"a string\";\n\tconst object = typeof schema === \"object\" ? schema : undefined;\n\tconst properties = object?.properties;\n\tif (\n\t\tobject?.type === \"object\" &&\n\t\ttypeof properties === \"object\" &&\n\t\tproperties !== null &&\n\t\tmcpStructuredContentSchema(schema) === undefined\n\t) {\n\t\tconst required = new Set(Array.isArray(object.required) ? object.required : []);\n\t\tconst fields = Object.keys(properties).map((name) => (required.has(name) ? name : `${name}?`));\n\t\treturn `\\`{ ${fields.join(\", \")} }\\``;\n\t}\n\treturn `\\`${type.replace(/\\s+/g, \" \")}\\``;\n}\nfunction describeScriptCall(tool: AgentTool): string {\n\treturn `${tool.description.trim()}\\n\\nCodemode: \\`tools.${toCodemodeIdentifier(tool.name)}(args)\\` resolves to ${describeOutput(toCodemodeDeclaration(tool).outputSchema)}.`;\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] = describeScriptCall(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\tconst guidelines = new Map(listed.map((tool) => [tool.name, loadout.getPromptGuidelines(tool.name)] as const));\n\tdescriptions[CODEMODE_TOOL_NAME] = createCodemodeDescription(listed, {\n\t\tmodels: options.models,\n\t\tnamespaces,\n\t\tguidelines,\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"]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/herdr/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAMvG,OAAO,EAGN,KAAK,oBAAoB,EAIzB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC;CAC7C;AAOD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,gBAAgB,CAsL1F;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAE7D"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/extensions/herdr/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAMvG,OAAO,EAGN,KAAK,oBAAoB,EAIzB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IAClE,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC;CAC7C;AAoBD,wBAAgB,oBAAoB,CAAC,OAAO,GAAE,qBAA0B,GAAG,gBAAgB,CA2L1F;AAED,MAAM,CAAC,OAAO,UAAU,cAAc,CAAC,EAAE,EAAE,YAAY,GAAG,IAAI,CAE7D"}
@@ -1,9 +1,22 @@
1
+ import { APP_NAME } from "../../config.js";
1
2
  import { getExtensionContextOwner, publishExtensionContextEffect } from "../../core/extensions/runner-context.js";
2
3
  import { SettingsManager } from "../../core/settings-manager.js";
3
4
  import { OwnerTaskStore } from "../../core/tasks/owner-store.js";
4
5
  import { deriveSessionActivity } from "./activity.js";
5
6
  import { captureHerdrEnvironment } from "./environment.js";
6
7
  import { claimPaneReporting, releasePaneReporting, reportPaneActivity, retirePaneReporting, } from "./pane-owner.js";
8
+ /** `--session` reads a value with a path separator or a `.jsonl` suffix as a file path, not a session ID. */
9
+ function readsAsSessionPath(sessionId) {
10
+ return sessionId.includes("/") || sessionId.includes("\\") || sessionId.endsWith(".jsonl");
11
+ }
12
+ function resumeArgv(sessionManager) {
13
+ const sessionFile = sessionManager.getSessionFile();
14
+ if (!sessionFile)
15
+ return undefined;
16
+ const sessionId = sessionManager.getSessionId();
17
+ const sessionDir = sessionManager.usesDefaultSessionDir() ? [] : ["--session-dir", sessionManager.getSessionDir()];
18
+ return [APP_NAME, ...sessionDir, "--session", readsAsSessionPath(sessionId) ? sessionFile : sessionId];
19
+ }
7
20
  function enabled(ctx) {
8
21
  const settings = SettingsManager.create(ctx.cwd, undefined, { projectTrusted: ctx.isProjectTrusted() });
9
22
  return (settings.getProjectSettings().herdr?.enabled ?? settings.getGlobalSettings().herdr?.enabled) !== false;
@@ -89,7 +102,11 @@ export function createHerdrExtension(options = {}) {
89
102
  roots.clear();
90
103
  acknowledgedBlocks.clear();
91
104
  availability = "unavailable";
92
- const claimed = await claimPaneReporting(environment, { id: ctx.sessionManager.getSessionId(), path: ctx.sessionManager.getSessionFile() }, { ...options, diagnostic });
105
+ const claimed = await claimPaneReporting(environment, {
106
+ id: ctx.sessionManager.getSessionId(),
107
+ path: ctx.sessionManager.getSessionFile(),
108
+ resume: resumeArgv(ctx.sessionManager),
109
+ }, { ...options, diagnostic });
93
110
  if (current !== generation) {
94
111
  await releasePaneReporting(claimed);
95
112
  return;
@@ -209,7 +226,8 @@ export function createHerdrExtension(options = {}) {
209
226
  // and this shutdown's completion must never clear that newer binding.
210
227
  boundSessionManager = undefined;
211
228
  if (previous) {
212
- if (event.reason === "quit")
229
+ // A host signal ends the process, not the conversation: keep the registration Herdr restores from.
230
+ if (event.reason === "quit" && !event.fromSignal)
213
231
  await releasePaneReporting(previous);
214
232
  else
215
233
  await retirePaneReporting(previous);