@5ss/ai-tools 2.11.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 (342) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/LICENSE +21 -0
  3. package/README.md +221 -0
  4. package/dist/ai-sdk/index.d.ts +15 -0
  5. package/dist/ai-sdk/index.d.ts.map +1 -0
  6. package/dist/ai-sdk/index.js +24 -0
  7. package/dist/ai-sdk/index.js.map +1 -0
  8. package/dist/artifact-D064mHfK.js +44 -0
  9. package/dist/artifact-D064mHfK.js.map +1 -0
  10. package/dist/artifacts-O8g-40Pw.js +404 -0
  11. package/dist/artifacts-O8g-40Pw.js.map +1 -0
  12. package/dist/aws-json-CecFqzqX.js +23 -0
  13. package/dist/aws-json-CecFqzqX.js.map +1 -0
  14. package/dist/aws-service-msttbPrz.js +58 -0
  15. package/dist/aws-service-msttbPrz.js.map +1 -0
  16. package/dist/batch-BMM5dXqL.d.ts +22 -0
  17. package/dist/batch-BMM5dXqL.d.ts.map +1 -0
  18. package/dist/batch-Co1ujeAW.js +67 -0
  19. package/dist/batch-Co1ujeAW.js.map +1 -0
  20. package/dist/bedrock-agentcore-browser-a_qOs-NR.js +182 -0
  21. package/dist/bedrock-agentcore-browser-a_qOs-NR.js.map +1 -0
  22. package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js +357 -0
  23. package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js.map +1 -0
  24. package/dist/bytes-BxpimpQx.js +45 -0
  25. package/dist/bytes-BxpimpQx.js.map +1 -0
  26. package/dist/client-CCKGsTeI.js +743 -0
  27. package/dist/client-CCKGsTeI.js.map +1 -0
  28. package/dist/cloudflare/index.d.ts +37 -0
  29. package/dist/cloudflare/index.d.ts.map +1 -0
  30. package/dist/cloudflare/index.js +41 -0
  31. package/dist/cloudflare/index.js.map +1 -0
  32. package/dist/cloudflare-browser-B6Yolpin.js +428 -0
  33. package/dist/cloudflare-browser-B6Yolpin.js.map +1 -0
  34. package/dist/cloudflare-email-Dy0KHeDf.js +197 -0
  35. package/dist/cloudflare-email-Dy0KHeDf.js.map +1 -0
  36. package/dist/cloudflare-sandbox-Dp_uNaqW.js +982 -0
  37. package/dist/cloudflare-sandbox-Dp_uNaqW.js.map +1 -0
  38. package/dist/content-type-CORxaxcv.js +49 -0
  39. package/dist/content-type-CORxaxcv.js.map +1 -0
  40. package/dist/core/index.d.ts +4 -0
  41. package/dist/core/index.js +204 -0
  42. package/dist/core/index.js.map +1 -0
  43. package/dist/define-CvpJ_pNP.js +115 -0
  44. package/dist/define-CvpJ_pNP.js.map +1 -0
  45. package/dist/errors-DoSpNHvs.js +20 -0
  46. package/dist/errors-DoSpNHvs.js.map +1 -0
  47. package/dist/errors-aKhko9T1.d.ts +18 -0
  48. package/dist/errors-aKhko9T1.d.ts.map +1 -0
  49. package/dist/eventbridge-scheduler-Bh6GqZY2.js +349 -0
  50. package/dist/eventbridge-scheduler-Bh6GqZY2.js.map +1 -0
  51. package/dist/framework-context-DVIIY8ZO.js +24 -0
  52. package/dist/framework-context-DVIIY8ZO.js.map +1 -0
  53. package/dist/gotenberg-NuJjxyln.js +291 -0
  54. package/dist/gotenberg-NuJjxyln.js.map +1 -0
  55. package/dist/http/index.d.ts +47 -0
  56. package/dist/http/index.d.ts.map +1 -0
  57. package/dist/http/index.js +3 -0
  58. package/dist/http-service-DDNCO1s4.js +254 -0
  59. package/dist/http-service-DDNCO1s4.js.map +1 -0
  60. package/dist/http-service-T7E5UjP8.d.ts +80 -0
  61. package/dist/http-service-T7E5UjP8.d.ts.map +1 -0
  62. package/dist/imessage-BSAFOI8Z.js +154 -0
  63. package/dist/imessage-BSAFOI8Z.js.map +1 -0
  64. package/dist/index-BU4gmYO8.d.ts +254 -0
  65. package/dist/index-BU4gmYO8.d.ts.map +1 -0
  66. package/dist/index-CCivzmxO.d.ts +188 -0
  67. package/dist/index-CCivzmxO.d.ts.map +1 -0
  68. package/dist/index-CLmTrcu5.d.ts +22 -0
  69. package/dist/index-CLmTrcu5.d.ts.map +1 -0
  70. package/dist/index-CZX5OeOF.d.ts +235 -0
  71. package/dist/index-CZX5OeOF.d.ts.map +1 -0
  72. package/dist/index-CdFmEfZO.d.ts +359 -0
  73. package/dist/index-CdFmEfZO.d.ts.map +1 -0
  74. package/dist/index-Cuh6eMWc.d.ts +285 -0
  75. package/dist/index-Cuh6eMWc.d.ts.map +1 -0
  76. package/dist/index-DuOGj7vc.d.ts +107 -0
  77. package/dist/index-DuOGj7vc.d.ts.map +1 -0
  78. package/dist/index-ccZ1XOHw.d.ts +69 -0
  79. package/dist/index-ccZ1XOHw.d.ts.map +1 -0
  80. package/dist/index-n8JTpNf1.d.ts +247 -0
  81. package/dist/index-n8JTpNf1.d.ts.map +1 -0
  82. package/dist/index-pwW1OsOx.d.ts +134 -0
  83. package/dist/index-pwW1OsOx.d.ts.map +1 -0
  84. package/dist/index-zK1ZwS4m.d.ts +347 -0
  85. package/dist/index-zK1ZwS4m.d.ts.map +1 -0
  86. package/dist/limits-hjrO8zUG.js +80 -0
  87. package/dist/limits-hjrO8zUG.js.map +1 -0
  88. package/dist/mastra/index.d.ts +14 -0
  89. package/dist/mastra/index.d.ts.map +1 -0
  90. package/dist/mastra/index.js +26 -0
  91. package/dist/mastra/index.js.map +1 -0
  92. package/dist/mastra-vector-Dhc6XZ8l.js +234 -0
  93. package/dist/mastra-vector-Dhc6XZ8l.js.map +1 -0
  94. package/dist/mcp/index.d.ts +80 -0
  95. package/dist/mcp/index.d.ts.map +1 -0
  96. package/dist/mcp/index.js +97 -0
  97. package/dist/mcp/index.js.map +1 -0
  98. package/dist/modules/artifacts/index.d.ts +337 -0
  99. package/dist/modules/artifacts/index.d.ts.map +1 -0
  100. package/dist/modules/artifacts/index.js +348 -0
  101. package/dist/modules/artifacts/index.js.map +1 -0
  102. package/dist/modules/browser/index.d.ts +516 -0
  103. package/dist/modules/browser/index.d.ts.map +1 -0
  104. package/dist/modules/browser/index.js +475 -0
  105. package/dist/modules/browser/index.js.map +1 -0
  106. package/dist/modules/calendar/index.d.ts +93 -0
  107. package/dist/modules/calendar/index.d.ts.map +1 -0
  108. package/dist/modules/calendar/index.js +131 -0
  109. package/dist/modules/calendar/index.js.map +1 -0
  110. package/dist/modules/code-sandbox/index.d.ts +317 -0
  111. package/dist/modules/code-sandbox/index.d.ts.map +1 -0
  112. package/dist/modules/code-sandbox/index.js +537 -0
  113. package/dist/modules/code-sandbox/index.js.map +1 -0
  114. package/dist/modules/content-type/index.d.ts +22 -0
  115. package/dist/modules/content-type/index.d.ts.map +1 -0
  116. package/dist/modules/content-type/index.js +66 -0
  117. package/dist/modules/content-type/index.js.map +1 -0
  118. package/dist/modules/crypto/index.d.ts +115 -0
  119. package/dist/modules/crypto/index.d.ts.map +1 -0
  120. package/dist/modules/crypto/index.js +139 -0
  121. package/dist/modules/crypto/index.js.map +1 -0
  122. package/dist/modules/document/index.d.ts +575 -0
  123. package/dist/modules/document/index.d.ts.map +1 -0
  124. package/dist/modules/document/index.js +444 -0
  125. package/dist/modules/document/index.js.map +1 -0
  126. package/dist/modules/document-extract/index.d.ts +438 -0
  127. package/dist/modules/document-extract/index.d.ts.map +1 -0
  128. package/dist/modules/document-extract/index.js +127 -0
  129. package/dist/modules/document-extract/index.js.map +1 -0
  130. package/dist/modules/document-render/index.d.ts +336 -0
  131. package/dist/modules/document-render/index.d.ts.map +1 -0
  132. package/dist/modules/document-render/index.js +155 -0
  133. package/dist/modules/document-render/index.js.map +1 -0
  134. package/dist/modules/email/index.d.ts +311 -0
  135. package/dist/modules/email/index.d.ts.map +1 -0
  136. package/dist/modules/email/index.js +167 -0
  137. package/dist/modules/email/index.js.map +1 -0
  138. package/dist/modules/email-message/index.d.ts +95 -0
  139. package/dist/modules/email-message/index.d.ts.map +1 -0
  140. package/dist/modules/email-message/index.js +264 -0
  141. package/dist/modules/email-message/index.js.map +1 -0
  142. package/dist/modules/file-convert/index.d.ts +273 -0
  143. package/dist/modules/file-convert/index.d.ts.map +1 -0
  144. package/dist/modules/file-convert/index.js +103 -0
  145. package/dist/modules/file-convert/index.js.map +1 -0
  146. package/dist/modules/files/index.d.ts +452 -0
  147. package/dist/modules/files/index.d.ts.map +1 -0
  148. package/dist/modules/files/index.js +733 -0
  149. package/dist/modules/files/index.js.map +1 -0
  150. package/dist/modules/image/index.d.ts +342 -0
  151. package/dist/modules/image/index.d.ts.map +1 -0
  152. package/dist/modules/image/index.js +281 -0
  153. package/dist/modules/image/index.js.map +1 -0
  154. package/dist/modules/messaging/index.d.ts +608 -0
  155. package/dist/modules/messaging/index.d.ts.map +1 -0
  156. package/dist/modules/messaging/index.js +1067 -0
  157. package/dist/modules/messaging/index.js.map +1 -0
  158. package/dist/modules/pdf/index.d.ts +287 -0
  159. package/dist/modules/pdf/index.d.ts.map +1 -0
  160. package/dist/modules/pdf/index.js +259 -0
  161. package/dist/modules/pdf/index.js.map +1 -0
  162. package/dist/modules/presentation/index.d.ts +247 -0
  163. package/dist/modules/presentation/index.d.ts.map +1 -0
  164. package/dist/modules/presentation/index.js +12657 -0
  165. package/dist/modules/presentation/index.js.map +1 -0
  166. package/dist/modules/queue/index.d.ts +129 -0
  167. package/dist/modules/queue/index.d.ts.map +1 -0
  168. package/dist/modules/queue/index.js +131 -0
  169. package/dist/modules/queue/index.js.map +1 -0
  170. package/dist/modules/rag/index.d.ts +250 -0
  171. package/dist/modules/rag/index.d.ts.map +1 -0
  172. package/dist/modules/rag/index.js +366 -0
  173. package/dist/modules/rag/index.js.map +1 -0
  174. package/dist/modules/scheduler/index.d.ts +216 -0
  175. package/dist/modules/scheduler/index.d.ts.map +1 -0
  176. package/dist/modules/scheduler/index.js +153 -0
  177. package/dist/modules/scheduler/index.js.map +1 -0
  178. package/dist/modules/skills/index.d.ts +205 -0
  179. package/dist/modules/skills/index.d.ts.map +1 -0
  180. package/dist/modules/skills/index.js +203 -0
  181. package/dist/modules/skills/index.js.map +1 -0
  182. package/dist/modules/tasks/index.d.ts +287 -0
  183. package/dist/modules/tasks/index.d.ts.map +1 -0
  184. package/dist/modules/tasks/index.js +207 -0
  185. package/dist/modules/tasks/index.js.map +1 -0
  186. package/dist/modules/vector-store/index.d.ts +3 -0
  187. package/dist/modules/vector-store/index.js +3 -0
  188. package/dist/modules/web-fetch/index.d.ts +99 -0
  189. package/dist/modules/web-fetch/index.d.ts.map +1 -0
  190. package/dist/modules/web-fetch/index.js +242 -0
  191. package/dist/modules/web-fetch/index.js.map +1 -0
  192. package/dist/object-artifact-store-CMTzCm_G.d.ts +7 -0
  193. package/dist/object-artifact-store-CMTzCm_G.d.ts.map +1 -0
  194. package/dist/object-artifact-store-wZ2j9cto.js +28 -0
  195. package/dist/object-artifact-store-wZ2j9cto.js.map +1 -0
  196. package/dist/pinecone-umY4t6OF.js +190 -0
  197. package/dist/pinecone-umY4t6OF.js.map +1 -0
  198. package/dist/provider-CgDAlg6K.js +34 -0
  199. package/dist/provider-CgDAlg6K.js.map +1 -0
  200. package/dist/qdrant-DMp4NhKR.js +253 -0
  201. package/dist/qdrant-DMp4NhKR.js.map +1 -0
  202. package/dist/resend-BAC38_dA.js +155 -0
  203. package/dist/resend-BAC38_dA.js.map +1 -0
  204. package/dist/s3-CsOaPWMP.js +955 -0
  205. package/dist/s3-CsOaPWMP.js.map +1 -0
  206. package/dist/schemas-ChOAhdo9.js +192 -0
  207. package/dist/schemas-ChOAhdo9.js.map +1 -0
  208. package/dist/slack-Di5BBNpt.js +1455 -0
  209. package/dist/slack-Di5BBNpt.js.map +1 -0
  210. package/dist/sqs-DCwS1i2N.js +225 -0
  211. package/dist/sqs-DCwS1i2N.js.map +1 -0
  212. package/dist/supabase-vector-Dpp9mmJR.js +218 -0
  213. package/dist/supabase-vector-Dpp9mmJR.js.map +1 -0
  214. package/dist/tanstack/index.d.ts +15 -0
  215. package/dist/tanstack/index.d.ts.map +1 -0
  216. package/dist/tanstack/index.js +28 -0
  217. package/dist/tanstack/index.js.map +1 -0
  218. package/dist/teams-DYAHNb39.js +835 -0
  219. package/dist/teams-DYAHNb39.js.map +1 -0
  220. package/dist/telegram-DDXWzkfL.js +734 -0
  221. package/dist/telegram-DDXWzkfL.js.map +1 -0
  222. package/dist/textract-CPLiB22H.js +554 -0
  223. package/dist/textract-CPLiB22H.js.map +1 -0
  224. package/dist/transport-B4vn-XiQ.js +157 -0
  225. package/dist/transport-B4vn-XiQ.js.map +1 -0
  226. package/dist/transport-i96ACAI_.d.ts +46 -0
  227. package/dist/transport-i96ACAI_.d.ts.map +1 -0
  228. package/dist/types-Ccb0DXY9.d.ts +150 -0
  229. package/dist/types-Ccb0DXY9.d.ts.map +1 -0
  230. package/dist/unique-EwBH1JPB.js +19 -0
  231. package/dist/unique-EwBH1JPB.js.map +1 -0
  232. package/dist/vector-store-C3nEO80e.js +193 -0
  233. package/dist/vector-store-C3nEO80e.js.map +1 -0
  234. package/dist/vendors/amazon-sp-api/index.d.ts +526 -0
  235. package/dist/vendors/amazon-sp-api/index.d.ts.map +1 -0
  236. package/dist/vendors/amazon-sp-api/index.js +975 -0
  237. package/dist/vendors/amazon-sp-api/index.js.map +1 -0
  238. package/dist/vendors/bedrock-agentcore-browser/index.d.ts +2 -0
  239. package/dist/vendors/bedrock-agentcore-browser/index.js +2 -0
  240. package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts +228 -0
  241. package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts.map +1 -0
  242. package/dist/vendors/bedrock-agentcore-code-interpreter/index.js +2 -0
  243. package/dist/vendors/cloudflare-browser/index.d.ts +2 -0
  244. package/dist/vendors/cloudflare-browser/index.js +2 -0
  245. package/dist/vendors/cloudflare-email/index.d.ts +260 -0
  246. package/dist/vendors/cloudflare-email/index.d.ts.map +1 -0
  247. package/dist/vendors/cloudflare-email/index.js +3 -0
  248. package/dist/vendors/cloudflare-sandbox/index.d.ts +565 -0
  249. package/dist/vendors/cloudflare-sandbox/index.d.ts.map +1 -0
  250. package/dist/vendors/cloudflare-sandbox/index.js +2 -0
  251. package/dist/vendors/eventbridge-scheduler/index.d.ts +2 -0
  252. package/dist/vendors/eventbridge-scheduler/index.js +2 -0
  253. package/dist/vendors/gotenberg/index.d.ts +306 -0
  254. package/dist/vendors/gotenberg/index.d.ts.map +1 -0
  255. package/dist/vendors/gotenberg/index.js +2 -0
  256. package/dist/vendors/imessage/index.d.ts +420 -0
  257. package/dist/vendors/imessage/index.d.ts.map +1 -0
  258. package/dist/vendors/imessage/index.js +4 -0
  259. package/dist/vendors/katana/index.d.ts +1570 -0
  260. package/dist/vendors/katana/index.d.ts.map +1 -0
  261. package/dist/vendors/katana/index.js +1639 -0
  262. package/dist/vendors/katana/index.js.map +1 -0
  263. package/dist/vendors/mastra-vector/index.d.ts +120 -0
  264. package/dist/vendors/mastra-vector/index.d.ts.map +1 -0
  265. package/dist/vendors/mastra-vector/index.js +3 -0
  266. package/dist/vendors/pinecone/index.d.ts +75 -0
  267. package/dist/vendors/pinecone/index.d.ts.map +1 -0
  268. package/dist/vendors/pinecone/index.js +3 -0
  269. package/dist/vendors/qdrant/index.d.ts +75 -0
  270. package/dist/vendors/qdrant/index.d.ts.map +1 -0
  271. package/dist/vendors/qdrant/index.js +3 -0
  272. package/dist/vendors/resend/index.d.ts +3 -0
  273. package/dist/vendors/resend/index.js +3 -0
  274. package/dist/vendors/s3/index.d.ts +2 -0
  275. package/dist/vendors/s3/index.js +2 -0
  276. package/dist/vendors/slack/index.d.ts +576 -0
  277. package/dist/vendors/slack/index.d.ts.map +1 -0
  278. package/dist/vendors/slack/index.js +3 -0
  279. package/dist/vendors/sqs/index.d.ts +2 -0
  280. package/dist/vendors/sqs/index.js +2 -0
  281. package/dist/vendors/supabase-vector/index.d.ts +89 -0
  282. package/dist/vendors/supabase-vector/index.d.ts.map +1 -0
  283. package/dist/vendors/supabase-vector/index.js +3 -0
  284. package/dist/vendors/teams/index.d.ts +303 -0
  285. package/dist/vendors/teams/index.d.ts.map +1 -0
  286. package/dist/vendors/teams/index.js +3 -0
  287. package/dist/vendors/telegram/index.d.ts +319 -0
  288. package/dist/vendors/telegram/index.d.ts.map +1 -0
  289. package/dist/vendors/telegram/index.js +3 -0
  290. package/dist/vendors/textract/index.d.ts +2 -0
  291. package/dist/vendors/textract/index.js +2 -0
  292. package/dist/vendors/woocommerce/index.d.ts +1700 -0
  293. package/dist/vendors/woocommerce/index.d.ts.map +1 -0
  294. package/dist/vendors/woocommerce/index.js +1427 -0
  295. package/dist/vendors/woocommerce/index.js.map +1 -0
  296. package/dist/with-auth-CpKqTrGK.js +240 -0
  297. package/dist/with-auth-CpKqTrGK.js.map +1 -0
  298. package/logos/LUCIDE-ATTRIBUTION.txt +4 -0
  299. package/logos/README.md +89 -0
  300. package/logos/amazon.svg +6 -0
  301. package/logos/artifacts.svg +9 -0
  302. package/logos/browser.svg +9 -0
  303. package/logos/calendar.svg +15 -0
  304. package/logos/cloudflare-browser.svg +5 -0
  305. package/logos/cloudflare-email.svg +5 -0
  306. package/logos/cloudflare.svg +4 -0
  307. package/logos/code-sandbox.svg +8 -0
  308. package/logos/content-type.svg +10 -0
  309. package/logos/crypto.svg +7 -0
  310. package/logos/document-extract.svg +12 -0
  311. package/logos/document-render.svg +8 -0
  312. package/logos/document.svg +10 -0
  313. package/logos/email-message.svg +8 -0
  314. package/logos/email.svg +7 -0
  315. package/logos/file-convert.svg +9 -0
  316. package/logos/files.svg +6 -0
  317. package/logos/gotenberg.svg +340 -0
  318. package/logos/image.svg +8 -0
  319. package/logos/imessage.svg +7 -0
  320. package/logos/katana.svg +13 -0
  321. package/logos/mastra.svg +7 -0
  322. package/logos/messaging.svg +7 -0
  323. package/logos/pack-logos.json +48 -0
  324. package/logos/pdf.svg +10 -0
  325. package/logos/pinecone.svg +25 -0
  326. package/logos/presentation.svg +8 -0
  327. package/logos/qdrant.svg +4 -0
  328. package/logos/queue.svg +11 -0
  329. package/logos/rag.svg +18 -0
  330. package/logos/resend.svg +5 -0
  331. package/logos/scheduler.svg +7 -0
  332. package/logos/skills.svg +10 -0
  333. package/logos/slack.svg +14 -0
  334. package/logos/supabase.svg +4 -0
  335. package/logos/tasks.svg +10 -0
  336. package/logos/teams.svg +6 -0
  337. package/logos/telegram.svg +10 -0
  338. package/logos/textract.svg +5 -0
  339. package/logos/vector-store.svg +8 -0
  340. package/logos/web-fetch.svg +8 -0
  341. package/logos/woocommerce.svg +4 -0
  342. package/package.json +373 -0
@@ -0,0 +1,253 @@
1
+ import { t as ToolError } from "./errors-DoSpNHvs.js";
2
+ import { n as defineModule, r as defineTool } from "./define-CvpJ_pNP.js";
3
+ import { n as requireAuth } from "./provider-CgDAlg6K.js";
4
+ import { t as HttpService } from "./http-service-DDNCO1s4.js";
5
+ import { S as requireCollection, _ as parseMetadata, a as deleteVectorsOutputSchema, c as upsertVectorsInputSchema, h as mergeQdrantFilter, i as deleteVectorsInputSchema, l as upsertVectorsOutputSchema, m as mapVectorHttpStatus, o as queryVectorsInputSchema, s as queryVectorsOutputSchema, u as vectorDefaultFilterSchema, v as parseNumberArray, w as stampDefaultFilterMetadata, x as parseUpstreamMessage, y as parsePointId } from "./schemas-ChOAhdo9.js";
6
+ import { isNumber, isPlainObject, isString } from "es-toolkit";
7
+ import { z } from "zod";
8
+ import { createHash } from "node:crypto";
9
+ //#region src/vendors/qdrant/contracts.ts
10
+ const qdrantAuthSchema = z.object({
11
+ base_url: z.string().url().describe("Qdrant HTTP origin, for example http://127.0.0.1:6333 or https://xxx.cloud.qdrant.io"),
12
+ api_key: z.string().min(1).optional().describe("Optional Qdrant API key"),
13
+ default_collection: z.string().min(1).optional().describe("Default collection name when tool input omits collection"),
14
+ default_filter: vectorDefaultFilterSchema.optional().describe("Host-bound filter always applied on query (flat equality or native Qdrant must/should); flat keys stamped on upsert")
15
+ });
16
+ //#endregion
17
+ //#region src/vendors/qdrant/domain.ts
18
+ /**
19
+ * Qdrant point-id helpers. Qdrant only accepts unsigned integers or UUIDs;
20
+ * free-form string ids (e.g. RAG `doc#0`) are mapped to a deterministic UUID
21
+ * and the original id is stored under `__logical_id` in the payload.
22
+ */
23
+ const QDRANT_LOGICAL_ID_KEY = "__logical_id";
24
+ const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
25
+ const UINT_RE = /^(0|[1-9]\d*)$/;
26
+ /** Deterministic UUID (SHA-256 → RFC-like layout) for free-form logical ids. */
27
+ function hashToUuid(value) {
28
+ const bytes = Uint8Array.from(createHash("sha256").update(value).digest().subarray(0, 16));
29
+ const versionByte = bytes.at(6);
30
+ const variantByte = bytes.at(8);
31
+ if (versionByte === void 0 || variantByte === void 0) throw new Error("SHA-256 digest shorter than 16 bytes");
32
+ bytes[6] = versionByte & 15 | 80;
33
+ bytes[8] = variantByte & 63 | 128;
34
+ const hex = Buffer.from(bytes).toString("hex");
35
+ return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
36
+ }
37
+ /** Map package logical point id → Qdrant wire id. */
38
+ function toQdrantPointId(logicalId) {
39
+ if (UINT_RE.test(logicalId)) {
40
+ const n = Number(logicalId);
41
+ if (Number.isSafeInteger(n) && n >= 0) return n;
42
+ }
43
+ if (UUID_RE.test(logicalId)) return logicalId.toLowerCase();
44
+ return hashToUuid(logicalId);
45
+ }
46
+ function isNativeQdrantId(logicalId) {
47
+ if (UINT_RE.test(logicalId)) {
48
+ const n = Number(logicalId);
49
+ return Number.isSafeInteger(n) && n >= 0;
50
+ }
51
+ return UUID_RE.test(logicalId);
52
+ }
53
+ /** Prefer payload `__logical_id` when present so free-form ids round-trip. */
54
+ function resolveLogicalPointId(wireId, payload) {
55
+ const logical = payload?.[QDRANT_LOGICAL_ID_KEY];
56
+ if (isString(logical) && logical.length > 0) return logical;
57
+ return wireId;
58
+ }
59
+ function stripLogicalIdPayload(payload) {
60
+ if (!payload) return void 0;
61
+ if (!("__logical_id" in payload)) return payload;
62
+ const next = {};
63
+ for (const [key, value] of Object.entries(payload)) {
64
+ if (key === "__logical_id") continue;
65
+ next[key] = value;
66
+ }
67
+ return Object.keys(next).length > 0 ? next : void 0;
68
+ }
69
+ //#endregion
70
+ //#region src/vendors/qdrant/client.ts
71
+ /**
72
+ * Qdrant REST vendor client.
73
+ * Host: `new QdrantClient(auth)`. Agent tools: `fromContext(ctx)`.
74
+ * @see https://api.qdrant.tech/api-reference
75
+ */
76
+ var QdrantClient = class QdrantClient {
77
+ #http;
78
+ #defaultCollection;
79
+ #defaultFilter;
80
+ constructor(auth, options = {}) {
81
+ const parsed = qdrantAuthSchema.safeParse(auth);
82
+ if (!parsed.success) throw new ToolError("Invalid Qdrant auth credentials", {
83
+ code: "bad_auth",
84
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
85
+ });
86
+ this.#defaultCollection = parsed.data.default_collection;
87
+ this.#defaultFilter = parsed.data.default_filter;
88
+ const headers = { "Content-Type": "application/json" };
89
+ if (parsed.data.api_key) headers["api-key"] = parsed.data.api_key;
90
+ const httpOptions = {
91
+ baseURL: parsed.data.base_url,
92
+ headers,
93
+ label: "Qdrant"
94
+ };
95
+ if (options.fetch) httpOptions.fetch = options.fetch;
96
+ if (options.signal) httpOptions.signal = options.signal;
97
+ this.#http = new HttpService(httpOptions);
98
+ }
99
+ static fromContext(ctx) {
100
+ const auth = requireAuth(ctx, qdrantAuthSchema);
101
+ const options = {};
102
+ if (ctx.fetch) options.fetch = ctx.fetch;
103
+ if (ctx.signal) options.signal = ctx.signal;
104
+ return new QdrantClient(auth, options);
105
+ }
106
+ async upsert(input) {
107
+ const collection = requireCollection(input.collection, this.#defaultCollection, "Qdrant upsert");
108
+ const points = input.vectors.map((point) => {
109
+ const wireId = toQdrantPointId(point.id);
110
+ const stamped = stampDefaultFilterMetadata(point.metadata, this.#defaultFilter);
111
+ const payload = stamped ? { ...stamped } : {};
112
+ if (!isNativeQdrantId(point.id)) payload[QDRANT_LOGICAL_ID_KEY] = point.id;
113
+ const row = {
114
+ id: wireId,
115
+ vector: point.values
116
+ };
117
+ if (Object.keys(payload).length > 0) row["payload"] = payload;
118
+ return row;
119
+ });
120
+ const res = await this.#http.put(`/collections/${encodeURIComponent(collection)}/points`, { points }, {
121
+ label: "Qdrant upsert",
122
+ noThrow: true,
123
+ query: { wait: "true" }
124
+ });
125
+ if (!res.ok) throw new ToolError(parseUpstreamMessage(res.data, `Qdrant upsert failed with HTTP ${res.status}`), {
126
+ code: mapVectorHttpStatus(res.status),
127
+ details: { status: res.status }
128
+ });
129
+ return {
130
+ upserted: input.vectors.length,
131
+ collection
132
+ };
133
+ }
134
+ async query(input) {
135
+ const collection = requireCollection(input.collection, this.#defaultCollection, "Qdrant query");
136
+ const topK = input.top_k ?? 8;
137
+ const includeMetadata = input.include_metadata !== false;
138
+ const body = {
139
+ vector: input.vector,
140
+ limit: topK,
141
+ with_payload: true,
142
+ with_vector: input.include_values === true
143
+ };
144
+ const filter = mergeQdrantFilter(this.#defaultFilter, input.filter);
145
+ if (filter) body["filter"] = filter;
146
+ const res = await this.#http.post(`/collections/${encodeURIComponent(collection)}/points/search`, body, {
147
+ label: "Qdrant search",
148
+ noThrow: true
149
+ });
150
+ if (!res.ok) throw new ToolError(parseUpstreamMessage(res.data, `Qdrant search failed with HTTP ${res.status}`), {
151
+ code: mapVectorHttpStatus(res.status),
152
+ details: { status: res.status }
153
+ });
154
+ const result = isPlainObject(res.data) ? res.data["result"] : void 0;
155
+ const rows = Array.isArray(result) ? result : [];
156
+ const matches = [];
157
+ for (const row of rows) {
158
+ if (!isPlainObject(row)) continue;
159
+ const wireId = parsePointId(row["id"]);
160
+ if (!wireId) continue;
161
+ const rawPayload = isPlainObject(row["payload"]) ? row["payload"] : void 0;
162
+ const score = isNumber(row["score"]) ? row["score"] : 0;
163
+ const match = {
164
+ id: resolveLogicalPointId(wireId, rawPayload),
165
+ score
166
+ };
167
+ if (includeMetadata) {
168
+ const meta = stripLogicalIdPayload(parseMetadata(row["payload"]));
169
+ if (meta) match.metadata = meta;
170
+ }
171
+ if (input.include_values === true) {
172
+ const values = parseNumberArray(row["vector"]);
173
+ if (values) match.values = values;
174
+ }
175
+ matches.push(match);
176
+ }
177
+ return {
178
+ matches,
179
+ collection
180
+ };
181
+ }
182
+ async delete(input) {
183
+ const collection = requireCollection(input.collection, this.#defaultCollection, "Qdrant delete");
184
+ const points = input.ids.map((id) => toQdrantPointId(id));
185
+ const res = await this.#http.post(`/collections/${encodeURIComponent(collection)}/points/delete`, { points }, {
186
+ label: "Qdrant delete",
187
+ noThrow: true,
188
+ query: { wait: "true" }
189
+ });
190
+ if (!res.ok) throw new ToolError(parseUpstreamMessage(res.data, `Qdrant delete failed with HTTP ${res.status}`), {
191
+ code: mapVectorHttpStatus(res.status),
192
+ details: { status: res.status }
193
+ });
194
+ return {
195
+ deleted: input.ids.length,
196
+ collection
197
+ };
198
+ }
199
+ };
200
+ //#endregion
201
+ //#region src/vendors/qdrant/module.ts
202
+ const qdrantUpsertTool = defineTool({
203
+ id: "qdrant-upsert",
204
+ name: "qdrantUpsert",
205
+ description: "Upsert points into a Qdrant collection. Omit collection only when a default collection is configured.",
206
+ inputSchema: upsertVectorsInputSchema,
207
+ outputSchema: upsertVectorsOutputSchema,
208
+ sideEffect: "write",
209
+ runtime: "both",
210
+ execute: async (input, ctx) => QdrantClient.fromContext(ctx).upsert(input)
211
+ });
212
+ const qdrantQueryTool = defineTool({
213
+ id: "qdrant-query",
214
+ name: "qdrantQuery",
215
+ description: "Nearest-neighbor search in a Qdrant collection.",
216
+ inputSchema: queryVectorsInputSchema,
217
+ outputSchema: queryVectorsOutputSchema,
218
+ sideEffect: "read",
219
+ runtime: "both",
220
+ execute: async (input, ctx) => QdrantClient.fromContext(ctx).query(input)
221
+ });
222
+ const qdrantDeleteTool = defineTool({
223
+ id: "qdrant-delete",
224
+ name: "qdrantDelete",
225
+ description: "Delete points by id from a Qdrant collection.",
226
+ inputSchema: deleteVectorsInputSchema,
227
+ outputSchema: deleteVectorsOutputSchema,
228
+ sideEffect: "delete",
229
+ runtime: "both",
230
+ execute: async (input, ctx) => QdrantClient.fromContext(ctx).delete(input)
231
+ });
232
+ const qdrantModule = defineModule({
233
+ id: "qdrant",
234
+ title: "Qdrant",
235
+ description: "Qdrant vector database REST: upsert, query, and delete points in a collection.",
236
+ runtime: "both",
237
+ auth: {
238
+ type: "custom",
239
+ schema: qdrantAuthSchema
240
+ },
241
+ categories: ["ai", "vector"],
242
+ classification: "pii",
243
+ tags: ["qdrant"],
244
+ tools: [
245
+ qdrantUpsertTool,
246
+ qdrantQueryTool,
247
+ qdrantDeleteTool
248
+ ]
249
+ });
250
+ //#endregion
251
+ export { QdrantClient as a, qdrantUpsertTool as i, qdrantModule as n, qdrantAuthSchema as o, qdrantQueryTool as r, qdrantDeleteTool as t };
252
+
253
+ //# sourceMappingURL=qdrant-DMp4NhKR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qdrant-DMp4NhKR.js","names":["#http","#defaultCollection","#defaultFilter"],"sources":["../src/vendors/qdrant/contracts.ts","../src/vendors/qdrant/domain.ts","../src/vendors/qdrant/client.ts","../src/vendors/qdrant/module.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { vectorDefaultFilterSchema } from '../_vector'\n\nexport {\n\tMAX_TOP_K,\n\tMAX_VECTOR_BATCH,\n\tMAX_VECTOR_DIMENSIONS,\n\tdeleteVectorsInputSchema,\n\tdeleteVectorsOutputSchema,\n\tqueryVectorsInputSchema,\n\tqueryVectorsOutputSchema,\n\tupsertVectorsInputSchema,\n\tupsertVectorsOutputSchema,\n\tvectorMatchSchema,\n\tvectorMetadataSchema,\n\tvectorPointSchema\n} from '../_vector'\nexport type {\n\tDeleteVectorsInput,\n\tDeleteVectorsOutput,\n\tQueryVectorsInput,\n\tQueryVectorsOutput,\n\tUpsertVectorsInput,\n\tUpsertVectorsOutput,\n\tVectorMatch,\n\tVectorMetadata,\n\tVectorPoint\n} from '../_vector'\n\nexport const qdrantAuthSchema = z.object({\n\tbase_url: z\n\t\t.string()\n\t\t.url()\n\t\t.describe('Qdrant HTTP origin, for example http://127.0.0.1:6333 or https://xxx.cloud.qdrant.io'),\n\tapi_key: z.string().min(1).optional().describe('Optional Qdrant API key'),\n\tdefault_collection: z.string().min(1).optional().describe('Default collection name when tool input omits collection'),\n\tdefault_filter: vectorDefaultFilterSchema\n\t\t.optional()\n\t\t.describe(\n\t\t\t'Host-bound filter always applied on query (flat equality or native Qdrant must/should); flat keys stamped on upsert'\n\t\t)\n})\n\nexport type QdrantAuth = z.infer<typeof qdrantAuthSchema>\n","/**\n * Qdrant point-id helpers. Qdrant only accepts unsigned integers or UUIDs;\n * free-form string ids (e.g. RAG `doc#0`) are mapped to a deterministic UUID\n * and the original id is stored under `__logical_id` in the payload.\n */\n\nimport { createHash } from 'node:crypto'\n\nimport { isString } from 'es-toolkit'\n\nexport const QDRANT_LOGICAL_ID_KEY = '__logical_id'\n\nconst UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i\nconst UINT_RE = /^(0|[1-9]\\d*)$/\n\n/** Deterministic UUID (SHA-256 → RFC-like layout) for free-form logical ids. */\nexport function hashToUuid(value: string): string {\n\tconst bytes = Uint8Array.from(createHash('sha256').update(value).digest().subarray(0, 16))\n\tconst versionByte = bytes.at(6)\n\tconst variantByte = bytes.at(8)\n\tif (versionByte === undefined || variantByte === undefined) {\n\t\tthrow new Error('SHA-256 digest shorter than 16 bytes')\n\t}\n\tbytes[6] = (versionByte & 0x0f) | 0x50\n\tbytes[8] = (variantByte & 0x3f) | 0x80\n\tconst hex = Buffer.from(bytes).toString('hex')\n\treturn `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`\n}\n\n/** Map package logical point id → Qdrant wire id. */\nexport function toQdrantPointId(logicalId: string): string | number {\n\tif (UINT_RE.test(logicalId)) {\n\t\tconst n = Number(logicalId)\n\t\tif (Number.isSafeInteger(n) && n >= 0) return n\n\t}\n\tif (UUID_RE.test(logicalId)) return logicalId.toLowerCase()\n\treturn hashToUuid(logicalId)\n}\n\nexport function isNativeQdrantId(logicalId: string): boolean {\n\tif (UINT_RE.test(logicalId)) {\n\t\tconst n = Number(logicalId)\n\t\treturn Number.isSafeInteger(n) && n >= 0\n\t}\n\treturn UUID_RE.test(logicalId)\n}\n\n/** Prefer payload `__logical_id` when present so free-form ids round-trip. */\nexport function resolveLogicalPointId(wireId: string, payload: Record<string, unknown> | undefined): string {\n\tconst logical = payload?.[QDRANT_LOGICAL_ID_KEY]\n\tif (isString(logical) && logical.length > 0) return logical\n\treturn wireId\n}\n\nexport function stripLogicalIdPayload(\n\tpayload: Record<string, string | number | boolean | null> | undefined\n): Record<string, string | number | boolean | null> | undefined {\n\tif (!payload) return undefined\n\tif (!(QDRANT_LOGICAL_ID_KEY in payload)) return payload\n\tconst next: Record<string, string | number | boolean | null> = {}\n\tfor (const [key, value] of Object.entries(payload)) {\n\t\tif (key === QDRANT_LOGICAL_ID_KEY) continue\n\t\tnext[key] = value\n\t}\n\treturn Object.keys(next).length > 0 ? next : undefined\n}\n","/**\n * Qdrant REST vendor client.\n * Host: `new QdrantClient(auth)`. Agent tools: `fromContext(ctx)`.\n * @see https://api.qdrant.tech/api-reference\n */\n\nimport { isNumber, isPlainObject } from 'es-toolkit'\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { HttpService } from '../../transport/http-service'\nimport type { HttpServiceOptions } from '../../transport/http-service'\nimport {\n\tmapVectorHttpStatus,\n\tmergeQdrantFilter,\n\tparseMetadata,\n\tparseNumberArray,\n\tparsePointId,\n\tparseUpstreamMessage,\n\trequireCollection,\n\tstampDefaultFilterMetadata\n} from '../_vector/domain'\nimport type { VectorDefaultFilter } from '../_vector/domain'\nimport type {\n\tDeleteVectorsInput,\n\tDeleteVectorsOutput,\n\tQdrantAuth,\n\tQueryVectorsInput,\n\tQueryVectorsOutput,\n\tUpsertVectorsInput,\n\tUpsertVectorsOutput,\n\tVectorMatch\n} from './contracts'\nimport { qdrantAuthSchema } from './contracts'\nimport {\n\tisNativeQdrantId,\n\tQDRANT_LOGICAL_ID_KEY,\n\tresolveLogicalPointId,\n\tstripLogicalIdPayload,\n\ttoQdrantPointId\n} from './domain'\n\nexport type QdrantClientOptions = {\n\tfetch?: HttpServiceOptions['fetch'] | undefined\n\tsignal?: HttpServiceOptions['signal'] | undefined\n}\n\nexport class QdrantClient {\n\treadonly #http: HttpService\n\treadonly #defaultCollection: string | undefined\n\treadonly #defaultFilter: VectorDefaultFilter | undefined\n\n\tconstructor(auth: QdrantAuth, options: QdrantClientOptions = {}) {\n\t\tconst parsed = qdrantAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid Qdrant auth credentials', {\n\t\t\t\tcode: 'bad_auth',\n\t\t\t\tdetails: { issues: parsed.error.issues.map((issue) => issue.message) }\n\t\t\t})\n\t\t}\n\t\tthis.#defaultCollection = parsed.data.default_collection\n\t\tthis.#defaultFilter = parsed.data.default_filter\n\t\tconst headers: Record<string, string> = { 'Content-Type': 'application/json' }\n\t\tif (parsed.data.api_key) headers['api-key'] = parsed.data.api_key\n\t\tconst httpOptions: HttpServiceOptions = {\n\t\t\tbaseURL: parsed.data.base_url,\n\t\t\theaders,\n\t\t\tlabel: 'Qdrant'\n\t\t}\n\t\tif (options.fetch) httpOptions.fetch = options.fetch\n\t\tif (options.signal) httpOptions.signal = options.signal\n\t\tthis.#http = new HttpService(httpOptions)\n\t}\n\n\tstatic fromContext(ctx: ToolContext): QdrantClient {\n\t\tconst auth = requireAuth(ctx, qdrantAuthSchema)\n\t\tconst options: QdrantClientOptions = {}\n\t\tif (ctx.fetch) options.fetch = ctx.fetch\n\t\tif (ctx.signal) options.signal = ctx.signal\n\t\treturn new QdrantClient(auth, options)\n\t}\n\n\tasync upsert(input: UpsertVectorsInput): Promise<UpsertVectorsOutput> {\n\t\tconst collection = requireCollection(input.collection, this.#defaultCollection, 'Qdrant upsert')\n\t\tconst points = input.vectors.map((point) => {\n\t\t\tconst wireId = toQdrantPointId(point.id)\n\t\t\tconst stamped = stampDefaultFilterMetadata(point.metadata, this.#defaultFilter)\n\t\t\tconst payload: Record<string, string | number | boolean | null> = stamped ? { ...stamped } : {}\n\t\t\tif (!isNativeQdrantId(point.id)) {\n\t\t\t\tpayload[QDRANT_LOGICAL_ID_KEY] = point.id\n\t\t\t}\n\t\t\tconst row: Record<string, unknown> = { id: wireId, vector: point.values }\n\t\t\tif (Object.keys(payload).length > 0) row['payload'] = payload\n\t\t\treturn row\n\t\t})\n\t\tconst res = await this.#http.put(\n\t\t\t`/collections/${encodeURIComponent(collection)}/points`,\n\t\t\t{ points },\n\t\t\t{ label: 'Qdrant upsert', noThrow: true, query: { wait: 'true' } }\n\t\t)\n\t\tif (!res.ok) {\n\t\t\tthrow new ToolError(parseUpstreamMessage(res.data, `Qdrant upsert failed with HTTP ${res.status}`), {\n\t\t\t\tcode: mapVectorHttpStatus(res.status),\n\t\t\t\tdetails: { status: res.status }\n\t\t\t})\n\t\t}\n\t\treturn { upserted: input.vectors.length, collection }\n\t}\n\n\tasync query(input: QueryVectorsInput): Promise<QueryVectorsOutput> {\n\t\tconst collection = requireCollection(input.collection, this.#defaultCollection, 'Qdrant query')\n\t\tconst topK = input.top_k ?? 8\n\t\tconst includeMetadata = input.include_metadata !== false\n\t\t// Always pull payload so free-form logical ids can be restored.\n\t\tconst body: Record<string, unknown> = {\n\t\t\tvector: input.vector,\n\t\t\tlimit: topK,\n\t\t\twith_payload: true,\n\t\t\twith_vector: input.include_values === true\n\t\t}\n\t\tconst filter = mergeQdrantFilter(this.#defaultFilter, input.filter)\n\t\tif (filter) body['filter'] = filter\n\n\t\tconst res = await this.#http.post(`/collections/${encodeURIComponent(collection)}/points/search`, body, {\n\t\t\tlabel: 'Qdrant search',\n\t\t\tnoThrow: true\n\t\t})\n\t\tif (!res.ok) {\n\t\t\tthrow new ToolError(parseUpstreamMessage(res.data, `Qdrant search failed with HTTP ${res.status}`), {\n\t\t\t\tcode: mapVectorHttpStatus(res.status),\n\t\t\t\tdetails: { status: res.status }\n\t\t\t})\n\t\t}\n\n\t\tconst result = isPlainObject(res.data) ? res.data['result'] : undefined\n\t\tconst rows = Array.isArray(result) ? result : []\n\t\tconst matches: VectorMatch[] = []\n\t\tfor (const row of rows) {\n\t\t\tif (!isPlainObject(row)) continue\n\t\t\tconst wireId = parsePointId(row['id'])\n\t\t\tif (!wireId) continue\n\t\t\tconst rawPayload = isPlainObject(row['payload']) ? row['payload'] : undefined\n\t\t\tconst score = isNumber(row['score']) ? row['score'] : 0\n\t\t\tconst id = resolveLogicalPointId(wireId, rawPayload)\n\t\t\tconst match: VectorMatch = { id, score }\n\t\t\tif (includeMetadata) {\n\t\t\t\tconst meta = stripLogicalIdPayload(parseMetadata(row['payload']))\n\t\t\t\tif (meta) match.metadata = meta\n\t\t\t}\n\t\t\tif (input.include_values === true) {\n\t\t\t\tconst values = parseNumberArray(row['vector'])\n\t\t\t\tif (values) match.values = values\n\t\t\t}\n\t\t\tmatches.push(match)\n\t\t}\n\t\treturn { matches, collection }\n\t}\n\n\tasync delete(input: DeleteVectorsInput): Promise<DeleteVectorsOutput> {\n\t\tconst collection = requireCollection(input.collection, this.#defaultCollection, 'Qdrant delete')\n\t\tconst points = input.ids.map((id) => toQdrantPointId(id))\n\t\tconst res = await this.#http.post(\n\t\t\t`/collections/${encodeURIComponent(collection)}/points/delete`,\n\t\t\t{ points },\n\t\t\t{ label: 'Qdrant delete', noThrow: true, query: { wait: 'true' } }\n\t\t)\n\t\tif (!res.ok) {\n\t\t\tthrow new ToolError(parseUpstreamMessage(res.data, `Qdrant delete failed with HTTP ${res.status}`), {\n\t\t\t\tcode: mapVectorHttpStatus(res.status),\n\t\t\t\tdetails: { status: res.status }\n\t\t\t})\n\t\t}\n\t\treturn { deleted: input.ids.length, collection }\n\t}\n}\n","import { defineModule, defineTool } from '../../core/define'\nimport { QdrantClient } from './client'\nimport {\n\tdeleteVectorsInputSchema,\n\tdeleteVectorsOutputSchema,\n\tqdrantAuthSchema,\n\tqueryVectorsInputSchema,\n\tqueryVectorsOutputSchema,\n\tupsertVectorsInputSchema,\n\tupsertVectorsOutputSchema\n} from './contracts'\n\nexport const qdrantUpsertTool = defineTool({\n\tid: 'qdrant-upsert',\n\tname: 'qdrantUpsert',\n\tdescription: 'Upsert points into a Qdrant collection. Omit collection only when a default collection is configured.',\n\tinputSchema: upsertVectorsInputSchema,\n\toutputSchema: upsertVectorsOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => QdrantClient.fromContext(ctx).upsert(input)\n})\n\nexport const qdrantQueryTool = defineTool({\n\tid: 'qdrant-query',\n\tname: 'qdrantQuery',\n\tdescription: 'Nearest-neighbor search in a Qdrant collection.',\n\tinputSchema: queryVectorsInputSchema,\n\toutputSchema: queryVectorsOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => QdrantClient.fromContext(ctx).query(input)\n})\n\nexport const qdrantDeleteTool = defineTool({\n\tid: 'qdrant-delete',\n\tname: 'qdrantDelete',\n\tdescription: 'Delete points by id from a Qdrant collection.',\n\tinputSchema: deleteVectorsInputSchema,\n\toutputSchema: deleteVectorsOutputSchema,\n\tsideEffect: 'delete',\n\truntime: 'both',\n\texecute: async (input, ctx) => QdrantClient.fromContext(ctx).delete(input)\n})\n\nexport const qdrantModule = defineModule({\n\tid: 'qdrant',\n\ttitle: 'Qdrant',\n\tdescription: 'Qdrant vector database REST: upsert, query, and delete points in a collection.',\n\truntime: 'both',\n\tauth: { type: 'custom', schema: qdrantAuthSchema },\n\tcategories: ['ai', 'vector'],\n\tclassification: 'pii',\n\ttags: ['qdrant'],\n\ttools: [qdrantUpsertTool, qdrantQueryTool, qdrantDeleteTool]\n})\n"],"mappings":"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"}
@@ -0,0 +1,155 @@
1
+ import { t as ToolError } from "./errors-DoSpNHvs.js";
2
+ import { n as defineModule, r as defineTool } from "./define-CvpJ_pNP.js";
3
+ import { n as requireAuth } from "./provider-CgDAlg6K.js";
4
+ import { t as HttpService } from "./http-service-DDNCO1s4.js";
5
+ import { n as runBatchItems, t as batchResultSchema } from "./batch-Co1ujeAW.js";
6
+ import { a as attachmentSchema, n as assertRecipientLimit, o as namedAddressSchema, s as addressList, t as assertEmailSize, u as addressToString } from "./limits-hjrO8zUG.js";
7
+ import { isPlainObject, isString, pick } from "es-toolkit";
8
+ import { z } from "zod";
9
+ //#region src/vendors/resend/contracts.ts
10
+ const resendAuthSchema = z.object({ api_key: z.string().min(1).describe("Resend API key") });
11
+ const resendSendInputSchema = z.object({
12
+ to: z.union([namedAddressSchema, z.array(namedAddressSchema).min(1).max(50)]).describe("Primary recipient address or list (max 50 combined to/cc/bcc)"),
13
+ from: namedAddressSchema.describe("Verified sender address on the sending domain"),
14
+ subject: z.string().min(1).max(998).describe("Email subject line"),
15
+ html: z.string().optional().describe("HTML body. Provide html and/or text"),
16
+ text: z.string().optional().describe("Plain text body. Provide html and/or text"),
17
+ cc: z.union([namedAddressSchema, z.array(namedAddressSchema).max(50)]).optional().describe("CC recipients"),
18
+ bcc: z.union([namedAddressSchema, z.array(namedAddressSchema).max(50)]).optional().describe("BCC recipients"),
19
+ reply_to: namedAddressSchema.optional().describe("Reply-To address"),
20
+ headers: z.record(z.string(), z.string()).optional().describe("Custom headers as a string map"),
21
+ attachments: z.array(attachmentSchema).max(32).optional().describe("Up to 32 base64 attachments. Total message must stay under 5 MiB")
22
+ }).refine((v) => Boolean(v.html?.trim() || v.text?.trim()), { message: "Provide html and/or text body" });
23
+ const resendSendOutputSchema = z.object({
24
+ success: z.boolean().describe("Whether Resend accepted the request"),
25
+ id: z.string().optional().describe("Resend message id when available")
26
+ });
27
+ const resendSendBatchInputSchema = z.object({ messages: z.array(resendSendInputSchema).min(1).max(20).describe("Messages to send (max 20)") });
28
+ const resendSendBatchOutputSchema = batchResultSchema(resendSendOutputSchema);
29
+ //#endregion
30
+ //#region src/vendors/resend/domain.ts
31
+ /**
32
+ * Resend payload shaping + response parse.
33
+ * Vertical helpers: `vendors/_email`.
34
+ */
35
+ function buildSendPayload(input) {
36
+ return {
37
+ ...pick(input, [
38
+ "subject",
39
+ "html",
40
+ "text",
41
+ "headers"
42
+ ]),
43
+ from: addressToString(input.from),
44
+ to: addressList(input.to),
45
+ cc: addressList(input.cc),
46
+ bcc: addressList(input.bcc),
47
+ ...input.reply_to && { reply_to: addressToString(input.reply_to) },
48
+ ...input.attachments && { attachments: input.attachments.map((att) => ({
49
+ filename: att.filename,
50
+ content: att.content,
51
+ content_type: att.type,
52
+ ...att.disposition && { content_disposition: att.disposition },
53
+ ...att.content_id && { content_id: att.content_id }
54
+ })) }
55
+ };
56
+ }
57
+ function preflightSend(input) {
58
+ assertRecipientLimit(input);
59
+ const payload = buildSendPayload(input);
60
+ assertEmailSize(payload, input.attachments?.map((a) => a.content));
61
+ return payload;
62
+ }
63
+ /** Map Resend `{ id }` success body to tool output. */
64
+ function parseSendResult(data) {
65
+ if (!isPlainObject(data)) throw new ToolError("Resend returned an unexpected payload", { code: "upstream" });
66
+ const id = data["id"];
67
+ return {
68
+ success: true,
69
+ ...isString(id) && id.length > 0 && { id }
70
+ };
71
+ }
72
+ //#endregion
73
+ //#region src/vendors/resend/client.ts
74
+ /**
75
+ * Resend vendor client.
76
+ * Host: `new ResendClient(auth)`. Agent tools: `fromContext(ctx)`.
77
+ */
78
+ var ResendClient = class ResendClient {
79
+ #http;
80
+ constructor(auth, options = {}) {
81
+ const parsed = resendAuthSchema.safeParse(auth);
82
+ if (!parsed.success) throw new ToolError("Invalid Resend auth credentials", {
83
+ code: "bad_auth",
84
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
85
+ });
86
+ this.#http = new HttpService({
87
+ ...options,
88
+ baseURL: "https://api.resend.com",
89
+ headers: {
90
+ Authorization: `Bearer ${parsed.data.api_key}`,
91
+ "Content-Type": "application/json"
92
+ },
93
+ label: "Resend"
94
+ });
95
+ }
96
+ static fromContext(ctx) {
97
+ const auth = requireAuth(ctx, resendAuthSchema);
98
+ return new ResendClient(auth, {
99
+ ...ctx.fetch && { fetch: ctx.fetch },
100
+ ...ctx.signal && { signal: ctx.signal }
101
+ });
102
+ }
103
+ /** POST /emails */
104
+ async send(input) {
105
+ const payload = preflightSend(input);
106
+ const { data } = await this.#http.post("/emails", payload, { label: "Resend send" });
107
+ return parseSendResult(data);
108
+ }
109
+ /** Sequential batch of independent sends (partial failure OK). */
110
+ async sendBatch(input) {
111
+ return runBatchItems(input.messages, (message) => this.send(message));
112
+ }
113
+ };
114
+ //#endregion
115
+ //#region src/vendors/resend/module.ts
116
+ /** Single-email send tool. Host binds auth via withAuth. */
117
+ const resendSendTool = defineTool({
118
+ id: "resend-send",
119
+ name: "resendSend",
120
+ description: "Send one email via Resend. Subject plus html and/or text. Optional cc, bcc, reply_to, headers, base64 attachments. Total under 5 MiB.",
121
+ inputSchema: resendSendInputSchema,
122
+ outputSchema: resendSendOutputSchema,
123
+ sideEffect: "send",
124
+ runtime: "both",
125
+ execute: async (input, ctx) => ResendClient.fromContext(ctx).send(input)
126
+ });
127
+ /** Batch send (max 20). Per-message success/error; does not abort the batch. */
128
+ const resendSendBatchTool = defineTool({
129
+ id: "resend-send-batch",
130
+ name: "resendSendBatch",
131
+ description: "Send up to 20 emails via Resend. Per-message success or error without aborting the batch.",
132
+ inputSchema: resendSendBatchInputSchema,
133
+ outputSchema: resendSendBatchOutputSchema,
134
+ sideEffect: "send",
135
+ runtime: "both",
136
+ execute: async (input, ctx) => ResendClient.fromContext(ctx).sendBatch(input)
137
+ });
138
+ const resendModule = defineModule({
139
+ id: "resend",
140
+ title: "Resend",
141
+ description: "Resend vendor pack: send one email or a batch (max 20). Not a multi-provider email seam.",
142
+ runtime: "both",
143
+ auth: {
144
+ type: "custom",
145
+ schema: resendAuthSchema
146
+ },
147
+ categories: ["email"],
148
+ classification: "pii",
149
+ tags: ["send"],
150
+ tools: [resendSendTool, resendSendBatchTool]
151
+ });
152
+ //#endregion
153
+ export { resendAuthSchema as a, resendSendInputSchema as c, ResendClient as i, resendSendOutputSchema as l, resendSendBatchTool as n, resendSendBatchInputSchema as o, resendSendTool as r, resendSendBatchOutputSchema as s, resendModule as t };
154
+
155
+ //# sourceMappingURL=resend-BAC38_dA.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resend-BAC38_dA.js","names":["#http"],"sources":["../src/vendors/resend/contracts.ts","../src/vendors/resend/domain.ts","../src/vendors/resend/client.ts","../src/vendors/resend/module.ts"],"sourcesContent":["import { z } from 'zod'\n\nimport { batchResultSchema } from '../../shared/batch'\nimport type { NamedAddress } from '../_email'\nimport { attachmentSchema, MAX_BATCH_EMAILS, MAX_EMAIL_BYTES, namedAddressSchema } from '../_email'\n\nexport { MAX_BATCH_EMAILS, MAX_EMAIL_BYTES, namedAddressSchema, attachmentSchema }\nexport type { NamedAddress }\n\nexport const resendAuthSchema = z.object({\n\tapi_key: z.string().min(1).describe('Resend API key')\n})\n\nexport type ResendAuth = z.infer<typeof resendAuthSchema>\n\nexport const resendSendInputSchema = z\n\t.object({\n\t\tto: z\n\t\t\t.union([namedAddressSchema, z.array(namedAddressSchema).min(1).max(50)])\n\t\t\t.describe('Primary recipient address or list (max 50 combined to/cc/bcc)'),\n\t\tfrom: namedAddressSchema.describe('Verified sender address on the sending domain'),\n\t\tsubject: z.string().min(1).max(998).describe('Email subject line'),\n\t\thtml: z.string().optional().describe('HTML body. Provide html and/or text'),\n\t\ttext: z.string().optional().describe('Plain text body. Provide html and/or text'),\n\t\tcc: z\n\t\t\t.union([namedAddressSchema, z.array(namedAddressSchema).max(50)])\n\t\t\t.optional()\n\t\t\t.describe('CC recipients'),\n\t\tbcc: z\n\t\t\t.union([namedAddressSchema, z.array(namedAddressSchema).max(50)])\n\t\t\t.optional()\n\t\t\t.describe('BCC recipients'),\n\t\treply_to: namedAddressSchema.optional().describe('Reply-To address'),\n\t\theaders: z.record(z.string(), z.string()).optional().describe('Custom headers as a string map'),\n\t\tattachments: z\n\t\t\t.array(attachmentSchema)\n\t\t\t.max(32)\n\t\t\t.optional()\n\t\t\t.describe('Up to 32 base64 attachments. Total message must stay under 5 MiB')\n\t})\n\t.refine((v) => Boolean(v.html?.trim() || v.text?.trim()), {\n\t\tmessage: 'Provide html and/or text body'\n\t})\n\nexport const resendSendOutputSchema = z.object({\n\tsuccess: z.boolean().describe('Whether Resend accepted the request'),\n\tid: z.string().optional().describe('Resend message id when available')\n})\n\nexport const resendSendBatchInputSchema = z.object({\n\tmessages: z.array(resendSendInputSchema).min(1).max(MAX_BATCH_EMAILS).describe('Messages to send (max 20)')\n})\n\nexport const resendSendBatchOutputSchema = batchResultSchema(resendSendOutputSchema)\n\nexport type ResendSendInput = z.infer<typeof resendSendInputSchema>\nexport type ResendSendOutput = z.infer<typeof resendSendOutputSchema>\nexport type ResendSendBatchInput = z.infer<typeof resendSendBatchInputSchema>\nexport type ResendSendBatchOutput = z.infer<typeof resendSendBatchOutputSchema>\n","/**\n * Resend payload shaping + response parse.\n * Vertical helpers: `vendors/_email`.\n */\n\nimport { isPlainObject, isString, pick } from 'es-toolkit'\n\nimport { ToolError } from '../../core/errors'\nimport { addressList, addressToString, assertEmailSize, assertRecipientLimit } from '../_email'\nimport type { ResendSendInput, ResendSendOutput } from './contracts'\n\nexport function buildSendPayload(input: ResendSendInput): Record<string, unknown> {\n\treturn {\n\t\t...pick(input, ['subject', 'html', 'text', 'headers']),\n\t\tfrom: addressToString(input.from),\n\t\tto: addressList(input.to),\n\t\tcc: addressList(input.cc),\n\t\tbcc: addressList(input.bcc),\n\t\t...(input.reply_to && { reply_to: addressToString(input.reply_to) }),\n\t\t...(input.attachments && {\n\t\t\tattachments: input.attachments.map((att) => ({\n\t\t\t\tfilename: att.filename,\n\t\t\t\tcontent: att.content,\n\t\t\t\tcontent_type: att.type,\n\t\t\t\t...(att.disposition && { content_disposition: att.disposition }),\n\t\t\t\t// Resend REST uses content_id for CID inline images.\n\t\t\t\t...(att.content_id && { content_id: att.content_id })\n\t\t\t}))\n\t\t})\n\t}\n}\n\nexport function preflightSend(input: ResendSendInput): Record<string, unknown> {\n\tassertRecipientLimit(input)\n\tconst payload = buildSendPayload(input)\n\tassertEmailSize(\n\t\tpayload,\n\t\tinput.attachments?.map((a) => a.content)\n\t)\n\treturn payload\n}\n\n/** Map Resend `{ id }` success body to tool output. */\nexport function parseSendResult(data: unknown): ResendSendOutput {\n\tif (!isPlainObject(data)) {\n\t\tthrow new ToolError('Resend returned an unexpected payload', { code: 'upstream' })\n\t}\n\tconst id = data['id']\n\treturn {\n\t\tsuccess: true,\n\t\t...(isString(id) && id.length > 0 && { id })\n\t}\n}\n","/**\n * Resend vendor client.\n * Host: `new ResendClient(auth)`. Agent tools: `fromContext(ctx)`.\n */\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { runBatchItems } from '../../shared/batch'\nimport { HttpService } from '../../transport/http-service'\nimport type { HttpServiceOptions } from '../../transport/http-service'\nimport type {\n\tResendAuth,\n\tResendSendBatchInput,\n\tResendSendBatchOutput,\n\tResendSendInput,\n\tResendSendOutput\n} from './contracts'\nimport { resendAuthSchema } from './contracts'\nimport { parseSendResult, preflightSend } from './domain'\n\nexport type ResendClientOptions = Pick<HttpServiceOptions, 'fetch' | 'signal'>\n\nexport class ResendClient {\n\treadonly #http: HttpService\n\n\tconstructor(auth: ResendAuth, options: ResendClientOptions = {}) {\n\t\tconst parsed = resendAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid Resend auth credentials', {\n\t\t\t\tcode: 'bad_auth',\n\t\t\t\tdetails: { issues: parsed.error.issues.map((issue) => issue.message) }\n\t\t\t})\n\t\t}\n\t\tthis.#http = new HttpService({\n\t\t\t...options,\n\t\t\tbaseURL: 'https://api.resend.com',\n\t\t\theaders: {\n\t\t\t\tAuthorization: `Bearer ${parsed.data.api_key}`,\n\t\t\t\t'Content-Type': 'application/json'\n\t\t\t},\n\t\t\tlabel: 'Resend'\n\t\t})\n\t}\n\n\tstatic fromContext(ctx: ToolContext): ResendClient {\n\t\tconst auth = requireAuth(ctx, resendAuthSchema)\n\t\treturn new ResendClient(auth, {\n\t\t\t...(ctx.fetch && { fetch: ctx.fetch }),\n\t\t\t...(ctx.signal && { signal: ctx.signal })\n\t\t})\n\t}\n\n\t/** POST /emails */\n\tasync send(input: ResendSendInput): Promise<ResendSendOutput> {\n\t\tconst payload = preflightSend(input)\n\t\tconst { data } = await this.#http.post('/emails', payload, { label: 'Resend send' })\n\t\treturn parseSendResult(data)\n\t}\n\n\t/** Sequential batch of independent sends (partial failure OK). */\n\tasync sendBatch(input: ResendSendBatchInput): Promise<ResendSendBatchOutput> {\n\t\treturn runBatchItems(input.messages, (message) => this.send(message))\n\t}\n}\n","import { defineModule, defineTool } from '../../core/define'\nimport { ResendClient } from './client'\nimport {\n\tresendAuthSchema,\n\tresendSendBatchInputSchema,\n\tresendSendBatchOutputSchema,\n\tresendSendInputSchema,\n\tresendSendOutputSchema\n} from './contracts'\n\n/** Single-email send tool. Host binds auth via withAuth. */\nexport const resendSendTool = defineTool({\n\tid: 'resend-send',\n\tname: 'resendSend',\n\tdescription:\n\t\t'Send one email via Resend. Subject plus html and/or text. Optional cc, bcc, reply_to, headers, base64 attachments. Total under 5 MiB.',\n\tinputSchema: resendSendInputSchema,\n\toutputSchema: resendSendOutputSchema,\n\tsideEffect: 'send',\n\truntime: 'both',\n\texecute: async (input, ctx) => ResendClient.fromContext(ctx).send(input)\n})\n\n/** Batch send (max 20). Per-message success/error; does not abort the batch. */\nexport const resendSendBatchTool = defineTool({\n\tid: 'resend-send-batch',\n\tname: 'resendSendBatch',\n\tdescription: 'Send up to 20 emails via Resend. Per-message success or error without aborting the batch.',\n\tinputSchema: resendSendBatchInputSchema,\n\toutputSchema: resendSendBatchOutputSchema,\n\tsideEffect: 'send',\n\truntime: 'both',\n\texecute: async (input, ctx) => ResendClient.fromContext(ctx).sendBatch(input)\n})\n\nexport const resendModule = defineModule({\n\tid: 'resend',\n\ttitle: 'Resend',\n\tdescription: 'Resend vendor pack: send one email or a batch (max 20). Not a multi-provider email seam.',\n\truntime: 'both',\n\tauth: { type: 'custom', schema: resendAuthSchema },\n\tcategories: ['email'],\n\tclassification: 'pii',\n\ttags: ['send'],\n\ttools: [resendSendTool, resendSendBatchTool]\n})\n"],"mappings":"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"}