@qvac/harness 0.1.0 → 0.1.2

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 (462) hide show
  1. package/dist/harness.bundle +13 -64
  2. package/dist/prebuilds-manifest.json +0 -8
  3. package/dist-lib/index.d.ts +240 -0
  4. package/dist-lib/index.js +1063 -0
  5. package/dist-lib/lib/audio-transcode-bare.d.ts +2 -0
  6. package/dist-lib/lib/audio-transcode-bare.js +145 -0
  7. package/dist-lib/lib/audio-transcode-node.d.ts +2 -0
  8. package/dist-lib/lib/audio-transcode-node.js +6 -0
  9. package/dist-lib/lib/capabilities/audio-resample.d.ts +14 -0
  10. package/dist-lib/lib/capabilities/audio-resample.js +72 -0
  11. package/dist-lib/lib/capabilities/completion.d.ts +288 -0
  12. package/dist-lib/lib/capabilities/completion.js +1077 -0
  13. package/dist-lib/lib/capabilities/download.d.ts +46 -0
  14. package/dist-lib/lib/capabilities/download.js +124 -0
  15. package/dist-lib/lib/capabilities/embed.d.ts +20 -0
  16. package/dist-lib/lib/capabilities/embed.js +13 -0
  17. package/dist-lib/lib/capabilities/kv-cache.d.ts +13 -0
  18. package/dist-lib/lib/capabilities/kv-cache.js +21 -0
  19. package/dist-lib/lib/capabilities/prompt-prefix.d.ts +6 -0
  20. package/dist-lib/lib/capabilities/prompt-prefix.js +10 -0
  21. package/dist-lib/lib/capabilities/speech-lexicon.d.ts +5 -0
  22. package/dist-lib/lib/capabilities/speech-lexicon.js +32 -0
  23. package/dist-lib/lib/capabilities/speech-text.d.ts +6 -0
  24. package/dist-lib/lib/capabilities/speech-text.js +79 -0
  25. package/dist-lib/lib/capabilities/tool-names.d.ts +3 -0
  26. package/dist-lib/lib/capabilities/tool-names.js +3 -0
  27. package/dist-lib/lib/capabilities/tool-selection.d.ts +43 -0
  28. package/dist-lib/lib/capabilities/tool-selection.js +60 -0
  29. package/dist-lib/lib/capabilities/tool-turns.d.ts +9 -0
  30. package/dist-lib/lib/capabilities/tool-turns.js +101 -0
  31. package/dist-lib/lib/capabilities/usage-breakdown.d.ts +27 -0
  32. package/dist-lib/lib/capabilities/usage-breakdown.js +44 -0
  33. package/dist-lib/lib/capabilities/vision-history.d.ts +3 -0
  34. package/dist-lib/lib/capabilities/vision-history.js +21 -0
  35. package/dist-lib/lib/capabilities/voice.d.ts +78 -0
  36. package/dist-lib/lib/capabilities/voice.js +189 -0
  37. package/dist-lib/lib/connect.d.ts +76 -0
  38. package/dist-lib/lib/connect.js +789 -0
  39. package/dist-lib/lib/context-window.d.ts +7 -0
  40. package/dist-lib/lib/context-window.js +90 -0
  41. package/dist-lib/lib/contract-types.d.ts +210 -0
  42. package/dist-lib/lib/contract-types.js +1 -0
  43. package/dist-lib/lib/diagram-repair.d.ts +21 -0
  44. package/dist-lib/lib/diagram-repair.js +58 -0
  45. package/dist-lib/lib/dns-lookup.d.ts +1 -0
  46. package/dist-lib/lib/dns-lookup.js +13 -0
  47. package/dist-lib/lib/error-fields.d.ts +2 -0
  48. package/dist-lib/lib/error-fields.js +8 -0
  49. package/dist-lib/lib/fetch-node.d.ts +1 -0
  50. package/dist-lib/lib/fetch-node.js +1 -0
  51. package/dist-lib/lib/hardware/capability-probe.d.ts +9 -0
  52. package/dist-lib/lib/hardware/capability-probe.js +99 -0
  53. package/dist-lib/lib/hardware/gpu-classify.d.ts +2 -0
  54. package/dist-lib/lib/hardware/gpu-classify.js +32 -0
  55. package/dist-lib/lib/hardware/gpu-probe-addon.d.ts +2 -0
  56. package/dist-lib/lib/hardware/gpu-probe-addon.js +42 -0
  57. package/dist-lib/lib/hardware/gpu-stats.bare.d.ts +1 -0
  58. package/dist-lib/lib/hardware/gpu-stats.bare.js +24 -0
  59. package/dist-lib/lib/hardware/gpu-stats.stub.d.ts +1 -0
  60. package/dist-lib/lib/hardware/gpu-stats.stub.js +3 -0
  61. package/dist-lib/lib/hardware/memory-budget.d.ts +8 -0
  62. package/dist-lib/lib/hardware/memory-budget.js +1 -0
  63. package/dist-lib/lib/hardware/parsers.d.ts +7 -0
  64. package/dist-lib/lib/hardware/parsers.js +41 -0
  65. package/dist-lib/lib/headers-bare.d.ts +1 -0
  66. package/dist-lib/lib/headers-bare.js +1 -0
  67. package/dist-lib/lib/headers-node.d.ts +4 -0
  68. package/dist-lib/lib/headers-node.js +1 -0
  69. package/dist-lib/lib/helpers/buffer-burst.d.ts +1 -0
  70. package/dist-lib/lib/helpers/buffer-burst.js +20 -0
  71. package/dist-lib/lib/helpers/control-tokens.d.ts +7 -0
  72. package/dist-lib/lib/helpers/control-tokens.js +32 -0
  73. package/dist-lib/lib/helpers/join-guard.d.ts +6 -0
  74. package/dist-lib/lib/helpers/join-guard.js +46 -0
  75. package/dist-lib/lib/helpers/markup-stream-filter.d.ts +5 -0
  76. package/dist-lib/lib/helpers/markup-stream-filter.js +75 -0
  77. package/dist-lib/lib/helpers/race-abort.d.ts +5 -0
  78. package/dist-lib/lib/helpers/race-abort.js +18 -0
  79. package/dist-lib/lib/helpers/retry-memo.d.ts +5 -0
  80. package/dist-lib/lib/helpers/retry-memo.js +12 -0
  81. package/dist-lib/lib/helpers/run-outcome.d.ts +33 -0
  82. package/dist-lib/lib/helpers/run-outcome.js +204 -0
  83. package/dist-lib/lib/helpers/spawn-path.d.ts +5 -0
  84. package/dist-lib/lib/helpers/spawn-path.js +57 -0
  85. package/dist-lib/lib/helpers/text-coalescer.d.ts +15 -0
  86. package/dist-lib/lib/helpers/text-coalescer.js +34 -0
  87. package/dist-lib/lib/helpers/thinking.d.ts +8 -0
  88. package/dist-lib/lib/helpers/thinking.js +95 -0
  89. package/dist-lib/lib/helpers/tool-call-markup.d.ts +20 -0
  90. package/dist-lib/lib/helpers/tool-call-markup.js +201 -0
  91. package/dist-lib/lib/helpers/tool-intent.d.ts +7 -0
  92. package/dist-lib/lib/helpers/tool-intent.js +21 -0
  93. package/dist-lib/lib/helpers/tool-label.d.ts +8 -0
  94. package/dist-lib/lib/helpers/tool-label.js +131 -0
  95. package/dist-lib/lib/hooks/built-in/arg-repair.d.ts +5 -0
  96. package/dist-lib/lib/hooks/built-in/arg-repair.js +88 -0
  97. package/dist-lib/lib/hooks/built-in/egress.d.ts +5 -0
  98. package/dist-lib/lib/hooks/built-in/egress.js +29 -0
  99. package/dist-lib/lib/hooks/built-in/index.d.ts +3 -0
  100. package/dist-lib/lib/hooks/built-in/index.js +3 -0
  101. package/dist-lib/lib/hooks/built-in/skill-catalog.d.ts +10 -0
  102. package/dist-lib/lib/hooks/built-in/skill-catalog.js +17 -0
  103. package/dist-lib/lib/hooks/pipeline.d.ts +20 -0
  104. package/dist-lib/lib/hooks/pipeline.js +49 -0
  105. package/dist-lib/lib/hooks/registry.d.ts +2 -0
  106. package/dist-lib/lib/hooks/registry.js +6 -0
  107. package/dist-lib/lib/hooks/run.d.ts +5 -0
  108. package/dist-lib/lib/hooks/run.js +83 -0
  109. package/dist-lib/lib/hooks/types.d.ts +57 -0
  110. package/dist-lib/lib/hooks/types.js +1 -0
  111. package/dist-lib/lib/log.d.ts +5 -0
  112. package/dist-lib/lib/log.js +37 -0
  113. package/dist-lib/lib/model-download-progress.d.ts +22 -0
  114. package/dist-lib/lib/model-download-progress.js +95 -0
  115. package/dist-lib/lib/models/context.d.ts +5 -0
  116. package/dist-lib/lib/models/context.js +12 -0
  117. package/dist-lib/lib/models/embed-config.d.ts +14 -0
  118. package/dist-lib/lib/models/embed-config.js +31 -0
  119. package/dist-lib/lib/models/gpu-selection.d.ts +3 -0
  120. package/dist-lib/lib/models/gpu-selection.js +26 -0
  121. package/dist-lib/lib/models/kv-cache.d.ts +4 -0
  122. package/dist-lib/lib/models/kv-cache.js +6 -0
  123. package/dist-lib/lib/models/llm-presets.d.ts +10 -0
  124. package/dist-lib/lib/models/llm-presets.js +58 -0
  125. package/dist-lib/lib/models/model-catalog-constants.d.ts +29 -0
  126. package/dist-lib/lib/models/model-catalog-constants.js +103 -0
  127. package/dist-lib/lib/models/model-catalog.d.ts +125 -0
  128. package/dist-lib/lib/models/model-catalog.js +371 -0
  129. package/dist-lib/lib/models/model-delete.d.ts +18 -0
  130. package/dist-lib/lib/models/model-delete.js +47 -0
  131. package/dist-lib/lib/models/model-handle.d.ts +18 -0
  132. package/dist-lib/lib/models/model-handle.js +33 -0
  133. package/dist-lib/lib/models/model-list.d.ts +42 -0
  134. package/dist-lib/lib/models/model-list.js +123 -0
  135. package/dist-lib/lib/models/model-pool.d.ts +116 -0
  136. package/dist-lib/lib/models/model-pool.js +356 -0
  137. package/dist-lib/lib/models/model-source.d.ts +6 -0
  138. package/dist-lib/lib/models/model-source.js +21 -0
  139. package/dist-lib/lib/models/music-catalog.d.ts +12 -0
  140. package/dist-lib/lib/models/music-catalog.js +26 -0
  141. package/dist-lib/lib/models/opencl-cache.d.ts +5 -0
  142. package/dist-lib/lib/models/opencl-cache.js +50 -0
  143. package/dist-lib/lib/models/sdk-faults.d.ts +21 -0
  144. package/dist-lib/lib/models/sdk-faults.js +66 -0
  145. package/dist-lib/lib/models/tool-dialect.d.ts +2 -0
  146. package/dist-lib/lib/models/tool-dialect.js +19 -0
  147. package/dist-lib/lib/models/tts-model-default.d.ts +3 -0
  148. package/dist-lib/lib/models/tts-model-default.js +13 -0
  149. package/dist-lib/lib/no-redirect-fetch-bare.d.ts +15 -0
  150. package/dist-lib/lib/no-redirect-fetch-bare.js +59 -0
  151. package/dist-lib/lib/no-redirect-fetch-impl.d.ts +39 -0
  152. package/dist-lib/lib/no-redirect-fetch-impl.js +80 -0
  153. package/dist-lib/lib/no-redirect-fetch-node.d.ts +4 -0
  154. package/dist-lib/lib/no-redirect-fetch-node.js +52 -0
  155. package/dist-lib/lib/prompt.d.ts +22 -0
  156. package/dist-lib/lib/prompt.js +77 -0
  157. package/dist-lib/lib/queue.d.ts +9 -0
  158. package/dist-lib/lib/queue.js +48 -0
  159. package/dist-lib/lib/resolution-detector.d.ts +5 -0
  160. package/dist-lib/lib/resolution-detector.js +100 -0
  161. package/dist-lib/lib/rpc-session.d.ts +8 -0
  162. package/dist-lib/lib/rpc-session.js +20 -0
  163. package/dist-lib/lib/sdk-config-loader.bare.d.ts +1 -0
  164. package/dist-lib/lib/sdk-config-loader.bare.js +9 -0
  165. package/dist-lib/lib/sdk-config-loader.node.d.ts +1 -0
  166. package/dist-lib/lib/sdk-config-loader.node.js +1 -0
  167. package/dist-lib/lib/sdk-loader.d.ts +30 -0
  168. package/dist-lib/lib/sdk-loader.js +53 -0
  169. package/dist-lib/lib/sdk-storage.d.ts +8 -0
  170. package/dist-lib/lib/sdk-storage.js +24 -0
  171. package/dist-lib/lib/serve.d.ts +3 -0
  172. package/dist-lib/lib/serve.js +612 -0
  173. package/dist-lib/lib/spawn.d.ts +62 -0
  174. package/dist-lib/lib/spawn.js +71 -0
  175. package/dist-lib/lib/staging.d.ts +4 -0
  176. package/dist-lib/lib/staging.js +28 -0
  177. package/dist-lib/lib/storage.d.ts +18 -0
  178. package/dist-lib/lib/storage.js +26 -0
  179. package/dist-lib/lib/tmp-path.d.ts +7 -0
  180. package/dist-lib/lib/tmp-path.js +17 -0
  181. package/dist-lib/lib/tool-call-display.d.ts +21 -0
  182. package/dist-lib/lib/tool-call-display.js +1 -0
  183. package/dist-lib/lib/tools/catalog.d.ts +13 -0
  184. package/dist-lib/lib/tools/catalog.js +13 -0
  185. package/dist-lib/lib/tools/create-documents.d.ts +3 -0
  186. package/dist-lib/lib/tools/create-documents.js +87 -0
  187. package/dist-lib/lib/tools/edit-documents.d.ts +3 -0
  188. package/dist-lib/lib/tools/edit-documents.js +122 -0
  189. package/dist-lib/lib/tools/edit-image.d.ts +25 -0
  190. package/dist-lib/lib/tools/edit-image.js +271 -0
  191. package/dist-lib/lib/tools/exec/adapters/adapter.d.ts +27 -0
  192. package/dist-lib/lib/tools/exec/adapters/adapter.js +1 -0
  193. package/dist-lib/lib/tools/exec/adapters/python/attachments.d.ts +26 -0
  194. package/dist-lib/lib/tools/exec/adapters/python/attachments.js +160 -0
  195. package/dist-lib/lib/tools/exec/adapters/python/create-effect.d.ts +7 -0
  196. package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +290 -0
  197. package/dist-lib/lib/tools/exec/adapters/python/loader.d.ts +11 -0
  198. package/dist-lib/lib/tools/exec/adapters/python/loader.js +94 -0
  199. package/dist-lib/lib/tools/exec/adapters/python/memfs.d.ts +47 -0
  200. package/dist-lib/lib/tools/exec/adapters/python/memfs.js +85 -0
  201. package/dist-lib/lib/tools/exec/adapters/python/output-policy.d.ts +13 -0
  202. package/dist-lib/lib/tools/exec/adapters/python/output-policy.js +129 -0
  203. package/dist-lib/lib/tools/exec/adapters/python/pyodide.d.ts +19 -0
  204. package/dist-lib/lib/tools/exec/adapters/python/pyodide.js +107 -0
  205. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.d.ts +75 -0
  206. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +1094 -0
  207. package/dist-lib/lib/tools/exec/adapters/python/run-session.d.ts +75 -0
  208. package/dist-lib/lib/tools/exec/adapters/python/run-session.js +273 -0
  209. package/dist-lib/lib/tools/exec/adapters/python/wheels.d.ts +38 -0
  210. package/dist-lib/lib/tools/exec/adapters/python/wheels.js +102 -0
  211. package/dist-lib/lib/tools/exec/adapters/python/worker/client.d.ts +7 -0
  212. package/dist-lib/lib/tools/exec/adapters/python/worker/client.js +188 -0
  213. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.d.ts +1 -0
  214. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +105 -0
  215. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.d.ts +38 -0
  216. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.js +41 -0
  217. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.d.ts +2 -0
  218. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.js +30 -0
  219. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.d.ts +13 -0
  220. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.js +45 -0
  221. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.d.ts +12 -0
  222. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +20 -0
  223. package/dist-lib/lib/tools/exec/obsidian/cli-process.d.ts +8 -0
  224. package/dist-lib/lib/tools/exec/obsidian/cli-process.js +74 -0
  225. package/dist-lib/lib/tools/exec/obsidian/cli.d.ts +18 -0
  226. package/dist-lib/lib/tools/exec/obsidian/cli.js +153 -0
  227. package/dist-lib/lib/tools/exec/obsidian/command.d.ts +5 -0
  228. package/dist-lib/lib/tools/exec/obsidian/command.js +18 -0
  229. package/dist-lib/lib/tools/exec/obsidian/guidance.d.ts +5 -0
  230. package/dist-lib/lib/tools/exec/obsidian/guidance.js +18 -0
  231. package/dist-lib/lib/tools/exec/obsidian/note-name.d.ts +1 -0
  232. package/dist-lib/lib/tools/exec/obsidian/note-name.js +6 -0
  233. package/dist-lib/lib/tools/exec/obsidian/output.d.ts +1 -0
  234. package/dist-lib/lib/tools/exec/obsidian/output.js +31 -0
  235. package/dist-lib/lib/tools/exec/obsidian/route.d.ts +19 -0
  236. package/dist-lib/lib/tools/exec/obsidian/route.js +85 -0
  237. package/dist-lib/lib/tools/exec/obsidian/safe-path.d.ts +3 -0
  238. package/dist-lib/lib/tools/exec/obsidian/safe-path.js +56 -0
  239. package/dist-lib/lib/tools/exec/obsidian/vault-create.d.ts +1 -0
  240. package/dist-lib/lib/tools/exec/obsidian/vault-create.js +40 -0
  241. package/dist-lib/lib/tools/exec/obsidian/vault-fs.d.ts +3 -0
  242. package/dist-lib/lib/tools/exec/obsidian/vault-fs.js +57 -0
  243. package/dist-lib/lib/tools/exec/obsidian/vault-paths.d.ts +20 -0
  244. package/dist-lib/lib/tools/exec/obsidian/vault-paths.js +171 -0
  245. package/dist-lib/lib/tools/exec/obsidian/vault-read.d.ts +11 -0
  246. package/dist-lib/lib/tools/exec/obsidian/vault-read.js +119 -0
  247. package/dist-lib/lib/tools/exec/obsidian/vault-write.d.ts +7 -0
  248. package/dist-lib/lib/tools/exec/obsidian/vault-write.js +134 -0
  249. package/dist-lib/lib/tools/exec/runner.d.ts +62 -0
  250. package/dist-lib/lib/tools/exec/runner.js +87 -0
  251. package/dist-lib/lib/tools/exec/scope.d.ts +3 -0
  252. package/dist-lib/lib/tools/exec/scope.js +97 -0
  253. package/dist-lib/lib/tools/exec/shell-argv.d.ts +2 -0
  254. package/dist-lib/lib/tools/exec/shell-argv.js +48 -0
  255. package/dist-lib/lib/tools/exec.d.ts +29 -0
  256. package/dist-lib/lib/tools/exec.js +459 -0
  257. package/dist-lib/lib/tools/file-glob.d.ts +15 -0
  258. package/dist-lib/lib/tools/file-glob.js +112 -0
  259. package/dist-lib/lib/tools/fs/drive.d.ts +26 -0
  260. package/dist-lib/lib/tools/fs/drive.js +1 -0
  261. package/dist-lib/lib/tools/fs/glob.d.ts +1 -0
  262. package/dist-lib/lib/tools/fs/glob.js +34 -0
  263. package/dist-lib/lib/tools/fs/local.d.ts +2 -0
  264. package/dist-lib/lib/tools/fs/local.js +29 -0
  265. package/dist-lib/lib/tools/fs/read.d.ts +2 -0
  266. package/dist-lib/lib/tools/fs/read.js +17 -0
  267. package/dist-lib/lib/tools/fs/remote-protocol.d.ts +40 -0
  268. package/dist-lib/lib/tools/fs/remote-protocol.js +1 -0
  269. package/dist-lib/lib/tools/fs/remote.d.ts +17 -0
  270. package/dist-lib/lib/tools/fs/remote.js +131 -0
  271. package/dist-lib/lib/tools/fs/scope.d.ts +37 -0
  272. package/dist-lib/lib/tools/fs/scope.js +130 -0
  273. package/dist-lib/lib/tools/fs/walk.d.ts +15 -0
  274. package/dist-lib/lib/tools/fs/walk.js +38 -0
  275. package/dist-lib/lib/tools/fs/write.d.ts +4 -0
  276. package/dist-lib/lib/tools/fs/write.js +5 -0
  277. package/dist-lib/lib/tools/generate-image.d.ts +111 -0
  278. package/dist-lib/lib/tools/generate-image.js +369 -0
  279. package/dist-lib/lib/tools/generate-music.d.ts +124 -0
  280. package/dist-lib/lib/tools/generate-music.js +522 -0
  281. package/dist-lib/lib/tools/grep.d.ts +5 -0
  282. package/dist-lib/lib/tools/grep.js +158 -0
  283. package/dist-lib/lib/tools/http-methods.d.ts +1 -0
  284. package/dist-lib/lib/tools/http-methods.js +1 -0
  285. package/dist-lib/lib/tools/http-request/encode-fields.d.ts +2 -0
  286. package/dist-lib/lib/tools/http-request/encode-fields.js +69 -0
  287. package/dist-lib/lib/tools/http-request/truncate-response.d.ts +1 -0
  288. package/dist-lib/lib/tools/http-request/truncate-response.js +83 -0
  289. package/dist-lib/lib/tools/http-request/utils.d.ts +27 -0
  290. package/dist-lib/lib/tools/http-request/utils.js +84 -0
  291. package/dist-lib/lib/tools/http-request.d.ts +20 -0
  292. package/dist-lib/lib/tools/http-request.js +177 -0
  293. package/dist-lib/lib/tools/mcp/utils.d.ts +47 -0
  294. package/dist-lib/lib/tools/mcp/utils.js +172 -0
  295. package/dist-lib/lib/tools/mcp-call.d.ts +14 -0
  296. package/dist-lib/lib/tools/mcp-call.js +155 -0
  297. package/dist-lib/lib/tools/model-args.d.ts +1 -0
  298. package/dist-lib/lib/tools/model-args.js +4 -0
  299. package/dist-lib/lib/tools/operations/builders.d.ts +17 -0
  300. package/dist-lib/lib/tools/operations/builders.js +179 -0
  301. package/dist-lib/lib/tools/operations/compile.d.ts +7 -0
  302. package/dist-lib/lib/tools/operations/compile.js +92 -0
  303. package/dist-lib/lib/tools/operations/gmail-message.d.ts +15 -0
  304. package/dist-lib/lib/tools/operations/gmail-message.js +62 -0
  305. package/dist-lib/lib/tools/operations/manifest.d.ts +60 -0
  306. package/dist-lib/lib/tools/operations/manifest.js +50 -0
  307. package/dist-lib/lib/tools/outbound-guard.d.ts +10 -0
  308. package/dist-lib/lib/tools/outbound-guard.js +127 -0
  309. package/dist-lib/lib/tools/private-ip.d.ts +4 -0
  310. package/dist-lib/lib/tools/private-ip.js +126 -0
  311. package/dist-lib/lib/tools/rag-search.d.ts +2 -0
  312. package/dist-lib/lib/tools/rag-search.js +98 -0
  313. package/dist-lib/lib/tools/read-files.d.ts +5 -0
  314. package/dist-lib/lib/tools/read-files.js +153 -0
  315. package/dist-lib/lib/tools/skill.d.ts +10 -0
  316. package/dist-lib/lib/tools/skill.js +123 -0
  317. package/dist-lib/lib/tools/skills/auth-resolver.d.ts +43 -0
  318. package/dist-lib/lib/tools/skills/auth-resolver.js +121 -0
  319. package/dist-lib/lib/tools/skills/bin-check.d.ts +9 -0
  320. package/dist-lib/lib/tools/skills/bin-check.js +56 -0
  321. package/dist-lib/lib/tools/skills/bundled-dir.d.ts +2 -0
  322. package/dist-lib/lib/tools/skills/bundled-dir.js +117 -0
  323. package/dist-lib/lib/tools/skills/bundled-hash.d.ts +4 -0
  324. package/dist-lib/lib/tools/skills/bundled-hash.js +12 -0
  325. package/dist-lib/lib/tools/skills/catalog.d.ts +60 -0
  326. package/dist-lib/lib/tools/skills/catalog.js +203 -0
  327. package/dist-lib/lib/tools/skills/cli-argv.d.ts +9 -0
  328. package/dist-lib/lib/tools/skills/cli-argv.js +147 -0
  329. package/dist-lib/lib/tools/skills/cli-schema-check.d.ts +3 -0
  330. package/dist-lib/lib/tools/skills/cli-schema-check.js +62 -0
  331. package/dist-lib/lib/tools/skills/cli-schema-load.d.ts +4 -0
  332. package/dist-lib/lib/tools/skills/cli-schema-load.js +90 -0
  333. package/dist-lib/lib/tools/skills/cli-schema-types.d.ts +30 -0
  334. package/dist-lib/lib/tools/skills/cli-schema-types.js +1 -0
  335. package/dist-lib/lib/tools/skills/cli-schema.d.ts +7 -0
  336. package/dist-lib/lib/tools/skills/cli-schema.js +35 -0
  337. package/dist-lib/lib/tools/skills/credential-check.d.ts +20 -0
  338. package/dist-lib/lib/tools/skills/credential-check.js +94 -0
  339. package/dist-lib/lib/tools/skills/credential-grants.d.ts +9 -0
  340. package/dist-lib/lib/tools/skills/credential-grants.js +25 -0
  341. package/dist-lib/lib/tools/skills/credential-health.d.ts +8 -0
  342. package/dist-lib/lib/tools/skills/credential-health.js +51 -0
  343. package/dist-lib/lib/tools/skills/credential-slots.d.ts +7 -0
  344. package/dist-lib/lib/tools/skills/credential-slots.js +8 -0
  345. package/dist-lib/lib/tools/skills/frontmatter-parser.d.ts +23 -0
  346. package/dist-lib/lib/tools/skills/frontmatter-parser.js +68 -0
  347. package/dist-lib/lib/tools/skills/index.d.ts +5 -0
  348. package/dist-lib/lib/tools/skills/index.js +5 -0
  349. package/dist-lib/lib/tools/skills/manifest-parse.d.ts +12 -0
  350. package/dist-lib/lib/tools/skills/manifest-parse.js +199 -0
  351. package/dist-lib/lib/tools/skills/manifest.d.ts +47 -0
  352. package/dist-lib/lib/tools/skills/manifest.js +1 -0
  353. package/dist-lib/lib/tools/skills/mention-name.d.ts +1 -0
  354. package/dist-lib/lib/tools/skills/mention-name.js +4 -0
  355. package/dist-lib/lib/tools/skills/mention.d.ts +6 -0
  356. package/dist-lib/lib/tools/skills/mention.js +42 -0
  357. package/dist-lib/lib/tools/skills/obsidian-readiness.d.ts +16 -0
  358. package/dist-lib/lib/tools/skills/obsidian-readiness.js +95 -0
  359. package/dist-lib/lib/tools/skills/overlay-crud.d.ts +18 -0
  360. package/dist-lib/lib/tools/skills/overlay-crud.js +98 -0
  361. package/dist-lib/lib/tools/skills/overlay-dir.d.ts +2 -0
  362. package/dist-lib/lib/tools/skills/overlay-dir.js +22 -0
  363. package/dist-lib/lib/tools/skills/overlay-watch.d.ts +13 -0
  364. package/dist-lib/lib/tools/skills/overlay-watch.js +44 -0
  365. package/dist-lib/lib/tools/skills/scope-key.d.ts +7 -0
  366. package/dist-lib/lib/tools/skills/scope-key.js +7 -0
  367. package/dist-lib/lib/tools/skills/setup-routes.d.ts +4 -0
  368. package/dist-lib/lib/tools/skills/setup-routes.js +14 -0
  369. package/dist-lib/lib/tools/skills/skill-settings.d.ts +16 -0
  370. package/dist-lib/lib/tools/skills/skill-settings.js +33 -0
  371. package/dist-lib/lib/tools/skills/skill-state-constants.d.ts +12 -0
  372. package/dist-lib/lib/tools/skills/skill-state-constants.js +14 -0
  373. package/dist-lib/lib/tools/skills/skill-state.d.ts +40 -0
  374. package/dist-lib/lib/tools/skills/skill-state.js +117 -0
  375. package/dist-lib/lib/tools/skills/tool-grants.d.ts +5 -0
  376. package/dist-lib/lib/tools/skills/tool-grants.js +14 -0
  377. package/dist-lib/lib/tools/toolsets.d.ts +8 -0
  378. package/dist-lib/lib/tools/toolsets.js +20 -0
  379. package/dist-lib/lib/tools/url-guard.d.ts +8 -0
  380. package/dist-lib/lib/tools/url-guard.js +40 -0
  381. package/dist-lib/lib/tools/web-fetch.d.ts +8 -0
  382. package/dist-lib/lib/tools/web-fetch.js +302 -0
  383. package/dist-lib/lib/tools/web-search.d.ts +6 -0
  384. package/dist-lib/lib/tools/web-search.js +55 -0
  385. package/dist-lib/lib/transport.d.ts +12 -0
  386. package/dist-lib/lib/transport.js +59 -0
  387. package/dist-lib/lib/user-agent.d.ts +1 -0
  388. package/dist-lib/lib/user-agent.js +1 -0
  389. package/dist-lib/lib/validating-lookup.d.ts +17 -0
  390. package/dist-lib/lib/validating-lookup.js +25 -0
  391. package/dist-lib/lib/wav-encode.d.ts +5 -0
  392. package/dist-lib/lib/wav-encode.js +24 -0
  393. package/dist-lib/lib/web-fetch/embedded-state.d.ts +1 -0
  394. package/dist-lib/lib/web-fetch/embedded-state.js +131 -0
  395. package/dist-lib/lib/web-fetch/extract.d.ts +6 -0
  396. package/dist-lib/lib/web-fetch/extract.js +65 -0
  397. package/dist-lib/lib/web-fetch/images.d.ts +3 -0
  398. package/dist-lib/lib/web-fetch/images.js +43 -0
  399. package/dist-lib/lib/web-fetch/video.d.ts +5 -0
  400. package/dist-lib/lib/web-fetch/video.js +42 -0
  401. package/dist-lib/lib/web-search/engine-registry.d.ts +7 -0
  402. package/dist-lib/lib/web-search/engine-registry.js +17 -0
  403. package/dist-lib/lib/web-search/engines/aol.d.ts +3 -0
  404. package/dist-lib/lib/web-search/engines/aol.js +81 -0
  405. package/dist-lib/lib/web-search/engines/bing.d.ts +3 -0
  406. package/dist-lib/lib/web-search/engines/bing.js +111 -0
  407. package/dist-lib/lib/web-search/engines/brave.d.ts +3 -0
  408. package/dist-lib/lib/web-search/engines/brave.js +59 -0
  409. package/dist-lib/lib/web-search/engines/duckduckgo.d.ts +3 -0
  410. package/dist-lib/lib/web-search/engines/duckduckgo.js +112 -0
  411. package/dist-lib/lib/web-search/engines/google.d.ts +3 -0
  412. package/dist-lib/lib/web-search/engines/google.js +92 -0
  413. package/dist-lib/lib/web-search/engines/wikipedia.d.ts +3 -0
  414. package/dist-lib/lib/web-search/engines/wikipedia.js +37 -0
  415. package/dist-lib/lib/web-search/engines/yahoo.d.ts +3 -0
  416. package/dist-lib/lib/web-search/engines/yahoo.js +81 -0
  417. package/dist-lib/lib/web-search/fetch-html.d.ts +25 -0
  418. package/dist-lib/lib/web-search/fetch-html.js +97 -0
  419. package/dist-lib/lib/web-search/format-results.d.ts +3 -0
  420. package/dist-lib/lib/web-search/format-results.js +14 -0
  421. package/dist-lib/lib/web-search/html-helpers.d.ts +3 -0
  422. package/dist-lib/lib/web-search/html-helpers.js +24 -0
  423. package/dist-lib/lib/web-search/merge-results.d.ts +2 -0
  424. package/dist-lib/lib/web-search/merge-results.js +53 -0
  425. package/dist-lib/lib/web-search/orchestrator.d.ts +14 -0
  426. package/dist-lib/lib/web-search/orchestrator.js +50 -0
  427. package/dist-lib/lib/web-search/types.d.ts +34 -0
  428. package/dist-lib/lib/web-search/types.js +1 -0
  429. package/dist-lib/lib/web-search/url-helpers.d.ts +1 -0
  430. package/dist-lib/lib/web-search/url-helpers.js +11 -0
  431. package/dist-lib/lib/web-search/url-normalize.d.ts +1 -0
  432. package/dist-lib/lib/web-search/url-normalize.js +25 -0
  433. package/dist-lib/lib/web-search/user-agents.d.ts +3 -0
  434. package/dist-lib/lib/web-search/user-agents.js +3 -0
  435. package/dist-lib/lib/wire.d.ts +50 -0
  436. package/dist-lib/lib/wire.js +145 -0
  437. package/dist-lib/schema/baseline.d.ts +8 -0
  438. package/dist-lib/schema/baseline.js +35 -0
  439. package/dist-lib/schema/build.d.ts +1 -0
  440. package/dist-lib/schema/build.js +39 -0
  441. package/dist-lib/schema/generate.d.ts +20 -0
  442. package/dist-lib/schema/generate.js +149 -0
  443. package/dist-lib/schema/harness.d.ts +2 -0
  444. package/dist-lib/schema/harness.js +745 -0
  445. package/dist-lib/schema/release-tags.d.ts +5 -0
  446. package/dist-lib/schema/release-tags.js +58 -0
  447. package/dist-lib/spec/bind.d.ts +2 -0
  448. package/dist-lib/spec/bind.js +124 -0
  449. package/dist-lib/spec/calls.d.ts +3 -0
  450. package/dist-lib/spec/calls.js +41 -0
  451. package/dist-lib/spec/hrpc/hrpc.json +356 -0
  452. package/dist-lib/spec/hrpc/index.d.ts +3 -0
  453. package/dist-lib/spec/hrpc/index.js +463 -0
  454. package/dist-lib/spec/hrpc/messages.d.ts +4 -0
  455. package/dist-lib/spec/hrpc/messages.js +3102 -0
  456. package/dist-lib/spec/hyperschema/index.js +3102 -0
  457. package/dist-lib/spec/hyperschema/schema.json +2290 -0
  458. package/dist-lib/spec/hyperschema/types.d.ts +554 -0
  459. package/dist-lib/spec/index.d.ts +8 -0
  460. package/dist-lib/spec/index.js +1 -0
  461. package/package.json +239 -64
  462. package/.gitattributes +0 -1
@@ -0,0 +1,62 @@
1
+ import b4a from 'b4a';
2
+ import { z } from 'zod';
3
+ const AddressList = z.union([z.string(), z.array(z.string())]);
4
+ export const GmailEnvelopeSchema = z
5
+ .object({
6
+ to: AddressList,
7
+ cc: AddressList.optional(),
8
+ bcc: AddressList.optional(),
9
+ subject: z.string(),
10
+ text: z.string().optional(),
11
+ html: z.string().optional(),
12
+ from: z.string().optional(),
13
+ replyTo: z.string().optional(),
14
+ inReplyTo: z.string().optional(),
15
+ references: z.string().optional()
16
+ })
17
+ .refine((value) => Boolean(value.text?.length) || Boolean(value.html?.length));
18
+ export function buildGmailMessage(envelope) {
19
+ return [...headerLines(envelope), ...bodyLines(envelope)].join('\r\n');
20
+ }
21
+ function stripNewlines(value) {
22
+ return value.replace(/[\r\n]+/g, ' ');
23
+ }
24
+ function joinAddresses(value) {
25
+ if (value === undefined)
26
+ return undefined;
27
+ const parts = (Array.isArray(value) ? value : [value])
28
+ .map((entry) => stripNewlines(String(entry)).trim())
29
+ .filter((entry) => entry.length > 0);
30
+ return parts.length > 0 ? parts.join(', ') : undefined;
31
+ }
32
+ function encodeHeaderValue(value) {
33
+ const sanitized = stripNewlines(value);
34
+ if (/^[\x20-\x7e]*$/.test(sanitized))
35
+ return sanitized;
36
+ return `=?UTF-8?B?${b4a.toString(b4a.from(sanitized, 'utf8'), 'base64')}?=`;
37
+ }
38
+ function headerLines(envelope) {
39
+ const headers = [
40
+ ['To', joinAddresses(envelope.to)],
41
+ ['Cc', joinAddresses(envelope.cc)],
42
+ ['Bcc', joinAddresses(envelope.bcc)],
43
+ ['From', envelope.from],
44
+ ['Reply-To', envelope.replyTo],
45
+ ['Subject', encodeHeaderValue(envelope.subject)],
46
+ ['In-Reply-To', envelope.inReplyTo],
47
+ ['References', envelope.references]
48
+ ];
49
+ return headers
50
+ .filter((entry) => entry[1] !== undefined)
51
+ .map(([name, value]) => `${name}: ${stripNewlines(value)}`);
52
+ }
53
+ function bodyLines(envelope) {
54
+ const useHtml = !envelope.text && Boolean(envelope.html);
55
+ const content = (useHtml ? envelope.html : envelope.text) ?? '';
56
+ return [
57
+ `Content-Type: ${useHtml ? 'text/html' : 'text/plain'}; charset="UTF-8"`,
58
+ 'MIME-Version: 1.0',
59
+ '',
60
+ content
61
+ ];
62
+ }
@@ -0,0 +1,60 @@
1
+ import { z } from 'zod';
2
+ import type { ToolParameters } from '../../capabilities/completion.ts';
3
+ declare const OperationSchema: z.ZodObject<{
4
+ tool: z.ZodString;
5
+ description: z.ZodString;
6
+ parameters: z.ZodType<ToolParameters, unknown, z.core.$ZodTypeInternals<ToolParameters, unknown>>;
7
+ request: z.ZodUnion<readonly [z.ZodObject<{
8
+ transport: z.ZodLiteral<"mcp">;
9
+ method: z.ZodString;
10
+ url: z.ZodString;
11
+ builder: z.ZodEnum<{
12
+ "gmail-send": "gmail-send";
13
+ "gmail-draft": "gmail-draft";
14
+ "calendar-meet-event": "calendar-meet-event";
15
+ "calendar-add-meet": "calendar-add-meet";
16
+ "docs-create": "docs-create";
17
+ "docs-append-text": "docs-append-text";
18
+ "sheets-create": "sheets-create";
19
+ "sheets-write-values": "sheets-write-values";
20
+ "sheets-append-values": "sheets-append-values";
21
+ "drive-create-folder": "drive-create-folder";
22
+ "drive-trash": "drive-trash";
23
+ "notion-create-page": "notion-create-page";
24
+ "notion-insert-content": "notion-insert-content";
25
+ }>;
26
+ }, z.core.$strip>, z.ZodObject<{
27
+ transport: z.ZodOptional<z.ZodLiteral<"http">>;
28
+ method: z.ZodEnum<{
29
+ GET: "GET";
30
+ POST: "POST";
31
+ PUT: "PUT";
32
+ PATCH: "PATCH";
33
+ DELETE: "DELETE";
34
+ }>;
35
+ url: z.ZodString;
36
+ query: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>>;
37
+ urlDefaults: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodString>>;
38
+ builder: z.ZodEnum<{
39
+ "gmail-send": "gmail-send";
40
+ "gmail-draft": "gmail-draft";
41
+ "calendar-meet-event": "calendar-meet-event";
42
+ "calendar-add-meet": "calendar-add-meet";
43
+ "docs-create": "docs-create";
44
+ "docs-append-text": "docs-append-text";
45
+ "sheets-create": "sheets-create";
46
+ "sheets-write-values": "sheets-write-values";
47
+ "sheets-append-values": "sheets-append-values";
48
+ "drive-create-folder": "drive-create-folder";
49
+ "drive-trash": "drive-trash";
50
+ "notion-create-page": "notion-create-page";
51
+ "notion-insert-content": "notion-insert-content";
52
+ }>;
53
+ }, z.core.$strip>]>;
54
+ response: z.ZodOptional<z.ZodObject<{
55
+ pick: z.ZodArray<z.ZodString>;
56
+ }, z.core.$strip>>;
57
+ }, z.core.$strip>;
58
+ export type OperationSpec = z.infer<typeof OperationSchema>;
59
+ export declare function parseOperationsManifest(json: string): OperationSpec[] | null;
60
+ export {};
@@ -0,0 +1,50 @@
1
+ import { z } from 'zod';
2
+ import { BUILDER_NAMES } from "./builders.js";
3
+ const ParameterType = z.enum(['string', 'number', 'boolean', 'object', 'integer', 'array', 'null']);
4
+ const ParameterSchema = z.lazy(() => z.object({
5
+ type: z.union([ParameterType, z.array(ParameterType).min(1)]),
6
+ description: z.string().optional(),
7
+ enum: z.array(z.string()).optional(),
8
+ items: ParameterSchema.optional(),
9
+ properties: z.record(z.string(), ParameterSchema).optional(),
10
+ required: z.array(z.string()).optional()
11
+ }));
12
+ const ParametersSchema = z.object({
13
+ type: z.literal('object'),
14
+ properties: z.record(z.string(), ParameterSchema),
15
+ required: z.array(z.string()).optional()
16
+ });
17
+ const HttpRequestSchema = z.object({
18
+ transport: z.literal('http').optional(),
19
+ method: z.enum(['GET', 'POST', 'PUT', 'PATCH', 'DELETE']),
20
+ url: z.string().min(1),
21
+ query: z.record(z.string(), z.union([z.string(), z.number(), z.boolean()])).optional(),
22
+ urlDefaults: z.record(z.string(), z.string()).optional(),
23
+ builder: z.enum(BUILDER_NAMES)
24
+ });
25
+ const McpRequestSchema = z.object({
26
+ transport: z.literal('mcp'),
27
+ method: z.string().min(1),
28
+ url: z.string().min(1),
29
+ builder: z.enum(BUILDER_NAMES)
30
+ });
31
+ const RequestSchema = z.union([McpRequestSchema, HttpRequestSchema]);
32
+ const OperationSchema = z.object({
33
+ tool: z.string().min(1),
34
+ description: z.string().min(1),
35
+ parameters: ParametersSchema,
36
+ request: RequestSchema,
37
+ response: z.object({ pick: z.array(z.string().min(1)).min(1) }).optional()
38
+ });
39
+ const ManifestSchema = z.object({ operations: z.array(OperationSchema) });
40
+ export function parseOperationsManifest(json) {
41
+ let value;
42
+ try {
43
+ value = JSON.parse(json);
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ const parsed = ManifestSchema.safeParse(value);
49
+ return parsed.success ? parsed.data.operations : null;
50
+ }
@@ -0,0 +1,10 @@
1
+ export declare const REFUSAL = "Refusing to send:";
2
+ export type TrustedOrigin = 'user' | 'tool-result' | 'skill';
3
+ export type TrustedSource = {
4
+ origin: TrustedOrigin;
5
+ text: string;
6
+ };
7
+ export interface GuardOptions {
8
+ externalWrite?: boolean;
9
+ }
10
+ export declare function guardToolCall(toolName: string, args: Record<string, unknown>, sources: readonly TrustedSource[], { externalWrite }?: GuardOptions): string | null;
@@ -0,0 +1,127 @@
1
+ import { grounded } from 'asenion';
2
+ import { decodeBase64, printableRatio, strings } from 'asenion/guards';
3
+ import { READ_METHODS } from "./http-methods.js";
4
+ const ADDRESS = /[^\s<>,;:"'\\]{1,64}@[^\s<>,;:"'\\]{1,255}\.[A-Za-z]{2,24}/g;
5
+ const PRINTABLE_RATIO = 0.9;
6
+ const RESERVED_DOMAINS = new Set(['example.com', 'example.net', 'example.org']);
7
+ const RESERVED_TLDS = ['example', 'invalid', 'test', 'localhost'];
8
+ const OUTBOUND_TOOLS = new Set(['http_request', 'mcp_call']);
9
+ const MCP_READ_METHOD = /^(tools\/list|resources\/\w+|(get|list|search|read|find|fetch)[_.-])/i;
10
+ const HINT_LIMIT = 5;
11
+ export const REFUSAL = 'Refusing to send:';
12
+ export function guardToolCall(toolName, args, sources, { externalWrite = false } = {}) {
13
+ if (!externalWrite && !isOutbound(toolName, args))
14
+ return null;
15
+ const addresses = unique(scanPayload(args));
16
+ if (!addresses.length)
17
+ return null;
18
+ const reserved = addresses.find((value) => isReserved(key(value)));
19
+ if (reserved) {
20
+ return `${REFUSAL} ${mask(reserved)} is a reserved documentation domain (RFC 2606) that cannot receive mail — a placeholder copied from an example, not a real address. Ask the user for the actual address.`;
21
+ }
22
+ const trusted = addressesIn(sources, (origin) => origin !== 'skill');
23
+ const unverified = addresses.filter((value) => !grounded(value, trusted).ok);
24
+ if (!unverified.length)
25
+ return null;
26
+ if (alreadyRefusedThisTurn(sources)) {
27
+ return `${REFUSAL} ${masked(unverified)} still cannot be verified, and an earlier call in this turn was already refused for the same reason. Stop calling this tool. Reply to the user in plain text and ask them for the address.`;
28
+ }
29
+ const fromSkill = addressesIn(sources, (origin) => origin === 'skill');
30
+ const placeholders = unverified.filter((value) => grounded(value, fromSkill).ok);
31
+ if (placeholders.length) {
32
+ return `${REFUSAL} ${masked(placeholders)} appears only in the skill's own documentation — an example placeholder, not a real address. Ask the user for the actual address.`;
33
+ }
34
+ const spoofed = unverified.filter((value) => lookalikeOf(value, trusted) !== undefined);
35
+ if (spoofed.length)
36
+ return drawnLike(spoofed, trusted);
37
+ return invented(unverified, trusted);
38
+ }
39
+ function lookalikeOf(value, trusted) {
40
+ return grounded(value, trusted).failures[0]?.looksLike;
41
+ }
42
+ function drawnLike(spoofed, trusted) {
43
+ const drawn = spoofed.map((value) => `${mask(value)} is drawn like ${lookalikeOf(value, trusted)}`);
44
+ return `${REFUSAL} ${drawn.join('; ')}. A character that only looks like another makes a different address, so this is not the one it resembles — ask the user which they meant instead of retrying.`;
45
+ }
46
+ function invented(unverified, trusted) {
47
+ const base = `${REFUSAL} ${masked(unverified)} does not appear anywhere in this conversation or in any tool result, so it cannot be verified. Do not guess an address.`;
48
+ if (!trusted.length) {
49
+ return `${base} Look it up first with this skill's search endpoint, or ask the user for it instead of retrying.`;
50
+ }
51
+ return `${base} Addresses that do appear: ${trusted.slice(0, HINT_LIMIT).join(', ')}. Use one of those if it is the intended target; otherwise ask the user instead of retrying.`;
52
+ }
53
+ function alreadyRefusedThisTurn(sources) {
54
+ let turnStart = 0;
55
+ for (const [index, source] of sources.entries()) {
56
+ if (source.origin === 'user')
57
+ turnStart = index + 1;
58
+ }
59
+ return sources
60
+ .slice(turnStart)
61
+ .some((source) => source.origin === 'tool-result' && source.text.includes(REFUSAL));
62
+ }
63
+ function isOutbound(toolName, args) {
64
+ if (!OUTBOUND_TOOLS.has(toolName))
65
+ return false;
66
+ const method = typeof args['method'] === 'string' ? args['method'] : undefined;
67
+ if (toolName !== 'http_request')
68
+ return !MCP_READ_METHOD.test(method ?? '');
69
+ return !READ_METHODS.has((method ?? 'GET').toUpperCase());
70
+ }
71
+ const IDENTIFIER_HEADER = /^\s*(message-id|in-reply-to|references)\s*:/i;
72
+ const IDENTIFIER_FIELD = /^(message[-_]?id|in[-_]?reply[-_]?to|references)$/i;
73
+ function addressesOutsideIdentifierHeaders(text) {
74
+ return text
75
+ .split(/\r?\n/)
76
+ .filter((line) => !IDENTIFIER_HEADER.test(line))
77
+ .flatMap((line) => line.match(ADDRESS) ?? []);
78
+ }
79
+ function scanPayload(payload) {
80
+ const found = [];
81
+ for (const value of strings(payload, { skip: (name) => IDENTIFIER_FIELD.test(name) })) {
82
+ found.push(...addressesOutsideIdentifierHeaders(value));
83
+ const hidden = decodeEncoded(value);
84
+ if (hidden !== null && printableRatio(hidden) >= PRINTABLE_RATIO) {
85
+ found.push(...addressesOutsideIdentifierHeaders(hidden));
86
+ }
87
+ }
88
+ return found;
89
+ }
90
+ function decodeEncoded(value) {
91
+ try {
92
+ return decodeBase64(value);
93
+ }
94
+ catch {
95
+ return null;
96
+ }
97
+ }
98
+ function addressesIn(sources, accept) {
99
+ const found = [];
100
+ for (const source of sources) {
101
+ if (!accept(source.origin))
102
+ continue;
103
+ found.push(...(source.text.match(ADDRESS) ?? []));
104
+ }
105
+ return unique(found);
106
+ }
107
+ function unique(values) {
108
+ const seen = new Map();
109
+ for (const value of values) {
110
+ if (!seen.has(key(value)))
111
+ seen.set(key(value), value.trim());
112
+ }
113
+ return [...seen.values()];
114
+ }
115
+ function key(value) {
116
+ return value.trim().replace(/[A-Z]/g, (upper) => upper.toLowerCase());
117
+ }
118
+ function isReserved(address) {
119
+ const domain = address.slice(address.lastIndexOf('@') + 1);
120
+ return RESERVED_DOMAINS.has(domain) || RESERVED_TLDS.some((tld) => domain.endsWith(`.${tld}`));
121
+ }
122
+ function mask(value) {
123
+ return value.replaceAll('@', ' [at] ');
124
+ }
125
+ function masked(values) {
126
+ return values.map(mask).join(', ');
127
+ }
@@ -0,0 +1,4 @@
1
+ export declare function stripIPv6Brackets(hostname: string): string;
2
+ export declare function isPrivateIPv4(hostname: string): boolean;
3
+ export declare function isPrivateOrBlockedIPv6(address: string): boolean;
4
+ export declare function isPrivateOrBlocked(hostname: string): boolean;
@@ -0,0 +1,126 @@
1
+ export function stripIPv6Brackets(hostname) {
2
+ if (hostname.startsWith('[') && hostname.endsWith(']')) {
3
+ return hostname.slice(1, -1);
4
+ }
5
+ return hostname;
6
+ }
7
+ export function isPrivateIPv4(hostname) {
8
+ const parts = hostname.split('.').map(Number);
9
+ if (parts.length !== 4 || parts.some((n) => Number.isNaN(n))) {
10
+ return false;
11
+ }
12
+ const a = parts[0];
13
+ const b = parts[1];
14
+ if (a === undefined || b === undefined) {
15
+ return false;
16
+ }
17
+ return (a === 10 ||
18
+ a === 127 ||
19
+ (a === 172 && b >= 16 && b <= 31) ||
20
+ (a === 192 && b === 168) ||
21
+ (a === 169 && b === 254) ||
22
+ (a === 100 && b >= 64 && b <= 127) ||
23
+ a === 0 ||
24
+ a >= 224);
25
+ }
26
+ export function isPrivateOrBlockedIPv6(address) {
27
+ const bytes = parseIPv6ToBytes(address.toLowerCase());
28
+ if (bytes === null) {
29
+ return true;
30
+ }
31
+ if (isAllZeroBytes(bytes, 0, 16)) {
32
+ return true;
33
+ }
34
+ if (isAllZeroBytes(bytes, 0, 15) && bytes[15] === 1) {
35
+ return true;
36
+ }
37
+ const embeddedIPv4 = `${bytes[12]}.${bytes[13]}.${bytes[14]}.${bytes[15]}`;
38
+ if (isAllZeroBytes(bytes, 0, 10) && bytes[10] === 0xff && bytes[11] === 0xff) {
39
+ return isPrivateIPv4(embeddedIPv4);
40
+ }
41
+ if (isAllZeroBytes(bytes, 0, 12)) {
42
+ return isPrivateIPv4(embeddedIPv4);
43
+ }
44
+ if ((bytes[0] & 0xfe) === 0xfc) {
45
+ return true;
46
+ }
47
+ if (bytes[0] === 0xfe && ((bytes[1] & 0xc0) === 0x80 || (bytes[1] & 0xc0) === 0xc0)) {
48
+ return true;
49
+ }
50
+ return bytes[0] === 0xff;
51
+ }
52
+ function parseIPv6ToBytes(lower) {
53
+ const zoneless = lower.split('%')[0] ?? '';
54
+ const compressed = zoneless.split('::');
55
+ if (compressed.length > 2) {
56
+ return null;
57
+ }
58
+ const hasCompression = compressed.length === 2;
59
+ const headGroups = expandEmbeddedIPv4(splitGroups(compressed[0] ?? ''));
60
+ const tailGroups = hasCompression ? expandEmbeddedIPv4(splitGroups(compressed[1] ?? '')) : [];
61
+ if (headGroups === null || tailGroups === null) {
62
+ return null;
63
+ }
64
+ const zeroFill = 8 - headGroups.length - tailGroups.length;
65
+ if (hasCompression ? zeroFill < 1 : zeroFill !== 0) {
66
+ return null;
67
+ }
68
+ const groups = [...headGroups, ...Array(zeroFill).fill('0'), ...tailGroups];
69
+ const bytes = new Uint8Array(16);
70
+ for (let i = 0; i < 8; i++) {
71
+ const group = groups[i];
72
+ if (!/^[0-9a-f]{1,4}$/.test(group)) {
73
+ return null;
74
+ }
75
+ const value = Number.parseInt(group, 16);
76
+ bytes[i * 2] = (value >> 8) & 0xff;
77
+ bytes[i * 2 + 1] = value & 0xff;
78
+ }
79
+ return bytes;
80
+ }
81
+ function splitGroups(segment) {
82
+ return segment === '' ? [] : segment.split(':');
83
+ }
84
+ function expandEmbeddedIPv4(groups) {
85
+ const last = groups[groups.length - 1];
86
+ if (last === undefined || !last.includes('.')) {
87
+ return [...groups];
88
+ }
89
+ const quad = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/.exec(last);
90
+ if (!quad) {
91
+ return null;
92
+ }
93
+ const octets = quad.slice(1, 5).map(Number);
94
+ if (octets.some((n) => n > 255)) {
95
+ return null;
96
+ }
97
+ const hi = ((octets[0] << 8) | octets[1]).toString(16);
98
+ const lo = ((octets[2] << 8) | octets[3]).toString(16);
99
+ return [...groups.slice(0, -1), hi, lo];
100
+ }
101
+ function isAllZeroBytes(bytes, start, end) {
102
+ for (let i = start; i < end; i++) {
103
+ if (bytes[i] !== 0) {
104
+ return false;
105
+ }
106
+ }
107
+ return true;
108
+ }
109
+ const BLOCKED_HOSTNAMES = new Set([
110
+ 'metadata.google.internal',
111
+ '169.254.169.254',
112
+ 'metadata.azure.com'
113
+ ]);
114
+ export function isPrivateOrBlocked(hostname) {
115
+ const normalized = stripIPv6Brackets(hostname).toLowerCase().replace(/\.$/, '');
116
+ if (BLOCKED_HOSTNAMES.has(normalized)) {
117
+ return true;
118
+ }
119
+ if (normalized === 'localhost' || normalized.endsWith('.localhost')) {
120
+ return true;
121
+ }
122
+ if (normalized.includes(':')) {
123
+ return isPrivateOrBlockedIPv6(normalized);
124
+ }
125
+ return isPrivateIPv4(normalized);
126
+ }
@@ -0,0 +1,2 @@
1
+ import type { ToolDefinition } from '../capabilities/completion.ts';
2
+ export declare function createRagSearchTool(): ToolDefinition;
@@ -0,0 +1,98 @@
1
+ import { RAG_CITATION_LINE } from "../prompt.js";
2
+ const DEFAULT_LIMIT = 5;
3
+ const MAX_LIMIT = 20;
4
+ const EXCERPT_CHARS = 1200;
5
+ const NOT_AVAILABLE = 'rag_search is not available in this run. The current chat has no indexed knowledge base. Attach documents to the chat and try again.';
6
+ const NO_DOCUMENTS = 'The current chat has no uploaded documents. Attach documents to the chat and try again.';
7
+ const STILL_SYNCING = 'Attachments are still syncing and cannot be searched yet. Try again shortly.';
8
+ const NO_RELEVANT = 'No relevant excerpts were found in the knowledge base. Answer plainly without fabricating sources.';
9
+ export function createRagSearchTool() {
10
+ return {
11
+ name: 'rag_search',
12
+ toolset: 'knowledge',
13
+ autoApprove: true,
14
+ description: "Semantic search over the current chat's indexed knowledge base (uploaded documents, PDFs, notes). " +
15
+ 'Returns ranked excerpts with source labels you can cite. Use this when the answer is fuzzy or ' +
16
+ 'conceptual ("summarise the Q3 board notes", "what does the spec say about retries").',
17
+ parameters: {
18
+ type: 'object',
19
+ properties: {
20
+ query: {
21
+ type: 'string',
22
+ description: 'Natural-language query to retrieve relevant chunks for.'
23
+ },
24
+ limit: { type: 'number', description: 'Maximum excerpts to return (1-20). Defaults to 5.' }
25
+ },
26
+ required: ['query']
27
+ },
28
+ effect: () => 'read',
29
+ async execute(args, ctx) {
30
+ const query = args.query;
31
+ if (typeof query !== 'string' || query.trim().length === 0) {
32
+ return { error: 'query must be a non-empty string' };
33
+ }
34
+ if (!ctx?.ragSearch)
35
+ return { content: NOT_AVAILABLE };
36
+ let result;
37
+ try {
38
+ result = await ctx.ragSearch({ query, limit: limitFrom(args.limit) });
39
+ }
40
+ catch (err) {
41
+ return { error: `rag_search failed: ${err instanceof Error ? err.message : String(err)}` };
42
+ }
43
+ if (!result.enabled)
44
+ return { content: NOT_AVAILABLE };
45
+ if (result.errorMessage)
46
+ return { error: `rag_search failed: ${result.errorMessage}` };
47
+ if (result.hits.length === 0) {
48
+ if (!result.hasKnowledge)
49
+ return { content: NO_DOCUMENTS };
50
+ if (result.indexEmpty || result.pendingReferenced)
51
+ return { content: STILL_SYNCING };
52
+ return { content: NO_RELEVANT };
53
+ }
54
+ return { content: formatHits(result.hits) };
55
+ }
56
+ };
57
+ }
58
+ function limitFrom(raw) {
59
+ if (typeof raw !== 'number' || !Number.isFinite(raw))
60
+ return DEFAULT_LIMIT;
61
+ return Math.min(MAX_LIMIT, Math.max(1, Math.floor(raw)));
62
+ }
63
+ function formatHits(hits) {
64
+ const blocks = hits
65
+ .map((hit, index) => `${labelFor(hit, index)}\n${truncate(hit.content.trim())}`)
66
+ .join('\n\n');
67
+ return `${blocks}\n\n${RAG_CITATION_LINE}`;
68
+ }
69
+ function labelFor(hit, index) {
70
+ const metadata = parseMetadata(hit.metadataJson);
71
+ const title = metadata.title ?? 'document';
72
+ const chunk = metadata.chunkIndex ?? index;
73
+ return `[Source ${index + 1}: ${title}, chunk ${chunk}, score ${hit.score.toFixed(3)}]`;
74
+ }
75
+ function parseMetadata(raw) {
76
+ if (!raw)
77
+ return {};
78
+ try {
79
+ const parsed = JSON.parse(raw);
80
+ if (typeof parsed !== 'object' || parsed === null)
81
+ return {};
82
+ return {
83
+ title: 'title' in parsed && typeof parsed.title === 'string' ? parsed.title : undefined,
84
+ chunkIndex: 'chunkIndex' in parsed &&
85
+ typeof parsed.chunkIndex === 'number' &&
86
+ Number.isSafeInteger(parsed.chunkIndex) &&
87
+ parsed.chunkIndex >= 0
88
+ ? parsed.chunkIndex
89
+ : undefined
90
+ };
91
+ }
92
+ catch {
93
+ return {};
94
+ }
95
+ }
96
+ function truncate(text) {
97
+ return text.length <= EXCERPT_CHARS ? text : `${text.slice(0, EXCERPT_CHARS)}…`;
98
+ }
@@ -0,0 +1,5 @@
1
+ import type { ToolDefinition } from '../capabilities/completion.ts';
2
+ import { type FsToolOptions } from './fs/scope.ts';
3
+ export declare const DEFAULT_READ_CHARS = 8192;
4
+ export declare const MAX_READ_CHARS = 65536;
5
+ export declare function createReadFilesTool({ realpath, deniedRoots }?: FsToolOptions): ToolDefinition;