@earendil-works/pi-coding-agent 0.87.1 → 0.99.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (722) hide show
  1. package/CHANGELOG.md +97 -0
  2. package/dist/bun/cli.d.ts.map +1 -1
  3. package/dist/bun/restore-sandbox-env.d.ts.map +1 -1
  4. package/dist/bun/restore-sandbox-env.js.map +1 -1
  5. package/dist/bun/runtime-setup.d.ts.map +1 -1
  6. package/dist/bun/runtime-setup.js +4 -1
  7. package/dist/bun/runtime-setup.js.map +1 -1
  8. package/dist/bun/sandbox-env-setup.d.ts.map +1 -1
  9. package/dist/bundle/chunks/anthropic-messages-A6EXUBG6.js +6 -0
  10. package/dist/bundle/chunks/anthropic.js +2 -2
  11. package/dist/bundle/chunks/azure-openai-responses-EN5WOBET.js +2 -0
  12. package/dist/bundle/chunks/bedrock-converse-stream.js +2 -2
  13. package/dist/bundle/chunks/chunk-7JGR3GZN.js +11 -0
  14. package/dist/bundle/chunks/chunk-AXPY26X7.js +146 -0
  15. package/dist/bundle/chunks/chunk-GOPCREV2.js +4 -0
  16. package/dist/bundle/chunks/chunk-GUORCHFS.js +1435 -0
  17. package/dist/bundle/chunks/chunk-H3QXYIF7.js +31 -0
  18. package/dist/bundle/chunks/{chunk-S7SZN6Z3.js → chunk-HSPCVFST.js} +1 -1
  19. package/dist/bundle/chunks/chunk-IMTXZUO7.js +82 -0
  20. package/dist/bundle/chunks/chunk-J4CWPC4N.js +2 -0
  21. package/dist/bundle/chunks/chunk-LLMKQWZS.js +21 -0
  22. package/dist/bundle/chunks/{chunk-WIUZI2CJ.js → chunk-LRS5S6EK.js} +3 -3
  23. package/dist/bundle/chunks/chunk-PEHWOV5U.js +187 -0
  24. package/dist/bundle/chunks/{chunk-XDUWOHPL.js → chunk-S3GGRYIO.js} +2 -2
  25. package/dist/bundle/chunks/chunk-SLDA2X2H.js +2 -0
  26. package/dist/bundle/chunks/chunk-UTB4DTYQ.js +2 -0
  27. package/dist/bundle/chunks/{chunk-FUXEF6JQ.js → chunk-W2DOMZSC.js} +1 -1
  28. package/dist/bundle/chunks/cli-AZXNGIZH.js +49 -0
  29. package/dist/bundle/chunks/cloudflare-workers-ai-system-one-XJQQYGGU.js +2 -0
  30. package/dist/bundle/chunks/codemode-worker.js +295 -0
  31. package/dist/bundle/chunks/execute-7XXPZAWW.js +308 -0
  32. package/dist/bundle/chunks/github-copilot.js +1 -1
  33. package/dist/bundle/chunks/google-generative-ai-CQAKKJTA.js +2 -0
  34. package/dist/bundle/chunks/google-vertex-AE36YXJU.js +2 -0
  35. package/dist/bundle/chunks/{lib-HGQMNYVT.js → lib-TEDK3E5I.js} +2 -2
  36. package/dist/bundle/chunks/llama-cpp-classify-PJJYKPLD.js +22 -0
  37. package/dist/bundle/chunks/mistral-conversations-KEYTXJM7.js +5 -0
  38. package/dist/bundle/chunks/openai-chatgpt.js +75 -0
  39. package/dist/bundle/chunks/{openai-codex-responses-QDSOTBBO.js → openai-codex-responses-JQTCOVEG.js} +2 -2
  40. package/dist/bundle/chunks/openai-codex.js +2 -2
  41. package/dist/bundle/chunks/{openai-completions-OBX42CLD.js → openai-completions-XW2Q5HVC.js} +2 -2
  42. package/dist/bundle/chunks/openai-responses-6AXWFL75.js +3 -0
  43. package/dist/bundle/chunks/{openrouter-images-N4XVVFSD.js → openrouter-images-TPQ4V6OR.js} +1 -1
  44. package/dist/bundle/chunks/openrouter.js +2 -2
  45. package/dist/bundle/chunks/{pi-messages-GFKBWJHZ.js → pi-messages-TM5SOOIW.js} +2 -2
  46. package/dist/bundle/chunks/radius.js +2 -2
  47. package/dist/bundle/chunks/runtime-G5WJPRBM.js +2 -0
  48. package/dist/bundle/chunks/typesafe-system-one-E7A4HNJI.js +2 -0
  49. package/dist/bundle/chunks/virtual-modules-CSWRO37N.js +2 -0
  50. package/dist/bundle/cli-runtime.js +1 -1
  51. package/dist/bundle/index.js +1 -1
  52. package/dist/bundle/rpc-entry.js +1 -1
  53. package/dist/cli/args.d.ts.map +1 -1
  54. package/dist/cli/args.js +4 -3
  55. package/dist/cli/args.js.map +1 -1
  56. package/dist/cli/auth-check.d.ts.map +1 -1
  57. package/dist/cli/auth-check.js.map +1 -1
  58. package/dist/cli/auth-command.d.ts.map +1 -1
  59. package/dist/cli/auth-command.js.map +1 -1
  60. package/dist/cli/config-selector.d.ts.map +1 -1
  61. package/dist/cli/config-selector.js.map +1 -1
  62. package/dist/cli/credential-print.d.ts.map +1 -1
  63. package/dist/cli/credential-print.js.map +1 -1
  64. package/dist/cli/file-processor.d.ts.map +1 -1
  65. package/dist/cli/file-processor.js.map +1 -1
  66. package/dist/cli/initial-message.d.ts +1 -1
  67. package/dist/cli/initial-message.d.ts.map +1 -1
  68. package/dist/cli/initial-message.js.map +1 -1
  69. package/dist/cli/list-models.d.ts.map +1 -1
  70. package/dist/cli/list-models.js.map +1 -1
  71. package/dist/cli/project-trust.d.ts.map +1 -1
  72. package/dist/cli/project-trust.js.map +1 -1
  73. package/dist/cli/session-picker.d.ts.map +1 -1
  74. package/dist/cli/session-picker.js.map +1 -1
  75. package/dist/cli/setup.d.ts.map +1 -1
  76. package/dist/cli/setup.js.map +1 -1
  77. package/dist/cli/startup-ui.d.ts.map +1 -1
  78. package/dist/cli/startup-ui.js +38 -30
  79. package/dist/cli/startup-ui.js.map +1 -1
  80. package/dist/cli.d.ts.map +1 -1
  81. package/dist/config.d.ts +18 -4
  82. package/dist/config.d.ts.map +1 -1
  83. package/dist/config.js +30 -4
  84. package/dist/config.js.map +1 -1
  85. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  86. package/dist/core/agent-session-runtime.js +1 -1
  87. package/dist/core/agent-session-runtime.js.map +1 -1
  88. package/dist/core/agent-session-services.d.ts.map +1 -1
  89. package/dist/core/agent-session-services.js +13 -0
  90. package/dist/core/agent-session-services.js.map +1 -1
  91. package/dist/core/agent-session.d.ts +135 -11
  92. package/dist/core/agent-session.d.ts.map +1 -1
  93. package/dist/core/agent-session.js +509 -253
  94. package/dist/core/agent-session.js.map +1 -1
  95. package/dist/core/auth-guidance.d.ts.map +1 -1
  96. package/dist/core/auth-guidance.js.map +1 -1
  97. package/dist/core/auth-storage.d.ts.map +1 -1
  98. package/dist/core/auth-storage.js.map +1 -1
  99. package/dist/core/bash-executor.d.ts.map +1 -1
  100. package/dist/core/bash-executor.js.map +1 -1
  101. package/dist/core/bug-report-upload.d.ts.map +1 -1
  102. package/dist/core/bug-report-upload.js.map +1 -1
  103. package/dist/core/bug-report.d.ts +1 -1
  104. package/dist/core/bug-report.d.ts.map +1 -1
  105. package/dist/core/bug-report.js +1 -1
  106. package/dist/core/bug-report.js.map +1 -1
  107. package/dist/core/cache-stats.d.ts.map +1 -1
  108. package/dist/core/cache-stats.js.map +1 -1
  109. package/dist/core/cache-warmer.d.ts.map +1 -1
  110. package/dist/core/cache-warmer.js.map +1 -1
  111. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  112. package/dist/core/compaction/branch-summarization.js.map +1 -1
  113. package/dist/core/compaction/compaction.d.ts.map +1 -1
  114. package/dist/core/compaction/compaction.js +1 -22
  115. package/dist/core/compaction/compaction.js.map +1 -1
  116. package/dist/core/compaction/index.d.ts.map +1 -1
  117. package/dist/core/compaction/utils.d.ts +2 -1
  118. package/dist/core/compaction/utils.d.ts.map +1 -1
  119. package/dist/core/compaction/utils.js +25 -18
  120. package/dist/core/compaction/utils.js.map +1 -1
  121. package/dist/core/crash-log.d.ts.map +1 -1
  122. package/dist/core/crash-log.js +2 -1
  123. package/dist/core/crash-log.js.map +1 -1
  124. package/dist/core/defaults.d.ts.map +1 -1
  125. package/dist/core/diagnostics.d.ts.map +1 -1
  126. package/dist/core/event-bus.d.ts.map +1 -1
  127. package/dist/core/event-bus.js.map +1 -1
  128. package/dist/core/exec.d.ts.map +1 -1
  129. package/dist/core/exec.js.map +1 -1
  130. package/dist/core/experimental.d.ts.map +1 -1
  131. package/dist/core/experimental.js.map +1 -1
  132. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -1
  133. package/dist/core/export-html/ansi-to-html.js.map +1 -1
  134. package/dist/core/export-html/index.d.ts.map +1 -1
  135. package/dist/core/export-html/index.js.map +1 -1
  136. package/dist/core/export-html/template.css +10 -0
  137. package/dist/core/export-html/template.js +66 -17
  138. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  139. package/dist/core/export-html/tool-renderer.js.map +1 -1
  140. package/dist/core/extensions/index.d.ts +1 -1
  141. package/dist/core/extensions/index.d.ts.map +1 -1
  142. package/dist/core/extensions/index.js.map +1 -1
  143. package/dist/core/extensions/jiti-loader.d.ts.map +1 -1
  144. package/dist/core/extensions/jiti-static-loader.d.ts.map +1 -1
  145. package/dist/core/extensions/loader.d.ts.map +1 -1
  146. package/dist/core/extensions/loader.js +55 -5
  147. package/dist/core/extensions/loader.js.map +1 -1
  148. package/dist/core/extensions/runner.d.ts +18 -1
  149. package/dist/core/extensions/runner.d.ts.map +1 -1
  150. package/dist/core/extensions/runner.js +99 -0
  151. package/dist/core/extensions/runner.js.map +1 -1
  152. package/dist/core/extensions/types.d.ts +296 -22
  153. package/dist/core/extensions/types.d.ts.map +1 -1
  154. package/dist/core/extensions/types.js.map +1 -1
  155. package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
  156. package/dist/core/extensions/wrapper.d.ts +2 -2
  157. package/dist/core/extensions/wrapper.d.ts.map +1 -1
  158. package/dist/core/extensions/wrapper.js +3 -3
  159. package/dist/core/extensions/wrapper.js.map +1 -1
  160. package/dist/core/footer-data-provider.d.ts.map +1 -1
  161. package/dist/core/footer-data-provider.js.map +1 -1
  162. package/dist/core/http-dispatcher.d.ts.map +1 -1
  163. package/dist/core/http-dispatcher.js.map +1 -1
  164. package/dist/core/index.d.ts.map +1 -1
  165. package/dist/core/keybindings.d.ts +1 -1
  166. package/dist/core/keybindings.d.ts.map +1 -1
  167. package/dist/core/keybindings.js +1 -1
  168. package/dist/core/keybindings.js.map +1 -1
  169. package/dist/core/mcp-servers.d.ts +98 -0
  170. package/dist/core/mcp-servers.d.ts.map +1 -0
  171. package/dist/core/mcp-servers.js +157 -0
  172. package/dist/core/mcp-servers.js.map +1 -0
  173. package/dist/core/messages.d.ts.map +1 -1
  174. package/dist/core/messages.js.map +1 -1
  175. package/dist/core/model-config.d.ts.map +1 -1
  176. package/dist/core/model-config.js.map +1 -1
  177. package/dist/core/model-registry.d.ts +13 -1
  178. package/dist/core/model-registry.d.ts.map +1 -1
  179. package/dist/core/model-registry.js +25 -0
  180. package/dist/core/model-registry.js.map +1 -1
  181. package/dist/core/model-resolver.d.ts +2 -2
  182. package/dist/core/model-resolver.d.ts.map +1 -1
  183. package/dist/core/model-resolver.js +5 -5
  184. package/dist/core/model-resolver.js.map +1 -1
  185. package/dist/core/model-runtime.d.ts +41 -3
  186. package/dist/core/model-runtime.d.ts.map +1 -1
  187. package/dist/core/model-runtime.js +167 -17
  188. package/dist/core/model-runtime.js.map +1 -1
  189. package/dist/core/models-store.d.ts.map +1 -1
  190. package/dist/core/models-store.js.map +1 -1
  191. package/dist/core/nested-tool-calls.d.ts +102 -0
  192. package/dist/core/nested-tool-calls.d.ts.map +1 -0
  193. package/dist/core/nested-tool-calls.js +178 -0
  194. package/dist/core/nested-tool-calls.js.map +1 -0
  195. package/dist/core/output-guard.d.ts.map +1 -1
  196. package/dist/core/output-guard.js.map +1 -1
  197. package/dist/core/package-manager.d.ts +4 -0
  198. package/dist/core/package-manager.d.ts.map +1 -1
  199. package/dist/core/package-manager.js +59 -12
  200. package/dist/core/package-manager.js.map +1 -1
  201. package/dist/core/pi-manifest.d.ts.map +1 -1
  202. package/dist/core/pi-manifest.js.map +1 -1
  203. package/dist/core/project-trust.d.ts.map +1 -1
  204. package/dist/core/project-trust.js.map +1 -1
  205. package/dist/core/prompt-templates.d.ts.map +1 -1
  206. package/dist/core/prompt-templates.js.map +1 -1
  207. package/dist/core/provider-attribution.d.ts.map +1 -1
  208. package/dist/core/provider-attribution.js.map +1 -1
  209. package/dist/core/provider-composer.d.ts +40 -21
  210. package/dist/core/provider-composer.d.ts.map +1 -1
  211. package/dist/core/provider-composer.js +92 -40
  212. package/dist/core/provider-composer.js.map +1 -1
  213. package/dist/core/radius.d.ts.map +1 -1
  214. package/dist/core/radius.js.map +1 -1
  215. package/dist/core/remote-catalog-provider.d.ts +8 -1
  216. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  217. package/dist/core/remote-catalog-provider.js +18 -3
  218. package/dist/core/remote-catalog-provider.js.map +1 -1
  219. package/dist/core/resolve-config-value.d.ts.map +1 -1
  220. package/dist/core/resolve-config-value.js.map +1 -1
  221. package/dist/core/resource-loader.d.ts +7 -1
  222. package/dist/core/resource-loader.d.ts.map +1 -1
  223. package/dist/core/resource-loader.js +161 -35
  224. package/dist/core/resource-loader.js.map +1 -1
  225. package/dist/core/runtime-credentials.d.ts.map +1 -1
  226. package/dist/core/runtime-credentials.js.map +1 -1
  227. package/dist/core/sdk.d.ts +1 -1
  228. package/dist/core/sdk.d.ts.map +1 -1
  229. package/dist/core/sdk.js +24 -6
  230. package/dist/core/sdk.js.map +1 -1
  231. package/dist/core/session-cwd.d.ts.map +1 -1
  232. package/dist/core/session-cwd.js.map +1 -1
  233. package/dist/core/session-export.d.ts.map +1 -1
  234. package/dist/core/session-export.js.map +1 -1
  235. package/dist/core/session-manager.d.ts +9 -0
  236. package/dist/core/session-manager.d.ts.map +1 -1
  237. package/dist/core/session-manager.js +22 -22
  238. package/dist/core/session-manager.js.map +1 -1
  239. package/dist/core/settings-diagnostics.d.ts.map +1 -1
  240. package/dist/core/settings-diagnostics.js.map +1 -1
  241. package/dist/core/settings-manager.d.ts +31 -1
  242. package/dist/core/settings-manager.d.ts.map +1 -1
  243. package/dist/core/settings-manager.js +72 -2
  244. package/dist/core/settings-manager.js.map +1 -1
  245. package/dist/core/skills.d.ts.map +1 -1
  246. package/dist/core/skills.js.map +1 -1
  247. package/dist/core/slash-commands.d.ts.map +1 -1
  248. package/dist/core/source-info.d.ts +8 -0
  249. package/dist/core/source-info.d.ts.map +1 -1
  250. package/dist/core/source-info.js +16 -0
  251. package/dist/core/source-info.js.map +1 -1
  252. package/dist/core/system-prompt.d.ts.map +1 -1
  253. package/dist/core/system-prompt.js +1 -1
  254. package/dist/core/system-prompt.js.map +1 -1
  255. package/dist/core/telemetry.d.ts.map +1 -1
  256. package/dist/core/telemetry.js.map +1 -1
  257. package/dist/core/timings.d.ts.map +1 -1
  258. package/dist/core/timings.js.map +1 -1
  259. package/dist/core/tools/bash.d.ts +12 -0
  260. package/dist/core/tools/bash.d.ts.map +1 -1
  261. package/dist/core/tools/bash.js +35 -2
  262. package/dist/core/tools/bash.js.map +1 -1
  263. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  264. package/dist/core/tools/edit-diff.js.map +1 -1
  265. package/dist/core/tools/edit.d.ts.map +1 -1
  266. package/dist/core/tools/edit.js.map +1 -1
  267. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -1
  268. package/dist/core/tools/file-mutation-queue.js.map +1 -1
  269. package/dist/core/tools/find.d.ts.map +1 -1
  270. package/dist/core/tools/find.js.map +1 -1
  271. package/dist/core/tools/grep.d.ts.map +1 -1
  272. package/dist/core/tools/grep.js.map +1 -1
  273. package/dist/core/tools/index.d.ts.map +1 -1
  274. package/dist/core/tools/index.js.map +1 -1
  275. package/dist/core/tools/ls.d.ts.map +1 -1
  276. package/dist/core/tools/ls.js.map +1 -1
  277. package/dist/core/tools/output-accumulator.d.ts +11 -0
  278. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  279. package/dist/core/tools/output-accumulator.js +36 -0
  280. package/dist/core/tools/output-accumulator.js.map +1 -1
  281. package/dist/core/tools/path-utils.d.ts.map +1 -1
  282. package/dist/core/tools/path-utils.js.map +1 -1
  283. package/dist/core/tools/powershell.d.ts.map +1 -1
  284. package/dist/core/tools/powershell.js.map +1 -1
  285. package/dist/core/tools/read.d.ts.map +1 -1
  286. package/dist/core/tools/read.js.map +1 -1
  287. package/dist/core/tools/render-utils.d.ts +6 -0
  288. package/dist/core/tools/render-utils.d.ts.map +1 -1
  289. package/dist/core/tools/render-utils.js +26 -0
  290. package/dist/core/tools/render-utils.js.map +1 -1
  291. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  292. package/dist/core/tools/renderers/bash.js +9 -10
  293. package/dist/core/tools/renderers/bash.js.map +1 -1
  294. package/dist/core/tools/renderers/edit.d.ts.map +1 -1
  295. package/dist/core/tools/renderers/edit.js.map +1 -1
  296. package/dist/core/tools/renderers/find.d.ts.map +1 -1
  297. package/dist/core/tools/renderers/find.js.map +1 -1
  298. package/dist/core/tools/renderers/grep.d.ts.map +1 -1
  299. package/dist/core/tools/renderers/grep.js.map +1 -1
  300. package/dist/core/tools/renderers/index.d.ts.map +1 -1
  301. package/dist/core/tools/renderers/index.js.map +1 -1
  302. package/dist/core/tools/renderers/ls.d.ts.map +1 -1
  303. package/dist/core/tools/renderers/ls.js.map +1 -1
  304. package/dist/core/tools/renderers/read.d.ts.map +1 -1
  305. package/dist/core/tools/renderers/read.js +3 -2
  306. package/dist/core/tools/renderers/read.js.map +1 -1
  307. package/dist/core/tools/renderers/write.d.ts.map +1 -1
  308. package/dist/core/tools/renderers/write.js.map +1 -1
  309. package/dist/core/tools/tool-definition-wrapper.d.ts +5 -3
  310. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  311. package/dist/core/tools/tool-definition-wrapper.js +3 -1
  312. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  313. package/dist/core/tools/truncate.d.ts +14 -0
  314. package/dist/core/tools/truncate.d.ts.map +1 -1
  315. package/dist/core/tools/truncate.js +29 -0
  316. package/dist/core/tools/truncate.js.map +1 -1
  317. package/dist/core/tools/write.d.ts.map +1 -1
  318. package/dist/core/tools/write.js.map +1 -1
  319. package/dist/core/trust-manager.d.ts.map +1 -1
  320. package/dist/core/trust-manager.js +1 -0
  321. package/dist/core/trust-manager.js.map +1 -1
  322. package/dist/core/usage-totals.d.ts +2 -0
  323. package/dist/core/usage-totals.d.ts.map +1 -1
  324. package/dist/core/usage-totals.js +23 -0
  325. package/dist/core/usage-totals.js.map +1 -1
  326. package/dist/core/virtual-models.d.ts +115 -0
  327. package/dist/core/virtual-models.d.ts.map +1 -0
  328. package/dist/core/virtual-models.js +117 -0
  329. package/dist/core/virtual-models.js.map +1 -0
  330. package/dist/extensions/codemode/execute.d.ts +16 -0
  331. package/dist/extensions/codemode/execute.d.ts.map +1 -0
  332. package/dist/extensions/codemode/execute.js +390 -0
  333. package/dist/extensions/codemode/execute.js.map +1 -0
  334. package/dist/extensions/codemode/execute.lazy.d.ts +3 -0
  335. package/dist/extensions/codemode/execute.lazy.d.ts.map +1 -0
  336. package/dist/extensions/codemode/execute.lazy.js +3 -0
  337. package/dist/extensions/codemode/execute.lazy.js.map +1 -0
  338. package/dist/extensions/codemode/index.d.ts +21 -0
  339. package/dist/extensions/codemode/index.d.ts.map +1 -0
  340. package/dist/extensions/codemode/index.js +31 -0
  341. package/dist/extensions/codemode/index.js.map +1 -0
  342. package/dist/extensions/codemode/renderer.d.ts +12 -0
  343. package/dist/extensions/codemode/renderer.d.ts.map +1 -0
  344. package/dist/extensions/codemode/renderer.js +119 -0
  345. package/dist/extensions/codemode/renderer.js.map +1 -0
  346. package/dist/extensions/codemode/tool.d.ts +122 -0
  347. package/dist/extensions/codemode/tool.d.ts.map +1 -0
  348. package/dist/extensions/codemode/tool.js +324 -0
  349. package/dist/extensions/codemode/tool.js.map +1 -0
  350. package/dist/extensions/codemode/worker.d.ts +7 -0
  351. package/dist/extensions/codemode/worker.d.ts.map +1 -0
  352. package/dist/extensions/codemode/worker.js +7 -0
  353. package/dist/extensions/codemode/worker.js.map +1 -0
  354. package/dist/extensions/index.d.ts.map +1 -1
  355. package/dist/extensions/index.js +11 -1
  356. package/dist/extensions/index.js.map +1 -1
  357. package/dist/extensions/llama/client.d.ts.map +1 -1
  358. package/dist/extensions/llama/client.js.map +1 -1
  359. package/dist/extensions/llama/huggingface.d.ts.map +1 -1
  360. package/dist/extensions/llama/huggingface.js.map +1 -1
  361. package/dist/extensions/llama/index.d.ts.map +1 -1
  362. package/dist/extensions/llama/index.js.map +1 -1
  363. package/dist/extensions/llama/provider.d.ts +1 -1
  364. package/dist/extensions/llama/provider.d.ts.map +1 -1
  365. package/dist/extensions/llama/provider.js +65 -13
  366. package/dist/extensions/llama/provider.js.map +1 -1
  367. package/dist/extensions/llama/ui.d.ts.map +1 -1
  368. package/dist/extensions/llama/ui.js.map +1 -1
  369. package/dist/extensions/mcp/cli.d.ts +21 -0
  370. package/dist/extensions/mcp/cli.d.ts.map +1 -0
  371. package/dist/extensions/mcp/cli.js +485 -0
  372. package/dist/extensions/mcp/cli.js.map +1 -0
  373. package/dist/extensions/mcp/cli.lazy.d.ts +3 -0
  374. package/dist/extensions/mcp/cli.lazy.d.ts.map +1 -0
  375. package/dist/extensions/mcp/cli.lazy.js +3 -0
  376. package/dist/extensions/mcp/cli.lazy.js.map +1 -0
  377. package/dist/extensions/mcp/config.d.ts +70 -0
  378. package/dist/extensions/mcp/config.d.ts.map +1 -0
  379. package/dist/extensions/mcp/config.js +146 -0
  380. package/dist/extensions/mcp/config.js.map +1 -0
  381. package/dist/extensions/mcp/index.d.ts +52 -0
  382. package/dist/extensions/mcp/index.d.ts.map +1 -0
  383. package/dist/extensions/mcp/index.js +902 -0
  384. package/dist/extensions/mcp/index.js.map +1 -0
  385. package/dist/extensions/mcp/log.d.ts +16 -0
  386. package/dist/extensions/mcp/log.d.ts.map +1 -0
  387. package/dist/extensions/mcp/log.js +66 -0
  388. package/dist/extensions/mcp/log.js.map +1 -0
  389. package/dist/extensions/mcp/oauth.d.ts +94 -0
  390. package/dist/extensions/mcp/oauth.d.ts.map +1 -0
  391. package/dist/extensions/mcp/oauth.js +333 -0
  392. package/dist/extensions/mcp/oauth.js.map +1 -0
  393. package/dist/extensions/mcp/resources.d.ts +43 -0
  394. package/dist/extensions/mcp/resources.d.ts.map +1 -0
  395. package/dist/extensions/mcp/resources.js +262 -0
  396. package/dist/extensions/mcp/resources.js.map +1 -0
  397. package/dist/extensions/mcp/runtime.d.ts +96 -0
  398. package/dist/extensions/mcp/runtime.d.ts.map +1 -0
  399. package/dist/extensions/mcp/runtime.js +388 -0
  400. package/dist/extensions/mcp/runtime.js.map +1 -0
  401. package/dist/extensions/mcp/runtime.lazy.d.ts +3 -0
  402. package/dist/extensions/mcp/runtime.lazy.d.ts.map +1 -0
  403. package/dist/extensions/mcp/runtime.lazy.js +3 -0
  404. package/dist/extensions/mcp/runtime.lazy.js.map +1 -0
  405. package/dist/extensions/mcp/tools.d.ts +83 -0
  406. package/dist/extensions/mcp/tools.d.ts.map +1 -0
  407. package/dist/extensions/mcp/tools.js +233 -0
  408. package/dist/extensions/mcp/tools.js.map +1 -0
  409. package/dist/extensions/mcp/ui.d.ts +60 -0
  410. package/dist/extensions/mcp/ui.d.ts.map +1 -0
  411. package/dist/extensions/mcp/ui.js +172 -0
  412. package/dist/extensions/mcp/ui.js.map +1 -0
  413. package/dist/extensions/tool-search/index.d.ts +12 -0
  414. package/dist/extensions/tool-search/index.d.ts.map +1 -0
  415. package/dist/extensions/tool-search/index.js +15 -0
  416. package/dist/extensions/tool-search/index.js.map +1 -0
  417. package/dist/extensions/tool-search/tool.d.ts +72 -0
  418. package/dist/extensions/tool-search/tool.d.ts.map +1 -0
  419. package/dist/extensions/tool-search/tool.js +210 -0
  420. package/dist/extensions/tool-search/tool.js.map +1 -0
  421. package/dist/index.d.ts +9 -2
  422. package/dist/index.d.ts.map +1 -1
  423. package/dist/index.js +5 -0
  424. package/dist/index.js.map +1 -1
  425. package/dist/main.d.ts.map +1 -1
  426. package/dist/main.js +10 -0
  427. package/dist/main.js.map +1 -1
  428. package/dist/migrations.d.ts.map +1 -1
  429. package/dist/migrations.js.map +1 -1
  430. package/dist/modes/index.d.ts.map +1 -1
  431. package/dist/modes/interactive/bug-report.d.ts.map +1 -1
  432. package/dist/modes/interactive/bug-report.js.map +1 -1
  433. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -1
  434. package/dist/modes/interactive/chat-viewport.js.map +1 -1
  435. package/dist/modes/interactive/components/armin.d.ts.map +1 -1
  436. package/dist/modes/interactive/components/armin.js.map +1 -1
  437. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  438. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  439. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  440. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  441. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  442. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  443. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  444. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  445. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  446. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  447. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  448. package/dist/modes/interactive/components/config-selector.js +13 -3
  449. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  450. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -1
  451. package/dist/modes/interactive/components/countdown-timer.js.map +1 -1
  452. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  453. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  454. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  455. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  456. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  457. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  458. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -1
  459. package/dist/modes/interactive/components/daxnuts.js.map +1 -1
  460. package/dist/modes/interactive/components/diff.d.ts.map +1 -1
  461. package/dist/modes/interactive/components/diff.js.map +1 -1
  462. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -1
  463. package/dist/modes/interactive/components/dynamic-border.js.map +1 -1
  464. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -1
  465. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -1
  466. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  467. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  468. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -1
  469. package/dist/modes/interactive/components/extension-input.js.map +1 -1
  470. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -1
  471. package/dist/modes/interactive/components/extension-selector.js.map +1 -1
  472. package/dist/modes/interactive/components/first-time-setup.d.ts +4 -4
  473. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  474. package/dist/modes/interactive/components/first-time-setup.js +8 -2
  475. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  476. package/dist/modes/interactive/components/footer.d.ts +7 -0
  477. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  478. package/dist/modes/interactive/components/footer.js +43 -3
  479. package/dist/modes/interactive/components/footer.js.map +1 -1
  480. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  481. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  482. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  483. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  484. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  485. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  486. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  487. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  488. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  489. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  490. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  491. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  492. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  493. package/dist/modes/interactive/components/pi-logo.d.ts +12 -0
  494. package/dist/modes/interactive/components/pi-logo.d.ts.map +1 -0
  495. package/dist/modes/interactive/components/pi-logo.js +25 -0
  496. package/dist/modes/interactive/components/pi-logo.js.map +1 -0
  497. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  498. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  499. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  500. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  501. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  502. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  503. package/dist/modes/interactive/components/settings-selector.d.ts +3 -1
  504. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  505. package/dist/modes/interactive/components/settings-selector.js +28 -6
  506. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  507. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  508. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  509. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  510. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  511. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  512. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  513. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  514. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  515. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  516. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  517. package/dist/modes/interactive/components/themed-text.d.ts +17 -0
  518. package/dist/modes/interactive/components/themed-text.d.ts.map +1 -0
  519. package/dist/modes/interactive/components/themed-text.js +29 -0
  520. package/dist/modes/interactive/components/themed-text.js.map +1 -0
  521. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  522. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  523. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  524. package/dist/modes/interactive/components/tool-execution.js +2 -2
  525. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  526. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  527. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  528. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -1
  529. package/dist/modes/interactive/components/trust-selector.js.map +1 -1
  530. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  531. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  532. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  533. package/dist/modes/interactive/components/user-message.js.map +1 -1
  534. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -1
  535. package/dist/modes/interactive/components/visual-truncate.js.map +1 -1
  536. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  537. package/dist/modes/interactive/external-editor.js.map +1 -1
  538. package/dist/modes/interactive/interactive-mode.d.ts +11 -0
  539. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  540. package/dist/modes/interactive/interactive-mode.js +199 -161
  541. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  542. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -1
  543. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -1
  544. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  545. package/dist/modes/interactive/model-search.js.map +1 -1
  546. package/dist/modes/interactive/session-share.d.ts.map +1 -1
  547. package/dist/modes/interactive/session-share.js.map +1 -1
  548. package/dist/modes/interactive/theme/dark.json +59 -72
  549. package/dist/modes/interactive/theme/light.json +57 -69
  550. package/dist/modes/interactive/theme/system-theme.d.ts +54 -0
  551. package/dist/modes/interactive/theme/system-theme.d.ts.map +1 -0
  552. package/dist/modes/interactive/theme/system-theme.js +535 -0
  553. package/dist/modes/interactive/theme/system-theme.js.map +1 -0
  554. package/dist/modes/interactive/theme/theme-controller.d.ts +46 -6
  555. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  556. package/dist/modes/interactive/theme/theme-controller.js +127 -47
  557. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  558. package/dist/modes/interactive/theme/theme-json.d.ts +1 -0
  559. package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -1
  560. package/dist/modes/interactive/theme/theme-json.js +3 -1
  561. package/dist/modes/interactive/theme/theme-json.js.map +1 -1
  562. package/dist/modes/interactive/theme/theme-schema.json +7 -2
  563. package/dist/modes/interactive/theme/theme.d.ts +66 -39
  564. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  565. package/dist/modes/interactive/theme/theme.js +238 -317
  566. package/dist/modes/interactive/theme/theme.js.map +1 -1
  567. package/dist/modes/interactive/tui-renderer.d.ts +2 -1
  568. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -1
  569. package/dist/modes/interactive/tui-renderer.js +1 -0
  570. package/dist/modes/interactive/tui-renderer.js.map +1 -1
  571. package/dist/modes/json-event.d.ts.map +1 -1
  572. package/dist/modes/json-event.js.map +1 -1
  573. package/dist/modes/print-mode.d.ts.map +1 -1
  574. package/dist/modes/print-mode.js.map +1 -1
  575. package/dist/modes/rpc/jsonl.d.ts.map +1 -1
  576. package/dist/modes/rpc/jsonl.js.map +1 -1
  577. package/dist/modes/rpc/rpc-client.d.ts +6 -6
  578. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  579. package/dist/modes/rpc/rpc-client.js +12 -8
  580. package/dist/modes/rpc/rpc-client.js.map +1 -1
  581. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  582. package/dist/modes/rpc/rpc-mode.js +7 -9
  583. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  584. package/dist/modes/rpc/rpc-types.d.ts +10 -1
  585. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  586. package/dist/modes/rpc/rpc-types.js.map +1 -1
  587. package/dist/package-manager-cli.d.ts.map +1 -1
  588. package/dist/package-manager-cli.js +6 -2
  589. package/dist/package-manager-cli.js.map +1 -1
  590. package/dist/rpc-entry.d.ts.map +1 -1
  591. package/dist/rpc-entry.js.map +1 -1
  592. package/dist/utils/abort.d.ts.map +1 -1
  593. package/dist/utils/abort.js.map +1 -1
  594. package/dist/utils/ansi.d.ts.map +1 -1
  595. package/dist/utils/ansi.js.map +1 -1
  596. package/dist/utils/changelog.d.ts.map +1 -1
  597. package/dist/utils/changelog.js.map +1 -1
  598. package/dist/utils/child-process.d.ts.map +1 -1
  599. package/dist/utils/child-process.js.map +1 -1
  600. package/dist/utils/clipboard-command.d.ts.map +1 -1
  601. package/dist/utils/clipboard-command.js.map +1 -1
  602. package/dist/utils/clipboard-image.d.ts.map +1 -1
  603. package/dist/utils/clipboard-image.js +14 -17
  604. package/dist/utils/clipboard-image.js.map +1 -1
  605. package/dist/utils/clipboard.d.ts +2 -0
  606. package/dist/utils/clipboard.d.ts.map +1 -1
  607. package/dist/utils/clipboard.js +5 -0
  608. package/dist/utils/clipboard.js.map +1 -1
  609. package/dist/utils/deprecation.d.ts.map +1 -1
  610. package/dist/utils/deprecation.js.map +1 -1
  611. package/dist/utils/exif-orientation.d.ts.map +1 -1
  612. package/dist/utils/exif-orientation.js.map +1 -1
  613. package/dist/utils/frontmatter.d.ts.map +1 -1
  614. package/dist/utils/frontmatter.js.map +1 -1
  615. package/dist/utils/fs-watch.d.ts.map +1 -1
  616. package/dist/utils/fs-watch.js.map +1 -1
  617. package/dist/utils/git.d.ts.map +1 -1
  618. package/dist/utils/git.js.map +1 -1
  619. package/dist/utils/html.d.ts.map +1 -1
  620. package/dist/utils/html.js.map +1 -1
  621. package/dist/utils/image-convert.d.ts.map +1 -1
  622. package/dist/utils/image-convert.js.map +1 -1
  623. package/dist/utils/image-process.d.ts.map +1 -1
  624. package/dist/utils/image-process.js.map +1 -1
  625. package/dist/utils/image-resize-core.d.ts.map +1 -1
  626. package/dist/utils/image-resize-core.js.map +1 -1
  627. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  628. package/dist/utils/image-resize-worker.js.map +1 -1
  629. package/dist/utils/image-resize.d.ts.map +1 -1
  630. package/dist/utils/image-resize.js.map +1 -1
  631. package/dist/utils/json.d.ts.map +1 -1
  632. package/dist/utils/json.js.map +1 -1
  633. package/dist/utils/management-http.d.ts.map +1 -1
  634. package/dist/utils/management-http.js.map +1 -1
  635. package/dist/utils/mime.d.ts.map +1 -1
  636. package/dist/utils/mime.js.map +1 -1
  637. package/dist/utils/open-browser.d.ts.map +1 -1
  638. package/dist/utils/open-browser.js.map +1 -1
  639. package/dist/utils/paths.d.ts +3 -3
  640. package/dist/utils/paths.d.ts.map +1 -1
  641. package/dist/utils/paths.js +5 -4
  642. package/dist/utils/paths.js.map +1 -1
  643. package/dist/utils/photon.d.ts.map +1 -1
  644. package/dist/utils/photon.js.map +1 -1
  645. package/dist/utils/pi-user-agent.d.ts.map +1 -1
  646. package/dist/utils/pi-user-agent.js.map +1 -1
  647. package/dist/utils/shell.d.ts +1 -3
  648. package/dist/utils/shell.d.ts.map +1 -1
  649. package/dist/utils/shell.js +3 -30
  650. package/dist/utils/shell.js.map +1 -1
  651. package/dist/utils/sleep.d.ts.map +1 -1
  652. package/dist/utils/sleep.js.map +1 -1
  653. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  654. package/dist/utils/syntax-highlight.js +2 -0
  655. package/dist/utils/syntax-highlight.js.map +1 -1
  656. package/dist/utils/text.d.ts.map +1 -1
  657. package/dist/utils/text.js.map +1 -1
  658. package/dist/utils/tool-result-images.d.ts.map +1 -1
  659. package/dist/utils/tool-result-images.js.map +1 -1
  660. package/dist/utils/tools-manager.d.ts.map +1 -1
  661. package/dist/utils/tools-manager.js.map +1 -1
  662. package/dist/utils/version-check.d.ts.map +1 -1
  663. package/dist/utils/version-check.js.map +1 -1
  664. package/dist/utils/windows-self-update.d.ts.map +1 -1
  665. package/dist/utils/windows-self-update.js.map +1 -1
  666. package/dist/utils/wsl.d.ts.map +1 -1
  667. package/dist/utils/wsl.js.map +1 -1
  668. package/dist/utils/zip.d.ts.map +1 -1
  669. package/dist/utils/zip.js.map +1 -1
  670. package/docs/cli.md +64 -3
  671. package/docs/configuration.md +2 -0
  672. package/docs/custom-provider.md +43 -4
  673. package/docs/docs.json +8 -0
  674. package/docs/extensions.md +55 -0
  675. package/docs/keybindings.md +1 -1
  676. package/docs/llama-cpp.md +13 -0
  677. package/docs/mcp.md +188 -0
  678. package/docs/models.md +35 -0
  679. package/docs/packages.md +4 -2
  680. package/docs/providers.md +1 -0
  681. package/docs/rpc-commands.md +9 -3
  682. package/docs/rpc.md +3 -1
  683. package/docs/sdk.md +7 -2
  684. package/docs/security.md +2 -0
  685. package/docs/session-format.md +5 -1
  686. package/docs/settings.md +20 -3
  687. package/docs/themes.md +33 -7
  688. package/docs/tui.md +18 -0
  689. package/docs/virtual-models.md +114 -0
  690. package/docs/windows.md +2 -0
  691. package/examples/README.md +1 -1
  692. package/examples/extensions/README.md +2 -0
  693. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  694. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  695. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  696. package/examples/extensions/custom-provider-gitlab-duo/test.ts +5 -5
  697. package/examples/extensions/debug-provider.ts +90 -0
  698. package/examples/extensions/gondolin/package-lock.json +2 -2
  699. package/examples/extensions/gondolin/package.json +1 -1
  700. package/examples/extensions/jev-router.ts +113 -0
  701. package/examples/extensions/sandbox/package-lock.json +2 -2
  702. package/examples/extensions/sandbox/package.json +1 -1
  703. package/examples/extensions/with-deps/package-lock.json +2 -2
  704. package/examples/extensions/with-deps/package.json +1 -1
  705. package/examples/rpc-client.ts +1 -1
  706. package/examples/rpc-extension-ui.ts +1 -1
  707. package/examples/sdk/14-codemode-mcp.ts +61 -0
  708. package/examples/sdk/README.md +2 -1
  709. package/npm-shrinkwrap.json +89 -39
  710. package/package.json +14 -12
  711. package/dist/bundle/chunks/anthropic-messages-J5WXPPPC.js +0 -6
  712. package/dist/bundle/chunks/azure-openai-responses-HUSQ3GP2.js +0 -2
  713. package/dist/bundle/chunks/chunk-65HAU2C5.js +0 -2
  714. package/dist/bundle/chunks/chunk-6R7UI4IY.js +0 -2
  715. package/dist/bundle/chunks/chunk-NUHFSC37.js +0 -25
  716. package/dist/bundle/chunks/chunk-OJP47DM6.js +0 -1568
  717. package/dist/bundle/chunks/chunk-RCZIEVGO.js +0 -11
  718. package/dist/bundle/chunks/google-generative-ai-IMS5EK2Y.js +0 -2
  719. package/dist/bundle/chunks/google-vertex-O4YJEQUW.js +0 -2
  720. package/dist/bundle/chunks/mistral-conversations-NOSQHBEY.js +0 -5
  721. package/dist/bundle/chunks/openai-responses-HWEUZ6WZ.js +0 -2
  722. package/dist/bundle/chunks/virtual-modules-VHMJYYWQ.js +0 -2
@@ -0,0 +1,117 @@
1
+ import { isModelType, lazyStream, } from "@earendil-works/pi-ai";
2
+ /** API id of virtual catalog entries. Requests for it fail unless routed first. */
3
+ export const VIRTUAL_MODEL_API = "pi-virtual";
4
+ /** Custom entry type that stores router state on the session branch. */
5
+ export const VIRTUAL_MODEL_STATE_ENTRY = "pi.virtual-model-state";
6
+ const THINKING_LEVELS = ["off", "minimal", "low", "medium", "high", "xhigh", "max"];
7
+ /** Whether a model or message names a virtual model. Failed routing leaves the virtual model on its message. */
8
+ export function isVirtualModel(model) {
9
+ return model.api === VIRTUAL_MODEL_API;
10
+ }
11
+ /** Latest successful response. Its model is physical: failed or aborted requests, including failed routing, are skipped. */
12
+ export function findLatestResponse(messages) {
13
+ for (let i = messages.length - 1; i >= 0; i--) {
14
+ const message = messages[i];
15
+ if (message.role === "assistant" && message.stopReason !== "error" && message.stopReason !== "aborted") {
16
+ return message;
17
+ }
18
+ }
19
+ return undefined;
20
+ }
21
+ /**
22
+ * The model selection a session branch records. A virtual `model_change` holds until the next
23
+ * `model_change`, because responses name the physical models it routed to. Otherwise the latest
24
+ * physical response wins, as in sessions without virtual models. A virtual model that is no longer
25
+ * registered does not hold, so the selection falls back to the physical model that answered last.
26
+ */
27
+ export function getBranchSelection(branch, getModel) {
28
+ const isVirtual = (provider, modelId) => {
29
+ const model = getModel(provider, modelId);
30
+ return model !== undefined && isVirtualModel(model);
31
+ };
32
+ let selection;
33
+ for (const entry of branch) {
34
+ if (entry.type === "model_change") {
35
+ selection = { provider: entry.provider, modelId: entry.modelId };
36
+ }
37
+ else if (entry.type === "message" && entry.message.role === "assistant" && !isVirtualModel(entry.message)) {
38
+ if (!selection || !isVirtual(selection.provider, selection.modelId)) {
39
+ selection = { provider: entry.message.provider, modelId: entry.message.model };
40
+ }
41
+ }
42
+ }
43
+ return selection;
44
+ }
45
+ /** Latest router state a session branch stores for a virtual model. */
46
+ export function getVirtualModelState(branch, provider, modelId) {
47
+ for (let i = branch.length - 1; i >= 0; i--) {
48
+ const entry = branch[i];
49
+ if (entry.type !== "custom" || entry.customType !== VIRTUAL_MODEL_STATE_ENTRY)
50
+ continue;
51
+ const data = entry.data;
52
+ if (data?.provider === provider && data.modelId === modelId)
53
+ return data.state;
54
+ }
55
+ return undefined;
56
+ }
57
+ /** Build the catalog entry of a virtual model. */
58
+ export function createVirtualModel(definition) {
59
+ const levels = definition.thinkingLevels ?? ["off"];
60
+ const thinkingLevelMap = {};
61
+ for (const level of THINKING_LEVELS)
62
+ thinkingLevelMap[level] = levels.includes(level) ? level : null;
63
+ return {
64
+ id: definition.id,
65
+ name: definition.name,
66
+ api: VIRTUAL_MODEL_API,
67
+ provider: definition.provider,
68
+ baseUrl: "",
69
+ reasoning: levels.some((level) => level !== "off"),
70
+ thinkingLevelMap,
71
+ input: definition.input ?? ["text", "image"],
72
+ cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
73
+ contextWindow: definition.contextWindow ?? 0,
74
+ maxTokens: definition.maxTokens ?? 0,
75
+ };
76
+ }
77
+ /** Stream for a virtual model that was not routed, e.g. `stream()` with API-specific options. */
78
+ function unroutedStream(model) {
79
+ return lazyStream(model, async () => {
80
+ throw new Error(`Virtual model ${model.provider}/${model.id} must be routed before streaming`);
81
+ });
82
+ }
83
+ /**
84
+ * Add virtual models to a provider's catalog. Without a provider, the result is a keyless provider
85
+ * that only lists the virtual models. A virtual model hides a physical chat model with the same id,
86
+ * which a catalog refresh can add after registration. Availability follows the provider's auth.
87
+ */
88
+ export function withVirtualModels(providerId, provider, virtualModels) {
89
+ if (!provider) {
90
+ return {
91
+ id: providerId,
92
+ name: providerId,
93
+ auth: { apiKey: { name: "Virtual model", resolve: async () => ({ auth: {}, source: "virtual" }) } },
94
+ getModels: () => virtualModels,
95
+ stream: unroutedStream,
96
+ streamSimple: unroutedStream,
97
+ };
98
+ }
99
+ const ids = new Set(virtualModels.map((model) => model.id));
100
+ const physical = (models) => models.filter((model) => !isVirtualModel(model) && !(isModelType(model, "chat") && ids.has(model.id)));
101
+ const virtual = (models) => models.filter((model) => isVirtualModel(model));
102
+ const { filterModels, filterAllModels } = provider;
103
+ return {
104
+ ...provider,
105
+ getModels: () => [...physical(provider.getModels()), ...virtualModels],
106
+ getAllModels: () => [...physical(provider.getAllModels?.() ?? provider.getModels()), ...virtualModels],
107
+ filterModels: (models, credential) => {
108
+ const real = physical(models);
109
+ return [...(filterModels?.(real, credential) ?? real), ...virtual(models)];
110
+ },
111
+ filterAllModels: filterAllModels &&
112
+ ((models, credential) => [...filterAllModels(physical(models), credential), ...virtual(models)]),
113
+ stream: (model, context, options) => isVirtualModel(model) ? unroutedStream(model) : provider.stream(model, context, options),
114
+ streamSimple: (model, context, options) => isVirtualModel(model) ? unroutedStream(model) : provider.streamSimple(model, context, options),
115
+ };
116
+ }
117
+ //# sourceMappingURL=virtual-models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtual-models.js","sourceRoot":"","sources":["../../src/core/virtual-models.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Virtual models are catalog entries that route each request to a physical model.\n *\n * The selection (`model_change`, `agent.state.model`, `ctx.model`) may name a virtual model.\n * Everything below the routing step only sees physical models: providers stream them and\n * assistant messages record them. A virtual model never reaches a provider.\n *\n * Virtual models belong to a provider id but are not provider models. `ModelRuntime` keeps them\n * separately and adds them to the provider's catalog with `withVirtualModels()`, so any provider,\n * including one with physical models, can list several virtual models.\n */\nimport type { AgentMessage } from \"@earendil-works/pi-agent-core\";\nimport {\n\ttype AnyModel,\n\ttype Api,\n\ttype AssistantMessage,\n\ttype AssistantMessageEventStream,\n\tisModelType,\n\tlazyStream,\n\ttype Message,\n\ttype Model,\n\ttype ModelThinkingLevel,\n\ttype Provider,\n\ttype ThinkingLevelMap,\n} from \"@earendil-works/pi-ai\";\nimport type { SessionEntry } from \"./session-manager.ts\";\n\n/** API id of virtual catalog entries. Requests for it fail unless routed first. */\nexport const VIRTUAL_MODEL_API = \"pi-virtual\";\n\n/** Custom entry type that stores router state on the session branch. */\nexport const VIRTUAL_MODEL_STATE_ENTRY = \"pi.virtual-model-state\";\n\n/** Data of a `pi.virtual-model-state` custom entry. */\nexport interface VirtualModelStateData<TState = unknown> {\n\tprovider: string;\n\tmodelId: string;\n\tstate: TState;\n}\n\nconst THINKING_LEVELS: readonly ModelThinkingLevel[] = [\"off\", \"minimal\", \"low\", \"medium\", \"high\", \"xhigh\", \"max\"];\n\n/**\n * Why a request is being routed.\n * - `user`: first request after a message the user wrote (prompt, steering, or follow-up)\n * - `continuation`: any other request in the agent loop, e.g. after tool results or extension messages\n * - `retry`: automatic retry after a failed request, including after compaction for a context overflow\n * - `direct`: a request outside the agent loop, e.g. a compaction summary or an extension call\n */\nexport type ModelRouteReason = \"user\" | \"continuation\" | \"retry\" | \"direct\";\n\nexport interface ModelRouteRequest<TState = unknown> {\n\t/** The selected virtual model. */\n\tmodel: Model<Api>;\n\t/** The selected thinking level. Its meaning is up to the router. */\n\tthinkingLevel: ModelThinkingLevel;\n\treason: ModelRouteReason;\n\t/** Physical model and thinking level of the latest successful response in `messages`. */\n\tprevious?: { model: Model<Api>; thinkingLevel?: ModelThinkingLevel };\n\t/**\n\t * For `retry`: the failed request, which `messages` no longer contains. `message` carries its\n\t * `stopReason` and `errorMessage`. Absent when the router itself failed.\n\t */\n\tfailed?: { model: Model<Api>; thinkingLevel?: ModelThinkingLevel; message: AssistantMessage };\n\t/** Router state last returned on this session branch. Undefined before the first state and for `direct` requests. */\n\tstate?: TState;\n\t/** Conversation for this request, including system messages. */\n\tmessages: readonly Message[];\n\tsignal?: AbortSignal;\n}\n\n/** Physical model and thinking level for one request. */\nexport interface ModelRoute<TState = unknown> {\n\tmodel: Model<Api>;\n\tthinkingLevel: ModelThinkingLevel;\n\t/**\n\t * New router state, stored on the session branch unless it is `request.state` itself. Return\n\t * `request.state` or undefined to keep the current state. Must be JSON-serializable. Ignored for\n\t * `direct` requests.\n\t */\n\tstate?: TState;\n}\n\nexport interface VirtualModelDefinition<TState = unknown> {\n\t/** Provider the virtual model is listed under. May be a provider with physical models. */\n\tprovider: string;\n\t/** Model id. Must not be the id of a physical model of `provider`. */\n\tid: string;\n\tname: string;\n\t/** Thinking levels offered for selection. Defaults to `[\"off\"]`. */\n\tthinkingLevels?: readonly ModelThinkingLevel[];\n\t/**\n\t * Limits shown before the first response. Afterwards, Pi uses the limits of the physical model\n\t * that answered. Unset limits are unknown (0).\n\t */\n\tcontextWindow?: number;\n\tmaxTokens?: number;\n\t/** Input types accepted for selection. Defaults to text and images; routed models without image support get placeholders. */\n\tinput?: (\"text\" | \"image\")[];\n\t/** Pick the physical model, which must have credentials, and thinking level for one request. */\n\troute(request: ModelRouteRequest<TState>): ModelRoute<TState> | Promise<ModelRoute<TState>>;\n}\n\n/** Whether a model or message names a virtual model. Failed routing leaves the virtual model on its message. */\nexport function isVirtualModel(model: { api: string }): boolean {\n\treturn model.api === VIRTUAL_MODEL_API;\n}\n\n/** Latest successful response. Its model is physical: failed or aborted requests, including failed routing, are skipped. */\nexport function findLatestResponse(messages: readonly AgentMessage[]): AssistantMessage | undefined {\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst message = messages[i];\n\t\tif (message.role === \"assistant\" && message.stopReason !== \"error\" && message.stopReason !== \"aborted\") {\n\t\t\treturn message;\n\t\t}\n\t}\n\treturn undefined;\n}\n\n/**\n * The model selection a session branch records. A virtual `model_change` holds until the next\n * `model_change`, because responses name the physical models it routed to. Otherwise the latest\n * physical response wins, as in sessions without virtual models. A virtual model that is no longer\n * registered does not hold, so the selection falls back to the physical model that answered last.\n */\nexport function getBranchSelection(\n\tbranch: readonly SessionEntry[],\n\tgetModel: (provider: string, modelId: string) => Model<Api> | undefined,\n): { provider: string; modelId: string } | undefined {\n\tconst isVirtual = (provider: string, modelId: string) => {\n\t\tconst model = getModel(provider, modelId);\n\t\treturn model !== undefined && isVirtualModel(model);\n\t};\n\tlet selection: { provider: string; modelId: string } | undefined;\n\tfor (const entry of branch) {\n\t\tif (entry.type === \"model_change\") {\n\t\t\tselection = { provider: entry.provider, modelId: entry.modelId };\n\t\t} else if (entry.type === \"message\" && entry.message.role === \"assistant\" && !isVirtualModel(entry.message)) {\n\t\t\tif (!selection || !isVirtual(selection.provider, selection.modelId)) {\n\t\t\t\tselection = { provider: entry.message.provider, modelId: entry.message.model };\n\t\t\t}\n\t\t}\n\t}\n\treturn selection;\n}\n\n/** Latest router state a session branch stores for a virtual model. */\nexport function getVirtualModelState(branch: readonly SessionEntry[], provider: string, modelId: string): unknown {\n\tfor (let i = branch.length - 1; i >= 0; i--) {\n\t\tconst entry = branch[i];\n\t\tif (entry.type !== \"custom\" || entry.customType !== VIRTUAL_MODEL_STATE_ENTRY) continue;\n\t\tconst data = entry.data as VirtualModelStateData | undefined;\n\t\tif (data?.provider === provider && data.modelId === modelId) return data.state;\n\t}\n\treturn undefined;\n}\n\n/** Build the catalog entry of a virtual model. */\nexport function createVirtualModel(definition: Omit<VirtualModelDefinition, \"route\">): Model<Api> {\n\tconst levels = definition.thinkingLevels ?? [\"off\"];\n\tconst thinkingLevelMap: ThinkingLevelMap = {};\n\tfor (const level of THINKING_LEVELS) thinkingLevelMap[level] = levels.includes(level) ? level : null;\n\treturn {\n\t\tid: definition.id,\n\t\tname: definition.name,\n\t\tapi: VIRTUAL_MODEL_API,\n\t\tprovider: definition.provider,\n\t\tbaseUrl: \"\",\n\t\treasoning: levels.some((level) => level !== \"off\"),\n\t\tthinkingLevelMap,\n\t\tinput: definition.input ?? [\"text\", \"image\"],\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: definition.contextWindow ?? 0,\n\t\tmaxTokens: definition.maxTokens ?? 0,\n\t};\n}\n\n/** Stream for a virtual model that was not routed, e.g. `stream()` with API-specific options. */\nfunction unroutedStream(model: Model<Api>): AssistantMessageEventStream {\n\treturn lazyStream(model, async () => {\n\t\tthrow new Error(`Virtual model ${model.provider}/${model.id} must be routed before streaming`);\n\t});\n}\n\n/**\n * Add virtual models to a provider's catalog. Without a provider, the result is a keyless provider\n * that only lists the virtual models. A virtual model hides a physical chat model with the same id,\n * which a catalog refresh can add after registration. Availability follows the provider's auth.\n */\nexport function withVirtualModels(\n\tproviderId: string,\n\tprovider: Provider | undefined,\n\tvirtualModels: readonly Model<Api>[],\n): Provider {\n\tif (!provider) {\n\t\treturn {\n\t\t\tid: providerId,\n\t\t\tname: providerId,\n\t\t\tauth: { apiKey: { name: \"Virtual model\", resolve: async () => ({ auth: {}, source: \"virtual\" }) } },\n\t\t\tgetModels: () => virtualModels,\n\t\t\tstream: unroutedStream,\n\t\t\tstreamSimple: unroutedStream,\n\t\t};\n\t}\n\tconst ids = new Set(virtualModels.map((model) => model.id));\n\tconst physical = <TModel extends AnyModel>(models: readonly TModel[]) =>\n\t\tmodels.filter((model) => !isVirtualModel(model) && !(isModelType(model, \"chat\") && ids.has(model.id)));\n\tconst virtual = <TModel extends AnyModel>(models: readonly TModel[]) =>\n\t\tmodels.filter((model) => isVirtualModel(model));\n\tconst { filterModels, filterAllModels } = provider;\n\treturn {\n\t\t...provider,\n\t\tgetModels: () => [...physical(provider.getModels()), ...virtualModels],\n\t\tgetAllModels: () => [...physical(provider.getAllModels?.() ?? provider.getModels()), ...virtualModels],\n\t\tfilterModels: (models, credential) => {\n\t\t\tconst real = physical(models);\n\t\t\treturn [...(filterModels?.(real, credential) ?? real), ...virtual(models)];\n\t\t},\n\t\tfilterAllModels:\n\t\t\tfilterAllModels &&\n\t\t\t((models, credential) => [...filterAllModels(physical(models), credential), ...virtual(models)]),\n\t\tstream: (model, context, options) =>\n\t\t\tisVirtualModel(model) ? unroutedStream(model) : provider.stream(model, context, options),\n\t\tstreamSimple: (model, context, options) =>\n\t\t\tisVirtualModel(model) ? unroutedStream(model) : provider.streamSimple(model, context, options),\n\t};\n}\n"]}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Runs one codemode script in the sandbox. Split from tool.ts and loaded through
3
+ * execute.lazy.ts so the sandbox runtime only loads when a script runs.
4
+ */
5
+ import type { AgentToolResult } from "@earendil-works/pi-agent-core";
6
+ import type { ExtensionToolContext } from "../../core/extensions/types.ts";
7
+ import type { SessionEntry } from "../../core/session-manager.ts";
8
+ import { type CodemodeToolDetails, type CodemodeToolInput, type CodemodeToolOptions } from "./tool.ts";
9
+ /** Values of `load()`: the `codemode-store` entries on the branch, applied from the root. */
10
+ export declare function readCodemodeStore(branch: readonly SessionEntry[]): Record<string, unknown>;
11
+ /**
12
+ * Run one script. Without a session context (a plain Agent or a direct call) scripts cannot call
13
+ * tools, `store()` starts empty, and writes are dropped.
14
+ */
15
+ export declare function executeCodemode(toolCallId: string, input: CodemodeToolInput, signal: AbortSignal | undefined, onUpdate: ((result: AgentToolResult<CodemodeToolDetails>) => void) | undefined, ctx: ExtensionToolContext | undefined, options?: CodemodeToolOptions): Promise<AgentToolResult<CodemodeToolDetails>>;
16
+ //# sourceMappingURL=execute.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.d.ts","sourceRoot":"","sources":["../../../src/extensions/codemode/execute.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,KAAK,EAAmC,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAYtG,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAGlE,OAAO,EAKN,KAAK,mBAAmB,EACxB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EAIxB,MAAM,WAAW,CAAC;AA+EnB,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,YAAY,EAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAU1F;AAsFD;;;GAGG;AACH,wBAAsB,eAAe,CACpC,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,iBAAiB,EACxB,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,eAAe,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC,GAAG,SAAS,EAC9E,GAAG,EAAE,oBAAoB,GAAG,SAAS,EACrC,OAAO,GAAE,mBAAwB,GAC/B,OAAO,CAAC,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAgG/C"}
@@ -0,0 +1,390 @@
1
+ /**
2
+ * Runs one codemode script in the sandbox. Split from tool.ts and loaded through
3
+ * execute.lazy.ts so the sandbox runtime only loads when a script runs.
4
+ */
5
+ import { randomBytes } from "node:crypto";
6
+ import { writeFile } from "node:fs/promises";
7
+ import { tmpdir } from "node:os";
8
+ import { join } from "node:path";
9
+ import { CodemodeSandbox, loadQuickJSWasm, parseCodemodeSource, renderToolSample, toCodemodeIdentifier, } from "@earendil-works/pi-codemode";
10
+ import { getCodemodeWorkerUrl, getQuickJSWasmPath } from "../../config.js";
11
+ import { combineUsage } from "../../core/usage-totals.js";
12
+ import { Bm25Ranker, createToolSearchDocument, DEFAULT_TOOL_SEARCH_LIMIT } from "../tool-search/tool.js";
13
+ import { CODEMODE_STORE_ENTRY_TYPE, getCodemodeCallableTools, MODEL_GLOBAL_DECLARATIONS, toCodemodeDeclaration, } from "./tool.js";
14
+ const ARGS_PREVIEW_CHARS = 200;
15
+ const ERROR_PREVIEW_CHARS = 500;
16
+ /** Classifier calls one script may have in flight; `Promise.all` over many items queues the rest. */
17
+ const MAX_CONCURRENT_MODEL_CALLS = 4;
18
+ /**
19
+ * Heap limit for the QuickJS VM. The worker shares pi's process, so without a limit a runaway
20
+ * script can grow to wasm32's 4 GiB and take the session down. Overruns throw
21
+ * `InternalError: out of memory` inside the script.
22
+ */
23
+ const CODEMODE_MEMORY_LIMIT_BYTES = 256 * 1024 * 1024;
24
+ const MODEL_TYPES = new Set(["chat", "image", "classifier"]);
25
+ function truncateText(text, maxChars) {
26
+ return text.length > maxChars ? `${text.slice(0, maxChars - 3)}...` : text;
27
+ }
28
+ function previewArgs(args) {
29
+ if (args === undefined)
30
+ return "";
31
+ try {
32
+ return truncateText(JSON.stringify(args) ?? "", ARGS_PREVIEW_CHARS);
33
+ }
34
+ catch {
35
+ return "";
36
+ }
37
+ }
38
+ function textOf(result) {
39
+ return (result.content ?? [])
40
+ .filter((block) => block.type === "text")
41
+ .map((block) => block.text)
42
+ .join("\n");
43
+ }
44
+ function toModelType(value) {
45
+ if (typeof value === "string" && MODEL_TYPES.has(value))
46
+ return value;
47
+ throw new Error(`Unknown model type ${JSON.stringify(value)}. Use "chat", "image", or "classifier".`);
48
+ }
49
+ function toProvider(value) {
50
+ if (value === undefined || value === null)
51
+ return undefined;
52
+ if (typeof value !== "string")
53
+ throw new Error("provider must be a string");
54
+ return value;
55
+ }
56
+ /** Catalog entry for scripts. `headers` is dropped because models.json headers can carry credentials. */
57
+ function toModelInfo(model) {
58
+ const info = { ...model };
59
+ delete info.headers;
60
+ return info;
61
+ }
62
+ /** Runs at most `limit` calls at once, in call order. */
63
+ function createLimiter(limit) {
64
+ let active = 0;
65
+ const waiting = [];
66
+ return async (run) => {
67
+ if (active >= limit)
68
+ await new Promise((resolve) => waiting.push(resolve));
69
+ active++;
70
+ try {
71
+ return await run();
72
+ }
73
+ finally {
74
+ active--;
75
+ waiting.shift()?.();
76
+ }
77
+ };
78
+ }
79
+ function isStoreEntryData(data) {
80
+ if (typeof data !== "object" || data === null)
81
+ return false;
82
+ const { set, delete: deleted } = data;
83
+ return (typeof set === "object" &&
84
+ set !== null &&
85
+ Array.isArray(deleted) &&
86
+ deleted.every((key) => typeof key === "string"));
87
+ }
88
+ /** Values of `load()`: the `codemode-store` entries on the branch, applied from the root. */
89
+ export function readCodemodeStore(branch) {
90
+ const store = new Map();
91
+ for (const entry of branch) {
92
+ if (entry.type !== "custom" || entry.customType !== CODEMODE_STORE_ENTRY_TYPE || !isStoreEntryData(entry.data)) {
93
+ continue;
94
+ }
95
+ for (const key of entry.data.delete)
96
+ store.delete(key);
97
+ for (const [key, value] of Object.entries(entry.data.set))
98
+ store.set(key, value);
99
+ }
100
+ return Object.fromEntries(store);
101
+ }
102
+ /** Default token budget for script output. */
103
+ const DEFAULT_MAX_OUTPUT_TOKENS = 10_000;
104
+ /** Characters per token when estimating. */
105
+ const CHARS_PER_TOKEN = 4;
106
+ /** Like the script's `text()`: strings as is, other values as compact JSON. */
107
+ function valueText(value) {
108
+ if (typeof value === "string")
109
+ return value;
110
+ return JSON.stringify(value) ?? String(value);
111
+ }
112
+ function formatCallSummary(calls) {
113
+ if (calls.length === 0)
114
+ return "No tool calls were made.";
115
+ return `Tool calls made before the failure (they are not undone): ${calls.map((call) => `${call.name} (${call.status})`).join(", ")}`;
116
+ }
117
+ function formatError(result, calls) {
118
+ const { error } = result;
119
+ const head = error.kind === "script"
120
+ ? (error.stack ?? `${error.name ?? "Error"}: ${error.message}`)
121
+ : error.kind === "timeout"
122
+ ? `Script timed out: ${error.message}`
123
+ : error.kind === "aborted"
124
+ ? `Script aborted: ${error.message}`
125
+ : `Script sandbox failed: ${error.message}`;
126
+ return `${head}\n\n${formatCallSummary(calls)}`;
127
+ }
128
+ /** Write the full text output to a temp file, like bash does for truncated output. */
129
+ async function spillOutput(text) {
130
+ const path = join(tmpdir(), `pi-codemode-${randomBytes(8).toString("hex")}.txt`);
131
+ try {
132
+ await writeFile(path, text);
133
+ return { path };
134
+ }
135
+ catch (error) {
136
+ return { error: error instanceof Error ? error.message : String(error) };
137
+ }
138
+ }
139
+ /**
140
+ * Apply the token budget: when the combined text exceeds it, the text items become one
141
+ * item that keeps the start and end of the text, and images follow it. The full text is written to
142
+ * a temp file.
143
+ */
144
+ async function truncateOutput(items, maxTokens) {
145
+ const texts = items.filter((item) => item.type === "text").map((item) => item.text);
146
+ const combined = texts.join("\n");
147
+ const budget = maxTokens * CHARS_PER_TOKEN;
148
+ if (texts.length === 0 || combined.length <= budget)
149
+ return { items };
150
+ const headChars = Math.floor(budget / 2);
151
+ const tailChars = budget - headChars;
152
+ const removed = combined.length - headChars - tailChars;
153
+ const head = combined.slice(0, headChars);
154
+ const tail = tailChars > 0 ? combined.slice(-tailChars) : "";
155
+ let text = `Warning: truncated output (original token count: ${Math.ceil(combined.length / CHARS_PER_TOKEN)})\nTotal output lines: ${combined.split("\n").length}\n\n${head}…${Math.ceil(removed / CHARS_PER_TOKEN)} tokens truncated…${tail}`;
156
+ const spilled = await spillOutput(combined);
157
+ text +=
158
+ "path" in spilled
159
+ ? `\n\n[Full output: ${spilled.path} (read with offset/limit)]`
160
+ : `\n\n[Could not save the full output: ${spilled.error}]`;
161
+ return {
162
+ items: [{ type: "text", text }, ...items.filter((item) => item.type === "image")],
163
+ ...("path" in spilled ? { fullOutputPath: spilled.path } : {}),
164
+ };
165
+ }
166
+ /**
167
+ * The value a script receives for a nested call: a tool that declares
168
+ * `outputSchema` resolves to its `structuredContent`, also for error results that carry one (such
169
+ * as MCP results with `isError`); any other tool resolves to its text content. Other failures
170
+ * reject with the tool's error text.
171
+ */
172
+ function toScriptValue(tool, outcome) {
173
+ const { result } = outcome;
174
+ if (tool.outputSchema && result.structuredContent !== undefined)
175
+ return result.structuredContent;
176
+ const text = textOf(result);
177
+ if (outcome.isError)
178
+ throw new Error(text || `Tool "${tool.name}" failed`);
179
+ return text;
180
+ }
181
+ /**
182
+ * Run one script. Without a session context (a plain Agent or a direct call) scripts cannot call
183
+ * tools, `store()` starts empty, and writes are dropped.
184
+ */
185
+ export async function executeCodemode(toolCallId, input, signal, onUpdate, ctx, options = {}) {
186
+ const startedAt = performance.now();
187
+ const { code, options: sourceOptions } = parseCodemodeSource(input.code);
188
+ const calls = [];
189
+ // Usage of the script's `models.*` calls. Nested tool calls report theirs through the session.
190
+ let modelUsage;
191
+ const addModelUsage = (usage) => {
192
+ modelUsage = modelUsage ? combineUsage(modelUsage, usage) : usage;
193
+ };
194
+ const snapshot = () => ({ calls: calls.map((call) => ({ ...call })) });
195
+ const publish = () => onUpdate?.({ content: [], details: snapshot() });
196
+ const callable = ctx ? getCodemodeCallableTools(ctx.tools) : [];
197
+ // ALL_TOOLS entries carry the declaration.
198
+ const samples = new Map(callable.map((tool) => [tool.name, renderToolSample(toCodemodeDeclaration(tool))]));
199
+ const sandboxTools = callable.map((tool) => ({
200
+ name: tool.name,
201
+ description: samples.get(tool.name),
202
+ execute: async (args, { signal: callSignal }) => {
203
+ const record = {
204
+ id: `${toolCallId}/?`,
205
+ name: tool.name,
206
+ args: previewArgs(args),
207
+ status: "running",
208
+ };
209
+ calls.push(record);
210
+ publish();
211
+ const callStartedAt = performance.now();
212
+ // Only tools from ctx.tools are callable, so ctx is set here.
213
+ if (!ctx)
214
+ throw new Error("Tool calls need a session");
215
+ const outcome = await ctx.executeTool(tool.name, args, { signal: callSignal });
216
+ record.id = outcome.toolCall.id;
217
+ record.durationMs = performance.now() - callStartedAt;
218
+ if (outcome.isError) {
219
+ record.status = callSignal.aborted ? "cancelled" : "error";
220
+ record.error = truncateText(textOf(outcome.result) || `Tool "${tool.name}" failed`, ERROR_PREVIEW_CHARS);
221
+ }
222
+ else {
223
+ record.status = "ok";
224
+ }
225
+ publish();
226
+ return toScriptValue(tool, outcome);
227
+ },
228
+ }));
229
+ const sandbox = new CodemodeSandbox({
230
+ tools: sandboxTools,
231
+ globals: [
232
+ ...createDiscoveryGlobals(callable, samples, options),
233
+ ...(options.models && ctx
234
+ ? createModelGlobals(ctx.modelRegistry, toolCallId, calls, publish, addModelUsage)
235
+ : []),
236
+ ],
237
+ timeoutMs: sourceOptions.timeoutMs ?? Number.POSITIVE_INFINITY,
238
+ memoryLimitBytes: CODEMODE_MEMORY_LIMIT_BYTES,
239
+ wasm: loadQuickJSWasm(getQuickJSWasmPath()),
240
+ workerUrl: getCodemodeWorkerUrl(),
241
+ });
242
+ let result;
243
+ try {
244
+ const store = ctx ? readCodemodeStore(ctx.sessionManager.getBranch()) : {};
245
+ result = await sandbox.execute(code, { signal, store });
246
+ }
247
+ finally {
248
+ await sandbox.close();
249
+ }
250
+ // Calls still marked running were cut off by the script ending, a timeout, or an abort.
251
+ for (const call of calls) {
252
+ if (call.status === "running")
253
+ call.status = "cancelled";
254
+ }
255
+ const items = result.output.map((item) => item.type === "text" ? { type: "text", text: item.text } : item);
256
+ if (result.ok) {
257
+ const { set, delete: deleted } = result.storeWrites;
258
+ if (Object.keys(set).length > 0 || deleted.length > 0) {
259
+ options.appendEntry?.(CODEMODE_STORE_ENTRY_TYPE, { set, delete: deleted });
260
+ }
261
+ // pi extension: a returned value is appended like text().
262
+ if (result.value !== undefined)
263
+ items.push({ type: "text", text: valueText(result.value) });
264
+ }
265
+ else {
266
+ items.push({ type: "text", text: `Script error:\n${formatError(result, calls)}` });
267
+ }
268
+ const truncated = await truncateOutput(items, sourceOptions.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS);
269
+ const wallTime = ((performance.now() - startedAt) / 1000).toFixed(1);
270
+ const header = `${result.ok ? "Script completed" : "Script failed"}\nWall time ${wallTime} seconds\nOutput:\n`;
271
+ const details = snapshot();
272
+ if (truncated.fullOutputPath)
273
+ details.fullOutputPath = truncated.fullOutputPath;
274
+ return {
275
+ content: [{ type: "text", text: header }, ...truncated.items],
276
+ details,
277
+ ...(modelUsage ? { usage: modelUsage } : {}),
278
+ ...(result.ok ? {} : { isError: true }),
279
+ };
280
+ }
281
+ /** `searchTools()` and `describeTool()`: ranked search and lookup over the script's nested tools. */
282
+ function createDiscoveryGlobals(tools, samples, options) {
283
+ const ranker = new Bm25Ranker();
284
+ const entry = (name) => ({ name: toCodemodeIdentifier(name), description: samples.get(name) ?? "" });
285
+ return [
286
+ {
287
+ name: "searchTools",
288
+ spread: true,
289
+ execute: (args) => {
290
+ const [query, searchOptions] = args;
291
+ if (typeof query !== "string")
292
+ throw new Error("searchTools() expects a query string");
293
+ const limit = searchOptions?.limit ?? DEFAULT_TOOL_SEARCH_LIMIT;
294
+ if (typeof limit !== "number" || !Number.isInteger(limit) || limit <= 0) {
295
+ throw new Error("searchTools() limit must be a positive integer");
296
+ }
297
+ const namespace = searchOptions?.namespace;
298
+ if (namespace !== undefined && namespace !== null && typeof namespace !== "string") {
299
+ throw new Error("searchTools() namespace must be a string");
300
+ }
301
+ const documents = tools.flatMap((tool) => {
302
+ const toolNamespace = options.getToolNamespace?.(tool.name);
303
+ if (namespace && toolNamespace?.name !== namespace)
304
+ return [];
305
+ return [createToolSearchDocument(tool, toolNamespace)];
306
+ });
307
+ return ranker.rank(query, documents, limit).map((match) => entry(match.name));
308
+ },
309
+ },
310
+ {
311
+ name: "describeTool",
312
+ spread: true,
313
+ execute: (args) => {
314
+ const [name] = args;
315
+ if (typeof name !== "string")
316
+ throw new Error("describeTool() expects a tool name");
317
+ const tool = tools.find((candidate) => candidate.name === name || toCodemodeIdentifier(candidate.name) === name);
318
+ return tool ? samples.get(tool.name) : undefined;
319
+ },
320
+ },
321
+ ];
322
+ }
323
+ /**
324
+ * `models.*` for scripts: the model registry methods declared in {@link MODEL_GLOBAL_DECLARATIONS}.
325
+ * Classifier calls appear as nested call rows so the renderer shows them, and their usage goes to
326
+ * `addUsage`.
327
+ */
328
+ function createModelGlobals(models, toolCallId, calls, publish, addUsage) {
329
+ const limit = createLimiter(MAX_CONCURRENT_MODEL_CALLS);
330
+ let classifyCount = 0;
331
+ const implementations = {
332
+ "models.getModelsOfType": (args) => {
333
+ const [type, provider] = args;
334
+ return models.getModelsOfType(toModelType(type), toProvider(provider)).map(toModelInfo);
335
+ },
336
+ "models.getAvailableOfType": async (args, { signal }) => {
337
+ const [type, provider] = args;
338
+ const available = await models.getAvailableOfType(toModelType(type), toProvider(provider), { signal });
339
+ return available.map(toModelInfo);
340
+ },
341
+ "models.getModelOfType": (args) => {
342
+ const [type, provider, id] = args;
343
+ if (typeof provider !== "string" || typeof id !== "string") {
344
+ throw new Error("models.getModelOfType() expects a type, a provider, and an id");
345
+ }
346
+ const model = models.getModelOfType(toModelType(type), provider, id);
347
+ return model === undefined ? undefined : toModelInfo(model);
348
+ },
349
+ "models.classify": async (args, { signal }) => {
350
+ const [model, context] = args;
351
+ const ref = model;
352
+ if (typeof ref !== "object" ||
353
+ ref === null ||
354
+ typeof ref.provider !== "string" ||
355
+ typeof ref.id !== "string") {
356
+ throw new Error("models.classify() expects a model from models.getModelOfType() or models.getAvailableOfType()");
357
+ }
358
+ // Only provider and id count. A script-supplied baseUrl or headers must never receive the credentials.
359
+ const resolved = models.getModelOfType("classifier", ref.provider, ref.id);
360
+ if (!resolved)
361
+ throw new Error(`Unknown classifier model "${ref.provider}/${ref.id}"`);
362
+ const record = {
363
+ id: `${toolCallId}/models.classify/${++classifyCount}`,
364
+ name: "models.classify",
365
+ args: `${resolved.provider}/${resolved.id}`,
366
+ status: "running",
367
+ };
368
+ calls.push(record);
369
+ publish();
370
+ const startedAt = performance.now();
371
+ const result = await limit(() => models.classify(resolved, context, { signal }));
372
+ record.durationMs = performance.now() - startedAt;
373
+ record.status = result.stopReason === "stop" ? "ok" : result.stopReason === "aborted" ? "cancelled" : "error";
374
+ if (result.errorMessage)
375
+ record.error = truncateText(result.errorMessage, ERROR_PREVIEW_CHARS);
376
+ if (result.usage) {
377
+ record.cost = result.usage.cost.total;
378
+ addUsage(result.usage);
379
+ }
380
+ publish();
381
+ return result;
382
+ },
383
+ };
384
+ return MODEL_GLOBAL_DECLARATIONS.map((declaration) => ({
385
+ name: declaration.name,
386
+ spread: true,
387
+ execute: implementations[declaration.name],
388
+ }));
389
+ }
390
+ //# sourceMappingURL=execute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"execute.js","sourceRoot":"","sources":["../../../src/extensions/codemode/execute.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Runs one codemode script in the sandbox. Split from tool.ts and loaded through\n * execute.lazy.ts so the sandbox runtime only loads when a script runs.\n */\n\nimport { randomBytes } from \"node:crypto\";\nimport { writeFile } from \"node:fs/promises\";\nimport { tmpdir } from \"node:os\";\nimport { join } from \"node:path\";\nimport type { AgentTool, AgentToolCallOutcome, AgentToolResult } from \"@earendil-works/pi-agent-core\";\nimport type { AnyModel, ClassifierContext, ImageContent, ModelType, TextContent, Usage } from \"@earendil-works/pi-ai\";\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.ts\";\nimport type { ExtensionToolContext } from \"../../core/extensions/types.ts\";\nimport type { SessionEntry } from \"../../core/session-manager.ts\";\nimport { combineUsage } from \"../../core/usage-totals.ts\";\nimport { Bm25Ranker, createToolSearchDocument, DEFAULT_TOOL_SEARCH_LIMIT } from \"../tool-search/tool.ts\";\nimport {\n\tCODEMODE_STORE_ENTRY_TYPE,\n\ttype CodemodeModelRuntime,\n\ttype CodemodeNestedCall,\n\ttype CodemodeStoreEntryData,\n\ttype CodemodeToolDetails,\n\ttype CodemodeToolInput,\n\ttype CodemodeToolOptions,\n\tgetCodemodeCallableTools,\n\tMODEL_GLOBAL_DECLARATIONS,\n\ttoCodemodeDeclaration,\n} from \"./tool.ts\";\n\nconst ARGS_PREVIEW_CHARS = 200;\nconst ERROR_PREVIEW_CHARS = 500;\n/** Classifier calls one script may have in flight; `Promise.all` over many items queues the rest. */\nconst MAX_CONCURRENT_MODEL_CALLS = 4;\n/**\n * Heap limit for the QuickJS VM. The worker shares pi's process, so without a limit a runaway\n * script can grow to wasm32's 4 GiB and take the session down. Overruns throw\n * `InternalError: out of memory` inside the script.\n */\nconst CODEMODE_MEMORY_LIMIT_BYTES = 256 * 1024 * 1024;\nconst MODEL_TYPES: ReadonlySet<string> = new Set<ModelType>([\"chat\", \"image\", \"classifier\"]);\n\nfunction truncateText(text: string, maxChars: number): string {\n\treturn text.length > maxChars ? `${text.slice(0, maxChars - 3)}...` : text;\n}\n\nfunction previewArgs(args: unknown): string {\n\tif (args === undefined) return \"\";\n\ttry {\n\t\treturn truncateText(JSON.stringify(args) ?? \"\", ARGS_PREVIEW_CHARS);\n\t} catch {\n\t\treturn \"\";\n\t}\n}\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\nfunction toModelType(value: unknown): ModelType {\n\tif (typeof value === \"string\" && MODEL_TYPES.has(value)) return value as ModelType;\n\tthrow new Error(`Unknown model type ${JSON.stringify(value)}. Use \"chat\", \"image\", or \"classifier\".`);\n}\n\nfunction toProvider(value: unknown): string | undefined {\n\tif (value === undefined || value === null) return undefined;\n\tif (typeof value !== \"string\") throw new Error(\"provider must be a string\");\n\treturn value;\n}\n\n/** Catalog entry for scripts. `headers` is dropped because models.json headers can carry credentials. */\nfunction toModelInfo(model: AnyModel): Record<string, unknown> {\n\tconst info: Record<string, unknown> = { ...model };\n\tdelete info.headers;\n\treturn info;\n}\n\n/** Runs at most `limit` calls at once, in call order. */\nfunction createLimiter(limit: number): <T>(run: () => Promise<T>) => Promise<T> {\n\tlet active = 0;\n\tconst waiting: (() => void)[] = [];\n\treturn async (run) => {\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}\n\nfunction isStoreEntryData(data: unknown): data is CodemodeStoreEntryData {\n\tif (typeof data !== \"object\" || data === null) return false;\n\tconst { set, delete: deleted } = data as Partial<CodemodeStoreEntryData>;\n\treturn (\n\t\ttypeof set === \"object\" &&\n\t\tset !== null &&\n\t\tArray.isArray(deleted) &&\n\t\tdeleted.every((key: unknown) => typeof key === \"string\")\n\t);\n}\n\n/** Values of `load()`: the `codemode-store` entries on the branch, applied from the root. */\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 (entry.type !== \"custom\" || entry.customType !== CODEMODE_STORE_ENTRY_TYPE || !isStoreEntryData(entry.data)) {\n\t\t\tcontinue;\n\t\t}\n\t\tfor (const key of entry.data.delete) store.delete(key);\n\t\tfor (const [key, value] of Object.entries(entry.data.set)) store.set(key, value);\n\t}\n\treturn Object.fromEntries(store);\n}\n\n/** Default token budget for script output. */\nconst DEFAULT_MAX_OUTPUT_TOKENS = 10_000;\n/** Characters per token when estimating. */\nconst CHARS_PER_TOKEN = 4;\n\n/** Like the script's `text()`: strings as is, other values as compact JSON. */\nfunction valueText(value: unknown): string {\n\tif (typeof value === \"string\") return value;\n\treturn JSON.stringify(value) ?? String(value);\n}\n\nfunction formatCallSummary(calls: readonly CodemodeNestedCall[]): string {\n\tif (calls.length === 0) return \"No tool calls were made.\";\n\treturn `Tool calls made before the failure (they are not undone): ${calls.map((call) => `${call.name} (${call.status})`).join(\", \")}`;\n}\n\nfunction formatError(result: Extract<CodemodeResult, { ok: false }>, calls: readonly CodemodeNestedCall[]): string {\n\tconst { error } = result;\n\tconst head =\n\t\terror.kind === \"script\"\n\t\t\t? (error.stack ?? `${error.name ?? \"Error\"}: ${error.message}`)\n\t\t\t: error.kind === \"timeout\"\n\t\t\t\t? `Script timed out: ${error.message}`\n\t\t\t\t: error.kind === \"aborted\"\n\t\t\t\t\t? `Script aborted: ${error.message}`\n\t\t\t\t\t: `Script sandbox failed: ${error.message}`;\n\treturn `${head}\\n\\n${formatCallSummary(calls)}`;\n}\n\n/** Write the full text output to a temp file, like bash does for truncated output. */\nasync function spillOutput(text: string): Promise<{ path: string } | { error: string }> {\n\tconst path = join(tmpdir(), `pi-codemode-${randomBytes(8).toString(\"hex\")}.txt`);\n\ttry {\n\t\tawait writeFile(path, text);\n\t\treturn { path };\n\t} catch (error) {\n\t\treturn { error: error instanceof Error ? error.message : String(error) };\n\t}\n}\n\n/**\n * Apply the token budget: when the combined text exceeds it, the text items become one\n * item that keeps the start and end of the text, and images follow it. The full text is written to\n * a temp file.\n */\nasync function truncateOutput(\n\titems: (TextContent | ImageContent)[],\n\tmaxTokens: number,\n): Promise<{ items: (TextContent | ImageContent)[]; fullOutputPath?: string }> {\n\tconst texts = items.filter((item): item is TextContent => item.type === \"text\").map((item) => item.text);\n\tconst combined = texts.join(\"\\n\");\n\tconst budget = maxTokens * CHARS_PER_TOKEN;\n\tif (texts.length === 0 || combined.length <= budget) return { items };\n\tconst headChars = Math.floor(budget / 2);\n\tconst tailChars = budget - headChars;\n\tconst removed = combined.length - headChars - tailChars;\n\tconst head = combined.slice(0, headChars);\n\tconst tail = tailChars > 0 ? combined.slice(-tailChars) : \"\";\n\tlet text = `Warning: truncated output (original token count: ${Math.ceil(combined.length / CHARS_PER_TOKEN)})\\nTotal output lines: ${combined.split(\"\\n\").length}\\n\\n${head}…${Math.ceil(removed / CHARS_PER_TOKEN)} tokens truncated…${tail}`;\n\tconst spilled = await spillOutput(combined);\n\ttext +=\n\t\t\"path\" in spilled\n\t\t\t? `\\n\\n[Full output: ${spilled.path} (read with offset/limit)]`\n\t\t\t: `\\n\\n[Could not save the full output: ${spilled.error}]`;\n\treturn {\n\t\titems: [{ type: \"text\", text }, ...items.filter((item) => item.type === \"image\")],\n\t\t...(\"path\" in spilled ? { fullOutputPath: spilled.path } : {}),\n\t};\n}\n\n/**\n * The value a script receives for a nested call: a tool that declares\n * `outputSchema` resolves to its `structuredContent`, also for error results that carry one (such\n * as MCP results with `isError`); any other tool resolves to its text content. Other failures\n * reject with the tool's error text.\n */\nfunction toScriptValue(tool: AgentTool<any>, outcome: AgentToolCallOutcome): unknown {\n\tconst { result } = outcome;\n\tif (tool.outputSchema && result.structuredContent !== undefined) return result.structuredContent;\n\tconst text = textOf(result);\n\tif (outcome.isError) throw new Error(text || `Tool \"${tool.name}\" failed`);\n\treturn text;\n}\n\n/**\n * Run one script. Without a session context (a plain Agent or a direct call) scripts cannot call\n * tools, `store()` starts empty, and writes are dropped.\n */\nexport async function executeCodemode(\n\ttoolCallId: string,\n\tinput: CodemodeToolInput,\n\tsignal: AbortSignal | undefined,\n\tonUpdate: ((result: AgentToolResult<CodemodeToolDetails>) => void) | undefined,\n\tctx: ExtensionToolContext | undefined,\n\toptions: CodemodeToolOptions = {},\n): Promise<AgentToolResult<CodemodeToolDetails>> {\n\tconst startedAt = performance.now();\n\tconst { code, options: sourceOptions } = parseCodemodeSource(input.code);\n\tconst calls: CodemodeNestedCall[] = [];\n\t// Usage of the script's `models.*` calls. Nested tool calls report theirs through the session.\n\tlet modelUsage: Usage | undefined;\n\tconst addModelUsage = (usage: Usage) => {\n\t\tmodelUsage = modelUsage ? combineUsage(modelUsage, usage) : usage;\n\t};\n\n\tconst snapshot = (): CodemodeToolDetails => ({ calls: calls.map((call) => ({ ...call })) });\n\tconst publish = () => onUpdate?.({ content: [], details: snapshot() });\n\n\tconst callable = ctx ? getCodemodeCallableTools(ctx.tools) : [];\n\t// ALL_TOOLS entries carry the declaration.\n\tconst samples = new Map(callable.map((tool) => [tool.name, renderToolSample(toCodemodeDeclaration(tool))]));\n\tconst sandboxTools: CodemodeTool[] = callable.map((tool) => ({\n\t\tname: tool.name,\n\t\tdescription: samples.get(tool.name),\n\t\texecute: async (args, { signal: callSignal }) => {\n\t\t\tconst record: CodemodeNestedCall = {\n\t\t\t\tid: `${toolCallId}/?`,\n\t\t\t\tname: tool.name,\n\t\t\t\targs: previewArgs(args),\n\t\t\t\tstatus: \"running\",\n\t\t\t};\n\t\t\tcalls.push(record);\n\t\t\tpublish();\n\t\t\tconst callStartedAt = performance.now();\n\t\t\t// Only tools from ctx.tools are callable, so ctx is set here.\n\t\t\tif (!ctx) throw new Error(\"Tool calls need a session\");\n\t\t\tconst outcome = await ctx.executeTool(tool.name, args, { signal: callSignal });\n\t\t\trecord.id = outcome.toolCall.id;\n\t\t\trecord.durationMs = performance.now() - callStartedAt;\n\t\t\tif (outcome.isError) {\n\t\t\t\trecord.status = callSignal.aborted ? \"cancelled\" : \"error\";\n\t\t\t\trecord.error = truncateText(textOf(outcome.result) || `Tool \"${tool.name}\" failed`, ERROR_PREVIEW_CHARS);\n\t\t\t} else {\n\t\t\t\trecord.status = \"ok\";\n\t\t\t}\n\t\t\tpublish();\n\t\t\treturn toScriptValue(tool, outcome);\n\t\t},\n\t}));\n\n\tconst sandbox = new CodemodeSandbox({\n\t\ttools: sandboxTools,\n\t\tglobals: [\n\t\t\t...createDiscoveryGlobals(callable, samples, options),\n\t\t\t...(options.models && ctx\n\t\t\t\t? createModelGlobals(ctx.modelRegistry, toolCallId, calls, publish, addModelUsage)\n\t\t\t\t: []),\n\t\t],\n\t\ttimeoutMs: sourceOptions.timeoutMs ?? Number.POSITIVE_INFINITY,\n\t\tmemoryLimitBytes: CODEMODE_MEMORY_LIMIT_BYTES,\n\t\twasm: loadQuickJSWasm(getQuickJSWasmPath()),\n\t\tworkerUrl: getCodemodeWorkerUrl(),\n\t});\n\n\tlet result: CodemodeResult;\n\ttry {\n\t\tconst store = ctx ? readCodemodeStore(ctx.sessionManager.getBranch()) : {};\n\t\tresult = await sandbox.execute(code, { signal, store });\n\t} finally {\n\t\tawait sandbox.close();\n\t}\n\t// Calls still marked running were cut off by the script ending, a timeout, or an abort.\n\tfor (const call of calls) {\n\t\tif (call.status === \"running\") call.status = \"cancelled\";\n\t}\n\n\tconst items: (TextContent | ImageContent)[] = result.output.map((item) =>\n\t\titem.type === \"text\" ? { type: \"text\", text: item.text } : item,\n\t);\n\tif (result.ok) {\n\t\tconst { set, delete: deleted } = result.storeWrites;\n\t\tif (Object.keys(set).length > 0 || deleted.length > 0) {\n\t\t\toptions.appendEntry?.(CODEMODE_STORE_ENTRY_TYPE, { set, delete: deleted });\n\t\t}\n\t\t// pi extension: a returned value is appended like text().\n\t\tif (result.value !== undefined) items.push({ type: \"text\", text: valueText(result.value) });\n\t} else {\n\t\titems.push({ type: \"text\", text: `Script error:\\n${formatError(result, calls)}` });\n\t}\n\n\tconst truncated = await truncateOutput(items, sourceOptions.maxOutputTokens ?? DEFAULT_MAX_OUTPUT_TOKENS);\n\tconst wallTime = ((performance.now() - startedAt) / 1000).toFixed(1);\n\tconst header = `${result.ok ? \"Script completed\" : \"Script failed\"}\\nWall time ${wallTime} seconds\\nOutput:\\n`;\n\tconst details = snapshot();\n\tif (truncated.fullOutputPath) details.fullOutputPath = truncated.fullOutputPath;\n\treturn {\n\t\tcontent: [{ type: \"text\", text: header }, ...truncated.items],\n\t\tdetails,\n\t\t...(modelUsage ? { usage: modelUsage } : {}),\n\t\t...(result.ok ? {} : { isError: true }),\n\t};\n}\n\n/** `searchTools()` and `describeTool()`: ranked search and lookup over the script's nested tools. */\nfunction createDiscoveryGlobals(\n\ttools: readonly AgentTool<any>[],\n\tsamples: ReadonlyMap<string, string>,\n\toptions: CodemodeToolOptions,\n): CodemodeTool[] {\n\tconst ranker = new Bm25Ranker();\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, searchOptions] = 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 = searchOptions?.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\t}\n\t\t\t\tconst namespace = searchOptions?.namespace;\n\t\t\t\tif (namespace !== undefined && namespace !== null && typeof namespace !== \"string\") {\n\t\t\t\t\tthrow new Error(\"searchTools() namespace must be a string\");\n\t\t\t\t}\n\t\t\t\tconst documents = tools.flatMap((tool) => {\n\t\t\t\t\tconst toolNamespace = options.getToolNamespace?.(tool.name);\n\t\t\t\t\tif (namespace && toolNamespace?.name !== namespace) return [];\n\t\t\t\t\treturn [createToolSearchDocument(tool, toolNamespace)];\n\t\t\t\t});\n\t\t\t\treturn ranker.rank(query, documents, 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(\n\t\t\t\t\t(candidate) => candidate.name === name || toCodemodeIdentifier(candidate.name) === name,\n\t\t\t\t);\n\t\t\t\treturn tool ? samples.get(tool.name) : undefined;\n\t\t\t},\n\t\t},\n\t];\n}\n\n/**\n * `models.*` for scripts: the model registry methods declared in {@link MODEL_GLOBAL_DECLARATIONS}.\n * Classifier calls appear as nested call rows so the renderer shows them, and their usage goes to\n * `addUsage`.\n */\nfunction createModelGlobals(\n\tmodels: CodemodeModelRuntime,\n\ttoolCallId: string,\n\tcalls: CodemodeNestedCall[],\n\tpublish: () => void,\n\taddUsage: (usage: Usage) => void,\n): CodemodeTool[] {\n\tconst limit = createLimiter(MAX_CONCURRENT_MODEL_CALLS);\n\tlet classifyCount = 0;\n\tconst implementations: Record<string, CodemodeTool[\"execute\"]> = {\n\t\t\"models.getModelsOfType\": (args) => {\n\t\t\tconst [type, provider] = args as unknown[];\n\t\t\treturn models.getModelsOfType(toModelType(type), toProvider(provider)).map(toModelInfo);\n\t\t},\n\t\t\"models.getAvailableOfType\": async (args, { signal }) => {\n\t\t\tconst [type, provider] = args as unknown[];\n\t\t\tconst available = await models.getAvailableOfType(toModelType(type), toProvider(provider), { signal });\n\t\t\treturn available.map(toModelInfo);\n\t\t},\n\t\t\"models.getModelOfType\": (args) => {\n\t\t\tconst [type, provider, id] = args as unknown[];\n\t\t\tif (typeof provider !== \"string\" || typeof id !== \"string\") {\n\t\t\t\tthrow new Error(\"models.getModelOfType() expects a type, a provider, and an id\");\n\t\t\t}\n\t\t\tconst model = models.getModelOfType(toModelType(type), provider, id);\n\t\t\treturn model === undefined ? undefined : toModelInfo(model);\n\t\t},\n\t\t\"models.classify\": async (args, { signal }) => {\n\t\t\tconst [model, context] = args as unknown[];\n\t\t\tconst ref = model as { provider?: unknown; id?: unknown } | null;\n\t\t\tif (\n\t\t\t\ttypeof ref !== \"object\" ||\n\t\t\t\tref === null ||\n\t\t\t\ttypeof ref.provider !== \"string\" ||\n\t\t\t\ttypeof ref.id !== \"string\"\n\t\t\t) {\n\t\t\t\tthrow new Error(\n\t\t\t\t\t\"models.classify() expects a model from models.getModelOfType() or models.getAvailableOfType()\",\n\t\t\t\t);\n\t\t\t}\n\t\t\t// Only provider and id count. A script-supplied baseUrl or headers must never receive the credentials.\n\t\t\tconst resolved = models.getModelOfType(\"classifier\", ref.provider, ref.id);\n\t\t\tif (!resolved) throw new Error(`Unknown classifier model \"${ref.provider}/${ref.id}\"`);\n\n\t\t\tconst record: CodemodeNestedCall = {\n\t\t\t\tid: `${toolCallId}/models.classify/${++classifyCount}`,\n\t\t\t\tname: \"models.classify\",\n\t\t\t\targs: `${resolved.provider}/${resolved.id}`,\n\t\t\t\tstatus: \"running\",\n\t\t\t};\n\t\t\tcalls.push(record);\n\t\t\tpublish();\n\t\t\tconst startedAt = performance.now();\n\t\t\tconst result = await limit(() => models.classify(resolved, context as ClassifierContext, { signal }));\n\t\t\trecord.durationMs = performance.now() - startedAt;\n\t\t\trecord.status = result.stopReason === \"stop\" ? \"ok\" : result.stopReason === \"aborted\" ? \"cancelled\" : \"error\";\n\t\t\tif (result.errorMessage) record.error = truncateText(result.errorMessage, ERROR_PREVIEW_CHARS);\n\t\t\tif (result.usage) {\n\t\t\t\trecord.cost = result.usage.cost.total;\n\t\t\t\taddUsage(result.usage);\n\t\t\t}\n\t\t\tpublish();\n\t\t\treturn result;\n\t\t},\n\t};\n\treturn MODEL_GLOBAL_DECLARATIONS.map((declaration) => ({\n\t\tname: declaration.name,\n\t\tspread: true,\n\t\texecute: implementations[declaration.name],\n\t}));\n}\n"]}
@@ -0,0 +1,3 @@
1
+ /** Loads the codemode sandbox runtime on the first script (see execute.ts). */
2
+ export declare const loadCodemodeExecutor: () => Promise<typeof import("./execute.ts")>;
3
+ //# sourceMappingURL=execute.lazy.d.ts.map