@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 @@
1
+ {"version":3,"file":"s3-CsOaPWMP.js","names":["#auth","#aws","#keyPrefix","#resolve","#getBoundedWire","#headWire","#publicKey","#resolveCopySourceKey"],"sources":["../src/vendors/_storage/keys.ts","../src/vendors/_storage/schemas.ts","../src/vendors/s3/contracts.ts","../src/vendors/s3/domain.ts","../src/vendors/s3/client.ts","../src/vendors/s3/module.ts"],"sourcesContent":["/**\n * Object-key prefix helpers for storage vendors (S3, Textract DocumentLocation, …).\n * Logical keys are prefix-relative; wire keys include key_prefix when set.\n */\n\nimport { isToolError, ToolError } from '../../core/errors'\n\n/** S3 object key maximum length (bytes, UTF-8). */\nexport const MAX_OBJECT_KEY_BYTES = 1024\n\nfunction utf8ByteLength(value: string): number {\n\treturn new TextEncoder().encode(value).byteLength\n}\n\nfunction assertKeyByteLimit(wireKey: string): void {\n\tconst bytes = utf8ByteLength(wireKey)\n\tif (bytes > MAX_OBJECT_KEY_BYTES) {\n\t\tthrow new ToolError(`Object key exceeds ${MAX_OBJECT_KEY_BYTES} bytes`, {\n\t\t\tcode: 'bad_input',\n\t\t\tdetails: { max_bytes: MAX_OBJECT_KEY_BYTES, key_bytes: bytes }\n\t\t})\n\t}\n}\n\n/**\n * Split a logical path into segments. Rejects parent segments and leading absolute form.\n * Allows names like `report..final.pdf` (only a segment equal to `..` is rejected).\n */\nfunction keySegments(\n\tvalue: string,\n\toptions: { allowEmpty?: boolean; allowTrailingSlash?: boolean } = {}\n): { segments: string[]; trailingSlash: boolean } {\n\tconst trimmed = value.trim().replaceAll('\\\\', '/')\n\tif (trimmed.startsWith('/')) {\n\t\tthrow new ToolError('Object key must not be absolute (no leading /)', { code: 'bad_input' })\n\t}\n\tconst trailingSlash = trimmed.endsWith('/')\n\tif (trailingSlash && options.allowTrailingSlash !== true) {\n\t\tthrow new ToolError('Object key must not end with /', { code: 'bad_input' })\n\t}\n\tconst segments = trimmed.split('/').filter((segment) => segment.length > 0 && segment !== '.')\n\tfor (const segment of segments) {\n\t\tif (segment === '..') {\n\t\t\tthrow new ToolError('Object key must not contain parent-directory segments', { code: 'bad_input' })\n\t\t}\n\t}\n\tif (segments.length === 0 && !options.allowEmpty && !trailingSlash) {\n\t\tthrow new ToolError('Object key is required', { code: 'bad_input' })\n\t}\n\treturn { segments, trailingSlash }\n}\n\nfunction joinSegments(segments: string[], trailingSlash: boolean): string {\n\tconst joined = segments.join('/')\n\tif (trailingSlash) return joined.length > 0 ? `${joined}/` : ''\n\treturn joined\n}\n\nfunction remapAuthError(error: unknown): never {\n\tif (isToolError(error) && error.code === 'bad_input') {\n\t\tthrow new ToolError(error.message.replace(/^Object key/, 'key_prefix'), {\n\t\t\tcode: 'bad_auth',\n\t\t\t...(error.details !== undefined && { details: error.details }),\n\t\t\tcause: error\n\t\t})\n\t}\n\tthrow error\n}\n\n/** Normalize key_prefix from auth: non-absolute, no `..` segments, always ends with `/`. */\nexport function normalizeKeyPrefix(keyPrefix: string): string {\n\ttry {\n\t\tconst { segments } = keySegments(keyPrefix, { allowEmpty: false, allowTrailingSlash: true })\n\t\tif (segments.length === 0) {\n\t\t\tthrow new ToolError('key_prefix must not be empty', { code: 'bad_auth' })\n\t\t}\n\t\tconst root = `${segments.join('/')}/`\n\t\tassertKeyByteLimit(root)\n\t\treturn root\n\t} catch (error) {\n\t\tremapAuthError(error)\n\t}\n}\n\n/**\n * Resolve a logical object key to a wire key.\n * - No prefix: validated logical key (normalized segments).\n * - With prefix: relative keys are rooted; keys already under the prefix are accepted as-is.\n */\nexport function resolveObjectKey(logicalKey: string, keyPrefix: string | undefined): string {\n\tconst { segments } = keySegments(logicalKey, { allowEmpty: false })\n\tconst logical = joinSegments(segments, false)\n\tif (!keyPrefix) {\n\t\tassertKeyByteLimit(logical)\n\t\treturn logical\n\t}\n\tconst wire = logical.startsWith(keyPrefix) ? logical : `${keyPrefix}${logical}`\n\tassertKeyByteLimit(wire)\n\treturn wire\n}\n\n/**\n * Resolve a list prefix filter under optional key_prefix.\n * Empty / omitted relative → bound prefix root (or undefined when unbound).\n */\nexport function resolveListPrefix(\n\trelativePrefix: string | undefined,\n\tkeyPrefix: string | undefined\n): string | undefined {\n\tif (relativePrefix === undefined || relativePrefix.trim().length === 0) {\n\t\treturn keyPrefix\n\t}\n\tconst { segments, trailingSlash } = keySegments(relativePrefix, {\n\t\tallowEmpty: true,\n\t\tallowTrailingSlash: true\n\t})\n\tconst logical = joinSegments(segments, trailingSlash)\n\tif (!keyPrefix) {\n\t\tif (logical.length === 0) return undefined\n\t\tassertKeyByteLimit(logical)\n\t\treturn logical\n\t}\n\tif (logical.length === 0 || logical === keyPrefix.slice(0, -1) || logical === keyPrefix) {\n\t\treturn keyPrefix\n\t}\n\tif (logical.startsWith(keyPrefix)) {\n\t\tassertKeyByteLimit(logical)\n\t\treturn logical\n\t}\n\tconst wire = `${keyPrefix}${logical}`\n\tassertKeyByteLimit(wire)\n\treturn wire\n}\n\n/**\n * Map a wire key back to a logical (public) key.\n * Returns undefined when the wire key is outside key_prefix (caller should skip/filter).\n */\nexport function toPublicKey(wireKey: string, keyPrefix: string | undefined): string | undefined {\n\tif (!keyPrefix) return wireKey\n\tif (!wireKey.startsWith(keyPrefix)) return undefined\n\treturn wireKey.slice(keyPrefix.length)\n}\n","/**\n * Shared object-store I/O schemas for the s3 vendor pack (and nested S3 bindings).\n * Not published — `_storage` is skipped by codegen.\n */\n\nimport { z } from 'zod'\n\nimport { batchResultSchema } from '../../shared/batch'\n\nexport const MAX_OBJECT_BYTES = 5 * 1024 * 1024\nexport const DEFAULT_SIGNED_URL_SECONDS = 3600\nexport const MAX_SIGNED_URL_SECONDS = 7 * 24 * 3600\nexport const MAX_BATCH_ITEMS = 25\nexport const MAX_MULTIPART_PART_BYTES = 25 * 1024 * 1024\n\nexport const listedObjectSchema = z.object({\n\tkey: z.string(),\n\tsize: z.number().optional(),\n\tlast_modified: z.string().optional(),\n\tetag: z.string().optional()\n})\n\nexport const listObjectsInputSchema = z.object({\n\tprefix: z.string().optional().describe('Key prefix filter'),\n\tdelimiter: z.string().optional().describe('Delimiter for common prefixes (folders), for example /'),\n\tcursor: z.string().min(1).optional().describe('Pagination cursor from a prior list call'),\n\tlimit: z.int().min(1).max(1000).optional().describe('Maximum keys to return (1-1000)')\n})\n\nexport const listObjectsOutputSchema = z.object({\n\tkeys: z.array(z.string()).describe('Object keys (convenience list)'),\n\titems: z.array(listedObjectSchema).describe('Objects with size, last_modified, and etag when present'),\n\tcommon_prefixes: z.array(z.string()).optional().describe('Common prefixes when delimiter is set'),\n\tnext_cursor: z.string().optional().describe('Pass as cursor to fetch the next page'),\n\ttruncated: z.boolean().describe('Whether more results exist')\n})\n\nexport const getObjectInputSchema = z.object({\n\tkey: z.string().min(1).describe('Object key to download'),\n\tencoding: z.enum(['base64', 'utf8']).optional().describe('Body encoding. Defaults to base64 for binary safety')\n})\n\nexport const getObjectOutputSchema = z.object({\n\tkey: z.string(),\n\tcontent_type: z.string().optional(),\n\tcontent_length: z.number().optional(),\n\tbody: z.string().describe('Object body encoded per encoding input'),\n\tencoding: z.enum(['base64', 'utf8'])\n})\n\nexport const putObjectInputSchema = z.object({\n\tkey: z.string().min(1).describe('Object key to write'),\n\tbody: z.string().describe('Object body as utf8 text or base64 (see body_encoding)'),\n\tbody_encoding: z.enum(['utf8', 'base64']).optional().describe('How to interpret body. Defaults to utf8'),\n\tcontent_type: z.string().optional().describe('Content-Type header to store')\n})\n\nexport const putObjectOutputSchema = z.object({\n\tkey: z.string(),\n\tetag: z.string().optional(),\n\tcontent_length: z.number().describe('Decoded body byte length uploaded')\n})\n\nexport const deleteObjectInputSchema = z.object({\n\tkey: z.string().min(1).describe('Object key to delete')\n})\n\nexport const deleteObjectOutputSchema = z.object({\n\tkey: z.string(),\n\tdeleted: z.boolean()\n})\n\nexport const headObjectInputSchema = z.object({\n\tkey: z.string().min(1).describe('Object key to inspect')\n})\n\nexport const headObjectOutputSchema = z.object({\n\tkey: z.string(),\n\texists: z.boolean(),\n\tcontent_type: z.string().optional(),\n\tcontent_length: z.number().optional(),\n\tetag: z.string().optional()\n})\n\nexport const copyObjectInputSchema = z.object({\n\tsource_key: z.string().min(1).describe('Source object key to copy from'),\n\tdestination_key: z.string().min(1).describe('Destination object key to copy to'),\n\tsource_bucket: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Optional source bucket when different from the configured default bucket')\n})\n\nexport const copyObjectOutputSchema = z.object({\n\tsource_key: z.string(),\n\tdestination_key: z.string(),\n\tetag: z.string().optional()\n})\n\nexport const signedUrlInputSchema = z.object({\n\tkey: z.string().min(1).describe('Object key to sign'),\n\tmethod: z\n\t\t.enum(['GET', 'PUT', 'HEAD', 'DELETE'])\n\t\t.optional()\n\t\t.describe('HTTP method the URL authorizes. Defaults to GET'),\n\texpires_in: z\n\t\t.int()\n\t\t.min(1)\n\t\t.max(MAX_SIGNED_URL_SECONDS)\n\t\t.optional()\n\t\t.describe('URL lifetime in seconds (1 to 604800). Defaults to 3600')\n})\n\nexport const signedUrlOutputSchema = z.object({\n\turl: z.url().describe('Presigned URL'),\n\tmethod: z.enum(['GET', 'PUT', 'HEAD', 'DELETE']),\n\texpires_in: z.int().describe('Lifetime in seconds used when signing')\n})\n\nexport const createMultipartUploadInputSchema = z.object({\n\tkey: z.string().min(1).describe('Object key to create via multipart upload'),\n\tcontent_type: z.string().optional().describe('Content-Type stored on the completed object')\n})\n\nexport const createMultipartUploadOutputSchema = z.object({\n\tkey: z.string(),\n\tupload_id: z.string().min(1).describe('Upload id required for subsequent part/complete/abort calls')\n})\n\nexport const uploadPartInputSchema = z.object({\n\tkey: z.string().min(1).describe('Object key for the in-progress multipart upload'),\n\tupload_id: z.string().min(1).describe('Upload id from createMultipartUpload'),\n\tpart_number: z.int().min(1).max(10_000).describe('Part number (1-10000). Must be unique within the upload'),\n\tbody: z.string().describe('Part body as utf8 text or base64 (see body_encoding)'),\n\tbody_encoding: z.enum(['utf8', 'base64']).optional().describe('How to interpret body. Defaults to utf8')\n})\n\nexport const uploadPartOutputSchema = z.object({\n\tkey: z.string(),\n\tupload_id: z.string(),\n\tpart_number: z.int(),\n\tetag: z.string().min(1).describe('Part ETag required when completing the multipart upload'),\n\tcontent_length: z.number().describe('Decoded part byte length uploaded')\n})\n\nexport const multipartUploadedPartSchema = z.object({\n\tpart_number: z.int().min(1).max(10_000).describe('Uploaded part number from s3-upload-part'),\n\tetag: z.string().min(1).describe('ETag returned by uploadPart (with or without surrounding quotes)')\n})\n\nexport const completeMultipartUploadInputSchema = z.object({\n\tkey: z.string().min(1).describe('Object key for the in-progress multipart upload'),\n\tupload_id: z.string().min(1).describe('Upload id from createMultipartUpload'),\n\tparts: z\n\t\t.array(multipartUploadedPartSchema)\n\t\t.min(1)\n\t\t.max(10_000)\n\t\t.describe('Uploaded parts with part_number and etag, in any order (sorted before complete)')\n})\n\nexport const completeMultipartUploadOutputSchema = z.object({\n\tkey: z.string(),\n\tupload_id: z.string(),\n\tetag: z.string().optional().describe('Final object ETag when the store returns one')\n})\n\nexport const abortMultipartUploadInputSchema = z.object({\n\tkey: z.string().min(1).describe('Object key for the in-progress multipart upload'),\n\tupload_id: z.string().min(1).describe('Upload id from createMultipartUpload')\n})\n\nexport const abortMultipartUploadOutputSchema = z.object({\n\tkey: z.string(),\n\tupload_id: z.string(),\n\taborted: z.boolean()\n})\n\nexport const getObjectsInputSchema = z.object({\n\tkeys: z.array(z.string().min(1)).min(1).max(MAX_BATCH_ITEMS).describe('Object keys to download'),\n\tencoding: z.enum(['base64', 'utf8']).optional().describe('Body encoding for each item. Defaults to base64')\n})\n\nexport const putObjectsInputSchema = z.object({\n\tobjects: z.array(putObjectInputSchema).min(1).max(MAX_BATCH_ITEMS).describe('Objects to upload')\n})\n\nexport const deleteObjectsInputSchema = z.object({\n\tkeys: z.array(z.string().min(1)).min(1).max(MAX_BATCH_ITEMS).describe('Object keys to delete')\n})\n\nexport const getObjectsOutputSchema = batchResultSchema(getObjectOutputSchema)\nexport const putObjectsOutputSchema = batchResultSchema(putObjectOutputSchema)\nexport const deleteObjectsOutputSchema = batchResultSchema(deleteObjectOutputSchema)\n\nexport type ListObjectsInput = z.infer<typeof listObjectsInputSchema>\nexport type ListObjectsOutput = z.infer<typeof listObjectsOutputSchema>\nexport type GetObjectInput = z.infer<typeof getObjectInputSchema>\nexport type GetObjectOutput = z.infer<typeof getObjectOutputSchema>\nexport type PutObjectInput = z.infer<typeof putObjectInputSchema>\nexport type PutObjectOutput = z.infer<typeof putObjectOutputSchema>\nexport type DeleteObjectInput = z.infer<typeof deleteObjectInputSchema>\nexport type DeleteObjectOutput = z.infer<typeof deleteObjectOutputSchema>\nexport type HeadObjectInput = z.infer<typeof headObjectInputSchema>\nexport type HeadObjectOutput = z.infer<typeof headObjectOutputSchema>\nexport type CopyObjectInput = z.infer<typeof copyObjectInputSchema>\nexport type CopyObjectOutput = z.infer<typeof copyObjectOutputSchema>\nexport type SignedUrlInput = z.infer<typeof signedUrlInputSchema>\nexport type SignedUrlOutput = z.infer<typeof signedUrlOutputSchema>\nexport type CreateMultipartUploadInput = z.infer<typeof createMultipartUploadInputSchema>\nexport type CreateMultipartUploadOutput = z.infer<typeof createMultipartUploadOutputSchema>\nexport type UploadPartInput = z.infer<typeof uploadPartInputSchema>\nexport type UploadPartOutput = z.infer<typeof uploadPartOutputSchema>\nexport type CompleteMultipartUploadInput = z.infer<typeof completeMultipartUploadInputSchema>\nexport type CompleteMultipartUploadOutput = z.infer<typeof completeMultipartUploadOutputSchema>\nexport type AbortMultipartUploadInput = z.infer<typeof abortMultipartUploadInputSchema>\nexport type AbortMultipartUploadOutput = z.infer<typeof abortMultipartUploadOutputSchema>\n","/**\n * S3 / S3-compatible vendor auth + re-exports of shared object-store I/O.\n */\n\nimport { z } from 'zod'\n\nexport {\n\tabortMultipartUploadInputSchema,\n\tabortMultipartUploadOutputSchema,\n\tcompleteMultipartUploadInputSchema,\n\tcompleteMultipartUploadOutputSchema,\n\tcopyObjectInputSchema,\n\tcopyObjectOutputSchema,\n\tcreateMultipartUploadInputSchema,\n\tcreateMultipartUploadOutputSchema,\n\tDEFAULT_SIGNED_URL_SECONDS,\n\tdeleteObjectInputSchema,\n\tdeleteObjectOutputSchema,\n\tgetObjectInputSchema,\n\tgetObjectOutputSchema,\n\theadObjectInputSchema,\n\theadObjectOutputSchema,\n\tlistObjectsInputSchema,\n\tlistObjectsOutputSchema,\n\tlistedObjectSchema,\n\tMAX_MULTIPART_PART_BYTES,\n\tMAX_OBJECT_BYTES,\n\tMAX_SIGNED_URL_SECONDS,\n\tmultipartUploadedPartSchema,\n\tputObjectInputSchema,\n\tputObjectOutputSchema,\n\tsignedUrlInputSchema,\n\tsignedUrlOutputSchema,\n\tuploadPartInputSchema,\n\tuploadPartOutputSchema\n} from '../_storage'\nexport type {\n\tAbortMultipartUploadInput,\n\tAbortMultipartUploadOutput,\n\tCompleteMultipartUploadInput,\n\tCompleteMultipartUploadOutput,\n\tCopyObjectInput,\n\tCopyObjectOutput,\n\tCreateMultipartUploadInput,\n\tCreateMultipartUploadOutput,\n\tDeleteObjectInput,\n\tDeleteObjectOutput,\n\tGetObjectInput,\n\tGetObjectOutput,\n\tHeadObjectInput,\n\tHeadObjectOutput,\n\tListObjectsInput,\n\tListObjectsOutput,\n\tPutObjectInput,\n\tPutObjectOutput,\n\tSignedUrlInput,\n\tSignedUrlOutput,\n\tUploadPartInput,\n\tUploadPartOutput\n} from '../_storage'\n\nexport const s3AuthSchema = z.object({\n\taccess_key_id: z.string().min(1).describe('S3 access key id'),\n\tsecret_access_key: z.string().min(1).describe('S3 secret access key'),\n\tregion: z.string().min(1).describe('AWS region, or auto / us-east-1 for R2 S3 endpoint'),\n\tbucket: z.string().min(1).describe('Default bucket name'),\n\tendpoint: z\n\t\t.url()\n\t\t.optional()\n\t\t.describe('S3-compatible endpoint when not AWS (R2: https://<account_id>.r2.cloudflarestorage.com, MinIO, …)'),\n\tsession_token: z.string().min(1).optional().describe('Optional session token for temporary credentials'),\n\tkey_prefix: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe(\n\t\t\t'Optional object-key root for this binding (no leading slash). Logical keys are relative to this prefix; wire keys include it. Host tenant scoping binds once here.'\n\t\t)\n})\n\nexport type S3Auth = z.infer<typeof s3AuthSchema>\n","/**\n * S3 URL building + XML response parse (fast-xml-parser).\n */\n\nimport { isPlainObject, isString } from 'es-toolkit'\nimport { isArray } from 'es-toolkit/compat'\nimport { XMLParser } from 'fast-xml-parser'\n\nimport { encodeObjectKeyPath } from '../../shared/bytes'\nimport type { S3Auth } from './contracts'\n\nexport type ListedObject = {\n\tkey: string\n\tsize?: number\n\tlast_modified?: string\n\tetag?: string\n}\n\nexport type ParsedListResult = {\n\titems: ListedObject[]\n\ttruncated: boolean\n\tnext_cursor?: string\n\tcommon_prefixes?: string[]\n}\n\nconst listParser = new XMLParser({\n\tignoreAttributes: true,\n\ttrimValues: true,\n\t// Always arrays so single Contents/CommonPrefixes match multi-item shape\n\tisArray: (name) => name === 'Contents' || name === 'CommonPrefixes'\n})\n\nconst genericParser = new XMLParser({\n\tignoreAttributes: true,\n\ttrimValues: true\n})\n\nexport function objectUrl(auth: S3Auth, key: string, query?: string): string {\n\tconst encodedKey = encodeObjectKeyPath(key)\n\tconst base = auth.endpoint\n\t\t? `${auth.endpoint.replace(/\\/+$/, '')}/${encodeURIComponent(auth.bucket)}/${encodedKey}`\n\t\t: `https://${auth.bucket}.s3.${auth.region}.amazonaws.com/${encodedKey}`\n\treturn query ? `${base}?${query}` : base\n}\n\nexport function listUrl(auth: S3Auth, params: URLSearchParams): string {\n\tconst base = auth.endpoint\n\t\t? `${auth.endpoint.replace(/\\/+$/, '')}/${encodeURIComponent(auth.bucket)}`\n\t\t: `https://${auth.bucket}.s3.${auth.region}.amazonaws.com`\n\tconst qs = params.toString()\n\treturn qs ? `${base}?${qs}` : base\n}\n\nexport function copySourceHeader(auth: S3Auth, sourceKey: string, sourceBucket?: string): string {\n\tconst bucket = sourceBucket ?? auth.bucket\n\treturn `/${encodeURIComponent(bucket)}/${encodeObjectKeyPath(sourceKey)}`\n}\n\nexport function stripEtagQuotes(etag: string): string {\n\treturn etag.replaceAll('\"', '')\n}\n\n/** Parse `Content-Range: bytes start-end/total` → total object size when known. */\nexport function contentRangeTotal(header: string | null): number | undefined {\n\tif (header === null || header.length === 0) return undefined\n\tconst slash = header.lastIndexOf('/')\n\tif (slash < 0) return undefined\n\tconst totalRaw = header.slice(slash + 1).trim()\n\tif (totalRaw === '*' || totalRaw.length === 0) return undefined\n\tconst total = Number.parseInt(totalRaw, 10)\n\treturn Number.isFinite(total) ? total : undefined\n}\n\nfunction asArray(value: unknown): unknown[] {\n\tif (value === undefined || value === null) return []\n\treturn isArray(value) ? value : [value]\n}\n\nfunction textValue(value: unknown): string | undefined {\n\tif (isString(value) && value.length > 0) return value\n\tif (typeof value === 'number' && Number.isFinite(value)) return String(value)\n\tif (typeof value === 'boolean') return value ? 'true' : 'false'\n\treturn undefined\n}\n\nfunction numberValue(value: unknown): number | undefined {\n\tif (typeof value === 'number' && Number.isFinite(value)) return value\n\tif (isString(value) && value.length > 0) {\n\t\tconst n = Number.parseInt(value, 10)\n\t\treturn Number.isFinite(n) ? n : undefined\n\t}\n\treturn undefined\n}\n\n/** Parse ListObjectsV2 XML into list items + pagination. */\nexport function parseListResult(xml: string): ParsedListResult {\n\tconst doc: unknown = listParser.parse(xml)\n\tconst root =\n\t\tisPlainObject(doc) && isPlainObject(doc['ListBucketResult'])\n\t\t\t? doc['ListBucketResult']\n\t\t\t: isPlainObject(doc)\n\t\t\t\t? doc\n\t\t\t\t: null\n\tif (!root) {\n\t\treturn { items: [], truncated: false }\n\t}\n\n\tconst items: ListedObject[] = []\n\tfor (const row of asArray(root['Contents'])) {\n\t\tif (!isPlainObject(row)) continue\n\t\tconst key = textValue(row['Key'])\n\t\tif (!key) continue\n\t\tconst size = numberValue(row['Size'])\n\t\tconst last_modified = textValue(row['LastModified'])\n\t\tconst etagRaw = textValue(row['ETag'])\n\t\tconst etag = etagRaw ? stripEtagQuotes(etagRaw) : undefined\n\t\titems.push({\n\t\t\tkey,\n\t\t\t...(size !== undefined && { size }),\n\t\t\t...(last_modified && { last_modified }),\n\t\t\t...(etag && { etag })\n\t\t})\n\t}\n\n\tconst truncatedRaw = root['IsTruncated']\n\tconst truncated =\n\t\ttruncatedRaw === true ||\n\t\ttruncatedRaw === 'true' ||\n\t\t(isString(truncatedRaw) && truncatedRaw.toLowerCase() === 'true')\n\n\tconst next = textValue(root['NextContinuationToken'])\n\tconst common_prefixes: string[] = []\n\tfor (const row of asArray(root['CommonPrefixes'])) {\n\t\tif (!isPlainObject(row)) continue\n\t\tconst prefix = textValue(row['Prefix'])\n\t\tif (prefix) common_prefixes.push(prefix)\n\t}\n\n\treturn {\n\t\titems,\n\t\ttruncated,\n\t\t...(next && { next_cursor: next }),\n\t\t...(common_prefixes.length > 0 && { common_prefixes })\n\t}\n}\n\n/** First text value for a tag anywhere in a small S3 XML body (ETag, UploadId, …). */\nexport function firstXmlText(xml: string, tag: string): string | undefined {\n\tconst doc: unknown = genericParser.parse(xml)\n\treturn findTagText(doc, tag)\n}\n\nfunction findTagText(node: unknown, tag: string): string | undefined {\n\tif (!isPlainObject(node)) return undefined\n\tif (Object.hasOwn(node, tag)) {\n\t\tconst direct = textValue(node[tag])\n\t\tif (direct) return direct\n\t}\n\tfor (const value of Object.values(node)) {\n\t\tconst found = findTagText(value, tag)\n\t\tif (found) return found\n\t}\n\treturn undefined\n}\n","/**\n * S3 / S3-compatible object-store client (AwsService SigV4).\n * Host: `new S3Client(auth)`. Agent tools: `fromContext(ctx)`.\n *\n * When auth.key_prefix is set, public API keys are logical (prefix-relative);\n * wire keys always include the prefix. Resolve once; private methods take wire keys.\n */\n\nimport { isNil, isNumber, isString } from 'es-toolkit'\n\nimport { isToolError, ToolError } from '../../core/errors'\nimport { requireAuth } from '../../core/provider'\nimport type { ToolContext } from '../../core/types'\nimport { base64ToBytes, bytesToBase64, bytesToUtf8, toArrayBuffer, utf8ToBytes } from '../../shared/bytes'\nimport { AwsService } from '../../transport/aws-service'\nimport type { AwsServiceOptions } from '../../transport/aws-service'\nimport type { HttpServiceOptions } from '../../transport/http-service'\nimport { normalizeKeyPrefix, resolveListPrefix, resolveObjectKey, toPublicKey } from '../_storage'\nimport type {\n\tAbortMultipartUploadInput,\n\tAbortMultipartUploadOutput,\n\tCompleteMultipartUploadInput,\n\tCompleteMultipartUploadOutput,\n\tCopyObjectInput,\n\tCopyObjectOutput,\n\tCreateMultipartUploadInput,\n\tCreateMultipartUploadOutput,\n\tDeleteObjectInput,\n\tDeleteObjectOutput,\n\tGetObjectInput,\n\tGetObjectOutput,\n\tHeadObjectInput,\n\tHeadObjectOutput,\n\tListObjectsInput,\n\tListObjectsOutput,\n\tPutObjectInput,\n\tPutObjectOutput,\n\tS3Auth,\n\tSignedUrlInput,\n\tSignedUrlOutput,\n\tUploadPartInput,\n\tUploadPartOutput\n} from './contracts'\nimport { DEFAULT_SIGNED_URL_SECONDS, MAX_MULTIPART_PART_BYTES, MAX_OBJECT_BYTES, s3AuthSchema } from './contracts'\nimport {\n\tcontentRangeTotal,\n\tcopySourceHeader,\n\tfirstXmlText,\n\tlistUrl,\n\tobjectUrl,\n\tparseListResult,\n\tstripEtagQuotes\n} from './domain'\n\nexport type S3ClientOptions = Pick<HttpServiceOptions, 'fetch' | 'signal'>\n\nexport type S3ByteRange = {\n\tstart_byte: number\n\tend_byte: number\n}\n\nexport type S3ByteRangeResult = {\n\tbytes: Uint8Array\n\tstart_byte: number\n\tend_byte: number\n\ttotal_bytes?: number | undefined\n\tcontent_type?: string | undefined\n}\n\nfunction objectNotFound(): never {\n\tthrow new ToolError('Object not found', { code: 'not_found' })\n}\n\nfunction remapNotFound(error: unknown): never {\n\tif (isToolError(error) && error.code === 'not_found') objectNotFound()\n\tthrow error\n}\n\nfunction tooLarge(maxBytes: number, contentLength: number, message: string, cause?: unknown): never {\n\tthrow new ToolError(message, {\n\t\tcode: 'too_large',\n\t\tdetails: { max_bytes: maxBytes, content_length: contentLength },\n\t\t...(cause !== undefined && { cause })\n\t})\n}\n\nfunction assertByteLimit(maxBytes: number): void {\n\tif (!Number.isSafeInteger(maxBytes) || maxBytes < 0) {\n\t\tthrow new ToolError('Download limit must be a non-negative safe integer', { code: 'bad_input' })\n\t}\n}\n\nexport class S3Client {\n\treadonly #auth: S3Auth\n\treadonly #aws: AwsService\n\t/** Normalized key_prefix with trailing `/`, or undefined when unbound. */\n\treadonly #keyPrefix: string | undefined\n\n\tconstructor(auth: S3Auth, options: S3ClientOptions = {}) {\n\t\tconst parsed = s3AuthSchema.safeParse(auth)\n\t\tif (!parsed.success) {\n\t\t\tthrow new ToolError('Invalid S3 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.#auth = parsed.data\n\t\tthis.#keyPrefix = parsed.data.key_prefix !== undefined ? normalizeKeyPrefix(parsed.data.key_prefix) : undefined\n\n\t\tconst awsOptions: AwsServiceOptions = {\n\t\t\taccessKeyId: this.#auth.access_key_id,\n\t\t\tsecretAccessKey: this.#auth.secret_access_key,\n\t\t\tregion: this.#auth.region,\n\t\t\tservice: 's3',\n\t\t\tlabel: 'S3'\n\t\t}\n\t\tif (options.fetch) awsOptions.fetch = options.fetch\n\t\tif (options.signal) awsOptions.signal = options.signal\n\t\tif (this.#auth.session_token) awsOptions.sessionToken = this.#auth.session_token\n\t\tthis.#aws = new AwsService(awsOptions)\n\t}\n\n\tstatic fromContext(ctx: ToolContext): S3Client {\n\t\tconst auth = requireAuth(ctx, s3AuthSchema)\n\t\tconst options: S3ClientOptions = {}\n\t\tif (ctx.fetch) options.fetch = ctx.fetch\n\t\tif (ctx.signal) options.signal = ctx.signal\n\t\treturn new S3Client(auth, options)\n\t}\n\n\t#resolve(logicalKey: string): string {\n\t\treturn resolveObjectKey(logicalKey, this.#keyPrefix)\n\t}\n\n\t#publicKey(wireKey: string): string {\n\t\tconst publicKey = toPublicKey(wireKey, this.#keyPrefix)\n\t\tif (publicKey === undefined) {\n\t\t\tthrow new ToolError('Object key is outside the bound key_prefix', { code: 'bad_input' })\n\t\t}\n\t\treturn publicKey\n\t}\n\n\t/** Source key for copy: scoped only when same bucket as this client. */\n\t#resolveCopySourceKey(sourceKey: string, sourceBucket: string | undefined): string {\n\t\tconst sameBucket = sourceBucket === undefined || sourceBucket === this.#auth.bucket\n\t\tif (sameBucket) return this.#resolve(sourceKey)\n\t\t// Foreign bucket: validate shape only; do not apply this binding's key_prefix.\n\t\treturn resolveObjectKey(sourceKey, undefined)\n\t}\n\n\tasync list(input: ListObjectsInput): Promise<ListObjectsOutput> {\n\t\tconst prefix = resolveListPrefix(input.prefix, this.#keyPrefix)\n\t\tconst params = new URLSearchParams({ 'list-type': '2' })\n\t\tif (prefix !== undefined) params.set('prefix', prefix)\n\t\tif (input.delimiter) params.set('delimiter', input.delimiter)\n\t\tif (input.cursor) params.set('continuation-token', input.cursor)\n\t\tif (input.limit !== undefined) params.set('max-keys', String(input.limit))\n\n\t\tconst { bytes } = await this.#aws.bytes('GET', listUrl(this.#auth, params), { label: 'S3 list' })\n\t\tconst listed = parseListResult(bytesToUtf8(bytes))\n\n\t\tconst items = []\n\t\tconst keys: string[] = []\n\t\tfor (const obj of listed.items) {\n\t\t\tconst publicKey = toPublicKey(obj.key, this.#keyPrefix)\n\t\t\tif (publicKey === undefined) continue\n\t\t\tkeys.push(publicKey)\n\t\t\titems.push({\n\t\t\t\tkey: publicKey,\n\t\t\t\t...(obj.size !== undefined && { size: obj.size }),\n\t\t\t\t...(obj.last_modified && { last_modified: obj.last_modified }),\n\t\t\t\t...(obj.etag && { etag: obj.etag })\n\t\t\t})\n\t\t}\n\n\t\tconst out: ListObjectsOutput = {\n\t\t\tkeys,\n\t\t\titems,\n\t\t\ttruncated: listed.truncated\n\t\t}\n\t\tif (listed.common_prefixes && listed.common_prefixes.length > 0) {\n\t\t\tconst common: string[] = []\n\t\t\tfor (const folderAbs of listed.common_prefixes) {\n\t\t\t\tconst publicPrefix = toPublicKey(folderAbs, this.#keyPrefix)\n\t\t\t\tif (publicPrefix !== undefined) common.push(publicPrefix)\n\t\t\t}\n\t\t\tif (common.length > 0) out.common_prefixes = common\n\t\t}\n\t\tif (listed.next_cursor) out.next_cursor = listed.next_cursor\n\t\treturn out\n\t}\n\n\t/** HEAD size gate plus a bounded Range GET (wire key only). */\n\tasync #getBoundedWire(\n\t\twireKey: string,\n\t\tmaxBytes: number,\n\t\tlimitMessage: string\n\t): Promise<{ bytes: Uint8Array; headers: Headers; head: HeadObjectOutput }> {\n\t\tassertByteLimit(maxBytes)\n\t\tconst head = await this.#headWire(wireKey)\n\t\tif (!head.exists) objectNotFound()\n\t\tif (!isNil(head.content_length) && head.content_length > maxBytes) {\n\t\t\ttooLarge(maxBytes, head.content_length, limitMessage)\n\t\t}\n\t\tif (head.content_length === 0) {\n\t\t\tconst headers = new Headers({ 'content-length': '0' })\n\t\t\tif (head.content_type) headers.set('content-type', head.content_type)\n\t\t\tif (head.etag) headers.set('etag', `\"${head.etag}\"`)\n\t\t\treturn { bytes: new Uint8Array(), headers, head }\n\t\t}\n\n\t\tconst headers: Record<string, string> = { Range: `bytes=0-${maxBytes}` }\n\t\tif (head.etag) headers['If-Match'] = head.etag.startsWith('\"') ? head.etag : `\"${head.etag}\"`\n\n\t\tlet response\n\t\ttry {\n\t\t\tresponse = await this.#aws.bytes('GET', objectUrl(this.#auth, wireKey), {\n\t\t\t\tlabel: 'S3 get',\n\t\t\t\theaders,\n\t\t\t\tmaxBytes\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tif (isToolError(error) && error.code === 'too_large') {\n\t\t\t\tconst observed = error.details?.['content_length']\n\t\t\t\ttooLarge(\n\t\t\t\t\tmaxBytes,\n\t\t\t\t\tisNumber(observed) && Number.isFinite(observed) ? observed : maxBytes + 1,\n\t\t\t\t\tlimitMessage,\n\t\t\t\t\terror\n\t\t\t\t)\n\t\t\t}\n\t\t\tif (isToolError(error) && error.details?.['status'] === 412) {\n\t\t\t\tthrow new ToolError('Object changed during download', {\n\t\t\t\t\tcode: 'upstream',\n\t\t\t\t\tdetails: { status: 412, key: this.#publicKey(wireKey) },\n\t\t\t\t\tcause: error\n\t\t\t\t})\n\t\t\t}\n\t\t\tremapNotFound(error)\n\t\t}\n\n\t\tconst total = contentRangeTotal(response.headers.get('content-range'))\n\t\tif (total !== undefined && total > maxBytes) tooLarge(maxBytes, total, limitMessage)\n\t\treturn { bytes: response.bytes, headers: response.headers, head }\n\t}\n\n\tasync #headWire(wireKey: string): Promise<HeadObjectOutput> {\n\t\tconst response = await this.#aws.head(objectUrl(this.#auth, wireKey), {\n\t\t\tlabel: 'S3 head',\n\t\t\tallowStatuses: [404]\n\t\t})\n\t\tconst publicKey = this.#publicKey(wireKey)\n\t\tif (response.status === 404) {\n\t\t\treturn { key: publicKey, exists: false }\n\t\t}\n\t\tconst contentType = response.headers.get('content-type')\n\t\tconst lengthHeader = response.headers.get('content-length')\n\t\tconst etag = response.headers.get('etag')\n\t\tconst contentLength = isString(lengthHeader) ? Number.parseInt(lengthHeader, 10) : undefined\n\t\tconst out: HeadObjectOutput = {\n\t\t\tkey: publicKey,\n\t\t\texists: true\n\t\t}\n\t\tif (isString(contentType)) out.content_type = contentType\n\t\tif (!isNil(contentLength) && Number.isFinite(contentLength)) out.content_length = contentLength\n\t\tif (isString(etag)) out.etag = stripEtagQuotes(etag)\n\t\treturn out\n\t}\n\n\tasync get(input: GetObjectInput): Promise<GetObjectOutput> {\n\t\tconst wireKey = this.#resolve(input.key)\n\t\tconst {\n\t\t\tbytes: bodyBytes,\n\t\t\theaders: responseHeaders,\n\t\t\thead\n\t\t} = await this.#getBoundedWire(wireKey, MAX_OBJECT_BYTES, 'Object exceeds 5 MiB download limit')\n\t\tconst encoding = input.encoding ?? 'base64'\n\t\tconst body = encoding === 'utf8' ? bytesToUtf8(bodyBytes) : bytesToBase64(bodyBytes)\n\t\tconst contentType = responseHeaders.get('content-type') ?? head.content_type\n\t\tconst lengthHeader = responseHeaders.get('content-length')\n\t\tconst contentLength = isString(lengthHeader) ? Number.parseInt(lengthHeader, 10) : head.content_length\n\t\tconst out: GetObjectOutput = {\n\t\t\tkey: this.#publicKey(wireKey),\n\t\t\tbody,\n\t\t\tencoding\n\t\t}\n\t\tif (isString(contentType)) out.content_type = contentType\n\t\t// Prefer HEAD length (full object); Range responses report partial Content-Length.\n\t\tout.content_length =\n\t\t\t!isNil(head.content_length) && Number.isFinite(head.content_length)\n\t\t\t\t? head.content_length\n\t\t\t\t: isNil(contentLength) || !Number.isFinite(contentLength)\n\t\t\t\t\t? bodyBytes.byteLength\n\t\t\t\t\t: contentLength\n\t\treturn out\n\t}\n\n\tasync put(input: PutObjectInput): Promise<PutObjectOutput> {\n\t\tconst wireKey = this.#resolve(input.key)\n\t\tconst encoding = input.body_encoding ?? 'utf8'\n\t\tconst bodyBytes = encoding === 'base64' ? base64ToBytes(input.body) : utf8ToBytes(input.body)\n\t\tif (bodyBytes.byteLength > MAX_OBJECT_BYTES) {\n\t\t\tthrow new ToolError('Object exceeds 5 MiB upload limit', {\n\t\t\t\tcode: 'too_large',\n\t\t\t\tdetails: { max_bytes: MAX_OBJECT_BYTES, content_length: bodyBytes.byteLength }\n\t\t\t})\n\t\t}\n\t\tconst headers: Record<string, string> = {}\n\t\tif (input.content_type) headers['Content-Type'] = input.content_type\n\n\t\tconst response = await this.#aws.put(objectUrl(this.#auth, wireKey), toArrayBuffer(bodyBytes), {\n\t\t\tlabel: 'S3 put',\n\t\t\theaders\n\t\t})\n\t\tconst etag = response.headers.get('etag')\n\t\tconst out: PutObjectOutput = {\n\t\t\tkey: this.#publicKey(wireKey),\n\t\t\tcontent_length: bodyBytes.byteLength\n\t\t}\n\t\tif (isString(etag)) out.etag = stripEtagQuotes(etag)\n\t\treturn out\n\t}\n\n\tasync delete(input: DeleteObjectInput): Promise<DeleteObjectOutput> {\n\t\tconst wireKey = this.#resolve(input.key)\n\t\tawait this.#aws.delete(objectUrl(this.#auth, wireKey), {\n\t\t\tlabel: 'S3 delete',\n\t\t\tallowStatuses: [404]\n\t\t})\n\t\treturn { key: this.#publicKey(wireKey), deleted: true }\n\t}\n\n\tasync head(input: HeadObjectInput): Promise<HeadObjectOutput> {\n\t\treturn this.#headWire(this.#resolve(input.key))\n\t}\n\n\tasync copy(input: CopyObjectInput): Promise<CopyObjectOutput> {\n\t\tconst destWire = this.#resolve(input.destination_key)\n\t\tconst sourceWire = this.#resolveCopySourceKey(input.source_key, input.source_bucket)\n\t\tconst response = await this.#aws.bytes('PUT', objectUrl(this.#auth, destWire), {\n\t\t\tlabel: 'S3 copy',\n\t\t\theaders: {\n\t\t\t\t'x-amz-copy-source': copySourceHeader(this.#auth, sourceWire, input.source_bucket)\n\t\t\t}\n\t\t})\n\t\tconst xml = bytesToUtf8(response.bytes)\n\t\tconst etagRaw = firstXmlText(xml, 'ETag')\n\t\tconst headerEtag = response.headers.get('etag')\n\t\tconst etag = etagRaw ? stripEtagQuotes(etagRaw) : isString(headerEtag) ? stripEtagQuotes(headerEtag) : undefined\n\t\tconst out: CopyObjectOutput = {\n\t\t\tsource_key:\n\t\t\t\tinput.source_bucket === undefined || input.source_bucket === this.#auth.bucket\n\t\t\t\t\t? this.#publicKey(sourceWire)\n\t\t\t\t\t: sourceWire,\n\t\t\tdestination_key: this.#publicKey(destWire)\n\t\t}\n\t\tif (etag) out.etag = etag\n\t\treturn out\n\t}\n\n\tasync createSignedUrl(input: SignedUrlInput): Promise<SignedUrlOutput> {\n\t\tconst wireKey = this.#resolve(input.key)\n\t\tconst method = input.method ?? 'GET'\n\t\tconst expiresIn = input.expires_in ?? DEFAULT_SIGNED_URL_SECONDS\n\t\tconst url = objectUrl(this.#auth, wireKey, `X-Amz-Expires=${expiresIn}`)\n\t\tconst signed = await this.#aws.sign(url, {\n\t\t\tmethod,\n\t\t\tsignQuery: true\n\t\t})\n\t\treturn {\n\t\t\turl: signed.url,\n\t\t\tmethod,\n\t\t\texpires_in: expiresIn\n\t\t}\n\t}\n\n\tasync createMultipartUpload(input: CreateMultipartUploadInput): Promise<CreateMultipartUploadOutput> {\n\t\tconst wireKey = this.#resolve(input.key)\n\t\tconst headers: Record<string, string> = {}\n\t\tif (input.content_type) headers['Content-Type'] = input.content_type\n\t\tconst { bytes } = await this.#aws.bytes('POST', objectUrl(this.#auth, wireKey, 'uploads'), {\n\t\t\tlabel: 'S3 create multipart upload',\n\t\t\theaders\n\t\t})\n\t\tconst uploadIdRaw = firstXmlText(bytesToUtf8(bytes), 'UploadId')\n\t\tif (!uploadIdRaw) {\n\t\t\tthrow new ToolError('S3 create multipart upload returned no UploadId', { code: 'upstream' })\n\t\t}\n\t\treturn {\n\t\t\tkey: this.#publicKey(wireKey),\n\t\t\tupload_id: uploadIdRaw\n\t\t}\n\t}\n\n\tasync uploadPart(input: UploadPartInput): Promise<UploadPartOutput> {\n\t\tconst wireKey = this.#resolve(input.key)\n\t\tconst encoding = input.body_encoding ?? 'utf8'\n\t\tconst bodyBytes = encoding === 'base64' ? base64ToBytes(input.body) : utf8ToBytes(input.body)\n\t\tif (bodyBytes.byteLength > MAX_MULTIPART_PART_BYTES) {\n\t\t\tthrow new ToolError('Multipart part exceeds 25 MiB upload limit', {\n\t\t\t\tcode: 'too_large',\n\t\t\t\tdetails: { max_bytes: MAX_MULTIPART_PART_BYTES, content_length: bodyBytes.byteLength }\n\t\t\t})\n\t\t}\n\t\tif (bodyBytes.byteLength === 0) {\n\t\t\tthrow new ToolError('Multipart part body must not be empty', { code: 'bad_input' })\n\t\t}\n\t\tconst query = new URLSearchParams({\n\t\t\tpartNumber: String(input.part_number),\n\t\t\tuploadId: input.upload_id\n\t\t})\n\t\tconst response = await this.#aws.put(objectUrl(this.#auth, wireKey, query.toString()), toArrayBuffer(bodyBytes), {\n\t\t\tlabel: 'S3 upload part'\n\t\t})\n\t\tconst etagHeader = response.headers.get('etag')\n\t\tif (!isString(etagHeader) || etagHeader.length === 0) {\n\t\t\tthrow new ToolError('S3 upload part returned no ETag', { code: 'upstream' })\n\t\t}\n\t\treturn {\n\t\t\tkey: this.#publicKey(wireKey),\n\t\t\tupload_id: input.upload_id,\n\t\t\tpart_number: input.part_number,\n\t\t\tetag: stripEtagQuotes(etagHeader),\n\t\t\tcontent_length: bodyBytes.byteLength\n\t\t}\n\t}\n\n\tasync completeMultipartUpload(input: CompleteMultipartUploadInput): Promise<CompleteMultipartUploadOutput> {\n\t\tconst wireKey = this.#resolve(input.key)\n\t\tconst sorted = [...input.parts].sort((a, b) => a.part_number - b.part_number)\n\t\tconst partsXml = sorted\n\t\t\t.map((part) => {\n\t\t\t\tconst etag = stripEtagQuotes(part.etag)\n\t\t\t\treturn `<Part><PartNumber>${part.part_number}</PartNumber><ETag>\"${etag}\"</ETag></Part>`\n\t\t\t})\n\t\t\t.join('')\n\t\tconst body = `<CompleteMultipartUpload>${partsXml}</CompleteMultipartUpload>`\n\t\tconst query = new URLSearchParams({ uploadId: input.upload_id })\n\t\tconst response = await this.#aws.bytes('POST', objectUrl(this.#auth, wireKey, query.toString()), {\n\t\t\tlabel: 'S3 complete multipart upload',\n\t\t\tbody,\n\t\t\theaders: { 'Content-Type': 'application/xml' }\n\t\t})\n\t\tconst xml = bytesToUtf8(response.bytes)\n\t\tconst etagRaw = firstXmlText(xml, 'ETag')\n\t\tconst headerEtag = response.headers.get('etag')\n\t\tconst etag = etagRaw ? stripEtagQuotes(etagRaw) : isString(headerEtag) ? stripEtagQuotes(headerEtag) : undefined\n\t\tconst out: CompleteMultipartUploadOutput = {\n\t\t\tkey: this.#publicKey(wireKey),\n\t\t\tupload_id: input.upload_id\n\t\t}\n\t\tif (etag) out.etag = etag\n\t\treturn out\n\t}\n\n\tasync abortMultipartUpload(input: AbortMultipartUploadInput): Promise<AbortMultipartUploadOutput> {\n\t\tconst wireKey = this.#resolve(input.key)\n\t\tconst query = new URLSearchParams({ uploadId: input.upload_id })\n\t\tawait this.#aws.delete(objectUrl(this.#auth, wireKey, query.toString()), {\n\t\t\tlabel: 'S3 abort multipart upload',\n\t\t\tallowStatuses: [404]\n\t\t})\n\t\treturn { key: this.#publicKey(wireKey), upload_id: input.upload_id, aborted: true }\n\t}\n\n\t/** Host-facing raw download. Pass `maxBytes` to enforce a hard download cap. Logical key when key_prefix is set. */\n\tasync getBytes(key: string, options: { maxBytes?: number } = {}): Promise<Uint8Array> {\n\t\tconst wireKey = this.#resolve(key)\n\t\tconst maxBytes = options.maxBytes\n\t\tif (maxBytes !== undefined) {\n\t\t\tconst { bytes } = await this.#getBoundedWire(wireKey, maxBytes, 'Object exceeds download limit')\n\t\t\treturn bytes\n\t\t}\n\t\ttry {\n\t\t\tconst { bytes } = await this.#aws.bytes('GET', objectUrl(this.#auth, wireKey), { label: 'S3 get' })\n\t\t\treturn bytes\n\t\t} catch (error) {\n\t\t\tremapNotFound(error)\n\t\t}\n\t}\n\n\tasync getBytesRange(key: string, range: S3ByteRange): Promise<S3ByteRangeResult> {\n\t\tconst wireKey = this.#resolve(key)\n\t\tconst requestedBytes = range.end_byte - range.start_byte + 1\n\t\tif (\n\t\t\t!Number.isSafeInteger(range.start_byte) ||\n\t\t\t!Number.isSafeInteger(range.end_byte) ||\n\t\t\trange.start_byte < 0 ||\n\t\t\trequestedBytes < 1\n\t\t) {\n\t\t\tthrow new ToolError('Byte range must use non-negative inclusive offsets with end_byte >= start_byte', {\n\t\t\t\tcode: 'bad_input'\n\t\t\t})\n\t\t}\n\t\tif (requestedBytes > MAX_OBJECT_BYTES) {\n\t\t\ttooLarge(MAX_OBJECT_BYTES, requestedBytes, 'Byte range exceeds download limit')\n\t\t}\n\n\t\tconst head = await this.#headWire(wireKey)\n\t\tif (!head.exists) objectNotFound()\n\t\tif (head.content_length !== undefined && range.start_byte >= head.content_length) {\n\t\t\tthrow new ToolError('Byte range starts beyond the end of the object', {\n\t\t\t\tcode: 'bad_input',\n\t\t\t\tdetails: { start_byte: range.start_byte, content_length: head.content_length }\n\t\t\t})\n\t\t}\n\n\t\tconst headers: Record<string, string> = {\n\t\t\tRange: `bytes=${range.start_byte}-${range.end_byte}`\n\t\t}\n\t\tif (head.etag) headers['If-Match'] = head.etag.startsWith('\"') ? head.etag : `\"${head.etag}\"`\n\n\t\tlet response\n\t\ttry {\n\t\t\tresponse = await this.#aws.bytes('GET', objectUrl(this.#auth, wireKey), {\n\t\t\t\tlabel: 'S3 range get',\n\t\t\t\theaders,\n\t\t\t\tmaxBytes: requestedBytes\n\t\t\t})\n\t\t} catch (error) {\n\t\t\tif (isToolError(error) && error.details?.['status'] === 412) {\n\t\t\t\tthrow new ToolError('Object changed during download', {\n\t\t\t\t\tcode: 'upstream',\n\t\t\t\t\tdetails: { status: 412, key: this.#publicKey(wireKey) },\n\t\t\t\t\tcause: error\n\t\t\t\t})\n\t\t\t}\n\t\t\tremapNotFound(error)\n\t\t}\n\n\t\tconst out: S3ByteRangeResult = {\n\t\t\tbytes: response.bytes,\n\t\t\tstart_byte: range.start_byte,\n\t\t\tend_byte: range.start_byte + response.bytes.byteLength - 1\n\t\t}\n\t\tconst totalBytes = contentRangeTotal(response.headers.get('content-range')) ?? head.content_length\n\t\tconst contentType = response.headers.get('content-type') ?? head.content_type\n\t\tif (totalBytes !== undefined) out.total_bytes = totalBytes\n\t\tif (contentType) out.content_type = contentType\n\t\treturn out\n\t}\n\n\t/** Host-facing raw upload. Logical key when key_prefix is set. */\n\tasync putBytes(key: string, bytes: Uint8Array, contentType?: string): Promise<void> {\n\t\tconst wireKey = this.#resolve(key)\n\t\tconst headers: Record<string, string> = {}\n\t\tif (isString(contentType) && contentType.length > 0) headers['Content-Type'] = contentType\n\t\tawait this.#aws.put(objectUrl(this.#auth, wireKey), toArrayBuffer(bytes), {\n\t\t\tlabel: 'S3 put',\n\t\t\theaders\n\t\t})\n\t}\n}\n","import { defineModule, defineTool } from '../../core/define'\nimport { S3Client } from './client'\nimport {\n\tabortMultipartUploadInputSchema,\n\tabortMultipartUploadOutputSchema,\n\tcompleteMultipartUploadInputSchema,\n\tcompleteMultipartUploadOutputSchema,\n\tcopyObjectInputSchema,\n\tcopyObjectOutputSchema,\n\tcreateMultipartUploadInputSchema,\n\tcreateMultipartUploadOutputSchema,\n\tdeleteObjectInputSchema,\n\tdeleteObjectOutputSchema,\n\tgetObjectInputSchema,\n\tgetObjectOutputSchema,\n\theadObjectInputSchema,\n\theadObjectOutputSchema,\n\tlistObjectsInputSchema,\n\tlistObjectsOutputSchema,\n\tputObjectInputSchema,\n\tputObjectOutputSchema,\n\ts3AuthSchema,\n\tsignedUrlInputSchema,\n\tsignedUrlOutputSchema,\n\tuploadPartInputSchema,\n\tuploadPartOutputSchema\n} from './contracts'\n\nexport const s3ListObjectsTool = defineTool({\n\tid: 's3-list-objects',\n\tname: 's3ListObjects',\n\tdescription:\n\t\t'List objects in the bound S3 bucket. Use prefix, delimiter, cursor, and limit for filtered pagination. Returns keys, items with metadata, next_cursor, and truncated.',\n\tinputSchema: listObjectsInputSchema,\n\toutputSchema: listObjectsOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => S3Client.fromContext(ctx).list(input)\n})\n\nexport const s3GetObjectTool = defineTool({\n\tid: 's3-get-object',\n\tname: 's3GetObject',\n\tdescription:\n\t\t'Download one object by key from S3. Bodies larger than 5 MiB fail. Returns body as base64 by default or utf8 when requested.',\n\tinputSchema: getObjectInputSchema,\n\toutputSchema: getObjectOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => S3Client.fromContext(ctx).get(input)\n})\n\nexport const s3PutObjectTool = defineTool({\n\tid: 's3-put-object',\n\tname: 's3PutObject',\n\tdescription:\n\t\t'Upload or replace one object by key in S3. Provide utf8 text or base64 body. Bodies larger than 5 MiB fail.',\n\tinputSchema: putObjectInputSchema,\n\toutputSchema: putObjectOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => S3Client.fromContext(ctx).put(input)\n})\n\nexport const s3DeleteObjectTool = defineTool({\n\tid: 's3-delete-object',\n\tname: 's3DeleteObject',\n\tdescription: 'Delete one object by key in S3. Idempotent for missing keys (404 treated as success).',\n\tinputSchema: deleteObjectInputSchema,\n\toutputSchema: deleteObjectOutputSchema,\n\tsideEffect: 'delete',\n\truntime: 'both',\n\texecute: async (input, ctx) => S3Client.fromContext(ctx).delete(input)\n})\n\nexport const s3HeadObjectTool = defineTool({\n\tid: 's3-head-object',\n\tname: 's3HeadObject',\n\tdescription:\n\t\t'Inspect S3 object metadata by key without downloading the body. Returns exists flag plus content type, length, and ETag when present.',\n\tinputSchema: headObjectInputSchema,\n\toutputSchema: headObjectOutputSchema,\n\tsideEffect: 'read',\n\truntime: 'both',\n\texecute: async (input, ctx) => S3Client.fromContext(ctx).head(input)\n})\n\nexport const s3CopyObjectTool = defineTool({\n\tid: 's3-copy-object',\n\tname: 's3CopyObject',\n\tdescription:\n\t\t'Copy one S3 object to a new key. Set source_bucket only for an allowed cross-bucket copy; otherwise the configured bucket is used.',\n\tinputSchema: copyObjectInputSchema,\n\toutputSchema: copyObjectOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => S3Client.fromContext(ctx).copy(input)\n})\n\nexport const s3CreateSignedUrlTool = defineTool({\n\tid: 's3-create-signed-url',\n\tname: 's3CreateSignedUrl',\n\tdescription: 'Create a time-limited presigned S3 URL for one object key. Defaults to GET for 3600 seconds.',\n\tinputSchema: signedUrlInputSchema,\n\toutputSchema: signedUrlOutputSchema,\n\tsideEffect: 'none',\n\truntime: 'both',\n\texecute: async (input, ctx) => S3Client.fromContext(ctx).createSignedUrl(input)\n})\n\nexport const s3CreateMultipartUploadTool = defineTool({\n\tid: 's3-create-multipart-upload',\n\tname: 's3CreateMultipartUpload',\n\tdescription:\n\t\t'Start an S3 multipart upload for one object key. Returns upload_id for uploadPart/complete/abort. Use for objects larger than the single put limit.',\n\tinputSchema: createMultipartUploadInputSchema,\n\toutputSchema: createMultipartUploadOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => S3Client.fromContext(ctx).createMultipartUpload(input)\n})\n\nexport const s3UploadPartTool = defineTool({\n\tid: 's3-upload-part',\n\tname: 's3UploadPart',\n\tdescription:\n\t\t'Upload one part of an in-progress S3 multipart upload. Part bodies up to 25 MiB. S3 requires each part except the last to be at least 5 MiB. Returns etag required for completeMultipartUpload.',\n\tinputSchema: uploadPartInputSchema,\n\toutputSchema: uploadPartOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => S3Client.fromContext(ctx).uploadPart(input)\n})\n\nexport const s3CompleteMultipartUploadTool = defineTool({\n\tid: 's3-complete-multipart-upload',\n\tname: 's3CompleteMultipartUpload',\n\tdescription:\n\t\t'Finish an S3 multipart upload by assembling uploaded parts (part_number + etag). Parts may be supplied in any order; they are sorted by part_number before complete.',\n\tinputSchema: completeMultipartUploadInputSchema,\n\toutputSchema: completeMultipartUploadOutputSchema,\n\tsideEffect: 'write',\n\truntime: 'both',\n\texecute: async (input, ctx) => S3Client.fromContext(ctx).completeMultipartUpload(input)\n})\n\nexport const s3AbortMultipartUploadTool = defineTool({\n\tid: 's3-abort-multipart-upload',\n\tname: 's3AbortMultipartUpload',\n\tdescription: 'Abort an in-progress S3 multipart upload and discard uploaded parts for that upload_id.',\n\tinputSchema: abortMultipartUploadInputSchema,\n\toutputSchema: abortMultipartUploadOutputSchema,\n\tsideEffect: 'delete',\n\truntime: 'both',\n\texecute: async (input, ctx) => S3Client.fromContext(ctx).abortMultipartUpload(input)\n})\n\nexport const s3Module = defineModule({\n\tid: 's3',\n\ttitle: 'S3 / S3-compatible',\n\tdescription:\n\t\t'Store and retrieve objects with S3-compatible storage. Use for object listing, reads, writes, metadata, copies, deletion, signed URLs, and multipart uploads.',\n\truntime: 'both',\n\tauth: { type: 'custom', schema: s3AuthSchema },\n\tcategories: ['storage', 'aws'],\n\tclassification: 'pii',\n\ttags: ['object-store'],\n\ttools: [\n\t\ts3ListObjectsTool,\n\t\ts3GetObjectTool,\n\t\ts3PutObjectTool,\n\t\ts3DeleteObjectTool,\n\t\ts3HeadObjectTool,\n\t\ts3CopyObjectTool,\n\t\ts3CreateSignedUrlTool,\n\t\ts3CreateMultipartUploadTool,\n\t\ts3UploadPartTool,\n\t\ts3CompleteMultipartUploadTool,\n\t\ts3AbortMultipartUploadTool\n\t]\n})\n"],"mappings":"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"}
@@ -0,0 +1,192 @@
1
+ import { t as ToolError } from "./errors-DoSpNHvs.js";
2
+ import { isBoolean, isNil, isNumber, isPlainObject, isString, mapValues, trim } from "es-toolkit";
3
+ import { z } from "zod";
4
+ //#region src/vendors/_vector/domain.ts
5
+ /**
6
+ * Shared vector parse helpers for vendor clients (not published from kit barrel).
7
+ * Prefer es-toolkit predicates; keep only vector-specific narrowing.
8
+ */
9
+ function requireCollection(collection, defaultCollection, label) {
10
+ const name = trim(collection ?? defaultCollection ?? "");
11
+ if (name === "") throw new ToolError(`${label} requires collection (or default_collection on auth)`, { code: "bad_input" });
12
+ return name;
13
+ }
14
+ /** Flat metadata from provider payloads. Non-primitives JSON-stringified. */
15
+ function parseMetadata(value) {
16
+ if (!isPlainObject(value)) return void 0;
17
+ return mapValues(value, (raw) => {
18
+ if (isString(raw) || isNumber(raw) || isBoolean(raw) || raw === null) return raw;
19
+ if (isNil(raw)) return null;
20
+ return JSON.stringify(raw);
21
+ });
22
+ }
23
+ function parseNumberArray(value) {
24
+ if (!Array.isArray(value)) return void 0;
25
+ if (!value.every((item) => isNumber(item) && Number.isFinite(item))) return void 0;
26
+ return value;
27
+ }
28
+ function parsePointId(value) {
29
+ if (isString(value) && value.length > 0) return value;
30
+ if (isNumber(value) && Number.isFinite(value)) return String(value);
31
+ }
32
+ function parseUpstreamMessage(data, fallback) {
33
+ if (!isPlainObject(data)) return fallback;
34
+ const status = data["status"];
35
+ if (isPlainObject(status) && isString(status["error"]) && status["error"].length > 0) return status["error"];
36
+ if (isString(data["message"]) && data["message"].length > 0) return data["message"];
37
+ if (isString(data["error"]) && data["error"].length > 0) return data["error"];
38
+ if (isString(data["detail"]) && data["detail"].length > 0) return data["detail"];
39
+ return fallback;
40
+ }
41
+ function mapVectorHttpStatus(status) {
42
+ if (status === 401 || status === 403) return "bad_auth";
43
+ if (status === 404) return "not_found";
44
+ if (status === 400 || status === 409 || status === 422) return "bad_input";
45
+ if (status === 429) return "rate_limited";
46
+ return "upstream";
47
+ }
48
+ function parseScore(row) {
49
+ if (isNumber(row["score"]) && Number.isFinite(row["score"])) return row["score"];
50
+ if (isNumber(row["similarity"]) && Number.isFinite(row["similarity"])) return row["similarity"];
51
+ if (isNumber(row["distance"]) && Number.isFinite(row["distance"])) return -row["distance"];
52
+ return 0;
53
+ }
54
+ /**
55
+ * Merge host-bound filter with tool filter.
56
+ * Host keys always win on collision so the model cannot strip tenant terms.
57
+ * Both absent → undefined. One present → that object.
58
+ */
59
+ function mergeVectorFilter(host, tool) {
60
+ if (!host && !tool) return void 0;
61
+ if (!host) return tool;
62
+ if (!tool) return host;
63
+ return {
64
+ ...tool,
65
+ ...host
66
+ };
67
+ }
68
+ /**
69
+ * Namespace resolution: when auth default is set it is locked (tool cannot switch NS).
70
+ * When auth omits default, tool namespace is used.
71
+ */
72
+ function resolveVectorNamespace(authDefault, toolNamespace) {
73
+ if (authDefault !== void 0 && authDefault.length > 0) return authDefault;
74
+ return toolNamespace;
75
+ }
76
+ function isFlatMetadataValue(value) {
77
+ return isString(value) || isNumber(value) || isBoolean(value) || value === null;
78
+ }
79
+ /**
80
+ * Stamp flat equality keys from host default_filter onto upsert metadata.
81
+ * Skips operator keys (`$…`) and non-primitive values (leave complex filters query-only).
82
+ * Host keys win over point metadata.
83
+ */
84
+ function stampDefaultFilterMetadata(metadata, hostFilter) {
85
+ if (!hostFilter) return metadata;
86
+ const stamped = metadata ? { ...metadata } : {};
87
+ let added = false;
88
+ for (const [key, value] of Object.entries(hostFilter)) {
89
+ if (key.startsWith("$")) continue;
90
+ if (!isFlatMetadataValue(value)) continue;
91
+ stamped[key] = value;
92
+ added = true;
93
+ }
94
+ if (!added && metadata) return metadata;
95
+ if (!added) return metadata;
96
+ return stamped;
97
+ }
98
+ /**
99
+ * Qdrant: if filter is already native (`must`/`should`/`must_not`), pass through.
100
+ * If flat equality map, convert to `{ must: [{ key, match: { value } }, …] }`.
101
+ */
102
+ function toQdrantFilter(filter) {
103
+ if (!filter) return void 0;
104
+ if ("must" in filter || "should" in filter || "must_not" in filter) return filter;
105
+ const must = [];
106
+ for (const [key, value] of Object.entries(filter)) {
107
+ if (key.startsWith("$")) continue;
108
+ must.push({
109
+ key,
110
+ match: { value }
111
+ });
112
+ }
113
+ if (must.length === 0) return filter;
114
+ return { must };
115
+ }
116
+ /**
117
+ * Merge Qdrant filters by concatenating `must` clauses (AND).
118
+ * Host clauses first so they are never dropped.
119
+ */
120
+ function mergeQdrantFilter(host, tool) {
121
+ const h = toQdrantFilter(host);
122
+ const t = toQdrantFilter(tool);
123
+ if (!h) return t;
124
+ if (!t) return h;
125
+ const mustH = isPlainObject(h) && Array.isArray(h["must"]) ? h["must"] : [h];
126
+ const mustT = isPlainObject(t) && Array.isArray(t["must"]) ? t["must"] : [t];
127
+ return { must: [...mustH, ...mustT] };
128
+ }
129
+ //#endregion
130
+ //#region src/vendors/_vector/schemas.ts
131
+ /**
132
+ * Shared vector I/O schemas for vector vendor packs and the vector-store seam.
133
+ * Codegen skips `_vector` (vertical kit). No helpers here — see domain.ts.
134
+ */
135
+ const MAX_VECTOR_BATCH = 100;
136
+ const MAX_TOP_K = 100;
137
+ const MAX_VECTOR_DIMENSIONS = 4096;
138
+ const vectorMetadataValueSchema = z.union([
139
+ z.string(),
140
+ z.number(),
141
+ z.boolean(),
142
+ z.null()
143
+ ]);
144
+ const vectorMetadataSchema = z.record(z.string(), vectorMetadataValueSchema).describe("Flat metadata map (string / number / boolean / null values)");
145
+ const vectorPointSchema = z.object({
146
+ id: z.string().min(1).describe("Stable point id"),
147
+ values: z.array(z.number()).min(1).max(MAX_VECTOR_DIMENSIONS).describe("Embedding values"),
148
+ metadata: vectorMetadataSchema.optional().describe("Optional flat metadata")
149
+ });
150
+ const vectorMatchSchema = z.object({
151
+ id: z.string(),
152
+ score: z.number().describe("Similarity score (higher is better; provider scale may differ)"),
153
+ values: z.array(z.number()).optional(),
154
+ metadata: vectorMetadataSchema.optional()
155
+ });
156
+ const upsertVectorsInputSchema = z.object({
157
+ collection: z.string().min(1).optional().describe("Collection, table, or index name when no default is configured"),
158
+ namespace: z.string().min(1).optional().describe("Optional namespace when supported; a configured fixed namespace takes precedence"),
159
+ vectors: z.array(vectorPointSchema).min(1).max(100).describe(`1–100 vectors to upsert`)
160
+ });
161
+ const upsertVectorsOutputSchema = z.object({
162
+ upserted: z.number().int().nonnegative().describe("Number of points upserted"),
163
+ collection: z.string().optional()
164
+ });
165
+ const queryVectorsInputSchema = z.object({
166
+ collection: z.string().min(1).optional().describe("Collection, table, or index name when no default is configured"),
167
+ namespace: z.string().min(1).optional().describe("Optional namespace when supported; a configured fixed namespace takes precedence"),
168
+ vector: z.array(z.number()).min(1).max(MAX_VECTOR_DIMENSIONS).describe("Query embedding"),
169
+ top_k: z.number().int().min(1).max(100).optional().describe(`Number of nearest neighbors (default 8, max 100)`),
170
+ include_values: z.boolean().optional().describe("Include embedding values in matches"),
171
+ include_metadata: z.boolean().optional().describe("Include metadata in matches (default true)"),
172
+ filter: z.record(z.string(), z.unknown()).optional().describe("Optional provider-native metadata filter; merged with host-bound default_filter when set (host keys win)")
173
+ });
174
+ const queryVectorsOutputSchema = z.object({
175
+ matches: z.array(vectorMatchSchema),
176
+ collection: z.string().optional()
177
+ });
178
+ const deleteVectorsInputSchema = z.object({
179
+ collection: z.string().min(1).optional().describe("Collection, table, or index name when no default is configured"),
180
+ namespace: z.string().min(1).optional().describe("Optional namespace when the store supports it"),
181
+ ids: z.array(z.string().min(1)).min(1).max(100).describe(`1–100 point ids to delete`)
182
+ });
183
+ const deleteVectorsOutputSchema = z.object({
184
+ deleted: z.number().int().nonnegative().describe("Number of ids requested for delete"),
185
+ collection: z.string().optional()
186
+ });
187
+ /** Host-bound filter bag (opaque provider dialect or flat equality metadata). */
188
+ const vectorDefaultFilterSchema = z.record(z.string(), z.unknown()).describe("Host-bound metadata filter always applied on query (tool filter merged; host keys win). Flat equality keys are stamped onto upsert metadata.");
189
+ //#endregion
190
+ export { resolveVectorNamespace as C, requireCollection as S, parseMetadata as _, deleteVectorsOutputSchema as a, parseScore as b, upsertVectorsInputSchema as c, vectorMatchSchema as d, vectorMetadataSchema as f, mergeVectorFilter as g, mergeQdrantFilter as h, deleteVectorsInputSchema as i, upsertVectorsOutputSchema as l, mapVectorHttpStatus as m, MAX_VECTOR_BATCH as n, queryVectorsInputSchema as o, vectorPointSchema as p, MAX_VECTOR_DIMENSIONS as r, queryVectorsOutputSchema as s, MAX_TOP_K as t, vectorDefaultFilterSchema as u, parseNumberArray as v, stampDefaultFilterMetadata as w, parseUpstreamMessage as x, parsePointId as y };
191
+
192
+ //# sourceMappingURL=schemas-ChOAhdo9.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas-ChOAhdo9.js","names":[],"sources":["../src/vendors/_vector/domain.ts","../src/vendors/_vector/schemas.ts"],"sourcesContent":["/**\n * Shared vector parse helpers for vendor clients (not published from kit barrel).\n * Prefer es-toolkit predicates; keep only vector-specific narrowing.\n */\n\nimport { isBoolean, isNil, isNumber, isPlainObject, isString, mapValues, trim } from 'es-toolkit'\n\nimport { ToolError } from '../../core/errors'\nimport type { VectorMetadata, VectorMetadataValue } from './schemas'\n\n/** Host-bound default filter on vector auth (opaque provider-native or flat equality). */\nexport type VectorDefaultFilter = Record<string, unknown>\n\nexport function requireCollection(\n\tcollection: string | undefined,\n\tdefaultCollection: string | undefined,\n\tlabel: string\n): string {\n\tconst name = trim(collection ?? defaultCollection ?? '')\n\tif (name === '') {\n\t\tthrow new ToolError(`${label} requires collection (or default_collection on auth)`, {\n\t\t\tcode: 'bad_input'\n\t\t})\n\t}\n\treturn name\n}\n\n/** Flat metadata from provider payloads. Non-primitives JSON-stringified. */\nexport function parseMetadata(value: unknown): VectorMetadata | undefined {\n\tif (!isPlainObject(value)) return undefined\n\treturn mapValues(value, (raw) => {\n\t\tif (isString(raw) || isNumber(raw) || isBoolean(raw) || raw === null) return raw\n\t\tif (isNil(raw)) return null\n\t\treturn JSON.stringify(raw)\n\t})\n}\n\nexport function parseNumberArray(value: unknown): number[] | undefined {\n\tif (!Array.isArray(value)) return undefined\n\tif (!value.every((item) => isNumber(item) && Number.isFinite(item))) return undefined\n\treturn value\n}\n\nexport function parsePointId(value: unknown): string | undefined {\n\tif (isString(value) && value.length > 0) return value\n\tif (isNumber(value) && Number.isFinite(value)) return String(value)\n\treturn undefined\n}\n\nexport function parseUpstreamMessage(data: unknown, fallback: string): string {\n\tif (!isPlainObject(data)) return fallback\n\tconst status = data['status']\n\tif (isPlainObject(status) && isString(status['error']) && status['error'].length > 0) {\n\t\treturn status['error']\n\t}\n\tif (isString(data['message']) && data['message'].length > 0) return data['message']\n\tif (isString(data['error']) && data['error'].length > 0) return data['error']\n\tif (isString(data['detail']) && data['detail'].length > 0) return data['detail']\n\treturn fallback\n}\n\nexport function mapVectorHttpStatus(status: number): ToolError['code'] {\n\tif (status === 401 || status === 403) return 'bad_auth'\n\tif (status === 404) return 'not_found'\n\tif (status === 400 || status === 409 || status === 422) return 'bad_input'\n\tif (status === 429) return 'rate_limited'\n\treturn 'upstream'\n}\n\nexport function parseScore(row: Record<string, unknown>): number {\n\tif (isNumber(row['score']) && Number.isFinite(row['score'])) return row['score']\n\tif (isNumber(row['similarity']) && Number.isFinite(row['similarity'])) return row['similarity']\n\tif (isNumber(row['distance']) && Number.isFinite(row['distance'])) return -row['distance']\n\treturn 0\n}\n\n/**\n * Merge host-bound filter with tool filter.\n * Host keys always win on collision so the model cannot strip tenant terms.\n * Both absent → undefined. One present → that object.\n */\nexport function mergeVectorFilter(\n\thost: VectorDefaultFilter | undefined,\n\ttool: VectorDefaultFilter | undefined\n): VectorDefaultFilter | undefined {\n\tif (!host && !tool) return undefined\n\tif (!host) return tool\n\tif (!tool) return host\n\treturn { ...tool, ...host }\n}\n\n/**\n * Namespace resolution: when auth default is set it is locked (tool cannot switch NS).\n * When auth omits default, tool namespace is used.\n */\nexport function resolveVectorNamespace(\n\tauthDefault: string | undefined,\n\ttoolNamespace: string | undefined\n): string | undefined {\n\tif (authDefault !== undefined && authDefault.length > 0) return authDefault\n\treturn toolNamespace\n}\n\nfunction isFlatMetadataValue(value: unknown): value is VectorMetadataValue {\n\treturn isString(value) || isNumber(value) || isBoolean(value) || value === null\n}\n\n/**\n * Stamp flat equality keys from host default_filter onto upsert metadata.\n * Skips operator keys (`$…`) and non-primitive values (leave complex filters query-only).\n * Host keys win over point metadata.\n */\nexport function stampDefaultFilterMetadata(\n\tmetadata: VectorMetadata | undefined,\n\thostFilter: VectorDefaultFilter | undefined\n): VectorMetadata | undefined {\n\tif (!hostFilter) return metadata\n\tconst stamped: VectorMetadata = metadata ? { ...metadata } : {}\n\tlet added = false\n\tfor (const [key, value] of Object.entries(hostFilter)) {\n\t\tif (key.startsWith('$')) continue\n\t\tif (!isFlatMetadataValue(value)) continue\n\t\tstamped[key] = value\n\t\tadded = true\n\t}\n\tif (!added && metadata) return metadata\n\tif (!added) return metadata\n\treturn stamped\n}\n\n/**\n * Qdrant: if filter is already native (`must`/`should`/`must_not`), pass through.\n * If flat equality map, convert to `{ must: [{ key, match: { value } }, …] }`.\n */\nexport function toQdrantFilter(filter: VectorDefaultFilter | undefined): VectorDefaultFilter | undefined {\n\tif (!filter) return undefined\n\tif ('must' in filter || 'should' in filter || 'must_not' in filter) return filter\n\tconst must: Array<{ key: string; match: { value: unknown } }> = []\n\tfor (const [key, value] of Object.entries(filter)) {\n\t\tif (key.startsWith('$')) continue\n\t\tmust.push({ key, match: { value } })\n\t}\n\tif (must.length === 0) return filter\n\treturn { must }\n}\n\n/**\n * Merge Qdrant filters by concatenating `must` clauses (AND).\n * Host clauses first so they are never dropped.\n */\nexport function mergeQdrantFilter(\n\thost: VectorDefaultFilter | undefined,\n\ttool: VectorDefaultFilter | undefined\n): VectorDefaultFilter | undefined {\n\tconst h = toQdrantFilter(host)\n\tconst t = toQdrantFilter(tool)\n\tif (!h) return t\n\tif (!t) return h\n\tconst mustH = isPlainObject(h) && Array.isArray(h['must']) ? h['must'] : [h]\n\tconst mustT = isPlainObject(t) && Array.isArray(t['must']) ? t['must'] : [t]\n\treturn { must: [...mustH, ...mustT] }\n}\n","/**\n * Shared vector I/O schemas for vector vendor packs and the vector-store seam.\n * Codegen skips `_vector` (vertical kit). No helpers here — see domain.ts.\n */\n\nimport { z } from 'zod'\n\nexport const MAX_VECTOR_BATCH = 100\nexport const MAX_TOP_K = 100\nexport const MAX_VECTOR_DIMENSIONS = 4096\n\nexport const vectorMetadataValueSchema = z.union([z.string(), z.number(), z.boolean(), z.null()])\nexport const vectorMetadataSchema = z\n\t.record(z.string(), vectorMetadataValueSchema)\n\t.describe('Flat metadata map (string / number / boolean / null values)')\n\nexport const vectorPointSchema = z.object({\n\tid: z.string().min(1).describe('Stable point id'),\n\tvalues: z.array(z.number()).min(1).max(MAX_VECTOR_DIMENSIONS).describe('Embedding values'),\n\tmetadata: vectorMetadataSchema.optional().describe('Optional flat metadata')\n})\n\nexport const vectorMatchSchema = z.object({\n\tid: z.string(),\n\tscore: z.number().describe('Similarity score (higher is better; provider scale may differ)'),\n\tvalues: z.array(z.number()).optional(),\n\tmetadata: vectorMetadataSchema.optional()\n})\n\nexport const upsertVectorsInputSchema = z.object({\n\tcollection: z.string().min(1).optional().describe('Collection, table, or index name when no default is configured'),\n\tnamespace: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Optional namespace when supported; a configured fixed namespace takes precedence'),\n\tvectors: z.array(vectorPointSchema).min(1).max(MAX_VECTOR_BATCH).describe(`1–${MAX_VECTOR_BATCH} vectors to upsert`)\n})\n\nexport const upsertVectorsOutputSchema = z.object({\n\tupserted: z.number().int().nonnegative().describe('Number of points upserted'),\n\tcollection: z.string().optional()\n})\n\nexport const queryVectorsInputSchema = z.object({\n\tcollection: z.string().min(1).optional().describe('Collection, table, or index name when no default is configured'),\n\tnamespace: z\n\t\t.string()\n\t\t.min(1)\n\t\t.optional()\n\t\t.describe('Optional namespace when supported; a configured fixed namespace takes precedence'),\n\tvector: z.array(z.number()).min(1).max(MAX_VECTOR_DIMENSIONS).describe('Query embedding'),\n\ttop_k: z\n\t\t.number()\n\t\t.int()\n\t\t.min(1)\n\t\t.max(MAX_TOP_K)\n\t\t.optional()\n\t\t.describe(`Number of nearest neighbors (default 8, max ${MAX_TOP_K})`),\n\tinclude_values: z.boolean().optional().describe('Include embedding values in matches'),\n\tinclude_metadata: z.boolean().optional().describe('Include metadata in matches (default true)'),\n\tfilter: z\n\t\t.record(z.string(), z.unknown())\n\t\t.optional()\n\t\t.describe(\n\t\t\t'Optional provider-native metadata filter; merged with host-bound default_filter when set (host keys win)'\n\t\t)\n})\n\nexport const queryVectorsOutputSchema = z.object({\n\tmatches: z.array(vectorMatchSchema),\n\tcollection: z.string().optional()\n})\n\nexport const deleteVectorsInputSchema = z.object({\n\tcollection: z.string().min(1).optional().describe('Collection, table, or index name when no default is configured'),\n\tnamespace: z.string().min(1).optional().describe('Optional namespace when the store supports it'),\n\tids: z.array(z.string().min(1)).min(1).max(MAX_VECTOR_BATCH).describe(`1–${MAX_VECTOR_BATCH} point ids to delete`)\n})\n\nexport const deleteVectorsOutputSchema = z.object({\n\tdeleted: z.number().int().nonnegative().describe('Number of ids requested for delete'),\n\tcollection: z.string().optional()\n})\n\n/** Host-bound filter bag (opaque provider dialect or flat equality metadata). */\nexport const vectorDefaultFilterSchema = z\n\t.record(z.string(), z.unknown())\n\t.describe(\n\t\t'Host-bound metadata filter always applied on query (tool filter merged; host keys win). Flat equality keys are stamped onto upsert metadata.'\n\t)\n\nexport type VectorMetadata = z.infer<typeof vectorMetadataSchema>\nexport type VectorMetadataValue = z.infer<typeof vectorMetadataValueSchema>\nexport type VectorPoint = z.infer<typeof vectorPointSchema>\nexport type VectorMatch = z.infer<typeof vectorMatchSchema>\nexport type VectorDefaultFilter = z.infer<typeof vectorDefaultFilterSchema>\nexport type UpsertVectorsInput = z.infer<typeof upsertVectorsInputSchema>\nexport type UpsertVectorsOutput = z.infer<typeof upsertVectorsOutputSchema>\nexport type QueryVectorsInput = z.infer<typeof queryVectorsInputSchema>\nexport type QueryVectorsOutput = z.infer<typeof queryVectorsOutputSchema>\nexport type DeleteVectorsInput = z.infer<typeof deleteVectorsInputSchema>\nexport type DeleteVectorsOutput = z.infer<typeof deleteVectorsOutputSchema>\n"],"mappings":"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"}