@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,2 @@
1
+ export type FieldEncoding = 'base64' | 'base64url';
2
+ export declare function encodeDeclaredFields(body: string | Record<string, unknown> | undefined, encode: Record<string, unknown> | undefined): string | Record<string, unknown> | undefined;
@@ -0,0 +1,69 @@
1
+ const BASE64URL = /^[A-Za-z0-9_-]+={0,2}$/;
2
+ const PRINTABLE_RATIO = 0.9;
3
+ export function encodeDeclaredFields(body, encode) {
4
+ if (!encode)
5
+ return body;
6
+ const parsed = asObject(body);
7
+ if (!parsed)
8
+ return body;
9
+ let next = parsed;
10
+ for (const [path, encoding] of Object.entries(encode)) {
11
+ if (encoding !== 'base64' && encoding !== 'base64url')
12
+ continue;
13
+ next = setAt(next, path.split('.'), encoding);
14
+ }
15
+ return next;
16
+ }
17
+ function asObject(body) {
18
+ if (typeof body === 'string') {
19
+ try {
20
+ return asObject(JSON.parse(body));
21
+ }
22
+ catch {
23
+ return null;
24
+ }
25
+ }
26
+ if (typeof body !== 'object' || body === null || Array.isArray(body))
27
+ return null;
28
+ return body;
29
+ }
30
+ function setAt(body, path, encoding) {
31
+ const [head, ...rest] = path;
32
+ if (head === undefined)
33
+ return body;
34
+ const current = body[head];
35
+ if (rest.length) {
36
+ if (typeof current !== 'object' || current === null)
37
+ return body;
38
+ return { ...body, [head]: setAt(current, rest, encoding) };
39
+ }
40
+ if (typeof current !== 'string')
41
+ return body;
42
+ return { ...body, [head]: encodeValue(current, encoding) };
43
+ }
44
+ function encodeValue(value, encoding) {
45
+ if (isAlreadyEncoded(value))
46
+ return value;
47
+ return Buffer.from(value, 'utf8').toString(encoding);
48
+ }
49
+ function isAlreadyEncoded(value) {
50
+ if (!BASE64URL.test(value) && !/^[A-Za-z0-9+/]+={0,2}$/.test(value))
51
+ return false;
52
+ try {
53
+ const decoded = Buffer.from(value, 'base64').toString('utf8');
54
+ return decoded.length > 0 && isMostlyPrintable(decoded);
55
+ }
56
+ catch {
57
+ return false;
58
+ }
59
+ }
60
+ function isMostlyPrintable(text) {
61
+ const chars = [...text];
62
+ const printable = chars.filter((char) => {
63
+ const code = char.codePointAt(0) ?? 0;
64
+ if (code === 0xfffd)
65
+ return false;
66
+ return code === 9 || code === 10 || code === 13 || (code >= 32 && code !== 127);
67
+ }).length;
68
+ return printable / chars.length >= PRINTABLE_RATIO;
69
+ }
@@ -0,0 +1 @@
1
+ export declare function truncateResponseBody(body: string): string;
@@ -0,0 +1,83 @@
1
+ import { MAX_RESPONSE_CHARS } from "./utils.js";
2
+ export function truncateResponseBody(body) {
3
+ if (body.length <= MAX_RESPONSE_CHARS)
4
+ return body;
5
+ return fitJson(body) ?? `${body.slice(0, MAX_RESPONSE_CHARS)}… [truncated]`;
6
+ }
7
+ function fitJson(body) {
8
+ let parsed;
9
+ try {
10
+ parsed = JSON.parse(body);
11
+ }
12
+ catch {
13
+ return null;
14
+ }
15
+ return JSON.stringify(fit(parsed, MAX_RESPONSE_CHARS));
16
+ }
17
+ const MARKER_CHARS = 64;
18
+ function shrinkable(value) {
19
+ if (typeof value === 'string')
20
+ return true;
21
+ return typeof value === 'object' && value !== null;
22
+ }
23
+ const ELISION = '… [truncated]';
24
+ function fitString(value, budget) {
25
+ const room = budget - ELISION.length - 2;
26
+ if (room <= 0)
27
+ return ELISION;
28
+ return `${value.slice(0, room)}${ELISION}`;
29
+ }
30
+ function fit(value, budget) {
31
+ const room = budget - MARKER_CHARS;
32
+ if (Array.isArray(value)) {
33
+ const kept = [];
34
+ let used = 2;
35
+ for (const item of value) {
36
+ const size = JSON.stringify(item).length + 1;
37
+ if (used + size > room) {
38
+ const left = room - used;
39
+ if (left > MARKER_CHARS && shrinkable(item))
40
+ kept.push(fit(item, left));
41
+ break;
42
+ }
43
+ kept.push(item);
44
+ used += size;
45
+ }
46
+ const dropped = value.length - kept.length;
47
+ if (dropped > 0)
48
+ kept.push(`… [${dropped} more items truncated]`);
49
+ return kept;
50
+ }
51
+ if (typeof value === 'object' && value !== null) {
52
+ const entries = Object.entries(value);
53
+ const out = {};
54
+ let used = 2;
55
+ let kept = 0;
56
+ let refitted = false;
57
+ for (const [key, item] of entries) {
58
+ const keySize = JSON.stringify(key).length + 2;
59
+ const size = keySize + JSON.stringify(item).length;
60
+ if (used + size > room) {
61
+ const left = room - used - keySize;
62
+ if (!refitted && left > MARKER_CHARS && shrinkable(item)) {
63
+ const shrunk = fit(item, left);
64
+ out[key] = shrunk;
65
+ used += keySize + JSON.stringify(shrunk).length;
66
+ refitted = true;
67
+ kept++;
68
+ }
69
+ continue;
70
+ }
71
+ out[key] = item;
72
+ used += size;
73
+ kept++;
74
+ }
75
+ if (kept < entries.length)
76
+ out['…'] = `[${entries.length - kept} more fields truncated]`;
77
+ return out;
78
+ }
79
+ if (typeof value === 'string' && JSON.stringify(value).length > budget) {
80
+ return fitString(value, budget);
81
+ }
82
+ return value;
83
+ }
@@ -0,0 +1,27 @@
1
+ import type { AbortSignal as BareAbortSignal } from 'bare-abort-controller';
2
+ export declare const MAX_RESPONSE_CHARS = 8192;
3
+ export declare const TIMEOUT_MS = 10000;
4
+ export interface FetchInit {
5
+ method: string;
6
+ headers: Record<string, string>;
7
+ body?: string;
8
+ signal: BareAbortSignal;
9
+ redirect?: 'manual';
10
+ validatedAddresses?: readonly string[] | undefined;
11
+ maxBytes?: number;
12
+ truncate?: boolean;
13
+ }
14
+ export declare function isRedirectStatus(status: number): boolean;
15
+ export type ParseResult<T> = {
16
+ readonly ok: true;
17
+ readonly value: T | undefined;
18
+ } | {
19
+ readonly ok: false;
20
+ readonly error: string;
21
+ };
22
+ export declare function parseObjectArg(v: unknown, name: string): ParseResult<Record<string, unknown>>;
23
+ export declare function parseJsonBody(body: string | Record<string, unknown> | undefined, contentType?: string): ParseResult<string | Record<string, unknown>>;
24
+ export declare function applyQuery(url: URL, query: Record<string, unknown>): void;
25
+ export declare function contentTypeOf(headers: unknown): string | undefined;
26
+ export declare function buildHeaders(headerArgs: Record<string, unknown>): Record<string, string>;
27
+ export declare function encodeBody(body: string | Record<string, unknown> | undefined, headers: Record<string, string>): string | undefined;
@@ -0,0 +1,84 @@
1
+ const BLOCKED_HEADERS = new Set(['authorization', 'cookie', 'proxy-authorization']);
2
+ export const MAX_RESPONSE_CHARS = 8192;
3
+ export const TIMEOUT_MS = 10_000;
4
+ export function isRedirectStatus(status) {
5
+ return status === 301 || status === 302 || status === 303 || status === 307 || status === 308;
6
+ }
7
+ export function parseObjectArg(v, name) {
8
+ if (v === null || v === undefined)
9
+ return { ok: true, value: undefined };
10
+ let value = v;
11
+ if (typeof v === 'string') {
12
+ try {
13
+ value = JSON.parse(v);
14
+ }
15
+ catch {
16
+ return { ok: false, error: `${name} must be an object` };
17
+ }
18
+ }
19
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
20
+ return { ok: false, error: `${name} must be an object` };
21
+ }
22
+ return { ok: true, value: value };
23
+ }
24
+ const BODY_JSON_ERROR = 'body is not valid JSON — resend it as one complete JSON object';
25
+ export function parseJsonBody(body, contentType) {
26
+ if (typeof body !== 'string')
27
+ return { ok: true, value: body };
28
+ if (contentType !== undefined && !/json/i.test(contentType))
29
+ return { ok: true, value: body };
30
+ const text = body.trim();
31
+ if (text[0] !== '{' && text[0] !== '[')
32
+ return { ok: true, value: body };
33
+ let parsed;
34
+ try {
35
+ parsed = JSON.parse(text);
36
+ }
37
+ catch {
38
+ return { ok: false, error: BODY_JSON_ERROR };
39
+ }
40
+ return { ok: true, value: isPlainRecord(parsed) ? parsed : body };
41
+ }
42
+ function isPlainRecord(value) {
43
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
44
+ }
45
+ export function applyQuery(url, query) {
46
+ for (const [key, value] of Object.entries(query)) {
47
+ if (value === null || value === undefined)
48
+ continue;
49
+ if (Array.isArray(value)) {
50
+ for (const item of value)
51
+ url.searchParams.append(key, String(item));
52
+ }
53
+ else {
54
+ url.searchParams.append(key, String(value));
55
+ }
56
+ }
57
+ }
58
+ export function contentTypeOf(headers) {
59
+ if (typeof headers !== 'object' || headers === null)
60
+ return undefined;
61
+ for (const [key, value] of Object.entries(headers)) {
62
+ if (key.toLowerCase() === 'content-type')
63
+ return String(value);
64
+ }
65
+ return undefined;
66
+ }
67
+ export function buildHeaders(headerArgs) {
68
+ const headers = {};
69
+ for (const [key, value] of Object.entries(headerArgs)) {
70
+ if (!BLOCKED_HEADERS.has(key.toLowerCase()))
71
+ headers[key] = String(value);
72
+ }
73
+ return headers;
74
+ }
75
+ export function encodeBody(body, headers) {
76
+ if (body === null || body === undefined)
77
+ return undefined;
78
+ if (typeof body !== 'object')
79
+ return String(body);
80
+ if (!Object.keys(headers).some((h) => h.toLowerCase() === 'content-type')) {
81
+ headers['Content-Type'] = 'application/json';
82
+ }
83
+ return JSON.stringify(body);
84
+ }
@@ -0,0 +1,20 @@
1
+ import type { ToolDefinition } from '../capabilities/completion.ts';
2
+ import { type FetchInit } from './http-request/utils.ts';
3
+ import { type CredentialAllowListFn, type CredentialStoreFn } from './skills/auth-resolver.ts';
4
+ import { type HostResolver } from './url-guard.ts';
5
+ export type FetchFn = (url: URL, init: FetchInit) => Promise<{
6
+ status: number;
7
+ headers?: {
8
+ get(name: string): string | null;
9
+ };
10
+ text(): Promise<string> | string;
11
+ bytes?(): Promise<Uint8Array> | Uint8Array;
12
+ }>;
13
+ export type { CredentialAllowList, CredentialAllowListFn, CredentialRecord, CredentialStoreFn, CredentialStoreValue } from './skills/auth-resolver.ts';
14
+ export interface HttpRequestToolOptions {
15
+ fetch?: FetchFn;
16
+ credentialStore?: CredentialStoreFn;
17
+ credentialAllowList?: CredentialAllowListFn;
18
+ resolveHost?: HostResolver;
19
+ }
20
+ export declare function createHttpRequestTool({ fetch: fetchImpl, credentialStore, credentialAllowList, resolveHost }?: HttpRequestToolOptions): ToolDefinition;
@@ -0,0 +1,177 @@
1
+ import defaultFetch from '#no-redirect-fetch';
2
+ import { AbortController } from 'bare-abort-controller';
3
+ import { lookupHost } from "../dns-lookup.js";
4
+ import { READ_METHODS } from "./http-methods.js";
5
+ import { encodeDeclaredFields } from "./http-request/encode-fields.js";
6
+ import { truncateResponseBody } from "./http-request/truncate-response.js";
7
+ import { AbortedError } from "../helpers/race-abort.js";
8
+ import { applyQuery, buildHeaders, contentTypeOf, encodeBody, isRedirectStatus, parseJsonBody, parseObjectArg, TIMEOUT_MS } from "./http-request/utils.js";
9
+ import { parseAuth, resolveBearerHeader, resolveRedirectBearerHeader } from "./skills/auth-resolver.js";
10
+ import { recordCredentialHealth } from "./skills/credential-health.js";
11
+ import { resolveOutboundUrl } from "./url-guard.js";
12
+ const MAX_REDIRECTS = 5;
13
+ export function createHttpRequestTool({ fetch: fetchImpl, credentialStore, credentialAllowList, resolveHost = lookupHost } = {}) {
14
+ return {
15
+ name: 'http_request',
16
+ toolset: 'http-request',
17
+ description: 'Make an outbound HTTP or HTTPS request and return the response status and body (truncated). Authorization/Cookie headers are stripped before sending. Stored skill credentials are attached automatically for their allow-listed hosts; `auth` is only needed to force a specific credential key.',
18
+ parameters: {
19
+ type: 'object',
20
+ properties: {
21
+ url: { type: 'string', description: 'Full http:// or https:// URL' },
22
+ method: {
23
+ type: 'string',
24
+ enum: ['GET', 'POST', 'PUT', 'DELETE'],
25
+ description: 'Defaults to GET'
26
+ },
27
+ headers: { type: 'object', description: 'Optional request headers' },
28
+ query: {
29
+ type: 'object',
30
+ description: 'Optional query params appended to the URL. Array values append repeated keys.'
31
+ },
32
+ body: {
33
+ type: 'object',
34
+ description: 'Request body, as a JSON object or a string. Objects are JSON-encoded and sent as application/json unless you set Content-Type yourself.'
35
+ },
36
+ encode: {
37
+ type: 'object',
38
+ description: 'Optional. Body fields to base64-encode before sending, as {"<dotted.path>": "base64url"}. Pass the field as plain text — never encode it yourself.'
39
+ },
40
+ auth: {
41
+ type: 'object',
42
+ description: 'Optional bearer auth: {"type": "bearer", "tokenCredentialKey": "<key>"}. Pass ONLY the credential key name — NEVER a token value. The tool resolves the actual secret itself; the model never sees it.'
43
+ }
44
+ },
45
+ required: ['url']
46
+ },
47
+ autoApprove: false,
48
+ effect(args) {
49
+ const method = typeof args.method === 'string' ? args.method.toUpperCase() : undefined;
50
+ if (method === undefined || !READ_METHODS.has(method))
51
+ return 'write';
52
+ return args.body === undefined && args.encode === undefined ? 'read' : 'write';
53
+ },
54
+ resource(args) {
55
+ try {
56
+ return { kind: 'host', label: new URL(String(args.url)).hostname };
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ },
62
+ async execute(rawArgs, ctx) {
63
+ const args = rawArgs;
64
+ let url;
65
+ try {
66
+ url = new URL(args.url);
67
+ }
68
+ catch {
69
+ return { error: `invalid URL: ${args.url}` };
70
+ }
71
+ if (url.protocol !== 'http:' && url.protocol !== 'https:') {
72
+ return { error: `unsupported protocol: ${url.protocol}` };
73
+ }
74
+ const query = parseObjectArg(args.query, 'query');
75
+ if (!query.ok)
76
+ return { error: query.error };
77
+ const encodeArgs = parseObjectArg(args.encode, 'encode');
78
+ if (!encodeArgs.ok)
79
+ return { error: encodeArgs.error };
80
+ const headerArgs = parseObjectArg(args.headers, 'headers');
81
+ if (!headerArgs.ok)
82
+ return { error: headerArgs.error };
83
+ const headers = headerArgs.value ? buildHeaders(headerArgs.value) : {};
84
+ const parsedBody = parseJsonBody(args.body, contentTypeOf(headers));
85
+ if (!parsedBody.ok)
86
+ return { error: parsedBody.error };
87
+ if (query.value)
88
+ applyQuery(url, query.value);
89
+ const auth = parseAuth(args.auth);
90
+ if (!auth.ok)
91
+ return { error: auth.error };
92
+ const allowList = credentialAllowList?.(ctx);
93
+ const controller = new AbortController();
94
+ const timeout = setTimeout(() => controller.abort(undefined), TIMEOUT_MS);
95
+ try {
96
+ const initialCheck = await resolveOutboundUrl(url, resolveHost, controller.signal);
97
+ if (initialCheck.blocked)
98
+ return { error: initialCheck.blocked };
99
+ const bearer = await resolveBearerHeader(auth.value, url, credentialStore, allowList, ctx, controller.signal);
100
+ if ('error' in bearer)
101
+ return { error: bearer.error };
102
+ const redirectAuth = bearer.credentialKey
103
+ ? { type: 'bearer', tokenCredentialKey: bearer.credentialKey }
104
+ : undefined;
105
+ const encoded = encodeDeclaredFields(parsedBody.value, encodeArgs.value);
106
+ const requestBody = encodeBody(encoded, headers);
107
+ const fetch = fetchImpl ?? defaultFetch;
108
+ let currentUrl = url;
109
+ let method = args.method ?? 'GET';
110
+ let body = requestBody;
111
+ let header = bearer.header;
112
+ let credentialKey = bearer.credentialKey;
113
+ let validatedAddresses = initialCheck.addresses;
114
+ let response;
115
+ for (let redirects = 0;; redirects++) {
116
+ const hopHeaders = { ...headers };
117
+ delete hopHeaders['Authorization'];
118
+ if (header)
119
+ hopHeaders['Authorization'] = header;
120
+ response = await fetch(currentUrl, {
121
+ method,
122
+ headers: hopHeaders,
123
+ body,
124
+ signal: controller.signal,
125
+ redirect: 'manual',
126
+ validatedAddresses
127
+ });
128
+ if (credentialKey) {
129
+ recordCredentialHealth(credentialKey, response.status, ctx?.agentId);
130
+ }
131
+ if (!isRedirectStatus(response.status))
132
+ break;
133
+ const location = response.headers?.get('location');
134
+ if (!location)
135
+ break;
136
+ let nextUrl;
137
+ try {
138
+ nextUrl = new URL(location, currentUrl);
139
+ }
140
+ catch {
141
+ break;
142
+ }
143
+ if (nextUrl.protocol !== 'http:' && nextUrl.protocol !== 'https:')
144
+ break;
145
+ if (redirects >= MAX_REDIRECTS)
146
+ return { error: 'too many redirects' };
147
+ const hopCheck = await resolveOutboundUrl(nextUrl, resolveHost, controller.signal);
148
+ if (hopCheck.blocked)
149
+ return { error: hopCheck.blocked };
150
+ if (response.status === 303 ||
151
+ ((response.status === 301 || response.status === 302) && method === 'POST')) {
152
+ method = 'GET';
153
+ body = undefined;
154
+ }
155
+ currentUrl = nextUrl;
156
+ validatedAddresses = hopCheck.addresses;
157
+ const next = await resolveRedirectBearerHeader(redirectAuth, currentUrl, credentialStore, allowList, ctx, controller.signal);
158
+ header = next.header;
159
+ credentialKey = next.credentialKey;
160
+ }
161
+ const text = await response.text();
162
+ return { status: response.status, body: truncateResponseBody(text) };
163
+ }
164
+ catch (err) {
165
+ const error = err instanceof Error ? err : new Error(String(err));
166
+ return {
167
+ error: error.name === 'AbortError' || error instanceof AbortedError
168
+ ? 'request timed out'
169
+ : `request failed: ${error.message}`
170
+ };
171
+ }
172
+ finally {
173
+ clearTimeout(timeout);
174
+ }
175
+ }
176
+ };
177
+ }
@@ -0,0 +1,47 @@
1
+ import type { AbortSignal as BareAbortSignal } from 'bare-abort-controller';
2
+ import type { ToolExecuteContext } from '../../capabilities/completion.ts';
3
+ import { type FetchInit } from '../http-request/utils.ts';
4
+ export declare const MCP_PROTOCOL_VERSION = "2025-03-26";
5
+ export declare const TIMEOUT_MS = 30000;
6
+ export type McpFetchFn = (url: URL, init: FetchInit) => Promise<{
7
+ status: number;
8
+ statusText?: string;
9
+ headers: {
10
+ get(name: string): string | null;
11
+ };
12
+ text(): Promise<string> | string;
13
+ }>;
14
+ export declare function isNotification(method: string): boolean;
15
+ export declare function isMetadataMethod(method: unknown): boolean;
16
+ export declare function normalizeMethod(method: string, params: Record<string, unknown> | undefined): {
17
+ method: string;
18
+ params: Record<string, unknown> | undefined;
19
+ };
20
+ export declare function flattenMcpResponse(body: string): {
21
+ error: string;
22
+ } | {
23
+ body: string;
24
+ };
25
+ export declare function sessionKey(url: string, ctx: ToolExecuteContext | undefined, credentialKey?: string): string;
26
+ export declare function getSession(key: string): string;
27
+ export declare function deleteSession(key: string): void;
28
+ export declare function cacheSession(key: string, sessionId: string): void;
29
+ export declare function post(fetch: McpFetchFn, url: URL, method: string, params: Record<string, unknown> | undefined, authHeader: string | null, sessionId: string | undefined, signal: BareAbortSignal): Promise<{
30
+ status: number;
31
+ statusText?: string;
32
+ headers: {
33
+ get(name: string): string | null;
34
+ };
35
+ text(): Promise<string> | string;
36
+ }>;
37
+ export declare function readBody(response: {
38
+ text(): Promise<string> | string;
39
+ headers: {
40
+ get(name: string): string | null;
41
+ };
42
+ }): Promise<string>;
43
+ export declare function needsSession(status: number, cached: string): boolean;
44
+ export declare function establishSession(fetch: McpFetchFn, url: URL, authHeader: string | null, signal: BareAbortSignal): Promise<string | {
45
+ error: string;
46
+ stateless?: true;
47
+ }>;