recker 1.0.20 → 1.0.21-next.ab2d00f

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 (449) hide show
  1. package/README.md +55 -0
  2. package/dist/ai/adaptive-timeout.d.ts +0 -1
  3. package/dist/ai/client.d.ts +0 -1
  4. package/dist/ai/client.js +6 -0
  5. package/dist/ai/index.d.ts +3 -1
  6. package/dist/ai/index.js +3 -0
  7. package/dist/ai/providers/anthropic.d.ts +0 -1
  8. package/dist/ai/providers/base.d.ts +0 -1
  9. package/dist/ai/providers/google.d.ts +59 -0
  10. package/dist/ai/providers/google.js +305 -0
  11. package/dist/ai/providers/index.d.ts +4 -1
  12. package/dist/ai/providers/index.js +2 -0
  13. package/dist/ai/providers/ollama.d.ts +44 -0
  14. package/dist/ai/providers/ollama.js +240 -0
  15. package/dist/ai/providers/openai.d.ts +0 -1
  16. package/dist/ai/rate-limiter.d.ts +0 -1
  17. package/dist/ai/vector/index.d.ts +2 -0
  18. package/dist/ai/vector/index.js +2 -0
  19. package/dist/ai/vector/similarity.d.ts +2 -0
  20. package/dist/ai/vector/similarity.js +27 -0
  21. package/dist/ai/vector/store.d.ts +27 -0
  22. package/dist/ai/vector/store.js +82 -0
  23. package/dist/bench/generator.d.ts +0 -1
  24. package/dist/bench/stats.d.ts +0 -1
  25. package/dist/cache/basic-file-storage.d.ts +12 -0
  26. package/dist/cache/basic-file-storage.js +50 -0
  27. package/dist/cache/file-storage.d.ts +25 -11
  28. package/dist/cache/file-storage.js +175 -30
  29. package/dist/cache/memory-limits.d.ts +0 -1
  30. package/dist/cache/memory-storage.d.ts +0 -1
  31. package/dist/cache/redis-storage.d.ts +0 -1
  32. package/dist/cli/handler.d.ts +2 -1
  33. package/dist/cli/handler.js +36 -5
  34. package/dist/cli/index.d.ts +0 -2
  35. package/dist/cli/index.js +559 -6
  36. package/dist/cli/presets.d.ts +0 -1
  37. package/dist/cli/tui/ai-chat.d.ts +0 -1
  38. package/dist/cli/tui/load-dashboard.d.ts +0 -1
  39. package/dist/cli/tui/scroll-buffer.d.ts +0 -1
  40. package/dist/cli/tui/search-panel.d.ts +0 -1
  41. package/dist/cli/tui/shell-search.d.ts +0 -1
  42. package/dist/cli/tui/shell.d.ts +0 -1
  43. package/dist/cli/tui/shell.js +1 -1
  44. package/dist/cli/tui/websocket.d.ts +0 -1
  45. package/dist/constants/http-status.d.ts +0 -1
  46. package/dist/constants.d.ts +0 -1
  47. package/dist/contract/index.d.ts +0 -1
  48. package/dist/cookies/memory-cookie-jar.d.ts +0 -1
  49. package/dist/core/client.d.ts +2 -1
  50. package/dist/core/client.js +11 -7
  51. package/dist/core/errors.d.ts +0 -1
  52. package/dist/core/index.d.ts +0 -1
  53. package/dist/core/request-promise.d.ts +0 -1
  54. package/dist/core/request.d.ts +0 -1
  55. package/dist/core/response.d.ts +0 -1
  56. package/dist/dns/index.d.ts +0 -1
  57. package/dist/dns/propagation.d.ts +0 -1
  58. package/dist/events/request-events.d.ts +0 -1
  59. package/dist/index.d.ts +2 -1
  60. package/dist/index.js +2 -0
  61. package/dist/mcp/cli.d.ts +2 -0
  62. package/dist/mcp/cli.js +136 -0
  63. package/dist/mcp/client.d.ts +0 -1
  64. package/dist/mcp/contract.d.ts +0 -1
  65. package/dist/mcp/embeddings-loader.d.ts +0 -1
  66. package/dist/mcp/geoip-loader.d.ts +0 -1
  67. package/dist/mcp/index.d.ts +0 -1
  68. package/dist/mcp/ip-intel.d.ts +0 -1
  69. package/dist/mcp/search/hybrid-search.d.ts +0 -1
  70. package/dist/mcp/search/index.d.ts +0 -1
  71. package/dist/mcp/search/math.d.ts +0 -1
  72. package/dist/mcp/search/types.d.ts +0 -1
  73. package/dist/mcp/server.d.ts +6 -2
  74. package/dist/mcp/server.js +193 -151
  75. package/dist/mcp/tools/loader.d.ts +2 -0
  76. package/dist/mcp/tools/loader.js +41 -0
  77. package/dist/mcp/tools/network.d.ts +3 -0
  78. package/dist/mcp/tools/network.js +267 -0
  79. package/dist/mcp/tools/registry.d.ts +17 -0
  80. package/dist/mcp/tools/registry.js +37 -0
  81. package/dist/mcp/types.d.ts +0 -1
  82. package/dist/mini.d.ts +28 -0
  83. package/dist/mini.js +94 -0
  84. package/dist/plugins/auth/api-key.d.ts +8 -0
  85. package/dist/plugins/auth/api-key.js +27 -0
  86. package/dist/plugins/auth/auth0.d.ts +33 -0
  87. package/dist/plugins/auth/auth0.js +94 -0
  88. package/dist/plugins/auth/aws-sigv4.d.ts +10 -0
  89. package/dist/plugins/auth/aws-sigv4.js +88 -0
  90. package/dist/plugins/auth/azure-ad.d.ts +48 -0
  91. package/dist/plugins/auth/azure-ad.js +152 -0
  92. package/dist/plugins/auth/basic.d.ts +7 -0
  93. package/dist/plugins/auth/basic.js +13 -0
  94. package/dist/plugins/auth/bearer.d.ts +8 -0
  95. package/dist/plugins/auth/bearer.js +17 -0
  96. package/dist/plugins/auth/cognito.d.ts +45 -0
  97. package/dist/plugins/auth/cognito.js +208 -0
  98. package/dist/plugins/auth/digest.d.ts +8 -0
  99. package/dist/plugins/auth/digest.js +100 -0
  100. package/dist/plugins/auth/firebase.d.ts +32 -0
  101. package/dist/plugins/auth/firebase.js +195 -0
  102. package/dist/plugins/auth/github-app.d.ts +36 -0
  103. package/dist/plugins/auth/github-app.js +170 -0
  104. package/dist/plugins/auth/google-service-account.d.ts +49 -0
  105. package/dist/plugins/auth/google-service-account.js +172 -0
  106. package/dist/plugins/auth/index.d.ts +15 -0
  107. package/dist/plugins/auth/index.js +15 -0
  108. package/dist/plugins/auth/mtls.d.ts +37 -0
  109. package/dist/plugins/auth/mtls.js +140 -0
  110. package/dist/plugins/auth/oauth2.d.ts +8 -0
  111. package/dist/plugins/auth/oauth2.js +26 -0
  112. package/dist/plugins/auth/oidc.d.ts +55 -0
  113. package/dist/plugins/auth/oidc.js +222 -0
  114. package/dist/plugins/auth/okta.d.ts +47 -0
  115. package/dist/plugins/auth/okta.js +157 -0
  116. package/dist/plugins/auth.d.ts +1 -45
  117. package/dist/plugins/auth.js +1 -268
  118. package/dist/plugins/cache.d.ts +1 -2
  119. package/dist/plugins/cache.js +2 -2
  120. package/dist/plugins/certificate-pinning.d.ts +59 -0
  121. package/dist/plugins/certificate-pinning.js +236 -0
  122. package/dist/plugins/circuit-breaker.d.ts +1 -2
  123. package/dist/plugins/circuit-breaker.js +1 -1
  124. package/dist/plugins/compression.d.ts +0 -1
  125. package/dist/plugins/cookie-jar.d.ts +1 -2
  126. package/dist/plugins/cookie-jar.js +1 -1
  127. package/dist/plugins/dedup.d.ts +1 -2
  128. package/dist/plugins/dedup.js +1 -1
  129. package/dist/plugins/graphql.d.ts +0 -1
  130. package/dist/plugins/grpc-web.d.ts +0 -1
  131. package/dist/plugins/har-player.d.ts +1 -2
  132. package/dist/plugins/har-player.js +1 -1
  133. package/dist/plugins/har-recorder.d.ts +1 -2
  134. package/dist/plugins/har-recorder.js +1 -1
  135. package/dist/plugins/hls.d.ts +90 -18
  136. package/dist/plugins/hls.js +343 -173
  137. package/dist/plugins/http2-push.d.ts +0 -1
  138. package/dist/plugins/http3.d.ts +0 -1
  139. package/dist/plugins/index.d.ts +27 -0
  140. package/dist/plugins/index.js +27 -0
  141. package/dist/plugins/interface-rotator.d.ts +1 -2
  142. package/dist/plugins/interface-rotator.js +1 -1
  143. package/dist/plugins/jsonrpc.d.ts +0 -1
  144. package/dist/plugins/logger.d.ts +1 -2
  145. package/dist/plugins/logger.js +1 -1
  146. package/dist/plugins/odata.d.ts +0 -1
  147. package/dist/plugins/pagination.d.ts +0 -1
  148. package/dist/plugins/proxy-rotator.d.ts +1 -2
  149. package/dist/plugins/proxy-rotator.js +1 -1
  150. package/dist/plugins/rate-limit.d.ts +15 -0
  151. package/dist/plugins/rate-limit.js +162 -0
  152. package/dist/plugins/retry.d.ts +1 -2
  153. package/dist/plugins/retry.js +3 -3
  154. package/dist/plugins/scrape.d.ts +0 -1
  155. package/dist/plugins/server-timing.d.ts +1 -2
  156. package/dist/plugins/server-timing.js +1 -1
  157. package/dist/plugins/soap.d.ts +0 -1
  158. package/dist/plugins/user-agent.d.ts +1 -2
  159. package/dist/plugins/user-agent.js +1 -1
  160. package/dist/plugins/xml.d.ts +0 -1
  161. package/dist/plugins/xsrf.d.ts +1 -2
  162. package/dist/plugins/xsrf.js +3 -3
  163. package/dist/presets/anthropic.d.ts +0 -1
  164. package/dist/presets/aws.d.ts +0 -1
  165. package/dist/presets/azure-openai.d.ts +0 -1
  166. package/dist/presets/azure.d.ts +0 -1
  167. package/dist/presets/cloudflare.d.ts +0 -1
  168. package/dist/presets/cohere.d.ts +0 -1
  169. package/dist/presets/deepseek.d.ts +0 -1
  170. package/dist/presets/digitalocean.d.ts +0 -1
  171. package/dist/presets/discord.d.ts +0 -1
  172. package/dist/presets/fireworks.d.ts +0 -1
  173. package/dist/presets/gcp.d.ts +0 -1
  174. package/dist/presets/gemini.d.ts +0 -1
  175. package/dist/presets/github.d.ts +0 -1
  176. package/dist/presets/gitlab.d.ts +0 -1
  177. package/dist/presets/groq.d.ts +0 -1
  178. package/dist/presets/huggingface.d.ts +0 -1
  179. package/dist/presets/index.d.ts +0 -1
  180. package/dist/presets/linear.d.ts +0 -1
  181. package/dist/presets/mailgun.d.ts +0 -1
  182. package/dist/presets/meta.d.ts +0 -1
  183. package/dist/presets/mistral.d.ts +0 -1
  184. package/dist/presets/notion.d.ts +0 -1
  185. package/dist/presets/openai.d.ts +0 -1
  186. package/dist/presets/oracle.d.ts +0 -1
  187. package/dist/presets/perplexity.d.ts +0 -1
  188. package/dist/presets/registry.d.ts +0 -1
  189. package/dist/presets/replicate.d.ts +0 -1
  190. package/dist/presets/sinch.d.ts +0 -1
  191. package/dist/presets/slack.d.ts +0 -1
  192. package/dist/presets/stripe.d.ts +0 -1
  193. package/dist/presets/supabase.d.ts +0 -1
  194. package/dist/presets/tiktok.d.ts +0 -1
  195. package/dist/presets/together.d.ts +0 -1
  196. package/dist/presets/twilio.d.ts +0 -1
  197. package/dist/presets/vercel.d.ts +0 -1
  198. package/dist/presets/vultr.d.ts +0 -1
  199. package/dist/presets/xai.d.ts +0 -1
  200. package/dist/presets/youtube.d.ts +0 -1
  201. package/dist/protocols/ftp.d.ts +0 -1
  202. package/dist/protocols/index.d.ts +0 -1
  203. package/dist/protocols/sftp.d.ts +0 -1
  204. package/dist/protocols/telnet.d.ts +0 -1
  205. package/dist/recker.d.ts +0 -1
  206. package/dist/runner/request-runner.d.ts +0 -1
  207. package/dist/scrape/document.d.ts +0 -1
  208. package/dist/scrape/element.d.ts +0 -1
  209. package/dist/scrape/extractors.d.ts +0 -1
  210. package/dist/scrape/index.d.ts +0 -1
  211. package/dist/scrape/types.d.ts +0 -1
  212. package/dist/testing/index.d.ts +16 -1
  213. package/dist/testing/index.js +8 -0
  214. package/dist/testing/mock-dns-server.d.ts +69 -0
  215. package/dist/testing/mock-dns-server.js +269 -0
  216. package/dist/testing/mock-ftp-server.d.ts +89 -0
  217. package/dist/testing/mock-ftp-server.js +562 -0
  218. package/dist/testing/mock-hls-server.d.ts +80 -0
  219. package/dist/testing/mock-hls-server.js +381 -0
  220. package/dist/testing/mock-http-server.d.ts +99 -0
  221. package/dist/testing/mock-http-server.js +298 -0
  222. package/dist/testing/mock-sse-server.d.ts +76 -0
  223. package/dist/testing/mock-sse-server.js +291 -0
  224. package/dist/testing/mock-telnet-server.d.ts +59 -0
  225. package/dist/testing/mock-telnet-server.js +273 -0
  226. package/dist/testing/mock-udp-server.d.ts +0 -1
  227. package/dist/testing/mock-websocket-server.d.ts +77 -0
  228. package/dist/testing/mock-websocket-server.js +316 -0
  229. package/dist/testing/mock-whois-server.d.ts +56 -0
  230. package/dist/testing/mock-whois-server.js +234 -0
  231. package/dist/testing/mock.d.ts +0 -1
  232. package/dist/transport/base-udp.d.ts +0 -1
  233. package/dist/transport/fetch.d.ts +0 -1
  234. package/dist/transport/udp-response.d.ts +0 -1
  235. package/dist/transport/udp.d.ts +0 -1
  236. package/dist/transport/undici.d.ts +0 -1
  237. package/dist/transport/undici.js +1 -1
  238. package/dist/types/ai.d.ts +0 -1
  239. package/dist/types/index.d.ts +0 -1
  240. package/dist/types/logger.d.ts +0 -1
  241. package/dist/types/udp.d.ts +0 -1
  242. package/dist/udp/index.d.ts +0 -1
  243. package/dist/utils/agent-manager.d.ts +0 -1
  244. package/dist/utils/body.d.ts +0 -1
  245. package/dist/utils/cert.d.ts +0 -1
  246. package/dist/utils/charset.d.ts +0 -1
  247. package/dist/utils/chart.d.ts +0 -1
  248. package/dist/utils/client-pool.d.ts +0 -1
  249. package/dist/utils/colors.d.ts +0 -1
  250. package/dist/utils/concurrency.d.ts +0 -1
  251. package/dist/utils/dns-toolkit.d.ts +0 -1
  252. package/dist/utils/dns-toolkit.js +1 -1
  253. package/dist/utils/dns.d.ts +0 -1
  254. package/dist/utils/dns.js +2 -2
  255. package/dist/utils/doh.d.ts +0 -1
  256. package/dist/utils/download.d.ts +0 -1
  257. package/dist/utils/env-proxy.d.ts +0 -1
  258. package/dist/utils/header-parser.d.ts +0 -1
  259. package/dist/utils/html-cleaner.d.ts +0 -1
  260. package/dist/utils/link-header.d.ts +0 -1
  261. package/dist/utils/optional-require.d.ts +0 -1
  262. package/dist/utils/optional-require.js +1 -1
  263. package/dist/utils/progress.d.ts +0 -1
  264. package/dist/utils/rdap.d.ts +0 -1
  265. package/dist/utils/request-pool.d.ts +0 -1
  266. package/dist/utils/security-grader.d.ts +0 -1
  267. package/dist/utils/sparkline.d.ts +0 -1
  268. package/dist/utils/sse.d.ts +0 -1
  269. package/dist/utils/streaming.d.ts +0 -1
  270. package/dist/utils/system-metrics.d.ts +0 -1
  271. package/dist/utils/tls-inspector.d.ts +0 -1
  272. package/dist/utils/try-fn.d.ts +0 -1
  273. package/dist/utils/upload.d.ts +0 -1
  274. package/dist/utils/user-agent.d.ts +0 -1
  275. package/dist/utils/whois.d.ts +0 -1
  276. package/dist/webrtc/index.d.ts +0 -1
  277. package/dist/webrtc/index.js +1 -1
  278. package/dist/websocket/client.d.ts +0 -1
  279. package/package.json +39 -3
  280. package/dist/ai/adaptive-timeout.d.ts.map +0 -1
  281. package/dist/ai/client.d.ts.map +0 -1
  282. package/dist/ai/index.d.ts.map +0 -1
  283. package/dist/ai/providers/anthropic.d.ts.map +0 -1
  284. package/dist/ai/providers/base.d.ts.map +0 -1
  285. package/dist/ai/providers/index.d.ts.map +0 -1
  286. package/dist/ai/providers/openai.d.ts.map +0 -1
  287. package/dist/ai/rate-limiter.d.ts.map +0 -1
  288. package/dist/bench/generator.d.ts.map +0 -1
  289. package/dist/bench/stats.d.ts.map +0 -1
  290. package/dist/cache/file-storage.d.ts.map +0 -1
  291. package/dist/cache/memory-limits.d.ts.map +0 -1
  292. package/dist/cache/memory-storage.d.ts.map +0 -1
  293. package/dist/cache/redis-storage.d.ts.map +0 -1
  294. package/dist/cli/handler.d.ts.map +0 -1
  295. package/dist/cli/index.d.ts.map +0 -1
  296. package/dist/cli/presets.d.ts.map +0 -1
  297. package/dist/cli/tui/ai-chat.d.ts.map +0 -1
  298. package/dist/cli/tui/load-dashboard.d.ts.map +0 -1
  299. package/dist/cli/tui/scroll-buffer.d.ts.map +0 -1
  300. package/dist/cli/tui/search-panel.d.ts.map +0 -1
  301. package/dist/cli/tui/shell-search.d.ts.map +0 -1
  302. package/dist/cli/tui/shell.d.ts.map +0 -1
  303. package/dist/cli/tui/websocket.d.ts.map +0 -1
  304. package/dist/constants/http-status.d.ts.map +0 -1
  305. package/dist/constants.d.ts.map +0 -1
  306. package/dist/contract/index.d.ts.map +0 -1
  307. package/dist/cookies/memory-cookie-jar.d.ts.map +0 -1
  308. package/dist/core/client.d.ts.map +0 -1
  309. package/dist/core/errors.d.ts.map +0 -1
  310. package/dist/core/index.d.ts.map +0 -1
  311. package/dist/core/request-promise.d.ts.map +0 -1
  312. package/dist/core/request.d.ts.map +0 -1
  313. package/dist/core/response.d.ts.map +0 -1
  314. package/dist/dns/index.d.ts.map +0 -1
  315. package/dist/dns/propagation.d.ts.map +0 -1
  316. package/dist/events/request-events.d.ts.map +0 -1
  317. package/dist/index.d.ts.map +0 -1
  318. package/dist/mcp/client.d.ts.map +0 -1
  319. package/dist/mcp/contract.d.ts.map +0 -1
  320. package/dist/mcp/embeddings-loader.d.ts.map +0 -1
  321. package/dist/mcp/geoip-loader.d.ts.map +0 -1
  322. package/dist/mcp/index.d.ts.map +0 -1
  323. package/dist/mcp/ip-intel.d.ts.map +0 -1
  324. package/dist/mcp/search/hybrid-search.d.ts.map +0 -1
  325. package/dist/mcp/search/index.d.ts.map +0 -1
  326. package/dist/mcp/search/math.d.ts.map +0 -1
  327. package/dist/mcp/search/types.d.ts.map +0 -1
  328. package/dist/mcp/server.d.ts.map +0 -1
  329. package/dist/mcp/types.d.ts.map +0 -1
  330. package/dist/plugins/auth.d.ts.map +0 -1
  331. package/dist/plugins/cache.d.ts.map +0 -1
  332. package/dist/plugins/circuit-breaker.d.ts.map +0 -1
  333. package/dist/plugins/compression.d.ts.map +0 -1
  334. package/dist/plugins/cookie-jar.d.ts.map +0 -1
  335. package/dist/plugins/dedup.d.ts.map +0 -1
  336. package/dist/plugins/graphql.d.ts.map +0 -1
  337. package/dist/plugins/grpc-web.d.ts.map +0 -1
  338. package/dist/plugins/har-player.d.ts.map +0 -1
  339. package/dist/plugins/har-recorder.d.ts.map +0 -1
  340. package/dist/plugins/hls.d.ts.map +0 -1
  341. package/dist/plugins/http2-push.d.ts.map +0 -1
  342. package/dist/plugins/http3.d.ts.map +0 -1
  343. package/dist/plugins/interface-rotator.d.ts.map +0 -1
  344. package/dist/plugins/jsonrpc.d.ts.map +0 -1
  345. package/dist/plugins/logger.d.ts.map +0 -1
  346. package/dist/plugins/odata.d.ts.map +0 -1
  347. package/dist/plugins/pagination.d.ts.map +0 -1
  348. package/dist/plugins/proxy-rotator.d.ts.map +0 -1
  349. package/dist/plugins/retry.d.ts.map +0 -1
  350. package/dist/plugins/scrape.d.ts.map +0 -1
  351. package/dist/plugins/server-timing.d.ts.map +0 -1
  352. package/dist/plugins/soap.d.ts.map +0 -1
  353. package/dist/plugins/user-agent.d.ts.map +0 -1
  354. package/dist/plugins/xml.d.ts.map +0 -1
  355. package/dist/plugins/xsrf.d.ts.map +0 -1
  356. package/dist/presets/anthropic.d.ts.map +0 -1
  357. package/dist/presets/aws.d.ts.map +0 -1
  358. package/dist/presets/azure-openai.d.ts.map +0 -1
  359. package/dist/presets/azure.d.ts.map +0 -1
  360. package/dist/presets/cloudflare.d.ts.map +0 -1
  361. package/dist/presets/cohere.d.ts.map +0 -1
  362. package/dist/presets/deepseek.d.ts.map +0 -1
  363. package/dist/presets/digitalocean.d.ts.map +0 -1
  364. package/dist/presets/discord.d.ts.map +0 -1
  365. package/dist/presets/fireworks.d.ts.map +0 -1
  366. package/dist/presets/gcp.d.ts.map +0 -1
  367. package/dist/presets/gemini.d.ts.map +0 -1
  368. package/dist/presets/github.d.ts.map +0 -1
  369. package/dist/presets/gitlab.d.ts.map +0 -1
  370. package/dist/presets/groq.d.ts.map +0 -1
  371. package/dist/presets/huggingface.d.ts.map +0 -1
  372. package/dist/presets/index.d.ts.map +0 -1
  373. package/dist/presets/linear.d.ts.map +0 -1
  374. package/dist/presets/mailgun.d.ts.map +0 -1
  375. package/dist/presets/meta.d.ts.map +0 -1
  376. package/dist/presets/mistral.d.ts.map +0 -1
  377. package/dist/presets/notion.d.ts.map +0 -1
  378. package/dist/presets/openai.d.ts.map +0 -1
  379. package/dist/presets/oracle.d.ts.map +0 -1
  380. package/dist/presets/perplexity.d.ts.map +0 -1
  381. package/dist/presets/registry.d.ts.map +0 -1
  382. package/dist/presets/replicate.d.ts.map +0 -1
  383. package/dist/presets/sinch.d.ts.map +0 -1
  384. package/dist/presets/slack.d.ts.map +0 -1
  385. package/dist/presets/stripe.d.ts.map +0 -1
  386. package/dist/presets/supabase.d.ts.map +0 -1
  387. package/dist/presets/tiktok.d.ts.map +0 -1
  388. package/dist/presets/together.d.ts.map +0 -1
  389. package/dist/presets/twilio.d.ts.map +0 -1
  390. package/dist/presets/vercel.d.ts.map +0 -1
  391. package/dist/presets/vultr.d.ts.map +0 -1
  392. package/dist/presets/xai.d.ts.map +0 -1
  393. package/dist/presets/youtube.d.ts.map +0 -1
  394. package/dist/protocols/ftp.d.ts.map +0 -1
  395. package/dist/protocols/index.d.ts.map +0 -1
  396. package/dist/protocols/sftp.d.ts.map +0 -1
  397. package/dist/protocols/telnet.d.ts.map +0 -1
  398. package/dist/recker.d.ts.map +0 -1
  399. package/dist/runner/request-runner.d.ts.map +0 -1
  400. package/dist/scrape/document.d.ts.map +0 -1
  401. package/dist/scrape/element.d.ts.map +0 -1
  402. package/dist/scrape/extractors.d.ts.map +0 -1
  403. package/dist/scrape/index.d.ts.map +0 -1
  404. package/dist/scrape/types.d.ts.map +0 -1
  405. package/dist/testing/index.d.ts.map +0 -1
  406. package/dist/testing/mock-udp-server.d.ts.map +0 -1
  407. package/dist/testing/mock.d.ts.map +0 -1
  408. package/dist/transport/base-udp.d.ts.map +0 -1
  409. package/dist/transport/fetch.d.ts.map +0 -1
  410. package/dist/transport/udp-response.d.ts.map +0 -1
  411. package/dist/transport/udp.d.ts.map +0 -1
  412. package/dist/transport/undici.d.ts.map +0 -1
  413. package/dist/types/ai.d.ts.map +0 -1
  414. package/dist/types/index.d.ts.map +0 -1
  415. package/dist/types/logger.d.ts.map +0 -1
  416. package/dist/types/udp.d.ts.map +0 -1
  417. package/dist/udp/index.d.ts.map +0 -1
  418. package/dist/utils/agent-manager.d.ts.map +0 -1
  419. package/dist/utils/body.d.ts.map +0 -1
  420. package/dist/utils/cert.d.ts.map +0 -1
  421. package/dist/utils/charset.d.ts.map +0 -1
  422. package/dist/utils/chart.d.ts.map +0 -1
  423. package/dist/utils/client-pool.d.ts.map +0 -1
  424. package/dist/utils/colors.d.ts.map +0 -1
  425. package/dist/utils/concurrency.d.ts.map +0 -1
  426. package/dist/utils/dns-toolkit.d.ts.map +0 -1
  427. package/dist/utils/dns.d.ts.map +0 -1
  428. package/dist/utils/doh.d.ts.map +0 -1
  429. package/dist/utils/download.d.ts.map +0 -1
  430. package/dist/utils/env-proxy.d.ts.map +0 -1
  431. package/dist/utils/header-parser.d.ts.map +0 -1
  432. package/dist/utils/html-cleaner.d.ts.map +0 -1
  433. package/dist/utils/link-header.d.ts.map +0 -1
  434. package/dist/utils/optional-require.d.ts.map +0 -1
  435. package/dist/utils/progress.d.ts.map +0 -1
  436. package/dist/utils/rdap.d.ts.map +0 -1
  437. package/dist/utils/request-pool.d.ts.map +0 -1
  438. package/dist/utils/security-grader.d.ts.map +0 -1
  439. package/dist/utils/sparkline.d.ts.map +0 -1
  440. package/dist/utils/sse.d.ts.map +0 -1
  441. package/dist/utils/streaming.d.ts.map +0 -1
  442. package/dist/utils/system-metrics.d.ts.map +0 -1
  443. package/dist/utils/tls-inspector.d.ts.map +0 -1
  444. package/dist/utils/try-fn.d.ts.map +0 -1
  445. package/dist/utils/upload.d.ts.map +0 -1
  446. package/dist/utils/user-agent.d.ts.map +0 -1
  447. package/dist/utils/whois.d.ts.map +0 -1
  448. package/dist/webrtc/index.d.ts.map +0 -1
  449. package/dist/websocket/client.d.ts.map +0 -1
package/README.md CHANGED
@@ -77,6 +77,28 @@ const api = createClient({
77
77
  const user = await api.get('/users/:id', { params: { id: '123' } }).json();
78
78
  ```
79
79
 
80
+ ### Mini Client (Maximum Performance)
81
+
82
+ Need raw speed? Use `recker-mini` for ~2% overhead vs raw undici:
83
+
84
+ ```typescript
85
+ import { createMiniClient, miniGet } from 'recker/mini';
86
+
87
+ // Client instance
88
+ const fast = createMiniClient({ baseUrl: 'https://api.example.com' });
89
+ const data = await fast.get('/users').then(r => r.json());
90
+
91
+ // Or direct function (even faster)
92
+ const users = await miniGet('https://api.example.com/users').then(r => r.json());
93
+ ```
94
+
95
+ | Mode | Speed | Features |
96
+ |------|-------|----------|
97
+ | `recker-mini` | ~146µs (2% overhead) | Base URL, headers, JSON |
98
+ | `recker` | ~265µs (86% overhead) | Retry, cache, auth, hooks, plugins |
99
+
100
+ See [Mini Client documentation](./docs/http/18-mini-client.md) for more.
101
+
80
102
  ## Features
81
103
 
82
104
  | Feature | Description |
@@ -131,14 +153,47 @@ const client = createClient({
131
153
  });
132
154
  ```
133
155
 
156
+ ## CLI (`rek`)
157
+
158
+ A powerful terminal client that replaces curl:
159
+
160
+ ```bash
161
+ # Install globally
162
+ npm install -g recker
163
+
164
+ # Simple requests
165
+ rek httpbin.org/json
166
+ rek POST api.com/users name="John" age:=30
167
+
168
+ # Pipe to bash (like curl)
169
+ rek -q https://get.docker.com | bash
170
+
171
+ # Save to file
172
+ rek -o data.json api.com/export
173
+
174
+ # Interactive shell
175
+ rek shell
176
+
177
+ # Mock servers for testing
178
+ rek serve http # HTTP on :3000
179
+ rek serve ws # WebSocket on :8080
180
+ rek serve hls # HLS streaming on :8082
181
+ ```
182
+
183
+ See [CLI Documentation](./docs/cli/01-overview.md) for more.
184
+
134
185
  ## Documentation
135
186
 
136
187
  - **[Quick Start](./docs/http/01-quickstart.md)** - Get running in 2 minutes
188
+ - **[Mini Client](./docs/http/18-mini-client.md)** - Maximum performance mode
189
+ - **[CLI Guide](./docs/cli/01-overview.md)** - Terminal client documentation
137
190
  - **[API Reference](./docs/reference/01-api.md)** - Complete API documentation
138
191
  - **[Configuration](./docs/http/05-configuration.md)** - Client options
139
192
  - **[Plugins](./docs/http/10-plugins.md)** - Extend functionality
140
193
  - **[AI Integration](./docs/ai/01-overview.md)** - OpenAI, Anthropic, and more
141
194
  - **[Protocols](./docs/protocols/01-websocket.md)** - WebSocket, DNS, WHOIS
195
+ - **[Mock Servers](./docs/cli/08-mock-servers.md)** - Built-in test servers
196
+ - **[Benchmarks](./docs/benchmarks.md)** - Performance comparisons
142
197
 
143
198
  ## License
144
199
 
@@ -48,4 +48,3 @@ export declare class StreamTimeoutController {
48
48
  }
49
49
  export declare const adaptiveTimeouts: AdaptiveTimeoutManager;
50
50
  export {};
51
- //# sourceMappingURL=adaptive-timeout.d.ts.map
@@ -20,4 +20,3 @@ export declare class UnifiedAIClient implements AIClient {
20
20
  private sleep;
21
21
  }
22
22
  export declare function createAI(config?: AIClientConfig): AIClient;
23
- //# sourceMappingURL=client.d.ts.map
package/dist/ai/client.js CHANGED
@@ -1,6 +1,8 @@
1
1
  import { AIError, RateLimitError, ContextLengthError, OverloadedError } from './providers/base.js';
2
2
  import { OpenAIProvider } from './providers/openai.js';
3
3
  import { AnthropicProvider } from './providers/anthropic.js';
4
+ import { GoogleProvider } from './providers/google.js';
5
+ import { OllamaProvider } from './providers/ollama.js';
4
6
  class AIMetricsTracker {
5
7
  data = {
6
8
  totalRequests: 0,
@@ -155,6 +157,10 @@ export class UnifiedAIClient {
155
157
  this.providers.set('openai', new OpenAIProvider(openaiConfig));
156
158
  const anthropicConfig = this.config.providers?.anthropic || {};
157
159
  this.providers.set('anthropic', new AnthropicProvider(anthropicConfig));
160
+ const googleConfig = this.config.providers?.google || {};
161
+ this.providers.set('google', new GoogleProvider(googleConfig));
162
+ const ollamaConfig = this.config.providers?.ollama || {};
163
+ this.providers.set('ollama', new OllamaProvider(ollamaConfig));
158
164
  }
159
165
  getProvider(name) {
160
166
  const providerName = name || this.config.defaultProvider || 'openai';
@@ -2,9 +2,11 @@ export { UnifiedAIClient, createAI } from './client.js';
2
2
  export { BaseAIProvider, AIError, RateLimitError, ContextLengthError, OverloadedError, AuthenticationError } from './providers/base.js';
3
3
  export { OpenAIProvider } from './providers/openai.js';
4
4
  export { AnthropicProvider } from './providers/anthropic.js';
5
+ export { GoogleProvider } from './providers/google.js';
6
+ export { OllamaProvider } from './providers/ollama.js';
7
+ export * from './vector/index.js';
5
8
  export { AdaptiveTimeoutManager, StreamTimeoutController, adaptiveTimeouts } from './adaptive-timeout.js';
6
9
  export { TokenRateLimiter, RateLimitExceededError, createRateLimiter, tokenEstimators, PROVIDER_RATE_LIMITS, } from './rate-limiter.js';
7
10
  export type { AIProvider, MessageRole, ChatMessage, ContentPart, ToolDefinition, ToolCall, TokenUsage, CostInfo, AILatency, AITimeoutOptions, AIRetryOptions, ResponseFormat, ChatOptions, EmbedOptions, AIResponse, EmbedResponse, StreamEventType, StreamEvent, TextStreamEvent, ToolCallStreamEvent, ToolCallDeltaStreamEvent, UsageStreamEvent, DoneStreamEvent, ErrorStreamEvent, AIStream, ProviderConfig, AIClientConfig, TokenRateLimitConfig, SemanticCacheConfig, CacheStorage, AIClient, AIMetrics, AIMetricsSummary, AgentTool, AgentConfig, AgentEventType, AgentStreamEvent, Agent, } from '../types/ai.js';
8
11
  export type { OpenAIConfig } from './providers/openai.js';
9
12
  export type { AnthropicConfig } from './providers/anthropic.js';
10
- //# sourceMappingURL=index.d.ts.map
package/dist/ai/index.js CHANGED
@@ -2,5 +2,8 @@ export { UnifiedAIClient, createAI } from './client.js';
2
2
  export { BaseAIProvider, AIError, RateLimitError, ContextLengthError, OverloadedError, AuthenticationError } from './providers/base.js';
3
3
  export { OpenAIProvider } from './providers/openai.js';
4
4
  export { AnthropicProvider } from './providers/anthropic.js';
5
+ export { GoogleProvider } from './providers/google.js';
6
+ export { OllamaProvider } from './providers/ollama.js';
7
+ export * from './vector/index.js';
5
8
  export { AdaptiveTimeoutManager, StreamTimeoutController, adaptiveTimeouts } from './adaptive-timeout.js';
6
9
  export { TokenRateLimiter, RateLimitExceededError, createRateLimiter, tokenEstimators, PROVIDER_RATE_LIMITS, } from './rate-limiter.js';
@@ -61,4 +61,3 @@ export declare class AnthropicProvider extends BaseAIProvider {
61
61
  private parseAnthropicStream;
62
62
  }
63
63
  export {};
64
- //# sourceMappingURL=anthropic.d.ts.map
@@ -46,4 +46,3 @@ export declare class OverloadedError extends AIError {
46
46
  export declare class AuthenticationError extends AIError {
47
47
  constructor(provider: AIProvider);
48
48
  }
49
- //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1,59 @@
1
+ import type { ChatOptions, ChatMessage, AIResponse, AIStream, StreamEvent, EmbedOptions, EmbedResponse, ProviderConfig } from '../../types/ai.js';
2
+ import { BaseAIProvider, ProviderRequestContext } from './base.js';
3
+ export interface GoogleConfig extends ProviderConfig {
4
+ apiVersion?: string;
5
+ }
6
+ interface GeminiContent {
7
+ role: 'user' | 'model';
8
+ parts: GeminiPart[];
9
+ }
10
+ interface GeminiPart {
11
+ text?: string;
12
+ inlineData?: {
13
+ mimeType: string;
14
+ data: string;
15
+ };
16
+ functionCall?: {
17
+ name: string;
18
+ args: Record<string, unknown>;
19
+ };
20
+ functionResponse?: {
21
+ name: string;
22
+ response: Record<string, unknown>;
23
+ };
24
+ }
25
+ interface GeminiResponse {
26
+ candidates?: Array<{
27
+ content: GeminiContent;
28
+ finishReason?: string;
29
+ citationMetadata?: unknown;
30
+ tokenCount?: number;
31
+ }>;
32
+ promptFeedback?: {
33
+ blockReason?: string;
34
+ };
35
+ usageMetadata?: {
36
+ promptTokenCount: number;
37
+ candidatesTokenCount: number;
38
+ totalTokenCount: number;
39
+ };
40
+ }
41
+ export declare class GoogleProvider extends BaseAIProvider {
42
+ private googleConfig;
43
+ constructor(config?: GoogleConfig);
44
+ protected getEnvApiKey(): string | undefined;
45
+ protected getBaseUrl(): string;
46
+ protected buildHeaders(): Record<string, string>;
47
+ protected transformMessages(messages: ChatMessage[]): GeminiContent[];
48
+ private transformContent;
49
+ private transformTools;
50
+ chat(options: ChatOptions): Promise<AIResponse>;
51
+ stream(options: ChatOptions): Promise<AIStream>;
52
+ embed(options: EmbedOptions): Promise<EmbedResponse>;
53
+ private buildChatBody;
54
+ private makeRequest;
55
+ private handleError;
56
+ protected parseResponse(data: GeminiResponse, context: ProviderRequestContext): AIResponse;
57
+ protected parseStreamEvent(chunk: string, context: ProviderRequestContext): StreamEvent | null;
58
+ }
59
+ export {};
@@ -0,0 +1,305 @@
1
+ import { BaseAIProvider, AIError, RateLimitError, OverloadedError, AuthenticationError, } from './base.js';
2
+ export class GoogleProvider extends BaseAIProvider {
3
+ googleConfig;
4
+ constructor(config = {}) {
5
+ super({ ...config, name: 'google' });
6
+ this.googleConfig = config;
7
+ }
8
+ getEnvApiKey() {
9
+ return process.env.GOOGLE_API_KEY;
10
+ }
11
+ getBaseUrl() {
12
+ const version = this.googleConfig.apiVersion || 'v1beta';
13
+ return this.config.baseUrl || `https://generativelanguage.googleapis.com/${version}`;
14
+ }
15
+ buildHeaders() {
16
+ return {
17
+ 'Content-Type': 'application/json',
18
+ ...this.config.headers,
19
+ };
20
+ }
21
+ transformMessages(messages) {
22
+ return messages
23
+ .filter((m) => m.role !== 'system')
24
+ .map((msg) => {
25
+ return {
26
+ role: msg.role === 'user' ? 'user' : 'model',
27
+ parts: this.transformContent(msg),
28
+ };
29
+ });
30
+ }
31
+ transformContent(msg) {
32
+ if (msg.role === 'tool') {
33
+ return [{
34
+ functionResponse: {
35
+ name: msg.name || 'unknown_tool',
36
+ response: typeof msg.content === 'string' ? { content: msg.content } : { content: msg.content },
37
+ },
38
+ }];
39
+ }
40
+ if (msg.tool_calls && msg.tool_calls.length > 0) {
41
+ const parts = [];
42
+ if (msg.content && typeof msg.content === 'string') {
43
+ parts.push({ text: msg.content });
44
+ }
45
+ msg.tool_calls.forEach((tc) => {
46
+ parts.push({
47
+ functionCall: {
48
+ name: tc.function.name,
49
+ args: JSON.parse(tc.function.arguments || '{}'),
50
+ },
51
+ });
52
+ });
53
+ return parts;
54
+ }
55
+ const content = msg.content;
56
+ if (typeof content === 'string') {
57
+ return [{ text: content }];
58
+ }
59
+ if (!content)
60
+ return [{ text: '' }];
61
+ return content.map((part) => {
62
+ if (part.type === 'text') {
63
+ return { text: part.text };
64
+ }
65
+ if (part.type === 'image_url') {
66
+ return { text: '[Image URL not supported directly in Gemini provider yet without base64]' };
67
+ }
68
+ if (part.type === 'image') {
69
+ const base64 = Buffer.from(part.data).toString('base64');
70
+ return {
71
+ inlineData: {
72
+ mimeType: part.mediaType,
73
+ data: base64,
74
+ },
75
+ };
76
+ }
77
+ return { text: '' };
78
+ });
79
+ }
80
+ transformTools(tools) {
81
+ if (!tools || tools.length === 0)
82
+ return undefined;
83
+ return [{
84
+ functionDeclarations: tools.map((t) => ({
85
+ name: t.function.name,
86
+ description: t.function.description,
87
+ parameters: t.function.parameters,
88
+ })),
89
+ }];
90
+ }
91
+ async chat(options) {
92
+ const context = {
93
+ startTime: performance.now(),
94
+ tokenCount: 0,
95
+ };
96
+ const model = options.model || this.config.defaultModel || 'gemini-2.5-flash';
97
+ const body = this.buildChatBody(options);
98
+ const response = await this.makeRequest(`/models/${model}:generateContent`, body, options.signal);
99
+ const data = await response.json();
100
+ return this.parseResponse(data, context);
101
+ }
102
+ async stream(options) {
103
+ const context = {
104
+ startTime: performance.now(),
105
+ tokenCount: 0,
106
+ };
107
+ const model = options.model || this.config.defaultModel || 'gemini-2.5-flash';
108
+ const body = this.buildChatBody(options);
109
+ const response = await this.makeRequest(`/models/${model}:streamGenerateContent?alt=sse`, body, options.signal);
110
+ return this.parseSSEStream(response, context);
111
+ }
112
+ async embed(options) {
113
+ const startTime = performance.now();
114
+ const model = options.model || 'text-embedding-004';
115
+ const isBatch = Array.isArray(options.input);
116
+ const method = isBatch ? 'batchEmbedContents' : 'embedContent';
117
+ const inputs = isBatch ? options.input : [options.input];
118
+ const requests = inputs.map(text => ({
119
+ model: `models/${model}`,
120
+ content: { parts: [{ text }] }
121
+ }));
122
+ const body = isBatch ? { requests } : { ...requests[0] };
123
+ const response = await this.makeRequest(`/models/${model}:${method}`, body, options.signal);
124
+ const data = await response.json();
125
+ let embeddings = [];
126
+ if (isBatch) {
127
+ embeddings = data.embeddings.map((e) => e.values);
128
+ }
129
+ else {
130
+ embeddings = [data.embedding.values];
131
+ }
132
+ const totalTokens = 0;
133
+ const latency = {
134
+ ttft: performance.now() - startTime,
135
+ tps: 0,
136
+ total: performance.now() - startTime,
137
+ };
138
+ return {
139
+ embeddings,
140
+ usage: {
141
+ inputTokens: totalTokens,
142
+ outputTokens: 0,
143
+ totalTokens,
144
+ },
145
+ model,
146
+ provider: 'google',
147
+ latency,
148
+ };
149
+ }
150
+ buildChatBody(options) {
151
+ const messages = this.transformMessages(options.messages);
152
+ const systemMessage = options.messages.find(m => m.role === 'system');
153
+ let systemInstruction;
154
+ if (systemMessage) {
155
+ systemInstruction = {
156
+ parts: [{ text: typeof systemMessage.content === 'string' ? systemMessage.content : '' }]
157
+ };
158
+ }
159
+ else if (options.systemPrompt) {
160
+ systemInstruction = {
161
+ parts: [{ text: options.systemPrompt }]
162
+ };
163
+ }
164
+ const generationConfig = {};
165
+ if (options.temperature !== undefined)
166
+ generationConfig.temperature = options.temperature;
167
+ if (options.topP !== undefined)
168
+ generationConfig.topP = options.topP;
169
+ if (options.maxTokens !== undefined)
170
+ generationConfig.maxOutputTokens = options.maxTokens;
171
+ if (options.stop)
172
+ generationConfig.stopSequences = options.stop;
173
+ if (options.responseFormat?.type === 'json_object') {
174
+ generationConfig.responseMimeType = 'application/json';
175
+ }
176
+ const body = {
177
+ contents: messages,
178
+ generationConfig,
179
+ tools: this.transformTools(options.tools),
180
+ };
181
+ if (systemInstruction) {
182
+ body.systemInstruction = systemInstruction;
183
+ }
184
+ return body;
185
+ }
186
+ async makeRequest(endpoint, body, signal) {
187
+ const key = this.getApiKey();
188
+ const separator = endpoint.includes('?') ? '&' : '?';
189
+ const url = `${this.getBaseUrl()}${endpoint}${separator}key=${key}`;
190
+ const headers = this.buildHeaders();
191
+ const response = await fetch(url, {
192
+ method: 'POST',
193
+ headers,
194
+ body: JSON.stringify(body),
195
+ signal,
196
+ });
197
+ if (!response.ok) {
198
+ await this.handleError(response);
199
+ }
200
+ return response;
201
+ }
202
+ async handleError(response) {
203
+ let errorData = {};
204
+ try {
205
+ errorData = await response.json();
206
+ }
207
+ catch {
208
+ }
209
+ const message = errorData.error?.message || response.statusText;
210
+ const status = errorData.error?.code || response.status;
211
+ switch (response.status) {
212
+ case 400:
213
+ case 401:
214
+ throw new AuthenticationError('google');
215
+ case 429:
216
+ throw new RateLimitError('google');
217
+ case 503:
218
+ throw new OverloadedError('google');
219
+ }
220
+ throw new AIError(message, 'google', String(status), response.status, response.status >= 500);
221
+ }
222
+ parseResponse(data, context) {
223
+ const candidate = data.candidates?.[0];
224
+ const parts = candidate?.content?.parts || [];
225
+ const content = parts
226
+ .filter(p => p.text)
227
+ .map(p => p.text)
228
+ .join('');
229
+ const toolCalls = parts
230
+ .filter(p => p.functionCall)
231
+ .map(p => ({
232
+ id: 'call_' + Math.random().toString(36).slice(2),
233
+ type: 'function',
234
+ function: {
235
+ name: p.functionCall.name,
236
+ arguments: JSON.stringify(p.functionCall.args),
237
+ }
238
+ }));
239
+ const usage = data.usageMetadata
240
+ ? {
241
+ inputTokens: data.usageMetadata.promptTokenCount,
242
+ outputTokens: data.usageMetadata.candidatesTokenCount,
243
+ totalTokens: data.usageMetadata.totalTokenCount,
244
+ }
245
+ : this.emptyUsage();
246
+ context.tokenCount = usage.outputTokens;
247
+ return {
248
+ content,
249
+ usage,
250
+ latency: this.calculateLatency(context),
251
+ model: 'gemini',
252
+ provider: 'google',
253
+ cached: false,
254
+ finishReason: candidate?.finishReason === 'STOP' ? 'stop' : 'length',
255
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
256
+ raw: data,
257
+ };
258
+ }
259
+ parseStreamEvent(chunk, context) {
260
+ const data = JSON.parse(chunk);
261
+ const candidate = data.candidates?.[0];
262
+ if (!candidate)
263
+ return null;
264
+ if (data.usageMetadata) {
265
+ return {
266
+ type: 'usage',
267
+ usage: {
268
+ inputTokens: data.usageMetadata.promptTokenCount,
269
+ outputTokens: data.usageMetadata.candidatesTokenCount,
270
+ totalTokens: data.usageMetadata.totalTokenCount,
271
+ }
272
+ };
273
+ }
274
+ const parts = candidate.content?.parts || [];
275
+ const textPart = parts.find(p => p.text);
276
+ if (textPart?.text) {
277
+ context.tokenCount++;
278
+ return {
279
+ type: 'text',
280
+ content: textPart.text,
281
+ };
282
+ }
283
+ const toolPart = parts.find(p => p.functionCall);
284
+ if (toolPart?.functionCall) {
285
+ return {
286
+ type: 'tool_call',
287
+ toolCall: {
288
+ id: 'call_' + Math.random().toString(36).slice(2),
289
+ type: 'function',
290
+ function: {
291
+ name: toolPart.functionCall.name,
292
+ arguments: JSON.stringify(toolPart.functionCall.args),
293
+ }
294
+ }
295
+ };
296
+ }
297
+ if (candidate.finishReason && candidate.finishReason !== 'STOP') {
298
+ return {
299
+ type: 'done',
300
+ finishReason: 'stop',
301
+ };
302
+ }
303
+ return null;
304
+ }
305
+ }
@@ -4,4 +4,7 @@ export { OpenAIProvider } from './openai.js';
4
4
  export type { OpenAIConfig } from './openai.js';
5
5
  export { AnthropicProvider } from './anthropic.js';
6
6
  export type { AnthropicConfig } from './anthropic.js';
7
- //# sourceMappingURL=index.d.ts.map
7
+ export { GoogleProvider } from './google.js';
8
+ export type { GoogleConfig } from './google.js';
9
+ export { OllamaProvider } from './ollama.js';
10
+ export type { OllamaConfig } from './ollama.js';
@@ -1,3 +1,5 @@
1
1
  export { BaseAIProvider, AIError, RateLimitError, ContextLengthError, OverloadedError, AuthenticationError } from './base.js';
2
2
  export { OpenAIProvider } from './openai.js';
3
3
  export { AnthropicProvider } from './anthropic.js';
4
+ export { GoogleProvider } from './google.js';
5
+ export { OllamaProvider } from './ollama.js';
@@ -0,0 +1,44 @@
1
+ import type { ChatOptions, ChatMessage, AIResponse, AIStream, StreamEvent, EmbedOptions, EmbedResponse, ProviderConfig } from '../../types/ai.js';
2
+ import { BaseAIProvider, ProviderRequestContext } from './base.js';
3
+ export interface OllamaConfig extends ProviderConfig {
4
+ keepAlive?: string;
5
+ }
6
+ interface OllamaMessage {
7
+ role: string;
8
+ content: string;
9
+ images?: string[];
10
+ }
11
+ interface OllamaResponse {
12
+ model: string;
13
+ created_at: string;
14
+ message: {
15
+ role: string;
16
+ content: string;
17
+ images?: string[] | null;
18
+ };
19
+ done: boolean;
20
+ total_duration?: number;
21
+ load_duration?: number;
22
+ prompt_eval_count?: number;
23
+ prompt_eval_duration?: number;
24
+ eval_count?: number;
25
+ eval_duration?: number;
26
+ }
27
+ export declare class OllamaProvider extends BaseAIProvider {
28
+ private ollamaConfig;
29
+ constructor(config?: OllamaConfig);
30
+ protected getEnvApiKey(): string | undefined;
31
+ protected getBaseUrl(): string;
32
+ protected buildHeaders(): Record<string, string>;
33
+ protected transformMessages(messages: ChatMessage[]): OllamaMessage[];
34
+ private extractContentAndImages;
35
+ chat(options: ChatOptions): Promise<AIResponse>;
36
+ stream(options: ChatOptions): Promise<AIStream>;
37
+ embed(options: EmbedOptions): Promise<EmbedResponse>;
38
+ private buildChatBody;
39
+ private makeRequest;
40
+ protected parseResponse(data: OllamaResponse, context: ProviderRequestContext): AIResponse;
41
+ protected parseStreamEvent(_chunk: string, _context: ProviderRequestContext): StreamEvent | null;
42
+ protected parseNDJSONStream(response: Response, context: ProviderRequestContext): AIStream;
43
+ }
44
+ export {};