@5ss/ai-tools 2.11.2 → 2.11.3

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 (65) hide show
  1. package/CHANGELOG.md +2 -0
  2. package/dist/esm-BDrCssjb.js +957 -0
  3. package/dist/esm-BDrCssjb.js.map +1 -0
  4. package/dist/http/index.d.ts +1 -1
  5. package/dist/{http-service-T7E5UjP8.d.ts → http-service-CerzWwQO.d.ts} +3 -2
  6. package/dist/http-service-CerzWwQO.d.ts.map +1 -0
  7. package/dist/http-service-DDNCO1s4.js.map +1 -1
  8. package/dist/{index-Cuh6eMWc.d.ts → index-9oSRRNdR.d.ts} +2 -2
  9. package/dist/{index-Cuh6eMWc.d.ts.map → index-9oSRRNdR.d.ts.map} +1 -1
  10. package/dist/{index-zK1ZwS4m.d.ts → index-ByHp3nZm.d.ts} +2 -2
  11. package/dist/{index-zK1ZwS4m.d.ts.map → index-ByHp3nZm.d.ts.map} +1 -1
  12. package/dist/{index-BU4gmYO8.d.ts → index-C-Cuh9it.d.ts} +2 -2
  13. package/dist/{index-BU4gmYO8.d.ts.map → index-C-Cuh9it.d.ts.map} +1 -1
  14. package/dist/{index-CdFmEfZO.d.ts → index-CtfpOZWu.d.ts} +2 -2
  15. package/dist/{index-CdFmEfZO.d.ts.map → index-CtfpOZWu.d.ts.map} +1 -1
  16. package/dist/{index-n8JTpNf1.d.ts → index-DngnGGiS.d.ts} +2 -2
  17. package/dist/{index-n8JTpNf1.d.ts.map → index-DngnGGiS.d.ts.map} +1 -1
  18. package/dist/{index-DuOGj7vc.d.ts → index-DsTt2EbS.d.ts} +2 -2
  19. package/dist/{index-DuOGj7vc.d.ts.map → index-DsTt2EbS.d.ts.map} +1 -1
  20. package/dist/{index-pwW1OsOx.d.ts → index-Y8p8bsWU.d.ts} +2 -2
  21. package/dist/{index-pwW1OsOx.d.ts.map → index-Y8p8bsWU.d.ts.map} +1 -1
  22. package/dist/modules/artifacts/index.d.ts +1 -1
  23. package/dist/modules/browser/index.d.ts +2 -2
  24. package/dist/modules/document-extract/index.d.ts +1 -1
  25. package/dist/modules/document-render/index.d.ts +1 -1
  26. package/dist/modules/email/index.d.ts +2 -2
  27. package/dist/modules/image/index.d.ts +1 -1
  28. package/dist/modules/messaging/index.d.ts +1 -1
  29. package/dist/modules/pdf/index.d.ts +1 -1
  30. package/dist/modules/presentation/index.js +1 -937
  31. package/dist/modules/presentation/index.js.map +1 -1
  32. package/dist/modules/queue/index.d.ts +1 -1
  33. package/dist/modules/rag/index.d.ts +1 -1
  34. package/dist/modules/scheduler/index.d.ts +2 -2
  35. package/dist/{object-artifact-store-CMTzCm_G.d.ts → object-artifact-store-BVLietAc.d.ts} +2 -2
  36. package/dist/object-artifact-store-BVLietAc.d.ts.map +1 -0
  37. package/dist/vendors/amazon-sp-api/index.d.ts +267 -18
  38. package/dist/vendors/amazon-sp-api/index.d.ts.map +1 -1
  39. package/dist/vendors/amazon-sp-api/index.js +483 -211
  40. package/dist/vendors/amazon-sp-api/index.js.map +1 -1
  41. package/dist/vendors/bedrock-agentcore-browser/index.d.ts +1 -1
  42. package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts +1 -1
  43. package/dist/vendors/cloudflare-browser/index.d.ts +1 -1
  44. package/dist/vendors/cloudflare-email/index.d.ts +1 -1
  45. package/dist/vendors/cloudflare-sandbox/index.d.ts +1 -1
  46. package/dist/vendors/eventbridge-scheduler/index.d.ts +1 -1
  47. package/dist/vendors/gotenberg/index.d.ts +1 -1
  48. package/dist/vendors/katana/index.d.ts +371 -2
  49. package/dist/vendors/katana/index.d.ts.map +1 -1
  50. package/dist/vendors/katana/index.js +540 -198
  51. package/dist/vendors/katana/index.js.map +1 -1
  52. package/dist/vendors/pinecone/index.d.ts +1 -1
  53. package/dist/vendors/qdrant/index.d.ts +1 -1
  54. package/dist/vendors/resend/index.d.ts +1 -1
  55. package/dist/vendors/s3/index.d.ts +1 -1
  56. package/dist/vendors/slack/index.d.ts +1 -1
  57. package/dist/vendors/sqs/index.d.ts +1 -1
  58. package/dist/vendors/supabase-vector/index.d.ts +1 -1
  59. package/dist/vendors/teams/index.d.ts +1 -1
  60. package/dist/vendors/telegram/index.d.ts +1 -1
  61. package/dist/vendors/textract/index.d.ts +1 -1
  62. package/dist/vendors/woocommerce/index.d.ts +1 -1
  63. package/package.json +2 -1
  64. package/dist/http-service-T7E5UjP8.d.ts.map +0 -1
  65. package/dist/object-artifact-store-CMTzCm_G.d.ts.map +0 -1
@@ -2,8 +2,8 @@ import { t as ToolError } from "../../errors-DoSpNHvs.js";
2
2
  import { n as defineModule, r as defineTool } from "../../define-CvpJ_pNP.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";
6
+ import { t as gunzipSync } from "../../esm-BDrCssjb.js";
7
7
  import { z } from "zod";
8
8
  import Decimal from "decimal.js";
9
9
  import Papa from "papaparse";
@@ -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;
318
486
  return {
319
- items: summaries.map(parseInventorySummary),
320
- ...nextToken && { nextToken }
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
+ });
497
+ return {
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,24 @@ function requireMarketplaceIds(inputIds, authIds, label) {
405
582
  return ids;
406
583
  }
407
584
  //#endregion
585
+ //#region src/vendors/amazon-sp-api/domain/report-document.ts
586
+ function reportDocumentError(message, code) {
587
+ throw new ToolError(message, { code });
588
+ }
589
+ async function decompressReportDocumentBytes(bytes, compressionAlgorithm, maxBytes) {
590
+ if (bytes.byteLength > maxBytes) reportDocumentError("Amazon report document exceeds max_bytes", "too_large");
591
+ if (!compressionAlgorithm) return bytes;
592
+ if (compressionAlgorithm.toUpperCase() !== "GZIP") reportDocumentError(`Unsupported Amazon report compression: ${compressionAlgorithm}`, "unsupported");
593
+ try {
594
+ const output = gunzipSync(bytes, { out: new Uint8Array(maxBytes + 1) });
595
+ if (output.byteLength > maxBytes) reportDocumentError("Amazon report document exceeds max_bytes after decompression", "too_large");
596
+ return output.slice();
597
+ } catch (error) {
598
+ if (error instanceof ToolError) throw error;
599
+ reportDocumentError("Failed to decompress Amazon report document", "upstream");
600
+ }
601
+ }
602
+ //#endregion
408
603
  //#region src/vendors/amazon-sp-api/domain/settlement.ts
409
604
  /**
410
605
  * Amazon settlement report V2 (GET_V2_SETTLEMENT_REPORT_DATA_FLAT_FILE_V2).
@@ -414,6 +609,8 @@ function requireMarketplaceIds(inputIds, authIds, label) {
414
609
  const SETTLEMENT_REPORT_TYPE_V2 = "GET_V2_SETTLEMENT_REPORT_DATA_FLAT_FILE_V2";
415
610
  /** Max compressed document body (bytes). */
416
611
  const SETTLEMENT_MAX_COMPRESSED_BYTES = 16 * 1024 * 1024;
612
+ /** Max decompressed TSV body (bytes). */
613
+ const SETTLEMENT_MAX_DECOMPRESSED_BYTES = 64 * 1024 * 1024;
417
614
  /** Required V2 header names (order free after parse; extra trailing columns OK). */
418
615
  const SETTLEMENT_V2_REQUIRED_COLUMNS = [
419
616
  "settlement-id",
@@ -451,26 +648,14 @@ function parseUsMoneyToSafeCents(raw) {
451
648
  if (!Number.isSafeInteger(n)) settlementError("Settlement amount exceeds safe integer cents range", "upstream");
452
649
  return n;
453
650
  }
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). */
651
+ /** Decompress GZIP when report document uses compressionAlgorithm GZIP. */
461
652
  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
653
  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
654
  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);
655
+ return await decompressReportDocumentBytes(bytes, compressionAlgorithm, SETTLEMENT_MAX_DECOMPRESSED_BYTES);
472
656
  } catch (error) {
473
- if (error instanceof ToolError) throw error;
657
+ if (error instanceof ToolError && error.code === "too_large") settlementError("Settlement report decompressed body exceeds limit", "too_large");
658
+ if (error instanceof ToolError && error.code === "unsupported") throw error;
474
659
  settlementError("Failed to decompress settlement report", "upstream");
475
660
  }
476
661
  }
@@ -561,8 +746,7 @@ function settlementCreatedSinceIso(now = /* @__PURE__ */ new Date(), retentionDa
561
746
  * Amazon Selling Partner API vendor client.
562
747
  * Host: `new AmazonSpApiClient(auth)`. Agent tools: `fromContext(ctx)`.
563
748
  *
564
- * LWA refresh access token; SP-API calls use AwsService (SigV4 execute-api)
565
- * plus x-amz-access-token.
749
+ * LWA refresh provides the access token used by SP-API HTTP requests.
566
750
  */
567
751
  var AmazonSpApiClient = class AmazonSpApiClient {
568
752
  #auth;
@@ -583,15 +767,11 @@ var AmazonSpApiClient = class AmazonSpApiClient {
583
767
  ...options,
584
768
  label: "Amazon LWA"
585
769
  });
586
- this.#api = new AwsService({
770
+ this.#api = new HttpService({
587
771
  ...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
772
  baseURL: this.#auth.endpoint,
593
- label: "Amazon SP-API",
594
- ...this.#auth.session_token && { sessionToken: this.#auth.session_token }
773
+ headers: { "user-agent": this.#auth.user_agent },
774
+ label: "Amazon SP-API"
595
775
  });
596
776
  this.#download = new HttpService({
597
777
  ...options,
@@ -607,15 +787,15 @@ var AmazonSpApiClient = class AmazonSpApiClient {
607
787
  }
608
788
  async #ensureAccessToken() {
609
789
  const now = Date.now();
610
- if (this.#accessToken && now < this.#accessTokenExpiresAt - 6e4) return this.#accessToken;
790
+ if (this.#accessToken && now < this.#accessTokenExpiresAt) return this.#accessToken;
611
791
  const { data } = await this.#lwa.post(LWA_TOKEN_URL, lwaTokenBody(this.#auth), {
612
792
  label: "Amazon LWA token",
613
793
  headers: { "Content-Type": "application/x-www-form-urlencoded" }
614
794
  });
615
- const token = parseLwaAccessToken(data);
616
- this.#accessToken = token;
617
- this.#accessTokenExpiresAt = now + 3e6;
618
- return token;
795
+ const token = parseLwaTokenResponse(data);
796
+ this.#accessToken = token.access_token;
797
+ this.#accessTokenExpiresAt = now + Math.max(0, token.expires_in * 1e3 - 6e4);
798
+ return token.access_token;
619
799
  }
620
800
  async #spGet(path, label, query) {
621
801
  const token = await this.#ensureAccessToken();
@@ -707,23 +887,59 @@ var AmazonSpApiClient = class AmazonSpApiClient {
707
887
  };
708
888
  }
709
889
  /** 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", {
890
+ async getInventorySummariesPage(input) {
891
+ const parsedInput = amazonSpApiInventoryPageInputSchema.safeParse(input);
892
+ if (!parsedInput.success) throw new ToolError("Invalid Amazon SP-API inventory page input", {
893
+ code: "bad_input",
894
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
895
+ });
896
+ return await this.#requestInventorySummariesPage({
897
+ marketplace_id: parsedInput.data.marketplace_id,
898
+ ...parsedInput.data.mode === "incremental" && { start_date_time: parsedInput.data.start_date_time },
899
+ ...parsedInput.data.next_token && { next_token: parsedInput.data.next_token }
900
+ });
901
+ }
902
+ async #requestInventorySummariesPage(input) {
903
+ const result = await this.#spGet("/fba/inventory/v1/summaries", "Amazon SP-API getInventorySummariesPage", {
714
904
  details: true,
715
905
  granularityType: "Marketplace",
716
- granularityId: marketplaceId,
717
- marketplaceIds: marketplaceId,
718
- ...input.seller_skus && input.seller_skus.length > 0 && { sellerSkus: input.seller_skus.join(",") },
906
+ granularityId: input.marketplace_id,
907
+ marketplaceIds: input.marketplace_id,
719
908
  ...input.start_date_time && { startDateTime: input.start_date_time },
720
- ...input.cursor && { nextToken: input.cursor }
909
+ ...input.next_token && { nextToken: input.next_token },
910
+ ...input.seller_skus && input.seller_skus.length > 0 && { sellerSkus: input.seller_skus.join(",") }
911
+ });
912
+ return parseInventoryPagePayload(result.data, result.headers);
913
+ }
914
+ /** Existing slim agent-facing projection over one raw inventory page. */
915
+ async listInventorySummaries(input = {}) {
916
+ const marketplaceId = requireMarketplaceIds(input.marketplace_id ? [input.marketplace_id] : void 0, this.#auth.marketplace_ids, "Amazon SP-API listInventorySummaries")[0];
917
+ if (!marketplaceId) throw new ToolError("Amazon SP-API listInventorySummaries requires a marketplace_id", { code: "bad_input" });
918
+ const pageInput = input.start_date_time ? {
919
+ mode: "incremental",
920
+ marketplace_id: marketplaceId,
921
+ start_date_time: input.start_date_time,
922
+ ...input.cursor && { next_token: input.cursor }
923
+ } : {
924
+ mode: "full",
925
+ marketplace_id: marketplaceId,
926
+ ...input.cursor && { next_token: input.cursor }
927
+ };
928
+ const parsedInput = amazonSpApiInventoryPageInputSchema.safeParse(pageInput);
929
+ if (!parsedInput.success) throw new ToolError("Invalid Amazon SP-API inventory page input", {
930
+ code: "bad_input",
931
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
932
+ });
933
+ const page = await this.#requestInventorySummariesPage({
934
+ marketplace_id: marketplaceId,
935
+ ...input.start_date_time && { start_date_time: input.start_date_time },
936
+ ...input.cursor && { next_token: input.cursor },
937
+ ...input.seller_skus && input.seller_skus.length > 0 && { seller_skus: input.seller_skus }
721
938
  });
722
- const parsed = parseInventoryPayload(data);
723
939
  return {
724
- items: parsed.items,
725
- truncated: Boolean(parsed.nextToken),
726
- ...parsed.nextToken && { next_cursor: parsed.nextToken }
940
+ items: page.items.map(parseInventorySummary),
941
+ truncated: Boolean(page.next_token),
942
+ ...page.next_token && { next_cursor: page.next_token }
727
943
  };
728
944
  }
729
945
  /** POST /reports/2021-06-30/reports */
@@ -745,29 +961,86 @@ var AmazonSpApiClient = class AmazonSpApiClient {
745
961
  return { report: parseGetReportPayload(data) };
746
962
  }
747
963
  /** 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 }
964
+ async listReports(input) {
965
+ const parsedInput = amazonSpApiListReportsInputSchema.safeParse(input);
966
+ if (!parsedInput.success) throw new ToolError("Invalid Amazon SP-API listReports input", {
967
+ code: "bad_input",
968
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
969
+ });
970
+ const page = "cursor" in parsedInput.data ? await this.listReportsPage({ next_token: parsedInput.data.cursor }) : await this.listReportsPage({
971
+ report_types: parsedInput.data.report_types,
972
+ ...parsedInput.data.processing_statuses && { processing_statuses: parsedInput.data.processing_statuses },
973
+ ...parsedInput.data.marketplace_ids && { marketplace_ids: parsedInput.data.marketplace_ids },
974
+ ...parsedInput.data.page_size !== void 0 && { page_size: parsedInput.data.page_size },
975
+ ...parsedInput.data.created_since && { created_since: parsedInput.data.created_since },
976
+ ...parsedInput.data.created_until && { created_until: parsedInput.data.created_until }
758
977
  });
759
- const parsed = parseListReportsPayload(data);
760
978
  return {
761
- items: parsed.items,
762
- truncated: Boolean(parsed.nextToken),
763
- ...parsed.nextToken && { next_cursor: parsed.nextToken }
979
+ items: page.items.map(parseReport),
980
+ truncated: Boolean(page.next_token),
981
+ ...page.next_token && { next_cursor: page.next_token }
764
982
  };
765
983
  }
984
+ /** One GET /reports/2021-06-30/reports request. Continuations send only nextToken. */
985
+ async listReportsPage(input) {
986
+ const parsedInput = amazonSpApiListReportsPageInputSchema.safeParse(input);
987
+ if (!parsedInput.success) throw new ToolError("Invalid Amazon SP-API reports page input", {
988
+ code: "bad_input",
989
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
990
+ });
991
+ let query;
992
+ if ("next_token" in parsedInput.data) query = { nextToken: parsedInput.data.next_token };
993
+ else {
994
+ const marketplaceIds = parsedInput.data.marketplace_ids ?? this.#auth.marketplace_ids;
995
+ query = {
996
+ reportTypes: parsedInput.data.report_types.join(","),
997
+ ...parsedInput.data.processing_statuses && { processingStatuses: parsedInput.data.processing_statuses.join(",") },
998
+ ...marketplaceIds && { marketplaceIds: marketplaceIds.join(",") },
999
+ ...parsedInput.data.page_size !== void 0 && { pageSize: parsedInput.data.page_size },
1000
+ ...parsedInput.data.created_since && { createdSince: parsedInput.data.created_since },
1001
+ ...parsedInput.data.created_until && { createdUntil: parsedInput.data.created_until }
1002
+ };
1003
+ }
1004
+ const result = await this.#spGet("/reports/2021-06-30/reports", "Amazon SP-API listReportsPage", query);
1005
+ return parseListReportsPagePayload(result.data, result.headers);
1006
+ }
766
1007
  /** GET /reports/2021-06-30/documents/{reportDocumentId} */
767
1008
  async getReportDocument(input) {
768
1009
  const { data } = await this.#spGet(`/reports/2021-06-30/documents/${encodeURIComponent(input.report_document_id)}`, "Amazon SP-API getReportDocument");
769
1010
  return parseReportDocumentPayload(data);
770
1011
  }
1012
+ /** Resolve and privately download an Amazon report document by id. */
1013
+ async downloadReportDocumentBytes(input) {
1014
+ const parsedInput = amazonSpApiDownloadReportDocumentBytesInputSchema.safeParse(input);
1015
+ if (!parsedInput.success) throw new ToolError("Invalid Amazon report document download input", {
1016
+ code: "bad_input",
1017
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1018
+ });
1019
+ const document = await this.getReportDocument({ report_document_id: parsedInput.data.report_document_id });
1020
+ return await this.#downloadReportDocumentDescriptor(document, parsedInput.data.max_bytes);
1021
+ }
1022
+ async #downloadReportDocumentDescriptor(document, maxBytes) {
1023
+ let compressionAlgorithm;
1024
+ if (document.compression_algorithm) {
1025
+ if (document.compression_algorithm.toUpperCase() !== "GZIP") throw new ToolError(`Unsupported Amazon report compression: ${document.compression_algorithm}`, { code: "unsupported" });
1026
+ compressionAlgorithm = "GZIP";
1027
+ }
1028
+ const result = await this.#download.bytes("GET", document.url, {
1029
+ label: "Amazon SP-API report document",
1030
+ maxBytes
1031
+ });
1032
+ const bytes = await decompressReportDocumentBytes(result.bytes, compressionAlgorithm, maxBytes);
1033
+ const contentType = result.headers.get("content-type") ?? void 0;
1034
+ const contentEncoding = result.headers.get("content-encoding") ?? void 0;
1035
+ return {
1036
+ bytes,
1037
+ text: bytesToUtf8(bytes),
1038
+ byte_length: bytes.byteLength,
1039
+ ...contentType && { content_type: contentType },
1040
+ ...contentEncoding && { content_encoding: contentEncoding },
1041
+ ...compressionAlgorithm && { compression_algorithm: compressionAlgorithm }
1042
+ };
1043
+ }
771
1044
  /**
772
1045
  * Composite: newest DONE Flat File V2 settlement report (or `report_id`) →
773
1046
  * one document download → eight summary fields in safe integer cents.
@@ -795,12 +1068,11 @@ var AmazonSpApiClient = class AmazonSpApiClient {
795
1068
  const createdSince = input.created_since ?? settlementCreatedSinceIso();
796
1069
  let cursor;
797
1070
  for (let page = 0; page < 5; page += 1) {
798
- const listed = await this.listReports({
1071
+ const listed = cursor ? await this.listReports({ cursor }) : await this.listReports({
799
1072
  report_types: [SETTLEMENT_REPORT_TYPE_V2],
800
1073
  processing_statuses: ["DONE"],
801
1074
  created_since: createdSince,
802
- page_size: 100,
803
- ...cursor && { cursor }
1075
+ page_size: 100
804
1076
  });
805
1077
  for (const report of listed.items) if (report.report_document_id) return report.report_document_id;
806
1078
  if (!listed.next_cursor) break;
@@ -902,7 +1174,7 @@ const amazonSpApiGetReportTool = defineTool({
902
1174
  const amazonSpApiListReportsTool = defineTool({
903
1175
  id: "amazon-sp-api-list-reports",
904
1176
  name: "amazonSpApiListReports",
905
- description: "List Amazon SP-API reports with optional type, status, marketplace, and created-time filters. Paginate with next_cursor.",
1177
+ 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
1178
  inputSchema: amazonSpApiListReportsInputSchema,
907
1179
  outputSchema: amazonSpApiListReportsOutputSchema,
908
1180
  sideEffect: "read",
@@ -970,6 +1242,6 @@ const amazonSpApiModule = defineModule({
970
1242
  ]
971
1243
  });
972
1244
  //#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 };
1245
+ 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
1246
 
975
1247
  //# sourceMappingURL=index.js.map