@qvac/harness 0.0.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (483) hide show
  1. package/LICENSE.md +198 -0
  2. package/NOTICE.md +13 -0
  3. package/README.md +68 -0
  4. package/SECURITY.md +6 -0
  5. package/dist/harness.bundle +48339 -0
  6. package/dist/harness.cjs +18 -0
  7. package/dist/harness.d.ts +8 -0
  8. package/dist/prebuilds-manifest.json +379 -0
  9. package/dist-lib/index.d.ts +240 -0
  10. package/dist-lib/index.js +1063 -0
  11. package/dist-lib/lib/audio-transcode-bare.d.ts +2 -0
  12. package/dist-lib/lib/audio-transcode-bare.js +145 -0
  13. package/dist-lib/lib/audio-transcode-node.d.ts +2 -0
  14. package/dist-lib/lib/audio-transcode-node.js +6 -0
  15. package/dist-lib/lib/capabilities/audio-resample.d.ts +14 -0
  16. package/dist-lib/lib/capabilities/audio-resample.js +72 -0
  17. package/dist-lib/lib/capabilities/completion.d.ts +288 -0
  18. package/dist-lib/lib/capabilities/completion.js +1077 -0
  19. package/dist-lib/lib/capabilities/download.d.ts +46 -0
  20. package/dist-lib/lib/capabilities/download.js +124 -0
  21. package/dist-lib/lib/capabilities/embed.d.ts +20 -0
  22. package/dist-lib/lib/capabilities/embed.js +13 -0
  23. package/dist-lib/lib/capabilities/kv-cache.d.ts +13 -0
  24. package/dist-lib/lib/capabilities/kv-cache.js +21 -0
  25. package/dist-lib/lib/capabilities/prompt-prefix.d.ts +6 -0
  26. package/dist-lib/lib/capabilities/prompt-prefix.js +10 -0
  27. package/dist-lib/lib/capabilities/speech-lexicon.d.ts +5 -0
  28. package/dist-lib/lib/capabilities/speech-lexicon.js +32 -0
  29. package/dist-lib/lib/capabilities/speech-text.d.ts +6 -0
  30. package/dist-lib/lib/capabilities/speech-text.js +79 -0
  31. package/dist-lib/lib/capabilities/tool-names.d.ts +3 -0
  32. package/dist-lib/lib/capabilities/tool-names.js +3 -0
  33. package/dist-lib/lib/capabilities/tool-selection.d.ts +43 -0
  34. package/dist-lib/lib/capabilities/tool-selection.js +60 -0
  35. package/dist-lib/lib/capabilities/tool-turns.d.ts +9 -0
  36. package/dist-lib/lib/capabilities/tool-turns.js +101 -0
  37. package/dist-lib/lib/capabilities/usage-breakdown.d.ts +27 -0
  38. package/dist-lib/lib/capabilities/usage-breakdown.js +44 -0
  39. package/dist-lib/lib/capabilities/vision-history.d.ts +3 -0
  40. package/dist-lib/lib/capabilities/vision-history.js +21 -0
  41. package/dist-lib/lib/capabilities/voice.d.ts +78 -0
  42. package/dist-lib/lib/capabilities/voice.js +189 -0
  43. package/dist-lib/lib/connect.d.ts +76 -0
  44. package/dist-lib/lib/connect.js +789 -0
  45. package/dist-lib/lib/context-window.d.ts +7 -0
  46. package/dist-lib/lib/context-window.js +90 -0
  47. package/dist-lib/lib/contract-types.d.ts +210 -0
  48. package/dist-lib/lib/contract-types.js +1 -0
  49. package/dist-lib/lib/diagram-repair.d.ts +21 -0
  50. package/dist-lib/lib/diagram-repair.js +58 -0
  51. package/dist-lib/lib/dns-lookup.d.ts +1 -0
  52. package/dist-lib/lib/dns-lookup.js +13 -0
  53. package/dist-lib/lib/error-fields.d.ts +2 -0
  54. package/dist-lib/lib/error-fields.js +8 -0
  55. package/dist-lib/lib/fetch-node.d.ts +1 -0
  56. package/dist-lib/lib/fetch-node.js +1 -0
  57. package/dist-lib/lib/hardware/capability-probe.d.ts +9 -0
  58. package/dist-lib/lib/hardware/capability-probe.js +99 -0
  59. package/dist-lib/lib/hardware/gpu-classify.d.ts +2 -0
  60. package/dist-lib/lib/hardware/gpu-classify.js +32 -0
  61. package/dist-lib/lib/hardware/gpu-probe-addon.d.ts +2 -0
  62. package/dist-lib/lib/hardware/gpu-probe-addon.js +42 -0
  63. package/dist-lib/lib/hardware/gpu-stats.bare.d.ts +1 -0
  64. package/dist-lib/lib/hardware/gpu-stats.bare.js +24 -0
  65. package/dist-lib/lib/hardware/gpu-stats.stub.d.ts +1 -0
  66. package/dist-lib/lib/hardware/gpu-stats.stub.js +3 -0
  67. package/dist-lib/lib/hardware/memory-budget.d.ts +8 -0
  68. package/dist-lib/lib/hardware/memory-budget.js +1 -0
  69. package/dist-lib/lib/hardware/parsers.d.ts +7 -0
  70. package/dist-lib/lib/hardware/parsers.js +41 -0
  71. package/dist-lib/lib/headers-bare.d.ts +1 -0
  72. package/dist-lib/lib/headers-bare.js +1 -0
  73. package/dist-lib/lib/headers-node.d.ts +4 -0
  74. package/dist-lib/lib/headers-node.js +1 -0
  75. package/dist-lib/lib/helpers/buffer-burst.d.ts +1 -0
  76. package/dist-lib/lib/helpers/buffer-burst.js +20 -0
  77. package/dist-lib/lib/helpers/control-tokens.d.ts +7 -0
  78. package/dist-lib/lib/helpers/control-tokens.js +32 -0
  79. package/dist-lib/lib/helpers/join-guard.d.ts +6 -0
  80. package/dist-lib/lib/helpers/join-guard.js +46 -0
  81. package/dist-lib/lib/helpers/markup-stream-filter.d.ts +5 -0
  82. package/dist-lib/lib/helpers/markup-stream-filter.js +75 -0
  83. package/dist-lib/lib/helpers/race-abort.d.ts +5 -0
  84. package/dist-lib/lib/helpers/race-abort.js +18 -0
  85. package/dist-lib/lib/helpers/retry-memo.d.ts +5 -0
  86. package/dist-lib/lib/helpers/retry-memo.js +12 -0
  87. package/dist-lib/lib/helpers/run-outcome.d.ts +33 -0
  88. package/dist-lib/lib/helpers/run-outcome.js +204 -0
  89. package/dist-lib/lib/helpers/spawn-path.d.ts +5 -0
  90. package/dist-lib/lib/helpers/spawn-path.js +57 -0
  91. package/dist-lib/lib/helpers/text-coalescer.d.ts +15 -0
  92. package/dist-lib/lib/helpers/text-coalescer.js +34 -0
  93. package/dist-lib/lib/helpers/thinking.d.ts +8 -0
  94. package/dist-lib/lib/helpers/thinking.js +95 -0
  95. package/dist-lib/lib/helpers/tool-call-markup.d.ts +20 -0
  96. package/dist-lib/lib/helpers/tool-call-markup.js +201 -0
  97. package/dist-lib/lib/helpers/tool-intent.d.ts +7 -0
  98. package/dist-lib/lib/helpers/tool-intent.js +21 -0
  99. package/dist-lib/lib/helpers/tool-label.d.ts +8 -0
  100. package/dist-lib/lib/helpers/tool-label.js +131 -0
  101. package/dist-lib/lib/hooks/built-in/arg-repair.d.ts +5 -0
  102. package/dist-lib/lib/hooks/built-in/arg-repair.js +88 -0
  103. package/dist-lib/lib/hooks/built-in/egress.d.ts +5 -0
  104. package/dist-lib/lib/hooks/built-in/egress.js +29 -0
  105. package/dist-lib/lib/hooks/built-in/index.d.ts +3 -0
  106. package/dist-lib/lib/hooks/built-in/index.js +3 -0
  107. package/dist-lib/lib/hooks/built-in/skill-catalog.d.ts +10 -0
  108. package/dist-lib/lib/hooks/built-in/skill-catalog.js +17 -0
  109. package/dist-lib/lib/hooks/pipeline.d.ts +20 -0
  110. package/dist-lib/lib/hooks/pipeline.js +49 -0
  111. package/dist-lib/lib/hooks/registry.d.ts +2 -0
  112. package/dist-lib/lib/hooks/registry.js +6 -0
  113. package/dist-lib/lib/hooks/run.d.ts +5 -0
  114. package/dist-lib/lib/hooks/run.js +83 -0
  115. package/dist-lib/lib/hooks/types.d.ts +57 -0
  116. package/dist-lib/lib/hooks/types.js +1 -0
  117. package/dist-lib/lib/log.d.ts +5 -0
  118. package/dist-lib/lib/log.js +37 -0
  119. package/dist-lib/lib/model-download-progress.d.ts +22 -0
  120. package/dist-lib/lib/model-download-progress.js +95 -0
  121. package/dist-lib/lib/models/context.d.ts +5 -0
  122. package/dist-lib/lib/models/context.js +12 -0
  123. package/dist-lib/lib/models/embed-config.d.ts +14 -0
  124. package/dist-lib/lib/models/embed-config.js +31 -0
  125. package/dist-lib/lib/models/gpu-selection.d.ts +3 -0
  126. package/dist-lib/lib/models/gpu-selection.js +26 -0
  127. package/dist-lib/lib/models/kv-cache.d.ts +4 -0
  128. package/dist-lib/lib/models/kv-cache.js +6 -0
  129. package/dist-lib/lib/models/llm-presets.d.ts +10 -0
  130. package/dist-lib/lib/models/llm-presets.js +58 -0
  131. package/dist-lib/lib/models/model-catalog-constants.d.ts +29 -0
  132. package/dist-lib/lib/models/model-catalog-constants.js +103 -0
  133. package/dist-lib/lib/models/model-catalog.d.ts +125 -0
  134. package/dist-lib/lib/models/model-catalog.js +371 -0
  135. package/dist-lib/lib/models/model-delete.d.ts +18 -0
  136. package/dist-lib/lib/models/model-delete.js +47 -0
  137. package/dist-lib/lib/models/model-handle.d.ts +18 -0
  138. package/dist-lib/lib/models/model-handle.js +33 -0
  139. package/dist-lib/lib/models/model-list.d.ts +42 -0
  140. package/dist-lib/lib/models/model-list.js +123 -0
  141. package/dist-lib/lib/models/model-pool.d.ts +116 -0
  142. package/dist-lib/lib/models/model-pool.js +356 -0
  143. package/dist-lib/lib/models/model-source.d.ts +6 -0
  144. package/dist-lib/lib/models/model-source.js +21 -0
  145. package/dist-lib/lib/models/music-catalog.d.ts +12 -0
  146. package/dist-lib/lib/models/music-catalog.js +26 -0
  147. package/dist-lib/lib/models/opencl-cache.d.ts +5 -0
  148. package/dist-lib/lib/models/opencl-cache.js +50 -0
  149. package/dist-lib/lib/models/sdk-faults.d.ts +21 -0
  150. package/dist-lib/lib/models/sdk-faults.js +66 -0
  151. package/dist-lib/lib/models/tool-dialect.d.ts +2 -0
  152. package/dist-lib/lib/models/tool-dialect.js +19 -0
  153. package/dist-lib/lib/models/tts-model-default.d.ts +3 -0
  154. package/dist-lib/lib/models/tts-model-default.js +13 -0
  155. package/dist-lib/lib/no-redirect-fetch-bare.d.ts +15 -0
  156. package/dist-lib/lib/no-redirect-fetch-bare.js +59 -0
  157. package/dist-lib/lib/no-redirect-fetch-impl.d.ts +39 -0
  158. package/dist-lib/lib/no-redirect-fetch-impl.js +80 -0
  159. package/dist-lib/lib/no-redirect-fetch-node.d.ts +4 -0
  160. package/dist-lib/lib/no-redirect-fetch-node.js +52 -0
  161. package/dist-lib/lib/prompt.d.ts +22 -0
  162. package/dist-lib/lib/prompt.js +77 -0
  163. package/dist-lib/lib/queue.d.ts +9 -0
  164. package/dist-lib/lib/queue.js +48 -0
  165. package/dist-lib/lib/resolution-detector.d.ts +5 -0
  166. package/dist-lib/lib/resolution-detector.js +100 -0
  167. package/dist-lib/lib/rpc-session.d.ts +8 -0
  168. package/dist-lib/lib/rpc-session.js +20 -0
  169. package/dist-lib/lib/sdk-config-loader.node.d.ts +1 -0
  170. package/dist-lib/lib/sdk-config-loader.node.js +1 -0
  171. package/dist-lib/lib/sdk-loader.d.ts +30 -0
  172. package/dist-lib/lib/sdk-loader.js +53 -0
  173. package/dist-lib/lib/sdk-storage.d.ts +8 -0
  174. package/dist-lib/lib/sdk-storage.js +24 -0
  175. package/dist-lib/lib/serve.d.ts +3 -0
  176. package/dist-lib/lib/serve.js +612 -0
  177. package/dist-lib/lib/spawn.d.ts +62 -0
  178. package/dist-lib/lib/spawn.js +71 -0
  179. package/dist-lib/lib/staging.d.ts +4 -0
  180. package/dist-lib/lib/staging.js +28 -0
  181. package/dist-lib/lib/storage.d.ts +18 -0
  182. package/dist-lib/lib/storage.js +26 -0
  183. package/dist-lib/lib/tmp-path.d.ts +7 -0
  184. package/dist-lib/lib/tmp-path.js +17 -0
  185. package/dist-lib/lib/tool-call-display.d.ts +21 -0
  186. package/dist-lib/lib/tool-call-display.js +1 -0
  187. package/dist-lib/lib/tools/catalog.d.ts +13 -0
  188. package/dist-lib/lib/tools/catalog.js +13 -0
  189. package/dist-lib/lib/tools/create-documents.d.ts +3 -0
  190. package/dist-lib/lib/tools/create-documents.js +87 -0
  191. package/dist-lib/lib/tools/edit-documents.d.ts +3 -0
  192. package/dist-lib/lib/tools/edit-documents.js +122 -0
  193. package/dist-lib/lib/tools/edit-image.d.ts +25 -0
  194. package/dist-lib/lib/tools/edit-image.js +271 -0
  195. package/dist-lib/lib/tools/exec/adapters/adapter.d.ts +27 -0
  196. package/dist-lib/lib/tools/exec/adapters/adapter.js +1 -0
  197. package/dist-lib/lib/tools/exec/adapters/python/attachments.d.ts +26 -0
  198. package/dist-lib/lib/tools/exec/adapters/python/attachments.js +160 -0
  199. package/dist-lib/lib/tools/exec/adapters/python/create-effect.d.ts +7 -0
  200. package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +290 -0
  201. package/dist-lib/lib/tools/exec/adapters/python/loader.d.ts +11 -0
  202. package/dist-lib/lib/tools/exec/adapters/python/loader.js +94 -0
  203. package/dist-lib/lib/tools/exec/adapters/python/memfs.d.ts +47 -0
  204. package/dist-lib/lib/tools/exec/adapters/python/memfs.js +85 -0
  205. package/dist-lib/lib/tools/exec/adapters/python/output-policy.d.ts +13 -0
  206. package/dist-lib/lib/tools/exec/adapters/python/output-policy.js +129 -0
  207. package/dist-lib/lib/tools/exec/adapters/python/pyodide.d.ts +19 -0
  208. package/dist-lib/lib/tools/exec/adapters/python/pyodide.js +107 -0
  209. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.d.ts +75 -0
  210. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +1094 -0
  211. package/dist-lib/lib/tools/exec/adapters/python/run-session.d.ts +75 -0
  212. package/dist-lib/lib/tools/exec/adapters/python/run-session.js +273 -0
  213. package/dist-lib/lib/tools/exec/adapters/python/wheels.d.ts +38 -0
  214. package/dist-lib/lib/tools/exec/adapters/python/wheels.js +102 -0
  215. package/dist-lib/lib/tools/exec/adapters/python/worker/client.d.ts +7 -0
  216. package/dist-lib/lib/tools/exec/adapters/python/worker/client.js +188 -0
  217. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.d.ts +1 -0
  218. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +105 -0
  219. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.d.ts +38 -0
  220. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.js +41 -0
  221. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.d.ts +2 -0
  222. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.js +30 -0
  223. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.d.ts +13 -0
  224. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.js +45 -0
  225. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.d.ts +12 -0
  226. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +20 -0
  227. package/dist-lib/lib/tools/exec/obsidian/cli-process.d.ts +8 -0
  228. package/dist-lib/lib/tools/exec/obsidian/cli-process.js +74 -0
  229. package/dist-lib/lib/tools/exec/obsidian/cli.d.ts +18 -0
  230. package/dist-lib/lib/tools/exec/obsidian/cli.js +153 -0
  231. package/dist-lib/lib/tools/exec/obsidian/command.d.ts +5 -0
  232. package/dist-lib/lib/tools/exec/obsidian/command.js +18 -0
  233. package/dist-lib/lib/tools/exec/obsidian/guidance.d.ts +5 -0
  234. package/dist-lib/lib/tools/exec/obsidian/guidance.js +18 -0
  235. package/dist-lib/lib/tools/exec/obsidian/note-name.d.ts +1 -0
  236. package/dist-lib/lib/tools/exec/obsidian/note-name.js +6 -0
  237. package/dist-lib/lib/tools/exec/obsidian/output.d.ts +1 -0
  238. package/dist-lib/lib/tools/exec/obsidian/output.js +31 -0
  239. package/dist-lib/lib/tools/exec/obsidian/route.d.ts +19 -0
  240. package/dist-lib/lib/tools/exec/obsidian/route.js +85 -0
  241. package/dist-lib/lib/tools/exec/obsidian/safe-path.d.ts +3 -0
  242. package/dist-lib/lib/tools/exec/obsidian/safe-path.js +56 -0
  243. package/dist-lib/lib/tools/exec/obsidian/vault-create.d.ts +1 -0
  244. package/dist-lib/lib/tools/exec/obsidian/vault-create.js +40 -0
  245. package/dist-lib/lib/tools/exec/obsidian/vault-fs.d.ts +3 -0
  246. package/dist-lib/lib/tools/exec/obsidian/vault-fs.js +57 -0
  247. package/dist-lib/lib/tools/exec/obsidian/vault-paths.d.ts +20 -0
  248. package/dist-lib/lib/tools/exec/obsidian/vault-paths.js +171 -0
  249. package/dist-lib/lib/tools/exec/obsidian/vault-read.d.ts +11 -0
  250. package/dist-lib/lib/tools/exec/obsidian/vault-read.js +119 -0
  251. package/dist-lib/lib/tools/exec/obsidian/vault-write.d.ts +7 -0
  252. package/dist-lib/lib/tools/exec/obsidian/vault-write.js +134 -0
  253. package/dist-lib/lib/tools/exec/runner.d.ts +62 -0
  254. package/dist-lib/lib/tools/exec/runner.js +87 -0
  255. package/dist-lib/lib/tools/exec/scope.d.ts +3 -0
  256. package/dist-lib/lib/tools/exec/scope.js +97 -0
  257. package/dist-lib/lib/tools/exec/shell-argv.d.ts +2 -0
  258. package/dist-lib/lib/tools/exec/shell-argv.js +48 -0
  259. package/dist-lib/lib/tools/exec.d.ts +29 -0
  260. package/dist-lib/lib/tools/exec.js +459 -0
  261. package/dist-lib/lib/tools/file-glob.d.ts +15 -0
  262. package/dist-lib/lib/tools/file-glob.js +112 -0
  263. package/dist-lib/lib/tools/fs/drive.d.ts +26 -0
  264. package/dist-lib/lib/tools/fs/drive.js +1 -0
  265. package/dist-lib/lib/tools/fs/glob.d.ts +1 -0
  266. package/dist-lib/lib/tools/fs/glob.js +34 -0
  267. package/dist-lib/lib/tools/fs/local.d.ts +2 -0
  268. package/dist-lib/lib/tools/fs/local.js +29 -0
  269. package/dist-lib/lib/tools/fs/read.d.ts +2 -0
  270. package/dist-lib/lib/tools/fs/read.js +17 -0
  271. package/dist-lib/lib/tools/fs/remote-protocol.d.ts +40 -0
  272. package/dist-lib/lib/tools/fs/remote-protocol.js +1 -0
  273. package/dist-lib/lib/tools/fs/remote.d.ts +17 -0
  274. package/dist-lib/lib/tools/fs/remote.js +131 -0
  275. package/dist-lib/lib/tools/fs/scope.d.ts +37 -0
  276. package/dist-lib/lib/tools/fs/scope.js +130 -0
  277. package/dist-lib/lib/tools/fs/walk.d.ts +15 -0
  278. package/dist-lib/lib/tools/fs/walk.js +38 -0
  279. package/dist-lib/lib/tools/fs/write.d.ts +4 -0
  280. package/dist-lib/lib/tools/fs/write.js +5 -0
  281. package/dist-lib/lib/tools/generate-image.d.ts +111 -0
  282. package/dist-lib/lib/tools/generate-image.js +369 -0
  283. package/dist-lib/lib/tools/generate-music.d.ts +124 -0
  284. package/dist-lib/lib/tools/generate-music.js +522 -0
  285. package/dist-lib/lib/tools/grep.d.ts +5 -0
  286. package/dist-lib/lib/tools/grep.js +158 -0
  287. package/dist-lib/lib/tools/http-methods.d.ts +1 -0
  288. package/dist-lib/lib/tools/http-methods.js +1 -0
  289. package/dist-lib/lib/tools/http-request/encode-fields.d.ts +2 -0
  290. package/dist-lib/lib/tools/http-request/encode-fields.js +69 -0
  291. package/dist-lib/lib/tools/http-request/truncate-response.d.ts +1 -0
  292. package/dist-lib/lib/tools/http-request/truncate-response.js +83 -0
  293. package/dist-lib/lib/tools/http-request/utils.d.ts +27 -0
  294. package/dist-lib/lib/tools/http-request/utils.js +84 -0
  295. package/dist-lib/lib/tools/http-request.d.ts +20 -0
  296. package/dist-lib/lib/tools/http-request.js +177 -0
  297. package/dist-lib/lib/tools/mcp/utils.d.ts +47 -0
  298. package/dist-lib/lib/tools/mcp/utils.js +172 -0
  299. package/dist-lib/lib/tools/mcp-call.d.ts +14 -0
  300. package/dist-lib/lib/tools/mcp-call.js +155 -0
  301. package/dist-lib/lib/tools/model-args.d.ts +1 -0
  302. package/dist-lib/lib/tools/model-args.js +4 -0
  303. package/dist-lib/lib/tools/operations/builders.d.ts +17 -0
  304. package/dist-lib/lib/tools/operations/builders.js +179 -0
  305. package/dist-lib/lib/tools/operations/compile.d.ts +7 -0
  306. package/dist-lib/lib/tools/operations/compile.js +92 -0
  307. package/dist-lib/lib/tools/operations/gmail-message.d.ts +15 -0
  308. package/dist-lib/lib/tools/operations/gmail-message.js +62 -0
  309. package/dist-lib/lib/tools/operations/manifest.d.ts +60 -0
  310. package/dist-lib/lib/tools/operations/manifest.js +50 -0
  311. package/dist-lib/lib/tools/outbound-guard.d.ts +10 -0
  312. package/dist-lib/lib/tools/outbound-guard.js +127 -0
  313. package/dist-lib/lib/tools/private-ip.d.ts +4 -0
  314. package/dist-lib/lib/tools/private-ip.js +126 -0
  315. package/dist-lib/lib/tools/rag-search.d.ts +2 -0
  316. package/dist-lib/lib/tools/rag-search.js +98 -0
  317. package/dist-lib/lib/tools/read-files.d.ts +5 -0
  318. package/dist-lib/lib/tools/read-files.js +153 -0
  319. package/dist-lib/lib/tools/skill.d.ts +10 -0
  320. package/dist-lib/lib/tools/skill.js +123 -0
  321. package/dist-lib/lib/tools/skills/auth-resolver.d.ts +43 -0
  322. package/dist-lib/lib/tools/skills/auth-resolver.js +121 -0
  323. package/dist-lib/lib/tools/skills/bin-check.d.ts +9 -0
  324. package/dist-lib/lib/tools/skills/bin-check.js +56 -0
  325. package/dist-lib/lib/tools/skills/bundled-dir.d.ts +2 -0
  326. package/dist-lib/lib/tools/skills/bundled-dir.js +117 -0
  327. package/dist-lib/lib/tools/skills/bundled-hash.d.ts +4 -0
  328. package/dist-lib/lib/tools/skills/bundled-hash.js +12 -0
  329. package/dist-lib/lib/tools/skills/catalog.d.ts +60 -0
  330. package/dist-lib/lib/tools/skills/catalog.js +203 -0
  331. package/dist-lib/lib/tools/skills/cli-argv.d.ts +9 -0
  332. package/dist-lib/lib/tools/skills/cli-argv.js +147 -0
  333. package/dist-lib/lib/tools/skills/cli-schema-check.d.ts +3 -0
  334. package/dist-lib/lib/tools/skills/cli-schema-check.js +62 -0
  335. package/dist-lib/lib/tools/skills/cli-schema-load.d.ts +4 -0
  336. package/dist-lib/lib/tools/skills/cli-schema-load.js +90 -0
  337. package/dist-lib/lib/tools/skills/cli-schema-types.d.ts +30 -0
  338. package/dist-lib/lib/tools/skills/cli-schema-types.js +1 -0
  339. package/dist-lib/lib/tools/skills/cli-schema.d.ts +7 -0
  340. package/dist-lib/lib/tools/skills/cli-schema.js +35 -0
  341. package/dist-lib/lib/tools/skills/credential-check.d.ts +20 -0
  342. package/dist-lib/lib/tools/skills/credential-check.js +94 -0
  343. package/dist-lib/lib/tools/skills/credential-grants.d.ts +9 -0
  344. package/dist-lib/lib/tools/skills/credential-grants.js +25 -0
  345. package/dist-lib/lib/tools/skills/credential-health.d.ts +8 -0
  346. package/dist-lib/lib/tools/skills/credential-health.js +51 -0
  347. package/dist-lib/lib/tools/skills/credential-slots.d.ts +7 -0
  348. package/dist-lib/lib/tools/skills/credential-slots.js +8 -0
  349. package/dist-lib/lib/tools/skills/frontmatter-parser.d.ts +23 -0
  350. package/dist-lib/lib/tools/skills/frontmatter-parser.js +68 -0
  351. package/dist-lib/lib/tools/skills/index.d.ts +5 -0
  352. package/dist-lib/lib/tools/skills/index.js +5 -0
  353. package/dist-lib/lib/tools/skills/manifest-parse.d.ts +12 -0
  354. package/dist-lib/lib/tools/skills/manifest-parse.js +199 -0
  355. package/dist-lib/lib/tools/skills/manifest.d.ts +47 -0
  356. package/dist-lib/lib/tools/skills/manifest.js +1 -0
  357. package/dist-lib/lib/tools/skills/mention-name.d.ts +1 -0
  358. package/dist-lib/lib/tools/skills/mention-name.js +4 -0
  359. package/dist-lib/lib/tools/skills/mention.d.ts +6 -0
  360. package/dist-lib/lib/tools/skills/mention.js +42 -0
  361. package/dist-lib/lib/tools/skills/obsidian-readiness.d.ts +16 -0
  362. package/dist-lib/lib/tools/skills/obsidian-readiness.js +95 -0
  363. package/dist-lib/lib/tools/skills/overlay-crud.d.ts +18 -0
  364. package/dist-lib/lib/tools/skills/overlay-crud.js +98 -0
  365. package/dist-lib/lib/tools/skills/overlay-dir.d.ts +2 -0
  366. package/dist-lib/lib/tools/skills/overlay-dir.js +22 -0
  367. package/dist-lib/lib/tools/skills/overlay-watch.d.ts +13 -0
  368. package/dist-lib/lib/tools/skills/overlay-watch.js +44 -0
  369. package/dist-lib/lib/tools/skills/scope-key.d.ts +7 -0
  370. package/dist-lib/lib/tools/skills/scope-key.js +7 -0
  371. package/dist-lib/lib/tools/skills/setup-routes.d.ts +4 -0
  372. package/dist-lib/lib/tools/skills/setup-routes.js +14 -0
  373. package/dist-lib/lib/tools/skills/skill-settings.d.ts +16 -0
  374. package/dist-lib/lib/tools/skills/skill-settings.js +33 -0
  375. package/dist-lib/lib/tools/skills/skill-state-constants.d.ts +12 -0
  376. package/dist-lib/lib/tools/skills/skill-state-constants.js +14 -0
  377. package/dist-lib/lib/tools/skills/skill-state.d.ts +40 -0
  378. package/dist-lib/lib/tools/skills/skill-state.js +117 -0
  379. package/dist-lib/lib/tools/skills/tool-grants.d.ts +5 -0
  380. package/dist-lib/lib/tools/skills/tool-grants.js +14 -0
  381. package/dist-lib/lib/tools/toolsets.d.ts +8 -0
  382. package/dist-lib/lib/tools/toolsets.js +20 -0
  383. package/dist-lib/lib/tools/url-guard.d.ts +8 -0
  384. package/dist-lib/lib/tools/url-guard.js +40 -0
  385. package/dist-lib/lib/tools/web-fetch.d.ts +8 -0
  386. package/dist-lib/lib/tools/web-fetch.js +302 -0
  387. package/dist-lib/lib/tools/web-search.d.ts +6 -0
  388. package/dist-lib/lib/tools/web-search.js +55 -0
  389. package/dist-lib/lib/transport.d.ts +12 -0
  390. package/dist-lib/lib/transport.js +59 -0
  391. package/dist-lib/lib/user-agent.d.ts +1 -0
  392. package/dist-lib/lib/user-agent.js +1 -0
  393. package/dist-lib/lib/validating-lookup.d.ts +17 -0
  394. package/dist-lib/lib/validating-lookup.js +25 -0
  395. package/dist-lib/lib/wav-encode.d.ts +5 -0
  396. package/dist-lib/lib/wav-encode.js +24 -0
  397. package/dist-lib/lib/web-fetch/embedded-state.d.ts +1 -0
  398. package/dist-lib/lib/web-fetch/embedded-state.js +131 -0
  399. package/dist-lib/lib/web-fetch/extract.d.ts +6 -0
  400. package/dist-lib/lib/web-fetch/extract.js +65 -0
  401. package/dist-lib/lib/web-fetch/images.d.ts +3 -0
  402. package/dist-lib/lib/web-fetch/images.js +43 -0
  403. package/dist-lib/lib/web-fetch/video.d.ts +5 -0
  404. package/dist-lib/lib/web-fetch/video.js +42 -0
  405. package/dist-lib/lib/web-search/engine-registry.d.ts +7 -0
  406. package/dist-lib/lib/web-search/engine-registry.js +17 -0
  407. package/dist-lib/lib/web-search/engines/aol.d.ts +3 -0
  408. package/dist-lib/lib/web-search/engines/aol.js +81 -0
  409. package/dist-lib/lib/web-search/engines/bing.d.ts +3 -0
  410. package/dist-lib/lib/web-search/engines/bing.js +111 -0
  411. package/dist-lib/lib/web-search/engines/brave.d.ts +3 -0
  412. package/dist-lib/lib/web-search/engines/brave.js +59 -0
  413. package/dist-lib/lib/web-search/engines/duckduckgo.d.ts +3 -0
  414. package/dist-lib/lib/web-search/engines/duckduckgo.js +112 -0
  415. package/dist-lib/lib/web-search/engines/google.d.ts +3 -0
  416. package/dist-lib/lib/web-search/engines/google.js +92 -0
  417. package/dist-lib/lib/web-search/engines/wikipedia.d.ts +3 -0
  418. package/dist-lib/lib/web-search/engines/wikipedia.js +37 -0
  419. package/dist-lib/lib/web-search/engines/yahoo.d.ts +3 -0
  420. package/dist-lib/lib/web-search/engines/yahoo.js +81 -0
  421. package/dist-lib/lib/web-search/fetch-html.d.ts +25 -0
  422. package/dist-lib/lib/web-search/fetch-html.js +97 -0
  423. package/dist-lib/lib/web-search/format-results.d.ts +3 -0
  424. package/dist-lib/lib/web-search/format-results.js +14 -0
  425. package/dist-lib/lib/web-search/html-helpers.d.ts +3 -0
  426. package/dist-lib/lib/web-search/html-helpers.js +24 -0
  427. package/dist-lib/lib/web-search/merge-results.d.ts +2 -0
  428. package/dist-lib/lib/web-search/merge-results.js +53 -0
  429. package/dist-lib/lib/web-search/orchestrator.d.ts +14 -0
  430. package/dist-lib/lib/web-search/orchestrator.js +50 -0
  431. package/dist-lib/lib/web-search/types.d.ts +34 -0
  432. package/dist-lib/lib/web-search/types.js +1 -0
  433. package/dist-lib/lib/web-search/url-helpers.d.ts +1 -0
  434. package/dist-lib/lib/web-search/url-helpers.js +11 -0
  435. package/dist-lib/lib/web-search/url-normalize.d.ts +1 -0
  436. package/dist-lib/lib/web-search/url-normalize.js +25 -0
  437. package/dist-lib/lib/web-search/user-agents.d.ts +3 -0
  438. package/dist-lib/lib/web-search/user-agents.js +3 -0
  439. package/dist-lib/lib/wire.d.ts +50 -0
  440. package/dist-lib/lib/wire.js +145 -0
  441. package/dist-lib/schema/baseline.d.ts +8 -0
  442. package/dist-lib/schema/baseline.js +35 -0
  443. package/dist-lib/schema/build.d.ts +1 -0
  444. package/dist-lib/schema/build.js +39 -0
  445. package/dist-lib/schema/generate.d.ts +20 -0
  446. package/dist-lib/schema/generate.js +149 -0
  447. package/dist-lib/schema/harness.d.ts +2 -0
  448. package/dist-lib/schema/harness.js +745 -0
  449. package/dist-lib/schema/release-tags.d.ts +5 -0
  450. package/dist-lib/schema/release-tags.js +58 -0
  451. package/dist-lib/spec/bind.d.ts +2 -0
  452. package/dist-lib/spec/bind.js +124 -0
  453. package/dist-lib/spec/calls.d.ts +3 -0
  454. package/dist-lib/spec/calls.js +41 -0
  455. package/dist-lib/spec/hrpc/hrpc.json +356 -0
  456. package/dist-lib/spec/hrpc/index.d.ts +3 -0
  457. package/dist-lib/spec/hrpc/index.js +463 -0
  458. package/dist-lib/spec/hrpc/messages.d.ts +4 -0
  459. package/dist-lib/spec/hrpc/messages.js +3102 -0
  460. package/dist-lib/spec/hyperschema/index.js +3102 -0
  461. package/dist-lib/spec/hyperschema/schema.json +2290 -0
  462. package/dist-lib/spec/hyperschema/types.d.ts +554 -0
  463. package/dist-lib/spec/index.d.ts +8 -0
  464. package/dist-lib/spec/index.js +1 -0
  465. package/package.json +418 -1
  466. package/wheels/cffi-2.0.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
  467. package/wheels/cryptography-47.0.0-cp314-abi3-pyemscripten_2026_0_wasm32.whl +0 -0
  468. package/wheels/defusedxml-0.7.1-py2.py3-none-any.whl +0 -0
  469. package/wheels/et_xmlfile-2.0.0-py3-none-any.whl +0 -0
  470. package/wheels/fonttools-4.62.1-py3-none-any.whl +0 -0
  471. package/wheels/fpdf2-2.8.8-py3-none-any.whl +0 -0
  472. package/wheels/lxml-6.0.2-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
  473. package/wheels/manifest.json +155 -0
  474. package/wheels/micropip-0.11.1-py3-none-any.whl +0 -0
  475. package/wheels/openpyxl-3.1.5-py2.py3-none-any.whl +0 -0
  476. package/wheels/pillow-12.2.0-cp314-cp314-pyemscripten_2026_0_wasm32.whl +0 -0
  477. package/wheels/pycparser-3.0-py3-none-any.whl +0 -0
  478. package/wheels/pypdf-6.15.0-py3-none-any.whl +0 -0
  479. package/wheels/python_docx-1.2.0-py3-none-any.whl +0 -0
  480. package/wheels/python_pptx-1.0.2-py3-none-any.whl +0 -0
  481. package/wheels/six-1.17.0-py2.py3-none-any.whl +0 -0
  482. package/wheels/typing_extensions-4.15.0-py3-none-any.whl +0 -0
  483. package/wheels/xlsxwriter-3.2.9-py3-none-any.whl +0 -0
@@ -0,0 +1,40 @@
1
+ import { AbortedError, raceAbort } from "../helpers/race-abort.js";
2
+ import { isPrivateOrBlocked, stripIPv6Brackets } from "./private-ip.js";
3
+ const LITERAL_IPV4 = /^\d{1,3}(\.\d{1,3}){3}$/;
4
+ export function checkOutboundHost(url) {
5
+ const host = stripIPv6Brackets(url.hostname);
6
+ return isPrivateOrBlocked(host)
7
+ ? `blocked host: ${host} (private, loopback, link-local or metadata address)`
8
+ : null;
9
+ }
10
+ export async function resolveOutboundUrl(url, resolveHost, signal) {
11
+ const blocked = checkOutboundHost(url);
12
+ if (blocked) {
13
+ return { blocked };
14
+ }
15
+ const host = stripIPv6Brackets(url.hostname);
16
+ if (host.includes(':') || LITERAL_IPV4.test(host)) {
17
+ return { blocked: null };
18
+ }
19
+ if (!resolveHost) {
20
+ return { blocked: null };
21
+ }
22
+ let addresses;
23
+ try {
24
+ addresses = await raceAbort(resolveHost(host), signal);
25
+ }
26
+ catch (err) {
27
+ if (err instanceof AbortedError)
28
+ throw err;
29
+ return { blocked: `could not resolve host: ${host}` };
30
+ }
31
+ if (addresses.length === 0) {
32
+ return { blocked: `could not resolve host: ${host}` };
33
+ }
34
+ for (const address of addresses) {
35
+ if (isPrivateOrBlocked(address)) {
36
+ return { blocked: `blocked host: ${host} resolves to ${address}` };
37
+ }
38
+ }
39
+ return { blocked: null, addresses };
40
+ }
@@ -0,0 +1,8 @@
1
+ import type { ToolDefinition } from '../capabilities/completion.ts';
2
+ import type { FetchFn } from './http-request.ts';
3
+ import { type HostResolver } from './url-guard.ts';
4
+ export interface WebFetchToolOptions {
5
+ fetch?: FetchFn;
6
+ resolveHost?: HostResolver;
7
+ }
8
+ export declare function createWebFetchTool({ fetch: fetchImpl, resolveHost }?: WebFetchToolOptions): ToolDefinition;
@@ -0,0 +1,302 @@
1
+ import defaultFetch from '#no-redirect-fetch';
2
+ import { AbortController } from 'bare-abort-controller';
3
+ import { lookupHost } from "../dns-lookup.js";
4
+ import { AbortedError } from "../helpers/race-abort.js";
5
+ import { extractEmbeddedState } from "../web-fetch/embedded-state.js";
6
+ import { extractPageText, looksLikeHtml } from "../web-fetch/extract.js";
7
+ import { imageFileName, pageImageUrls } from "../web-fetch/images.js";
8
+ import { pageVideoRef } from "../web-fetch/video.js";
9
+ import { MAX_HTML_CHARS } from "../web-search/fetch-html.js";
10
+ import { BROWSER_UA } from "../web-search/user-agents.js";
11
+ import { isRedirectStatus } from "./http-request/utils.js";
12
+ import { resolveOutboundUrl } from "./url-guard.js";
13
+ const SMALL_CONTEXT_TOKENS = 12_288;
14
+ const SMALL_CONTEXT_CHARS = 6_000;
15
+ const LARGE_CONTEXT_CHARS = 16_000;
16
+ const PAGE_TIMEOUT_MS = 15_000;
17
+ const SOURCE_EXCERPT_CHARS = 2_000;
18
+ const MIN_MARKUP_CHARS = 200;
19
+ const MAX_REDIRECTS = 5;
20
+ const MAX_IMAGE_BYTES = 3_000_000;
21
+ const MAX_PAGE_BYTES = 8_000_000;
22
+ function charBudget(ctxSize) {
23
+ return ctxSize && ctxSize <= SMALL_CONTEXT_TOKENS ? SMALL_CONTEXT_CHARS : LARGE_CONTEXT_CHARS;
24
+ }
25
+ export function createWebFetchTool({ fetch: fetchImpl, resolveHost = lookupHost } = {}) {
26
+ return {
27
+ name: 'web_fetch',
28
+ toolset: 'web-search',
29
+ description: 'Fetch a public web page and return its readable text. ' +
30
+ 'Use this to read the full content behind a web_search result URL, or a page the user ' +
31
+ 'shares, when a search snippet is not enough to answer.',
32
+ parameters: {
33
+ type: 'object',
34
+ properties: {
35
+ url: { type: 'string', description: 'Full http:// or https:// URL of the page to read' }
36
+ },
37
+ required: ['url']
38
+ },
39
+ effect: () => 'read',
40
+ resource: (args) => {
41
+ try {
42
+ return { kind: 'host', label: new URL(String(args.url)).hostname };
43
+ }
44
+ catch {
45
+ return null;
46
+ }
47
+ },
48
+ async execute(args, ctx) {
49
+ const raw = args.url;
50
+ if (typeof raw !== 'string' || raw.trim().length === 0) {
51
+ return { error: 'url must be a non-empty string' };
52
+ }
53
+ let url;
54
+ try {
55
+ url = new URL(raw.trim());
56
+ }
57
+ catch {
58
+ return { error: `"${raw}" is not a valid URL` };
59
+ }
60
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
61
+ return { error: `Scheme "${url.protocol}" not allowed. Use http: or https:.` };
62
+ }
63
+ if (ctx?.signal?.aborted)
64
+ return { error: 'web_fetch cancelled' };
65
+ const fetch = fetchImpl ?? defaultFetch;
66
+ const controller = new AbortController();
67
+ const timeout = setTimeout(() => controller.abort(undefined), PAGE_TIMEOUT_MS);
68
+ const onCallerAbort = () => controller.abort(undefined);
69
+ ctx?.signal?.addEventListener('abort', onCallerAbort);
70
+ try {
71
+ const got = await guardedGet(fetch, url, {
72
+ resolveHost,
73
+ signal: controller.signal,
74
+ accept: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
75
+ maxBytes: MAX_PAGE_BYTES,
76
+ truncate: true
77
+ });
78
+ if (!got.ok)
79
+ return { error: got.error };
80
+ const { response, finalUrl: currentUrl } = got;
81
+ if (response.status < 200 || response.status >= 300) {
82
+ return { error: `HTTP ${response.status} fetching ${currentUrl.toString()}` };
83
+ }
84
+ const rawBody = await response.text();
85
+ const body = rawBody.length > MAX_HTML_CHARS ? rawBody.slice(0, MAX_HTML_CHARS) : rawBody;
86
+ let mimeType = response.headers?.get('content-type')?.split(';')[0]?.trim().toLowerCase() ?? '';
87
+ if (body.startsWith('%PDF-'))
88
+ mimeType = 'application/pdf';
89
+ if (isBinaryMime(mimeType) || body.includes('\u0000')) {
90
+ const attachMime = isBinaryMime(mimeType) ? mimeType : 'application/octet-stream';
91
+ return await attachDocument(response, currentUrl, attachMime, ctx?.attach);
92
+ }
93
+ const isHtml = looksLikeHtml(body);
94
+ let page = isHtml ? extractPageText(body) : { title: null, text: body.trim() };
95
+ if (isHtml && page.text.length < MIN_MARKUP_CHARS) {
96
+ const embedded = extractEmbeddedState(body);
97
+ if (embedded.length > page.text.length)
98
+ page = { title: page.title, text: embedded };
99
+ }
100
+ const budget = charBudget(ctx?.ctxSize);
101
+ const text = page.text.length > budget ? `${page.text.slice(0, budget)}…[truncated]` : page.text;
102
+ if (text.length === 0) {
103
+ return {
104
+ content: isHtml
105
+ ? `No readable text found at ${url.toString()} — the page likely requires JavaScript to render.`
106
+ : `The response at ${url.toString()} is empty.`
107
+ };
108
+ }
109
+ const attached = isHtml
110
+ ? await attachPageImages(body, currentUrl, {
111
+ fetch,
112
+ resolveHost,
113
+ attach: ctx?.attach,
114
+ signal: controller.signal
115
+ })
116
+ : [];
117
+ const imagesLine = attached.length
118
+ ? `\n\n[Attached ${attached.length === 1 ? 'image' : 'images'}: ${attached.join(', ')} — shown to the user automatically]`
119
+ : '';
120
+ const video = isHtml ? pageVideoRef(body, currentUrl) : null;
121
+ const videoLine = video
122
+ ? `\n\n[This page's video: ${video.url} — share this link when the user wants to watch it]`
123
+ : '';
124
+ const header = page.title ? `${page.title}\nSource: ${url}` : `Source: ${url}`;
125
+ return {
126
+ content: `${header}\n\n${text}${imagesLine}${videoLine}`,
127
+ data: {
128
+ results: [
129
+ {
130
+ title: page.title ?? url.toString(),
131
+ url: url.toString(),
132
+ content: text.slice(0, SOURCE_EXCERPT_CHARS)
133
+ }
134
+ ]
135
+ }
136
+ };
137
+ }
138
+ catch (err) {
139
+ if (ctx?.signal?.aborted || err instanceof AbortedError) {
140
+ return { error: 'web_fetch cancelled' };
141
+ }
142
+ if (controller.signal.aborted) {
143
+ return { error: `${url.hostname} timed out after ${PAGE_TIMEOUT_MS}ms` };
144
+ }
145
+ return { error: err instanceof Error ? err.message : String(err) };
146
+ }
147
+ finally {
148
+ clearTimeout(timeout);
149
+ ctx?.signal?.removeEventListener('abort', onCallerAbort);
150
+ }
151
+ }
152
+ };
153
+ }
154
+ const BINARY_MIME_PREFIXES = ['image/', 'audio/', 'video/', 'font/', 'model/'];
155
+ function isBinaryMime(mimeType) {
156
+ if (mimeType in MIME_EXTENSIONS)
157
+ return true;
158
+ return BINARY_MIME_PREFIXES.some((prefix) => mimeType.startsWith(prefix));
159
+ }
160
+ async function attachDocument(response, url, mimeType, attach) {
161
+ const bytes = await response.bytes?.();
162
+ if (!attach || !bytes || bytes.byteLength === 0) {
163
+ return { error: 'This URL serves a file, not a readable page, and it could not be attached.' };
164
+ }
165
+ if (bytes.byteLength >= MAX_PAGE_BYTES) {
166
+ return {
167
+ error: `This file is larger than ${MAX_PAGE_BYTES / 1_000_000}MB and was not attached.`
168
+ };
169
+ }
170
+ const mime = mimeType || 'application/octet-stream';
171
+ const record = await attach({
172
+ fileName: attachmentFileName(url, mime),
173
+ mimeType: mime,
174
+ bytes,
175
+ raw: !mime.startsWith('image/')
176
+ });
177
+ return {
178
+ content: `Attached the file "${record.fileName}" (${Math.round(record.byteLength / 1024)}KB, ${mime}) from ${url.toString()} — ` +
179
+ 'the user can open or save it. Its contents were NOT read: do not claim to know what is inside.'
180
+ };
181
+ }
182
+ const MIME_EXTENSIONS = {
183
+ 'application/pdf': 'pdf',
184
+ 'application/msword': 'doc',
185
+ 'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'docx',
186
+ 'application/vnd.ms-excel': 'xls',
187
+ 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'xlsx',
188
+ 'application/vnd.ms-powerpoint': 'ppt',
189
+ 'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'pptx',
190
+ 'application/vnd.oasis.opendocument.text': 'odt',
191
+ 'application/vnd.oasis.opendocument.spreadsheet': 'ods',
192
+ 'application/epub+zip': 'epub',
193
+ 'application/zip': 'zip',
194
+ 'application/gzip': 'gz',
195
+ 'image/svg+xml': 'svg',
196
+ 'image/jpeg': 'jpg',
197
+ 'audio/mpeg': 'mp3',
198
+ 'application/octet-stream': 'bin'
199
+ };
200
+ function attachmentFileName(url, mimeType) {
201
+ const last = url.pathname.split('/').filter(Boolean).pop() ?? '';
202
+ let decoded = last;
203
+ try {
204
+ decoded = decodeURIComponent(last);
205
+ }
206
+ catch { }
207
+ const base = decoded.split(/[/\\]/).filter(Boolean).pop() ?? '';
208
+ if (!base)
209
+ return `${url.hostname}.${extensionFor(mimeType)}`;
210
+ const extension = /\.([\w-]{1,8})$/.exec(base)?.[1]?.toLowerCase() ?? '';
211
+ if (extension && acceptableExtensions(mimeType).has(extension))
212
+ return base;
213
+ if (mimeType === 'application/octet-stream' && /^[a-z][\w-]*$/.test(extension))
214
+ return base;
215
+ return `${base}.${extensionFor(mimeType)}`;
216
+ }
217
+ function acceptableExtensions(mimeType) {
218
+ const accepted = new Set([extensionFor(mimeType)]);
219
+ const subtype = mimeType.split('/')[1] ?? '';
220
+ if (/^[a-z0-9]{1,8}$/.test(subtype))
221
+ accepted.add(subtype);
222
+ return accepted;
223
+ }
224
+ function extensionFor(mimeType) {
225
+ const known = MIME_EXTENSIONS[mimeType];
226
+ if (known)
227
+ return known;
228
+ const subtype = mimeType.split('/')[1] ?? '';
229
+ return /^[a-z0-9]{1,5}$/.test(subtype) ? subtype : 'bin';
230
+ }
231
+ async function guardedGet(fetch, url, { resolveHost, signal, accept, maxBytes, truncate }) {
232
+ const initialCheck = await resolveOutboundUrl(url, resolveHost, signal);
233
+ if (initialCheck.blocked)
234
+ return { ok: false, error: initialCheck.blocked };
235
+ let currentUrl = url;
236
+ let validatedAddresses = initialCheck.addresses;
237
+ for (let redirects = 0;; redirects++) {
238
+ const response = await fetch(currentUrl, {
239
+ method: 'GET',
240
+ headers: { 'User-Agent': BROWSER_UA, Accept: accept },
241
+ signal,
242
+ redirect: 'manual',
243
+ validatedAddresses,
244
+ maxBytes,
245
+ truncate
246
+ });
247
+ if (!isRedirectStatus(response.status))
248
+ return { ok: true, response, finalUrl: currentUrl };
249
+ const location = response.headers?.get('location');
250
+ if (!location)
251
+ return { ok: true, response, finalUrl: currentUrl };
252
+ let nextUrl;
253
+ try {
254
+ nextUrl = new URL(location, currentUrl);
255
+ }
256
+ catch {
257
+ return { ok: true, response, finalUrl: currentUrl };
258
+ }
259
+ if (nextUrl.protocol !== 'http:' && nextUrl.protocol !== 'https:') {
260
+ return { ok: true, response, finalUrl: currentUrl };
261
+ }
262
+ if (redirects >= MAX_REDIRECTS)
263
+ return { ok: false, error: 'too many redirects' };
264
+ const hopCheck = await resolveOutboundUrl(nextUrl, resolveHost, signal);
265
+ if (hopCheck.blocked)
266
+ return { ok: false, error: hopCheck.blocked };
267
+ currentUrl = nextUrl;
268
+ validatedAddresses = hopCheck.addresses;
269
+ }
270
+ }
271
+ async function attachPageImages(html, pageUrl, { fetch, resolveHost, attach, signal }) {
272
+ if (!attach)
273
+ return [];
274
+ const attached = [];
275
+ for (const href of pageImageUrls(html, pageUrl)) {
276
+ try {
277
+ const got = await guardedGet(fetch, new URL(href), {
278
+ resolveHost,
279
+ signal,
280
+ accept: 'image/*',
281
+ maxBytes: MAX_IMAGE_BYTES
282
+ });
283
+ if (!got.ok)
284
+ continue;
285
+ const { response, finalUrl } = got;
286
+ if (response.status < 200 || response.status >= 300)
287
+ continue;
288
+ const mimeType = response.headers?.get('content-type')?.split(';')[0]?.trim() ?? '';
289
+ if (!mimeType.startsWith('image/'))
290
+ continue;
291
+ const bytes = await response.bytes?.();
292
+ if (!bytes || bytes.byteLength === 0 || bytes.byteLength > MAX_IMAGE_BYTES)
293
+ continue;
294
+ const record = await attach({ fileName: imageFileName(finalUrl, mimeType), mimeType, bytes });
295
+ attached.push(record.fileName);
296
+ }
297
+ catch {
298
+ continue;
299
+ }
300
+ }
301
+ return attached;
302
+ }
@@ -0,0 +1,6 @@
1
+ import type { ToolDefinition } from '../capabilities/completion.ts';
2
+ import type { Fetcher } from '../web-search/types.ts';
3
+ export interface WebSearchToolOptions {
4
+ fetch?: Fetcher;
5
+ }
6
+ export declare function createWebSearchTool({ fetch }?: WebSearchToolOptions): ToolDefinition;
@@ -0,0 +1,55 @@
1
+ import defaultFetch from '#fetch';
2
+ import { formatResultsForPrompt } from "../web-search/format-results.js";
3
+ import { searchWeb } from "../web-search/orchestrator.js";
4
+ const nodeFetch = async (url, init) => {
5
+ const res = await defaultFetch(url, init);
6
+ return { ok: res.ok, status: res.status, text: () => res.text() };
7
+ };
8
+ const SMALL_CONTEXT_TOKENS = 12_288;
9
+ const SMALL_CONTEXT_RESULTS = 8;
10
+ const LARGE_CONTEXT_RESULTS = 12;
11
+ function resultBudget(ctxSize) {
12
+ return ctxSize && ctxSize <= SMALL_CONTEXT_TOKENS ? SMALL_CONTEXT_RESULTS : LARGE_CONTEXT_RESULTS;
13
+ }
14
+ export function createWebSearchTool({ fetch } = {}) {
15
+ const fetcher = fetch ?? nodeFetch;
16
+ return {
17
+ name: 'web_search',
18
+ toolset: 'web-search',
19
+ description: 'Search the web for current information using multiple search engines. ' +
20
+ 'Returns a concise aggregated and ranked result set. Use this when the user asks about ' +
21
+ 'recent events, current information, or anything that may require ' +
22
+ 'up-to-date knowledge beyond your training data. When a snippet is not enough to answer, ' +
23
+ 'read the full page behind a result with web_fetch.',
24
+ parameters: {
25
+ type: 'object',
26
+ properties: {
27
+ query: { type: 'string', description: 'The search query' }
28
+ },
29
+ required: ['query']
30
+ },
31
+ effect: () => 'read',
32
+ async execute(args, ctx) {
33
+ const query = args.query;
34
+ if (typeof query !== 'string' || query.trim().length === 0) {
35
+ return { error: 'query must be a non-empty string' };
36
+ }
37
+ try {
38
+ const { results, engineSummary } = await searchWeb(fetcher, query, resultBudget(ctx?.ctxSize), ctx?.signal);
39
+ if (ctx?.signal?.aborted)
40
+ return { error: 'web_search cancelled' };
41
+ if (results.length > 0) {
42
+ return { content: formatResultsForPrompt(results), data: { results } };
43
+ }
44
+ const failed = engineSummary.filter((e) => e.status !== 'ok').length;
45
+ if (engineSummary.length > 0 && failed === engineSummary.length) {
46
+ return { error: `web_search unavailable: all ${failed} engines failed (timeout/error)` };
47
+ }
48
+ return { content: `No web results found for "${query}".` };
49
+ }
50
+ catch (err) {
51
+ return { error: err instanceof Error ? err.message : String(err) };
52
+ }
53
+ }
54
+ };
55
+ }
@@ -0,0 +1,12 @@
1
+ import { Duplex } from 'streamx';
2
+ export { settleOnClose, type Stream, type Transport } from './rpc-session.ts';
3
+ export interface Pipe {
4
+ write(data: Buffer): unknown;
5
+ on(event: 'data', listener: (chunk: unknown) => void): unknown;
6
+ }
7
+ export interface ClientSessions {
8
+ readonly current: Duplex;
9
+ reset(): Duplex;
10
+ }
11
+ export declare function clientSessions(pipe: Pipe): ClientSessions;
12
+ export declare function duplexPair(): [Duplex, Duplex];
@@ -0,0 +1,59 @@
1
+ import c from 'compact-encoding';
2
+ import { Duplex } from 'streamx';
3
+ export { settleOnClose } from "./rpc-session.js";
4
+ export function clientSessions(pipe) {
5
+ let current = session(pipe);
6
+ pipe.on('data', (chunk) => current.push(chunk));
7
+ return {
8
+ get current() {
9
+ return current;
10
+ },
11
+ reset() {
12
+ const previous = current;
13
+ current = session(pipe);
14
+ previous.destroy();
15
+ return current;
16
+ }
17
+ };
18
+ }
19
+ function session(pipe) {
20
+ return new Duplex({
21
+ write(data, cb) {
22
+ pipe.write(data);
23
+ cb(null);
24
+ }
25
+ });
26
+ }
27
+ export function duplexPair() {
28
+ let a;
29
+ let b;
30
+ a = new Duplex({
31
+ write(data, cb) {
32
+ b.push(data);
33
+ cb(null);
34
+ },
35
+ final(cb) {
36
+ b.push(null);
37
+ cb(null);
38
+ },
39
+ destroy(cb) {
40
+ b.destroy();
41
+ cb(null);
42
+ }
43
+ });
44
+ b = new Duplex({
45
+ write(data, cb) {
46
+ a.push(data);
47
+ cb(null);
48
+ },
49
+ final(cb) {
50
+ a.push(null);
51
+ cb(null);
52
+ },
53
+ destroy(cb) {
54
+ a.destroy();
55
+ cb(null);
56
+ }
57
+ });
58
+ return [a, b];
59
+ }
@@ -0,0 +1 @@
1
+ export declare const DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
@@ -0,0 +1 @@
1
+ export const DEFAULT_USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';
@@ -0,0 +1,17 @@
1
+ export type IPFamily = 4 | 6;
2
+ export type LookupAddress = {
3
+ readonly address: string;
4
+ readonly family: IPFamily;
5
+ };
6
+ export type LookupAllCb = (err: Error | null, addresses: ReadonlyArray<LookupAddress> | null) => void;
7
+ export type BareLookupAllOpts = {
8
+ readonly all: true;
9
+ readonly family?: IPFamily | 0;
10
+ readonly hints?: number;
11
+ };
12
+ export type BareLookupAll = (hostname: string, opts: BareLookupAllOpts, cb: LookupAllCb) => void;
13
+ export declare class BlockedAddressError extends Error {
14
+ readonly code = "EBLOCKEDADDR";
15
+ constructor(hostname: string, address: string);
16
+ }
17
+ export declare function makeValidatingLookup(rawLookup: BareLookupAll): BareLookupAll;
@@ -0,0 +1,25 @@
1
+ import { isPrivateOrBlocked } from "./tools/private-ip.js";
2
+ export class BlockedAddressError extends Error {
3
+ code = 'EBLOCKEDADDR';
4
+ constructor(hostname, address) {
5
+ super(`Requests to "${hostname}" resolve to blocked address "${address}".`);
6
+ this.name = 'BlockedAddressError';
7
+ }
8
+ }
9
+ export function makeValidatingLookup(rawLookup) {
10
+ return (hostname, opts, cb) => {
11
+ rawLookup(hostname, opts, (err, addresses) => {
12
+ if (err || addresses === null) {
13
+ cb(err, addresses);
14
+ return;
15
+ }
16
+ for (const record of addresses) {
17
+ if (isPrivateOrBlocked(record.address)) {
18
+ cb(new BlockedAddressError(hostname, record.address), null);
19
+ return;
20
+ }
21
+ }
22
+ cb(null, addresses);
23
+ });
24
+ };
25
+ }
@@ -0,0 +1,5 @@
1
+ export declare const TARGET_SAMPLE_RATE = 16000;
2
+ export declare const WAV_HEADER_SIZE = 44;
3
+ export declare const BITS_PER_SAMPLE = 16;
4
+ export declare const CHANNELS = 1;
5
+ export declare function buildWavBuffer(pcm: Buffer): Buffer;
@@ -0,0 +1,24 @@
1
+ export const TARGET_SAMPLE_RATE = 16000;
2
+ export const WAV_HEADER_SIZE = 44;
3
+ export const BITS_PER_SAMPLE = 16;
4
+ export const CHANNELS = 1;
5
+ export function buildWavBuffer(pcm) {
6
+ const dataSize = pcm.length;
7
+ const buf = Buffer.alloc(WAV_HEADER_SIZE + dataSize);
8
+ const blockAlign = CHANNELS * (BITS_PER_SAMPLE / 8);
9
+ buf.write('RIFF', 0, 'ascii');
10
+ buf.writeUInt32LE(WAV_HEADER_SIZE + dataSize - 8, 4);
11
+ buf.write('WAVE', 8, 'ascii');
12
+ buf.write('fmt ', 12, 'ascii');
13
+ buf.writeUInt32LE(16, 16);
14
+ buf.writeUInt16LE(1, 20);
15
+ buf.writeUInt16LE(CHANNELS, 22);
16
+ buf.writeUInt32LE(TARGET_SAMPLE_RATE, 24);
17
+ buf.writeUInt32LE(TARGET_SAMPLE_RATE * blockAlign, 28);
18
+ buf.writeUInt16LE(blockAlign, 32);
19
+ buf.writeUInt16LE(BITS_PER_SAMPLE, 34);
20
+ buf.write('data', 36, 'ascii');
21
+ buf.writeUInt32LE(dataSize, 40);
22
+ buf.set(pcm, WAV_HEADER_SIZE);
23
+ return buf;
24
+ }
@@ -0,0 +1 @@
1
+ export declare function extractEmbeddedState(html: string): string;