@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,242 @@
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 { i as mapTransportNetworkError, t as HttpService } from "../../http-service-DDNCO1s4.js";
5
+ import { z } from "zod";
6
+ const webFetchAuthSchema = z.object({
7
+ allowed_origins: z.array(z.string().min(1)).min(1).max(64).describe("Exact origins permitted, for example https://api.example.com"),
8
+ default_headers: z.record(z.string(), z.string()).optional().describe("Host-injected headers (for example Authorization). Not tool inputs"),
9
+ require_https: z.boolean().optional().describe("When true, only https URLs. Defaults to false"),
10
+ timeout_ms: z.int().min(1).max(12e4).optional().describe("Default timeout ms (default 30000)")
11
+ });
12
+ const sharedFields = {
13
+ url: z.url().describe("Absolute http(s) URL on an allowlisted origin"),
14
+ headers: z.record(z.string(), z.string()).optional().describe("Additional non-protected request headers"),
15
+ query: z.record(z.string(), z.union([
16
+ z.string(),
17
+ z.number(),
18
+ z.boolean()
19
+ ])).optional().describe("Query parameters"),
20
+ timeout_ms: z.int().min(1).max(12e4).optional().describe("Per-request timeout override")
21
+ };
22
+ const webFetchGetInputSchema = z.object({
23
+ ...sharedFields,
24
+ method: z.enum(["GET", "HEAD"]).optional().describe("Read method. Defaults to GET")
25
+ });
26
+ const webFetchRequestInputSchema = z.object({
27
+ ...sharedFields,
28
+ method: z.enum([
29
+ "POST",
30
+ "PUT",
31
+ "PATCH",
32
+ "DELETE"
33
+ ]).optional().describe("Mutating method. Defaults to POST"),
34
+ body: z.unknown().optional().describe("Request body. Objects and arrays are JSON-encoded; strings are sent as raw text. Omit when unused")
35
+ });
36
+ const webFetchRequestOutputSchema = z.object({
37
+ url: z.string(),
38
+ status: z.int(),
39
+ ok: z.boolean(),
40
+ headers: z.record(z.string(), z.string()),
41
+ content_type: z.string().optional(),
42
+ /** ofetch-parsed payload: object/array for JSON, string for text, etc. */
43
+ body: z.unknown()
44
+ });
45
+ //#endregion
46
+ //#region src/modules/web-fetch/domain.ts
47
+ /**
48
+ * Web-fetch policy: allowlist origins, block credential headers, normalize bodies.
49
+ */
50
+ /** Only credentials / identity headers the model must not set. */
51
+ const BLOCKED_MODEL_HEADERS = /* @__PURE__ */ new Set([
52
+ "authorization",
53
+ "proxy-authorization",
54
+ "cookie",
55
+ "cookie2",
56
+ "x-api-key",
57
+ "x-auth-token",
58
+ "x-access-token",
59
+ "api-key"
60
+ ]);
61
+ function requestBody(body) {
62
+ if (body === null) return null;
63
+ if (typeof body === "string" || typeof body === "object") return body;
64
+ throw new ToolError("Request body must be a string, object, array, or null", { code: "bad_input" });
65
+ }
66
+ function originOf(value, kind) {
67
+ let url;
68
+ try {
69
+ url = new URL(value);
70
+ } catch {
71
+ throw new ToolError(kind === "bad_auth" ? `Invalid allowed origin: ${value}` : "Invalid URL", { code: kind });
72
+ }
73
+ if (url.protocol !== "http:" && url.protocol !== "https:") throw new ToolError("Only http and https are allowed", { code: kind === "bad_auth" ? "bad_auth" : "forbidden" });
74
+ if (url.username !== "" || url.password !== "") throw new ToolError(kind === "bad_auth" ? "Allowed origins must not include credentials" : "URL must not include credentials", { code: kind });
75
+ return url.origin;
76
+ }
77
+ function assertAllowed(url, allowed, requireHttps) {
78
+ const parsed = new URL(url);
79
+ if (requireHttps && parsed.protocol !== "https:") throw new ToolError("HTTPS is required for this binding", { code: "forbidden" });
80
+ if (parsed.username !== "" || parsed.password !== "") throw new ToolError("URL must not include credentials", { code: "bad_input" });
81
+ if (!allowed.has(parsed.origin)) throw new ToolError(`Origin not in allowlist: ${parsed.origin}`, {
82
+ code: "forbidden",
83
+ details: { origin: parsed.origin }
84
+ });
85
+ return parsed;
86
+ }
87
+ function modelHeaders(headers) {
88
+ if (!headers) return {};
89
+ const out = {};
90
+ for (const [key, value] of Object.entries(headers)) {
91
+ const name = key.trim();
92
+ if (name.length === 0) continue;
93
+ if (BLOCKED_MODEL_HEADERS.has(name.toLowerCase())) throw new ToolError(`Request header is not allowed from the model: ${name}`, {
94
+ code: "bad_input",
95
+ details: { header: name }
96
+ });
97
+ out[name] = value;
98
+ }
99
+ return out;
100
+ }
101
+ function headersForRequest(hostDefaults, model) {
102
+ return {
103
+ ...model,
104
+ ...hostDefaults
105
+ };
106
+ }
107
+ function allowedOriginSet(allowedOrigins) {
108
+ return new Set(allowedOrigins.map((o) => originOf(o, "bad_auth")));
109
+ }
110
+ function assertHttpsOrigins(allowed, requireHttps) {
111
+ if (!requireHttps) return;
112
+ for (const origin of allowed) if (!origin.startsWith("https:")) throw new ToolError(`require_https is set; origin must be https: ${origin}`, { code: "bad_auth" });
113
+ }
114
+ //#endregion
115
+ //#region src/modules/web-fetch/client.ts
116
+ /**
117
+ * Web-fetch client — allowlisted HTTP via HttpService.
118
+ * Host: withAuth + fromContext. Tools stay thin adapters.
119
+ */
120
+ var WebFetchClient = class WebFetchClient {
121
+ #auth;
122
+ #options;
123
+ constructor(auth, options = {}) {
124
+ const parsed = webFetchAuthSchema.safeParse(auth);
125
+ if (!parsed.success) throw new ToolError("Web fetch host binding is missing or invalid", { code: "bad_auth" });
126
+ this.#auth = parsed.data;
127
+ this.#options = options;
128
+ }
129
+ static fromContext(ctx) {
130
+ const auth = requireAuth(ctx, webFetchAuthSchema);
131
+ return new WebFetchClient(auth, {
132
+ ...ctx.fetch && { fetch: ctx.fetch },
133
+ ...ctx.signal && { signal: ctx.signal }
134
+ });
135
+ }
136
+ static fromAuth(auth, ctx = {}) {
137
+ return new WebFetchClient(auth, {
138
+ ...ctx.fetch && { fetch: ctx.fetch },
139
+ ...ctx.signal && { signal: ctx.signal }
140
+ });
141
+ }
142
+ get(input) {
143
+ return this.#execute({
144
+ url: input.url,
145
+ method: input.method ?? "GET",
146
+ ...input.headers && { headers: input.headers },
147
+ ...input.query && { query: input.query },
148
+ ...input.timeout_ms !== void 0 && { timeout_ms: input.timeout_ms }
149
+ });
150
+ }
151
+ request(input) {
152
+ return this.#execute({
153
+ url: input.url,
154
+ method: input.method ?? "POST",
155
+ ...input.headers && { headers: input.headers },
156
+ ...input.query && { query: input.query },
157
+ ...input.body !== void 0 && { body: requestBody(input.body) },
158
+ ...input.timeout_ms !== void 0 && { timeout_ms: input.timeout_ms }
159
+ });
160
+ }
161
+ async #execute(input) {
162
+ const auth = this.#auth;
163
+ const requireHttps = auth.require_https === true;
164
+ const allowed = allowedOriginSet(auth.allowed_origins);
165
+ assertHttpsOrigins(allowed, requireHttps);
166
+ const target = assertAllowed(input.url, allowed, requireHttps);
167
+ const method = input.method;
168
+ const timeout = input.timeout_ms ?? auth.timeout_ms ?? 3e4;
169
+ const http = new HttpService({
170
+ timeout,
171
+ label: "Web fetch",
172
+ ...this.#options.fetch && { fetch: this.#options.fetch },
173
+ ...this.#options.signal && { signal: this.#options.signal }
174
+ });
175
+ try {
176
+ const response = await http.query(method, target.href, {
177
+ headers: headersForRequest(auth.default_headers, modelHeaders(input.headers)),
178
+ ...input.query && { query: input.query },
179
+ ...input.body !== void 0 && { body: input.body },
180
+ timeout,
181
+ noThrow: true
182
+ });
183
+ const finalUrl = response.url.length > 0 ? response.url : target.href;
184
+ assertAllowed(finalUrl, allowed, requireHttps);
185
+ const contentType = response.headers.get("content-type") ?? void 0;
186
+ const headers = {};
187
+ response.headers.forEach((value, key) => {
188
+ headers[key.toLowerCase()] = value;
189
+ });
190
+ return webFetchRequestOutputSchema.parse({
191
+ url: finalUrl,
192
+ status: response.status,
193
+ ok: response.ok,
194
+ headers,
195
+ ...contentType && { content_type: contentType },
196
+ body: method === "HEAD" ? null : response.data
197
+ });
198
+ } catch (error) {
199
+ mapTransportNetworkError(error, "Web fetch");
200
+ }
201
+ }
202
+ };
203
+ //#endregion
204
+ //#region src/modules/web-fetch/module.ts
205
+ const webFetchGetTool = defineTool({
206
+ id: "web-fetch-get",
207
+ name: "httpGet",
208
+ description: "Send HTTP GET or HEAD to an absolute allowlisted URL. Use to read an approved API when no purpose-built tool exists. Returns status, headers, and a parsed JSON or text body. No request body; protected headers cannot be supplied in arguments.",
209
+ inputSchema: webFetchGetInputSchema,
210
+ outputSchema: webFetchRequestOutputSchema,
211
+ sideEffect: "read",
212
+ runtime: "both",
213
+ execute: async (input, ctx) => WebFetchClient.fromContext(ctx).get(input)
214
+ });
215
+ const webFetchRequestTool = defineTool({
216
+ id: "web-fetch-request",
217
+ name: "httpRequest",
218
+ description: "Send HTTP POST, PUT, PATCH, or DELETE to an absolute allowlisted URL. Use for an approved API or webhook only when no purpose-built tool exists. Objects and arrays are JSON-encoded; returns status, headers, and a parsed body. Protected headers cannot be supplied in arguments.",
219
+ inputSchema: webFetchRequestInputSchema,
220
+ outputSchema: webFetchRequestOutputSchema,
221
+ sideEffect: "write",
222
+ runtime: "both",
223
+ execute: async (input, ctx) => WebFetchClient.fromContext(ctx).request(input)
224
+ });
225
+ const webFetchModule = defineModule({
226
+ id: "web-fetch",
227
+ title: "Web Fetch",
228
+ description: "Fallback HTTP access to allowlisted absolute URLs. Use GET or HEAD for reads and POST, PUT, PATCH, or DELETE for writes only when no purpose-built tool covers the API.",
229
+ runtime: "both",
230
+ auth: {
231
+ type: "custom",
232
+ schema: webFetchAuthSchema
233
+ },
234
+ categories: ["http", "web"],
235
+ classification: "standard",
236
+ tags: ["allowlist"],
237
+ tools: [webFetchGetTool, webFetchRequestTool]
238
+ });
239
+ //#endregion
240
+ export { WebFetchClient, webFetchAuthSchema, webFetchGetTool, webFetchModule, webFetchRequestTool };
241
+
242
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["#auth","#options","#execute"],"sources":["../../../src/modules/web-fetch/contracts.ts","../../../src/modules/web-fetch/domain.ts","../../../src/modules/web-fetch/client.ts","../../../src/modules/web-fetch/module.ts"],"sourcesContent":["import { z } from 'zod'\n\nexport const DEFAULT_TIMEOUT_MS = 30_000\n\nexport const webFetchAuthSchema = z.object({\n\tallowed_origins: z\n\t\t.array(z.string().min(1))\n\t\t.min(1)\n\t\t.max(64)\n\t\t.describe('Exact origins permitted, for example https://api.example.com'),\n\tdefault_headers: z\n\t\t.record(z.string(), z.string())\n\t\t.optional()\n\t\t.describe('Host-injected headers (for example Authorization). Not tool inputs'),\n\trequire_https: z.boolean().optional().describe('When true, only https URLs. Defaults to false'),\n\ttimeout_ms: z.int().min(1).max(120_000).optional().describe('Default timeout ms (default 30000)')\n})\n\nexport type WebFetchAuth = z.infer<typeof webFetchAuthSchema>\n\nconst sharedFields = {\n\turl: z.url().describe('Absolute http(s) URL on an allowlisted origin'),\n\theaders: z.record(z.string(), z.string()).optional().describe('Additional non-protected request headers'),\n\tquery: z\n\t\t.record(z.string(), z.union([z.string(), z.number(), z.boolean()]))\n\t\t.optional()\n\t\t.describe('Query parameters'),\n\ttimeout_ms: z.int().min(1).max(120_000).optional().describe('Per-request timeout override')\n}\n\nexport const webFetchGetInputSchema = z.object({\n\t...sharedFields,\n\tmethod: z.enum(['GET', 'HEAD']).optional().describe('Read method. Defaults to GET')\n})\n\nexport const webFetchRequestInputSchema = z.object({\n\t...sharedFields,\n\tmethod: z.enum(['POST', 'PUT', 'PATCH', 'DELETE']).optional().describe('Mutating method. Defaults to POST'),\n\tbody: z\n\t\t.unknown()\n\t\t.optional()\n\t\t.describe('Request body. Objects and arrays are JSON-encoded; strings are sent as raw text. Omit when unused')\n})\n\nexport const webFetchRequestOutputSchema = z.object({\n\turl: z.string(),\n\tstatus: z.int(),\n\tok: z.boolean(),\n\theaders: z.record(z.string(), z.string()),\n\tcontent_type: z.string().optional(),\n\t/** ofetch-parsed payload: object/array for JSON, string for text, etc. */\n\tbody: z.unknown()\n})\n\nexport type WebFetchGetInput = z.infer<typeof webFetchGetInputSchema>\nexport type WebFetchRequestInput = z.infer<typeof webFetchRequestInputSchema>\nexport type WebFetchRequestOutput = z.infer<typeof webFetchRequestOutputSchema>\n","/**\n * Web-fetch policy: allowlist origins, block credential headers, normalize bodies.\n */\n\nimport { ToolError } from '../../core/errors'\nimport type { HttpBody } from '../../transport/http-service'\n\n/** Only credentials / identity headers the model must not set. */\nexport const BLOCKED_MODEL_HEADERS = new Set([\n\t'authorization',\n\t'proxy-authorization',\n\t'cookie',\n\t'cookie2',\n\t'x-api-key',\n\t'x-auth-token',\n\t'x-access-token',\n\t'api-key'\n])\n\nexport function requestBody(body: unknown): HttpBody {\n\tif (body === null) return null\n\tif (typeof body === 'string' || typeof body === 'object') return body\n\tthrow new ToolError('Request body must be a string, object, array, or null', { code: 'bad_input' })\n}\n\nexport function originOf(value: string, kind: 'bad_auth' | 'bad_input'): string {\n\tlet url: URL\n\ttry {\n\t\turl = new URL(value)\n\t} catch {\n\t\tthrow new ToolError(kind === 'bad_auth' ? `Invalid allowed origin: ${value}` : 'Invalid URL', {\n\t\t\tcode: kind\n\t\t})\n\t}\n\tif (url.protocol !== 'http:' && url.protocol !== 'https:') {\n\t\tthrow new ToolError('Only http and https are allowed', { code: kind === 'bad_auth' ? 'bad_auth' : 'forbidden' })\n\t}\n\tif (url.username !== '' || url.password !== '') {\n\t\tthrow new ToolError(\n\t\t\tkind === 'bad_auth' ? 'Allowed origins must not include credentials' : 'URL must not include credentials',\n\t\t\t{ code: kind }\n\t\t)\n\t}\n\treturn url.origin\n}\n\nexport function assertAllowed(url: string, allowed: Set<string>, requireHttps: boolean): URL {\n\tconst parsed = new URL(url)\n\tif (requireHttps && parsed.protocol !== 'https:') {\n\t\tthrow new ToolError('HTTPS is required for this binding', { code: 'forbidden' })\n\t}\n\tif (parsed.username !== '' || parsed.password !== '') {\n\t\tthrow new ToolError('URL must not include credentials', { code: 'bad_input' })\n\t}\n\tif (!allowed.has(parsed.origin)) {\n\t\tthrow new ToolError(`Origin not in allowlist: ${parsed.origin}`, {\n\t\t\tcode: 'forbidden',\n\t\t\tdetails: { origin: parsed.origin }\n\t\t})\n\t}\n\treturn parsed\n}\n\nexport function modelHeaders(headers: Record<string, string> | undefined): Record<string, string> {\n\tif (!headers) return {}\n\tconst out: Record<string, string> = {}\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tconst name = key.trim()\n\t\tif (name.length === 0) continue\n\t\tif (BLOCKED_MODEL_HEADERS.has(name.toLowerCase())) {\n\t\t\tthrow new ToolError(`Request header is not allowed from the model: ${name}`, {\n\t\t\t\tcode: 'bad_input',\n\t\t\t\tdetails: { header: name }\n\t\t\t})\n\t\t}\n\t\tout[name] = value\n\t}\n\treturn out\n}\n\nexport function headersForRequest(\n\thostDefaults: Record<string, string> | undefined,\n\tmodel: Record<string, string>\n): Record<string, string> {\n\treturn { ...model, ...hostDefaults }\n}\n\nexport function allowedOriginSet(allowedOrigins: string[]): Set<string> {\n\treturn new Set(allowedOrigins.map((o) => originOf(o, 'bad_auth')))\n}\n\nexport function assertHttpsOrigins(allowed: Set<string>, requireHttps: boolean): void {\n\tif (!requireHttps) return\n\tfor (const origin of allowed) {\n\t\tif (!origin.startsWith('https:')) {\n\t\t\tthrow new ToolError(`require_https is set; origin must be https: ${origin}`, {\n\t\t\t\tcode: 'bad_auth'\n\t\t\t})\n\t\t}\n\t}\n}\n","/**\n * Web-fetch client — allowlisted HTTP via HttpService.\n * Host: withAuth + fromContext. Tools stay thin adapters.\n */\n\nimport { ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { mapTransportNetworkError } from '../../transport/errors'\nimport type { HttpBody } from '../../transport/http-service'\nimport { HttpService } from '../../transport/http-service'\nimport { DEFAULT_TIMEOUT_MS, webFetchAuthSchema, webFetchRequestOutputSchema } from './contracts'\nimport type { WebFetchAuth, WebFetchGetInput, WebFetchRequestInput, WebFetchRequestOutput } from './contracts'\nimport {\n\tassertAllowed,\n\tassertHttpsOrigins,\n\tallowedOriginSet,\n\theadersForRequest,\n\tmodelHeaders,\n\trequestBody\n} from './domain'\n\nexport type WebFetchClientOptions = {\n\tfetch?: ToolContext['fetch']\n\tsignal?: ToolContext['signal']\n}\n\ntype ExecuteArgs = {\n\turl: string\n\tmethod: string\n\theaders?: Record<string, string>\n\tquery?: Record<string, string | number | boolean>\n\tbody?: HttpBody\n\ttimeout_ms?: number\n}\n\nexport class WebFetchClient {\n\treadonly #auth: WebFetchAuth\n\treadonly #options: WebFetchClientOptions\n\n\tconstructor(auth: WebFetchAuth, options: WebFetchClientOptions = {}) {\n\t\tconst parsed = webFetchAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Web fetch host binding is missing or invalid', { code: 'bad_auth' })\n\t\t}\n\t\tthis.#auth = parsed.data\n\t\tthis.#options = options\n\t}\n\n\tstatic fromContext(ctx: ToolContext): WebFetchClient {\n\t\tconst auth = requireAuth(ctx, webFetchAuthSchema)\n\t\treturn new WebFetchClient(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\tstatic fromAuth(auth: WebFetchAuth, ctx: ToolContext = {}): WebFetchClient {\n\t\treturn new WebFetchClient(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\tget(input: WebFetchGetInput): Promise<WebFetchRequestOutput> {\n\t\treturn this.#execute({\n\t\t\turl: input.url,\n\t\t\tmethod: input.method ?? 'GET',\n\t\t\t...(input.headers && { headers: input.headers }),\n\t\t\t...(input.query && { query: input.query }),\n\t\t\t...(input.timeout_ms !== undefined && { timeout_ms: input.timeout_ms })\n\t\t})\n\t}\n\n\trequest(input: WebFetchRequestInput): Promise<WebFetchRequestOutput> {\n\t\treturn this.#execute({\n\t\t\turl: input.url,\n\t\t\tmethod: input.method ?? 'POST',\n\t\t\t...(input.headers && { headers: input.headers }),\n\t\t\t...(input.query && { query: input.query }),\n\t\t\t...(input.body !== undefined && { body: requestBody(input.body) }),\n\t\t\t...(input.timeout_ms !== undefined && { timeout_ms: input.timeout_ms })\n\t\t})\n\t}\n\n\tasync #execute(input: ExecuteArgs): Promise<WebFetchRequestOutput> {\n\t\tconst auth = this.#auth\n\t\tconst requireHttps = auth.require_https === true\n\t\tconst allowed = allowedOriginSet(auth.allowed_origins)\n\t\tassertHttpsOrigins(allowed, requireHttps)\n\n\t\tconst target = assertAllowed(input.url, allowed, requireHttps)\n\t\tconst method = input.method\n\t\tconst timeout = input.timeout_ms ?? auth.timeout_ms ?? DEFAULT_TIMEOUT_MS\n\t\tconst http = new HttpService({\n\t\t\ttimeout,\n\t\t\tlabel: 'Web fetch',\n\t\t\t...(this.#options.fetch && { fetch: this.#options.fetch }),\n\t\t\t...(this.#options.signal && { signal: this.#options.signal })\n\t\t})\n\n\t\ttry {\n\t\t\tconst response = await http.query(method, target.href, {\n\t\t\t\theaders: headersForRequest(auth.default_headers, modelHeaders(input.headers)),\n\t\t\t\t...(input.query && { query: input.query }),\n\t\t\t\t...(input.body !== undefined && { body: input.body }),\n\t\t\t\ttimeout,\n\t\t\t\tnoThrow: true\n\t\t\t})\n\n\t\t\tconst finalUrl = response.url.length > 0 ? response.url : target.href\n\t\t\tassertAllowed(finalUrl, allowed, requireHttps)\n\n\t\t\tconst contentType = response.headers.get('content-type') ?? undefined\n\t\t\tconst headers: Record<string, string> = {}\n\t\t\tresponse.headers.forEach((value, key) => {\n\t\t\t\theaders[key.toLowerCase()] = value\n\t\t\t})\n\n\t\t\treturn webFetchRequestOutputSchema.parse({\n\t\t\t\turl: finalUrl,\n\t\t\t\tstatus: response.status,\n\t\t\t\tok: response.ok,\n\t\t\t\theaders,\n\t\t\t\t...(contentType && { content_type: contentType }),\n\t\t\t\tbody: method === 'HEAD' ? null : response.data\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tmapTransportNetworkError(error, 'Web fetch')\n\t\t}\n\t}\n}\n","import { defineModule, defineTool } from '../../core/define'\nimport { WebFetchClient } from './client'\nimport {\n\twebFetchAuthSchema,\n\twebFetchGetInputSchema,\n\twebFetchRequestInputSchema,\n\twebFetchRequestOutputSchema\n} from './contracts'\n\nexport type { WebFetchAuth } from './contracts'\nexport { webFetchAuthSchema }\n\nexport const webFetchGetTool = defineTool({\n\tid: 'web-fetch-get',\n\tname: 'httpGet',\n\tdescription:\n\t\t'Send HTTP GET or HEAD to an absolute allowlisted URL. Use to read an approved API when no purpose-built tool exists. Returns status, headers, and a parsed JSON or text body. No request body; protected headers cannot be supplied in arguments.',\n\tinputSchema: webFetchGetInputSchema,\n\toutputSchema: webFetchRequestOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => WebFetchClient.fromContext(ctx).get(input)\n})\n\nexport const webFetchRequestTool = defineTool({\n\tid: 'web-fetch-request',\n\tname: 'httpRequest',\n\tdescription:\n\t\t'Send HTTP POST, PUT, PATCH, or DELETE to an absolute allowlisted URL. Use for an approved API or webhook only when no purpose-built tool exists. Objects and arrays are JSON-encoded; returns status, headers, and a parsed body. Protected headers cannot be supplied in arguments.',\n\tinputSchema: webFetchRequestInputSchema,\n\toutputSchema: webFetchRequestOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => WebFetchClient.fromContext(ctx).request(input)\n})\n\nexport const webFetchModule = defineModule({\n\tid: 'web-fetch',\n\ttitle: 'Web Fetch',\n\tdescription:\n\t\t'Fallback HTTP access to allowlisted absolute URLs. Use GET or HEAD for reads and POST, PUT, PATCH, or DELETE for writes only when no purpose-built tool covers the API.',\n\truntime: 'both',\n\tauth: { type: 'custom', schema: webFetchAuthSchema },\n\tcategories: ['http', 'web'],\n\tclassification: 'standard',\n\ttags: ['allowlist'],\n\ttools: [webFetchGetTool, webFetchRequestTool]\n})\n"],"mappings":";;;;;AAIA,MAAa,qBAAqB,EAAE,OAAO;CAC1C,iBAAiB,EACf,MAAM,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CACxB,IAAI,CAAC,CAAC,CACN,IAAI,EAAE,CAAC,CACP,SAAS,8DAA8D;CACzE,iBAAiB,EACf,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,CAC9B,SAAS,CAAC,CACV,SAAS,oEAAoE;CAC/E,eAAe,EAAE,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,+CAA+C;CAC9F,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,oCAAoC;AACjG,CAAC;AAID,MAAM,eAAe;CACpB,KAAK,EAAE,IAAI,CAAC,CAAC,SAAS,+CAA+C;CACrE,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,0CAA0C;CACxG,OAAO,EACL,OAAO,EAAE,OAAO,GAAG,EAAE,MAAM;EAAC,EAAE,OAAO;EAAG,EAAE,OAAO;EAAG,EAAE,QAAQ;CAAC,CAAC,CAAC,CAAC,CAClE,SAAS,CAAC,CACV,SAAS,kBAAkB;CAC7B,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAO,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,8BAA8B;AAC3F;AAEA,MAAa,yBAAyB,EAAE,OAAO;CAC9C,GAAG;CACH,QAAQ,EAAE,KAAK,CAAC,OAAO,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,8BAA8B;AACnF,CAAC;AAED,MAAa,6BAA6B,EAAE,OAAO;CAClD,GAAG;CACH,QAAQ,EAAE,KAAK;EAAC;EAAQ;EAAO;EAAS;CAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,SAAS,mCAAmC;CAC1G,MAAM,EACJ,QAAQ,CAAC,CACT,SAAS,CAAC,CACV,SAAS,mGAAmG;AAC/G,CAAC;AAED,MAAa,8BAA8B,EAAE,OAAO;CACnD,KAAK,EAAE,OAAO;CACd,QAAQ,EAAE,IAAI;CACd,IAAI,EAAE,QAAQ;CACd,SAAS,EAAE,OAAO,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC;CACxC,cAAc,EAAE,OAAO,CAAC,CAAC,SAAS;;CAElC,MAAM,EAAE,QAAQ;AACjB,CAAC;;;;;;;AC5CD,MAAa,wCAAwB,IAAI,IAAI;CAC5C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACD,CAAC;AAED,SAAgB,YAAY,MAAyB;CACpD,IAAI,SAAS,MAAM,OAAO;CAC1B,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,UAAU,OAAO;CACjE,MAAM,IAAI,UAAU,yDAAyD,EAAE,MAAM,YAAY,CAAC;AACnG;AAEA,SAAgB,SAAS,OAAe,MAAwC;CAC/E,IAAI;CACJ,IAAI;EACH,MAAM,IAAI,IAAI,KAAK;CACpB,QAAQ;EACP,MAAM,IAAI,UAAU,SAAS,aAAa,2BAA2B,UAAU,eAAe,EAC7F,MAAM,KACP,CAAC;CACF;CACA,IAAI,IAAI,aAAa,WAAW,IAAI,aAAa,UAChD,MAAM,IAAI,UAAU,mCAAmC,EAAE,MAAM,SAAS,aAAa,aAAa,YAAY,CAAC;CAEhH,IAAI,IAAI,aAAa,MAAM,IAAI,aAAa,IAC3C,MAAM,IAAI,UACT,SAAS,aAAa,iDAAiD,oCACvE,EAAE,MAAM,KAAK,CACd;CAED,OAAO,IAAI;AACZ;AAEA,SAAgB,cAAc,KAAa,SAAsB,cAA4B;CAC5F,MAAM,SAAS,IAAI,IAAI,GAAG;CAC1B,IAAI,gBAAgB,OAAO,aAAa,UACvC,MAAM,IAAI,UAAU,sCAAsC,EAAE,MAAM,YAAY,CAAC;CAEhF,IAAI,OAAO,aAAa,MAAM,OAAO,aAAa,IACjD,MAAM,IAAI,UAAU,oCAAoC,EAAE,MAAM,YAAY,CAAC;CAE9E,IAAI,CAAC,QAAQ,IAAI,OAAO,MAAM,GAC7B,MAAM,IAAI,UAAU,4BAA4B,OAAO,UAAU;EAChE,MAAM;EACN,SAAS,EAAE,QAAQ,OAAO,OAAO;CAClC,CAAC;CAEF,OAAO;AACR;AAEA,SAAgB,aAAa,SAAqE;CACjG,IAAI,CAAC,SAAS,OAAO,CAAC;CACtB,MAAM,MAA8B,CAAC;CACrC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,OAAO,GAAG;EACnD,MAAM,OAAO,IAAI,KAAK;EACtB,IAAI,KAAK,WAAW,GAAG;EACvB,IAAI,sBAAsB,IAAI,KAAK,YAAY,CAAC,GAC/C,MAAM,IAAI,UAAU,iDAAiD,QAAQ;GAC5E,MAAM;GACN,SAAS,EAAE,QAAQ,KAAK;EACzB,CAAC;EAEF,IAAI,QAAQ;CACb;CACA,OAAO;AACR;AAEA,SAAgB,kBACf,cACA,OACyB;CACzB,OAAO;EAAE,GAAG;EAAO,GAAG;CAAa;AACpC;AAEA,SAAgB,iBAAiB,gBAAuC;CACvE,OAAO,IAAI,IAAI,eAAe,KAAK,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC;AAClE;AAEA,SAAgB,mBAAmB,SAAsB,cAA6B;CACrF,IAAI,CAAC,cAAc;CACnB,KAAK,MAAM,UAAU,SACpB,IAAI,CAAC,OAAO,WAAW,QAAQ,GAC9B,MAAM,IAAI,UAAU,+CAA+C,UAAU,EAC5E,MAAM,WACP,CAAC;AAGJ;;;;;;;AChEA,IAAa,iBAAb,MAAa,eAAe;CAC3B;CACA;CAEA,YAAY,MAAoB,UAAiC,CAAC,GAAG;EACpE,MAAM,SAAS,mBAAmB,UAAU,IAAI;EAChD,IAAI,CAAC,OAAO,SACX,MAAM,IAAI,UAAU,gDAAgD,EAAE,MAAM,WAAW,CAAC;EAEzF,KAAKA,QAAQ,OAAO;EACpB,KAAKC,WAAW;CACjB;CAEA,OAAO,YAAY,KAAkC;EACpD,MAAM,OAAO,YAAY,KAAK,kBAAkB;EAChD,OAAO,IAAI,eAAe,MAAM;GAC/B,GAAI,IAAI,SAAS,EAAE,OAAO,IAAI,MAAM;GACpC,GAAI,IAAI,UAAU,EAAE,QAAQ,IAAI,OAAO;EACxC,CAAC;CACF;CAEA,OAAO,SAAS,MAAoB,MAAmB,CAAC,GAAmB;EAC1E,OAAO,IAAI,eAAe,MAAM;GAC/B,GAAI,IAAI,SAAS,EAAE,OAAO,IAAI,MAAM;GACpC,GAAI,IAAI,UAAU,EAAE,QAAQ,IAAI,OAAO;EACxC,CAAC;CACF;CAEA,IAAI,OAAyD;EAC5D,OAAO,KAAKC,SAAS;GACpB,KAAK,MAAM;GACX,QAAQ,MAAM,UAAU;GACxB,GAAI,MAAM,WAAW,EAAE,SAAS,MAAM,QAAQ;GAC9C,GAAI,MAAM,SAAS,EAAE,OAAO,MAAM,MAAM;GACxC,GAAI,MAAM,eAAe,KAAA,KAAa,EAAE,YAAY,MAAM,WAAW;EACtE,CAAC;CACF;CAEA,QAAQ,OAA6D;EACpE,OAAO,KAAKA,SAAS;GACpB,KAAK,MAAM;GACX,QAAQ,MAAM,UAAU;GACxB,GAAI,MAAM,WAAW,EAAE,SAAS,MAAM,QAAQ;GAC9C,GAAI,MAAM,SAAS,EAAE,OAAO,MAAM,MAAM;GACxC,GAAI,MAAM,SAAS,KAAA,KAAa,EAAE,MAAM,YAAY,MAAM,IAAI,EAAE;GAChE,GAAI,MAAM,eAAe,KAAA,KAAa,EAAE,YAAY,MAAM,WAAW;EACtE,CAAC;CACF;CAEA,MAAMA,SAAS,OAAoD;EAClE,MAAM,OAAO,KAAKF;EAClB,MAAM,eAAe,KAAK,kBAAkB;EAC5C,MAAM,UAAU,iBAAiB,KAAK,eAAe;EACrD,mBAAmB,SAAS,YAAY;EAExC,MAAM,SAAS,cAAc,MAAM,KAAK,SAAS,YAAY;EAC7D,MAAM,SAAS,MAAM;EACrB,MAAM,UAAU,MAAM,cAAc,KAAK,cAAA;EACzC,MAAM,OAAO,IAAI,YAAY;GAC5B;GACA,OAAO;GACP,GAAI,KAAKC,SAAS,SAAS,EAAE,OAAO,KAAKA,SAAS,MAAM;GACxD,GAAI,KAAKA,SAAS,UAAU,EAAE,QAAQ,KAAKA,SAAS,OAAO;EAC5D,CAAC;EAED,IAAI;GACH,MAAM,WAAW,MAAM,KAAK,MAAM,QAAQ,OAAO,MAAM;IACtD,SAAS,kBAAkB,KAAK,iBAAiB,aAAa,MAAM,OAAO,CAAC;IAC5E,GAAI,MAAM,SAAS,EAAE,OAAO,MAAM,MAAM;IACxC,GAAI,MAAM,SAAS,KAAA,KAAa,EAAE,MAAM,MAAM,KAAK;IACnD;IACA,SAAS;GACV,CAAC;GAED,MAAM,WAAW,SAAS,IAAI,SAAS,IAAI,SAAS,MAAM,OAAO;GACjE,cAAc,UAAU,SAAS,YAAY;GAE7C,MAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK,KAAA;GAC5D,MAAM,UAAkC,CAAC;GACzC,SAAS,QAAQ,SAAS,OAAO,QAAQ;IACxC,QAAQ,IAAI,YAAY,KAAK;GAC9B,CAAC;GAED,OAAO,4BAA4B,MAAM;IACxC,KAAK;IACL,QAAQ,SAAS;IACjB,IAAI,SAAS;IACb;IACA,GAAI,eAAe,EAAE,cAAc,YAAY;IAC/C,MAAM,WAAW,SAAS,OAAO,SAAS;GAC3C,CAAC;EACF,SAAS,OAAO;GACf,yBAAyB,OAAO,WAAW;EAC5C;CACD;AACD;;;ACvHA,MAAa,kBAAkB,WAAW;CACzC,IAAI;CACJ,MAAM;CACN,aACC;CACD,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,OAAO,QAAQ,eAAe,YAAY,GAAG,CAAC,CAAC,IAAI,KAAK;AACzE,CAAC;AAED,MAAa,sBAAsB,WAAW;CAC7C,IAAI;CACJ,MAAM;CACN,aACC;CACD,aAAa;CACb,cAAc;CACd,YAAY;CACZ,SAAS;CACT,SAAS,OAAO,OAAO,QAAQ,eAAe,YAAY,GAAG,CAAC,CAAC,QAAQ,KAAK;AAC7E,CAAC;AAED,MAAa,iBAAiB,aAAa;CAC1C,IAAI;CACJ,OAAO;CACP,aACC;CACD,SAAS;CACT,MAAM;EAAE,MAAM;EAAU,QAAQ;CAAmB;CACnD,YAAY,CAAC,QAAQ,KAAK;CAC1B,gBAAgB;CAChB,MAAM,CAAC,WAAW;CAClB,OAAO,CAAC,iBAAiB,mBAAmB;AAC7C,CAAC"}
@@ -0,0 +1,7 @@
1
+ import "./types-Ccb0DXY9.js";
2
+ import { g as S3ClientOptions } from "./index-zK1ZwS4m.js";
3
+ //#region src/shared/object-artifact-store.d.ts
4
+ type ObjectArtifactStoreOptions = S3ClientOptions;
5
+ //#endregion
6
+ export { ObjectArtifactStoreOptions as t };
7
+ //# sourceMappingURL=object-artifact-store-CMTzCm_G.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-artifact-store-CMTzCm_G.d.ts","names":[],"sources":["../src/shared/object-artifact-store.ts"],"mappings":";;;KAMY,6BAA6B"}
@@ -0,0 +1,28 @@
1
+ import { t as ToolError } from "./errors-DoSpNHvs.js";
2
+ import { t as artifactRefSchema } from "./artifact-D064mHfK.js";
3
+ import { p as S3Client } from "./s3-CsOaPWMP.js";
4
+ //#region src/shared/object-artifact-store.ts
5
+ var ObjectArtifactStore = class {
6
+ #storage;
7
+ constructor(auth, options = {}) {
8
+ this.#storage = new S3Client(auth, options);
9
+ }
10
+ async read(source, maxBytes) {
11
+ if (source.store !== "object") throw new ToolError("This operation requires an object-store artifact", { code: "bad_input" });
12
+ return this.#storage.getBytes(source.key, { maxBytes });
13
+ }
14
+ async write(key, bytes, mediaType, filename) {
15
+ await this.#storage.putBytes(key, bytes, mediaType);
16
+ return artifactRefSchema.parse({
17
+ store: "object",
18
+ key,
19
+ media_type: mediaType,
20
+ filename,
21
+ byte_length: bytes.byteLength
22
+ });
23
+ }
24
+ };
25
+ //#endregion
26
+ export { ObjectArtifactStore as t };
27
+
28
+ //# sourceMappingURL=object-artifact-store-wZ2j9cto.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"object-artifact-store-wZ2j9cto.js","names":["#storage"],"sources":["../src/shared/object-artifact-store.ts"],"sourcesContent":["import { ToolError } from '../core/errors'\nimport type { ArtifactRef } from './artifact'\nimport { artifactRefSchema } from './artifact'\nimport { S3Client } from '../vendors/s3'\nimport type { S3Auth, S3ClientOptions } from '../vendors/s3'\n\nexport type ObjectArtifactStoreOptions = S3ClientOptions\n\nexport class ObjectArtifactStore {\n\treadonly #storage: S3Client\n\n\tconstructor(auth: S3Auth, options: ObjectArtifactStoreOptions = {}) {\n\t\tthis.#storage = new S3Client(auth, options)\n\t}\n\n\tasync read(source: ArtifactRef, maxBytes: number): Promise<Uint8Array> {\n\t\tif (source.store !== 'object') {\n\t\t\tthrow new ToolError('This operation requires an object-store artifact', { code: 'bad_input' })\n\t\t}\n\t\treturn this.#storage.getBytes(source.key, { maxBytes })\n\t}\n\n\tasync write(key: string, bytes: Uint8Array, mediaType: string, filename: string): Promise<ArtifactRef> {\n\t\tawait this.#storage.putBytes(key, bytes, mediaType)\n\t\treturn artifactRefSchema.parse({\n\t\t\tstore: 'object',\n\t\t\tkey,\n\t\t\tmedia_type: mediaType,\n\t\t\tfilename,\n\t\t\tbyte_length: bytes.byteLength\n\t\t})\n\t}\n}\n"],"mappings":";;;;AAQA,IAAa,sBAAb,MAAiC;CAChC;CAEA,YAAY,MAAc,UAAsC,CAAC,GAAG;EACnE,KAAKA,WAAW,IAAI,SAAS,MAAM,OAAO;CAC3C;CAEA,MAAM,KAAK,QAAqB,UAAuC;EACtE,IAAI,OAAO,UAAU,UACpB,MAAM,IAAI,UAAU,oDAAoD,EAAE,MAAM,YAAY,CAAC;EAE9F,OAAO,KAAKA,SAAS,SAAS,OAAO,KAAK,EAAE,SAAS,CAAC;CACvD;CAEA,MAAM,MAAM,KAAa,OAAmB,WAAmB,UAAwC;EACtG,MAAM,KAAKA,SAAS,SAAS,KAAK,OAAO,SAAS;EAClD,OAAO,kBAAkB,MAAM;GAC9B,OAAO;GACP;GACA,YAAY;GACZ;GACA,aAAa,MAAM;EACpB,CAAC;CACF;AACD"}
@@ -0,0 +1,190 @@
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 { C as resolveVectorNamespace, _ as parseMetadata, a as deleteVectorsOutputSchema, c as upsertVectorsInputSchema, g as mergeVectorFilter, 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 } from "es-toolkit";
7
+ import { z } from "zod";
8
+ //#region src/vendors/pinecone/contracts.ts
9
+ const pineconeAuthSchema = z.object({
10
+ api_key: z.string().min(1).describe("Pinecone API key"),
11
+ base_url: z.string().url().describe("Pinecone index data-plane origin, for example https://xxxx.svc.….pinecone.io"),
12
+ default_namespace: z.string().min(1).optional().describe("Locked Pinecone namespace for all calls when set (tool cannot switch away)"),
13
+ default_filter: vectorDefaultFilterSchema.optional().describe("Host-bound metadata filter always applied on query; flat keys stamped on upsert")
14
+ });
15
+ //#endregion
16
+ //#region src/vendors/pinecone/client.ts
17
+ /**
18
+ * Pinecone data-plane REST vendor client.
19
+ * Host: `new PineconeClient(auth)`. Agent tools: `fromContext(ctx)`.
20
+ * @see https://docs.pinecone.io/reference/api/data-plane
21
+ */
22
+ var PineconeClient = class PineconeClient {
23
+ #http;
24
+ #defaultNamespace;
25
+ #defaultFilter;
26
+ constructor(auth, options = {}) {
27
+ const parsed = pineconeAuthSchema.safeParse(auth);
28
+ if (!parsed.success) throw new ToolError("Invalid Pinecone auth credentials", {
29
+ code: "bad_auth",
30
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
31
+ });
32
+ this.#defaultNamespace = parsed.data.default_namespace;
33
+ this.#defaultFilter = parsed.data.default_filter;
34
+ const httpOptions = {
35
+ baseURL: parsed.data.base_url,
36
+ headers: {
37
+ "Content-Type": "application/json",
38
+ "Api-Key": parsed.data.api_key
39
+ },
40
+ label: "Pinecone"
41
+ };
42
+ if (options.fetch) httpOptions.fetch = options.fetch;
43
+ if (options.signal) httpOptions.signal = options.signal;
44
+ this.#http = new HttpService(httpOptions);
45
+ }
46
+ static fromContext(ctx) {
47
+ const auth = requireAuth(ctx, pineconeAuthSchema);
48
+ const options = {};
49
+ if (ctx.fetch) options.fetch = ctx.fetch;
50
+ if (ctx.signal) options.signal = ctx.signal;
51
+ return new PineconeClient(auth, options);
52
+ }
53
+ #namespace(toolNamespace) {
54
+ return resolveVectorNamespace(this.#defaultNamespace, toolNamespace);
55
+ }
56
+ async upsert(input) {
57
+ const body = { vectors: input.vectors.map((point) => {
58
+ const metadata = stampDefaultFilterMetadata(point.metadata, this.#defaultFilter);
59
+ const row = {
60
+ id: point.id,
61
+ values: point.values
62
+ };
63
+ if (metadata) row["metadata"] = metadata;
64
+ return row;
65
+ }) };
66
+ const ns = this.#namespace(input.namespace);
67
+ if (ns) body["namespace"] = ns;
68
+ const res = await this.#http.post("/vectors/upsert", body, {
69
+ label: "Pinecone upsert",
70
+ noThrow: true
71
+ });
72
+ if (!res.ok) throw new ToolError(parseUpstreamMessage(res.data, `Pinecone upsert failed with HTTP ${res.status}`), {
73
+ code: mapVectorHttpStatus(res.status),
74
+ details: { status: res.status }
75
+ });
76
+ return { upserted: isPlainObject(res.data) && isNumber(res.data["upsertedCount"]) ? res.data["upsertedCount"] : input.vectors.length };
77
+ }
78
+ async query(input) {
79
+ const topK = input.top_k ?? 8;
80
+ const includeMetadata = input.include_metadata !== false;
81
+ const body = {
82
+ vector: input.vector,
83
+ topK,
84
+ includeMetadata,
85
+ includeValues: input.include_values === true
86
+ };
87
+ const ns = this.#namespace(input.namespace);
88
+ if (ns) body["namespace"] = ns;
89
+ const filter = mergeVectorFilter(this.#defaultFilter, input.filter);
90
+ if (filter) body["filter"] = filter;
91
+ const res = await this.#http.post("/query", body, {
92
+ label: "Pinecone query",
93
+ noThrow: true
94
+ });
95
+ if (!res.ok) throw new ToolError(parseUpstreamMessage(res.data, `Pinecone query failed with HTTP ${res.status}`), {
96
+ code: mapVectorHttpStatus(res.status),
97
+ details: { status: res.status }
98
+ });
99
+ const matchesRaw = isPlainObject(res.data) ? res.data["matches"] : void 0;
100
+ const rows = Array.isArray(matchesRaw) ? matchesRaw : [];
101
+ const matches = [];
102
+ for (const row of rows) {
103
+ if (!isPlainObject(row)) continue;
104
+ const id = parsePointId(row["id"]);
105
+ if (!id) continue;
106
+ const match = {
107
+ id,
108
+ score: isNumber(row["score"]) ? row["score"] : 0
109
+ };
110
+ if (includeMetadata) {
111
+ const meta = parseMetadata(row["metadata"]);
112
+ if (meta) match.metadata = meta;
113
+ }
114
+ if (input.include_values === true) {
115
+ const values = parseNumberArray(row["values"]);
116
+ if (values) match.values = values;
117
+ }
118
+ matches.push(match);
119
+ }
120
+ return { matches };
121
+ }
122
+ async delete(input) {
123
+ const body = { ids: input.ids };
124
+ const ns = this.#namespace(input.namespace);
125
+ if (ns) body["namespace"] = ns;
126
+ const res = await this.#http.post("/vectors/delete", body, {
127
+ label: "Pinecone delete",
128
+ noThrow: true
129
+ });
130
+ if (!res.ok) throw new ToolError(parseUpstreamMessage(res.data, `Pinecone delete failed with HTTP ${res.status}`), {
131
+ code: mapVectorHttpStatus(res.status),
132
+ details: { status: res.status }
133
+ });
134
+ return { deleted: input.ids.length };
135
+ }
136
+ };
137
+ //#endregion
138
+ //#region src/vendors/pinecone/module.ts
139
+ const pineconeUpsertTool = defineTool({
140
+ id: "pinecone-upsert",
141
+ name: "pineconeUpsert",
142
+ description: "Upsert vectors into the configured Pinecone index. Use the optional namespace only when data must be isolated within the index.",
143
+ inputSchema: upsertVectorsInputSchema,
144
+ outputSchema: upsertVectorsOutputSchema,
145
+ sideEffect: "write",
146
+ runtime: "both",
147
+ execute: async (input, ctx) => PineconeClient.fromContext(ctx).upsert(input)
148
+ });
149
+ const pineconeQueryTool = defineTool({
150
+ id: "pinecone-query",
151
+ name: "pineconeQuery",
152
+ description: "Nearest-neighbor query against the bound Pinecone index.",
153
+ inputSchema: queryVectorsInputSchema,
154
+ outputSchema: queryVectorsOutputSchema,
155
+ sideEffect: "read",
156
+ runtime: "both",
157
+ execute: async (input, ctx) => PineconeClient.fromContext(ctx).query(input)
158
+ });
159
+ const pineconeDeleteTool = defineTool({
160
+ id: "pinecone-delete",
161
+ name: "pineconeDelete",
162
+ description: "Delete vectors by id from the bound Pinecone index.",
163
+ inputSchema: deleteVectorsInputSchema,
164
+ outputSchema: deleteVectorsOutputSchema,
165
+ sideEffect: "delete",
166
+ runtime: "both",
167
+ execute: async (input, ctx) => PineconeClient.fromContext(ctx).delete(input)
168
+ });
169
+ const pineconeModule = defineModule({
170
+ id: "pinecone",
171
+ title: "Pinecone",
172
+ description: "Pinecone data-plane REST: upsert, query, and delete vectors in a bound index.",
173
+ runtime: "both",
174
+ auth: {
175
+ type: "custom",
176
+ schema: pineconeAuthSchema
177
+ },
178
+ categories: ["ai", "vector"],
179
+ classification: "pii",
180
+ tags: ["pinecone"],
181
+ tools: [
182
+ pineconeUpsertTool,
183
+ pineconeQueryTool,
184
+ pineconeDeleteTool
185
+ ]
186
+ });
187
+ //#endregion
188
+ export { PineconeClient as a, pineconeUpsertTool as i, pineconeModule as n, pineconeAuthSchema as o, pineconeQueryTool as r, pineconeDeleteTool as t };
189
+
190
+ //# sourceMappingURL=pinecone-umY4t6OF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pinecone-umY4t6OF.js","names":["#http","#defaultNamespace","#defaultFilter","#namespace"],"sources":["../src/vendors/pinecone/contracts.ts","../src/vendors/pinecone/client.ts","../src/vendors/pinecone/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 pineconeAuthSchema = z.object({\n\tapi_key: z.string().min(1).describe('Pinecone API key'),\n\tbase_url: z.string().url().describe('Pinecone index data-plane origin, for example https://xxxx.svc.….pinecone.io'),\n\tdefault_namespace: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Locked Pinecone namespace for all calls when set (tool cannot switch away)'),\n\tdefault_filter: vectorDefaultFilterSchema\n\t\t.optional()\n\t\t.describe('Host-bound metadata filter always applied on query; flat keys stamped on upsert')\n})\n\nexport type PineconeAuth = z.infer<typeof pineconeAuthSchema>\n","/**\n * Pinecone data-plane REST vendor client.\n * Host: `new PineconeClient(auth)`. Agent tools: `fromContext(ctx)`.\n * @see https://docs.pinecone.io/reference/api/data-plane\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\tmergeVectorFilter,\n\tparseMetadata,\n\tparseNumberArray,\n\tparsePointId,\n\tparseUpstreamMessage,\n\tresolveVectorNamespace,\n\tstampDefaultFilterMetadata\n} from '../_vector/domain'\nimport type { VectorDefaultFilter } from '../_vector/domain'\nimport type {\n\tDeleteVectorsInput,\n\tDeleteVectorsOutput,\n\tPineconeAuth,\n\tQueryVectorsInput,\n\tQueryVectorsOutput,\n\tUpsertVectorsInput,\n\tUpsertVectorsOutput,\n\tVectorMatch\n} from './contracts'\nimport { pineconeAuthSchema } from './contracts'\n\nexport type PineconeClientOptions = {\n\tfetch?: HttpServiceOptions['fetch'] | undefined\n\tsignal?: HttpServiceOptions['signal'] | undefined\n}\n\nexport class PineconeClient {\n\treadonly #http: HttpService\n\treadonly #defaultNamespace: string | undefined\n\treadonly #defaultFilter: VectorDefaultFilter | undefined\n\n\tconstructor(auth: PineconeAuth, options: PineconeClientOptions = {}) {\n\t\tconst parsed = pineconeAuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid Pinecone 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.#defaultNamespace = parsed.data.default_namespace\n\t\tthis.#defaultFilter = parsed.data.default_filter\n\t\tconst httpOptions: HttpServiceOptions = {\n\t\t\tbaseURL: parsed.data.base_url,\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/json',\n\t\t\t\t'Api-Key': parsed.data.api_key\n\t\t\t},\n\t\t\tlabel: 'Pinecone'\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): PineconeClient {\n\t\tconst auth = requireAuth(ctx, pineconeAuthSchema)\n\t\tconst options: PineconeClientOptions = {}\n\t\tif (ctx.fetch) options.fetch = ctx.fetch\n\t\tif (ctx.signal) options.signal = ctx.signal\n\t\treturn new PineconeClient(auth, options)\n\t}\n\n\t#namespace(toolNamespace: string | undefined): string | undefined {\n\t\treturn resolveVectorNamespace(this.#defaultNamespace, toolNamespace)\n\t}\n\n\tasync upsert(input: UpsertVectorsInput): Promise<UpsertVectorsOutput> {\n\t\tconst body: Record<string, unknown> = {\n\t\t\tvectors: input.vectors.map((point) => {\n\t\t\t\tconst metadata = stampDefaultFilterMetadata(point.metadata, this.#defaultFilter)\n\t\t\t\tconst row: Record<string, unknown> = { id: point.id, values: point.values }\n\t\t\t\tif (metadata) row['metadata'] = metadata\n\t\t\t\treturn row\n\t\t\t})\n\t\t}\n\t\tconst ns = this.#namespace(input.namespace)\n\t\tif (ns) body['namespace'] = ns\n\n\t\tconst res = await this.#http.post('/vectors/upsert', body, {\n\t\t\tlabel: 'Pinecone upsert',\n\t\t\tnoThrow: true\n\t\t})\n\t\tif (!res.ok) {\n\t\t\tthrow new ToolError(parseUpstreamMessage(res.data, `Pinecone 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\tconst upserted =\n\t\t\tisPlainObject(res.data) && isNumber(res.data['upsertedCount']) ? res.data['upsertedCount'] : input.vectors.length\n\t\treturn { upserted }\n\t}\n\n\tasync query(input: QueryVectorsInput): Promise<QueryVectorsOutput> {\n\t\tconst topK = input.top_k ?? 8\n\t\tconst includeMetadata = input.include_metadata !== false\n\t\tconst body: Record<string, unknown> = {\n\t\t\tvector: input.vector,\n\t\t\ttopK,\n\t\t\tincludeMetadata,\n\t\t\tincludeValues: input.include_values === true\n\t\t}\n\t\tconst ns = this.#namespace(input.namespace)\n\t\tif (ns) body['namespace'] = ns\n\t\tconst filter = mergeVectorFilter(this.#defaultFilter, input.filter)\n\t\tif (filter) body['filter'] = filter\n\n\t\tconst res = await this.#http.post('/query', body, { label: 'Pinecone query', noThrow: true })\n\t\tif (!res.ok) {\n\t\t\tthrow new ToolError(parseUpstreamMessage(res.data, `Pinecone query 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 matchesRaw = isPlainObject(res.data) ? res.data['matches'] : undefined\n\t\tconst rows = Array.isArray(matchesRaw) ? matchesRaw : []\n\t\tconst matches: VectorMatch[] = []\n\t\tfor (const row of rows) {\n\t\t\tif (!isPlainObject(row)) continue\n\t\t\tconst id = parsePointId(row['id'])\n\t\t\tif (!id) continue\n\t\t\tconst score = isNumber(row['score']) ? row['score'] : 0\n\t\t\tconst match: VectorMatch = { id, score }\n\t\t\tif (includeMetadata) {\n\t\t\t\tconst meta = parseMetadata(row['metadata'])\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['values'])\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 }\n\t}\n\n\tasync delete(input: DeleteVectorsInput): Promise<DeleteVectorsOutput> {\n\t\tconst body: Record<string, unknown> = { ids: input.ids }\n\t\tconst ns = this.#namespace(input.namespace)\n\t\tif (ns) body['namespace'] = ns\n\n\t\tconst res = await this.#http.post('/vectors/delete', body, {\n\t\t\tlabel: 'Pinecone delete',\n\t\t\tnoThrow: true\n\t\t})\n\t\tif (!res.ok) {\n\t\t\tthrow new ToolError(parseUpstreamMessage(res.data, `Pinecone 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 }\n\t}\n}\n","import { defineModule, defineTool } from '../../core/define'\nimport { PineconeClient } from './client'\nimport {\n\tdeleteVectorsInputSchema,\n\tdeleteVectorsOutputSchema,\n\tpineconeAuthSchema,\n\tqueryVectorsInputSchema,\n\tqueryVectorsOutputSchema,\n\tupsertVectorsInputSchema,\n\tupsertVectorsOutputSchema\n} from './contracts'\n\nexport const pineconeUpsertTool = defineTool({\n\tid: 'pinecone-upsert',\n\tname: 'pineconeUpsert',\n\tdescription:\n\t\t'Upsert vectors into the configured Pinecone index. Use the optional namespace only when data must be isolated within the index.',\n\tinputSchema: upsertVectorsInputSchema,\n\toutputSchema: upsertVectorsOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => PineconeClient.fromContext(ctx).upsert(input)\n})\n\nexport const pineconeQueryTool = defineTool({\n\tid: 'pinecone-query',\n\tname: 'pineconeQuery',\n\tdescription: 'Nearest-neighbor query against the bound Pinecone index.',\n\tinputSchema: queryVectorsInputSchema,\n\toutputSchema: queryVectorsOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => PineconeClient.fromContext(ctx).query(input)\n})\n\nexport const pineconeDeleteTool = defineTool({\n\tid: 'pinecone-delete',\n\tname: 'pineconeDelete',\n\tdescription: 'Delete vectors by id from the bound Pinecone index.',\n\tinputSchema: deleteVectorsInputSchema,\n\toutputSchema: deleteVectorsOutputSchema,\n\tsideEffect: 'delete',\n\truntime: 'both',\n\texecute: async (input, ctx) => PineconeClient.fromContext(ctx).delete(input)\n})\n\nexport const pineconeModule = defineModule({\n\tid: 'pinecone',\n\ttitle: 'Pinecone',\n\tdescription: 'Pinecone data-plane REST: upsert, query, and delete vectors in a bound index.',\n\truntime: 'both',\n\tauth: { type: 'custom', schema: pineconeAuthSchema },\n\tcategories: ['ai', 'vector'],\n\tclassification: 'pii',\n\ttags: ['pinecone'],\n\ttools: [pineconeUpsertTool, pineconeQueryTool, pineconeDeleteTool]\n})\n"],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import { t as ToolError } from "./errors-DoSpNHvs.js";
2
+ //#region src/core/provider.ts
3
+ function defineProvider(options) {
4
+ if (!options.id.trim()) throw new Error("Provider id is required");
5
+ if (!options.title.trim()) throw new Error(`Provider ${options.id} is missing a title`);
6
+ return {
7
+ id: options.id,
8
+ title: options.title,
9
+ authSchema: options.authSchema,
10
+ ops: options.ops
11
+ };
12
+ }
13
+ /** Resolve a registered provider by `auth.provider`. */
14
+ function resolveProvider(providers, auth) {
15
+ const found = providers.find((provider) => provider.id === auth.provider);
16
+ if (!found) throw new ToolError(`Unknown provider: ${auth.provider}`, {
17
+ code: "bad_auth",
18
+ details: { provider: auth.provider }
19
+ });
20
+ return found;
21
+ }
22
+ /** Parse host-bound credentials for a module auth schema. */
23
+ function requireAuth(ctx, schema) {
24
+ const parsed = schema.safeParse(ctx.auth);
25
+ if (!parsed.success) throw new ToolError("Invalid auth credentials", {
26
+ code: "bad_auth",
27
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
28
+ });
29
+ return parsed.data;
30
+ }
31
+ //#endregion
32
+ export { requireAuth as n, resolveProvider as r, defineProvider as t };
33
+
34
+ //# sourceMappingURL=provider-CgDAlg6K.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider-CgDAlg6K.js","names":[],"sources":["../src/core/provider.ts"],"sourcesContent":["import type { z } from 'zod'\n\nimport { ToolError } from './errors'\nimport type { ToolContext } from './types'\n\n/**\n * Provider type-class entry for a capability module.\n * Auth schemas always include a `provider` literal discriminator.\n * Ops receive auth only via `ctx.auth` (never tool inputs).\n */\nexport type ProviderDefinition<TId extends string = string, TAuth = unknown, TOps = unknown> = {\n\tid: TId\n\ttitle: string\n\tauthSchema: z.ZodType<TAuth>\n\tops: TOps\n}\n\nexport type ProviderAuthBase = {\n\tprovider: string\n}\n\nexport function defineProvider<const TId extends string, TAuth extends { provider: TId }, TOps>(options: {\n\tid: TId\n\ttitle: string\n\tauthSchema: z.ZodType<TAuth>\n\tops: TOps\n}): ProviderDefinition<TId, TAuth, TOps> {\n\tif (!options.id.trim()) {\n\t\tthrow new Error('Provider id is required')\n\t}\n\tif (!options.title.trim()) {\n\t\tthrow new Error(`Provider ${options.id} is missing a title`)\n\t}\n\treturn {\n\t\tid: options.id,\n\t\ttitle: options.title,\n\t\tauthSchema: options.authSchema,\n\t\tops: options.ops\n\t}\n}\n\n/** Resolve a registered provider by `auth.provider`. */\nexport function resolveProvider<T extends ProviderDefinition>(providers: readonly T[], auth: ProviderAuthBase): T {\n\tconst found = providers.find((provider) => provider.id === auth.provider)\n\tif (!found) {\n\t\tthrow new ToolError(`Unknown provider: ${auth.provider}`, {\n\t\t\tcode: 'bad_auth',\n\t\t\tdetails: { provider: auth.provider }\n\t\t})\n\t}\n\treturn found\n}\n\n/** Parse host-bound credentials for a module auth schema. */\nexport function requireAuth<TAuth>(ctx: ToolContext, schema: z.ZodType<TAuth>): TAuth {\n\tconst parsed = schema.safeParse(ctx.auth)\n\tif (!parsed.success) {\n\t\tthrow new ToolError('Invalid auth credentials', {\n\t\t\tcode: 'bad_auth',\n\t\t\tdetails: { issues: parsed.error.issues.map((issue) => issue.message) }\n\t\t})\n\t}\n\treturn parsed.data\n}\n"],"mappings":";;AAqBA,SAAgB,eAAgF,SAKvD;CACxC,IAAI,CAAC,QAAQ,GAAG,KAAK,GACpB,MAAM,IAAI,MAAM,yBAAyB;CAE1C,IAAI,CAAC,QAAQ,MAAM,KAAK,GACvB,MAAM,IAAI,MAAM,YAAY,QAAQ,GAAG,oBAAoB;CAE5D,OAAO;EACN,IAAI,QAAQ;EACZ,OAAO,QAAQ;EACf,YAAY,QAAQ;EACpB,KAAK,QAAQ;CACd;AACD;;AAGA,SAAgB,gBAA8C,WAAyB,MAA2B;CACjH,MAAM,QAAQ,UAAU,MAAM,aAAa,SAAS,OAAO,KAAK,QAAQ;CACxE,IAAI,CAAC,OACJ,MAAM,IAAI,UAAU,qBAAqB,KAAK,YAAY;EACzD,MAAM;EACN,SAAS,EAAE,UAAU,KAAK,SAAS;CACpC,CAAC;CAEF,OAAO;AACR;;AAGA,SAAgB,YAAmB,KAAkB,QAAiC;CACrF,MAAM,SAAS,OAAO,UAAU,IAAI,IAAI;CACxC,IAAI,CAAC,OAAO,SACX,MAAM,IAAI,UAAU,4BAA4B;EAC/C,MAAM;EACN,SAAS,EAAE,QAAQ,OAAO,MAAM,OAAO,KAAK,UAAU,MAAM,OAAO,EAAE;CACtE,CAAC;CAEF,OAAO,OAAO;AACf"}