@m4ike1/ion-coding-agent 0.1.0

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 (1126) hide show
  1. package/CHANGELOG.md +5747 -0
  2. package/README.md +738 -0
  3. package/dist/bun/cli.d.ts +5 -0
  4. package/dist/bun/cli.d.ts.map +1 -0
  5. package/dist/bun/cli.js +5 -0
  6. package/dist/bun/cli.js.map +1 -0
  7. package/dist/bun/restore-sandbox-env.d.ts +17 -0
  8. package/dist/bun/restore-sandbox-env.d.ts.map +1 -0
  9. package/dist/bun/restore-sandbox-env.js +36 -0
  10. package/dist/bun/restore-sandbox-env.js.map +1 -0
  11. package/dist/bun/runtime-setup.d.ts +2 -0
  12. package/dist/bun/runtime-setup.d.ts.map +1 -0
  13. package/dist/bun/runtime-setup.js +9 -0
  14. package/dist/bun/runtime-setup.js.map +1 -0
  15. package/dist/bun/sandbox-env-setup.d.ts +2 -0
  16. package/dist/bun/sandbox-env-setup.d.ts.map +1 -0
  17. package/dist/bun/sandbox-env-setup.js +4 -0
  18. package/dist/bun/sandbox-env-setup.js.map +1 -0
  19. package/dist/bundle/chunks/anthropic-messages-RPVA4Z4Y.js +6 -0
  20. package/dist/bundle/chunks/anthropic.js +75 -0
  21. package/dist/bundle/chunks/azure-openai-responses-AJS3XTKL.js +2 -0
  22. package/dist/bundle/chunks/bedrock-converse-stream.js +78 -0
  23. package/dist/bundle/chunks/chunk-2MOZ6JBC.js +2 -0
  24. package/dist/bundle/chunks/chunk-3BIJ3AQO.js +12 -0
  25. package/dist/bundle/chunks/chunk-47K3I3YT.js +6 -0
  26. package/dist/bundle/chunks/chunk-4BN67GCJ.js +1664 -0
  27. package/dist/bundle/chunks/chunk-4PN6UIWX.js +2 -0
  28. package/dist/bundle/chunks/chunk-4TQA6ATT.js +4 -0
  29. package/dist/bundle/chunks/chunk-5NVSYJOG.js +2 -0
  30. package/dist/bundle/chunks/chunk-7OJL7DR5.js +2 -0
  31. package/dist/bundle/chunks/chunk-BEER2HEL.js +2 -0
  32. package/dist/bundle/chunks/chunk-CQX3HQAT.js +2 -0
  33. package/dist/bundle/chunks/chunk-FBMFFBV2.js +2 -0
  34. package/dist/bundle/chunks/chunk-GAZIWLQB.js +2 -0
  35. package/dist/bundle/chunks/chunk-HFYRAIWC.js +44 -0
  36. package/dist/bundle/chunks/chunk-IH7HUXWH.js +2 -0
  37. package/dist/bundle/chunks/chunk-LPP2XRBR.js +11 -0
  38. package/dist/bundle/chunks/chunk-LUTYILPM.js +25 -0
  39. package/dist/bundle/chunks/chunk-Q3ZNVFWD.js +42 -0
  40. package/dist/bundle/chunks/chunk-QNBVCBN3.js +2 -0
  41. package/dist/bundle/chunks/chunk-SWVWKUIA.js +2 -0
  42. package/dist/bundle/chunks/chunk-SY4QP6EI.js +2 -0
  43. package/dist/bundle/chunks/chunk-TVAWBPPS.js +2 -0
  44. package/dist/bundle/chunks/chunk-WPN6KEON.js +2 -0
  45. package/dist/bundle/chunks/chunk-WRID246J.js +2 -0
  46. package/dist/bundle/chunks/github-copilot.js +2 -0
  47. package/dist/bundle/chunks/google-generative-ai-S7SD5HC7.js +2 -0
  48. package/dist/bundle/chunks/google-vertex-NUNHA7QM.js +2 -0
  49. package/dist/bundle/chunks/https-proxy-agent-O2332S4O.js +13 -0
  50. package/dist/bundle/chunks/image-resize-worker.js +2 -0
  51. package/dist/bundle/chunks/ion-messages-KTW6MD7U.js +8 -0
  52. package/dist/bundle/chunks/kimi-coding.js +2 -0
  53. package/dist/bundle/chunks/lib-D4EQQPRR.js +9 -0
  54. package/dist/bundle/chunks/mistral-conversations-C7I3G2LA.js +5 -0
  55. package/dist/bundle/chunks/multipart-parser-PL2BXRDT.js +3 -0
  56. package/dist/bundle/chunks/node-7OQEATQA.js +2 -0
  57. package/dist/bundle/chunks/node-QIUI6CIW.js +16 -0
  58. package/dist/bundle/chunks/openai-codex-responses-2KRULDYR.js +10 -0
  59. package/dist/bundle/chunks/openai-codex.js +75 -0
  60. package/dist/bundle/chunks/openai-completions-64KX63FN.js +7 -0
  61. package/dist/bundle/chunks/openai-responses-QF3PPSTS.js +2 -0
  62. package/dist/bundle/chunks/openrouter-images-GQVXT3PO.js +2 -0
  63. package/dist/bundle/chunks/openrouter.js +75 -0
  64. package/dist/bundle/chunks/radius.js +75 -0
  65. package/dist/bundle/chunks/src-AZ7LBHGY.js +4 -0
  66. package/dist/bundle/chunks/xai.js +2 -0
  67. package/dist/bundle/cli.js +3 -0
  68. package/dist/bundle/index.js +2 -0
  69. package/dist/bundle/rpc-entry.js +3 -0
  70. package/dist/cli/args.d.ts +61 -0
  71. package/dist/cli/args.d.ts.map +1 -0
  72. package/dist/cli/args.js +440 -0
  73. package/dist/cli/args.js.map +1 -0
  74. package/dist/cli/auth-check.d.ts +19 -0
  75. package/dist/cli/auth-check.d.ts.map +1 -0
  76. package/dist/cli/auth-check.js +50 -0
  77. package/dist/cli/auth-check.js.map +1 -0
  78. package/dist/cli/auth-command.d.ts +24 -0
  79. package/dist/cli/auth-command.d.ts.map +1 -0
  80. package/dist/cli/auth-command.js +103 -0
  81. package/dist/cli/auth-command.js.map +1 -0
  82. package/dist/cli/config-selector.d.ts +16 -0
  83. package/dist/cli/config-selector.d.ts.map +1 -0
  84. package/dist/cli/config-selector.js +32 -0
  85. package/dist/cli/config-selector.js.map +1 -0
  86. package/dist/cli/credential-print.d.ts +13 -0
  87. package/dist/cli/credential-print.d.ts.map +1 -0
  88. package/dist/cli/credential-print.js +76 -0
  89. package/dist/cli/credential-print.js.map +1 -0
  90. package/dist/cli/file-processor.d.ts +15 -0
  91. package/dist/cli/file-processor.d.ts.map +1 -0
  92. package/dist/cli/file-processor.js +71 -0
  93. package/dist/cli/file-processor.js.map +1 -0
  94. package/dist/cli/initial-message.d.ts +18 -0
  95. package/dist/cli/initial-message.d.ts.map +1 -0
  96. package/dist/cli/initial-message.js +22 -0
  97. package/dist/cli/initial-message.js.map +1 -0
  98. package/dist/cli/list-models.d.ts +9 -0
  99. package/dist/cli/list-models.d.ts.map +1 -0
  100. package/dist/cli/list-models.js +98 -0
  101. package/dist/cli/list-models.js.map +1 -0
  102. package/dist/cli/project-trust.d.ts +10 -0
  103. package/dist/cli/project-trust.d.ts.map +1 -0
  104. package/dist/cli/project-trust.js +48 -0
  105. package/dist/cli/project-trust.js.map +1 -0
  106. package/dist/cli/session-picker.d.ts +10 -0
  107. package/dist/cli/session-picker.d.ts.map +1 -0
  108. package/dist/cli/session-picker.js +36 -0
  109. package/dist/cli/session-picker.js.map +1 -0
  110. package/dist/cli/setup.d.ts +2 -0
  111. package/dist/cli/setup.d.ts.map +1 -0
  112. package/dist/cli/setup.js +12 -0
  113. package/dist/cli/setup.js.map +1 -0
  114. package/dist/cli/startup-ui.d.ts +20 -0
  115. package/dist/cli/startup-ui.d.ts.map +1 -0
  116. package/dist/cli/startup-ui.js +185 -0
  117. package/dist/cli/startup-ui.js.map +1 -0
  118. package/dist/cli.d.ts +3 -0
  119. package/dist/cli.d.ts.map +1 -0
  120. package/dist/cli.js +6 -0
  121. package/dist/cli.js.map +1 -0
  122. package/dist/config.d.ts +122 -0
  123. package/dist/config.d.ts.map +1 -0
  124. package/dist/config.js +609 -0
  125. package/dist/config.js.map +1 -0
  126. package/dist/core/agent-session-runtime.d.ts +119 -0
  127. package/dist/core/agent-session-runtime.d.ts.map +1 -0
  128. package/dist/core/agent-session-runtime.js +317 -0
  129. package/dist/core/agent-session-runtime.js.map +1 -0
  130. package/dist/core/agent-session-services.d.ts +86 -0
  131. package/dist/core/agent-session-services.d.ts.map +1 -0
  132. package/dist/core/agent-session-services.js +134 -0
  133. package/dist/core/agent-session-services.js.map +1 -0
  134. package/dist/core/agent-session.d.ts +725 -0
  135. package/dist/core/agent-session.d.ts.map +1 -0
  136. package/dist/core/agent-session.js +2968 -0
  137. package/dist/core/agent-session.js.map +1 -0
  138. package/dist/core/auth-guidance.d.ts +5 -0
  139. package/dist/core/auth-guidance.d.ts.map +1 -0
  140. package/dist/core/auth-guidance.js +21 -0
  141. package/dist/core/auth-guidance.js.map +1 -0
  142. package/dist/core/auth-storage.d.ts +72 -0
  143. package/dist/core/auth-storage.d.ts.map +1 -0
  144. package/dist/core/auth-storage.js +426 -0
  145. package/dist/core/auth-storage.js.map +1 -0
  146. package/dist/core/bash-executor.d.ts +32 -0
  147. package/dist/core/bash-executor.d.ts.map +1 -0
  148. package/dist/core/bash-executor.js +111 -0
  149. package/dist/core/bash-executor.js.map +1 -0
  150. package/dist/core/cache-stats.d.ts +49 -0
  151. package/dist/core/cache-stats.d.ts.map +1 -0
  152. package/dist/core/cache-stats.js +101 -0
  153. package/dist/core/cache-stats.js.map +1 -0
  154. package/dist/core/compaction/branch-summarization.d.ts +98 -0
  155. package/dist/core/compaction/branch-summarization.d.ts.map +1 -0
  156. package/dist/core/compaction/branch-summarization.js +251 -0
  157. package/dist/core/compaction/branch-summarization.js.map +1 -0
  158. package/dist/core/compaction/compaction.d.ts +145 -0
  159. package/dist/core/compaction/compaction.d.ts.map +1 -0
  160. package/dist/core/compaction/compaction.js +690 -0
  161. package/dist/core/compaction/compaction.js.map +1 -0
  162. package/dist/core/compaction/index.d.ts +7 -0
  163. package/dist/core/compaction/index.d.ts.map +1 -0
  164. package/dist/core/compaction/index.js +7 -0
  165. package/dist/core/compaction/index.js.map +1 -0
  166. package/dist/core/compaction/utils.d.ts +38 -0
  167. package/dist/core/compaction/utils.d.ts.map +1 -0
  168. package/dist/core/compaction/utils.js +142 -0
  169. package/dist/core/compaction/utils.js.map +1 -0
  170. package/dist/core/defaults.d.ts +4 -0
  171. package/dist/core/defaults.d.ts.map +1 -0
  172. package/dist/core/defaults.js +11 -0
  173. package/dist/core/defaults.js.map +1 -0
  174. package/dist/core/diagnostics.d.ts +15 -0
  175. package/dist/core/diagnostics.d.ts.map +1 -0
  176. package/dist/core/diagnostics.js +2 -0
  177. package/dist/core/diagnostics.js.map +1 -0
  178. package/dist/core/event-bus.d.ts +9 -0
  179. package/dist/core/event-bus.d.ts.map +1 -0
  180. package/dist/core/event-bus.js +25 -0
  181. package/dist/core/event-bus.js.map +1 -0
  182. package/dist/core/exec.d.ts +29 -0
  183. package/dist/core/exec.d.ts.map +1 -0
  184. package/dist/core/exec.js +75 -0
  185. package/dist/core/exec.js.map +1 -0
  186. package/dist/core/experimental.d.ts +2 -0
  187. package/dist/core/experimental.d.ts.map +1 -0
  188. package/dist/core/experimental.js +4 -0
  189. package/dist/core/experimental.js.map +1 -0
  190. package/dist/core/export-html/ansi-to-html.d.ts +22 -0
  191. package/dist/core/export-html/ansi-to-html.d.ts.map +1 -0
  192. package/dist/core/export-html/ansi-to-html.js +249 -0
  193. package/dist/core/export-html/ansi-to-html.js.map +1 -0
  194. package/dist/core/export-html/index.d.ts +37 -0
  195. package/dist/core/export-html/index.d.ts.map +1 -0
  196. package/dist/core/export-html/index.js +226 -0
  197. package/dist/core/export-html/index.js.map +1 -0
  198. package/dist/core/export-html/template.css +1066 -0
  199. package/dist/core/export-html/template.html +55 -0
  200. package/dist/core/export-html/template.js +1871 -0
  201. package/dist/core/export-html/tool-renderer.d.ts +34 -0
  202. package/dist/core/export-html/tool-renderer.d.ts.map +1 -0
  203. package/dist/core/export-html/tool-renderer.js +108 -0
  204. package/dist/core/export-html/tool-renderer.js.map +1 -0
  205. package/dist/core/export-html/vendor/highlight.min.js +1213 -0
  206. package/dist/core/export-html/vendor/marked.min.js +78 -0
  207. package/dist/core/extensions/index.d.ts +12 -0
  208. package/dist/core/extensions/index.d.ts.map +1 -0
  209. package/dist/core/extensions/index.js +9 -0
  210. package/dist/core/extensions/index.js.map +1 -0
  211. package/dist/core/extensions/loader.d.ts +23 -0
  212. package/dist/core/extensions/loader.d.ts.map +1 -0
  213. package/dist/core/extensions/loader.js +655 -0
  214. package/dist/core/extensions/loader.js.map +1 -0
  215. package/dist/core/extensions/runner.d.ts +178 -0
  216. package/dist/core/extensions/runner.d.ts.map +1 -0
  217. package/dist/core/extensions/runner.js +1011 -0
  218. package/dist/core/extensions/runner.js.map +1 -0
  219. package/dist/core/extensions/types.d.ts +1375 -0
  220. package/dist/core/extensions/types.d.ts.map +1 -0
  221. package/dist/core/extensions/types.js +54 -0
  222. package/dist/core/extensions/types.js.map +1 -0
  223. package/dist/core/extensions/wrapper.d.ts +20 -0
  224. package/dist/core/extensions/wrapper.d.ts.map +1 -0
  225. package/dist/core/extensions/wrapper.js +41 -0
  226. package/dist/core/extensions/wrapper.js.map +1 -0
  227. package/dist/core/footer-data-provider.d.ts +64 -0
  228. package/dist/core/footer-data-provider.d.ts.map +1 -0
  229. package/dist/core/footer-data-provider.js +338 -0
  230. package/dist/core/footer-data-provider.js.map +1 -0
  231. package/dist/core/http-dispatcher.d.ts +22 -0
  232. package/dist/core/http-dispatcher.d.ts.map +1 -0
  233. package/dist/core/http-dispatcher.js +98 -0
  234. package/dist/core/http-dispatcher.js.map +1 -0
  235. package/dist/core/index.d.ts +13 -0
  236. package/dist/core/index.d.ts.map +1 -0
  237. package/dist/core/index.js +13 -0
  238. package/dist/core/index.js.map +1 -0
  239. package/dist/core/ion-manifest.d.ts +8 -0
  240. package/dist/core/ion-manifest.d.ts.map +1 -0
  241. package/dist/core/ion-manifest.js +26 -0
  242. package/dist/core/ion-manifest.js.map +1 -0
  243. package/dist/core/keybindings.d.ts +475 -0
  244. package/dist/core/keybindings.d.ts.map +1 -0
  245. package/dist/core/keybindings.js +321 -0
  246. package/dist/core/keybindings.js.map +1 -0
  247. package/dist/core/messages.d.ts +77 -0
  248. package/dist/core/messages.d.ts.map +1 -0
  249. package/dist/core/messages.js +123 -0
  250. package/dist/core/messages.js.map +1 -0
  251. package/dist/core/model-config.d.ts +591 -0
  252. package/dist/core/model-config.d.ts.map +1 -0
  253. package/dist/core/model-config.js +259 -0
  254. package/dist/core/model-config.js.map +1 -0
  255. package/dist/core/model-registry.d.ts +49 -0
  256. package/dist/core/model-registry.d.ts.map +1 -0
  257. package/dist/core/model-registry.js +115 -0
  258. package/dist/core/model-registry.js.map +1 -0
  259. package/dist/core/model-resolver.d.ts +124 -0
  260. package/dist/core/model-resolver.d.ts.map +1 -0
  261. package/dist/core/model-resolver.js +591 -0
  262. package/dist/core/model-resolver.js.map +1 -0
  263. package/dist/core/model-runtime.d.ts +101 -0
  264. package/dist/core/model-runtime.d.ts.map +1 -0
  265. package/dist/core/model-runtime.js +606 -0
  266. package/dist/core/model-runtime.js.map +1 -0
  267. package/dist/core/models-store.d.ts +22 -0
  268. package/dist/core/models-store.d.ts.map +1 -0
  269. package/dist/core/models-store.js +115 -0
  270. package/dist/core/models-store.js.map +1 -0
  271. package/dist/core/output-guard.d.ts +7 -0
  272. package/dist/core/output-guard.d.ts.map +1 -0
  273. package/dist/core/output-guard.js +89 -0
  274. package/dist/core/output-guard.js.map +1 -0
  275. package/dist/core/package-manager.d.ts +216 -0
  276. package/dist/core/package-manager.d.ts.map +1 -0
  277. package/dist/core/package-manager.js +2207 -0
  278. package/dist/core/package-manager.js.map +1 -0
  279. package/dist/core/project-trust.d.ts +15 -0
  280. package/dist/core/project-trust.d.ts.map +1 -0
  281. package/dist/core/project-trust.js +59 -0
  282. package/dist/core/project-trust.js.map +1 -0
  283. package/dist/core/prompt-templates.d.ts +54 -0
  284. package/dist/core/prompt-templates.d.ts.map +1 -0
  285. package/dist/core/prompt-templates.js +236 -0
  286. package/dist/core/prompt-templates.js.map +1 -0
  287. package/dist/core/provider-attribution.d.ts +4 -0
  288. package/dist/core/provider-attribution.d.ts.map +1 -0
  289. package/dist/core/provider-attribution.js +72 -0
  290. package/dist/core/provider-attribution.js.map +1 -0
  291. package/dist/core/provider-composer.d.ts +58 -0
  292. package/dist/core/provider-composer.d.ts.map +1 -0
  293. package/dist/core/provider-composer.js +402 -0
  294. package/dist/core/provider-composer.js.map +1 -0
  295. package/dist/core/radius.d.ts +2 -0
  296. package/dist/core/radius.d.ts.map +1 -0
  297. package/dist/core/radius.js +2 -0
  298. package/dist/core/radius.js.map +1 -0
  299. package/dist/core/remote-catalog-provider.d.ts +5 -0
  300. package/dist/core/remote-catalog-provider.d.ts.map +1 -0
  301. package/dist/core/remote-catalog-provider.js +137 -0
  302. package/dist/core/remote-catalog-provider.js.map +1 -0
  303. package/dist/core/resolve-config-value.d.ts +30 -0
  304. package/dist/core/resolve-config-value.d.ts.map +1 -0
  305. package/dist/core/resolve-config-value.js +247 -0
  306. package/dist/core/resolve-config-value.js.map +1 -0
  307. package/dist/core/resource-loader.d.ts +221 -0
  308. package/dist/core/resource-loader.d.ts.map +1 -0
  309. package/dist/core/resource-loader.js +875 -0
  310. package/dist/core/resource-loader.js.map +1 -0
  311. package/dist/core/runtime-credentials.d.ts +15 -0
  312. package/dist/core/runtime-credentials.d.ts.map +1 -0
  313. package/dist/core/runtime-credentials.js +39 -0
  314. package/dist/core/runtime-credentials.js.map +1 -0
  315. package/dist/core/sdk.d.ts +108 -0
  316. package/dist/core/sdk.d.ts.map +1 -0
  317. package/dist/core/sdk.js +285 -0
  318. package/dist/core/sdk.js.map +1 -0
  319. package/dist/core/session-cwd.d.ts +19 -0
  320. package/dist/core/session-cwd.d.ts.map +1 -0
  321. package/dist/core/session-cwd.js +38 -0
  322. package/dist/core/session-cwd.js.map +1 -0
  323. package/dist/core/session-export.d.ts +4 -0
  324. package/dist/core/session-export.d.ts.map +1 -0
  325. package/dist/core/session-export.js +32 -0
  326. package/dist/core/session-export.js.map +1 -0
  327. package/dist/core/session-index.d.ts +67 -0
  328. package/dist/core/session-index.d.ts.map +1 -0
  329. package/dist/core/session-index.js +376 -0
  330. package/dist/core/session-index.js.map +1 -0
  331. package/dist/core/session-manager.d.ts +376 -0
  332. package/dist/core/session-manager.d.ts.map +1 -0
  333. package/dist/core/session-manager.js +1587 -0
  334. package/dist/core/session-manager.js.map +1 -0
  335. package/dist/core/session-naming-runtime.d.ts +153 -0
  336. package/dist/core/session-naming-runtime.d.ts.map +1 -0
  337. package/dist/core/session-naming-runtime.js +336 -0
  338. package/dist/core/session-naming-runtime.js.map +1 -0
  339. package/dist/core/settings-diagnostics.d.ts +9 -0
  340. package/dist/core/settings-diagnostics.d.ts.map +1 -0
  341. package/dist/core/settings-diagnostics.js +21 -0
  342. package/dist/core/settings-diagnostics.js.map +1 -0
  343. package/dist/core/settings-manager.d.ts +375 -0
  344. package/dist/core/settings-manager.d.ts.map +1 -0
  345. package/dist/core/settings-manager.js +1110 -0
  346. package/dist/core/settings-manager.js.map +1 -0
  347. package/dist/core/skills.d.ts +60 -0
  348. package/dist/core/skills.d.ts.map +1 -0
  349. package/dist/core/skills.js +412 -0
  350. package/dist/core/skills.js.map +1 -0
  351. package/dist/core/slash-commands.d.ts +17 -0
  352. package/dist/core/slash-commands.d.ts.map +1 -0
  353. package/dist/core/slash-commands.js +33 -0
  354. package/dist/core/slash-commands.js.map +1 -0
  355. package/dist/core/source-info.d.ts +18 -0
  356. package/dist/core/source-info.d.ts.map +1 -0
  357. package/dist/core/source-info.js +19 -0
  358. package/dist/core/source-info.js.map +1 -0
  359. package/dist/core/system-prompt.d.ts +28 -0
  360. package/dist/core/system-prompt.d.ts.map +1 -0
  361. package/dist/core/system-prompt.js +118 -0
  362. package/dist/core/system-prompt.js.map +1 -0
  363. package/dist/core/telemetry.d.ts +3 -0
  364. package/dist/core/telemetry.d.ts.map +1 -0
  365. package/dist/core/telemetry.js +9 -0
  366. package/dist/core/telemetry.js.map +1 -0
  367. package/dist/core/timings.d.ts +10 -0
  368. package/dist/core/timings.d.ts.map +1 -0
  369. package/dist/core/timings.js +41 -0
  370. package/dist/core/timings.js.map +1 -0
  371. package/dist/core/tools/bash.d.ts +87 -0
  372. package/dist/core/tools/bash.d.ts.map +1 -0
  373. package/dist/core/tools/bash.js +295 -0
  374. package/dist/core/tools/bash.js.map +1 -0
  375. package/dist/core/tools/edit-diff.d.ts +101 -0
  376. package/dist/core/tools/edit-diff.d.ts.map +1 -0
  377. package/dist/core/tools/edit-diff.js +421 -0
  378. package/dist/core/tools/edit-diff.js.map +1 -0
  379. package/dist/core/tools/edit.d.ts +44 -0
  380. package/dist/core/tools/edit.d.ts.map +1 -0
  381. package/dist/core/tools/edit.js +147 -0
  382. package/dist/core/tools/edit.js.map +1 -0
  383. package/dist/core/tools/file-mutation-queue.d.ts +6 -0
  384. package/dist/core/tools/file-mutation-queue.d.ts.map +1 -0
  385. package/dist/core/tools/file-mutation-queue.js +52 -0
  386. package/dist/core/tools/file-mutation-queue.js.map +1 -0
  387. package/dist/core/tools/find.d.ts +42 -0
  388. package/dist/core/tools/find.d.ts.map +1 -0
  389. package/dist/core/tools/find.js +251 -0
  390. package/dist/core/tools/find.js.map +1 -0
  391. package/dist/core/tools/grep.d.ts +53 -0
  392. package/dist/core/tools/grep.d.ts.map +1 -0
  393. package/dist/core/tools/grep.js +463 -0
  394. package/dist/core/tools/grep.js.map +1 -0
  395. package/dist/core/tools/index.d.ts +49 -0
  396. package/dist/core/tools/index.d.ts.map +1 -0
  397. package/dist/core/tools/index.js +147 -0
  398. package/dist/core/tools/index.js.map +1 -0
  399. package/dist/core/tools/ls.d.ts +48 -0
  400. package/dist/core/tools/ls.d.ts.map +1 -0
  401. package/dist/core/tools/ls.js +224 -0
  402. package/dist/core/tools/ls.js.map +1 -0
  403. package/dist/core/tools/output-accumulator.d.ts +52 -0
  404. package/dist/core/tools/output-accumulator.d.ts.map +1 -0
  405. package/dist/core/tools/output-accumulator.js +184 -0
  406. package/dist/core/tools/output-accumulator.js.map +1 -0
  407. package/dist/core/tools/path-utils.d.ts +10 -0
  408. package/dist/core/tools/path-utils.d.ts.map +1 -0
  409. package/dist/core/tools/path-utils.js +99 -0
  410. package/dist/core/tools/path-utils.js.map +1 -0
  411. package/dist/core/tools/powershell.d.ts +16 -0
  412. package/dist/core/tools/powershell.d.ts.map +1 -0
  413. package/dist/core/tools/powershell.js +39 -0
  414. package/dist/core/tools/powershell.js.map +1 -0
  415. package/dist/core/tools/read.d.ts +39 -0
  416. package/dist/core/tools/read.d.ts.map +1 -0
  417. package/dist/core/tools/read.js +165 -0
  418. package/dist/core/tools/read.js.map +1 -0
  419. package/dist/core/tools/render-utils.d.ts +24 -0
  420. package/dist/core/tools/render-utils.d.ts.map +1 -0
  421. package/dist/core/tools/render-utils.js +65 -0
  422. package/dist/core/tools/render-utils.js.map +1 -0
  423. package/dist/core/tools/renderers/bash.d.ts +12 -0
  424. package/dist/core/tools/renderers/bash.d.ts.map +1 -0
  425. package/dist/core/tools/renderers/bash.js +130 -0
  426. package/dist/core/tools/renderers/bash.js.map +1 -0
  427. package/dist/core/tools/renderers/edit.d.ts +23 -0
  428. package/dist/core/tools/renderers/edit.d.ts.map +1 -0
  429. package/dist/core/tools/renderers/edit.js +167 -0
  430. package/dist/core/tools/renderers/edit.js.map +1 -0
  431. package/dist/core/tools/renderers/find.d.ts +10 -0
  432. package/dist/core/tools/renderers/find.d.ts.map +1 -0
  433. package/dist/core/tools/renderers/find.js +64 -0
  434. package/dist/core/tools/renderers/find.js.map +1 -0
  435. package/dist/core/tools/renderers/grep.d.ts +10 -0
  436. package/dist/core/tools/renderers/grep.d.ts.map +1 -0
  437. package/dist/core/tools/renderers/grep.js +69 -0
  438. package/dist/core/tools/renderers/grep.js.map +1 -0
  439. package/dist/core/tools/renderers/index.d.ts +29 -0
  440. package/dist/core/tools/renderers/index.d.ts.map +1 -0
  441. package/dist/core/tools/renderers/index.js +50 -0
  442. package/dist/core/tools/renderers/index.js.map +1 -0
  443. package/dist/core/tools/renderers/ls.d.ts +10 -0
  444. package/dist/core/tools/renderers/ls.d.ts.map +1 -0
  445. package/dist/core/tools/renderers/ls.js +66 -0
  446. package/dist/core/tools/renderers/ls.js.map +1 -0
  447. package/dist/core/tools/renderers/read.d.ts +11 -0
  448. package/dist/core/tools/renderers/read.d.ts.map +1 -0
  449. package/dist/core/tools/renderers/read.js +129 -0
  450. package/dist/core/tools/renderers/read.js.map +1 -0
  451. package/dist/core/tools/renderers/webfetch.d.ts +11 -0
  452. package/dist/core/tools/renderers/webfetch.d.ts.map +1 -0
  453. package/dist/core/tools/renderers/webfetch.js +89 -0
  454. package/dist/core/tools/renderers/webfetch.js.map +1 -0
  455. package/dist/core/tools/renderers/write.d.ts +10 -0
  456. package/dist/core/tools/renderers/write.d.ts.map +1 -0
  457. package/dist/core/tools/renderers/write.js +153 -0
  458. package/dist/core/tools/renderers/write.js.map +1 -0
  459. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -0
  460. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -0
  461. package/dist/core/tools/tool-definition-wrapper.js +36 -0
  462. package/dist/core/tools/tool-definition-wrapper.js.map +1 -0
  463. package/dist/core/tools/truncate.d.ts +70 -0
  464. package/dist/core/tools/truncate.d.ts.map +1 -0
  465. package/dist/core/tools/truncate.js +215 -0
  466. package/dist/core/tools/truncate.js.map +1 -0
  467. package/dist/core/tools/webextract.d.ts +36 -0
  468. package/dist/core/tools/webextract.d.ts.map +1 -0
  469. package/dist/core/tools/webextract.js +130 -0
  470. package/dist/core/tools/webextract.js.map +1 -0
  471. package/dist/core/tools/webfetch.d.ts +104 -0
  472. package/dist/core/tools/webfetch.d.ts.map +1 -0
  473. package/dist/core/tools/webfetch.js +231 -0
  474. package/dist/core/tools/webfetch.js.map +1 -0
  475. package/dist/core/tools/write.d.ts +30 -0
  476. package/dist/core/tools/write.d.ts.map +1 -0
  477. package/dist/core/tools/write.js +61 -0
  478. package/dist/core/tools/write.js.map +1 -0
  479. package/dist/core/trust-manager.d.ts +36 -0
  480. package/dist/core/trust-manager.d.ts.map +1 -0
  481. package/dist/core/trust-manager.js +203 -0
  482. package/dist/core/trust-manager.js.map +1 -0
  483. package/dist/core/usage-totals.d.ts +19 -0
  484. package/dist/core/usage-totals.d.ts.map +1 -0
  485. package/dist/core/usage-totals.js +52 -0
  486. package/dist/core/usage-totals.js.map +1 -0
  487. package/dist/core/webfetch/backend-exa.d.ts +65 -0
  488. package/dist/core/webfetch/backend-exa.d.ts.map +1 -0
  489. package/dist/core/webfetch/backend-exa.js +282 -0
  490. package/dist/core/webfetch/backend-exa.js.map +1 -0
  491. package/dist/core/webfetch/backend-firecrawl.d.ts +59 -0
  492. package/dist/core/webfetch/backend-firecrawl.d.ts.map +1 -0
  493. package/dist/core/webfetch/backend-firecrawl.js +339 -0
  494. package/dist/core/webfetch/backend-firecrawl.js.map +1 -0
  495. package/dist/core/webfetch/backend-undici.d.ts +21 -0
  496. package/dist/core/webfetch/backend-undici.d.ts.map +1 -0
  497. package/dist/core/webfetch/backend-undici.js +109 -0
  498. package/dist/core/webfetch/backend-undici.js.map +1 -0
  499. package/dist/core/webfetch/backend.d.ts +45 -0
  500. package/dist/core/webfetch/backend.d.ts.map +1 -0
  501. package/dist/core/webfetch/backend.js +9 -0
  502. package/dist/core/webfetch/backend.js.map +1 -0
  503. package/dist/core/webfetch/doc-store.d.ts +45 -0
  504. package/dist/core/webfetch/doc-store.d.ts.map +1 -0
  505. package/dist/core/webfetch/doc-store.js +57 -0
  506. package/dist/core/webfetch/doc-store.js.map +1 -0
  507. package/dist/core/webfetch/guardrails.d.ts +75 -0
  508. package/dist/core/webfetch/guardrails.d.ts.map +1 -0
  509. package/dist/core/webfetch/guardrails.js +195 -0
  510. package/dist/core/webfetch/guardrails.js.map +1 -0
  511. package/dist/core/webfetch/robots.d.ts +46 -0
  512. package/dist/core/webfetch/robots.d.ts.map +1 -0
  513. package/dist/core/webfetch/robots.js +153 -0
  514. package/dist/core/webfetch/robots.js.map +1 -0
  515. package/dist/core/webfetch/search-intent.d.ts +59 -0
  516. package/dist/core/webfetch/search-intent.d.ts.map +1 -0
  517. package/dist/core/webfetch/search-intent.js +89 -0
  518. package/dist/core/webfetch/search-intent.js.map +1 -0
  519. package/dist/core/webfetch/search-tags.d.ts +23 -0
  520. package/dist/core/webfetch/search-tags.d.ts.map +1 -0
  521. package/dist/core/webfetch/search-tags.js +118 -0
  522. package/dist/core/webfetch/search-tags.js.map +1 -0
  523. package/dist/env-compat.d.ts +2 -0
  524. package/dist/env-compat.d.ts.map +1 -0
  525. package/dist/env-compat.js +17 -0
  526. package/dist/env-compat.js.map +1 -0
  527. package/dist/extensions/cue/autocomplete.d.ts +126 -0
  528. package/dist/extensions/cue/autocomplete.d.ts.map +1 -0
  529. package/dist/extensions/cue/autocomplete.js +744 -0
  530. package/dist/extensions/cue/autocomplete.js.map +1 -0
  531. package/dist/extensions/cue/index.d.ts +3 -0
  532. package/dist/extensions/cue/index.d.ts.map +1 -0
  533. package/dist/extensions/cue/index.js +341 -0
  534. package/dist/extensions/cue/index.js.map +1 -0
  535. package/dist/extensions/index.d.ts +13 -0
  536. package/dist/extensions/index.d.ts.map +1 -0
  537. package/dist/extensions/index.js +18 -0
  538. package/dist/extensions/index.js.map +1 -0
  539. package/dist/extensions/llama/client.d.ts +67 -0
  540. package/dist/extensions/llama/client.d.ts.map +1 -0
  541. package/dist/extensions/llama/client.js +309 -0
  542. package/dist/extensions/llama/client.js.map +1 -0
  543. package/dist/extensions/llama/huggingface.d.ts +23 -0
  544. package/dist/extensions/llama/huggingface.d.ts.map +1 -0
  545. package/dist/extensions/llama/huggingface.js +141 -0
  546. package/dist/extensions/llama/huggingface.js.map +1 -0
  547. package/dist/extensions/llama/index.d.ts +3 -0
  548. package/dist/extensions/llama/index.d.ts.map +1 -0
  549. package/dist/extensions/llama/index.js +219 -0
  550. package/dist/extensions/llama/index.js.map +1 -0
  551. package/dist/extensions/llama/provider.d.ts +12 -0
  552. package/dist/extensions/llama/provider.d.ts.map +1 -0
  553. package/dist/extensions/llama/provider.js +146 -0
  554. package/dist/extensions/llama/provider.js.map +1 -0
  555. package/dist/extensions/llama/ui.d.ts +42 -0
  556. package/dist/extensions/llama/ui.d.ts.map +1 -0
  557. package/dist/extensions/llama/ui.js +416 -0
  558. package/dist/extensions/llama/ui.js.map +1 -0
  559. package/dist/index.d.ts +36 -0
  560. package/dist/index.d.ts.map +1 -0
  561. package/dist/index.js +48 -0
  562. package/dist/index.js.map +1 -0
  563. package/dist/main.d.ts +17 -0
  564. package/dist/main.d.ts.map +1 -0
  565. package/dist/main.js +820 -0
  566. package/dist/main.js.map +1 -0
  567. package/dist/migrations.d.ts +33 -0
  568. package/dist/migrations.d.ts.map +1 -0
  569. package/dist/migrations.js +288 -0
  570. package/dist/migrations.js.map +1 -0
  571. package/dist/modes/index.d.ts +10 -0
  572. package/dist/modes/index.d.ts.map +1 -0
  573. package/dist/modes/index.js +8 -0
  574. package/dist/modes/index.js.map +1 -0
  575. package/dist/modes/interactive/assets/clankolas.png +0 -0
  576. package/dist/modes/interactive/chat-viewport.d.ts +20 -0
  577. package/dist/modes/interactive/chat-viewport.d.ts.map +1 -0
  578. package/dist/modes/interactive/chat-viewport.js +28 -0
  579. package/dist/modes/interactive/chat-viewport.js.map +1 -0
  580. package/dist/modes/interactive/components/armin.d.ts +34 -0
  581. package/dist/modes/interactive/components/armin.d.ts.map +1 -0
  582. package/dist/modes/interactive/components/armin.js +333 -0
  583. package/dist/modes/interactive/components/armin.js.map +1 -0
  584. package/dist/modes/interactive/components/assistant-message.d.ts +26 -0
  585. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -0
  586. package/dist/modes/interactive/components/assistant-message.js +171 -0
  587. package/dist/modes/interactive/components/assistant-message.js.map +1 -0
  588. package/dist/modes/interactive/components/bash-execution.d.ts +34 -0
  589. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -0
  590. package/dist/modes/interactive/components/bash-execution.js +175 -0
  591. package/dist/modes/interactive/components/bash-execution.js.map +1 -0
  592. package/dist/modes/interactive/components/bordered-loader.d.ts +16 -0
  593. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -0
  594. package/dist/modes/interactive/components/bordered-loader.js +54 -0
  595. package/dist/modes/interactive/components/bordered-loader.js.map +1 -0
  596. package/dist/modes/interactive/components/branch-summary-message.d.ts +16 -0
  597. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -0
  598. package/dist/modes/interactive/components/branch-summary-message.js +44 -0
  599. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -0
  600. package/dist/modes/interactive/components/compaction-summary-message.d.ts +16 -0
  601. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -0
  602. package/dist/modes/interactive/components/compaction-summary-message.js +45 -0
  603. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -0
  604. package/dist/modes/interactive/components/config-selector.d.ts +102 -0
  605. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -0
  606. package/dist/modes/interactive/components/config-selector.js +770 -0
  607. package/dist/modes/interactive/components/config-selector.js.map +1 -0
  608. package/dist/modes/interactive/components/countdown-timer.d.ts +14 -0
  609. package/dist/modes/interactive/components/countdown-timer.d.ts.map +1 -0
  610. package/dist/modes/interactive/components/countdown-timer.js +33 -0
  611. package/dist/modes/interactive/components/countdown-timer.js.map +1 -0
  612. package/dist/modes/interactive/components/custom-editor.d.ts +30 -0
  613. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -0
  614. package/dist/modes/interactive/components/custom-editor.js +115 -0
  615. package/dist/modes/interactive/components/custom-editor.js.map +1 -0
  616. package/dist/modes/interactive/components/custom-entry.d.ts +19 -0
  617. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -0
  618. package/dist/modes/interactive/components/custom-entry.js +52 -0
  619. package/dist/modes/interactive/components/custom-entry.js.map +1 -0
  620. package/dist/modes/interactive/components/custom-message.d.ts +22 -0
  621. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -0
  622. package/dist/modes/interactive/components/custom-message.js +87 -0
  623. package/dist/modes/interactive/components/custom-message.js.map +1 -0
  624. package/dist/modes/interactive/components/daxnuts.d.ts +23 -0
  625. package/dist/modes/interactive/components/daxnuts.d.ts.map +1 -0
  626. package/dist/modes/interactive/components/daxnuts.js +140 -0
  627. package/dist/modes/interactive/components/daxnuts.js.map +1 -0
  628. package/dist/modes/interactive/components/diff.d.ts +12 -0
  629. package/dist/modes/interactive/components/diff.d.ts.map +1 -0
  630. package/dist/modes/interactive/components/diff.js +133 -0
  631. package/dist/modes/interactive/components/diff.js.map +1 -0
  632. package/dist/modes/interactive/components/dynamic-border.d.ts +15 -0
  633. package/dist/modes/interactive/components/dynamic-border.d.ts.map +1 -0
  634. package/dist/modes/interactive/components/dynamic-border.js +21 -0
  635. package/dist/modes/interactive/components/dynamic-border.js.map +1 -0
  636. package/dist/modes/interactive/components/earendil-announcement.d.ts +5 -0
  637. package/dist/modes/interactive/components/earendil-announcement.d.ts.map +1 -0
  638. package/dist/modes/interactive/components/earendil-announcement.js +40 -0
  639. package/dist/modes/interactive/components/earendil-announcement.js.map +1 -0
  640. package/dist/modes/interactive/components/extension-editor.d.ts +21 -0
  641. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -0
  642. package/dist/modes/interactive/components/extension-editor.js +98 -0
  643. package/dist/modes/interactive/components/extension-editor.js.map +1 -0
  644. package/dist/modes/interactive/components/extension-input.d.ts +23 -0
  645. package/dist/modes/interactive/components/extension-input.d.ts.map +1 -0
  646. package/dist/modes/interactive/components/extension-input.js +61 -0
  647. package/dist/modes/interactive/components/extension-input.js.map +1 -0
  648. package/dist/modes/interactive/components/extension-selector.d.ts +26 -0
  649. package/dist/modes/interactive/components/extension-selector.d.ts.map +1 -0
  650. package/dist/modes/interactive/components/extension-selector.js +83 -0
  651. package/dist/modes/interactive/components/extension-selector.js.map +1 -0
  652. package/dist/modes/interactive/components/first-time-setup.d.ts +25 -0
  653. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -0
  654. package/dist/modes/interactive/components/first-time-setup.js +103 -0
  655. package/dist/modes/interactive/components/first-time-setup.js.map +1 -0
  656. package/dist/modes/interactive/components/footer.d.ts +32 -0
  657. package/dist/modes/interactive/components/footer.d.ts.map +1 -0
  658. package/dist/modes/interactive/components/footer.js +230 -0
  659. package/dist/modes/interactive/components/footer.js.map +1 -0
  660. package/dist/modes/interactive/components/index.d.ts +34 -0
  661. package/dist/modes/interactive/components/index.d.ts.map +1 -0
  662. package/dist/modes/interactive/components/index.js +35 -0
  663. package/dist/modes/interactive/components/index.js.map +1 -0
  664. package/dist/modes/interactive/components/keybinding-hints.d.ts +13 -0
  665. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -0
  666. package/dist/modes/interactive/components/keybinding-hints.js +36 -0
  667. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -0
  668. package/dist/modes/interactive/components/login-dialog.d.ts +52 -0
  669. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -0
  670. package/dist/modes/interactive/components/login-dialog.js +188 -0
  671. package/dist/modes/interactive/components/login-dialog.js.map +1 -0
  672. package/dist/modes/interactive/components/markdown-transform.d.ts +3 -0
  673. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -0
  674. package/dist/modes/interactive/components/markdown-transform.js +19 -0
  675. package/dist/modes/interactive/components/markdown-transform.js.map +1 -0
  676. package/dist/modes/interactive/components/mermaid.d.ts +11 -0
  677. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -0
  678. package/dist/modes/interactive/components/mermaid.js +75 -0
  679. package/dist/modes/interactive/components/mermaid.js.map +1 -0
  680. package/dist/modes/interactive/components/model-selector.d.ts +60 -0
  681. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -0
  682. package/dist/modes/interactive/components/model-selector.js +361 -0
  683. package/dist/modes/interactive/components/model-selector.js.map +1 -0
  684. package/dist/modes/interactive/components/oauth-selector.d.ts +33 -0
  685. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -0
  686. package/dist/modes/interactive/components/oauth-selector.js +163 -0
  687. package/dist/modes/interactive/components/oauth-selector.js.map +1 -0
  688. package/dist/modes/interactive/components/scoped-models-selector.d.ts +46 -0
  689. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -0
  690. package/dist/modes/interactive/components/scoped-models-selector.js +326 -0
  691. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -0
  692. package/dist/modes/interactive/components/session-selector-search.d.ts +23 -0
  693. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -0
  694. package/dist/modes/interactive/components/session-selector-search.js +155 -0
  695. package/dist/modes/interactive/components/session-selector-search.js.map +1 -0
  696. package/dist/modes/interactive/components/session-selector.d.ts +98 -0
  697. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -0
  698. package/dist/modes/interactive/components/session-selector.js +891 -0
  699. package/dist/modes/interactive/components/session-selector.js.map +1 -0
  700. package/dist/modes/interactive/components/settings-selector.d.ts +98 -0
  701. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -0
  702. package/dist/modes/interactive/components/settings-selector.js +745 -0
  703. package/dist/modes/interactive/components/settings-selector.js.map +1 -0
  704. package/dist/modes/interactive/components/settings-submenu.d.ts +72 -0
  705. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -0
  706. package/dist/modes/interactive/components/settings-submenu.js +165 -0
  707. package/dist/modes/interactive/components/settings-submenu.js.map +1 -0
  708. package/dist/modes/interactive/components/show-images-selector.d.ts +10 -0
  709. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -0
  710. package/dist/modes/interactive/components/show-images-selector.js +39 -0
  711. package/dist/modes/interactive/components/show-images-selector.js.map +1 -0
  712. package/dist/modes/interactive/components/skill-invocation-message.d.ts +17 -0
  713. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -0
  714. package/dist/modes/interactive/components/skill-invocation-message.js +47 -0
  715. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -0
  716. package/dist/modes/interactive/components/status-indicator.d.ts +30 -0
  717. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -0
  718. package/dist/modes/interactive/components/status-indicator.js +67 -0
  719. package/dist/modes/interactive/components/status-indicator.js.map +1 -0
  720. package/dist/modes/interactive/components/theme-selector.d.ts +11 -0
  721. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -0
  722. package/dist/modes/interactive/components/theme-selector.js +50 -0
  723. package/dist/modes/interactive/components/theme-selector.js.map +1 -0
  724. package/dist/modes/interactive/components/thinking-selector.d.ts +23 -0
  725. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -0
  726. package/dist/modes/interactive/components/thinking-selector.js +109 -0
  727. package/dist/modes/interactive/components/thinking-selector.js.map +1 -0
  728. package/dist/modes/interactive/components/tool-execution.d.ts +80 -0
  729. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -0
  730. package/dist/modes/interactive/components/tool-execution.js +328 -0
  731. package/dist/modes/interactive/components/tool-execution.js.map +1 -0
  732. package/dist/modes/interactive/components/tree-selector.d.ts +94 -0
  733. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -0
  734. package/dist/modes/interactive/components/tree-selector.js +1245 -0
  735. package/dist/modes/interactive/components/tree-selector.js.map +1 -0
  736. package/dist/modes/interactive/components/trust-selector.d.ts +23 -0
  737. package/dist/modes/interactive/components/trust-selector.d.ts.map +1 -0
  738. package/dist/modes/interactive/components/trust-selector.js +91 -0
  739. package/dist/modes/interactive/components/trust-selector.js.map +1 -0
  740. package/dist/modes/interactive/components/user-message-selector.d.ts +30 -0
  741. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -0
  742. package/dist/modes/interactive/components/user-message-selector.js +114 -0
  743. package/dist/modes/interactive/components/user-message-selector.js.map +1 -0
  744. package/dist/modes/interactive/components/user-message.d.ts +16 -0
  745. package/dist/modes/interactive/components/user-message.d.ts.map +1 -0
  746. package/dist/modes/interactive/components/user-message.js +49 -0
  747. package/dist/modes/interactive/components/user-message.js.map +1 -0
  748. package/dist/modes/interactive/components/visual-truncate.d.ts +24 -0
  749. package/dist/modes/interactive/components/visual-truncate.d.ts.map +1 -0
  750. package/dist/modes/interactive/components/visual-truncate.js +33 -0
  751. package/dist/modes/interactive/components/visual-truncate.js.map +1 -0
  752. package/dist/modes/interactive/external-editor.d.ts +12 -0
  753. package/dist/modes/interactive/external-editor.d.ts.map +1 -0
  754. package/dist/modes/interactive/external-editor.js +38 -0
  755. package/dist/modes/interactive/external-editor.js.map +1 -0
  756. package/dist/modes/interactive/interactive-mode.d.ts +471 -0
  757. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -0
  758. package/dist/modes/interactive/interactive-mode.js +5735 -0
  759. package/dist/modes/interactive/interactive-mode.js.map +1 -0
  760. package/dist/modes/interactive/model-catalog-refresh.d.ts +7 -0
  761. package/dist/modes/interactive/model-catalog-refresh.d.ts.map +1 -0
  762. package/dist/modes/interactive/model-catalog-refresh.js +34 -0
  763. package/dist/modes/interactive/model-catalog-refresh.js.map +1 -0
  764. package/dist/modes/interactive/model-search.d.ts +12 -0
  765. package/dist/modes/interactive/model-search.d.ts.map +1 -0
  766. package/dist/modes/interactive/model-search.js +15 -0
  767. package/dist/modes/interactive/model-search.js.map +1 -0
  768. package/dist/modes/interactive/session-share.d.ts +16 -0
  769. package/dist/modes/interactive/session-share.d.ts.map +1 -0
  770. package/dist/modes/interactive/session-share.js +184 -0
  771. package/dist/modes/interactive/session-share.js.map +1 -0
  772. package/dist/modes/interactive/theme/dark.json +91 -0
  773. package/dist/modes/interactive/theme/light.json +90 -0
  774. package/dist/modes/interactive/theme/theme-controller.d.ts +41 -0
  775. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -0
  776. package/dist/modes/interactive/theme/theme-controller.js +130 -0
  777. package/dist/modes/interactive/theme/theme-controller.js.map +1 -0
  778. package/dist/modes/interactive/theme/theme-json.d.ts +84 -0
  779. package/dist/modes/interactive/theme/theme-json.d.ts.map +1 -0
  780. package/dist/modes/interactive/theme/theme-json.js +130 -0
  781. package/dist/modes/interactive/theme/theme-json.js.map +1 -0
  782. package/dist/modes/interactive/theme/theme-schema.json +356 -0
  783. package/dist/modes/interactive/theme/theme.d.ts +131 -0
  784. package/dist/modes/interactive/theme/theme.d.ts.map +1 -0
  785. package/dist/modes/interactive/theme/theme.js +991 -0
  786. package/dist/modes/interactive/theme/theme.js.map +1 -0
  787. package/dist/modes/interactive/tui-renderer.d.ts +21 -0
  788. package/dist/modes/interactive/tui-renderer.d.ts.map +1 -0
  789. package/dist/modes/interactive/tui-renderer.js +66 -0
  790. package/dist/modes/interactive/tui-renderer.js.map +1 -0
  791. package/dist/modes/json-event.d.ts +34 -0
  792. package/dist/modes/json-event.d.ts.map +1 -0
  793. package/dist/modes/json-event.js +29 -0
  794. package/dist/modes/json-event.js.map +1 -0
  795. package/dist/modes/print-mode.d.ts +28 -0
  796. package/dist/modes/print-mode.d.ts.map +1 -0
  797. package/dist/modes/print-mode.js +142 -0
  798. package/dist/modes/print-mode.js.map +1 -0
  799. package/dist/modes/rpc/jsonl.d.ts +17 -0
  800. package/dist/modes/rpc/jsonl.d.ts.map +1 -0
  801. package/dist/modes/rpc/jsonl.js +49 -0
  802. package/dist/modes/rpc/jsonl.js.map +1 -0
  803. package/dist/modes/rpc/rpc-client.d.ts +254 -0
  804. package/dist/modes/rpc/rpc-client.d.ts.map +1 -0
  805. package/dist/modes/rpc/rpc-client.js +495 -0
  806. package/dist/modes/rpc/rpc-client.js.map +1 -0
  807. package/dist/modes/rpc/rpc-mode.d.ts +20 -0
  808. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -0
  809. package/dist/modes/rpc/rpc-mode.js +657 -0
  810. package/dist/modes/rpc/rpc-mode.js.map +1 -0
  811. package/dist/modes/rpc/rpc-types.d.ts +469 -0
  812. package/dist/modes/rpc/rpc-types.d.ts.map +1 -0
  813. package/dist/modes/rpc/rpc-types.js +8 -0
  814. package/dist/modes/rpc/rpc-types.js.map +1 -0
  815. package/dist/package-manager-cli.d.ts +9 -0
  816. package/dist/package-manager-cli.d.ts.map +1 -0
  817. package/dist/package-manager-cli.js +961 -0
  818. package/dist/package-manager-cli.js.map +1 -0
  819. package/dist/rpc-entry.d.ts +3 -0
  820. package/dist/rpc-entry.d.ts.map +1 -0
  821. package/dist/rpc-entry.js +12 -0
  822. package/dist/rpc-entry.js.map +1 -0
  823. package/dist/utils/abort.d.ts +5 -0
  824. package/dist/utils/abort.d.ts.map +1 -0
  825. package/dist/utils/abort.js +48 -0
  826. package/dist/utils/abort.js.map +1 -0
  827. package/dist/utils/ansi.d.ts +2 -0
  828. package/dist/utils/ansi.d.ts.map +1 -0
  829. package/dist/utils/ansi.js +52 -0
  830. package/dist/utils/ansi.js.map +1 -0
  831. package/dist/utils/changelog.d.ts +22 -0
  832. package/dist/utils/changelog.d.ts.map +1 -0
  833. package/dist/utils/changelog.js +165 -0
  834. package/dist/utils/changelog.js.map +1 -0
  835. package/dist/utils/child-process.d.ts +18 -0
  836. package/dist/utils/child-process.d.ts.map +1 -0
  837. package/dist/utils/child-process.js +106 -0
  838. package/dist/utils/child-process.js.map +1 -0
  839. package/dist/utils/clipboard-command.d.ts +7 -0
  840. package/dist/utils/clipboard-command.d.ts.map +1 -0
  841. package/dist/utils/clipboard-command.js +45 -0
  842. package/dist/utils/clipboard-command.js.map +1 -0
  843. package/dist/utils/clipboard-image.d.ts +11 -0
  844. package/dist/utils/clipboard-image.d.ts.map +1 -0
  845. package/dist/utils/clipboard-image.js +228 -0
  846. package/dist/utils/clipboard-image.js.map +1 -0
  847. package/dist/utils/clipboard.d.ts +4 -0
  848. package/dist/utils/clipboard.d.ts.map +1 -0
  849. package/dist/utils/clipboard.js +84 -0
  850. package/dist/utils/clipboard.js.map +1 -0
  851. package/dist/utils/deprecation.d.ts +4 -0
  852. package/dist/utils/deprecation.d.ts.map +1 -0
  853. package/dist/utils/deprecation.js +13 -0
  854. package/dist/utils/deprecation.js.map +1 -0
  855. package/dist/utils/exif-orientation.d.ts +5 -0
  856. package/dist/utils/exif-orientation.d.ts.map +1 -0
  857. package/dist/utils/exif-orientation.js +157 -0
  858. package/dist/utils/exif-orientation.js.map +1 -0
  859. package/dist/utils/frontmatter.d.ts +8 -0
  860. package/dist/utils/frontmatter.d.ts.map +1 -0
  861. package/dist/utils/frontmatter.js +27 -0
  862. package/dist/utils/frontmatter.js.map +1 -0
  863. package/dist/utils/fs-watch.d.ts +5 -0
  864. package/dist/utils/fs-watch.d.ts.map +1 -0
  865. package/dist/utils/fs-watch.js +25 -0
  866. package/dist/utils/fs-watch.js.map +1 -0
  867. package/dist/utils/git.d.ts +26 -0
  868. package/dist/utils/git.d.ts.map +1 -0
  869. package/dist/utils/git.js +195 -0
  870. package/dist/utils/git.js.map +1 -0
  871. package/dist/utils/html.d.ts +7 -0
  872. package/dist/utils/html.d.ts.map +1 -0
  873. package/dist/utils/html.js +40 -0
  874. package/dist/utils/html.js.map +1 -0
  875. package/dist/utils/image-convert.d.ts +10 -0
  876. package/dist/utils/image-convert.d.ts.map +1 -0
  877. package/dist/utils/image-convert.js +45 -0
  878. package/dist/utils/image-convert.js.map +1 -0
  879. package/dist/utils/image-process.d.ts +18 -0
  880. package/dist/utils/image-process.d.ts.map +1 -0
  881. package/dist/utils/image-process.js +83 -0
  882. package/dist/utils/image-process.js.map +1 -0
  883. package/dist/utils/image-resize-core.d.ts +30 -0
  884. package/dist/utils/image-resize-core.d.ts.map +1 -0
  885. package/dist/utils/image-resize-core.js +124 -0
  886. package/dist/utils/image-resize-core.js.map +1 -0
  887. package/dist/utils/image-resize-worker.d.ts +2 -0
  888. package/dist/utils/image-resize-worker.d.ts.map +1 -0
  889. package/dist/utils/image-resize-worker.js +31 -0
  890. package/dist/utils/image-resize-worker.js.map +1 -0
  891. package/dist/utils/image-resize.d.ts +16 -0
  892. package/dist/utils/image-resize.d.ts.map +1 -0
  893. package/dist/utils/image-resize.js +97 -0
  894. package/dist/utils/image-resize.js.map +1 -0
  895. package/dist/utils/ion-user-agent.d.ts +2 -0
  896. package/dist/utils/ion-user-agent.d.ts.map +1 -0
  897. package/dist/utils/ion-user-agent.js +5 -0
  898. package/dist/utils/ion-user-agent.js.map +1 -0
  899. package/dist/utils/json.d.ts +3 -0
  900. package/dist/utils/json.d.ts.map +1 -0
  901. package/dist/utils/json.js +7 -0
  902. package/dist/utils/json.js.map +1 -0
  903. package/dist/utils/management-http.d.ts +25 -0
  904. package/dist/utils/management-http.d.ts.map +1 -0
  905. package/dist/utils/management-http.js +54 -0
  906. package/dist/utils/management-http.js.map +1 -0
  907. package/dist/utils/mime.d.ts +3 -0
  908. package/dist/utils/mime.d.ts.map +1 -0
  909. package/dist/utils/mime.js +110 -0
  910. package/dist/utils/mime.js.map +1 -0
  911. package/dist/utils/open-browser.d.ts +9 -0
  912. package/dist/utils/open-browser.d.ts.map +1 -0
  913. package/dist/utils/open-browser.js +22 -0
  914. package/dist/utils/open-browser.js.map +1 -0
  915. package/dist/utils/paths.d.ts +34 -0
  916. package/dist/utils/paths.d.ts.map +1 -0
  917. package/dist/utils/paths.js +114 -0
  918. package/dist/utils/paths.js.map +1 -0
  919. package/dist/utils/photon.d.ts +21 -0
  920. package/dist/utils/photon.d.ts.map +1 -0
  921. package/dist/utils/photon.js +121 -0
  922. package/dist/utils/photon.js.map +1 -0
  923. package/dist/utils/shell.d.ts +34 -0
  924. package/dist/utils/shell.d.ts.map +1 -0
  925. package/dist/utils/shell.js +216 -0
  926. package/dist/utils/shell.js.map +1 -0
  927. package/dist/utils/sleep.d.ts +5 -0
  928. package/dist/utils/sleep.d.ts.map +1 -0
  929. package/dist/utils/sleep.js +17 -0
  930. package/dist/utils/sleep.js.map +1 -0
  931. package/dist/utils/syntax-highlight.d.ts +13 -0
  932. package/dist/utils/syntax-highlight.d.ts.map +1 -0
  933. package/dist/utils/syntax-highlight.js +177 -0
  934. package/dist/utils/syntax-highlight.js.map +1 -0
  935. package/dist/utils/text.d.ts +8 -0
  936. package/dist/utils/text.d.ts.map +1 -0
  937. package/dist/utils/text.js +9 -0
  938. package/dist/utils/text.js.map +1 -0
  939. package/dist/utils/tool-result-images.d.ts +19 -0
  940. package/dist/utils/tool-result-images.d.ts.map +1 -0
  941. package/dist/utils/tool-result-images.js +45 -0
  942. package/dist/utils/tool-result-images.js.map +1 -0
  943. package/dist/utils/tools-manager.d.ts +19 -0
  944. package/dist/utils/tools-manager.d.ts.map +1 -0
  945. package/dist/utils/tools-manager.js +382 -0
  946. package/dist/utils/tools-manager.js.map +1 -0
  947. package/dist/utils/version-check.d.ts +19 -0
  948. package/dist/utils/version-check.d.ts.map +1 -0
  949. package/dist/utils/version-check.js +79 -0
  950. package/dist/utils/version-check.js.map +1 -0
  951. package/dist/utils/windows-self-update.d.ts +3 -0
  952. package/dist/utils/windows-self-update.d.ts.map +1 -0
  953. package/dist/utils/windows-self-update.js +77 -0
  954. package/dist/utils/windows-self-update.js.map +1 -0
  955. package/docs/browser-extension.md +108 -0
  956. package/docs/compaction.md +444 -0
  957. package/docs/containerization.md +156 -0
  958. package/docs/custom-provider.md +777 -0
  959. package/docs/development.md +90 -0
  960. package/docs/docs.json +164 -0
  961. package/docs/environment-variables.md +101 -0
  962. package/docs/extensions.md +3033 -0
  963. package/docs/images/doom-extension.png +0 -0
  964. package/docs/images/exy.png +0 -0
  965. package/docs/images/interactive-mode.png +0 -0
  966. package/docs/images/tree-view.png +0 -0
  967. package/docs/index.md +85 -0
  968. package/docs/json.md +98 -0
  969. package/docs/keybindings.md +239 -0
  970. package/docs/llama-cpp.md +101 -0
  971. package/docs/models.md +574 -0
  972. package/docs/packages.md +228 -0
  973. package/docs/prompt-templates.md +96 -0
  974. package/docs/providers.md +321 -0
  975. package/docs/quickstart.md +168 -0
  976. package/docs/rpc.md +1618 -0
  977. package/docs/sdk.md +1226 -0
  978. package/docs/security.md +59 -0
  979. package/docs/session-format.md +450 -0
  980. package/docs/sessions.md +145 -0
  981. package/docs/settings.md +408 -0
  982. package/docs/shell-aliases.md +13 -0
  983. package/docs/skills.md +241 -0
  984. package/docs/terminal-setup.md +192 -0
  985. package/docs/termux.md +126 -0
  986. package/docs/themes.md +322 -0
  987. package/docs/tmux.md +63 -0
  988. package/docs/tui.md +961 -0
  989. package/docs/usage.md +327 -0
  990. package/docs/webfetch.md +119 -0
  991. package/docs/windows.md +39 -0
  992. package/examples/README.md +28 -0
  993. package/examples/extensions/README.md +213 -0
  994. package/examples/extensions/auto-commit-on-exit.ts +49 -0
  995. package/examples/extensions/bash-spawn-hook.ts +30 -0
  996. package/examples/extensions/bookmark.ts +50 -0
  997. package/examples/extensions/border-status-editor.ts +150 -0
  998. package/examples/extensions/built-in-tool-renderer.ts +249 -0
  999. package/examples/extensions/claude-rules.ts +86 -0
  1000. package/examples/extensions/commands.ts +72 -0
  1001. package/examples/extensions/confirm-destructive.ts +59 -0
  1002. package/examples/extensions/custom-compaction.ts +117 -0
  1003. package/examples/extensions/custom-footer.ts +64 -0
  1004. package/examples/extensions/custom-header.ts +73 -0
  1005. package/examples/extensions/custom-provider-anthropic/index.ts +611 -0
  1006. package/examples/extensions/custom-provider-anthropic/package-lock.json +24 -0
  1007. package/examples/extensions/custom-provider-anthropic/package.json +19 -0
  1008. package/examples/extensions/custom-provider-gitlab-duo/index.ts +405 -0
  1009. package/examples/extensions/custom-provider-gitlab-duo/package.json +16 -0
  1010. package/examples/extensions/custom-provider-gitlab-duo/test.ts +82 -0
  1011. package/examples/extensions/dirty-repo-guard.ts +56 -0
  1012. package/examples/extensions/doom-overlay/README.md +46 -0
  1013. package/examples/extensions/doom-overlay/doom/build/doom.js +21 -0
  1014. package/examples/extensions/doom-overlay/doom/build/doom.wasm +0 -0
  1015. package/examples/extensions/doom-overlay/doom/build.sh +152 -0
  1016. package/examples/extensions/doom-overlay/doom/doomgeneric_pi.c +72 -0
  1017. package/examples/extensions/doom-overlay/doom-component.ts +132 -0
  1018. package/examples/extensions/doom-overlay/doom-engine.ts +173 -0
  1019. package/examples/extensions/doom-overlay/doom-keys.ts +104 -0
  1020. package/examples/extensions/doom-overlay/index.ts +74 -0
  1021. package/examples/extensions/doom-overlay/wad-finder.ts +55 -0
  1022. package/examples/extensions/dynamic-resources/SKILL.md +8 -0
  1023. package/examples/extensions/dynamic-resources/dynamic.json +81 -0
  1024. package/examples/extensions/dynamic-resources/dynamic.md +5 -0
  1025. package/examples/extensions/dynamic-resources/index.ts +15 -0
  1026. package/examples/extensions/dynamic-tools.ts +74 -0
  1027. package/examples/extensions/entry-renderer.ts +41 -0
  1028. package/examples/extensions/event-bus.ts +43 -0
  1029. package/examples/extensions/file-trigger.ts +41 -0
  1030. package/examples/extensions/git-checkpoint.ts +53 -0
  1031. package/examples/extensions/git-merge-and-resolve.ts +115 -0
  1032. package/examples/extensions/github-issue-autocomplete.ts +185 -0
  1033. package/examples/extensions/gondolin/index.ts +531 -0
  1034. package/examples/extensions/gondolin/package-lock.json +185 -0
  1035. package/examples/extensions/gondolin/package.json +19 -0
  1036. package/examples/extensions/handoff.ts +190 -0
  1037. package/examples/extensions/hello.ts +26 -0
  1038. package/examples/extensions/hidden-thinking-label.ts +53 -0
  1039. package/examples/extensions/inline-bash.ts +94 -0
  1040. package/examples/extensions/input-transform-streaming.ts +39 -0
  1041. package/examples/extensions/input-transform.ts +43 -0
  1042. package/examples/extensions/interactive-shell.ts +196 -0
  1043. package/examples/extensions/kimi-deferred-tools.ts +61 -0
  1044. package/examples/extensions/mac-system-theme.ts +47 -0
  1045. package/examples/extensions/message-renderer.ts +59 -0
  1046. package/examples/extensions/minimal-mode.ts +426 -0
  1047. package/examples/extensions/modal-editor.ts +85 -0
  1048. package/examples/extensions/model-status.ts +31 -0
  1049. package/examples/extensions/notify.ts +57 -0
  1050. package/examples/extensions/overlay-qa-tests.ts +1450 -0
  1051. package/examples/extensions/overlay-test.ts +153 -0
  1052. package/examples/extensions/permission-gate.ts +34 -0
  1053. package/examples/extensions/pirate.ts +47 -0
  1054. package/examples/extensions/plan-mode/README.md +66 -0
  1055. package/examples/extensions/plan-mode/index.ts +390 -0
  1056. package/examples/extensions/plan-mode/utils.ts +168 -0
  1057. package/examples/extensions/preset.ts +436 -0
  1058. package/examples/extensions/project-trust.ts +64 -0
  1059. package/examples/extensions/prompt-customizer.ts +97 -0
  1060. package/examples/extensions/protected-paths.ts +30 -0
  1061. package/examples/extensions/provider-payload.ts +18 -0
  1062. package/examples/extensions/qna.ts +118 -0
  1063. package/examples/extensions/question.ts +278 -0
  1064. package/examples/extensions/questionnaire.ts +440 -0
  1065. package/examples/extensions/rainbow-editor.ts +88 -0
  1066. package/examples/extensions/reload-runtime.ts +37 -0
  1067. package/examples/extensions/rpc-demo.ts +118 -0
  1068. package/examples/extensions/sandbox/index.ts +321 -0
  1069. package/examples/extensions/sandbox/package-lock.json +92 -0
  1070. package/examples/extensions/sandbox/package.json +19 -0
  1071. package/examples/extensions/send-user-message.ts +97 -0
  1072. package/examples/extensions/session-name.ts +27 -0
  1073. package/examples/extensions/shutdown-command.ts +63 -0
  1074. package/examples/extensions/snake.ts +343 -0
  1075. package/examples/extensions/space-invaders.ts +560 -0
  1076. package/examples/extensions/ssh.ts +220 -0
  1077. package/examples/extensions/status-line.ts +32 -0
  1078. package/examples/extensions/structured-output.ts +65 -0
  1079. package/examples/extensions/subagent/README.md +177 -0
  1080. package/examples/extensions/subagent/agents/planner.md +37 -0
  1081. package/examples/extensions/subagent/agents/reviewer.md +35 -0
  1082. package/examples/extensions/subagent/agents/scout.md +50 -0
  1083. package/examples/extensions/subagent/agents/worker.md +24 -0
  1084. package/examples/extensions/subagent/agents.ts +157 -0
  1085. package/examples/extensions/subagent/index.ts +1038 -0
  1086. package/examples/extensions/subagent/prompts/implement-and-review.md +10 -0
  1087. package/examples/extensions/subagent/prompts/implement.md +10 -0
  1088. package/examples/extensions/subagent/prompts/scout-and-plan.md +9 -0
  1089. package/examples/extensions/summarize.ts +199 -0
  1090. package/examples/extensions/system-prompt-header.ts +17 -0
  1091. package/examples/extensions/tic-tac-toe.ts +1008 -0
  1092. package/examples/extensions/timed-confirm.ts +70 -0
  1093. package/examples/extensions/titlebar-spinner.ts +58 -0
  1094. package/examples/extensions/todo.ts +297 -0
  1095. package/examples/extensions/tool-override.ts +144 -0
  1096. package/examples/extensions/tools.ts +146 -0
  1097. package/examples/extensions/trigger-compact.ts +50 -0
  1098. package/examples/extensions/truncated-tool.ts +195 -0
  1099. package/examples/extensions/widget-placement.ts +9 -0
  1100. package/examples/extensions/with-deps/index.ts +32 -0
  1101. package/examples/extensions/with-deps/package-lock.json +31 -0
  1102. package/examples/extensions/with-deps/package.json +22 -0
  1103. package/examples/extensions/working-indicator.ts +123 -0
  1104. package/examples/extensions/working-message-test.ts +25 -0
  1105. package/examples/plugins/ion-example-plugin/README.md +38 -0
  1106. package/examples/plugins/ion-example-plugin/package.json +10 -0
  1107. package/examples/plugins/ion-example-plugin/src/contract.ts +13 -0
  1108. package/examples/plugins/ion-example-plugin/src/session.ts +23 -0
  1109. package/examples/plugins/ion-example-plugin/src/tui.ts +31 -0
  1110. package/examples/rpc-extension-ui.ts +641 -0
  1111. package/examples/sdk/01-minimal.ts +26 -0
  1112. package/examples/sdk/02-custom-model.ts +49 -0
  1113. package/examples/sdk/03-custom-prompt.ts +70 -0
  1114. package/examples/sdk/04-skills.ts +55 -0
  1115. package/examples/sdk/05-tools.ts +48 -0
  1116. package/examples/sdk/06-extensions.ts +94 -0
  1117. package/examples/sdk/07-context-files.ts +42 -0
  1118. package/examples/sdk/08-prompt-templates.ts +51 -0
  1119. package/examples/sdk/09-api-keys-and-oauth.ts +34 -0
  1120. package/examples/sdk/10-settings.ts +53 -0
  1121. package/examples/sdk/11-sessions.ts +52 -0
  1122. package/examples/sdk/12-full-control.ts +74 -0
  1123. package/examples/sdk/13-session-runtime.ts +67 -0
  1124. package/examples/sdk/README.md +140 -0
  1125. package/npm-shrinkwrap.json +1912 -0
  1126. package/package.json +108 -0
@@ -0,0 +1,153 @@
1
+ /**
2
+ * robots.txt parsing for the polite crawler.
3
+ *
4
+ * Follows RFC 9309 where it matters: the group whose user-agent matches ours
5
+ * (or `*` when none does) supplies the rules, the longest matching pattern wins,
6
+ * and an Allow beats a Disallow of the same length. A missing or unreadable
7
+ * robots.txt means "allowed", which is what the RFC requires and what a crawler
8
+ * must assume when the file is absent.
9
+ *
10
+ * The file is fetched through the shared guardrails, so a hostile robots.txt
11
+ * cannot redirect the crawler somewhere it was already barred from going.
12
+ */
13
+ import { assertBytesWithinBudget, guardedRequest, WEBFETCH_MAX_BYTES, WEBFETCH_REQUEST_TIMEOUT_MS, } from "./guardrails.js";
14
+ export const ROBOTS_USER_AGENT = "ion";
15
+ function patternToRegex(pattern) {
16
+ if (pattern.length === 0)
17
+ return undefined;
18
+ const anchored = pattern.endsWith("$");
19
+ const body = anchored ? pattern.slice(0, -1) : pattern;
20
+ let source = "";
21
+ for (const character of body) {
22
+ if (character === "*") {
23
+ source += ".*";
24
+ }
25
+ else {
26
+ source += character.replace(/[.+?^${}()|[\]\\]/g, "\\$&");
27
+ }
28
+ }
29
+ return { regex: new RegExp(`^${source}${anchored ? "$" : ""}`), anchored };
30
+ }
31
+ /** Parse a robots.txt body into a policy for {@link ROBOTS_USER_AGENT}. */
32
+ export function parseRobotsTxt(text, userAgent = ROBOTS_USER_AGENT) {
33
+ const agent = userAgent.toLowerCase();
34
+ const groups = [];
35
+ let current;
36
+ let expectingAgents = false;
37
+ for (const rawLine of text.split(/\r?\n/)) {
38
+ const line = rawLine.replace(/#.*$/, "").trim();
39
+ if (line.length === 0)
40
+ continue;
41
+ const separator = line.indexOf(":");
42
+ if (separator === -1)
43
+ continue;
44
+ const field = line.slice(0, separator).trim().toLowerCase();
45
+ const value = line.slice(separator + 1).trim();
46
+ if (field === "user-agent") {
47
+ if (!current || !expectingAgents) {
48
+ current = { agents: [], lines: [] };
49
+ groups.push(current);
50
+ expectingAgents = true;
51
+ }
52
+ current.agents.push(value.toLowerCase());
53
+ continue;
54
+ }
55
+ // Any non-user-agent field ends the agent block, per RFC 9309.
56
+ expectingAgents = false;
57
+ if (!current)
58
+ continue;
59
+ current.lines.push(`${field}:${value}`);
60
+ }
61
+ const matches = (group) => group.agents.some((candidate) => candidate !== "*" && agent.includes(candidate));
62
+ const specific = groups.find(matches);
63
+ const wildcard = groups.find((group) => group.agents.includes("*"));
64
+ const selected = specific ?? wildcard;
65
+ const policy = { rules: [], sitemaps: [] };
66
+ if (!selected)
67
+ return policy;
68
+ for (const entry of selected.lines) {
69
+ const separator = entry.indexOf(":");
70
+ const field = entry.slice(0, separator);
71
+ const value = entry.slice(separator + 1);
72
+ if (field === "sitemap") {
73
+ if (value.length > 0)
74
+ policy.sitemaps.push(value);
75
+ continue;
76
+ }
77
+ if (field === "crawl-delay") {
78
+ const seconds = Number.parseFloat(value);
79
+ if (Number.isFinite(seconds) && seconds >= 0)
80
+ policy.crawlDelaySeconds = seconds;
81
+ continue;
82
+ }
83
+ if (field !== "allow" && field !== "disallow")
84
+ continue;
85
+ const compiled = patternToRegex(value);
86
+ // `Disallow:` with an empty value means allow everything, so it adds no rule.
87
+ if (!compiled)
88
+ continue;
89
+ policy.rules.push({
90
+ allow: field === "allow",
91
+ pattern: value,
92
+ regex: compiled.regex,
93
+ length: value.length,
94
+ });
95
+ }
96
+ return policy;
97
+ }
98
+ /** Longest matching pattern wins; an Allow wins a tie. No rules means allowed. */
99
+ export function isPathAllowed(policy, pathWithQuery) {
100
+ let best;
101
+ for (const rule of policy.rules) {
102
+ if (!rule.regex.test(pathWithQuery))
103
+ continue;
104
+ if (!best || rule.length > best.length || (rule.length === best.length && rule.allow && !best.allow)) {
105
+ best = rule;
106
+ }
107
+ }
108
+ return best ? best.allow : true;
109
+ }
110
+ export function isUrlAllowed(policy, url) {
111
+ return isPathAllowed(policy, `${url.pathname}${url.search}`);
112
+ }
113
+ /**
114
+ * Fetch and parse a site's robots.txt. Returns an allow-everything policy when
115
+ * the file is missing, unreadable, or not text: a crawler must not refuse to
116
+ * read a site merely because the site failed to describe its own rules, and it
117
+ * must not guess rules it was not given.
118
+ */
119
+ export async function fetchRobotsPolicy(originUrl, options = {}) {
120
+ const allowAll = { rules: [], sitemaps: [] };
121
+ const robotsUrl = new URL("/robots.txt", originUrl.origin);
122
+ try {
123
+ const response = await guardedRequest(robotsUrl.href, {
124
+ headers: { "User-Agent": options.userAgent ?? ROBOTS_USER_AGENT },
125
+ signal: options.signal,
126
+ lookup: options.lookup,
127
+ request: options.request,
128
+ maxBytes: options.maxBytes ?? WEBFETCH_MAX_BYTES,
129
+ timeoutMs: WEBFETCH_REQUEST_TIMEOUT_MS,
130
+ });
131
+ // 4xx means no published rules; only a served body is authoritative.
132
+ if (response.statusCode >= 400)
133
+ return allowAll;
134
+ const chunks = [];
135
+ let totalBytes = 0;
136
+ for await (const chunk of response.body) {
137
+ totalBytes += chunk.length;
138
+ assertBytesWithinBudget(totalBytes, options.maxBytes ?? WEBFETCH_MAX_BYTES);
139
+ chunks.push(chunk);
140
+ }
141
+ const merged = new Uint8Array(totalBytes);
142
+ let offset = 0;
143
+ for (const chunk of chunks) {
144
+ merged.set(chunk, offset);
145
+ offset += chunk.length;
146
+ }
147
+ return parseRobotsTxt(new TextDecoder().decode(merged), options.userAgent ?? ROBOTS_USER_AGENT);
148
+ }
149
+ catch {
150
+ return allowAll;
151
+ }
152
+ }
153
+ //# sourceMappingURL=robots.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"robots.js","sourceRoot":"","sources":["../../../src/core/webfetch/robots.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * robots.txt parsing for the polite crawler.\n *\n * Follows RFC 9309 where it matters: the group whose user-agent matches ours\n * (or `*` when none does) supplies the rules, the longest matching pattern wins,\n * and an Allow beats a Disallow of the same length. A missing or unreadable\n * robots.txt means \"allowed\", which is what the RFC requires and what a crawler\n * must assume when the file is absent.\n *\n * The file is fetched through the shared guardrails, so a hostile robots.txt\n * cannot redirect the crawler somewhere it was already barred from going.\n */\n\nimport {\n\tassertBytesWithinBudget,\n\ttype DnsLookup,\n\tguardedRequest,\n\ttype LowLevelRequestFn,\n\tWEBFETCH_MAX_BYTES,\n\tWEBFETCH_REQUEST_TIMEOUT_MS,\n} from \"./guardrails.ts\";\n\nexport const ROBOTS_USER_AGENT = \"ion\";\n\nexport interface RobotsRule {\n\tallow: boolean;\n\tpattern: string;\n\tregex: RegExp;\n\tlength: number;\n}\n\nexport interface RobotsPolicy {\n\trules: RobotsRule[];\n\t/** Seconds requested by Crawl-delay, when the file declares one. */\n\tcrawlDelaySeconds?: number;\n\tsitemaps: string[];\n}\n\nfunction patternToRegex(pattern: string): { regex: RegExp; anchored: boolean } | undefined {\n\tif (pattern.length === 0) return undefined;\n\tconst anchored = pattern.endsWith(\"$\");\n\tconst body = anchored ? pattern.slice(0, -1) : pattern;\n\tlet source = \"\";\n\tfor (const character of body) {\n\t\tif (character === \"*\") {\n\t\t\tsource += \".*\";\n\t\t} else {\n\t\t\tsource += character.replace(/[.+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\t\t}\n\t}\n\treturn { regex: new RegExp(`^${source}${anchored ? \"$\" : \"\"}`), anchored };\n}\n\n/** Parse a robots.txt body into a policy for {@link ROBOTS_USER_AGENT}. */\nexport function parseRobotsTxt(text: string, userAgent: string = ROBOTS_USER_AGENT): RobotsPolicy {\n\tconst agent = userAgent.toLowerCase();\n\tconst groups: { agents: string[]; lines: string[] }[] = [];\n\tlet current: { agents: string[]; lines: string[] } | undefined;\n\tlet expectingAgents = false;\n\n\tfor (const rawLine of text.split(/\\r?\\n/)) {\n\t\tconst line = rawLine.replace(/#.*$/, \"\").trim();\n\t\tif (line.length === 0) continue;\n\t\tconst separator = line.indexOf(\":\");\n\t\tif (separator === -1) continue;\n\t\tconst field = line.slice(0, separator).trim().toLowerCase();\n\t\tconst value = line.slice(separator + 1).trim();\n\n\t\tif (field === \"user-agent\") {\n\t\t\tif (!current || !expectingAgents) {\n\t\t\t\tcurrent = { agents: [], lines: [] };\n\t\t\t\tgroups.push(current);\n\t\t\t\texpectingAgents = true;\n\t\t\t}\n\t\t\tcurrent.agents.push(value.toLowerCase());\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Any non-user-agent field ends the agent block, per RFC 9309.\n\t\texpectingAgents = false;\n\t\tif (!current) continue;\n\t\tcurrent.lines.push(`${field}:${value}`);\n\t}\n\n\tconst matches = (group: { agents: string[] }) =>\n\t\tgroup.agents.some((candidate) => candidate !== \"*\" && agent.includes(candidate));\n\tconst specific = groups.find(matches);\n\tconst wildcard = groups.find((group) => group.agents.includes(\"*\"));\n\tconst selected = specific ?? wildcard;\n\n\tconst policy: RobotsPolicy = { rules: [], sitemaps: [] };\n\tif (!selected) return policy;\n\n\tfor (const entry of selected.lines) {\n\t\tconst separator = entry.indexOf(\":\");\n\t\tconst field = entry.slice(0, separator);\n\t\tconst value = entry.slice(separator + 1);\n\t\tif (field === \"sitemap\") {\n\t\t\tif (value.length > 0) policy.sitemaps.push(value);\n\t\t\tcontinue;\n\t\t}\n\t\tif (field === \"crawl-delay\") {\n\t\t\tconst seconds = Number.parseFloat(value);\n\t\t\tif (Number.isFinite(seconds) && seconds >= 0) policy.crawlDelaySeconds = seconds;\n\t\t\tcontinue;\n\t\t}\n\t\tif (field !== \"allow\" && field !== \"disallow\") continue;\n\t\tconst compiled = patternToRegex(value);\n\t\t// `Disallow:` with an empty value means allow everything, so it adds no rule.\n\t\tif (!compiled) continue;\n\t\tpolicy.rules.push({\n\t\t\tallow: field === \"allow\",\n\t\t\tpattern: value,\n\t\t\tregex: compiled.regex,\n\t\t\tlength: value.length,\n\t\t});\n\t}\n\treturn policy;\n}\n\n/** Longest matching pattern wins; an Allow wins a tie. No rules means allowed. */\nexport function isPathAllowed(policy: RobotsPolicy, pathWithQuery: string): boolean {\n\tlet best: RobotsRule | undefined;\n\tfor (const rule of policy.rules) {\n\t\tif (!rule.regex.test(pathWithQuery)) continue;\n\t\tif (!best || rule.length > best.length || (rule.length === best.length && rule.allow && !best.allow)) {\n\t\t\tbest = rule;\n\t\t}\n\t}\n\treturn best ? best.allow : true;\n}\n\nexport function isUrlAllowed(policy: RobotsPolicy, url: URL): boolean {\n\treturn isPathAllowed(policy, `${url.pathname}${url.search}`);\n}\n\nexport interface RobotsFetchOptions {\n\tuserAgent?: string;\n\tsignal?: AbortSignal;\n\tlookup?: DnsLookup;\n\trequest?: LowLevelRequestFn;\n\tmaxBytes?: number;\n}\n\n/**\n * Fetch and parse a site's robots.txt. Returns an allow-everything policy when\n * the file is missing, unreadable, or not text: a crawler must not refuse to\n * read a site merely because the site failed to describe its own rules, and it\n * must not guess rules it was not given.\n */\nexport async function fetchRobotsPolicy(originUrl: URL, options: RobotsFetchOptions = {}): Promise<RobotsPolicy> {\n\tconst allowAll: RobotsPolicy = { rules: [], sitemaps: [] };\n\tconst robotsUrl = new URL(\"/robots.txt\", originUrl.origin);\n\ttry {\n\t\tconst response = await guardedRequest(robotsUrl.href, {\n\t\t\theaders: { \"User-Agent\": options.userAgent ?? ROBOTS_USER_AGENT },\n\t\t\tsignal: options.signal,\n\t\t\tlookup: options.lookup,\n\t\t\trequest: options.request,\n\t\t\tmaxBytes: options.maxBytes ?? WEBFETCH_MAX_BYTES,\n\t\t\ttimeoutMs: WEBFETCH_REQUEST_TIMEOUT_MS,\n\t\t});\n\t\t// 4xx means no published rules; only a served body is authoritative.\n\t\tif (response.statusCode >= 400) return allowAll;\n\t\tconst chunks: Uint8Array[] = [];\n\t\tlet totalBytes = 0;\n\t\tfor await (const chunk of response.body) {\n\t\t\ttotalBytes += chunk.length;\n\t\t\tassertBytesWithinBudget(totalBytes, options.maxBytes ?? WEBFETCH_MAX_BYTES);\n\t\t\tchunks.push(chunk);\n\t\t}\n\t\tconst merged = new Uint8Array(totalBytes);\n\t\tlet offset = 0;\n\t\tfor (const chunk of chunks) {\n\t\t\tmerged.set(chunk, offset);\n\t\t\toffset += chunk.length;\n\t\t}\n\t\treturn parseRobotsTxt(new TextDecoder().decode(merged), options.userAgent ?? ROBOTS_USER_AGENT);\n\t} catch {\n\t\treturn allowAll;\n\t}\n}\n"]}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * Search intent: the harness-side description of what a search should return.
3
+ *
4
+ * One shape serves every backend, so `webfetch` can ask for images or news
5
+ * without caring which provider answers. Cardinality belongs to the modality
6
+ * (`results: {web: 5, images: 3}`) because a flat `sources + limit` is
7
+ * ambiguous: 5 total, or 5 per source?
8
+ *
9
+ * Only fields a backend can actually honor live here. Deliberately absent until
10
+ * something can serve them: per-source purpose labels, query-rewrite toggles,
11
+ * and search budgets/planning. `strategy` is reserved for those.
12
+ *
13
+ * Tag sugar (`[images=3] [news=5] [recent=7d] [domains=openai.com] query`)
14
+ * compiles into this type in the tool layer; backends never see tags.
15
+ */
16
+ /** Per-modality result counts. Absent means "do not request this source". */
17
+ export interface SearchResultCounts {
18
+ web?: number;
19
+ images?: number;
20
+ news?: number;
21
+ }
22
+ export interface SearchFilters {
23
+ /** Hostnames or domain prefixes to restrict results to. */
24
+ domains?: string[];
25
+ /** Maximum age of a result, e.g. `7d`, `24h`, `1w`, `1m`. Provider-mapped. */
26
+ recency?: string;
27
+ /** Two-letter language/country hint where the backend supports one. */
28
+ language?: string;
29
+ }
30
+ export interface SearchIntent {
31
+ query: string;
32
+ results?: SearchResultCounts;
33
+ filters?: SearchFilters;
34
+ /** Reserved for v2 search planning (depth budgets, fan-out, dedup). */
35
+ strategy?: never;
36
+ }
37
+ export declare const SEARCH_MAX_PER_SOURCE = 100;
38
+ /** Default per-source count when the caller gives no `results` block. */
39
+ export declare const SEARCH_DEFAULT_WEB_RESULTS = 5;
40
+ export declare const SEARCH_DEFAULT_WINDOW_MS = 30000;
41
+ export declare class SearchIntentError extends Error {
42
+ constructor(message: string);
43
+ }
44
+ /** Normalized intent: counts are clamped and unknown keys dropped. `web` is
45
+ * present unless the caller named other sources explicitly. */
46
+ export interface ResolvedSearchIntent {
47
+ query: string;
48
+ results: SearchResultCounts;
49
+ filters: {
50
+ domains?: string[];
51
+ recencyMs?: number;
52
+ language?: string;
53
+ };
54
+ }
55
+ export declare function resolveSearchIntent(intent: SearchIntent): ResolvedSearchIntent;
56
+ export declare function parseRecency(value: string): number;
57
+ /** Total results requested across every modality, for budget reporting. */
58
+ export declare function totalRequestedResults(intent: ResolvedSearchIntent): number;
59
+ //# sourceMappingURL=search-intent.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-intent.d.ts","sourceRoot":"","sources":["../../../src/core/webfetch/search-intent.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH,6EAA6E;AAC7E,MAAM,WAAW,kBAAkB;IAClC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,aAAa;IAC7B,2DAA2D;IAC3D,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,8EAA8E;IAC9E,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,kBAAkB,CAAC;IAC7B,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,uEAAuE;IACvE,QAAQ,CAAC,EAAE,KAAK,CAAC;CACjB;AAED,eAAO,MAAM,qBAAqB,MAA+B,CAAC;AAClE,yEAAyE;AACzE,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAC5C,eAAO,MAAM,wBAAwB,QAA8B,CAAC;AAYpE,qBAAa,iBAAkB,SAAQ,KAAK;IAC3C,YAAY,OAAO,EAAE,MAAM,EAG1B;CACD;AAUD;+DAC+D;AAC/D,MAAM,WAAW,oBAAoB;IACpC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,kBAAkB,CAAC;IAC5B,OAAO,EAAE;QAAE,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvE;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,YAAY,GAAG,oBAAoB,CA2B9E;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAUlD;AAED,2EAA2E;AAC3E,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,oBAAoB,GAAG,MAAM,CAE1E","sourcesContent":["/**\n * Search intent: the harness-side description of what a search should return.\n *\n * One shape serves every backend, so `webfetch` can ask for images or news\n * without caring which provider answers. Cardinality belongs to the modality\n * (`results: {web: 5, images: 3}`) because a flat `sources + limit` is\n * ambiguous: 5 total, or 5 per source?\n *\n * Only fields a backend can actually honor live here. Deliberately absent until\n * something can serve them: per-source purpose labels, query-rewrite toggles,\n * and search budgets/planning. `strategy` is reserved for those.\n *\n * Tag sugar (`[images=3] [news=5] [recent=7d] [domains=openai.com] query`)\n * compiles into this type in the tool layer; backends never see tags.\n */\n\nimport { WEBFETCH_FIRECRAWL_MAX_LIMIT, WEBFETCH_REQUEST_TIMEOUT_MS } from \"./guardrails.ts\";\n\n/** Per-modality result counts. Absent means \"do not request this source\". */\nexport interface SearchResultCounts {\n\tweb?: number;\n\timages?: number;\n\tnews?: number;\n}\n\nexport interface SearchFilters {\n\t/** Hostnames or domain prefixes to restrict results to. */\n\tdomains?: string[];\n\t/** Maximum age of a result, e.g. `7d`, `24h`, `1w`, `1m`. Provider-mapped. */\n\trecency?: string;\n\t/** Two-letter language/country hint where the backend supports one. */\n\tlanguage?: string;\n}\n\nexport interface SearchIntent {\n\tquery: string;\n\tresults?: SearchResultCounts;\n\tfilters?: SearchFilters;\n\t/** Reserved for v2 search planning (depth budgets, fan-out, dedup). */\n\tstrategy?: never;\n}\n\nexport const SEARCH_MAX_PER_SOURCE = WEBFETCH_FIRECRAWL_MAX_LIMIT;\n/** Default per-source count when the caller gives no `results` block. */\nexport const SEARCH_DEFAULT_WEB_RESULTS = 5;\nexport const SEARCH_DEFAULT_WINDOW_MS = WEBFETCH_REQUEST_TIMEOUT_MS;\n\nconst DURATION_PATTERN = /^(\\d+)\\s*(h|d|w|m|y)$/;\n\nconst DURATION_MS: Record<string, number> = {\n\th: 60 * 60 * 1000,\n\td: 24 * 60 * 60 * 1000,\n\tw: 7 * 24 * 60 * 60 * 1000,\n\tm: 30 * 24 * 60 * 60 * 1000,\n\ty: 365 * 24 * 60 * 60 * 1000,\n};\n\nexport class SearchIntentError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SearchIntentError\";\n\t}\n}\n\n/** Clamp one count into 1..SEARCH_MAX_PER_SOURCE, rejecting non-integers. */\nfunction clampCount(value: number, source: string): number {\n\tif (!Number.isFinite(value) || !Number.isInteger(value) || value < 1) {\n\t\tthrow new SearchIntentError(`results.${source} must be a positive integer`);\n\t}\n\treturn Math.min(value, SEARCH_MAX_PER_SOURCE);\n}\n\n/** Normalized intent: counts are clamped and unknown keys dropped. `web` is\n * present unless the caller named other sources explicitly. */\nexport interface ResolvedSearchIntent {\n\tquery: string;\n\tresults: SearchResultCounts;\n\tfilters: { domains?: string[]; recencyMs?: number; language?: string };\n}\n\nexport function resolveSearchIntent(intent: SearchIntent): ResolvedSearchIntent {\n\t// A named source replaces the default web-only set rather than adding to it.\n\tconst query = intent.query.trim();\n\tif (!query) {\n\t\tthrow new SearchIntentError(\"Search query must not be empty\");\n\t}\n\tconst requested = intent.results ?? {};\n\t// The web default applies only when no source was requested at all. Once the\n\t// caller names a source (say `[images=3]` or `{images: 3}`), the requested set\n\t// is exactly what they asked for: asking for images must not also return pages.\n\tconst namesSources = Object.keys(requested).length > 0;\n\tconst results: ResolvedSearchIntent[\"results\"] = {};\n\tif (!namesSources || requested.web !== undefined) {\n\t\tresults.web = requested.web === undefined ? SEARCH_DEFAULT_WEB_RESULTS : clampCount(requested.web, \"web\");\n\t}\n\tif (requested.images !== undefined) results.images = clampCount(requested.images, \"images\");\n\tif (requested.news !== undefined) results.news = clampCount(requested.news, \"news\");\n\n\tconst filters: ResolvedSearchIntent[\"filters\"] = {};\n\tconst domains = intent.filters?.domains\n\t\t?.map((domain) => domain.trim().toLowerCase())\n\t\t.filter((domain) => domain.length > 0);\n\tif (domains && domains.length > 0) filters.domains = [...new Set(domains)];\n\tconst language = intent.filters?.language?.trim();\n\tif (language) filters.language = language;\n\tif (intent.filters?.recency !== undefined) filters.recencyMs = parseRecency(intent.filters.recency);\n\treturn { query, results, filters };\n}\n\nexport function parseRecency(value: string): number {\n\tconst match = DURATION_PATTERN.exec(value.trim().toLowerCase());\n\tif (!match) {\n\t\tthrow new SearchIntentError(`filters.recency must look like 24h, 7d, 2w, 6m, or 1y (got \"${value}\")`);\n\t}\n\tconst amount = Number.parseInt(match[1], 10);\n\tif (!Number.isFinite(amount) || amount < 1) {\n\t\tthrow new SearchIntentError(`filters.recency must be a positive duration (got \"${value}\")`);\n\t}\n\treturn amount * DURATION_MS[match[2]];\n}\n\n/** Total results requested across every modality, for budget reporting. */\nexport function totalRequestedResults(intent: ResolvedSearchIntent): number {\n\treturn Object.values(intent.results).reduce<number>((sum, count) => sum + (count ?? 0), 0);\n}\n"]}
@@ -0,0 +1,89 @@
1
+ /**
2
+ * Search intent: the harness-side description of what a search should return.
3
+ *
4
+ * One shape serves every backend, so `webfetch` can ask for images or news
5
+ * without caring which provider answers. Cardinality belongs to the modality
6
+ * (`results: {web: 5, images: 3}`) because a flat `sources + limit` is
7
+ * ambiguous: 5 total, or 5 per source?
8
+ *
9
+ * Only fields a backend can actually honor live here. Deliberately absent until
10
+ * something can serve them: per-source purpose labels, query-rewrite toggles,
11
+ * and search budgets/planning. `strategy` is reserved for those.
12
+ *
13
+ * Tag sugar (`[images=3] [news=5] [recent=7d] [domains=openai.com] query`)
14
+ * compiles into this type in the tool layer; backends never see tags.
15
+ */
16
+ import { WEBFETCH_FIRECRAWL_MAX_LIMIT, WEBFETCH_REQUEST_TIMEOUT_MS } from "./guardrails.js";
17
+ export const SEARCH_MAX_PER_SOURCE = WEBFETCH_FIRECRAWL_MAX_LIMIT;
18
+ /** Default per-source count when the caller gives no `results` block. */
19
+ export const SEARCH_DEFAULT_WEB_RESULTS = 5;
20
+ export const SEARCH_DEFAULT_WINDOW_MS = WEBFETCH_REQUEST_TIMEOUT_MS;
21
+ const DURATION_PATTERN = /^(\d+)\s*(h|d|w|m|y)$/;
22
+ const DURATION_MS = {
23
+ h: 60 * 60 * 1000,
24
+ d: 24 * 60 * 60 * 1000,
25
+ w: 7 * 24 * 60 * 60 * 1000,
26
+ m: 30 * 24 * 60 * 60 * 1000,
27
+ y: 365 * 24 * 60 * 60 * 1000,
28
+ };
29
+ export class SearchIntentError extends Error {
30
+ constructor(message) {
31
+ super(message);
32
+ this.name = "SearchIntentError";
33
+ }
34
+ }
35
+ /** Clamp one count into 1..SEARCH_MAX_PER_SOURCE, rejecting non-integers. */
36
+ function clampCount(value, source) {
37
+ if (!Number.isFinite(value) || !Number.isInteger(value) || value < 1) {
38
+ throw new SearchIntentError(`results.${source} must be a positive integer`);
39
+ }
40
+ return Math.min(value, SEARCH_MAX_PER_SOURCE);
41
+ }
42
+ export function resolveSearchIntent(intent) {
43
+ // A named source replaces the default web-only set rather than adding to it.
44
+ const query = intent.query.trim();
45
+ if (!query) {
46
+ throw new SearchIntentError("Search query must not be empty");
47
+ }
48
+ const requested = intent.results ?? {};
49
+ // The web default applies only when no source was requested at all. Once the
50
+ // caller names a source (say `[images=3]` or `{images: 3}`), the requested set
51
+ // is exactly what they asked for: asking for images must not also return pages.
52
+ const namesSources = Object.keys(requested).length > 0;
53
+ const results = {};
54
+ if (!namesSources || requested.web !== undefined) {
55
+ results.web = requested.web === undefined ? SEARCH_DEFAULT_WEB_RESULTS : clampCount(requested.web, "web");
56
+ }
57
+ if (requested.images !== undefined)
58
+ results.images = clampCount(requested.images, "images");
59
+ if (requested.news !== undefined)
60
+ results.news = clampCount(requested.news, "news");
61
+ const filters = {};
62
+ const domains = intent.filters?.domains
63
+ ?.map((domain) => domain.trim().toLowerCase())
64
+ .filter((domain) => domain.length > 0);
65
+ if (domains && domains.length > 0)
66
+ filters.domains = [...new Set(domains)];
67
+ const language = intent.filters?.language?.trim();
68
+ if (language)
69
+ filters.language = language;
70
+ if (intent.filters?.recency !== undefined)
71
+ filters.recencyMs = parseRecency(intent.filters.recency);
72
+ return { query, results, filters };
73
+ }
74
+ export function parseRecency(value) {
75
+ const match = DURATION_PATTERN.exec(value.trim().toLowerCase());
76
+ if (!match) {
77
+ throw new SearchIntentError(`filters.recency must look like 24h, 7d, 2w, 6m, or 1y (got "${value}")`);
78
+ }
79
+ const amount = Number.parseInt(match[1], 10);
80
+ if (!Number.isFinite(amount) || amount < 1) {
81
+ throw new SearchIntentError(`filters.recency must be a positive duration (got "${value}")`);
82
+ }
83
+ return amount * DURATION_MS[match[2]];
84
+ }
85
+ /** Total results requested across every modality, for budget reporting. */
86
+ export function totalRequestedResults(intent) {
87
+ return Object.values(intent.results).reduce((sum, count) => sum + (count ?? 0), 0);
88
+ }
89
+ //# sourceMappingURL=search-intent.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-intent.js","sourceRoot":"","sources":["../../../src/core/webfetch/search-intent.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Search intent: the harness-side description of what a search should return.\n *\n * One shape serves every backend, so `webfetch` can ask for images or news\n * without caring which provider answers. Cardinality belongs to the modality\n * (`results: {web: 5, images: 3}`) because a flat `sources + limit` is\n * ambiguous: 5 total, or 5 per source?\n *\n * Only fields a backend can actually honor live here. Deliberately absent until\n * something can serve them: per-source purpose labels, query-rewrite toggles,\n * and search budgets/planning. `strategy` is reserved for those.\n *\n * Tag sugar (`[images=3] [news=5] [recent=7d] [domains=openai.com] query`)\n * compiles into this type in the tool layer; backends never see tags.\n */\n\nimport { WEBFETCH_FIRECRAWL_MAX_LIMIT, WEBFETCH_REQUEST_TIMEOUT_MS } from \"./guardrails.ts\";\n\n/** Per-modality result counts. Absent means \"do not request this source\". */\nexport interface SearchResultCounts {\n\tweb?: number;\n\timages?: number;\n\tnews?: number;\n}\n\nexport interface SearchFilters {\n\t/** Hostnames or domain prefixes to restrict results to. */\n\tdomains?: string[];\n\t/** Maximum age of a result, e.g. `7d`, `24h`, `1w`, `1m`. Provider-mapped. */\n\trecency?: string;\n\t/** Two-letter language/country hint where the backend supports one. */\n\tlanguage?: string;\n}\n\nexport interface SearchIntent {\n\tquery: string;\n\tresults?: SearchResultCounts;\n\tfilters?: SearchFilters;\n\t/** Reserved for v2 search planning (depth budgets, fan-out, dedup). */\n\tstrategy?: never;\n}\n\nexport const SEARCH_MAX_PER_SOURCE = WEBFETCH_FIRECRAWL_MAX_LIMIT;\n/** Default per-source count when the caller gives no `results` block. */\nexport const SEARCH_DEFAULT_WEB_RESULTS = 5;\nexport const SEARCH_DEFAULT_WINDOW_MS = WEBFETCH_REQUEST_TIMEOUT_MS;\n\nconst DURATION_PATTERN = /^(\\d+)\\s*(h|d|w|m|y)$/;\n\nconst DURATION_MS: Record<string, number> = {\n\th: 60 * 60 * 1000,\n\td: 24 * 60 * 60 * 1000,\n\tw: 7 * 24 * 60 * 60 * 1000,\n\tm: 30 * 24 * 60 * 60 * 1000,\n\ty: 365 * 24 * 60 * 60 * 1000,\n};\n\nexport class SearchIntentError extends Error {\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = \"SearchIntentError\";\n\t}\n}\n\n/** Clamp one count into 1..SEARCH_MAX_PER_SOURCE, rejecting non-integers. */\nfunction clampCount(value: number, source: string): number {\n\tif (!Number.isFinite(value) || !Number.isInteger(value) || value < 1) {\n\t\tthrow new SearchIntentError(`results.${source} must be a positive integer`);\n\t}\n\treturn Math.min(value, SEARCH_MAX_PER_SOURCE);\n}\n\n/** Normalized intent: counts are clamped and unknown keys dropped. `web` is\n * present unless the caller named other sources explicitly. */\nexport interface ResolvedSearchIntent {\n\tquery: string;\n\tresults: SearchResultCounts;\n\tfilters: { domains?: string[]; recencyMs?: number; language?: string };\n}\n\nexport function resolveSearchIntent(intent: SearchIntent): ResolvedSearchIntent {\n\t// A named source replaces the default web-only set rather than adding to it.\n\tconst query = intent.query.trim();\n\tif (!query) {\n\t\tthrow new SearchIntentError(\"Search query must not be empty\");\n\t}\n\tconst requested = intent.results ?? {};\n\t// The web default applies only when no source was requested at all. Once the\n\t// caller names a source (say `[images=3]` or `{images: 3}`), the requested set\n\t// is exactly what they asked for: asking for images must not also return pages.\n\tconst namesSources = Object.keys(requested).length > 0;\n\tconst results: ResolvedSearchIntent[\"results\"] = {};\n\tif (!namesSources || requested.web !== undefined) {\n\t\tresults.web = requested.web === undefined ? SEARCH_DEFAULT_WEB_RESULTS : clampCount(requested.web, \"web\");\n\t}\n\tif (requested.images !== undefined) results.images = clampCount(requested.images, \"images\");\n\tif (requested.news !== undefined) results.news = clampCount(requested.news, \"news\");\n\n\tconst filters: ResolvedSearchIntent[\"filters\"] = {};\n\tconst domains = intent.filters?.domains\n\t\t?.map((domain) => domain.trim().toLowerCase())\n\t\t.filter((domain) => domain.length > 0);\n\tif (domains && domains.length > 0) filters.domains = [...new Set(domains)];\n\tconst language = intent.filters?.language?.trim();\n\tif (language) filters.language = language;\n\tif (intent.filters?.recency !== undefined) filters.recencyMs = parseRecency(intent.filters.recency);\n\treturn { query, results, filters };\n}\n\nexport function parseRecency(value: string): number {\n\tconst match = DURATION_PATTERN.exec(value.trim().toLowerCase());\n\tif (!match) {\n\t\tthrow new SearchIntentError(`filters.recency must look like 24h, 7d, 2w, 6m, or 1y (got \"${value}\")`);\n\t}\n\tconst amount = Number.parseInt(match[1], 10);\n\tif (!Number.isFinite(amount) || amount < 1) {\n\t\tthrow new SearchIntentError(`filters.recency must be a positive duration (got \"${value}\")`);\n\t}\n\treturn amount * DURATION_MS[match[2]];\n}\n\n/** Total results requested across every modality, for budget reporting. */\nexport function totalRequestedResults(intent: ResolvedSearchIntent): number {\n\treturn Object.values(intent.results).reduce<number>((sum, count) => sum + (count ?? 0), 0);\n}\n"]}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Optional tag sugar for `webfetch`: `[images=3] [news=5] [recent=7d]
3
+ * [domains=openai.com] nigerian tech startups`.
4
+ *
5
+ * A deliberately tiny grammar — `[key=value]` pairs plus `[key]` shorthands —
6
+ * that compiles into the same `SearchIntent` the structured parameters produce.
7
+ * Backends never see tags. Bracketed text that is not a recognized key stays in
8
+ * the query, so searching for the literal string "[img3]" still works.
9
+ *
10
+ * The tool layer applies this only when the structured `results`/`filters` args
11
+ * are absent, so an explicit call always wins over sugar in the query string.
12
+ */
13
+ import { type SearchIntent } from "./search-intent.ts";
14
+ export interface ParsedSearchQuery {
15
+ intent: SearchIntent;
16
+ /** Tags that were recognized and applied. */
17
+ appliedTags: string[];
18
+ /** Recognized tags that could not be parsed; the tool reports these. */
19
+ warnings: string[];
20
+ }
21
+ /** Strip recognized tags from the query and fold them into an intent. */
22
+ export declare function parseSearchQueryTags(input: string): ParsedSearchQuery;
23
+ //# sourceMappingURL=search-tags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-tags.d.ts","sourceRoot":"","sources":["../../../src/core/webfetch/search-tags.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAoC,KAAK,YAAY,EAA2B,MAAM,oBAAoB,CAAC;AAelH,MAAM,WAAW,iBAAiB;IACjC,MAAM,EAAE,YAAY,CAAC;IACrB,6CAA6C;IAC7C,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,yEAAyE;AACzE,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,iBAAiB,CA2FrE","sourcesContent":["/**\n * Optional tag sugar for `webfetch`: `[images=3] [news=5] [recent=7d]\n * [domains=openai.com] nigerian tech startups`.\n *\n * A deliberately tiny grammar — `[key=value]` pairs plus `[key]` shorthands —\n * that compiles into the same `SearchIntent` the structured parameters produce.\n * Backends never see tags. Bracketed text that is not a recognized key stays in\n * the query, so searching for the literal string \"[img3]\" still works.\n *\n * The tool layer applies this only when the structured `results`/`filters` args\n * are absent, so an explicit call always wins over sugar in the query string.\n */\n\nimport { parseRecency, type SearchFilters, type SearchIntent, type SearchResultCounts } from \"./search-intent.ts\";\n\n/** `[key]` shorthands for the most common request. */\nconst FLAG_SHORTHANDS: Record<string, keyof SearchResultCounts> = {\n\timg: \"images\",\n\timages: \"images\",\n\tnews: \"news\",\n\tweb: \"web\",\n};\n\n/** Keys that take a value inside brackets. */\nconst VALUE_KEYS = new Set([\"images\", \"news\", \"web\", \"recent\", \"domain\", \"domains\", \"lang\"]);\n\nconst TAG_PATTERN = /\\[([a-z]+)(?:=([^\\]]*))?\\]/gi;\n\nexport interface ParsedSearchQuery {\n\tintent: SearchIntent;\n\t/** Tags that were recognized and applied. */\n\tappliedTags: string[];\n\t/** Recognized tags that could not be parsed; the tool reports these. */\n\twarnings: string[];\n}\n\n/** Strip recognized tags from the query and fold them into an intent. */\nexport function parseSearchQueryTags(input: string): ParsedSearchQuery {\n\tconst counts: SearchResultCounts = {};\n\tconst filters: SearchFilters = {};\n\tconst appliedTags: string[] = [];\n\tconst warnings: string[] = [];\n\t/** Tags that produced a specific warning, so it is not reported twice. */\n\tconst warned = new Set<string>();\n\tlet query = input;\n\n\tconst replace = (match: string, key: string, value: string | undefined): string => {\n\t\tconst normalizedKey = key.toLowerCase();\n\t\tif (value === undefined) {\n\t\t\tconst source = FLAG_SHORTHANDS[normalizedKey];\n\t\t\tif (!source) return match;\n\t\t\tcounts[source] = (counts[source] ?? 0) + 1;\n\t\t\tappliedTags.push(match);\n\t\t\treturn \"\";\n\t\t}\n\t\tconst trimmed = value.trim();\n\t\tswitch (normalizedKey) {\n\t\t\tcase \"web\":\n\t\t\tcase \"images\":\n\t\t\tcase \"news\": {\n\t\t\t\tconst count = Number.parseInt(trimmed, 10);\n\t\t\t\tif (!Number.isInteger(count) || count < 1) {\n\t\t\t\t\twarned.add(match);\n\t\t\t\t\twarnings.push(`Ignored ${match}: expected a positive integer count`);\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tcounts[normalizedKey] = count;\n\t\t\t\tappliedTags.push(match);\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tcase \"recent\": {\n\t\t\t\ttry {\n\t\t\t\t\tparseRecency(trimmed);\n\t\t\t\t\tfilters.recency = trimmed;\n\t\t\t\t\tappliedTags.push(match);\n\t\t\t\t\treturn \"\";\n\t\t\t\t} catch {\n\t\t\t\t\twarned.add(match);\n\t\t\t\t\twarnings.push(`Ignored ${match}: expected a duration like 24h, 7d, or 1m`);\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase \"domain\":\n\t\t\tcase \"domains\": {\n\t\t\t\tconst domains = trimmed\n\t\t\t\t\t.split(/[,\\s]+/)\n\t\t\t\t\t.map((domain) => domain.trim())\n\t\t\t\t\t.filter(Boolean);\n\t\t\t\tif (domains.length === 0) {\n\t\t\t\t\twarned.add(match);\n\t\t\t\t\twarnings.push(`Ignored ${match}: expected one or more domains`);\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tfilters.domains = [...(filters.domains ?? []), ...domains];\n\t\t\t\tappliedTags.push(match);\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tcase \"lang\": {\n\t\t\t\tif (!/^[a-z]{2}$/i.test(trimmed)) {\n\t\t\t\t\twarned.add(match);\n\t\t\t\t\twarnings.push(`Ignored ${match}: expected a two-letter language code`);\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tfilters.language = trimmed.toLowerCase();\n\t\t\t\tappliedTags.push(match);\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn match;\n\t\t}\n\t};\n\n\tquery = query.replace(TAG_PATTERN, (match, key: string, value: string | undefined) => replace(match, key, value));\n\n\t// A tag the replacer already rejected (bad count, bad duration) keeps its\n\t// specific warning; only report keys it never understood at all.\n\tfor (const match of query.match(TAG_PATTERN) ?? []) {\n\t\tif (warned.has(match)) continue;\n\t\tconst key = /\\[([a-z]+)(?:=([^\\]]*))?\\]/i.exec(match)?.[1]?.toLowerCase() ?? \"\";\n\t\tif (VALUE_KEYS.has(key) || key in FLAG_SHORTHANDS) {\n\t\t\twarnings.push(`Ignored ${match}: value was not understood`);\n\t\t}\n\t}\n\n\tconst intent: SearchIntent = { query: query.replace(/\\s{2,}/g, \" \").trim() };\n\tif (Object.keys(counts).length > 0) intent.results = counts;\n\tif (Object.keys(filters).length > 0) intent.filters = filters;\n\treturn { intent, appliedTags, warnings };\n}\n"]}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Optional tag sugar for `webfetch`: `[images=3] [news=5] [recent=7d]
3
+ * [domains=openai.com] nigerian tech startups`.
4
+ *
5
+ * A deliberately tiny grammar — `[key=value]` pairs plus `[key]` shorthands —
6
+ * that compiles into the same `SearchIntent` the structured parameters produce.
7
+ * Backends never see tags. Bracketed text that is not a recognized key stays in
8
+ * the query, so searching for the literal string "[img3]" still works.
9
+ *
10
+ * The tool layer applies this only when the structured `results`/`filters` args
11
+ * are absent, so an explicit call always wins over sugar in the query string.
12
+ */
13
+ import { parseRecency } from "./search-intent.js";
14
+ /** `[key]` shorthands for the most common request. */
15
+ const FLAG_SHORTHANDS = {
16
+ img: "images",
17
+ images: "images",
18
+ news: "news",
19
+ web: "web",
20
+ };
21
+ /** Keys that take a value inside brackets. */
22
+ const VALUE_KEYS = new Set(["images", "news", "web", "recent", "domain", "domains", "lang"]);
23
+ const TAG_PATTERN = /\[([a-z]+)(?:=([^\]]*))?\]/gi;
24
+ /** Strip recognized tags from the query and fold them into an intent. */
25
+ export function parseSearchQueryTags(input) {
26
+ const counts = {};
27
+ const filters = {};
28
+ const appliedTags = [];
29
+ const warnings = [];
30
+ /** Tags that produced a specific warning, so it is not reported twice. */
31
+ const warned = new Set();
32
+ let query = input;
33
+ const replace = (match, key, value) => {
34
+ const normalizedKey = key.toLowerCase();
35
+ if (value === undefined) {
36
+ const source = FLAG_SHORTHANDS[normalizedKey];
37
+ if (!source)
38
+ return match;
39
+ counts[source] = (counts[source] ?? 0) + 1;
40
+ appliedTags.push(match);
41
+ return "";
42
+ }
43
+ const trimmed = value.trim();
44
+ switch (normalizedKey) {
45
+ case "web":
46
+ case "images":
47
+ case "news": {
48
+ const count = Number.parseInt(trimmed, 10);
49
+ if (!Number.isInteger(count) || count < 1) {
50
+ warned.add(match);
51
+ warnings.push(`Ignored ${match}: expected a positive integer count`);
52
+ return match;
53
+ }
54
+ counts[normalizedKey] = count;
55
+ appliedTags.push(match);
56
+ return "";
57
+ }
58
+ case "recent": {
59
+ try {
60
+ parseRecency(trimmed);
61
+ filters.recency = trimmed;
62
+ appliedTags.push(match);
63
+ return "";
64
+ }
65
+ catch {
66
+ warned.add(match);
67
+ warnings.push(`Ignored ${match}: expected a duration like 24h, 7d, or 1m`);
68
+ return match;
69
+ }
70
+ }
71
+ case "domain":
72
+ case "domains": {
73
+ const domains = trimmed
74
+ .split(/[,\s]+/)
75
+ .map((domain) => domain.trim())
76
+ .filter(Boolean);
77
+ if (domains.length === 0) {
78
+ warned.add(match);
79
+ warnings.push(`Ignored ${match}: expected one or more domains`);
80
+ return match;
81
+ }
82
+ filters.domains = [...(filters.domains ?? []), ...domains];
83
+ appliedTags.push(match);
84
+ return "";
85
+ }
86
+ case "lang": {
87
+ if (!/^[a-z]{2}$/i.test(trimmed)) {
88
+ warned.add(match);
89
+ warnings.push(`Ignored ${match}: expected a two-letter language code`);
90
+ return match;
91
+ }
92
+ filters.language = trimmed.toLowerCase();
93
+ appliedTags.push(match);
94
+ return "";
95
+ }
96
+ default:
97
+ return match;
98
+ }
99
+ };
100
+ query = query.replace(TAG_PATTERN, (match, key, value) => replace(match, key, value));
101
+ // A tag the replacer already rejected (bad count, bad duration) keeps its
102
+ // specific warning; only report keys it never understood at all.
103
+ for (const match of query.match(TAG_PATTERN) ?? []) {
104
+ if (warned.has(match))
105
+ continue;
106
+ const key = /\[([a-z]+)(?:=([^\]]*))?\]/i.exec(match)?.[1]?.toLowerCase() ?? "";
107
+ if (VALUE_KEYS.has(key) || key in FLAG_SHORTHANDS) {
108
+ warnings.push(`Ignored ${match}: value was not understood`);
109
+ }
110
+ }
111
+ const intent = { query: query.replace(/\s{2,}/g, " ").trim() };
112
+ if (Object.keys(counts).length > 0)
113
+ intent.results = counts;
114
+ if (Object.keys(filters).length > 0)
115
+ intent.filters = filters;
116
+ return { intent, appliedTags, warnings };
117
+ }
118
+ //# sourceMappingURL=search-tags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"search-tags.js","sourceRoot":"","sources":["../../../src/core/webfetch/search-tags.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Optional tag sugar for `webfetch`: `[images=3] [news=5] [recent=7d]\n * [domains=openai.com] nigerian tech startups`.\n *\n * A deliberately tiny grammar — `[key=value]` pairs plus `[key]` shorthands —\n * that compiles into the same `SearchIntent` the structured parameters produce.\n * Backends never see tags. Bracketed text that is not a recognized key stays in\n * the query, so searching for the literal string \"[img3]\" still works.\n *\n * The tool layer applies this only when the structured `results`/`filters` args\n * are absent, so an explicit call always wins over sugar in the query string.\n */\n\nimport { parseRecency, type SearchFilters, type SearchIntent, type SearchResultCounts } from \"./search-intent.ts\";\n\n/** `[key]` shorthands for the most common request. */\nconst FLAG_SHORTHANDS: Record<string, keyof SearchResultCounts> = {\n\timg: \"images\",\n\timages: \"images\",\n\tnews: \"news\",\n\tweb: \"web\",\n};\n\n/** Keys that take a value inside brackets. */\nconst VALUE_KEYS = new Set([\"images\", \"news\", \"web\", \"recent\", \"domain\", \"domains\", \"lang\"]);\n\nconst TAG_PATTERN = /\\[([a-z]+)(?:=([^\\]]*))?\\]/gi;\n\nexport interface ParsedSearchQuery {\n\tintent: SearchIntent;\n\t/** Tags that were recognized and applied. */\n\tappliedTags: string[];\n\t/** Recognized tags that could not be parsed; the tool reports these. */\n\twarnings: string[];\n}\n\n/** Strip recognized tags from the query and fold them into an intent. */\nexport function parseSearchQueryTags(input: string): ParsedSearchQuery {\n\tconst counts: SearchResultCounts = {};\n\tconst filters: SearchFilters = {};\n\tconst appliedTags: string[] = [];\n\tconst warnings: string[] = [];\n\t/** Tags that produced a specific warning, so it is not reported twice. */\n\tconst warned = new Set<string>();\n\tlet query = input;\n\n\tconst replace = (match: string, key: string, value: string | undefined): string => {\n\t\tconst normalizedKey = key.toLowerCase();\n\t\tif (value === undefined) {\n\t\t\tconst source = FLAG_SHORTHANDS[normalizedKey];\n\t\t\tif (!source) return match;\n\t\t\tcounts[source] = (counts[source] ?? 0) + 1;\n\t\t\tappliedTags.push(match);\n\t\t\treturn \"\";\n\t\t}\n\t\tconst trimmed = value.trim();\n\t\tswitch (normalizedKey) {\n\t\t\tcase \"web\":\n\t\t\tcase \"images\":\n\t\t\tcase \"news\": {\n\t\t\t\tconst count = Number.parseInt(trimmed, 10);\n\t\t\t\tif (!Number.isInteger(count) || count < 1) {\n\t\t\t\t\twarned.add(match);\n\t\t\t\t\twarnings.push(`Ignored ${match}: expected a positive integer count`);\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tcounts[normalizedKey] = count;\n\t\t\t\tappliedTags.push(match);\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tcase \"recent\": {\n\t\t\t\ttry {\n\t\t\t\t\tparseRecency(trimmed);\n\t\t\t\t\tfilters.recency = trimmed;\n\t\t\t\t\tappliedTags.push(match);\n\t\t\t\t\treturn \"\";\n\t\t\t\t} catch {\n\t\t\t\t\twarned.add(match);\n\t\t\t\t\twarnings.push(`Ignored ${match}: expected a duration like 24h, 7d, or 1m`);\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t}\n\t\t\tcase \"domain\":\n\t\t\tcase \"domains\": {\n\t\t\t\tconst domains = trimmed\n\t\t\t\t\t.split(/[,\\s]+/)\n\t\t\t\t\t.map((domain) => domain.trim())\n\t\t\t\t\t.filter(Boolean);\n\t\t\t\tif (domains.length === 0) {\n\t\t\t\t\twarned.add(match);\n\t\t\t\t\twarnings.push(`Ignored ${match}: expected one or more domains`);\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tfilters.domains = [...(filters.domains ?? []), ...domains];\n\t\t\t\tappliedTags.push(match);\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tcase \"lang\": {\n\t\t\t\tif (!/^[a-z]{2}$/i.test(trimmed)) {\n\t\t\t\t\twarned.add(match);\n\t\t\t\t\twarnings.push(`Ignored ${match}: expected a two-letter language code`);\n\t\t\t\t\treturn match;\n\t\t\t\t}\n\t\t\t\tfilters.language = trimmed.toLowerCase();\n\t\t\t\tappliedTags.push(match);\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\treturn match;\n\t\t}\n\t};\n\n\tquery = query.replace(TAG_PATTERN, (match, key: string, value: string | undefined) => replace(match, key, value));\n\n\t// A tag the replacer already rejected (bad count, bad duration) keeps its\n\t// specific warning; only report keys it never understood at all.\n\tfor (const match of query.match(TAG_PATTERN) ?? []) {\n\t\tif (warned.has(match)) continue;\n\t\tconst key = /\\[([a-z]+)(?:=([^\\]]*))?\\]/i.exec(match)?.[1]?.toLowerCase() ?? \"\";\n\t\tif (VALUE_KEYS.has(key) || key in FLAG_SHORTHANDS) {\n\t\t\twarnings.push(`Ignored ${match}: value was not understood`);\n\t\t}\n\t}\n\n\tconst intent: SearchIntent = { query: query.replace(/\\s{2,}/g, \" \").trim() };\n\tif (Object.keys(counts).length > 0) intent.results = counts;\n\tif (Object.keys(filters).length > 0) intent.filters = filters;\n\treturn { intent, appliedTags, warnings };\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=env-compat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-compat.d.ts","sourceRoot":"","sources":["../src/env-compat.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * One-release fallback: if ION_* env is not set but PI_* is set, copy PI_ to ION_.\n * This runs at import time before other modules read env vars.\n */\nfor (const [k, v] of Object.entries(process.env)) {\n\tif (k.startsWith(\"PI_\") && v !== undefined) {\n\t\tconst ionKey = k.replace(/^PI_/, \"ION_\");\n\t\tif (process.env[ionKey] === undefined) {\n\t\t\tprocess.env[ionKey] = v;\n\t\t}\n\t}\n}\n// Also handle PI_ fallback for XDG? Not needed, XDG not prefixed.\n// Handle legacy PI_* env that should also be readable as ION_* for one release.\n// This file intentionally has side-effects on import.\n"]}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * One-release fallback: if ION_* env is not set but PI_* is set, copy PI_ to ION_.
3
+ * This runs at import time before other modules read env vars.
4
+ */
5
+ for (const [k, v] of Object.entries(process.env)) {
6
+ if (k.startsWith("PI_") && v !== undefined) {
7
+ const ionKey = k.replace(/^PI_/, "ION_");
8
+ if (process.env[ionKey] === undefined) {
9
+ process.env[ionKey] = v;
10
+ }
11
+ }
12
+ }
13
+ export {};
14
+ // Also handle PI_ fallback for XDG? Not needed, XDG not prefixed.
15
+ // Handle legacy PI_* env that should also be readable as ION_* for one release.
16
+ // This file intentionally has side-effects on import.
17
+ //# sourceMappingURL=env-compat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-compat.js","sourceRoot":"","sources":["../src/env-compat.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;IAClD,IAAI,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACzC,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC;IACF,CAAC;AACF,CAAC;;AACD,kEAAkE;AAClE,gFAAgF;AAChF,sDAAsD","sourcesContent":["/**\n * One-release fallback: if ION_* env is not set but PI_* is set, copy PI_ to ION_.\n * This runs at import time before other modules read env vars.\n */\nfor (const [k, v] of Object.entries(process.env)) {\n\tif (k.startsWith(\"PI_\") && v !== undefined) {\n\t\tconst ionKey = k.replace(/^PI_/, \"ION_\");\n\t\tif (process.env[ionKey] === undefined) {\n\t\t\tprocess.env[ionKey] = v;\n\t\t}\n\t}\n}\n// Also handle PI_ fallback for XDG? Not needed, XDG not prefixed.\n// Handle legacy PI_* env that should also be readable as ION_* for one release.\n// This file intentionally has side-effects on import.\n"]}