@qvac/harness 0.1.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 (460) hide show
  1. package/dist/harness.bundle +8 -59
  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.node.d.ts +1 -0
  164. package/dist-lib/lib/sdk-config-loader.node.js +1 -0
  165. package/dist-lib/lib/sdk-loader.d.ts +30 -0
  166. package/dist-lib/lib/sdk-loader.js +53 -0
  167. package/dist-lib/lib/sdk-storage.d.ts +8 -0
  168. package/dist-lib/lib/sdk-storage.js +24 -0
  169. package/dist-lib/lib/serve.d.ts +3 -0
  170. package/dist-lib/lib/serve.js +612 -0
  171. package/dist-lib/lib/spawn.d.ts +62 -0
  172. package/dist-lib/lib/spawn.js +71 -0
  173. package/dist-lib/lib/staging.d.ts +4 -0
  174. package/dist-lib/lib/staging.js +28 -0
  175. package/dist-lib/lib/storage.d.ts +18 -0
  176. package/dist-lib/lib/storage.js +26 -0
  177. package/dist-lib/lib/tmp-path.d.ts +7 -0
  178. package/dist-lib/lib/tmp-path.js +17 -0
  179. package/dist-lib/lib/tool-call-display.d.ts +21 -0
  180. package/dist-lib/lib/tool-call-display.js +1 -0
  181. package/dist-lib/lib/tools/catalog.d.ts +13 -0
  182. package/dist-lib/lib/tools/catalog.js +13 -0
  183. package/dist-lib/lib/tools/create-documents.d.ts +3 -0
  184. package/dist-lib/lib/tools/create-documents.js +87 -0
  185. package/dist-lib/lib/tools/edit-documents.d.ts +3 -0
  186. package/dist-lib/lib/tools/edit-documents.js +122 -0
  187. package/dist-lib/lib/tools/edit-image.d.ts +25 -0
  188. package/dist-lib/lib/tools/edit-image.js +271 -0
  189. package/dist-lib/lib/tools/exec/adapters/adapter.d.ts +27 -0
  190. package/dist-lib/lib/tools/exec/adapters/adapter.js +1 -0
  191. package/dist-lib/lib/tools/exec/adapters/python/attachments.d.ts +26 -0
  192. package/dist-lib/lib/tools/exec/adapters/python/attachments.js +160 -0
  193. package/dist-lib/lib/tools/exec/adapters/python/create-effect.d.ts +7 -0
  194. package/dist-lib/lib/tools/exec/adapters/python/create-effect.js +290 -0
  195. package/dist-lib/lib/tools/exec/adapters/python/loader.d.ts +11 -0
  196. package/dist-lib/lib/tools/exec/adapters/python/loader.js +94 -0
  197. package/dist-lib/lib/tools/exec/adapters/python/memfs.d.ts +47 -0
  198. package/dist-lib/lib/tools/exec/adapters/python/memfs.js +85 -0
  199. package/dist-lib/lib/tools/exec/adapters/python/output-policy.d.ts +13 -0
  200. package/dist-lib/lib/tools/exec/adapters/python/output-policy.js +129 -0
  201. package/dist-lib/lib/tools/exec/adapters/python/pyodide.d.ts +19 -0
  202. package/dist-lib/lib/tools/exec/adapters/python/pyodide.js +107 -0
  203. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.d.ts +75 -0
  204. package/dist-lib/lib/tools/exec/adapters/python/python-adapter.js +1094 -0
  205. package/dist-lib/lib/tools/exec/adapters/python/run-session.d.ts +75 -0
  206. package/dist-lib/lib/tools/exec/adapters/python/run-session.js +273 -0
  207. package/dist-lib/lib/tools/exec/adapters/python/wheels.d.ts +38 -0
  208. package/dist-lib/lib/tools/exec/adapters/python/wheels.js +102 -0
  209. package/dist-lib/lib/tools/exec/adapters/python/worker/client.d.ts +7 -0
  210. package/dist-lib/lib/tools/exec/adapters/python/worker/client.js +188 -0
  211. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.d.ts +1 -0
  212. package/dist-lib/lib/tools/exec/adapters/python/worker/entry.js +105 -0
  213. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.d.ts +38 -0
  214. package/dist-lib/lib/tools/exec/adapters/python/worker/protocol.js +41 -0
  215. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.d.ts +2 -0
  216. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-bare.js +30 -0
  217. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.d.ts +13 -0
  218. package/dist-lib/lib/tools/exec/adapters/python/worker/spawn-node.js +45 -0
  219. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.d.ts +12 -0
  220. package/dist-lib/lib/tools/exec/adapters/shell/shell-adapter.js +20 -0
  221. package/dist-lib/lib/tools/exec/obsidian/cli-process.d.ts +8 -0
  222. package/dist-lib/lib/tools/exec/obsidian/cli-process.js +74 -0
  223. package/dist-lib/lib/tools/exec/obsidian/cli.d.ts +18 -0
  224. package/dist-lib/lib/tools/exec/obsidian/cli.js +153 -0
  225. package/dist-lib/lib/tools/exec/obsidian/command.d.ts +5 -0
  226. package/dist-lib/lib/tools/exec/obsidian/command.js +18 -0
  227. package/dist-lib/lib/tools/exec/obsidian/guidance.d.ts +5 -0
  228. package/dist-lib/lib/tools/exec/obsidian/guidance.js +18 -0
  229. package/dist-lib/lib/tools/exec/obsidian/note-name.d.ts +1 -0
  230. package/dist-lib/lib/tools/exec/obsidian/note-name.js +6 -0
  231. package/dist-lib/lib/tools/exec/obsidian/output.d.ts +1 -0
  232. package/dist-lib/lib/tools/exec/obsidian/output.js +31 -0
  233. package/dist-lib/lib/tools/exec/obsidian/route.d.ts +19 -0
  234. package/dist-lib/lib/tools/exec/obsidian/route.js +85 -0
  235. package/dist-lib/lib/tools/exec/obsidian/safe-path.d.ts +3 -0
  236. package/dist-lib/lib/tools/exec/obsidian/safe-path.js +56 -0
  237. package/dist-lib/lib/tools/exec/obsidian/vault-create.d.ts +1 -0
  238. package/dist-lib/lib/tools/exec/obsidian/vault-create.js +40 -0
  239. package/dist-lib/lib/tools/exec/obsidian/vault-fs.d.ts +3 -0
  240. package/dist-lib/lib/tools/exec/obsidian/vault-fs.js +57 -0
  241. package/dist-lib/lib/tools/exec/obsidian/vault-paths.d.ts +20 -0
  242. package/dist-lib/lib/tools/exec/obsidian/vault-paths.js +171 -0
  243. package/dist-lib/lib/tools/exec/obsidian/vault-read.d.ts +11 -0
  244. package/dist-lib/lib/tools/exec/obsidian/vault-read.js +119 -0
  245. package/dist-lib/lib/tools/exec/obsidian/vault-write.d.ts +7 -0
  246. package/dist-lib/lib/tools/exec/obsidian/vault-write.js +134 -0
  247. package/dist-lib/lib/tools/exec/runner.d.ts +62 -0
  248. package/dist-lib/lib/tools/exec/runner.js +87 -0
  249. package/dist-lib/lib/tools/exec/scope.d.ts +3 -0
  250. package/dist-lib/lib/tools/exec/scope.js +97 -0
  251. package/dist-lib/lib/tools/exec/shell-argv.d.ts +2 -0
  252. package/dist-lib/lib/tools/exec/shell-argv.js +48 -0
  253. package/dist-lib/lib/tools/exec.d.ts +29 -0
  254. package/dist-lib/lib/tools/exec.js +459 -0
  255. package/dist-lib/lib/tools/file-glob.d.ts +15 -0
  256. package/dist-lib/lib/tools/file-glob.js +112 -0
  257. package/dist-lib/lib/tools/fs/drive.d.ts +26 -0
  258. package/dist-lib/lib/tools/fs/drive.js +1 -0
  259. package/dist-lib/lib/tools/fs/glob.d.ts +1 -0
  260. package/dist-lib/lib/tools/fs/glob.js +34 -0
  261. package/dist-lib/lib/tools/fs/local.d.ts +2 -0
  262. package/dist-lib/lib/tools/fs/local.js +29 -0
  263. package/dist-lib/lib/tools/fs/read.d.ts +2 -0
  264. package/dist-lib/lib/tools/fs/read.js +17 -0
  265. package/dist-lib/lib/tools/fs/remote-protocol.d.ts +40 -0
  266. package/dist-lib/lib/tools/fs/remote-protocol.js +1 -0
  267. package/dist-lib/lib/tools/fs/remote.d.ts +17 -0
  268. package/dist-lib/lib/tools/fs/remote.js +131 -0
  269. package/dist-lib/lib/tools/fs/scope.d.ts +37 -0
  270. package/dist-lib/lib/tools/fs/scope.js +130 -0
  271. package/dist-lib/lib/tools/fs/walk.d.ts +15 -0
  272. package/dist-lib/lib/tools/fs/walk.js +38 -0
  273. package/dist-lib/lib/tools/fs/write.d.ts +4 -0
  274. package/dist-lib/lib/tools/fs/write.js +5 -0
  275. package/dist-lib/lib/tools/generate-image.d.ts +111 -0
  276. package/dist-lib/lib/tools/generate-image.js +369 -0
  277. package/dist-lib/lib/tools/generate-music.d.ts +124 -0
  278. package/dist-lib/lib/tools/generate-music.js +522 -0
  279. package/dist-lib/lib/tools/grep.d.ts +5 -0
  280. package/dist-lib/lib/tools/grep.js +158 -0
  281. package/dist-lib/lib/tools/http-methods.d.ts +1 -0
  282. package/dist-lib/lib/tools/http-methods.js +1 -0
  283. package/dist-lib/lib/tools/http-request/encode-fields.d.ts +2 -0
  284. package/dist-lib/lib/tools/http-request/encode-fields.js +69 -0
  285. package/dist-lib/lib/tools/http-request/truncate-response.d.ts +1 -0
  286. package/dist-lib/lib/tools/http-request/truncate-response.js +83 -0
  287. package/dist-lib/lib/tools/http-request/utils.d.ts +27 -0
  288. package/dist-lib/lib/tools/http-request/utils.js +84 -0
  289. package/dist-lib/lib/tools/http-request.d.ts +20 -0
  290. package/dist-lib/lib/tools/http-request.js +177 -0
  291. package/dist-lib/lib/tools/mcp/utils.d.ts +47 -0
  292. package/dist-lib/lib/tools/mcp/utils.js +172 -0
  293. package/dist-lib/lib/tools/mcp-call.d.ts +14 -0
  294. package/dist-lib/lib/tools/mcp-call.js +155 -0
  295. package/dist-lib/lib/tools/model-args.d.ts +1 -0
  296. package/dist-lib/lib/tools/model-args.js +4 -0
  297. package/dist-lib/lib/tools/operations/builders.d.ts +17 -0
  298. package/dist-lib/lib/tools/operations/builders.js +179 -0
  299. package/dist-lib/lib/tools/operations/compile.d.ts +7 -0
  300. package/dist-lib/lib/tools/operations/compile.js +92 -0
  301. package/dist-lib/lib/tools/operations/gmail-message.d.ts +15 -0
  302. package/dist-lib/lib/tools/operations/gmail-message.js +62 -0
  303. package/dist-lib/lib/tools/operations/manifest.d.ts +60 -0
  304. package/dist-lib/lib/tools/operations/manifest.js +50 -0
  305. package/dist-lib/lib/tools/outbound-guard.d.ts +10 -0
  306. package/dist-lib/lib/tools/outbound-guard.js +127 -0
  307. package/dist-lib/lib/tools/private-ip.d.ts +4 -0
  308. package/dist-lib/lib/tools/private-ip.js +126 -0
  309. package/dist-lib/lib/tools/rag-search.d.ts +2 -0
  310. package/dist-lib/lib/tools/rag-search.js +98 -0
  311. package/dist-lib/lib/tools/read-files.d.ts +5 -0
  312. package/dist-lib/lib/tools/read-files.js +153 -0
  313. package/dist-lib/lib/tools/skill.d.ts +10 -0
  314. package/dist-lib/lib/tools/skill.js +123 -0
  315. package/dist-lib/lib/tools/skills/auth-resolver.d.ts +43 -0
  316. package/dist-lib/lib/tools/skills/auth-resolver.js +121 -0
  317. package/dist-lib/lib/tools/skills/bin-check.d.ts +9 -0
  318. package/dist-lib/lib/tools/skills/bin-check.js +56 -0
  319. package/dist-lib/lib/tools/skills/bundled-dir.d.ts +2 -0
  320. package/dist-lib/lib/tools/skills/bundled-dir.js +117 -0
  321. package/dist-lib/lib/tools/skills/bundled-hash.d.ts +4 -0
  322. package/dist-lib/lib/tools/skills/bundled-hash.js +12 -0
  323. package/dist-lib/lib/tools/skills/catalog.d.ts +60 -0
  324. package/dist-lib/lib/tools/skills/catalog.js +203 -0
  325. package/dist-lib/lib/tools/skills/cli-argv.d.ts +9 -0
  326. package/dist-lib/lib/tools/skills/cli-argv.js +147 -0
  327. package/dist-lib/lib/tools/skills/cli-schema-check.d.ts +3 -0
  328. package/dist-lib/lib/tools/skills/cli-schema-check.js +62 -0
  329. package/dist-lib/lib/tools/skills/cli-schema-load.d.ts +4 -0
  330. package/dist-lib/lib/tools/skills/cli-schema-load.js +90 -0
  331. package/dist-lib/lib/tools/skills/cli-schema-types.d.ts +30 -0
  332. package/dist-lib/lib/tools/skills/cli-schema-types.js +1 -0
  333. package/dist-lib/lib/tools/skills/cli-schema.d.ts +7 -0
  334. package/dist-lib/lib/tools/skills/cli-schema.js +35 -0
  335. package/dist-lib/lib/tools/skills/credential-check.d.ts +20 -0
  336. package/dist-lib/lib/tools/skills/credential-check.js +94 -0
  337. package/dist-lib/lib/tools/skills/credential-grants.d.ts +9 -0
  338. package/dist-lib/lib/tools/skills/credential-grants.js +25 -0
  339. package/dist-lib/lib/tools/skills/credential-health.d.ts +8 -0
  340. package/dist-lib/lib/tools/skills/credential-health.js +51 -0
  341. package/dist-lib/lib/tools/skills/credential-slots.d.ts +7 -0
  342. package/dist-lib/lib/tools/skills/credential-slots.js +8 -0
  343. package/dist-lib/lib/tools/skills/frontmatter-parser.d.ts +23 -0
  344. package/dist-lib/lib/tools/skills/frontmatter-parser.js +68 -0
  345. package/dist-lib/lib/tools/skills/index.d.ts +5 -0
  346. package/dist-lib/lib/tools/skills/index.js +5 -0
  347. package/dist-lib/lib/tools/skills/manifest-parse.d.ts +12 -0
  348. package/dist-lib/lib/tools/skills/manifest-parse.js +199 -0
  349. package/dist-lib/lib/tools/skills/manifest.d.ts +47 -0
  350. package/dist-lib/lib/tools/skills/manifest.js +1 -0
  351. package/dist-lib/lib/tools/skills/mention-name.d.ts +1 -0
  352. package/dist-lib/lib/tools/skills/mention-name.js +4 -0
  353. package/dist-lib/lib/tools/skills/mention.d.ts +6 -0
  354. package/dist-lib/lib/tools/skills/mention.js +42 -0
  355. package/dist-lib/lib/tools/skills/obsidian-readiness.d.ts +16 -0
  356. package/dist-lib/lib/tools/skills/obsidian-readiness.js +95 -0
  357. package/dist-lib/lib/tools/skills/overlay-crud.d.ts +18 -0
  358. package/dist-lib/lib/tools/skills/overlay-crud.js +98 -0
  359. package/dist-lib/lib/tools/skills/overlay-dir.d.ts +2 -0
  360. package/dist-lib/lib/tools/skills/overlay-dir.js +22 -0
  361. package/dist-lib/lib/tools/skills/overlay-watch.d.ts +13 -0
  362. package/dist-lib/lib/tools/skills/overlay-watch.js +44 -0
  363. package/dist-lib/lib/tools/skills/scope-key.d.ts +7 -0
  364. package/dist-lib/lib/tools/skills/scope-key.js +7 -0
  365. package/dist-lib/lib/tools/skills/setup-routes.d.ts +4 -0
  366. package/dist-lib/lib/tools/skills/setup-routes.js +14 -0
  367. package/dist-lib/lib/tools/skills/skill-settings.d.ts +16 -0
  368. package/dist-lib/lib/tools/skills/skill-settings.js +33 -0
  369. package/dist-lib/lib/tools/skills/skill-state-constants.d.ts +12 -0
  370. package/dist-lib/lib/tools/skills/skill-state-constants.js +14 -0
  371. package/dist-lib/lib/tools/skills/skill-state.d.ts +40 -0
  372. package/dist-lib/lib/tools/skills/skill-state.js +117 -0
  373. package/dist-lib/lib/tools/skills/tool-grants.d.ts +5 -0
  374. package/dist-lib/lib/tools/skills/tool-grants.js +14 -0
  375. package/dist-lib/lib/tools/toolsets.d.ts +8 -0
  376. package/dist-lib/lib/tools/toolsets.js +20 -0
  377. package/dist-lib/lib/tools/url-guard.d.ts +8 -0
  378. package/dist-lib/lib/tools/url-guard.js +40 -0
  379. package/dist-lib/lib/tools/web-fetch.d.ts +8 -0
  380. package/dist-lib/lib/tools/web-fetch.js +302 -0
  381. package/dist-lib/lib/tools/web-search.d.ts +6 -0
  382. package/dist-lib/lib/tools/web-search.js +55 -0
  383. package/dist-lib/lib/transport.d.ts +12 -0
  384. package/dist-lib/lib/transport.js +59 -0
  385. package/dist-lib/lib/user-agent.d.ts +1 -0
  386. package/dist-lib/lib/user-agent.js +1 -0
  387. package/dist-lib/lib/validating-lookup.d.ts +17 -0
  388. package/dist-lib/lib/validating-lookup.js +25 -0
  389. package/dist-lib/lib/wav-encode.d.ts +5 -0
  390. package/dist-lib/lib/wav-encode.js +24 -0
  391. package/dist-lib/lib/web-fetch/embedded-state.d.ts +1 -0
  392. package/dist-lib/lib/web-fetch/embedded-state.js +131 -0
  393. package/dist-lib/lib/web-fetch/extract.d.ts +6 -0
  394. package/dist-lib/lib/web-fetch/extract.js +65 -0
  395. package/dist-lib/lib/web-fetch/images.d.ts +3 -0
  396. package/dist-lib/lib/web-fetch/images.js +43 -0
  397. package/dist-lib/lib/web-fetch/video.d.ts +5 -0
  398. package/dist-lib/lib/web-fetch/video.js +42 -0
  399. package/dist-lib/lib/web-search/engine-registry.d.ts +7 -0
  400. package/dist-lib/lib/web-search/engine-registry.js +17 -0
  401. package/dist-lib/lib/web-search/engines/aol.d.ts +3 -0
  402. package/dist-lib/lib/web-search/engines/aol.js +81 -0
  403. package/dist-lib/lib/web-search/engines/bing.d.ts +3 -0
  404. package/dist-lib/lib/web-search/engines/bing.js +111 -0
  405. package/dist-lib/lib/web-search/engines/brave.d.ts +3 -0
  406. package/dist-lib/lib/web-search/engines/brave.js +59 -0
  407. package/dist-lib/lib/web-search/engines/duckduckgo.d.ts +3 -0
  408. package/dist-lib/lib/web-search/engines/duckduckgo.js +112 -0
  409. package/dist-lib/lib/web-search/engines/google.d.ts +3 -0
  410. package/dist-lib/lib/web-search/engines/google.js +92 -0
  411. package/dist-lib/lib/web-search/engines/wikipedia.d.ts +3 -0
  412. package/dist-lib/lib/web-search/engines/wikipedia.js +37 -0
  413. package/dist-lib/lib/web-search/engines/yahoo.d.ts +3 -0
  414. package/dist-lib/lib/web-search/engines/yahoo.js +81 -0
  415. package/dist-lib/lib/web-search/fetch-html.d.ts +25 -0
  416. package/dist-lib/lib/web-search/fetch-html.js +97 -0
  417. package/dist-lib/lib/web-search/format-results.d.ts +3 -0
  418. package/dist-lib/lib/web-search/format-results.js +14 -0
  419. package/dist-lib/lib/web-search/html-helpers.d.ts +3 -0
  420. package/dist-lib/lib/web-search/html-helpers.js +24 -0
  421. package/dist-lib/lib/web-search/merge-results.d.ts +2 -0
  422. package/dist-lib/lib/web-search/merge-results.js +53 -0
  423. package/dist-lib/lib/web-search/orchestrator.d.ts +14 -0
  424. package/dist-lib/lib/web-search/orchestrator.js +50 -0
  425. package/dist-lib/lib/web-search/types.d.ts +34 -0
  426. package/dist-lib/lib/web-search/types.js +1 -0
  427. package/dist-lib/lib/web-search/url-helpers.d.ts +1 -0
  428. package/dist-lib/lib/web-search/url-helpers.js +11 -0
  429. package/dist-lib/lib/web-search/url-normalize.d.ts +1 -0
  430. package/dist-lib/lib/web-search/url-normalize.js +25 -0
  431. package/dist-lib/lib/web-search/user-agents.d.ts +3 -0
  432. package/dist-lib/lib/web-search/user-agents.js +3 -0
  433. package/dist-lib/lib/wire.d.ts +50 -0
  434. package/dist-lib/lib/wire.js +145 -0
  435. package/dist-lib/schema/baseline.d.ts +8 -0
  436. package/dist-lib/schema/baseline.js +35 -0
  437. package/dist-lib/schema/build.d.ts +1 -0
  438. package/dist-lib/schema/build.js +39 -0
  439. package/dist-lib/schema/generate.d.ts +20 -0
  440. package/dist-lib/schema/generate.js +149 -0
  441. package/dist-lib/schema/harness.d.ts +2 -0
  442. package/dist-lib/schema/harness.js +745 -0
  443. package/dist-lib/schema/release-tags.d.ts +5 -0
  444. package/dist-lib/schema/release-tags.js +58 -0
  445. package/dist-lib/spec/bind.d.ts +2 -0
  446. package/dist-lib/spec/bind.js +124 -0
  447. package/dist-lib/spec/calls.d.ts +3 -0
  448. package/dist-lib/spec/calls.js +41 -0
  449. package/dist-lib/spec/hrpc/hrpc.json +356 -0
  450. package/dist-lib/spec/hrpc/index.d.ts +3 -0
  451. package/dist-lib/spec/hrpc/index.js +463 -0
  452. package/dist-lib/spec/hrpc/messages.d.ts +4 -0
  453. package/dist-lib/spec/hrpc/messages.js +3102 -0
  454. package/dist-lib/spec/hyperschema/index.js +3102 -0
  455. package/dist-lib/spec/hyperschema/schema.json +2290 -0
  456. package/dist-lib/spec/hyperschema/types.d.ts +554 -0
  457. package/dist-lib/spec/index.d.ts +8 -0
  458. package/dist-lib/spec/index.js +1 -0
  459. package/package.json +239 -64
  460. package/.gitattributes +0 -1
@@ -0,0 +1,131 @@
1
+ import { decodeHtmlEntities } from "../web-search/html-helpers.js";
2
+ const LDJSON_SCRIPT = /<script[^>]*type=["']application\/ld\+json["'][^>]*>([\s\S]*?)<\/script>/gi;
3
+ const JSON_SCRIPT = /<script[^>]*type=["']application\/json["'][^>]*>([\s\S]*?)<\/script>/gi;
4
+ const INLINE_SCRIPT = /<script\b(?![^>]*\bsrc=)(?![^>]*type=["']application\/(?:ld\+)?json["'])[^>]*>([\s\S]*?)<\/script>/gi;
5
+ const STRING_LITERAL = /"(?:\\.|[^"\\])*"/g;
6
+ const META_TAG = /<meta\s[^>]*>/gi;
7
+ const META_ATTR = /(?:property|name)=["'](og:title|og:description|og:site_name|description)["']/i;
8
+ const META_CONTENT = /content=["']([^"']+)["']/i;
9
+ const MAX_HARVESTED_STRINGS = 200;
10
+ const MIN_PROSE_CHARS = 40;
11
+ const STRUCTURED_PROSE_KEYS = new Set(['headline', 'articleBody', 'description', 'text', 'name']);
12
+ export function extractEmbeddedState(html) {
13
+ const parts = [
14
+ ...structuredData(html),
15
+ ...hydrationProse(html),
16
+ ...scriptLiteralProse(html),
17
+ ...metaTags(html)
18
+ ];
19
+ return dedupe(parts).join('\n');
20
+ }
21
+ function structuredData(html) {
22
+ const out = [];
23
+ for (const match of html.matchAll(LDJSON_SCRIPT)) {
24
+ const value = parseJson(match[1] ?? '');
25
+ if (value === null)
26
+ continue;
27
+ walk(value, (key, text) => {
28
+ if (STRUCTURED_PROSE_KEYS.has(key))
29
+ out.push(text);
30
+ });
31
+ }
32
+ return out;
33
+ }
34
+ function hydrationProse(html) {
35
+ const out = [];
36
+ for (const match of html.matchAll(JSON_SCRIPT)) {
37
+ const value = parseJson(match[1] ?? '');
38
+ if (value === null)
39
+ continue;
40
+ walk(value, (_key, text) => {
41
+ if (looksLikeProse(text))
42
+ out.push(text);
43
+ });
44
+ }
45
+ return out;
46
+ }
47
+ function scriptLiteralProse(html) {
48
+ const out = [];
49
+ for (const match of html.matchAll(INLINE_SCRIPT)) {
50
+ for (const literal of (match[1] ?? '').match(STRING_LITERAL) ?? []) {
51
+ if (literal.length < MIN_PROSE_CHARS)
52
+ continue;
53
+ const decoded = parseJson(literal);
54
+ if (typeof decoded !== 'string')
55
+ continue;
56
+ const inner = decoded.trimStart().startsWith('{') ? parseJson(decoded) : null;
57
+ if (inner !== null) {
58
+ walk(inner, (_key, text) => {
59
+ if (looksLikeProse(text))
60
+ out.push(text);
61
+ });
62
+ }
63
+ else if (looksLikeProse(decoded.trim())) {
64
+ out.push(decoded.trim());
65
+ }
66
+ }
67
+ }
68
+ return out;
69
+ }
70
+ function metaTags(html) {
71
+ const out = [];
72
+ for (const match of html.matchAll(META_TAG)) {
73
+ const tag = match[0];
74
+ if (!META_ATTR.test(tag))
75
+ continue;
76
+ const content = META_CONTENT.exec(tag)?.[1];
77
+ if (content)
78
+ out.push(decodeHtmlEntities(content).trim());
79
+ }
80
+ return out;
81
+ }
82
+ function parseJson(raw) {
83
+ if (!raw.trim())
84
+ return null;
85
+ try {
86
+ return JSON.parse(raw);
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ }
92
+ function walk(value, visit, key = '') {
93
+ if (typeof value === 'string') {
94
+ const text = value.trim();
95
+ if (text)
96
+ visit(key, text);
97
+ return;
98
+ }
99
+ if (Array.isArray(value)) {
100
+ for (const entry of value)
101
+ walk(entry, visit, key);
102
+ return;
103
+ }
104
+ if (value && typeof value === 'object') {
105
+ for (const [k, v] of Object.entries(value))
106
+ walk(v, visit, k);
107
+ }
108
+ }
109
+ function looksLikeProse(text) {
110
+ if (text.length < MIN_PROSE_CHARS)
111
+ return false;
112
+ if (/^(?:https?:|data:|\/|#|\.)/.test(text))
113
+ return false;
114
+ const letters = text.match(/\p{L}/gu)?.length ?? 0;
115
+ if (letters / text.length <= 0.6)
116
+ return false;
117
+ return text.includes(' ') || /[\u3000-\u9fff\u3040-\u30ff\uac00-\ud7af]/.test(text);
118
+ }
119
+ function dedupe(parts) {
120
+ const seen = new Set();
121
+ const out = [];
122
+ for (const part of parts) {
123
+ if (out.length >= MAX_HARVESTED_STRINGS)
124
+ break;
125
+ if (seen.has(part))
126
+ continue;
127
+ seen.add(part);
128
+ out.push(part);
129
+ }
130
+ return out;
131
+ }
@@ -0,0 +1,6 @@
1
+ export interface ExtractedPage {
2
+ readonly title: string | null;
3
+ readonly text: string;
4
+ }
5
+ export declare function looksLikeHtml(body: string): boolean;
6
+ export declare function extractPageText(html: string): ExtractedPage;
@@ -0,0 +1,65 @@
1
+ import { decodeHtmlEntities, stripHtmlTags } from "../web-search/html-helpers.js";
2
+ const NOISE_BLOCKS = [
3
+ 'script',
4
+ 'style',
5
+ 'noscript',
6
+ 'template',
7
+ 'svg',
8
+ 'iframe',
9
+ 'head',
10
+ 'header',
11
+ 'nav',
12
+ 'footer',
13
+ 'aside'
14
+ ];
15
+ const NOISE_ROLES = /<(\w+)[^>]*\brole=["'](?:navigation|banner|contentinfo|complementary|search)["'][^>]*>[\s\S]*?<\/\1>/gi;
16
+ const BLOCK_END_TAGS = /<\/(?:p|div|li|section|article|main|tr|h[1-6]|blockquote|pre|ul|ol|table|figcaption|dd|dt)>/gi;
17
+ export function looksLikeHtml(body) {
18
+ return (/^\s*(?:<!doctype\s|<html[\s>]|<head[\s>]|<body[\s>])/i.test(body) ||
19
+ /<\w+[^>]*>[\s\S]*<\/\w+>/.test(body.slice(0, 2000)));
20
+ }
21
+ export function extractPageText(html) {
22
+ const title = extractTitle(html);
23
+ const text = collapseLines(stripHtmlTags(toLineBreaks(stripNoise(pickMainRegion(html)))));
24
+ return { title, text: decodeHtmlEntities(text) };
25
+ }
26
+ function extractTitle(html) {
27
+ const match = /<title[^>]*>([\s\S]*?)<\/title>/i.exec(html);
28
+ if (!match?.[1])
29
+ return null;
30
+ const title = decodeHtmlEntities(stripHtmlTags(match[1])).replace(/\s+/g, ' ').trim();
31
+ return title.length > 0 ? title : null;
32
+ }
33
+ function pickMainRegion(html) {
34
+ for (const tag of ['main', 'article']) {
35
+ const match = new RegExp(`<${tag}[\\s>][\\s\\S]*?</${tag}>`, 'i').exec(html);
36
+ if (match)
37
+ return match[0];
38
+ }
39
+ return html;
40
+ }
41
+ function stripNoise(html) {
42
+ let out = html;
43
+ let prev = '';
44
+ while (out !== prev) {
45
+ prev = out;
46
+ out = out.replace(/<!--[\s\S]*?-->/g, '');
47
+ }
48
+ for (const tag of NOISE_BLOCKS) {
49
+ out = out.replace(new RegExp(`<${tag}[\\s>][\\s\\S]*?</${tag}>`, 'gi'), ' ');
50
+ }
51
+ return out.replace(NOISE_ROLES, ' ');
52
+ }
53
+ function toLineBreaks(html) {
54
+ return html
55
+ .replace(/<br\s*\/?>/gi, '\n')
56
+ .replace(/<li\b[^>]*>/gi, '\n- ')
57
+ .replace(BLOCK_END_TAGS, '\n');
58
+ }
59
+ function collapseLines(text) {
60
+ return text
61
+ .split('\n')
62
+ .map((line) => line.replace(/\s+/g, ' ').trim())
63
+ .filter((line) => line.length > 0)
64
+ .join('\n');
65
+ }
@@ -0,0 +1,3 @@
1
+ export declare const MAX_PAGE_IMAGES = 2;
2
+ export declare function pageImageUrls(html: string, pageUrl: URL): string[];
3
+ export declare function imageFileName(url: URL, mimeType: string): string;
@@ -0,0 +1,43 @@
1
+ import { decodeHtmlEntities } from "../web-search/html-helpers.js";
2
+ const META_TAG = /<meta\s[^>]*>/gi;
3
+ const IMAGE_ATTR = /(?:property|name)=["'](?:og:image(?::secure_url|:url)?|twitter:image)["']/i;
4
+ const META_CONTENT = /content=["']([^"']+)["']/i;
5
+ export const MAX_PAGE_IMAGES = 2;
6
+ export function pageImageUrls(html, pageUrl) {
7
+ const out = [];
8
+ for (const match of html.matchAll(META_TAG)) {
9
+ if (out.length >= MAX_PAGE_IMAGES)
10
+ break;
11
+ const tag = match[0];
12
+ if (!IMAGE_ATTR.test(tag))
13
+ continue;
14
+ const content = META_CONTENT.exec(tag)?.[1];
15
+ if (!content)
16
+ continue;
17
+ let resolved;
18
+ try {
19
+ resolved = new URL(decodeHtmlEntities(content).trim(), pageUrl);
20
+ }
21
+ catch {
22
+ continue;
23
+ }
24
+ if (resolved.protocol !== 'http:' && resolved.protocol !== 'https:')
25
+ continue;
26
+ const href = resolved.toString();
27
+ if (!out.some((seen) => seen.replace(/^https?:/, '') === href.replace(/^https?:/, ''))) {
28
+ out.push(href);
29
+ }
30
+ }
31
+ return out;
32
+ }
33
+ export function imageFileName(url, mimeType) {
34
+ let last = url.pathname.split('/').filter(Boolean).pop() ?? '';
35
+ try {
36
+ last = decodeURIComponent(last);
37
+ }
38
+ catch { }
39
+ if (/\.(png|jpe?g|gif|webp|avif)$/i.test(last))
40
+ return last;
41
+ const ext = mimeType.split('/')[1]?.split('+')[0] ?? 'img';
42
+ return `${url.hostname}.${ext}`;
43
+ }
@@ -0,0 +1,5 @@
1
+ export type PageVideoRef = {
2
+ readonly provider: string;
3
+ readonly url: string;
4
+ };
5
+ export declare function pageVideoRef(html: string, pageUrl: URL): PageVideoRef | null;
@@ -0,0 +1,42 @@
1
+ import { decodeHtmlEntities } from "../web-search/html-helpers.js";
2
+ const META_TAG = /<meta\s[^>]*>/gi;
3
+ const VIDEO_ATTR = /(?:property|name)=["']og:video(?::secure_url|:url)?["']/i;
4
+ const META_CONTENT = /content=["']([^"']+)["']/i;
5
+ const YOUTUBE_HOSTS = new Set(['youtube.com', 'youtube-nocookie.com', 'youtu.be']);
6
+ export function pageVideoRef(html, pageUrl) {
7
+ for (const match of html.matchAll(META_TAG)) {
8
+ const tag = match[0];
9
+ if (!VIDEO_ATTR.test(tag))
10
+ continue;
11
+ const content = META_CONTENT.exec(tag)?.[1];
12
+ if (!content)
13
+ continue;
14
+ let resolved;
15
+ try {
16
+ resolved = new URL(decodeHtmlEntities(content).trim(), pageUrl);
17
+ }
18
+ catch {
19
+ continue;
20
+ }
21
+ if (resolved.protocol !== 'http:' && resolved.protocol !== 'https:')
22
+ continue;
23
+ return classify(resolved);
24
+ }
25
+ return null;
26
+ }
27
+ function classify(url) {
28
+ const host = url.hostname.replace(/^www\./, '');
29
+ if (YOUTUBE_HOSTS.has(host)) {
30
+ return { provider: 'youtube', url: watchUrl(url) };
31
+ }
32
+ if (host === 'vimeo.com' || host === 'player.vimeo.com') {
33
+ return { provider: 'vimeo', url: url.toString() };
34
+ }
35
+ return { provider: host, url: url.toString() };
36
+ }
37
+ function watchUrl(url) {
38
+ const embed = /^\/embed\/([\w-]+)/.exec(url.pathname);
39
+ if (!embed)
40
+ return url.toString();
41
+ return `https://www.youtube.com/watch?v=${embed[1]}`;
42
+ }
@@ -0,0 +1,7 @@
1
+ import type { SearchEngine } from './types.ts';
2
+ export type EngineEntry = {
3
+ readonly name: string;
4
+ readonly fn: SearchEngine;
5
+ };
6
+ export declare const DEFAULT_MAX_RESULTS = 8;
7
+ export declare const ENGINES: ReadonlyArray<EngineEntry>;
@@ -0,0 +1,17 @@
1
+ import { searchAol } from "./engines/aol.js";
2
+ import { searchBing } from "./engines/bing.js";
3
+ import { searchBrave } from "./engines/brave.js";
4
+ import { searchDuckDuckGo } from "./engines/duckduckgo.js";
5
+ import { searchGoogle } from "./engines/google.js";
6
+ import { searchWikipedia } from "./engines/wikipedia.js";
7
+ import { searchYahoo } from "./engines/yahoo.js";
8
+ export const DEFAULT_MAX_RESULTS = 8;
9
+ export const ENGINES = [
10
+ { name: 'duckduckgo', fn: searchDuckDuckGo },
11
+ { name: 'brave', fn: searchBrave },
12
+ { name: 'google', fn: searchGoogle },
13
+ { name: 'yahoo', fn: searchYahoo },
14
+ { name: 'aol', fn: searchAol },
15
+ { name: 'bing', fn: searchBing },
16
+ { name: 'wikipedia', fn: searchWikipedia }
17
+ ];
@@ -0,0 +1,3 @@
1
+ import type { AbortSignal as BareAbortSignal } from 'bare-abort-controller';
2
+ import type { Fetcher, RankedResult } from '../types.ts';
3
+ export declare function searchAol(query: string, fetcher: Fetcher, signal?: BareAbortSignal): Promise<ReadonlyArray<RankedResult>>;
@@ -0,0 +1,81 @@
1
+ import { fetchHtml } from "../fetch-html.js";
2
+ import { clean } from "../html-helpers.js";
3
+ import { urlMatchesHost } from "../url-helpers.js";
4
+ function decodeRuUrl(encoded) {
5
+ try {
6
+ const href = decodeURIComponent(encoded);
7
+ if (!href.startsWith('http')) {
8
+ return null;
9
+ }
10
+ if (urlMatchesHost(href, 'search.aol.com') || urlMatchesHost(href, 'shopping.yahoo.com')) {
11
+ return null;
12
+ }
13
+ return href;
14
+ }
15
+ catch {
16
+ return null;
17
+ }
18
+ }
19
+ function parseAlgoBlock(inner) {
20
+ const ruMatch = inner.match(/\/RU=(https?%3a%2f%2f[^/]*?)\/RK/i);
21
+ if (!ruMatch) {
22
+ return null;
23
+ }
24
+ const href = decodeRuUrl(ruMatch[1] || '');
25
+ if (!href) {
26
+ return null;
27
+ }
28
+ const titleMatch = inner.match(/<a[^>]*class="[^"]*fz-[^"]*"[^>]*>([\s\S]*?)<\/a>/i);
29
+ const title = titleMatch ? clean(titleMatch[1] || '') : '';
30
+ if (!title) {
31
+ return null;
32
+ }
33
+ const snippetMatch = inner.match(/class="compText[^"]*"[^>]*>[\s\S]*?<p[^>]*>([\s\S]*?)<\/p>/i);
34
+ const content = snippetMatch ? clean(snippetMatch[1] || '') : title;
35
+ return { title, url: href, content, position: 0 };
36
+ }
37
+ function parseAlgoBlocks(html) {
38
+ const results = [];
39
+ const blocks = html.split(/algo algo-sr/i);
40
+ for (let i = 1; i < blocks.length; i++) {
41
+ const inner = blocks[i]?.slice(0, 5000) || '';
42
+ const parsed = parseAlgoBlock(inner);
43
+ if (parsed) {
44
+ results.push({ ...parsed, position: results.length + 1 });
45
+ }
46
+ }
47
+ return results;
48
+ }
49
+ function parseRuFallback(html) {
50
+ const results = [];
51
+ const seen = new Set();
52
+ const ruGlobal = /\/RU=(https?%3a%2f%2f[^/]*?)\/RK/gi;
53
+ for (const rm of html.matchAll(ruGlobal)) {
54
+ const href = decodeRuUrl(rm[1] || '');
55
+ if (!href || seen.has(href)) {
56
+ continue;
57
+ }
58
+ seen.add(href);
59
+ const host = new URL(href).hostname;
60
+ results.push({
61
+ title: host,
62
+ url: href,
63
+ content: `Result from ${host}`,
64
+ position: results.length + 1,
65
+ weak: true
66
+ });
67
+ if (results.length >= 15) {
68
+ break;
69
+ }
70
+ }
71
+ return results;
72
+ }
73
+ export async function searchAol(query, fetcher, signal) {
74
+ const url = `https://search.aol.com/aol/search?q=${encodeURIComponent(query)}`;
75
+ const html = await fetchHtml(fetcher, url, undefined, signal);
76
+ const primary = parseAlgoBlocks(html);
77
+ if (primary.length > 0) {
78
+ return primary;
79
+ }
80
+ return parseRuFallback(html);
81
+ }
@@ -0,0 +1,3 @@
1
+ import type { AbortSignal as BareAbortSignal } from 'bare-abort-controller';
2
+ import type { Fetcher, RankedResult } from '../types.ts';
3
+ export declare function searchBing(query: string, fetcher: Fetcher, signal?: BareAbortSignal): Promise<ReadonlyArray<RankedResult>>;
@@ -0,0 +1,111 @@
1
+ import { fetchHtml } from "../fetch-html.js";
2
+ import { clean } from "../html-helpers.js";
3
+ import { urlMatchesHost } from "../url-helpers.js";
4
+ import { SAFARI_UA } from "../user-agents.js";
5
+ function isOrganicBingUrl(url) {
6
+ return url.startsWith('http') && !urlMatchesHost(url, 'bing.com') && !url.includes('msockid=');
7
+ }
8
+ function tryBase64Decode(encoded) {
9
+ try {
10
+ const padded = encoded + '='.repeat((4 - (encoded.length % 4)) % 4);
11
+ const decoded = atob(padded.replace(/-/g, '+').replace(/_/g, '/'));
12
+ return decoded.startsWith('http') ? decoded : null;
13
+ }
14
+ catch {
15
+ return null;
16
+ }
17
+ }
18
+ function extractCiteUrl(blockHtml) {
19
+ const citeMatch = blockHtml.match(/<cite[^>]*>([\s\S]*?)<\/cite>/i);
20
+ if (!citeMatch) {
21
+ return null;
22
+ }
23
+ const citeText = clean(citeMatch[1] || '')
24
+ .replace(/\s*›\s*/g, '/')
25
+ .replace(/\s+/g, '');
26
+ return citeText.startsWith('http') ? citeText : `https://${citeText}`;
27
+ }
28
+ function decodeBingRedirect(rawUrl, blockHtml) {
29
+ const uMatch = rawUrl.replace(/&amp;/g, '&').match(/[&?]u=a1([^&]+)/);
30
+ if (uMatch?.[1]) {
31
+ const decoded = tryBase64Decode(uMatch[1]);
32
+ if (decoded) {
33
+ return decoded;
34
+ }
35
+ }
36
+ if (!rawUrl.startsWith('http') && blockHtml) {
37
+ return extractCiteUrl(blockHtml) ?? rawUrl;
38
+ }
39
+ return rawUrl;
40
+ }
41
+ function parseBAlgoBlock(inner) {
42
+ const linkMatch = inner.match(/<h2[^>]*>[\s\S]*?<a[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<\/h2>/i);
43
+ if (!linkMatch) {
44
+ return null;
45
+ }
46
+ let rawUrl = linkMatch[1] || '';
47
+ const title = clean(linkMatch[2] || '');
48
+ if (!title || title.length < 3) {
49
+ return null;
50
+ }
51
+ rawUrl = decodeBingRedirect(rawUrl, inner);
52
+ if (!isOrganicBingUrl(rawUrl)) {
53
+ return null;
54
+ }
55
+ const snippetMatch = inner.match(/<p[^>]*>([\s\S]*?)<\/p>/i);
56
+ const content = snippetMatch ? clean(snippetMatch[1] || '') : title;
57
+ return { title, url: rawUrl, content, position: 0 };
58
+ }
59
+ function parseBAlgoBlocks(html) {
60
+ const results = [];
61
+ const blocks = html.split(/class="b_algo"/i);
62
+ for (let i = 1; i < blocks.length; i++) {
63
+ const inner = blocks[i]?.slice(0, 5000) || '';
64
+ const parsed = parseBAlgoBlock(inner);
65
+ if (parsed) {
66
+ results.push({ ...parsed, position: results.length + 1 });
67
+ }
68
+ }
69
+ return results;
70
+ }
71
+ function parseH2Match(hm) {
72
+ let rawUrl = hm[1] || '';
73
+ const title = clean(hm[2] || '');
74
+ if (!title || title.length < 3) {
75
+ return null;
76
+ }
77
+ rawUrl = decodeBingRedirect(rawUrl, '');
78
+ if (!isOrganicBingUrl(rawUrl)) {
79
+ return null;
80
+ }
81
+ return { title, url: rawUrl, content: title, position: 0 };
82
+ }
83
+ function parseH2Fallback(html) {
84
+ const results = [];
85
+ const h2Pat = /<h2[^>]*>[\s\S]*?<a[^>]*href="([^"]*)"[^>]*>([\s\S]*?)<\/a>[\s\S]*?<\/h2>/gi;
86
+ const seen = new Set();
87
+ for (const hm of html.matchAll(h2Pat)) {
88
+ const parsed = parseH2Match(hm);
89
+ if (!parsed || seen.has(parsed.url)) {
90
+ continue;
91
+ }
92
+ seen.add(parsed.url);
93
+ results.push({ ...parsed, position: results.length + 1 });
94
+ if (results.length >= 15) {
95
+ break;
96
+ }
97
+ }
98
+ return results;
99
+ }
100
+ export async function searchBing(query, fetcher, signal) {
101
+ const url = `https://www.bing.com/search?q=${encodeURIComponent(query)}`;
102
+ const html = await fetchHtml(fetcher, url, { headers: { 'User-Agent': SAFARI_UA } }, signal);
103
+ if (html.includes('captcha') || html.includes('challenge/verify') || html.includes('Turnstile')) {
104
+ throw new Error('Bing CAPTCHA detected');
105
+ }
106
+ const primary = parseBAlgoBlocks(html);
107
+ if (primary.length > 0) {
108
+ return primary;
109
+ }
110
+ return parseH2Fallback(html);
111
+ }
@@ -0,0 +1,3 @@
1
+ import type { AbortSignal as BareAbortSignal } from 'bare-abort-controller';
2
+ import type { Fetcher, RankedResult } from '../types.ts';
3
+ export declare function searchBrave(query: string, fetcher: Fetcher, signal?: BareAbortSignal): Promise<ReadonlyArray<RankedResult>>;
@@ -0,0 +1,59 @@
1
+ import { fetchHtml } from "../fetch-html.js";
2
+ import { clean } from "../html-helpers.js";
3
+ function parseSnippetBlock(inner) {
4
+ const urlMatch = inner.match(/<a[^>]*href="(https?:\/\/(?!imgs\.search\.brave)[^"]*)"[^>]*>/i);
5
+ if (!urlMatch) {
6
+ return null;
7
+ }
8
+ const href = urlMatch[1] || '';
9
+ if (!href) {
10
+ return null;
11
+ }
12
+ const titleMatch = inner.match(/<div[^>]*class="[^"]*title[^"]*search-snippet-title[^"]*"[^>]*(?:title="([^"]*)"[^>]*)?>([^<]*)<\/div>/i);
13
+ const title = titleMatch ? clean(titleMatch[1] || titleMatch[2] || '') : '';
14
+ if (!title) {
15
+ return null;
16
+ }
17
+ const contentMatch = inner.match(/<div[^>]*class="[^"]*generic-snippet[^"]*"[^>]*>[\s\S]*?<div[^>]*class="[^"]*content[^"]*"[^>]*>([\s\S]*?)<\/div>/i);
18
+ const content = contentMatch ? clean(contentMatch[1] || '') : title;
19
+ return { title, url: href, content, position: 0 };
20
+ }
21
+ function parseSnippetBlocks(html) {
22
+ const results = [];
23
+ const blocks = html.split(/<div[^>]*class="snippet\s[^"]*"[^>]*data-type="web"[^>]*>/i);
24
+ for (let i = 1; i < blocks.length; i++) {
25
+ const inner = blocks[i] || '';
26
+ const parsed = parseSnippetBlock(inner);
27
+ if (parsed) {
28
+ results.push({ ...parsed, position: results.length + 1 });
29
+ }
30
+ }
31
+ return results;
32
+ }
33
+ function parseLinkFallback(html) {
34
+ const results = [];
35
+ const seen = new Set();
36
+ const linkPat = /<a[^>]*href="(https?:\/\/(?!search\.brave\.com|imgs\.search\.brave|brave\.com)[^"]*)"[^>]*>([\s\S]*?)<\/a>/gi;
37
+ for (const lm of html.matchAll(linkPat)) {
38
+ const href = lm[1] || '';
39
+ const text = clean(lm[2] || '');
40
+ if (!href.startsWith('http') || text.length < 5 || seen.has(href)) {
41
+ continue;
42
+ }
43
+ seen.add(href);
44
+ results.push({ title: text, url: href, content: text, position: results.length + 1 });
45
+ if (results.length >= 15) {
46
+ break;
47
+ }
48
+ }
49
+ return results;
50
+ }
51
+ export async function searchBrave(query, fetcher, signal) {
52
+ const url = `https://search.brave.com/search?q=${encodeURIComponent(query)}&source=web`;
53
+ const html = await fetchHtml(fetcher, url, { cookies: { safesearch: 'off', useLocation: '0', summarizer: '0', country: 'us' } }, signal);
54
+ const primary = parseSnippetBlocks(html);
55
+ if (primary.length > 0) {
56
+ return primary;
57
+ }
58
+ return parseLinkFallback(html);
59
+ }
@@ -0,0 +1,3 @@
1
+ import type { AbortSignal as BareAbortSignal } from 'bare-abort-controller';
2
+ import type { Fetcher, RankedResult } from '../types.ts';
3
+ export declare function searchDuckDuckGo(query: string, fetcher: Fetcher, signal?: BareAbortSignal): Promise<ReadonlyArray<RankedResult>>;