@5ss/ai-tools 2.11.1 → 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.
- package/CHANGELOG.md +32 -28
- package/README.md +2 -2
- package/dist/esm-BDrCssjb.js +957 -0
- package/dist/esm-BDrCssjb.js.map +1 -0
- package/dist/http/index.d.ts +1 -1
- package/dist/{http-service-T7E5UjP8.d.ts → http-service-CerzWwQO.d.ts} +3 -2
- package/dist/http-service-CerzWwQO.d.ts.map +1 -0
- package/dist/http-service-DDNCO1s4.js.map +1 -1
- package/dist/{index-Cuh6eMWc.d.ts → index-9oSRRNdR.d.ts} +2 -2
- package/dist/{index-Cuh6eMWc.d.ts.map → index-9oSRRNdR.d.ts.map} +1 -1
- package/dist/{index-zK1ZwS4m.d.ts → index-ByHp3nZm.d.ts} +2 -2
- package/dist/{index-zK1ZwS4m.d.ts.map → index-ByHp3nZm.d.ts.map} +1 -1
- package/dist/{index-BU4gmYO8.d.ts → index-C-Cuh9it.d.ts} +2 -2
- package/dist/{index-BU4gmYO8.d.ts.map → index-C-Cuh9it.d.ts.map} +1 -1
- package/dist/{index-CdFmEfZO.d.ts → index-CtfpOZWu.d.ts} +2 -2
- package/dist/{index-CdFmEfZO.d.ts.map → index-CtfpOZWu.d.ts.map} +1 -1
- package/dist/{index-n8JTpNf1.d.ts → index-DngnGGiS.d.ts} +2 -2
- package/dist/{index-n8JTpNf1.d.ts.map → index-DngnGGiS.d.ts.map} +1 -1
- package/dist/{index-DuOGj7vc.d.ts → index-DsTt2EbS.d.ts} +2 -2
- package/dist/{index-DuOGj7vc.d.ts.map → index-DsTt2EbS.d.ts.map} +1 -1
- package/dist/{index-pwW1OsOx.d.ts → index-Y8p8bsWU.d.ts} +2 -2
- package/dist/{index-pwW1OsOx.d.ts.map → index-Y8p8bsWU.d.ts.map} +1 -1
- package/dist/modules/artifacts/index.d.ts +1 -1
- package/dist/modules/browser/index.d.ts +2 -2
- package/dist/modules/document-extract/index.d.ts +1 -1
- package/dist/modules/document-render/index.d.ts +1 -1
- package/dist/modules/email/index.d.ts +2 -2
- package/dist/modules/image/index.d.ts +1 -1
- package/dist/modules/messaging/index.d.ts +1 -1
- package/dist/modules/pdf/index.d.ts +1 -1
- package/dist/modules/presentation/index.js +1 -937
- package/dist/modules/presentation/index.js.map +1 -1
- package/dist/modules/queue/index.d.ts +1 -1
- package/dist/modules/rag/index.d.ts +1 -1
- package/dist/modules/scheduler/index.d.ts +2 -2
- package/dist/{object-artifact-store-CMTzCm_G.d.ts → object-artifact-store-BVLietAc.d.ts} +2 -2
- package/dist/object-artifact-store-BVLietAc.d.ts.map +1 -0
- package/dist/vendors/amazon-sp-api/index.d.ts +267 -18
- package/dist/vendors/amazon-sp-api/index.d.ts.map +1 -1
- package/dist/vendors/amazon-sp-api/index.js +483 -211
- package/dist/vendors/amazon-sp-api/index.js.map +1 -1
- package/dist/vendors/bedrock-agentcore-browser/index.d.ts +1 -1
- package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts +1 -1
- package/dist/vendors/cloudflare-browser/index.d.ts +1 -1
- package/dist/vendors/cloudflare-email/index.d.ts +1 -1
- package/dist/vendors/cloudflare-sandbox/index.d.ts +1 -1
- package/dist/vendors/eventbridge-scheduler/index.d.ts +1 -1
- package/dist/vendors/gotenberg/index.d.ts +1 -1
- package/dist/vendors/katana/index.d.ts +371 -2
- package/dist/vendors/katana/index.d.ts.map +1 -1
- package/dist/vendors/katana/index.js +540 -198
- package/dist/vendors/katana/index.js.map +1 -1
- package/dist/vendors/pinecone/index.d.ts +1 -1
- package/dist/vendors/qdrant/index.d.ts +1 -1
- package/dist/vendors/resend/index.d.ts +1 -1
- package/dist/vendors/s3/index.d.ts +1 -1
- package/dist/vendors/slack/index.d.ts +1 -1
- package/dist/vendors/sqs/index.d.ts +1 -1
- package/dist/vendors/supabase-vector/index.d.ts +1 -1
- package/dist/vendors/teams/index.d.ts +1 -1
- package/dist/vendors/telegram/index.d.ts +1 -1
- package/dist/vendors/textract/index.d.ts +1 -1
- package/dist/vendors/woocommerce/index.d.ts +1 -1
- package/package.json +3 -2
- package/dist/http-service-T7E5UjP8.d.ts.map +0 -1
- 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 {
|
|
6
|
-
import {
|
|
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
|
-
|
|
26
|
-
|
|
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
|
|
132
|
-
report_types: z.array(z.string().min(1)).
|
|
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.
|
|
137
|
-
created_until: z.
|
|
138
|
-
|
|
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
|
|
206
|
-
|
|
207
|
-
|
|
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
|
-
|
|
211
|
-
|
|
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:
|
|
216
|
-
...
|
|
217
|
-
...
|
|
218
|
-
...
|
|
219
|
-
...
|
|
220
|
-
...
|
|
221
|
-
...
|
|
222
|
-
...
|
|
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
|
-
|
|
227
|
-
|
|
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:
|
|
234
|
-
...
|
|
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
|
-
|
|
239
|
-
|
|
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
|
-
|
|
244
|
-
|
|
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:
|
|
248
|
-
...
|
|
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
|
-
|
|
254
|
-
const
|
|
255
|
-
|
|
256
|
-
|
|
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
|
-
|
|
267
|
-
|
|
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:
|
|
272
|
-
...
|
|
273
|
-
...
|
|
274
|
-
...
|
|
275
|
-
...
|
|
276
|
-
...
|
|
277
|
-
...
|
|
278
|
-
...
|
|
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
|
-
|
|
283
|
-
|
|
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
|
|
291
|
-
items:
|
|
292
|
-
...
|
|
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
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
-
...
|
|
303
|
-
...
|
|
304
|
-
...
|
|
305
|
-
...
|
|
306
|
-
...totalQuantity !== void 0 && { total_quantity: totalQuantity },
|
|
307
|
-
...
|
|
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
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
const
|
|
317
|
-
|
|
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
|
-
|
|
320
|
-
...
|
|
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
|
-
|
|
325
|
-
|
|
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
|
-
|
|
329
|
-
|
|
330
|
-
|
|
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:
|
|
333
|
-
...
|
|
334
|
-
...
|
|
335
|
-
...
|
|
336
|
-
...
|
|
337
|
-
...
|
|
338
|
-
...
|
|
339
|
-
...
|
|
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
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
359
|
-
url: data
|
|
360
|
-
...
|
|
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
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
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:
|
|
383
|
-
...
|
|
384
|
-
...
|
|
385
|
-
...
|
|
386
|
-
...
|
|
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
|
-
|
|
391
|
-
|
|
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
|
-
/**
|
|
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
|
-
|
|
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)
|
|
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
|
|
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
|
|
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
|
-
|
|
594
|
-
|
|
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
|
|
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 =
|
|
616
|
-
this.#accessToken = token;
|
|
617
|
-
this.#accessTokenExpiresAt = now +
|
|
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
|
|
711
|
-
const
|
|
712
|
-
if (!
|
|
713
|
-
|
|
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:
|
|
717
|
-
marketplaceIds:
|
|
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.
|
|
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:
|
|
725
|
-
truncated: Boolean(
|
|
726
|
-
...
|
|
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
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
...
|
|
757
|
-
...
|
|
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:
|
|
762
|
-
truncated: Boolean(
|
|
763
|
-
...
|
|
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
|
|
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
|