@5ss/ai-tools 2.11.2 → 2.11.4

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 (188) hide show
  1. package/CHANGELOG.md +4 -0
  2. package/README.md +3 -10
  3. package/dist/{bedrock-agentcore-browser-a_qOs-NR.js → bedrock-agentcore-browser-o_oqSPMK.js} +2 -2
  4. package/dist/{bedrock-agentcore-browser-a_qOs-NR.js.map → bedrock-agentcore-browser-o_oqSPMK.js.map} +1 -1
  5. package/dist/{bedrock-agentcore-code-interpreter-MWK-8RhA.js → bedrock-agentcore-code-interpreter-D4ERRFj1.js} +2 -2
  6. package/dist/{bedrock-agentcore-code-interpreter-MWK-8RhA.js.map → bedrock-agentcore-code-interpreter-D4ERRFj1.js.map} +1 -1
  7. package/dist/{cloudflare-browser-B6Yolpin.js → cloudflare-browser-nLJdH5nG.js} +3 -3
  8. package/dist/{cloudflare-browser-B6Yolpin.js.map → cloudflare-browser-nLJdH5nG.js.map} +1 -1
  9. package/dist/{cloudflare-email-Dy0KHeDf.js → cloudflare-email-CSRq8mRd.js} +2 -2
  10. package/dist/{cloudflare-email-Dy0KHeDf.js.map → cloudflare-email-CSRq8mRd.js.map} +1 -1
  11. package/dist/{cloudflare-sandbox-Dp_uNaqW.js → cloudflare-sandbox-Be7SeS4-.js} +3 -3
  12. package/dist/{cloudflare-sandbox-Dp_uNaqW.js.map → cloudflare-sandbox-Be7SeS4-.js.map} +1 -1
  13. package/dist/content-type-E4_Qdoa0.js +19 -0
  14. package/dist/{content-type-CORxaxcv.js.map → content-type-E4_Qdoa0.js.map} +1 -1
  15. package/dist/core/index.js +2 -6
  16. package/dist/core/index.js.map +1 -1
  17. package/dist/{define-CvpJ_pNP.js → define-ieoksEQ0.js} +1 -6
  18. package/dist/define-ieoksEQ0.js.map +1 -0
  19. package/dist/{eventbridge-scheduler-Bh6GqZY2.js → eventbridge-scheduler-BhQaReAz.js} +2 -2
  20. package/dist/{eventbridge-scheduler-Bh6GqZY2.js.map → eventbridge-scheduler-BhQaReAz.js.map} +1 -1
  21. package/dist/http/index.d.ts +1 -1
  22. package/dist/{http-service-T7E5UjP8.d.ts → http-service-CerzWwQO.d.ts} +3 -2
  23. package/dist/http-service-CerzWwQO.d.ts.map +1 -0
  24. package/dist/http-service-DDNCO1s4.js.map +1 -1
  25. package/dist/{client-CCKGsTeI.js → imessage-CofjmONG.js} +152 -2
  26. package/dist/imessage-CofjmONG.js.map +1 -0
  27. package/dist/{index-Cuh6eMWc.d.ts → index-9oSRRNdR.d.ts} +2 -2
  28. package/dist/{index-Cuh6eMWc.d.ts.map → index-9oSRRNdR.d.ts.map} +1 -1
  29. package/dist/{index-zK1ZwS4m.d.ts → index-ByHp3nZm.d.ts} +2 -2
  30. package/dist/{index-zK1ZwS4m.d.ts.map → index-ByHp3nZm.d.ts.map} +1 -1
  31. package/dist/{index-BU4gmYO8.d.ts → index-C-Cuh9it.d.ts} +2 -2
  32. package/dist/{index-BU4gmYO8.d.ts.map → index-C-Cuh9it.d.ts.map} +1 -1
  33. package/dist/index-CZX5OeOF.d.ts.map +1 -1
  34. package/dist/{index-CdFmEfZO.d.ts → index-CtfpOZWu.d.ts} +2 -2
  35. package/dist/{index-CdFmEfZO.d.ts.map → index-CtfpOZWu.d.ts.map} +1 -1
  36. package/dist/{index-n8JTpNf1.d.ts → index-DngnGGiS.d.ts} +2 -2
  37. package/dist/{index-n8JTpNf1.d.ts.map → index-DngnGGiS.d.ts.map} +1 -1
  38. package/dist/{index-DuOGj7vc.d.ts → index-DsTt2EbS.d.ts} +2 -2
  39. package/dist/{index-DuOGj7vc.d.ts.map → index-DsTt2EbS.d.ts.map} +1 -1
  40. package/dist/{index-pwW1OsOx.d.ts → index-Y8p8bsWU.d.ts} +2 -2
  41. package/dist/{index-pwW1OsOx.d.ts.map → index-Y8p8bsWU.d.ts.map} +1 -1
  42. package/dist/{mastra-vector-Dhc6XZ8l.js → mastra-vector-B8HjvdMT.js} +2 -2
  43. package/dist/{mastra-vector-Dhc6XZ8l.js.map → mastra-vector-B8HjvdMT.js.map} +1 -1
  44. package/dist/modules/artifacts/index.d.ts +1 -1
  45. package/dist/modules/artifacts/index.js +3 -3
  46. package/dist/modules/browser/index.d.ts +2 -2
  47. package/dist/modules/browser/index.js +3 -3
  48. package/dist/modules/calendar/index.js +1 -1
  49. package/dist/modules/code-sandbox/index.js +3 -3
  50. package/dist/modules/content-type/index.js +2 -2
  51. package/dist/modules/crypto/index.js +1 -1
  52. package/dist/modules/document-extract/index.d.ts +1 -1
  53. package/dist/modules/document-extract/index.js +2 -2
  54. package/dist/modules/document-render/index.d.ts +21 -30
  55. package/dist/modules/document-render/index.d.ts.map +1 -1
  56. package/dist/modules/document-render/index.js +11 -28
  57. package/dist/modules/document-render/index.js.map +1 -1
  58. package/dist/modules/email/index.d.ts +21 -3
  59. package/dist/modules/email/index.d.ts.map +1 -1
  60. package/dist/modules/email/index.js +3 -3
  61. package/dist/modules/email-message/index.js +1 -1
  62. package/dist/modules/files/index.js +2 -2
  63. package/dist/modules/image/index.d.ts +4 -1
  64. package/dist/modules/image/index.d.ts.map +1 -1
  65. package/dist/modules/image/index.js +25 -4
  66. package/dist/modules/image/index.js.map +1 -1
  67. package/dist/modules/messaging/index.d.ts +1 -1
  68. package/dist/modules/messaging/index.js +7 -7
  69. package/dist/modules/messaging/index.js.map +1 -1
  70. package/dist/modules/queue/index.d.ts +1 -1
  71. package/dist/modules/queue/index.js +2 -2
  72. package/dist/modules/rag/index.d.ts +1 -1
  73. package/dist/modules/rag/index.js +2 -2
  74. package/dist/modules/scheduler/index.d.ts +2 -2
  75. package/dist/modules/scheduler/index.js +2 -2
  76. package/dist/modules/skills/index.js +1 -1
  77. package/dist/modules/tasks/index.js +1 -1
  78. package/dist/modules/vector-store/index.js +1 -1
  79. package/dist/modules/web-fetch/index.js +1 -1
  80. package/dist/{pinecone-umY4t6OF.js → pinecone-CNnCFmix.js} +2 -2
  81. package/dist/{pinecone-umY4t6OF.js.map → pinecone-CNnCFmix.js.map} +1 -1
  82. package/dist/{qdrant-DMp4NhKR.js → qdrant-R_FIcG9d.js} +2 -2
  83. package/dist/{qdrant-DMp4NhKR.js.map → qdrant-R_FIcG9d.js.map} +1 -1
  84. package/dist/{resend-BAC38_dA.js → resend-Bu0NFO3h.js} +2 -2
  85. package/dist/{resend-BAC38_dA.js.map → resend-Bu0NFO3h.js.map} +1 -1
  86. package/dist/{s3-CsOaPWMP.js → s3-Dj7Teh-A.js} +2 -2
  87. package/dist/{s3-CsOaPWMP.js.map → s3-Dj7Teh-A.js.map} +1 -1
  88. package/dist/{slack-Di5BBNpt.js → slack-AjJDNnXJ.js} +2 -2
  89. package/dist/{slack-Di5BBNpt.js.map → slack-AjJDNnXJ.js.map} +1 -1
  90. package/dist/{sqs-DCwS1i2N.js → sqs-CjyXjasF.js} +2 -2
  91. package/dist/{sqs-DCwS1i2N.js.map → sqs-CjyXjasF.js.map} +1 -1
  92. package/dist/{supabase-vector-Dpp9mmJR.js → supabase-vector-BNoJZuft.js} +2 -2
  93. package/dist/{supabase-vector-Dpp9mmJR.js.map → supabase-vector-BNoJZuft.js.map} +1 -1
  94. package/dist/{teams-DYAHNb39.js → teams-CvxYLAi5.js} +2 -2
  95. package/dist/{teams-DYAHNb39.js.map → teams-CvxYLAi5.js.map} +1 -1
  96. package/dist/{telegram-DDXWzkfL.js → telegram-B_-Jljk3.js} +2 -2
  97. package/dist/{telegram-DDXWzkfL.js.map → telegram-B_-Jljk3.js.map} +1 -1
  98. package/dist/{textract-CPLiB22H.js → textract-CAfnGvua.js} +3 -3
  99. package/dist/{textract-CPLiB22H.js.map → textract-CAfnGvua.js.map} +1 -1
  100. package/dist/{vector-store-C3nEO80e.js → vector-store-DDiu3XPg.js} +6 -6
  101. package/dist/{vector-store-C3nEO80e.js.map → vector-store-DDiu3XPg.js.map} +1 -1
  102. package/dist/vendors/amazon-sp-api/index.d.ts +267 -18
  103. package/dist/vendors/amazon-sp-api/index.d.ts.map +1 -1
  104. package/dist/vendors/amazon-sp-api/index.js +821 -212
  105. package/dist/vendors/amazon-sp-api/index.js.map +1 -1
  106. package/dist/vendors/bedrock-agentcore-browser/index.d.ts +1 -1
  107. package/dist/vendors/bedrock-agentcore-browser/index.js +1 -1
  108. package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts +1 -1
  109. package/dist/vendors/bedrock-agentcore-code-interpreter/index.js +1 -1
  110. package/dist/vendors/cloudflare-browser/index.d.ts +1 -1
  111. package/dist/vendors/cloudflare-browser/index.js +1 -1
  112. package/dist/vendors/cloudflare-email/index.d.ts +1 -1
  113. package/dist/vendors/cloudflare-email/index.js +1 -1
  114. package/dist/vendors/cloudflare-sandbox/index.d.ts +1 -1
  115. package/dist/vendors/cloudflare-sandbox/index.js +1 -1
  116. package/dist/vendors/eventbridge-scheduler/index.d.ts +1 -1
  117. package/dist/vendors/eventbridge-scheduler/index.js +1 -1
  118. package/dist/vendors/imessage/index.js +1 -2
  119. package/dist/vendors/katana/index.d.ts +371 -2
  120. package/dist/vendors/katana/index.d.ts.map +1 -1
  121. package/dist/vendors/katana/index.js +541 -199
  122. package/dist/vendors/katana/index.js.map +1 -1
  123. package/dist/vendors/mastra-vector/index.js +1 -1
  124. package/dist/vendors/pinecone/index.d.ts +1 -1
  125. package/dist/vendors/pinecone/index.js +1 -1
  126. package/dist/vendors/qdrant/index.d.ts +1 -1
  127. package/dist/vendors/qdrant/index.js +1 -1
  128. package/dist/vendors/resend/index.d.ts +1 -1
  129. package/dist/vendors/resend/index.js +1 -1
  130. package/dist/vendors/s3/index.d.ts +1 -1
  131. package/dist/vendors/s3/index.js +1 -1
  132. package/dist/vendors/slack/index.d.ts +1 -1
  133. package/dist/vendors/slack/index.js +1 -1
  134. package/dist/vendors/sqs/index.d.ts +1 -1
  135. package/dist/vendors/sqs/index.js +1 -1
  136. package/dist/vendors/supabase-vector/index.d.ts +1 -1
  137. package/dist/vendors/supabase-vector/index.js +1 -1
  138. package/dist/vendors/teams/index.d.ts +1 -1
  139. package/dist/vendors/teams/index.js +1 -1
  140. package/dist/vendors/telegram/index.d.ts +1 -1
  141. package/dist/vendors/telegram/index.js +1 -1
  142. package/dist/vendors/textract/index.d.ts +1 -1
  143. package/dist/vendors/textract/index.js +1 -1
  144. package/dist/vendors/woocommerce/index.d.ts +1 -1
  145. package/dist/vendors/woocommerce/index.js +1 -1
  146. package/logos/README.md +0 -4
  147. package/logos/pack-logos.json +0 -5
  148. package/package.json +4 -38
  149. package/dist/artifacts-O8g-40Pw.js +0 -404
  150. package/dist/artifacts-O8g-40Pw.js.map +0 -1
  151. package/dist/batch-BMM5dXqL.d.ts +0 -22
  152. package/dist/batch-BMM5dXqL.d.ts.map +0 -1
  153. package/dist/client-CCKGsTeI.js.map +0 -1
  154. package/dist/content-type-CORxaxcv.js +0 -49
  155. package/dist/define-CvpJ_pNP.js.map +0 -1
  156. package/dist/gotenberg-NuJjxyln.js +0 -291
  157. package/dist/gotenberg-NuJjxyln.js.map +0 -1
  158. package/dist/http-service-T7E5UjP8.d.ts.map +0 -1
  159. package/dist/imessage-BSAFOI8Z.js +0 -154
  160. package/dist/imessage-BSAFOI8Z.js.map +0 -1
  161. package/dist/modules/document/index.d.ts +0 -575
  162. package/dist/modules/document/index.d.ts.map +0 -1
  163. package/dist/modules/document/index.js +0 -444
  164. package/dist/modules/document/index.js.map +0 -1
  165. package/dist/modules/file-convert/index.d.ts +0 -273
  166. package/dist/modules/file-convert/index.d.ts.map +0 -1
  167. package/dist/modules/file-convert/index.js +0 -103
  168. package/dist/modules/file-convert/index.js.map +0 -1
  169. package/dist/modules/pdf/index.d.ts +0 -287
  170. package/dist/modules/pdf/index.d.ts.map +0 -1
  171. package/dist/modules/pdf/index.js +0 -259
  172. package/dist/modules/pdf/index.js.map +0 -1
  173. package/dist/modules/presentation/index.d.ts +0 -247
  174. package/dist/modules/presentation/index.d.ts.map +0 -1
  175. package/dist/modules/presentation/index.js +0 -12657
  176. package/dist/modules/presentation/index.js.map +0 -1
  177. package/dist/object-artifact-store-CMTzCm_G.d.ts +0 -7
  178. package/dist/object-artifact-store-CMTzCm_G.d.ts.map +0 -1
  179. package/dist/object-artifact-store-wZ2j9cto.js +0 -28
  180. package/dist/object-artifact-store-wZ2j9cto.js.map +0 -1
  181. package/dist/vendors/gotenberg/index.d.ts +0 -306
  182. package/dist/vendors/gotenberg/index.d.ts.map +0 -1
  183. package/dist/vendors/gotenberg/index.js +0 -2
  184. package/logos/document.svg +0 -10
  185. package/logos/file-convert.svg +0 -9
  186. package/logos/gotenberg.svg +0 -340
  187. package/logos/pdf.svg +0 -10
  188. package/logos/presentation.svg +0 -8
@@ -1,10 +1,10 @@
1
1
  import { t as ToolError } from "../../errors-DoSpNHvs.js";
2
- import { n as defineModule, r as defineTool } from "../../define-CvpJ_pNP.js";
2
+ import { n as defineModule, r as defineTool } from "../../define-ieoksEQ0.js";
3
3
  import { n as requireAuth } from "../../provider-CgDAlg6K.js";
4
4
  import { t as HttpService } from "../../http-service-DDNCO1s4.js";
5
- import { t as AwsService } from "../../aws-service-msttbPrz.js";
6
- import { isPlainObject, isString } from "es-toolkit";
5
+ import { r as bytesToUtf8 } from "../../bytes-BxpimpQx.js";
7
6
  import { z } from "zod";
7
+ import { createRequire } from "module";
8
8
  import Decimal from "decimal.js";
9
9
  import Papa from "papaparse";
10
10
  //#region src/vendors/amazon-sp-api/contracts.ts
@@ -18,12 +18,14 @@ const amazonSpApiAuthSchema = z.object({
18
18
  client_id: z.string().min(1).describe("LWA client id"),
19
19
  client_secret: z.string().min(1).describe("LWA client secret"),
20
20
  refresh_token: z.string().min(1).describe("LWA refresh token for the selling partner"),
21
- access_key_id: z.string().min(1).describe("AWS access key id for SP-API SigV4"),
22
- secret_access_key: z.string().min(1).describe("AWS secret access key for SP-API SigV4"),
23
- region: z.string().min(1).describe("AWS region used for SigV4 (typically us-east-1 for NA, eu-west-1 for EU, us-west-2 for FE)"),
24
21
  endpoint: amazonSpApiEndpointSchema.describe("SP-API regional endpoint"),
25
- session_token: z.string().min(1).optional().describe("Optional AWS session token"),
26
- marketplace_ids: z.array(z.string().min(1)).min(1).optional().describe("Default marketplace ids when a tool call omits marketplace_ids")
22
+ marketplace_ids: z.array(z.string().min(1)).min(1).optional().describe("Default marketplace ids when a tool call omits marketplace_ids"),
23
+ user_agent: z.string().min(1).describe("Application user agent sent with every SP-API request")
24
+ });
25
+ const amazonSpApiLwaTokenResponseSchema = z.object({
26
+ access_token: z.string().min(1),
27
+ token_type: z.string().min(1),
28
+ expires_in: z.number().int().positive()
27
29
  });
28
30
  const amazonSpApiListOrdersInputSchema = z.object({
29
31
  marketplace_ids: z.array(z.string().min(1)).min(1).optional().describe("Marketplace ids; omit to use the configured defaults"),
@@ -89,6 +91,88 @@ const amazonSpApiSearchOrdersOutputSchema = z.object({
89
91
  next_cursor: z.string().optional().describe("paginationToken for the next page when not fully drained"),
90
92
  truncated: z.boolean()
91
93
  });
94
+ const amazonInventoryDateTimeSchema = z.iso.datetime({ offset: true });
95
+ function eighteenMonthsBeforeNow() {
96
+ const oldestAllowed = /* @__PURE__ */ new Date();
97
+ const currentDay = oldestAllowed.getUTCDate();
98
+ oldestAllowed.setUTCDate(1);
99
+ oldestAllowed.setUTCMonth(oldestAllowed.getUTCMonth() - 18);
100
+ const lastDayOfTargetMonth = new Date(Date.UTC(oldestAllowed.getUTCFullYear(), oldestAllowed.getUTCMonth() + 1, 0)).getUTCDate();
101
+ oldestAllowed.setUTCDate(Math.min(currentDay, lastDayOfTargetMonth));
102
+ return oldestAllowed.getTime();
103
+ }
104
+ const amazonInventoryFullPageInputSchema = z.strictObject({
105
+ mode: z.literal("full"),
106
+ marketplace_id: z.string().min(1),
107
+ next_token: z.string().min(1).optional()
108
+ });
109
+ const amazonInventoryIncrementalPageInputSchema = z.strictObject({
110
+ mode: z.literal("incremental"),
111
+ marketplace_id: z.string().min(1),
112
+ start_date_time: amazonInventoryDateTimeSchema,
113
+ next_token: z.string().min(1).optional()
114
+ });
115
+ const amazonSpApiInventoryPageInputSchema = z.discriminatedUnion("mode", [amazonInventoryFullPageInputSchema, amazonInventoryIncrementalPageInputSchema]).superRefine((input, context) => {
116
+ if (input.mode !== "incremental") return;
117
+ if (Date.parse(input.start_date_time) < eighteenMonthsBeforeNow()) context.addIssue({
118
+ code: "custom",
119
+ path: ["start_date_time"],
120
+ message: "start_date_time cannot be more than 18 months in the past"
121
+ });
122
+ });
123
+ const amazonInventoryReservedQuantityRawSchema = z.looseObject({
124
+ totalReservedQuantity: z.number().optional(),
125
+ pendingCustomerOrderQuantity: z.number().optional(),
126
+ pendingTransshipmentQuantity: z.number().optional(),
127
+ fcProcessingQuantity: z.number().optional()
128
+ });
129
+ const amazonInventoryResearchingQuantityBreakdownRawSchema = z.looseObject({
130
+ name: z.enum([
131
+ "researchingQuantityInShortTerm",
132
+ "researchingQuantityInMidTerm",
133
+ "researchingQuantityInLongTerm"
134
+ ]),
135
+ quantity: z.int()
136
+ });
137
+ const amazonInventoryResearchingQuantityRawSchema = z.looseObject({
138
+ totalResearchingQuantity: z.number().optional(),
139
+ researchingQuantityBreakdown: z.array(amazonInventoryResearchingQuantityBreakdownRawSchema).optional()
140
+ });
141
+ const amazonInventoryUnfulfillableQuantityRawSchema = z.looseObject({
142
+ totalUnfulfillableQuantity: z.number().optional(),
143
+ customerDamagedQuantity: z.number().optional(),
144
+ warehouseDamagedQuantity: z.number().optional(),
145
+ distributorDamagedQuantity: z.number().optional(),
146
+ carrierDamagedQuantity: z.number().optional(),
147
+ defectiveQuantity: z.number().optional(),
148
+ expiredQuantity: z.number().optional()
149
+ });
150
+ const amazonInventoryDetailsRawSchema = z.looseObject({
151
+ fulfillableQuantity: z.number().optional(),
152
+ inboundWorkingQuantity: z.number().optional(),
153
+ inboundShippedQuantity: z.number().optional(),
154
+ inboundReceivingQuantity: z.number().optional(),
155
+ reservedQuantity: amazonInventoryReservedQuantityRawSchema.optional(),
156
+ researchingQuantity: amazonInventoryResearchingQuantityRawSchema.optional(),
157
+ unfulfillableQuantity: amazonInventoryUnfulfillableQuantityRawSchema.optional()
158
+ });
159
+ const amazonInventorySummaryRawSchema = z.looseObject({
160
+ asin: z.string().optional(),
161
+ fnSku: z.string().optional(),
162
+ sellerSku: z.string().optional(),
163
+ condition: z.string().optional(),
164
+ productName: z.string().optional(),
165
+ totalQuantity: z.number().optional(),
166
+ lastUpdatedTime: z.string().optional(),
167
+ stores: z.array(z.string()).optional(),
168
+ inventoryDetails: amazonInventoryDetailsRawSchema.optional()
169
+ });
170
+ const amazonSpApiInventoryPageOutputSchema = z.object({
171
+ items: z.array(amazonInventorySummaryRawSchema),
172
+ next_token: z.string().optional(),
173
+ rate_limit_per_second: z.number().optional(),
174
+ request_id: z.string().optional()
175
+ });
92
176
  const amazonSpApiListInventorySummariesInputSchema = z.object({
93
177
  marketplace_id: z.string().min(1).optional().describe("Marketplace id; omit to use the first configured default"),
94
178
  seller_skus: z.array(z.string().min(1)).max(50).optional().describe("Optional seller SKU filter (max 50)"),
@@ -128,14 +212,37 @@ const amazonSpApiReportSchema = z.object({
128
212
  created_time: z.string().optional()
129
213
  });
130
214
  const amazonSpApiGetReportOutputSchema = z.object({ report: amazonSpApiReportSchema });
131
- const amazonSpApiListReportsInputSchema = z.object({
132
- report_types: z.array(z.string().min(1)).optional().describe("Filter by report type(s)"),
215
+ const amazonSpApiListReportsInitialFields = {
216
+ report_types: z.array(z.string().min(1)).min(1).max(10).describe("Filter by 1-10 report types"),
133
217
  processing_statuses: z.array(z.string().min(1)).optional().describe("Filter by processing status (e.g. DONE, IN_QUEUE, IN_PROGRESS, CANCELLED, FATAL)"),
134
218
  marketplace_ids: z.array(z.string().min(1)).min(1).optional().describe("Marketplace ids filter; omit to use configured defaults when available"),
135
219
  page_size: z.int().min(1).max(100).optional().describe("Page size (1-100)"),
136
- created_since: z.string().min(1).optional().describe("ISO 8601; reports created after"),
137
- created_until: z.string().min(1).optional().describe("ISO 8601; reports created before"),
138
- cursor: z.string().min(1).optional().describe("nextToken from a prior page")
220
+ created_since: z.iso.datetime({ offset: true }).optional().describe("ISO 8601; reports created after"),
221
+ created_until: z.iso.datetime({ offset: true }).optional().describe("ISO 8601; reports created before")
222
+ };
223
+ const amazonSpApiListReportsInitialInputSchema = z.strictObject(amazonSpApiListReportsInitialFields);
224
+ const amazonSpApiListReportsCursorInputSchema = z.strictObject({ cursor: z.string().min(1).describe("nextToken from a prior page") });
225
+ const amazonSpApiListReportsInputSchema = z.union([amazonSpApiListReportsInitialInputSchema, amazonSpApiListReportsCursorInputSchema]);
226
+ const amazonReportRawSchema = z.looseObject({
227
+ reportId: z.string().min(1),
228
+ reportType: z.string().optional(),
229
+ processingStatus: z.string().optional(),
230
+ marketplaceIds: z.array(z.string()).optional(),
231
+ dataStartTime: z.string().optional(),
232
+ dataEndTime: z.string().optional(),
233
+ reportScheduleId: z.string().optional(),
234
+ createdTime: z.string().optional(),
235
+ processingStartTime: z.string().optional(),
236
+ processingEndTime: z.string().optional(),
237
+ reportDocumentId: z.string().optional()
238
+ });
239
+ const amazonSpApiListReportsContinuationInputSchema = z.strictObject({ next_token: z.string().min(1) });
240
+ const amazonSpApiListReportsPageInputSchema = z.union([amazonSpApiListReportsInitialInputSchema, amazonSpApiListReportsContinuationInputSchema]);
241
+ const amazonSpApiListReportsPageOutputSchema = z.object({
242
+ items: z.array(amazonReportRawSchema),
243
+ next_token: z.string().optional(),
244
+ rate_limit_per_second: z.number().optional(),
245
+ request_id: z.string().optional()
139
246
  });
140
247
  const amazonSpApiListReportsOutputSchema = z.object({
141
248
  items: z.array(amazonSpApiReportSchema),
@@ -148,6 +255,18 @@ const amazonSpApiGetReportDocumentOutputSchema = z.object({
148
255
  url: z.string(),
149
256
  compression_algorithm: z.string().optional()
150
257
  });
258
+ const amazonSpApiDownloadReportDocumentBytesInputSchema = z.strictObject({
259
+ report_document_id: z.string().min(1),
260
+ max_bytes: z.int().positive()
261
+ });
262
+ const amazonSpApiDownloadReportDocumentBytesOutputSchema = z.object({
263
+ bytes: z.custom((value) => value instanceof Uint8Array),
264
+ text: z.string(),
265
+ byte_length: z.int().nonnegative(),
266
+ content_type: z.string().optional(),
267
+ content_encoding: z.string().optional(),
268
+ compression_algorithm: z.enum(["GZIP"]).optional()
269
+ });
151
270
  /**
152
271
  * Composite input: pick newest completed V2 settlement report in the retention
153
272
  * window (default 90d), download one document, return eight summary fields only.
@@ -194,6 +313,61 @@ const amazonSpApiSearchCatalogItemsOutputSchema = z.object({
194
313
  * Amazon SP-API: LWA body, order/inventory/report/catalog parse (no HTTP).
195
314
  */
196
315
  const LWA_TOKEN_URL = "https://api.amazon.com/auth/o2/token";
316
+ const amazonMoneyRawSchema = z.looseObject({
317
+ Amount: z.string().optional(),
318
+ CurrencyCode: z.string().optional()
319
+ });
320
+ const amazonOrderRawSchema = z.looseObject({
321
+ AmazonOrderId: z.string().min(1),
322
+ OrderStatus: z.string().optional(),
323
+ PurchaseDate: z.string().optional(),
324
+ LastUpdateDate: z.string().optional(),
325
+ MarketplaceId: z.string().optional(),
326
+ OrderTotal: amazonMoneyRawSchema.optional(),
327
+ FulfillmentChannel: z.string().optional()
328
+ });
329
+ const amazonOrdersResponseSchema = z.looseObject({ payload: z.looseObject({
330
+ Orders: z.array(amazonOrderRawSchema),
331
+ NextToken: z.string().min(1).optional()
332
+ }) });
333
+ const amazonSearchOrderRawSchema = z.looseObject({
334
+ orderId: z.string().min(1),
335
+ createdTime: z.string().optional(),
336
+ fulfillment: z.looseObject({ fulfillmentStatus: z.string().optional() }).optional()
337
+ });
338
+ const amazonSearchOrdersRootSchema = z.looseObject({
339
+ orders: z.array(amazonSearchOrderRawSchema),
340
+ pagination: z.looseObject({ nextToken: z.string().min(1).optional() }).optional()
341
+ });
342
+ const amazonSearchOrdersWrappedResponseSchema = z.looseObject({ payload: amazonSearchOrdersRootSchema });
343
+ const amazonOrderItemRawSchema = z.looseObject({
344
+ OrderItemId: z.string().min(1),
345
+ ASIN: z.string().optional(),
346
+ SellerSKU: z.string().optional(),
347
+ Title: z.string().optional(),
348
+ QuantityOrdered: z.number().optional(),
349
+ QuantityShipped: z.number().optional(),
350
+ ItemPrice: amazonMoneyRawSchema.optional()
351
+ });
352
+ const amazonOrderItemsResponseSchema = z.looseObject({ payload: z.looseObject({
353
+ AmazonOrderId: z.string().min(1),
354
+ OrderItems: z.array(amazonOrderItemRawSchema),
355
+ NextToken: z.string().min(1).optional()
356
+ }) });
357
+ const amazonCatalogItemRawSchema = z.looseObject({
358
+ asin: z.string().min(1),
359
+ summaries: z.array(z.looseObject({
360
+ itemName: z.string().optional(),
361
+ brandName: z.string().optional(),
362
+ marketplaceId: z.string().optional()
363
+ })).optional(),
364
+ productTypes: z.array(z.looseObject({ productType: z.string().optional() })).optional()
365
+ });
366
+ const amazonCatalogSearchResponseSchema = z.looseObject({
367
+ items: z.array(amazonCatalogItemRawSchema),
368
+ numberOfResults: z.number().optional(),
369
+ pagination: z.looseObject({ nextToken: z.string().min(1).optional() }).optional()
370
+ });
197
371
  function lwaTokenBody(auth) {
198
372
  return new URLSearchParams({
199
373
  grant_type: "refresh_token",
@@ -202,201 +376,204 @@ function lwaTokenBody(auth) {
202
376
  client_secret: auth.client_secret
203
377
  }).toString();
204
378
  }
205
- function parseLwaAccessToken(data) {
206
- if (!isPlainObject(data) || !isString(data["access_token"]) || data["access_token"].length === 0) throw new ToolError("Amazon LWA did not return an access_token", { code: "bad_auth" });
207
- return data["access_token"];
379
+ function parseLwaTokenResponse(data) {
380
+ const parsed = amazonSpApiLwaTokenResponseSchema.safeParse(data);
381
+ if (!parsed.success) throw new ToolError("Amazon LWA returned an invalid token response", {
382
+ code: "bad_auth",
383
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
384
+ });
385
+ return parsed.data;
208
386
  }
209
387
  function parseOrder(value) {
210
- if (!isPlainObject(value) || !isString(value["AmazonOrderId"]) || value["AmazonOrderId"].length === 0) throw new ToolError("Amazon SP-API returned an invalid order", { code: "upstream" });
211
- const total = value["OrderTotal"];
212
- const amount = isPlainObject(total) && isString(total["Amount"]) ? total["Amount"] : void 0;
213
- const currency = isPlainObject(total) && isString(total["CurrencyCode"]) ? total["CurrencyCode"] : void 0;
388
+ const parsed = amazonOrderRawSchema.safeParse(value);
389
+ if (!parsed.success) throw new ToolError("Amazon SP-API returned an invalid order", { code: "upstream" });
214
390
  return {
215
- amazon_order_id: value["AmazonOrderId"],
216
- ...isString(value["OrderStatus"]) && { order_status: value["OrderStatus"] },
217
- ...isString(value["PurchaseDate"]) && { purchase_date: value["PurchaseDate"] },
218
- ...isString(value["LastUpdateDate"]) && { last_update_date: value["LastUpdateDate"] },
219
- ...isString(value["MarketplaceId"]) && { marketplace_id: value["MarketplaceId"] },
220
- ...amount && { order_total_amount: amount },
221
- ...currency && { order_total_currency: currency },
222
- ...isString(value["FulfillmentChannel"]) && { fulfillment_channel: value["FulfillmentChannel"] }
391
+ amazon_order_id: parsed.data.AmazonOrderId,
392
+ ...parsed.data.OrderStatus && { order_status: parsed.data.OrderStatus },
393
+ ...parsed.data.PurchaseDate && { purchase_date: parsed.data.PurchaseDate },
394
+ ...parsed.data.LastUpdateDate && { last_update_date: parsed.data.LastUpdateDate },
395
+ ...parsed.data.MarketplaceId && { marketplace_id: parsed.data.MarketplaceId },
396
+ ...parsed.data.OrderTotal?.Amount && { order_total_amount: parsed.data.OrderTotal.Amount },
397
+ ...parsed.data.OrderTotal?.CurrencyCode && { order_total_currency: parsed.data.OrderTotal.CurrencyCode },
398
+ ...parsed.data.FulfillmentChannel && { fulfillment_channel: parsed.data.FulfillmentChannel }
223
399
  };
224
400
  }
225
401
  function parseOrdersPayload(data) {
226
- if (!isPlainObject(data)) throw new ToolError("Amazon SP-API orders payload invalid", { code: "upstream" });
227
- const payload = data["payload"];
228
- if (!isPlainObject(payload)) throw new ToolError("Amazon SP-API orders missing payload", { code: "upstream" });
229
- const orders = payload["Orders"];
230
- if (!Array.isArray(orders)) throw new ToolError("Amazon SP-API orders missing Orders array", { code: "upstream" });
231
- const nextToken = isString(payload["NextToken"]) && payload["NextToken"].length > 0 ? payload["NextToken"] : void 0;
402
+ const parsed = amazonOrdersResponseSchema.safeParse(data);
403
+ if (!parsed.success) throw new ToolError("Amazon SP-API orders payload invalid", { code: "upstream" });
232
404
  return {
233
- items: orders.map(parseOrder),
234
- ...nextToken && { nextToken }
405
+ items: parsed.data.payload.Orders.map(parseOrder),
406
+ ...parsed.data.payload.NextToken && { nextToken: parsed.data.payload.NextToken }
235
407
  };
236
408
  }
237
409
  function parseOrderPayload(data) {
238
- if (!isPlainObject(data) || !isPlainObject(data["payload"])) throw new ToolError("Amazon SP-API get order payload invalid", { code: "upstream" });
239
- return parseOrder(data["payload"]);
410
+ const parsed = z.looseObject({ payload: amazonOrderRawSchema }).safeParse(data);
411
+ if (!parsed.success) throw new ToolError("Amazon SP-API get order payload invalid", { code: "upstream" });
412
+ return parseOrder(parsed.data.payload);
240
413
  }
241
414
  /** Orders API v2026-01-01 SearchOrders — camelCase body, not v0 payload wrapper. */
242
415
  function parseSearchOrder(value) {
243
- if (!isPlainObject(value) || !isString(value["orderId"]) || value["orderId"].length === 0) throw new ToolError("Amazon SP-API searchOrders returned an invalid order", { code: "upstream" });
244
- const fulfillment = value["fulfillment"];
245
- const fulfillmentStatus = isPlainObject(fulfillment) && isString(fulfillment["fulfillmentStatus"]) ? fulfillment["fulfillmentStatus"] : void 0;
416
+ const parsed = amazonSearchOrderRawSchema.safeParse(value);
417
+ if (!parsed.success) throw new ToolError("Amazon SP-API searchOrders returned an invalid order", { code: "upstream" });
246
418
  return {
247
- order_id: value["orderId"],
248
- ...isString(value["createdTime"]) && { created_time: value["createdTime"] },
249
- ...fulfillmentStatus && { fulfillment_status: fulfillmentStatus }
419
+ order_id: parsed.data.orderId,
420
+ ...parsed.data.createdTime && { created_time: parsed.data.createdTime },
421
+ ...parsed.data.fulfillment?.fulfillmentStatus && { fulfillment_status: parsed.data.fulfillment.fulfillmentStatus }
250
422
  };
251
423
  }
252
424
  function parseSearchOrdersPayload(data) {
253
- if (!isPlainObject(data)) throw new ToolError("Amazon SP-API searchOrders payload invalid", { code: "upstream" });
254
- const root = isPlainObject(data["payload"]) ? data["payload"] : data;
255
- if (!isPlainObject(root)) throw new ToolError("Amazon SP-API searchOrders missing body", { code: "upstream" });
256
- const orders = root["orders"];
257
- if (!Array.isArray(orders)) throw new ToolError("Amazon SP-API searchOrders missing orders array", { code: "upstream" });
258
- const pagination = root["pagination"];
259
- const nextToken = isPlainObject(pagination) && isString(pagination["nextToken"]) && pagination["nextToken"].length > 0 ? pagination["nextToken"] : void 0;
425
+ const wrapped = amazonSearchOrdersWrappedResponseSchema.safeParse(data);
426
+ const direct = amazonSearchOrdersRootSchema.safeParse(data);
427
+ const root = wrapped.success ? wrapped.data.payload : direct.success ? direct.data : void 0;
428
+ if (!root) throw new ToolError("Amazon SP-API searchOrders payload invalid", { code: "upstream" });
260
429
  return {
261
- items: orders.map(parseSearchOrder),
262
- ...nextToken && { nextToken }
430
+ items: root.orders.map(parseSearchOrder),
431
+ ...root.pagination?.nextToken && { nextToken: root.pagination.nextToken }
263
432
  };
264
433
  }
265
434
  function parseOrderItem(value) {
266
- if (!isPlainObject(value) || !isString(value["OrderItemId"]) || value["OrderItemId"].length === 0) throw new ToolError("Amazon SP-API returned an invalid order item", { code: "upstream" });
267
- const price = value["ItemPrice"];
268
- const amount = isPlainObject(price) && isString(price["Amount"]) ? price["Amount"] : void 0;
269
- const currency = isPlainObject(price) && isString(price["CurrencyCode"]) ? price["CurrencyCode"] : void 0;
435
+ const parsed = amazonOrderItemRawSchema.safeParse(value);
436
+ if (!parsed.success) throw new ToolError("Amazon SP-API returned an invalid order item", { code: "upstream" });
270
437
  return {
271
- order_item_id: value["OrderItemId"],
272
- ...isString(value["ASIN"]) && { asin: value["ASIN"] },
273
- ...isString(value["SellerSKU"]) && { seller_sku: value["SellerSKU"] },
274
- ...isString(value["Title"]) && { title: value["Title"] },
275
- ...typeof value["QuantityOrdered"] === "number" && { quantity_ordered: value["QuantityOrdered"] },
276
- ...typeof value["QuantityShipped"] === "number" && { quantity_shipped: value["QuantityShipped"] },
277
- ...amount && { item_price_amount: amount },
278
- ...currency && { item_price_currency: currency }
438
+ order_item_id: parsed.data.OrderItemId,
439
+ ...parsed.data.ASIN && { asin: parsed.data.ASIN },
440
+ ...parsed.data.SellerSKU && { seller_sku: parsed.data.SellerSKU },
441
+ ...parsed.data.Title && { title: parsed.data.Title },
442
+ ...parsed.data.QuantityOrdered !== void 0 && { quantity_ordered: parsed.data.QuantityOrdered },
443
+ ...parsed.data.QuantityShipped !== void 0 && { quantity_shipped: parsed.data.QuantityShipped },
444
+ ...parsed.data.ItemPrice?.Amount && { item_price_amount: parsed.data.ItemPrice.Amount },
445
+ ...parsed.data.ItemPrice?.CurrencyCode && { item_price_currency: parsed.data.ItemPrice.CurrencyCode }
279
446
  };
280
447
  }
281
448
  function parseOrderItemsPayload(data) {
282
- if (!isPlainObject(data)) throw new ToolError("Amazon SP-API order items payload invalid", { code: "upstream" });
283
- const payload = data["payload"];
284
- if (!isPlainObject(payload)) throw new ToolError("Amazon SP-API order items missing payload", { code: "upstream" });
285
- if (!isString(payload["AmazonOrderId"]) || payload["AmazonOrderId"].length === 0) throw new ToolError("Amazon SP-API order items missing AmazonOrderId", { code: "upstream" });
286
- const orderItems = payload["OrderItems"];
287
- if (!Array.isArray(orderItems)) throw new ToolError("Amazon SP-API order items missing OrderItems array", { code: "upstream" });
288
- const nextToken = isString(payload["NextToken"]) && payload["NextToken"].length > 0 ? payload["NextToken"] : void 0;
449
+ const parsed = amazonOrderItemsResponseSchema.safeParse(data);
450
+ if (!parsed.success) throw new ToolError("Amazon SP-API order items payload invalid", { code: "upstream" });
289
451
  return {
290
- amazon_order_id: payload["AmazonOrderId"],
291
- items: orderItems.map(parseOrderItem),
292
- ...nextToken && { nextToken }
452
+ amazon_order_id: parsed.data.payload.AmazonOrderId,
453
+ items: parsed.data.payload.OrderItems.map(parseOrderItem),
454
+ ...parsed.data.payload.NextToken && { nextToken: parsed.data.payload.NextToken }
293
455
  };
294
456
  }
295
457
  function parseInventorySummary(value) {
296
- if (!isPlainObject(value)) throw new ToolError("Amazon SP-API returned an invalid inventory summary", { code: "upstream" });
297
- const totals = value["inventoryDetails"];
298
- let totalQuantity;
299
- if (isPlainObject(totals) && typeof totals["fulfillableQuantity"] === "number") totalQuantity = totals["fulfillableQuantity"];
300
- else if (typeof value["totalQuantity"] === "number") totalQuantity = value["totalQuantity"];
458
+ const parsed = amazonInventorySummaryRawSchema.safeParse(value);
459
+ if (!parsed.success) throw new ToolError("Amazon SP-API returned an invalid inventory summary", {
460
+ code: "upstream",
461
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
462
+ });
301
463
  return {
302
- ...isString(value["sellerSku"]) && { seller_sku: value["sellerSku"] },
303
- ...isString(value["asin"]) && { asin: value["asin"] },
304
- ...isString(value["fnSku"]) && { fn_sku: value["fnSku"] },
305
- ...isString(value["condition"]) && { condition: value["condition"] },
306
- ...totalQuantity !== void 0 && { total_quantity: totalQuantity },
307
- ...isString(value["productName"]) && { product_name: value["productName"] }
464
+ ...parsed.data.sellerSku && { seller_sku: parsed.data.sellerSku },
465
+ ...parsed.data.asin && { asin: parsed.data.asin },
466
+ ...parsed.data.fnSku && { fn_sku: parsed.data.fnSku },
467
+ ...parsed.data.condition && { condition: parsed.data.condition },
468
+ ...parsed.data.totalQuantity !== void 0 && { total_quantity: parsed.data.totalQuantity },
469
+ ...parsed.data.productName && { product_name: parsed.data.productName }
308
470
  };
309
471
  }
310
- function parseInventoryPayload(data) {
311
- if (!isPlainObject(data)) throw new ToolError("Amazon SP-API inventory payload invalid", { code: "upstream" });
312
- const payload = data["payload"];
313
- if (!isPlainObject(payload)) throw new ToolError("Amazon SP-API inventory missing payload", { code: "upstream" });
314
- const summaries = payload["inventorySummaries"];
315
- if (!Array.isArray(summaries)) throw new ToolError("Amazon SP-API inventory missing inventorySummaries", { code: "upstream" });
316
- const pagination = payload["pagination"];
317
- const nextToken = isPlainObject(pagination) && isString(pagination["nextToken"]) && pagination["nextToken"].length > 0 ? pagination["nextToken"] : void 0;
472
+ const inventoryPageResponseSchema = z.looseObject({
473
+ payload: z.looseObject({ inventorySummaries: z.array(amazonInventorySummaryRawSchema) }),
474
+ pagination: z.looseObject({ nextToken: z.string().min(1).optional() }).optional()
475
+ });
476
+ const optionalAmazonRateLimitSchema = z.coerce.number().positive();
477
+ function parseAmazonResponseMetadata(headers) {
478
+ const rawRateLimit = headers.get("x-amzn-ratelimit-limit");
479
+ let rateLimit;
480
+ if (rawRateLimit !== null) {
481
+ const parsedRateLimit = optionalAmazonRateLimitSchema.safeParse(rawRateLimit);
482
+ if (!parsedRateLimit.success) throw new ToolError("Amazon SP-API returned an invalid rate-limit header", { code: "upstream" });
483
+ rateLimit = parsedRateLimit.data;
484
+ }
485
+ const requestId = headers.get("x-amzn-requestid") ?? headers.get("x-amzn-request-id") ?? void 0;
486
+ return {
487
+ ...rateLimit !== void 0 && { rate_limit_per_second: rateLimit },
488
+ ...requestId && { request_id: requestId }
489
+ };
490
+ }
491
+ function parseInventoryPagePayload(data, headers) {
492
+ const parsed = inventoryPageResponseSchema.safeParse(data);
493
+ if (!parsed.success) throw new ToolError("Amazon SP-API inventory page response invalid", {
494
+ code: "upstream",
495
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
496
+ });
318
497
  return {
319
- items: summaries.map(parseInventorySummary),
320
- ...nextToken && { nextToken }
498
+ items: parsed.data.payload.inventorySummaries,
499
+ ...parsed.data.pagination?.nextToken && { next_token: parsed.data.pagination.nextToken },
500
+ ...parseAmazonResponseMetadata(headers)
321
501
  };
322
502
  }
323
503
  function parseCreateReportPayload(data) {
324
- if (!isPlainObject(data) || !isString(data["reportId"]) || data["reportId"].length === 0) throw new ToolError("Amazon SP-API create report response invalid", { code: "upstream" });
325
- return { report_id: data["reportId"] };
504
+ const parsed = z.looseObject({ reportId: z.string().min(1) }).safeParse(data);
505
+ if (!parsed.success) throw new ToolError("Amazon SP-API create report response invalid", { code: "upstream" });
506
+ return { report_id: parsed.data.reportId };
326
507
  }
327
508
  function parseReport(value) {
328
- if (!isPlainObject(value) || !isString(value["reportId"]) || value["reportId"].length === 0) throw new ToolError("Amazon SP-API returned an invalid report", { code: "upstream" });
329
- const marketplaceIds = value["marketplaceIds"];
330
- const marketplace_ids = Array.isArray(marketplaceIds) && marketplaceIds.every((id) => isString(id)) ? marketplaceIds.filter((id) => isString(id) && id.length > 0) : void 0;
509
+ const parsed = amazonReportRawSchema.safeParse(value);
510
+ if (!parsed.success) throw new ToolError("Amazon SP-API returned an invalid report", {
511
+ code: "upstream",
512
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
513
+ });
331
514
  return {
332
- report_id: value["reportId"],
333
- ...isString(value["reportType"]) && { report_type: value["reportType"] },
334
- ...isString(value["processingStatus"]) && { processing_status: value["processingStatus"] },
335
- ...marketplace_ids && marketplace_ids.length > 0 && { marketplace_ids },
336
- ...isString(value["dataStartTime"]) && { data_start_time: value["dataStartTime"] },
337
- ...isString(value["dataEndTime"]) && { data_end_time: value["dataEndTime"] },
338
- ...isString(value["reportDocumentId"]) && { report_document_id: value["reportDocumentId"] },
339
- ...isString(value["createdTime"]) && { created_time: value["createdTime"] }
515
+ report_id: parsed.data.reportId,
516
+ ...parsed.data.reportType && { report_type: parsed.data.reportType },
517
+ ...parsed.data.processingStatus && { processing_status: parsed.data.processingStatus },
518
+ ...parsed.data.marketplaceIds && parsed.data.marketplaceIds.length > 0 && { marketplace_ids: parsed.data.marketplaceIds },
519
+ ...parsed.data.dataStartTime && { data_start_time: parsed.data.dataStartTime },
520
+ ...parsed.data.dataEndTime && { data_end_time: parsed.data.dataEndTime },
521
+ ...parsed.data.reportDocumentId && { report_document_id: parsed.data.reportDocumentId },
522
+ ...parsed.data.createdTime && { created_time: parsed.data.createdTime }
340
523
  };
341
524
  }
342
525
  function parseGetReportPayload(data) {
343
526
  return parseReport(data);
344
527
  }
345
- function parseListReportsPayload(data) {
346
- if (!isPlainObject(data)) throw new ToolError("Amazon SP-API list reports payload invalid", { code: "upstream" });
347
- const reports = data["reports"];
348
- if (!Array.isArray(reports)) throw new ToolError("Amazon SP-API list reports missing reports array", { code: "upstream" });
349
- const nextToken = isString(data["nextToken"]) && data["nextToken"].length > 0 ? data["nextToken"] : void 0;
528
+ const listReportsPageResponseSchema = z.looseObject({
529
+ reports: z.array(amazonReportRawSchema),
530
+ nextToken: z.string().min(1).optional()
531
+ });
532
+ function parseListReportsPagePayload(data, headers) {
533
+ const parsed = listReportsPageResponseSchema.safeParse(data);
534
+ if (!parsed.success) throw new ToolError("Amazon SP-API list reports page response invalid", {
535
+ code: "upstream",
536
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
537
+ });
350
538
  return {
351
- items: reports.map(parseReport),
352
- ...nextToken && { nextToken }
539
+ items: parsed.data.reports,
540
+ ...parsed.data.nextToken && { next_token: parsed.data.nextToken },
541
+ ...parseAmazonResponseMetadata(headers)
353
542
  };
354
543
  }
355
544
  function parseReportDocumentPayload(data) {
356
- if (!isPlainObject(data) || !isString(data["reportDocumentId"]) || data["reportDocumentId"].length === 0 || !isString(data["url"]) || data["url"].length === 0) throw new ToolError("Amazon SP-API report document response invalid", { code: "upstream" });
545
+ const parsed = z.looseObject({
546
+ reportDocumentId: z.string().min(1),
547
+ url: z.url(),
548
+ compressionAlgorithm: z.string().min(1).optional()
549
+ }).safeParse(data);
550
+ if (!parsed.success) throw new ToolError("Amazon SP-API report document response invalid", { code: "upstream" });
357
551
  return {
358
- document_id: data["reportDocumentId"],
359
- url: data["url"],
360
- ...isString(data["compressionAlgorithm"]) && data["compressionAlgorithm"].length > 0 && { compression_algorithm: data["compressionAlgorithm"] }
552
+ document_id: parsed.data.reportDocumentId,
553
+ url: parsed.data.url,
554
+ ...parsed.data.compressionAlgorithm && { compression_algorithm: parsed.data.compressionAlgorithm }
361
555
  };
362
556
  }
363
557
  function parseCatalogItem(value) {
364
- if (!isPlainObject(value) || !isString(value["asin"]) || value["asin"].length === 0) throw new ToolError("Amazon SP-API returned an invalid catalog item", { code: "upstream" });
365
- const summaries = value["summaries"];
366
- let title;
367
- let brand;
368
- let marketplace_id;
369
- if (Array.isArray(summaries) && summaries.length > 0 && isPlainObject(summaries[0])) {
370
- const summary = summaries[0];
371
- if (isString(summary["itemName"])) title = summary["itemName"];
372
- if (isString(summary["brandName"])) brand = summary["brandName"];
373
- if (isString(summary["marketplaceId"])) marketplace_id = summary["marketplaceId"];
374
- }
375
- const productTypes = value["productTypes"];
376
- let product_type;
377
- if (Array.isArray(productTypes) && productTypes.length > 0 && isPlainObject(productTypes[0])) {
378
- const pt = productTypes[0];
379
- if (isString(pt["productType"])) product_type = pt["productType"];
380
- }
558
+ const parsed = amazonCatalogItemRawSchema.safeParse(value);
559
+ if (!parsed.success) throw new ToolError("Amazon SP-API returned an invalid catalog item", { code: "upstream" });
560
+ const summary = parsed.data.summaries?.[0];
561
+ const productType = parsed.data.productTypes?.[0];
381
562
  return {
382
- asin: value["asin"],
383
- ...title && { title },
384
- ...brand && { brand },
385
- ...product_type && { product_type },
386
- ...marketplace_id && { marketplace_id }
563
+ asin: parsed.data.asin,
564
+ ...summary?.itemName && { title: summary.itemName },
565
+ ...summary?.brandName && { brand: summary.brandName },
566
+ ...productType?.productType && { product_type: productType.productType },
567
+ ...summary?.marketplaceId && { marketplace_id: summary.marketplaceId }
387
568
  };
388
569
  }
389
570
  function parseSearchCatalogItemsPayload(data) {
390
- if (!isPlainObject(data)) throw new ToolError("Amazon SP-API catalog search payload invalid", { code: "upstream" });
391
- const items = data["items"];
392
- if (!Array.isArray(items)) throw new ToolError("Amazon SP-API catalog search missing items array", { code: "upstream" });
393
- const pagination = data["pagination"];
394
- const nextToken = isPlainObject(pagination) && isString(pagination["nextToken"]) && pagination["nextToken"].length > 0 ? pagination["nextToken"] : void 0;
395
- const numberOfResults = typeof data["numberOfResults"] === "number" ? data["numberOfResults"] : void 0;
571
+ const parsed = amazonCatalogSearchResponseSchema.safeParse(data);
572
+ if (!parsed.success) throw new ToolError("Amazon SP-API catalog search payload invalid", { code: "upstream" });
396
573
  return {
397
- items: items.map(parseCatalogItem),
398
- ...numberOfResults !== void 0 && { numberOfResults },
399
- ...nextToken && { nextToken }
574
+ items: parsed.data.items.map(parseCatalogItem),
575
+ ...parsed.data.numberOfResults !== void 0 && { numberOfResults: parsed.data.numberOfResults },
576
+ ...parsed.data.pagination?.nextToken && { nextToken: parsed.data.pagination.nextToken }
400
577
  };
401
578
  }
402
579
  function requireMarketplaceIds(inputIds, authIds, label) {
@@ -405,6 +582,361 @@ function requireMarketplaceIds(inputIds, authIds, label) {
405
582
  return ids;
406
583
  }
407
584
  //#endregion
585
+ //#region node_modules/fflate/esm/index.mjs
586
+ var require = createRequire("/");
587
+ var _a;
588
+ try {
589
+ _a = require("worker_threads"), _a.Worker, _a.isMarkedAsUntransferable;
590
+ } catch (e) {}
591
+ var u8 = Uint8Array;
592
+ var u16 = Uint16Array;
593
+ var i32 = Int32Array;
594
+ var fleb = new u8([
595
+ 0,
596
+ 0,
597
+ 0,
598
+ 0,
599
+ 0,
600
+ 0,
601
+ 0,
602
+ 0,
603
+ 1,
604
+ 1,
605
+ 1,
606
+ 1,
607
+ 2,
608
+ 2,
609
+ 2,
610
+ 2,
611
+ 3,
612
+ 3,
613
+ 3,
614
+ 3,
615
+ 4,
616
+ 4,
617
+ 4,
618
+ 4,
619
+ 5,
620
+ 5,
621
+ 5,
622
+ 5,
623
+ 0,
624
+ 0,
625
+ 0,
626
+ 0
627
+ ]);
628
+ var fdeb = new u8([
629
+ 0,
630
+ 0,
631
+ 0,
632
+ 0,
633
+ 1,
634
+ 1,
635
+ 2,
636
+ 2,
637
+ 3,
638
+ 3,
639
+ 4,
640
+ 4,
641
+ 5,
642
+ 5,
643
+ 6,
644
+ 6,
645
+ 7,
646
+ 7,
647
+ 8,
648
+ 8,
649
+ 9,
650
+ 9,
651
+ 10,
652
+ 10,
653
+ 11,
654
+ 11,
655
+ 12,
656
+ 12,
657
+ 13,
658
+ 13,
659
+ 0,
660
+ 0
661
+ ]);
662
+ var clim = new u8([
663
+ 16,
664
+ 17,
665
+ 18,
666
+ 0,
667
+ 8,
668
+ 7,
669
+ 9,
670
+ 6,
671
+ 10,
672
+ 5,
673
+ 11,
674
+ 4,
675
+ 12,
676
+ 3,
677
+ 13,
678
+ 2,
679
+ 14,
680
+ 1,
681
+ 15
682
+ ]);
683
+ var freb = function(eb, start) {
684
+ var b = new u16(31);
685
+ for (var i = 0; i < 31; ++i) b[i] = start += 1 << eb[i - 1];
686
+ var r = new i32(b[30]);
687
+ for (var i = 1; i < 30; ++i) for (var j = b[i]; j < b[i + 1]; ++j) r[j] = j - b[i] << 5 | i;
688
+ return {
689
+ b,
690
+ r
691
+ };
692
+ };
693
+ var _a = freb(fleb, 2);
694
+ var fl = _a.b;
695
+ var revfl = _a.r;
696
+ fl[28] = 258, revfl[258] = 28;
697
+ var _b = freb(fdeb, 0);
698
+ var fd = _b.b;
699
+ _b.r;
700
+ var rev = new u16(32768);
701
+ for (var i = 0; i < 32768; ++i) {
702
+ var x = (i & 43690) >> 1 | (i & 21845) << 1;
703
+ x = (x & 52428) >> 2 | (x & 13107) << 2;
704
+ x = (x & 61680) >> 4 | (x & 3855) << 4;
705
+ rev[i] = ((x & 65280) >> 8 | (x & 255) << 8) >> 1;
706
+ }
707
+ var hMap = (function(cd, mb, r) {
708
+ var s = cd.length;
709
+ var i = 0;
710
+ var l = new u16(mb);
711
+ for (; i < s; ++i) if (cd[i]) ++l[cd[i] - 1];
712
+ var le = new u16(mb);
713
+ for (i = 1; i < mb; ++i) le[i] = le[i - 1] + l[i - 1] << 1;
714
+ var co;
715
+ if (r) {
716
+ co = new u16(1 << mb);
717
+ var rvb = 15 - mb;
718
+ for (i = 0; i < s; ++i) if (cd[i]) {
719
+ var sv = i << 4 | cd[i];
720
+ var r_1 = mb - cd[i];
721
+ var v = le[cd[i] - 1]++ << r_1;
722
+ for (var m = v | (1 << r_1) - 1; v <= m; ++v) co[rev[v] >> rvb] = sv;
723
+ }
724
+ } else {
725
+ co = new u16(s);
726
+ for (i = 0; i < s; ++i) if (cd[i]) co[i] = rev[le[cd[i] - 1]++] >> 15 - cd[i];
727
+ }
728
+ return co;
729
+ });
730
+ var flt = new u8(288);
731
+ for (var i = 0; i < 144; ++i) flt[i] = 8;
732
+ for (var i = 144; i < 256; ++i) flt[i] = 9;
733
+ for (var i = 256; i < 280; ++i) flt[i] = 7;
734
+ for (var i = 280; i < 288; ++i) flt[i] = 8;
735
+ var fdt = new u8(32);
736
+ for (var i = 0; i < 32; ++i) fdt[i] = 5;
737
+ var flrm = /*#__PURE__*/ hMap(flt, 9, 1);
738
+ var fdrm = /*#__PURE__*/ hMap(fdt, 5, 1);
739
+ var max = function(a) {
740
+ var m = a[0];
741
+ for (var i = 1; i < a.length; ++i) if (a[i] > m) m = a[i];
742
+ return m;
743
+ };
744
+ var bits = function(d, p, m) {
745
+ var o = p / 8 | 0;
746
+ return (d[o] | d[o + 1] << 8) >> (p & 7) & m;
747
+ };
748
+ var bits16 = function(d, p) {
749
+ var o = p / 8 | 0;
750
+ return (d[o] | d[o + 1] << 8 | d[o + 2] << 16) >> (p & 7);
751
+ };
752
+ var shft = function(p) {
753
+ return (p + 7) / 8 | 0;
754
+ };
755
+ var slc = function(v, s, e) {
756
+ if (s == null || s < 0) s = 0;
757
+ if (e == null || e > v.length) e = v.length;
758
+ return new u8(v.subarray(s, e));
759
+ };
760
+ var ec = [
761
+ "unexpected EOF",
762
+ "invalid block type",
763
+ "invalid length/literal",
764
+ "invalid distance",
765
+ "stream finished",
766
+ "no stream handler",
767
+ ,
768
+ "no callback",
769
+ "invalid UTF-8 data",
770
+ "extra field too long",
771
+ "date not in range 1980-2099",
772
+ "filename too long",
773
+ "stream finishing",
774
+ "invalid zip data"
775
+ ];
776
+ var err = function(ind, msg, nt) {
777
+ var e = new Error(msg || ec[ind]);
778
+ e.code = ind;
779
+ if (Error.captureStackTrace) Error.captureStackTrace(e, err);
780
+ if (!nt) throw e;
781
+ return e;
782
+ };
783
+ var inflt = function(dat, st, buf, dict) {
784
+ var sl = dat.length, dl = dict ? dict.length : 0;
785
+ if (!sl || st.f && !st.l) return buf || new u8(0);
786
+ var noBuf = !buf;
787
+ var resize = noBuf || st.i != 2;
788
+ var noSt = st.i;
789
+ if (noBuf) buf = new u8(sl * 3);
790
+ var cbuf = function(l) {
791
+ var bl = buf.length;
792
+ if (l > bl) {
793
+ var nbuf = new u8(Math.max(bl * 2, l));
794
+ nbuf.set(buf);
795
+ buf = nbuf;
796
+ }
797
+ };
798
+ var final = st.f || 0, pos = st.p || 0, bt = st.b || 0, lm = st.l, dm = st.d, lbt = st.m, dbt = st.n;
799
+ var tbts = sl * 8;
800
+ do {
801
+ if (!lm) {
802
+ final = bits(dat, pos, 1);
803
+ var type = bits(dat, pos + 1, 3);
804
+ pos += 3;
805
+ if (!type) {
806
+ var s = shft(pos) + 4, l = dat[s - 4] | dat[s - 3] << 8, t = s + l;
807
+ if (t > sl) {
808
+ if (noSt) err(0);
809
+ break;
810
+ }
811
+ if (resize) cbuf(bt + l);
812
+ buf.set(dat.subarray(s, t), bt);
813
+ st.b = bt += l, st.p = pos = t * 8, st.f = final;
814
+ continue;
815
+ } else if (type == 1) lm = flrm, dm = fdrm, lbt = 9, dbt = 5;
816
+ else if (type == 2) {
817
+ var hLit = bits(dat, pos, 31) + 257, hcLen = bits(dat, pos + 10, 15) + 4;
818
+ var tl = hLit + bits(dat, pos + 5, 31) + 1;
819
+ pos += 14;
820
+ var ldt = new u8(tl);
821
+ var clt = new u8(19);
822
+ for (var i = 0; i < hcLen; ++i) clt[clim[i]] = bits(dat, pos + i * 3, 7);
823
+ pos += hcLen * 3;
824
+ var clb = max(clt), clbmsk = (1 << clb) - 1;
825
+ var clm = hMap(clt, clb, 1);
826
+ for (var i = 0; i < tl;) {
827
+ var r = clm[bits(dat, pos, clbmsk)];
828
+ pos += r & 15;
829
+ var s = r >> 4;
830
+ if (s < 16) ldt[i++] = s;
831
+ else {
832
+ var c = 0, n = 0;
833
+ if (s == 16) n = 3 + bits(dat, pos, 3), pos += 2, c = ldt[i - 1];
834
+ else if (s == 17) n = 3 + bits(dat, pos, 7), pos += 3;
835
+ else if (s == 18) n = 11 + bits(dat, pos, 127), pos += 7;
836
+ while (n--) ldt[i++] = c;
837
+ }
838
+ }
839
+ var lt = ldt.subarray(0, hLit), dt = ldt.subarray(hLit);
840
+ lbt = max(lt);
841
+ dbt = max(dt);
842
+ lm = hMap(lt, lbt, 1);
843
+ dm = hMap(dt, dbt, 1);
844
+ } else err(1);
845
+ if (pos > tbts) {
846
+ if (noSt) err(0);
847
+ break;
848
+ }
849
+ }
850
+ if (resize) cbuf(bt + 131072);
851
+ var lms = (1 << lbt) - 1, dms = (1 << dbt) - 1;
852
+ var lpos = pos;
853
+ for (;; lpos = pos) {
854
+ var c = lm[bits16(dat, pos) & lms], sym = c >> 4;
855
+ pos += c & 15;
856
+ if (pos > tbts) {
857
+ if (noSt) err(0);
858
+ break;
859
+ }
860
+ if (!c) err(2);
861
+ if (sym < 256) buf[bt++] = sym;
862
+ else if (sym == 256) {
863
+ lpos = pos, lm = null;
864
+ break;
865
+ } else {
866
+ var add = sym - 254;
867
+ if (sym > 264) {
868
+ var i = sym - 257, b = fleb[i];
869
+ add = bits(dat, pos, (1 << b) - 1) + fl[i];
870
+ pos += b;
871
+ }
872
+ var d = dm[bits16(dat, pos) & dms], dsym = d >> 4;
873
+ if (!d) err(3);
874
+ pos += d & 15;
875
+ var dt = fd[dsym];
876
+ if (dsym > 3) {
877
+ var b = fdeb[dsym];
878
+ dt += bits16(dat, pos) & (1 << b) - 1, pos += b;
879
+ }
880
+ if (pos > tbts) {
881
+ if (noSt) err(0);
882
+ break;
883
+ }
884
+ if (resize) cbuf(bt + 131072);
885
+ var end = bt + add;
886
+ if (bt < dt) {
887
+ var shift = dl - dt, dend = Math.min(dt, end);
888
+ if (shift + bt < 0) err(3);
889
+ for (; bt < dend; ++bt) buf[bt] = dict[shift + bt];
890
+ }
891
+ for (; bt < end; ++bt) buf[bt] = buf[bt - dt];
892
+ }
893
+ }
894
+ st.l = lm, st.p = lpos, st.b = bt, st.f = final;
895
+ if (lm) final = 1, st.m = lbt, st.d = dm, st.n = dbt;
896
+ } while (!final);
897
+ return bt != buf.length && noBuf ? slc(buf, 0, bt) : buf.subarray(0, bt);
898
+ };
899
+ var et = /*#__PURE__*/ new u8(0);
900
+ var gzs = function(d) {
901
+ if (d[0] != 31 || d[1] != 139 || d[2] != 8) err(6, "invalid gzip data");
902
+ var flg = d[3];
903
+ var st = 10;
904
+ if (flg & 4) st += (d[10] | d[11] << 8) + 2;
905
+ for (var zs = (flg >> 3 & 1) + (flg >> 4 & 1); zs > 0; zs -= !d[st++]);
906
+ return st + (flg & 2);
907
+ };
908
+ var gzl = function(d) {
909
+ var l = d.length;
910
+ return (d[l - 4] | d[l - 3] << 8 | d[l - 2] << 16 | d[l - 1] << 24) >>> 0;
911
+ };
912
+ function gunzipSync(data, opts) {
913
+ var st = gzs(data);
914
+ if (st + 8 > data.length) err(6, "invalid gzip data");
915
+ return inflt(data.subarray(st, -8), { i: 2 }, opts && opts.out || new u8(gzl(data)), opts && opts.dictionary);
916
+ }
917
+ var td = typeof TextDecoder != "undefined" && /*#__PURE__*/ new TextDecoder();
918
+ try {
919
+ td.decode(et, { stream: true });
920
+ } catch (e) {}
921
+ //#endregion
922
+ //#region src/vendors/amazon-sp-api/domain/report-document.ts
923
+ function reportDocumentError(message, code) {
924
+ throw new ToolError(message, { code });
925
+ }
926
+ async function decompressReportDocumentBytes(bytes, compressionAlgorithm, maxBytes) {
927
+ if (bytes.byteLength > maxBytes) reportDocumentError("Amazon report document exceeds max_bytes", "too_large");
928
+ if (!compressionAlgorithm) return bytes;
929
+ if (compressionAlgorithm.toUpperCase() !== "GZIP") reportDocumentError(`Unsupported Amazon report compression: ${compressionAlgorithm}`, "unsupported");
930
+ try {
931
+ const output = gunzipSync(bytes, { out: new Uint8Array(maxBytes + 1) });
932
+ if (output.byteLength > maxBytes) reportDocumentError("Amazon report document exceeds max_bytes after decompression", "too_large");
933
+ return output.slice();
934
+ } catch (error) {
935
+ if (error instanceof ToolError) throw error;
936
+ reportDocumentError("Failed to decompress Amazon report document", "upstream");
937
+ }
938
+ }
939
+ //#endregion
408
940
  //#region src/vendors/amazon-sp-api/domain/settlement.ts
409
941
  /**
410
942
  * Amazon settlement report V2 (GET_V2_SETTLEMENT_REPORT_DATA_FLAT_FILE_V2).
@@ -414,6 +946,8 @@ function requireMarketplaceIds(inputIds, authIds, label) {
414
946
  const SETTLEMENT_REPORT_TYPE_V2 = "GET_V2_SETTLEMENT_REPORT_DATA_FLAT_FILE_V2";
415
947
  /** Max compressed document body (bytes). */
416
948
  const SETTLEMENT_MAX_COMPRESSED_BYTES = 16 * 1024 * 1024;
949
+ /** Max decompressed TSV body (bytes). */
950
+ const SETTLEMENT_MAX_DECOMPRESSED_BYTES = 64 * 1024 * 1024;
417
951
  /** Required V2 header names (order free after parse; extra trailing columns OK). */
418
952
  const SETTLEMENT_V2_REQUIRED_COLUMNS = [
419
953
  "settlement-id",
@@ -451,26 +985,14 @@ function parseUsMoneyToSafeCents(raw) {
451
985
  if (!Number.isSafeInteger(n)) settlementError("Settlement amount exceeds safe integer cents range", "upstream");
452
986
  return n;
453
987
  }
454
- /** Copy into a fresh ArrayBuffer so Blob accepts it under exact DOM typings. */
455
- function toArrayBuffer(bytes) {
456
- const copy = new Uint8Array(bytes.byteLength);
457
- copy.set(bytes);
458
- return copy.buffer;
459
- }
460
- /** Decompress GZIP when report document uses compressionAlgorithm GZIP (Web DecompressionStream). */
988
+ /** Decompress GZIP when report document uses compressionAlgorithm GZIP. */
461
989
  async function maybeGunzipReportBytes(bytes, compressionAlgorithm) {
462
- if (!compressionAlgorithm) return bytes;
463
- const algo = compressionAlgorithm.toUpperCase();
464
- if (algo !== "GZIP") settlementError(`Unsupported settlement report compression: ${algo}`, "upstream");
465
990
  if (bytes.byteLength > 16777216) settlementError("Settlement report compressed body exceeds limit", "too_large");
466
- if (typeof DecompressionStream === "undefined") settlementError("GZIP decompression is not available in this runtime", "unsupported");
467
991
  try {
468
- const stream = new Blob([toArrayBuffer(bytes)]).stream().pipeThrough(new DecompressionStream("gzip"));
469
- const buffer = await new Response(stream).arrayBuffer();
470
- if (buffer.byteLength > 67108864) settlementError("Settlement report decompressed body exceeds limit", "too_large");
471
- return new Uint8Array(buffer);
992
+ return await decompressReportDocumentBytes(bytes, compressionAlgorithm, SETTLEMENT_MAX_DECOMPRESSED_BYTES);
472
993
  } catch (error) {
473
- if (error instanceof ToolError) throw error;
994
+ if (error instanceof ToolError && error.code === "too_large") settlementError("Settlement report decompressed body exceeds limit", "too_large");
995
+ if (error instanceof ToolError && error.code === "unsupported") throw error;
474
996
  settlementError("Failed to decompress settlement report", "upstream");
475
997
  }
476
998
  }
@@ -561,8 +1083,7 @@ function settlementCreatedSinceIso(now = /* @__PURE__ */ new Date(), retentionDa
561
1083
  * Amazon Selling Partner API vendor client.
562
1084
  * Host: `new AmazonSpApiClient(auth)`. Agent tools: `fromContext(ctx)`.
563
1085
  *
564
- * LWA refresh access token; SP-API calls use AwsService (SigV4 execute-api)
565
- * plus x-amz-access-token.
1086
+ * LWA refresh provides the access token used by SP-API HTTP requests.
566
1087
  */
567
1088
  var AmazonSpApiClient = class AmazonSpApiClient {
568
1089
  #auth;
@@ -583,15 +1104,11 @@ var AmazonSpApiClient = class AmazonSpApiClient {
583
1104
  ...options,
584
1105
  label: "Amazon LWA"
585
1106
  });
586
- this.#api = new AwsService({
1107
+ this.#api = new HttpService({
587
1108
  ...options,
588
- accessKeyId: this.#auth.access_key_id,
589
- secretAccessKey: this.#auth.secret_access_key,
590
- region: this.#auth.region,
591
- service: "execute-api",
592
1109
  baseURL: this.#auth.endpoint,
593
- label: "Amazon SP-API",
594
- ...this.#auth.session_token && { sessionToken: this.#auth.session_token }
1110
+ headers: { "user-agent": this.#auth.user_agent },
1111
+ label: "Amazon SP-API"
595
1112
  });
596
1113
  this.#download = new HttpService({
597
1114
  ...options,
@@ -607,15 +1124,15 @@ var AmazonSpApiClient = class AmazonSpApiClient {
607
1124
  }
608
1125
  async #ensureAccessToken() {
609
1126
  const now = Date.now();
610
- if (this.#accessToken && now < this.#accessTokenExpiresAt - 6e4) return this.#accessToken;
1127
+ if (this.#accessToken && now < this.#accessTokenExpiresAt) return this.#accessToken;
611
1128
  const { data } = await this.#lwa.post(LWA_TOKEN_URL, lwaTokenBody(this.#auth), {
612
1129
  label: "Amazon LWA token",
613
1130
  headers: { "Content-Type": "application/x-www-form-urlencoded" }
614
1131
  });
615
- const token = parseLwaAccessToken(data);
616
- this.#accessToken = token;
617
- this.#accessTokenExpiresAt = now + 3e6;
618
- return token;
1132
+ const token = parseLwaTokenResponse(data);
1133
+ this.#accessToken = token.access_token;
1134
+ this.#accessTokenExpiresAt = now + Math.max(0, token.expires_in * 1e3 - 6e4);
1135
+ return token.access_token;
619
1136
  }
620
1137
  async #spGet(path, label, query) {
621
1138
  const token = await this.#ensureAccessToken();
@@ -707,23 +1224,59 @@ var AmazonSpApiClient = class AmazonSpApiClient {
707
1224
  };
708
1225
  }
709
1226
  /** GET /fba/inventory/v1/summaries */
710
- async listInventorySummaries(input = {}) {
711
- const marketplaceId = requireMarketplaceIds(input.marketplace_id ? [input.marketplace_id] : void 0, this.#auth.marketplace_ids, "Amazon SP-API listInventorySummaries")[0];
712
- if (!marketplaceId) throw new ToolError("Amazon SP-API listInventorySummaries requires a marketplace_id", { code: "bad_input" });
713
- const { data } = await this.#spGet("/fba/inventory/v1/summaries", "Amazon SP-API listInventorySummaries", {
1227
+ async getInventorySummariesPage(input) {
1228
+ const parsedInput = amazonSpApiInventoryPageInputSchema.safeParse(input);
1229
+ if (!parsedInput.success) throw new ToolError("Invalid Amazon SP-API inventory page input", {
1230
+ code: "bad_input",
1231
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1232
+ });
1233
+ return await this.#requestInventorySummariesPage({
1234
+ marketplace_id: parsedInput.data.marketplace_id,
1235
+ ...parsedInput.data.mode === "incremental" && { start_date_time: parsedInput.data.start_date_time },
1236
+ ...parsedInput.data.next_token && { next_token: parsedInput.data.next_token }
1237
+ });
1238
+ }
1239
+ async #requestInventorySummariesPage(input) {
1240
+ const result = await this.#spGet("/fba/inventory/v1/summaries", "Amazon SP-API getInventorySummariesPage", {
714
1241
  details: true,
715
1242
  granularityType: "Marketplace",
716
- granularityId: marketplaceId,
717
- marketplaceIds: marketplaceId,
718
- ...input.seller_skus && input.seller_skus.length > 0 && { sellerSkus: input.seller_skus.join(",") },
1243
+ granularityId: input.marketplace_id,
1244
+ marketplaceIds: input.marketplace_id,
719
1245
  ...input.start_date_time && { startDateTime: input.start_date_time },
720
- ...input.cursor && { nextToken: input.cursor }
1246
+ ...input.next_token && { nextToken: input.next_token },
1247
+ ...input.seller_skus && input.seller_skus.length > 0 && { sellerSkus: input.seller_skus.join(",") }
1248
+ });
1249
+ return parseInventoryPagePayload(result.data, result.headers);
1250
+ }
1251
+ /** Existing slim agent-facing projection over one raw inventory page. */
1252
+ async listInventorySummaries(input = {}) {
1253
+ const marketplaceId = requireMarketplaceIds(input.marketplace_id ? [input.marketplace_id] : void 0, this.#auth.marketplace_ids, "Amazon SP-API listInventorySummaries")[0];
1254
+ if (!marketplaceId) throw new ToolError("Amazon SP-API listInventorySummaries requires a marketplace_id", { code: "bad_input" });
1255
+ const pageInput = input.start_date_time ? {
1256
+ mode: "incremental",
1257
+ marketplace_id: marketplaceId,
1258
+ start_date_time: input.start_date_time,
1259
+ ...input.cursor && { next_token: input.cursor }
1260
+ } : {
1261
+ mode: "full",
1262
+ marketplace_id: marketplaceId,
1263
+ ...input.cursor && { next_token: input.cursor }
1264
+ };
1265
+ const parsedInput = amazonSpApiInventoryPageInputSchema.safeParse(pageInput);
1266
+ if (!parsedInput.success) throw new ToolError("Invalid Amazon SP-API inventory page input", {
1267
+ code: "bad_input",
1268
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1269
+ });
1270
+ const page = await this.#requestInventorySummariesPage({
1271
+ marketplace_id: marketplaceId,
1272
+ ...input.start_date_time && { start_date_time: input.start_date_time },
1273
+ ...input.cursor && { next_token: input.cursor },
1274
+ ...input.seller_skus && input.seller_skus.length > 0 && { seller_skus: input.seller_skus }
721
1275
  });
722
- const parsed = parseInventoryPayload(data);
723
1276
  return {
724
- items: parsed.items,
725
- truncated: Boolean(parsed.nextToken),
726
- ...parsed.nextToken && { next_cursor: parsed.nextToken }
1277
+ items: page.items.map(parseInventorySummary),
1278
+ truncated: Boolean(page.next_token),
1279
+ ...page.next_token && { next_cursor: page.next_token }
727
1280
  };
728
1281
  }
729
1282
  /** POST /reports/2021-06-30/reports */
@@ -745,29 +1298,86 @@ var AmazonSpApiClient = class AmazonSpApiClient {
745
1298
  return { report: parseGetReportPayload(data) };
746
1299
  }
747
1300
  /** GET /reports/2021-06-30/reports */
748
- async listReports(input = {}) {
749
- const marketplaceIds = input.marketplace_ids ?? this.#auth.marketplace_ids;
750
- const { data } = await this.#spGet("/reports/2021-06-30/reports", "Amazon SP-API listReports", {
751
- ...input.report_types && input.report_types.length > 0 && { reportTypes: input.report_types.join(",") },
752
- ...input.processing_statuses && input.processing_statuses.length > 0 && { processingStatuses: input.processing_statuses.join(",") },
753
- ...marketplaceIds && marketplaceIds.length > 0 && { marketplaceIds: marketplaceIds.join(",") },
754
- ...input.page_size !== void 0 && { pageSize: input.page_size },
755
- ...input.created_since && { createdSince: input.created_since },
756
- ...input.created_until && { createdUntil: input.created_until },
757
- ...input.cursor && { nextToken: input.cursor }
1301
+ async listReports(input) {
1302
+ const parsedInput = amazonSpApiListReportsInputSchema.safeParse(input);
1303
+ if (!parsedInput.success) throw new ToolError("Invalid Amazon SP-API listReports input", {
1304
+ code: "bad_input",
1305
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1306
+ });
1307
+ const page = "cursor" in parsedInput.data ? await this.listReportsPage({ next_token: parsedInput.data.cursor }) : await this.listReportsPage({
1308
+ report_types: parsedInput.data.report_types,
1309
+ ...parsedInput.data.processing_statuses && { processing_statuses: parsedInput.data.processing_statuses },
1310
+ ...parsedInput.data.marketplace_ids && { marketplace_ids: parsedInput.data.marketplace_ids },
1311
+ ...parsedInput.data.page_size !== void 0 && { page_size: parsedInput.data.page_size },
1312
+ ...parsedInput.data.created_since && { created_since: parsedInput.data.created_since },
1313
+ ...parsedInput.data.created_until && { created_until: parsedInput.data.created_until }
758
1314
  });
759
- const parsed = parseListReportsPayload(data);
760
1315
  return {
761
- items: parsed.items,
762
- truncated: Boolean(parsed.nextToken),
763
- ...parsed.nextToken && { next_cursor: parsed.nextToken }
1316
+ items: page.items.map(parseReport),
1317
+ truncated: Boolean(page.next_token),
1318
+ ...page.next_token && { next_cursor: page.next_token }
764
1319
  };
765
1320
  }
1321
+ /** One GET /reports/2021-06-30/reports request. Continuations send only nextToken. */
1322
+ async listReportsPage(input) {
1323
+ const parsedInput = amazonSpApiListReportsPageInputSchema.safeParse(input);
1324
+ if (!parsedInput.success) throw new ToolError("Invalid Amazon SP-API reports page input", {
1325
+ code: "bad_input",
1326
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1327
+ });
1328
+ let query;
1329
+ if ("next_token" in parsedInput.data) query = { nextToken: parsedInput.data.next_token };
1330
+ else {
1331
+ const marketplaceIds = parsedInput.data.marketplace_ids ?? this.#auth.marketplace_ids;
1332
+ query = {
1333
+ reportTypes: parsedInput.data.report_types.join(","),
1334
+ ...parsedInput.data.processing_statuses && { processingStatuses: parsedInput.data.processing_statuses.join(",") },
1335
+ ...marketplaceIds && { marketplaceIds: marketplaceIds.join(",") },
1336
+ ...parsedInput.data.page_size !== void 0 && { pageSize: parsedInput.data.page_size },
1337
+ ...parsedInput.data.created_since && { createdSince: parsedInput.data.created_since },
1338
+ ...parsedInput.data.created_until && { createdUntil: parsedInput.data.created_until }
1339
+ };
1340
+ }
1341
+ const result = await this.#spGet("/reports/2021-06-30/reports", "Amazon SP-API listReportsPage", query);
1342
+ return parseListReportsPagePayload(result.data, result.headers);
1343
+ }
766
1344
  /** GET /reports/2021-06-30/documents/{reportDocumentId} */
767
1345
  async getReportDocument(input) {
768
1346
  const { data } = await this.#spGet(`/reports/2021-06-30/documents/${encodeURIComponent(input.report_document_id)}`, "Amazon SP-API getReportDocument");
769
1347
  return parseReportDocumentPayload(data);
770
1348
  }
1349
+ /** Resolve and privately download an Amazon report document by id. */
1350
+ async downloadReportDocumentBytes(input) {
1351
+ const parsedInput = amazonSpApiDownloadReportDocumentBytesInputSchema.safeParse(input);
1352
+ if (!parsedInput.success) throw new ToolError("Invalid Amazon report document download input", {
1353
+ code: "bad_input",
1354
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1355
+ });
1356
+ const document = await this.getReportDocument({ report_document_id: parsedInput.data.report_document_id });
1357
+ return await this.#downloadReportDocumentDescriptor(document, parsedInput.data.max_bytes);
1358
+ }
1359
+ async #downloadReportDocumentDescriptor(document, maxBytes) {
1360
+ let compressionAlgorithm;
1361
+ if (document.compression_algorithm) {
1362
+ if (document.compression_algorithm.toUpperCase() !== "GZIP") throw new ToolError(`Unsupported Amazon report compression: ${document.compression_algorithm}`, { code: "unsupported" });
1363
+ compressionAlgorithm = "GZIP";
1364
+ }
1365
+ const result = await this.#download.bytes("GET", document.url, {
1366
+ label: "Amazon SP-API report document",
1367
+ maxBytes
1368
+ });
1369
+ const bytes = await decompressReportDocumentBytes(result.bytes, compressionAlgorithm, maxBytes);
1370
+ const contentType = result.headers.get("content-type") ?? void 0;
1371
+ const contentEncoding = result.headers.get("content-encoding") ?? void 0;
1372
+ return {
1373
+ bytes,
1374
+ text: bytesToUtf8(bytes),
1375
+ byte_length: bytes.byteLength,
1376
+ ...contentType && { content_type: contentType },
1377
+ ...contentEncoding && { content_encoding: contentEncoding },
1378
+ ...compressionAlgorithm && { compression_algorithm: compressionAlgorithm }
1379
+ };
1380
+ }
771
1381
  /**
772
1382
  * Composite: newest DONE Flat File V2 settlement report (or `report_id`) →
773
1383
  * one document download → eight summary fields in safe integer cents.
@@ -795,12 +1405,11 @@ var AmazonSpApiClient = class AmazonSpApiClient {
795
1405
  const createdSince = input.created_since ?? settlementCreatedSinceIso();
796
1406
  let cursor;
797
1407
  for (let page = 0; page < 5; page += 1) {
798
- const listed = await this.listReports({
1408
+ const listed = cursor ? await this.listReports({ cursor }) : await this.listReports({
799
1409
  report_types: [SETTLEMENT_REPORT_TYPE_V2],
800
1410
  processing_statuses: ["DONE"],
801
1411
  created_since: createdSince,
802
- page_size: 100,
803
- ...cursor && { cursor }
1412
+ page_size: 100
804
1413
  });
805
1414
  for (const report of listed.items) if (report.report_document_id) return report.report_document_id;
806
1415
  if (!listed.next_cursor) break;
@@ -902,7 +1511,7 @@ const amazonSpApiGetReportTool = defineTool({
902
1511
  const amazonSpApiListReportsTool = defineTool({
903
1512
  id: "amazon-sp-api-list-reports",
904
1513
  name: "amazonSpApiListReports",
905
- description: "List Amazon SP-API reports with optional type, status, marketplace, and created-time filters. Paginate with next_cursor.",
1514
+ description: "List Amazon SP-API reports. Initial calls require report types and may use status, marketplace, and created-time filters. Continue with next_cursor.",
906
1515
  inputSchema: amazonSpApiListReportsInputSchema,
907
1516
  outputSchema: amazonSpApiListReportsOutputSchema,
908
1517
  sideEffect: "read",
@@ -970,6 +1579,6 @@ const amazonSpApiModule = defineModule({
970
1579
  ]
971
1580
  });
972
1581
  //#endregion
973
- export { AmazonSpApiClient, amazonSpApiAuthSchema, amazonSpApiCatalogItemSchema, amazonSpApiCreateReportInputSchema, amazonSpApiCreateReportOutputSchema, amazonSpApiCreateReportTool, amazonSpApiEndpointSchema, amazonSpApiGetOrderInputSchema, amazonSpApiGetOrderItemsInputSchema, amazonSpApiGetOrderItemsOutputSchema, amazonSpApiGetOrderItemsTool, amazonSpApiGetOrderOutputSchema, amazonSpApiGetOrderTool, amazonSpApiGetReportDocumentInputSchema, amazonSpApiGetReportDocumentOutputSchema, amazonSpApiGetReportDocumentTool, amazonSpApiGetReportInputSchema, amazonSpApiGetReportOutputSchema, amazonSpApiGetReportTool, amazonSpApiGetSettlementSummaryInputSchema, amazonSpApiGetSettlementSummaryOutputSchema, amazonSpApiGetSettlementSummaryTool, amazonSpApiInventorySummarySchema, amazonSpApiListInventorySummariesInputSchema, amazonSpApiListInventorySummariesOutputSchema, amazonSpApiListInventorySummariesTool, amazonSpApiListOrdersInputSchema, amazonSpApiListOrdersOutputSchema, amazonSpApiListOrdersTool, amazonSpApiListReportsInputSchema, amazonSpApiListReportsOutputSchema, amazonSpApiListReportsTool, amazonSpApiModule, amazonSpApiOrderItemSchema, amazonSpApiOrderSchema, amazonSpApiReportSchema, amazonSpApiSearchCatalogItemsInputSchema, amazonSpApiSearchCatalogItemsOutputSchema, amazonSpApiSearchCatalogItemsTool, amazonSpApiSearchOrderSchema, amazonSpApiSearchOrdersInputSchema, amazonSpApiSearchOrdersOutputSchema, amazonSpApiSearchOrdersTool, amazonSpApiSettlementSummarySchema };
1582
+ export { AmazonSpApiClient, amazonInventoryDetailsRawSchema, amazonInventoryResearchingQuantityBreakdownRawSchema, amazonInventoryResearchingQuantityRawSchema, amazonInventoryReservedQuantityRawSchema, amazonInventorySummaryRawSchema, amazonInventoryUnfulfillableQuantityRawSchema, amazonReportRawSchema, amazonSpApiAuthSchema, amazonSpApiCatalogItemSchema, amazonSpApiCreateReportInputSchema, amazonSpApiCreateReportOutputSchema, amazonSpApiCreateReportTool, amazonSpApiDownloadReportDocumentBytesInputSchema, amazonSpApiDownloadReportDocumentBytesOutputSchema, amazonSpApiEndpointSchema, amazonSpApiGetOrderInputSchema, amazonSpApiGetOrderItemsInputSchema, amazonSpApiGetOrderItemsOutputSchema, amazonSpApiGetOrderItemsTool, amazonSpApiGetOrderOutputSchema, amazonSpApiGetOrderTool, amazonSpApiGetReportDocumentInputSchema, amazonSpApiGetReportDocumentOutputSchema, amazonSpApiGetReportDocumentTool, amazonSpApiGetReportInputSchema, amazonSpApiGetReportOutputSchema, amazonSpApiGetReportTool, amazonSpApiGetSettlementSummaryInputSchema, amazonSpApiGetSettlementSummaryOutputSchema, amazonSpApiGetSettlementSummaryTool, amazonSpApiInventoryPageInputSchema, amazonSpApiInventoryPageOutputSchema, amazonSpApiInventorySummarySchema, amazonSpApiListInventorySummariesInputSchema, amazonSpApiListInventorySummariesOutputSchema, amazonSpApiListInventorySummariesTool, amazonSpApiListOrdersInputSchema, amazonSpApiListOrdersOutputSchema, amazonSpApiListOrdersTool, amazonSpApiListReportsContinuationInputSchema, amazonSpApiListReportsInitialInputSchema, amazonSpApiListReportsInputSchema, amazonSpApiListReportsOutputSchema, amazonSpApiListReportsPageInputSchema, amazonSpApiListReportsPageOutputSchema, amazonSpApiListReportsTool, amazonSpApiLwaTokenResponseSchema, amazonSpApiModule, amazonSpApiOrderItemSchema, amazonSpApiOrderSchema, amazonSpApiReportSchema, amazonSpApiSearchCatalogItemsInputSchema, amazonSpApiSearchCatalogItemsOutputSchema, amazonSpApiSearchCatalogItemsTool, amazonSpApiSearchOrderSchema, amazonSpApiSearchOrdersInputSchema, amazonSpApiSearchOrdersOutputSchema, amazonSpApiSearchOrdersTool, amazonSpApiSettlementSummarySchema };
974
1583
 
975
1584
  //# sourceMappingURL=index.js.map