@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,7 +2,7 @@ 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 { isPlainObject, isString } from "es-toolkit";
5
+ import { isString } from "es-toolkit";
6
6
  import { z } from "zod";
7
7
  //#region src/vendors/katana/contracts.ts
8
8
  const katanaAuthSchema = z.object({ api_key: z.string().min(1).describe("Katana MRP Bearer access token") });
@@ -14,6 +14,171 @@ const listOutputMeta = {
14
14
  next_cursor: z.string().optional(),
15
15
  truncated: z.boolean()
16
16
  };
17
+ const katanaPageSchema = z.int().min(1).optional();
18
+ const katanaPageLimitSchema = z.int().min(1).max(250).optional();
19
+ const katanaTimestampFilterSchema = z.iso.datetime({ offset: true }).optional();
20
+ const katanaRawRecordSchema = z.looseObject({
21
+ id: z.number().int(),
22
+ created_at: z.string().optional(),
23
+ updated_at: z.string().optional(),
24
+ deleted_at: z.string().nullable().optional()
25
+ });
26
+ const katanaSalesOrderRawSchema = katanaRawRecordSchema;
27
+ const katanaProductRawSchema = katanaRawRecordSchema;
28
+ const katanaMaterialRawSchema = katanaRawRecordSchema;
29
+ const katanaCustomerRawSchema = katanaRawRecordSchema;
30
+ const katanaSupplierRawSchema = katanaRawRecordSchema;
31
+ const katanaPurchaseOrderRawSchema = katanaRawRecordSchema;
32
+ const katanaManufacturingOrderRawSchema = katanaRawRecordSchema;
33
+ const katanaInventoryRawSchema = z.looseObject({
34
+ variant_id: z.number().int(),
35
+ location_id: z.number().int(),
36
+ created_at: z.string().optional(),
37
+ updated_at: z.string().optional(),
38
+ deleted_at: z.string().nullable().optional()
39
+ });
40
+ const katanaPaginationSchema = z.object({
41
+ total_records: z.number().int().nonnegative(),
42
+ total_pages: z.number().int().nonnegative(),
43
+ offset: z.number().int().nonnegative(),
44
+ page: z.number().int().min(1),
45
+ first_page: z.boolean(),
46
+ last_page: z.boolean()
47
+ });
48
+ const katanaRateLimitSchema = z.object({
49
+ limit: z.number().int().nonnegative(),
50
+ remaining: z.number().int().nonnegative(),
51
+ reset_at_ms: z.number().int().nonnegative()
52
+ });
53
+ const katanaListSalesOrdersPageInputSchema = z.strictObject({
54
+ page: katanaPageSchema,
55
+ limit: katanaPageLimitSchema,
56
+ status: z.string().min(1).optional(),
57
+ customer_id: z.int().positive().optional(),
58
+ order_no: z.string().min(1).optional(),
59
+ location_id: z.int().positive().optional(),
60
+ created_at_min: katanaTimestampFilterSchema,
61
+ created_at_max: katanaTimestampFilterSchema,
62
+ updated_at_min: katanaTimestampFilterSchema,
63
+ updated_at_max: katanaTimestampFilterSchema,
64
+ include_deleted: z.boolean().optional()
65
+ });
66
+ const katanaListProductsPageInputSchema = z.strictObject({
67
+ page: katanaPageSchema,
68
+ limit: katanaPageLimitSchema,
69
+ name: z.string().min(1).optional(),
70
+ is_sellable: z.boolean().optional(),
71
+ is_producible: z.boolean().optional(),
72
+ is_purchasable: z.boolean().optional(),
73
+ created_at_min: katanaTimestampFilterSchema,
74
+ created_at_max: katanaTimestampFilterSchema,
75
+ updated_at_min: katanaTimestampFilterSchema,
76
+ updated_at_max: katanaTimestampFilterSchema,
77
+ include_deleted: z.boolean().optional(),
78
+ include_archived: z.boolean().optional()
79
+ });
80
+ const katanaListMaterialsPageInputSchema = z.strictObject({
81
+ page: katanaPageSchema,
82
+ limit: katanaPageLimitSchema,
83
+ name: z.string().min(1).optional(),
84
+ created_at_min: katanaTimestampFilterSchema,
85
+ created_at_max: katanaTimestampFilterSchema,
86
+ updated_at_min: katanaTimestampFilterSchema,
87
+ updated_at_max: katanaTimestampFilterSchema,
88
+ include_deleted: z.boolean().optional(),
89
+ include_archived: z.boolean().optional()
90
+ });
91
+ const katanaListCustomersPageInputSchema = z.strictObject({
92
+ page: katanaPageSchema,
93
+ limit: katanaPageLimitSchema,
94
+ name: z.string().min(1).optional(),
95
+ email: z.string().min(1).optional(),
96
+ created_at_min: katanaTimestampFilterSchema,
97
+ created_at_max: katanaTimestampFilterSchema,
98
+ updated_at_min: katanaTimestampFilterSchema,
99
+ updated_at_max: katanaTimestampFilterSchema,
100
+ include_deleted: z.boolean().optional()
101
+ });
102
+ const katanaListSuppliersPageInputSchema = z.strictObject({
103
+ page: katanaPageSchema,
104
+ limit: katanaPageLimitSchema,
105
+ name: z.string().min(1).optional(),
106
+ created_at_min: katanaTimestampFilterSchema,
107
+ created_at_max: katanaTimestampFilterSchema,
108
+ updated_at_min: katanaTimestampFilterSchema,
109
+ updated_at_max: katanaTimestampFilterSchema,
110
+ include_deleted: z.boolean().optional()
111
+ });
112
+ const katanaListPurchaseOrdersPageInputSchema = z.strictObject({
113
+ page: katanaPageSchema,
114
+ limit: katanaPageLimitSchema,
115
+ status: z.string().min(1).optional(),
116
+ supplier_id: z.int().positive().optional(),
117
+ order_no: z.string().min(1).optional(),
118
+ location_id: z.int().positive().optional(),
119
+ created_at_min: katanaTimestampFilterSchema,
120
+ created_at_max: katanaTimestampFilterSchema,
121
+ updated_at_min: katanaTimestampFilterSchema,
122
+ updated_at_max: katanaTimestampFilterSchema,
123
+ include_deleted: z.boolean().optional()
124
+ });
125
+ const katanaListManufacturingOrdersPageInputSchema = z.strictObject({
126
+ page: katanaPageSchema,
127
+ limit: katanaPageLimitSchema,
128
+ status: z.string().min(1).optional(),
129
+ variant_id: z.int().positive().optional(),
130
+ location_id: z.int().positive().optional(),
131
+ order_no: z.string().min(1).optional(),
132
+ created_at_min: katanaTimestampFilterSchema,
133
+ created_at_max: katanaTimestampFilterSchema,
134
+ updated_at_min: katanaTimestampFilterSchema,
135
+ updated_at_max: katanaTimestampFilterSchema,
136
+ include_deleted: z.boolean().optional()
137
+ });
138
+ const katanaListInventoryPageInputSchema = z.strictObject({
139
+ page: katanaPageSchema,
140
+ limit: katanaPageLimitSchema,
141
+ location_id: z.int().positive().optional(),
142
+ variant_id: z.array(z.int().positive()).min(1).optional(),
143
+ include_archived: z.boolean().optional(),
144
+ extend: z.array(z.enum(["variant", "location"])).min(1).optional()
145
+ });
146
+ const katanaPageOutputMeta = {
147
+ pagination: katanaPaginationSchema,
148
+ rate_limit: katanaRateLimitSchema.optional()
149
+ };
150
+ const katanaListSalesOrdersPageOutputSchema = z.object({
151
+ items: z.array(katanaSalesOrderRawSchema),
152
+ ...katanaPageOutputMeta
153
+ });
154
+ const katanaListProductsPageOutputSchema = z.object({
155
+ items: z.array(katanaProductRawSchema),
156
+ ...katanaPageOutputMeta
157
+ });
158
+ const katanaListMaterialsPageOutputSchema = z.object({
159
+ items: z.array(katanaMaterialRawSchema),
160
+ ...katanaPageOutputMeta
161
+ });
162
+ const katanaListCustomersPageOutputSchema = z.object({
163
+ items: z.array(katanaCustomerRawSchema),
164
+ ...katanaPageOutputMeta
165
+ });
166
+ const katanaListSuppliersPageOutputSchema = z.object({
167
+ items: z.array(katanaSupplierRawSchema),
168
+ ...katanaPageOutputMeta
169
+ });
170
+ const katanaListPurchaseOrdersPageOutputSchema = z.object({
171
+ items: z.array(katanaPurchaseOrderRawSchema),
172
+ ...katanaPageOutputMeta
173
+ });
174
+ const katanaListManufacturingOrdersPageOutputSchema = z.object({
175
+ items: z.array(katanaManufacturingOrderRawSchema),
176
+ ...katanaPageOutputMeta
177
+ });
178
+ const katanaListInventoryPageOutputSchema = z.object({
179
+ items: z.array(katanaInventoryRawSchema),
180
+ ...katanaPageOutputMeta
181
+ });
17
182
  const katanaSalesOrderRowInputSchema = z.object({
18
183
  quantity: z.number().positive().describe("Line quantity"),
19
184
  variant_id: z.int().positive().describe("Product variant id"),
@@ -407,6 +572,57 @@ const katanaListInventoryOutputSchema = z.object({
407
572
  * Katana MRP payload helpers (no HTTP).
408
573
  */
409
574
  const KATANA_API_BASE = "https://api.katanamrp.com/v1";
575
+ const katanaRateLimitHeadersSchema = z.object({
576
+ limit: z.coerce.number().int().nonnegative(),
577
+ remaining: z.coerce.number().int().nonnegative(),
578
+ reset_at_ms: z.coerce.number().int().nonnegative()
579
+ });
580
+ function parseKatanaPaginationHeader(headers) {
581
+ const raw = headers.get("x-pagination");
582
+ if (raw === null) throw new ToolError("Katana response is missing X-Pagination", { code: "upstream" });
583
+ let value;
584
+ try {
585
+ value = JSON.parse(raw);
586
+ } catch (error) {
587
+ throw new ToolError("Katana returned malformed X-Pagination JSON", {
588
+ code: "upstream",
589
+ cause: error
590
+ });
591
+ }
592
+ const parsed = katanaPaginationSchema.safeParse(value);
593
+ if (!parsed.success) throw new ToolError("Katana returned invalid X-Pagination metadata", {
594
+ code: "upstream",
595
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
596
+ });
597
+ return parsed.data;
598
+ }
599
+ function parseKatanaRateLimitHeaders(headers) {
600
+ const limit = headers.get("x-ratelimit-limit");
601
+ const remaining = headers.get("x-ratelimit-remaining");
602
+ const resetAtMs = headers.get("x-ratelimit-reset");
603
+ if (limit === null && remaining === null && resetAtMs === null) return void 0;
604
+ if (limit === null || remaining === null || resetAtMs === null) throw new ToolError("Katana returned incomplete rate-limit metadata", { code: "upstream" });
605
+ const parsed = katanaRateLimitHeadersSchema.safeParse({
606
+ limit,
607
+ remaining,
608
+ reset_at_ms: resetAtMs
609
+ });
610
+ if (!parsed.success) throw new ToolError("Katana returned invalid rate-limit metadata", { code: "upstream" });
611
+ return katanaRateLimitSchema.parse(parsed.data);
612
+ }
613
+ function parseKatanaPage(data, headers, itemSchema, label) {
614
+ const parsedItems = z.array(itemSchema).safeParse(data);
615
+ if (!parsedItems.success) throw new ToolError(`Katana returned an invalid ${label} array`, {
616
+ code: "upstream",
617
+ details: { issues: parsedItems.error.issues.map((issue) => issue.message) }
618
+ });
619
+ const rateLimit = parseKatanaRateLimitHeaders(headers);
620
+ return {
621
+ items: parsedItems.data,
622
+ pagination: parseKatanaPaginationHeader(headers),
623
+ ...rateLimit && { rate_limit: rateLimit }
624
+ };
625
+ }
410
626
  function pageFromCursor(cursor) {
411
627
  if (!cursor) return 1;
412
628
  const n = Number.parseInt(cursor, 10);
@@ -416,17 +632,6 @@ function pageFromCursor(cursor) {
416
632
  });
417
633
  return n;
418
634
  }
419
- function listPageMeta(page, limit, itemCount, totalPages) {
420
- if (typeof totalPages === "number" && totalPages > page) return {
421
- next_cursor: String(page + 1),
422
- truncated: true
423
- };
424
- if (itemCount >= limit && totalPages === void 0) return {
425
- next_cursor: String(page + 1),
426
- truncated: true
427
- };
428
- return { truncated: false };
429
- }
430
635
  function optionalString(value) {
431
636
  return isString(value) ? value : void 0;
432
637
  }
@@ -441,24 +646,14 @@ function optionalBoolean(value) {
441
646
  return typeof value === "boolean" ? value : void 0;
442
647
  }
443
648
  function unwrapResource(data) {
444
- if (isPlainObject(data) && "data" in data) return data["data"];
649
+ const parsed = z.looseObject({ data: z.unknown().optional() }).safeParse(data);
650
+ if (parsed.success && "data" in parsed.data) return parsed.data.data;
445
651
  return data;
446
652
  }
447
- function parseListEnvelope(data, parseItem, label) {
448
- if (Array.isArray(data)) return { items: data.map(parseItem) };
449
- if (!isPlainObject(data)) throw new ToolError(`Katana returned an unexpected ${label} payload`, { code: "upstream" });
450
- const rows = data["data"];
451
- if (!Array.isArray(rows)) throw new ToolError(`Katana ${label} missing data array`, { code: "upstream" });
452
- const pagination = data["pagination"];
453
- let totalPages;
454
- if (isPlainObject(pagination) && typeof pagination["total_pages"] === "number") totalPages = pagination["total_pages"];
455
- return {
456
- items: rows.map(parseItem),
457
- ...totalPages !== void 0 && { totalPages }
458
- };
459
- }
460
- function parseSalesOrder(value) {
461
- if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid sales order", { code: "upstream" });
653
+ function parseSalesOrder(input) {
654
+ const parsed = katanaRawRecordSchema.safeParse(input);
655
+ if (!parsed.success) throw new ToolError("Katana returned an invalid sales order", { code: "upstream" });
656
+ const value = parsed.data;
462
657
  const total = optionalNumber(value["total"] ?? value["total_price"]);
463
658
  const orderNo = optionalString(value["order_no"]);
464
659
  const status = optionalString(value["status"]);
@@ -490,11 +685,6 @@ function parseSalesOrder(value) {
490
685
  * Spike (Katana docs): `created_at_min` / `created_at_max` only — no `order_created_date` list filter.
491
686
  * `order_created_*` scopes are applied client-side after list (see matchOrderCreatedDateScope).
492
687
  */
493
- function salesOrderListDateQuery(scope) {
494
- const out = {};
495
- if (scope.created_from) out["created_at_min"] = scope.created_from;
496
- return out;
497
- }
498
688
  /** Client-side filter for order_created_date when the list endpoint cannot express it. */
499
689
  function matchOrderCreatedDateScope(orderCreatedDate, scope) {
500
690
  if (!scope.order_created_from && !scope.order_created_to) return true;
@@ -523,8 +713,10 @@ function moneyToSafeCents(amount) {
523
713
  function lineTaxExclusiveTotalCents(quantity, pricePerUnit, totalDiscount) {
524
714
  return moneyToSafeCents(quantity * pricePerUnit - totalDiscount);
525
715
  }
526
- function parseSalesOrderRow(value) {
527
- if (!isPlainObject(value)) throw new ToolError("Katana returned an invalid sales order row", { code: "upstream" });
716
+ function parseSalesOrderRow(input) {
717
+ const parsed = z.looseObject({}).safeParse(input);
718
+ if (!parsed.success) throw new ToolError("Katana returned an invalid sales order row", { code: "upstream" });
719
+ const value = parsed.data;
528
720
  const salesOrderId = optionalNumber(value["sales_order_id"]);
529
721
  const quantity = optionalNumber(value["quantity"]);
530
722
  if (salesOrderId === void 0 || quantity === void 0) throw new ToolError("Katana sales order row missing sales_order_id or quantity", { code: "upstream" });
@@ -534,9 +726,10 @@ function parseSalesOrderRow(value) {
534
726
  const variant = value["variant"];
535
727
  let sku = optionalString(value["sku"]);
536
728
  let unitCost;
537
- if (isPlainObject(variant)) {
538
- sku = sku ?? optionalString(variant["sku"]);
539
- unitCost = optionalNumber(variant["purchase_price"]) ?? optionalNumber(variant["average_cost"]) ?? optionalNumber(variant["cost_per_unit"]);
729
+ const parsedVariant = z.looseObject({}).safeParse(variant);
730
+ if (parsedVariant.success) {
731
+ sku = sku ?? optionalString(parsedVariant.data["sku"]);
732
+ unitCost = optionalNumber(parsedVariant.data["purchase_price"]) ?? optionalNumber(parsedVariant.data["average_cost"]) ?? optionalNumber(parsedVariant.data["cost_per_unit"]);
540
733
  }
541
734
  return {
542
735
  sales_order_id: salesOrderId,
@@ -570,11 +763,13 @@ function normalizeSalesOrderHeader(order, customerName, rows) {
570
763
  }
571
764
  /** Parse optional created_at onto a sales order (used by composite enrichment). */
572
765
  function parseSalesOrderCreatedAt(value) {
573
- if (!isPlainObject(value)) return void 0;
574
- return optionalString(value["created_at"]);
766
+ const parsed = z.looseObject({ created_at: z.string().optional() }).safeParse(value);
767
+ return parsed.success ? parsed.data.created_at : void 0;
575
768
  }
576
- function parseProduct(value) {
577
- if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid product", { code: "upstream" });
769
+ function parseProduct(input) {
770
+ const parsed = katanaRawRecordSchema.safeParse(input);
771
+ if (!parsed.success) throw new ToolError("Katana returned an invalid product", { code: "upstream" });
772
+ const value = parsed.data;
578
773
  const name = optionalString(value["name"]);
579
774
  const uom = optionalString(value["uom"]);
580
775
  const categoryName = optionalString(value["category_name"]);
@@ -597,8 +792,10 @@ function parseProduct(value) {
597
792
  ...additionalInfo !== void 0 && { additional_info: additionalInfo }
598
793
  };
599
794
  }
600
- function parseMaterial(value) {
601
- if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid material", { code: "upstream" });
795
+ function parseMaterial(input) {
796
+ const parsed = katanaRawRecordSchema.safeParse(input);
797
+ if (!parsed.success) throw new ToolError("Katana returned an invalid material", { code: "upstream" });
798
+ const value = parsed.data;
602
799
  const name = optionalString(value["name"]);
603
800
  const uom = optionalString(value["uom"]);
604
801
  const categoryName = optionalString(value["category_name"]);
@@ -617,8 +814,10 @@ function parseMaterial(value) {
617
814
  ...additionalInfo !== void 0 && { additional_info: additionalInfo }
618
815
  };
619
816
  }
620
- function parseCustomer(value) {
621
- if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid customer", { code: "upstream" });
817
+ function parseCustomer(input) {
818
+ const parsed = katanaRawRecordSchema.safeParse(input);
819
+ if (!parsed.success) throw new ToolError("Katana returned an invalid customer", { code: "upstream" });
820
+ const value = parsed.data;
622
821
  const name = optionalString(value["name"]);
623
822
  const firstName = optionalString(value["first_name"]);
624
823
  const lastName = optionalString(value["last_name"]);
@@ -643,8 +842,10 @@ function parseCustomer(value) {
643
842
  ...category !== void 0 && { category }
644
843
  };
645
844
  }
646
- function parseSupplier(value) {
647
- if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid supplier", { code: "upstream" });
845
+ function parseSupplier(input) {
846
+ const parsed = katanaRawRecordSchema.safeParse(input);
847
+ if (!parsed.success) throw new ToolError("Katana returned an invalid supplier", { code: "upstream" });
848
+ const value = parsed.data;
648
849
  const name = optionalString(value["name"]);
649
850
  const email = optionalString(value["email"]);
650
851
  const phone = optionalString(value["phone"]);
@@ -659,8 +860,10 @@ function parseSupplier(value) {
659
860
  ...comment !== void 0 && { comment }
660
861
  };
661
862
  }
662
- function parsePurchaseOrder(value) {
663
- if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid purchase order", { code: "upstream" });
863
+ function parsePurchaseOrder(input) {
864
+ const parsed = katanaRawRecordSchema.safeParse(input);
865
+ if (!parsed.success) throw new ToolError("Katana returned an invalid purchase order", { code: "upstream" });
866
+ const value = parsed.data;
664
867
  const orderNo = optionalString(value["order_no"]);
665
868
  const status = optionalString(value["status"]);
666
869
  const supplierId = optionalNumber(value["supplier_id"]);
@@ -685,8 +888,10 @@ function parsePurchaseOrder(value) {
685
888
  ...additionalInfo !== void 0 && { additional_info: additionalInfo }
686
889
  };
687
890
  }
688
- function parseManufacturingOrder(value) {
689
- if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid manufacturing order", { code: "upstream" });
891
+ function parseManufacturingOrder(input) {
892
+ const parsed = katanaRawRecordSchema.safeParse(input);
893
+ if (!parsed.success) throw new ToolError("Katana returned an invalid manufacturing order", { code: "upstream" });
894
+ const value = parsed.data;
690
895
  const orderNo = optionalString(value["order_no"]);
691
896
  const status = optionalString(value["status"]);
692
897
  const variantId = optionalNumber(value["variant_id"]);
@@ -713,8 +918,10 @@ function parseManufacturingOrder(value) {
713
918
  ...salesOrderId !== void 0 && { sales_order_id: salesOrderId }
714
919
  };
715
920
  }
716
- function parseInventory(value) {
717
- if (!isPlainObject(value) || typeof value["variant_id"] !== "number" || typeof value["location_id"] !== "number") throw new ToolError("Katana returned an invalid inventory row", { code: "upstream" });
921
+ function parseInventory(input) {
922
+ const parsed = katanaInventoryRawSchema.safeParse(input);
923
+ if (!parsed.success) throw new ToolError("Katana returned an invalid inventory row", { code: "upstream" });
924
+ const value = parsed.data;
718
925
  const quantityInStock = optionalNumber(value["quantity_in_stock"]);
719
926
  const quantityCommitted = optionalNumber(value["quantity_committed"]);
720
927
  const quantityExpected = optionalNumber(value["quantity_expected"]);
@@ -928,26 +1135,45 @@ var KatanaClient = class KatanaClient {
928
1135
  /** GET /sales_orders */
929
1136
  async listSalesOrders(input = {}) {
930
1137
  const page = pageFromCursor(input.cursor);
931
- const limit = input.limit ?? 50;
932
- const { data } = await this.#http.get("/sales_orders", {
933
- label: "Katana listSalesOrders",
934
- query: {
935
- page,
936
- limit,
937
- ...input.status && { status: input.status },
938
- ...input.customer_id !== void 0 && { customer_id: input.customer_id },
939
- ...input.order_no && { order_no: input.order_no },
940
- ...input.location_id !== void 0 && { location_id: input.location_id }
941
- }
1138
+ const result = await this.listSalesOrdersPage({
1139
+ page,
1140
+ ...input.limit !== void 0 && { limit: input.limit },
1141
+ ...input.status && { status: input.status },
1142
+ ...input.customer_id !== void 0 && { customer_id: input.customer_id },
1143
+ ...input.order_no && { order_no: input.order_no },
1144
+ ...input.location_id !== void 0 && { location_id: input.location_id }
942
1145
  });
943
- const parsed = parseListEnvelope(data, parseSalesOrder, "sales orders");
944
- const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
945
1146
  return {
946
- items: parsed.items,
947
- truncated: pageMeta.truncated,
948
- ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1147
+ items: result.items.map(parseSalesOrder),
1148
+ truncated: !result.pagination.last_page,
1149
+ ...!result.pagination.last_page && { next_cursor: String(result.pagination.page + 1) }
949
1150
  };
950
1151
  }
1152
+ /** One GET /sales_orders request with raw records and response metadata. */
1153
+ async listSalesOrdersPage(input = {}) {
1154
+ const parsedInput = katanaListSalesOrdersPageInputSchema.safeParse(input);
1155
+ if (!parsedInput.success) throw new ToolError("Invalid Katana sales orders page input", {
1156
+ code: "bad_input",
1157
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1158
+ });
1159
+ const result = await this.#http.get("/sales_orders", {
1160
+ label: "Katana listSalesOrdersPage",
1161
+ query: {
1162
+ page: parsedInput.data.page ?? 1,
1163
+ limit: parsedInput.data.limit ?? 50,
1164
+ ...parsedInput.data.status && { status: parsedInput.data.status },
1165
+ ...parsedInput.data.customer_id !== void 0 && { customer_id: parsedInput.data.customer_id },
1166
+ ...parsedInput.data.order_no && { order_no: parsedInput.data.order_no },
1167
+ ...parsedInput.data.location_id !== void 0 && { location_id: parsedInput.data.location_id },
1168
+ ...parsedInput.data.created_at_min && { created_at_min: parsedInput.data.created_at_min },
1169
+ ...parsedInput.data.created_at_max && { created_at_max: parsedInput.data.created_at_max },
1170
+ ...parsedInput.data.updated_at_min && { updated_at_min: parsedInput.data.updated_at_min },
1171
+ ...parsedInput.data.updated_at_max && { updated_at_max: parsedInput.data.updated_at_max },
1172
+ ...parsedInput.data.include_deleted !== void 0 && { include_deleted: parsedInput.data.include_deleted }
1173
+ }
1174
+ });
1175
+ return parseKatanaPage(result.data, result.headers, katanaSalesOrderRawSchema, "sales orders");
1176
+ }
951
1177
  /** GET /sales_orders/{id} */
952
1178
  async getSalesOrder(input) {
953
1179
  const { data } = await this.#http.get(`/sales_orders/${input.sales_order_id}`, { label: "Katana getSalesOrder" });
@@ -986,35 +1212,30 @@ var KatanaClient = class KatanaClient {
986
1212
  const byId = /* @__PURE__ */ new Map();
987
1213
  for (const scope of input.scopes) {
988
1214
  const statuses = scope.statuses && scope.statuses.length > 0 ? scope.statuses : [void 0];
989
- const dateQuery = salesOrderListDateQuery(scope);
990
1215
  for (const status of statuses) {
991
1216
  let cursor;
992
1217
  for (let page = 0; page < maxPages; page += 1) {
993
1218
  const pageNum = pageFromCursor(cursor);
994
- const { data } = await this.#http.get("/sales_orders", {
995
- label: "Katana querySalesOrders list",
996
- query: {
997
- page: pageNum,
998
- limit: pageSize,
999
- ...status && { status },
1000
- ...scope.customer_id !== void 0 && { customer_id: scope.customer_id },
1001
- ...scope.location_id !== void 0 && { location_id: scope.location_id },
1002
- ...dateQuery
1003
- }
1219
+ const result = await this.listSalesOrdersPage({
1220
+ page: pageNum,
1221
+ limit: pageSize,
1222
+ ...status && { status },
1223
+ ...scope.customer_id !== void 0 && { customer_id: scope.customer_id },
1224
+ ...scope.location_id !== void 0 && { location_id: scope.location_id },
1225
+ ...scope.created_from && { created_at_min: scope.created_from }
1004
1226
  });
1005
- const parsed = parseListEnvelope(data, parseSalesOrder, "sales orders");
1006
- for (const order of parsed.items) {
1227
+ for (const raw of result.items) {
1228
+ const order = parseSalesOrder(raw);
1007
1229
  if (byId.has(order.id)) continue;
1008
1230
  if (!matchOrderCreatedDateScope(order.order_created_date, scope)) continue;
1009
- const rawCreated = parseSalesOrderCreatedAt((isPlainObject(data) && Array.isArray(data["data"]) ? data["data"] : Array.isArray(data) ? data : []).find((r) => isPlainObject(r) && r["id"] === order.id)) ?? order.created_at;
1231
+ const rawCreated = parseSalesOrderCreatedAt(raw) ?? order.created_at;
1010
1232
  byId.set(order.id, {
1011
1233
  ...order,
1012
1234
  ...rawCreated && { created_at: rawCreated }
1013
1235
  });
1014
1236
  }
1015
- const pageMeta = listPageMeta(pageNum, pageSize, parsed.items.length, parsed.totalPages);
1016
- if (!pageMeta.next_cursor) break;
1017
- cursor = pageMeta.next_cursor;
1237
+ if (result.pagination.last_page) break;
1238
+ cursor = String(result.pagination.page + 1);
1018
1239
  }
1019
1240
  }
1020
1241
  }
@@ -1060,46 +1281,65 @@ var KatanaClient = class KatanaClient {
1060
1281
  let cursor;
1061
1282
  for (let page = 0; page < 100; page += 1) {
1062
1283
  const pageNum = pageFromCursor(cursor);
1063
- const { data } = await this.#http.get("/sales_order_rows", {
1284
+ const result = await this.#http.get("/sales_order_rows", {
1064
1285
  label: "Katana listSalesOrderRows",
1065
1286
  query: {
1066
1287
  page: pageNum,
1067
1288
  limit: pageSize,
1068
- sales_order_ids: salesOrderIds.join(","),
1069
- extend: "variant"
1289
+ sales_order_ids: salesOrderIds,
1290
+ extend: ["variant"]
1070
1291
  }
1071
1292
  });
1072
- const parsed = parseListEnvelope(data, parseSalesOrderRow, "sales order rows");
1073
- out.push(...parsed.items);
1074
- const pageMeta = listPageMeta(pageNum, pageSize, parsed.items.length, parsed.totalPages);
1075
- if (!pageMeta.next_cursor) break;
1076
- cursor = pageMeta.next_cursor;
1293
+ const parsed = parseKatanaPage(result.data, result.headers, katanaRawRecordSchema, "sales order rows");
1294
+ out.push(...parsed.items.map(parseSalesOrderRow));
1295
+ if (parsed.pagination.last_page) break;
1296
+ cursor = String(parsed.pagination.page + 1);
1077
1297
  }
1078
1298
  return out;
1079
1299
  }
1080
1300
  /** GET /products */
1081
1301
  async listProducts(input = {}) {
1082
1302
  const page = pageFromCursor(input.cursor);
1083
- const limit = input.limit ?? 50;
1084
- const { data } = await this.#http.get("/products", {
1085
- label: "Katana listProducts",
1086
- query: {
1087
- page,
1088
- limit,
1089
- ...input.name && { name: input.name },
1090
- ...input.is_sellable !== void 0 && { is_sellable: input.is_sellable },
1091
- ...input.is_producible !== void 0 && { is_producible: input.is_producible },
1092
- ...input.is_purchasable !== void 0 && { is_purchasable: input.is_purchasable }
1093
- }
1303
+ const result = await this.listProductsPage({
1304
+ page,
1305
+ ...input.limit !== void 0 && { limit: input.limit },
1306
+ ...input.name && { name: input.name },
1307
+ ...input.is_sellable !== void 0 && { is_sellable: input.is_sellable },
1308
+ ...input.is_producible !== void 0 && { is_producible: input.is_producible },
1309
+ ...input.is_purchasable !== void 0 && { is_purchasable: input.is_purchasable }
1094
1310
  });
1095
- const parsed = parseListEnvelope(data, parseProduct, "products");
1096
- const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1097
1311
  return {
1098
- items: parsed.items,
1099
- truncated: pageMeta.truncated,
1100
- ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1312
+ items: result.items.map(parseProduct),
1313
+ truncated: !result.pagination.last_page,
1314
+ ...!result.pagination.last_page && { next_cursor: String(result.pagination.page + 1) }
1101
1315
  };
1102
1316
  }
1317
+ /** One GET /products request with raw records and response metadata. */
1318
+ async listProductsPage(input = {}) {
1319
+ const parsedInput = katanaListProductsPageInputSchema.safeParse(input);
1320
+ if (!parsedInput.success) throw new ToolError("Invalid Katana products page input", {
1321
+ code: "bad_input",
1322
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1323
+ });
1324
+ const result = await this.#http.get("/products", {
1325
+ label: "Katana listProductsPage",
1326
+ query: {
1327
+ page: parsedInput.data.page ?? 1,
1328
+ limit: parsedInput.data.limit ?? 50,
1329
+ ...parsedInput.data.name && { name: parsedInput.data.name },
1330
+ ...parsedInput.data.is_sellable !== void 0 && { is_sellable: parsedInput.data.is_sellable },
1331
+ ...parsedInput.data.is_producible !== void 0 && { is_producible: parsedInput.data.is_producible },
1332
+ ...parsedInput.data.is_purchasable !== void 0 && { is_purchasable: parsedInput.data.is_purchasable },
1333
+ ...parsedInput.data.created_at_min && { created_at_min: parsedInput.data.created_at_min },
1334
+ ...parsedInput.data.created_at_max && { created_at_max: parsedInput.data.created_at_max },
1335
+ ...parsedInput.data.updated_at_min && { updated_at_min: parsedInput.data.updated_at_min },
1336
+ ...parsedInput.data.updated_at_max && { updated_at_max: parsedInput.data.updated_at_max },
1337
+ ...parsedInput.data.include_deleted !== void 0 && { include_deleted: parsedInput.data.include_deleted },
1338
+ ...parsedInput.data.include_archived !== void 0 && { include_archived: parsedInput.data.include_archived }
1339
+ }
1340
+ });
1341
+ return parseKatanaPage(result.data, result.headers, katanaProductRawSchema, "products");
1342
+ }
1103
1343
  /** GET /products/{id} */
1104
1344
  async getProduct(input) {
1105
1345
  const { data } = await this.#http.get(`/products/${input.product_id}`, { label: "Katana getProduct" });
@@ -1119,23 +1359,40 @@ var KatanaClient = class KatanaClient {
1119
1359
  /** GET /materials */
1120
1360
  async listMaterials(input = {}) {
1121
1361
  const page = pageFromCursor(input.cursor);
1122
- const limit = input.limit ?? 50;
1123
- const { data } = await this.#http.get("/materials", {
1124
- label: "Katana listMaterials",
1125
- query: {
1126
- page,
1127
- limit,
1128
- ...input.name && { name: input.name }
1129
- }
1362
+ const result = await this.listMaterialsPage({
1363
+ page,
1364
+ ...input.limit !== void 0 && { limit: input.limit },
1365
+ ...input.name && { name: input.name }
1130
1366
  });
1131
- const parsed = parseListEnvelope(data, parseMaterial, "materials");
1132
- const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1133
1367
  return {
1134
- items: parsed.items,
1135
- truncated: pageMeta.truncated,
1136
- ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1368
+ items: result.items.map(parseMaterial),
1369
+ truncated: !result.pagination.last_page,
1370
+ ...!result.pagination.last_page && { next_cursor: String(result.pagination.page + 1) }
1137
1371
  };
1138
1372
  }
1373
+ /** One GET /materials request with raw records and response metadata. */
1374
+ async listMaterialsPage(input = {}) {
1375
+ const parsedInput = katanaListMaterialsPageInputSchema.safeParse(input);
1376
+ if (!parsedInput.success) throw new ToolError("Invalid Katana materials page input", {
1377
+ code: "bad_input",
1378
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1379
+ });
1380
+ const result = await this.#http.get("/materials", {
1381
+ label: "Katana listMaterialsPage",
1382
+ query: {
1383
+ page: parsedInput.data.page ?? 1,
1384
+ limit: parsedInput.data.limit ?? 50,
1385
+ ...parsedInput.data.name && { name: parsedInput.data.name },
1386
+ ...parsedInput.data.created_at_min && { created_at_min: parsedInput.data.created_at_min },
1387
+ ...parsedInput.data.created_at_max && { created_at_max: parsedInput.data.created_at_max },
1388
+ ...parsedInput.data.updated_at_min && { updated_at_min: parsedInput.data.updated_at_min },
1389
+ ...parsedInput.data.updated_at_max && { updated_at_max: parsedInput.data.updated_at_max },
1390
+ ...parsedInput.data.include_deleted !== void 0 && { include_deleted: parsedInput.data.include_deleted },
1391
+ ...parsedInput.data.include_archived !== void 0 && { include_archived: parsedInput.data.include_archived }
1392
+ }
1393
+ });
1394
+ return parseKatanaPage(result.data, result.headers, katanaMaterialRawSchema, "materials");
1395
+ }
1139
1396
  /** GET /materials/{id} */
1140
1397
  async getMaterial(input) {
1141
1398
  const { data } = await this.#http.get(`/materials/${input.material_id}`, { label: "Katana getMaterial" });
@@ -1144,24 +1401,41 @@ var KatanaClient = class KatanaClient {
1144
1401
  /** GET /customers */
1145
1402
  async listCustomers(input = {}) {
1146
1403
  const page = pageFromCursor(input.cursor);
1147
- const limit = input.limit ?? 50;
1148
- const { data } = await this.#http.get("/customers", {
1149
- label: "Katana listCustomers",
1150
- query: {
1151
- page,
1152
- limit,
1153
- ...input.name && { name: input.name },
1154
- ...input.email && { email: input.email }
1155
- }
1404
+ const result = await this.listCustomersPage({
1405
+ page,
1406
+ ...input.limit !== void 0 && { limit: input.limit },
1407
+ ...input.name && { name: input.name },
1408
+ ...input.email && { email: input.email }
1156
1409
  });
1157
- const parsed = parseListEnvelope(data, parseCustomer, "customers");
1158
- const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1159
1410
  return {
1160
- items: parsed.items,
1161
- truncated: pageMeta.truncated,
1162
- ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1411
+ items: result.items.map(parseCustomer),
1412
+ truncated: !result.pagination.last_page,
1413
+ ...!result.pagination.last_page && { next_cursor: String(result.pagination.page + 1) }
1163
1414
  };
1164
1415
  }
1416
+ /** One GET /customers request with raw records and response metadata. */
1417
+ async listCustomersPage(input = {}) {
1418
+ const parsedInput = katanaListCustomersPageInputSchema.safeParse(input);
1419
+ if (!parsedInput.success) throw new ToolError("Invalid Katana customers page input", {
1420
+ code: "bad_input",
1421
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1422
+ });
1423
+ const result = await this.#http.get("/customers", {
1424
+ label: "Katana listCustomersPage",
1425
+ query: {
1426
+ page: parsedInput.data.page ?? 1,
1427
+ limit: parsedInput.data.limit ?? 50,
1428
+ ...parsedInput.data.name && { name: parsedInput.data.name },
1429
+ ...parsedInput.data.email && { email: parsedInput.data.email },
1430
+ ...parsedInput.data.created_at_min && { created_at_min: parsedInput.data.created_at_min },
1431
+ ...parsedInput.data.created_at_max && { created_at_max: parsedInput.data.created_at_max },
1432
+ ...parsedInput.data.updated_at_min && { updated_at_min: parsedInput.data.updated_at_min },
1433
+ ...parsedInput.data.updated_at_max && { updated_at_max: parsedInput.data.updated_at_max },
1434
+ ...parsedInput.data.include_deleted !== void 0 && { include_deleted: parsedInput.data.include_deleted }
1435
+ }
1436
+ });
1437
+ return parseKatanaPage(result.data, result.headers, katanaCustomerRawSchema, "customers");
1438
+ }
1165
1439
  /** GET /customers/{id} */
1166
1440
  async getCustomer(input) {
1167
1441
  const { data } = await this.#http.get(`/customers/${input.customer_id}`, { label: "Katana getCustomer" });
@@ -1181,23 +1455,39 @@ var KatanaClient = class KatanaClient {
1181
1455
  /** GET /suppliers */
1182
1456
  async listSuppliers(input = {}) {
1183
1457
  const page = pageFromCursor(input.cursor);
1184
- const limit = input.limit ?? 50;
1185
- const { data } = await this.#http.get("/suppliers", {
1186
- label: "Katana listSuppliers",
1187
- query: {
1188
- page,
1189
- limit,
1190
- ...input.name && { name: input.name }
1191
- }
1458
+ const result = await this.listSuppliersPage({
1459
+ page,
1460
+ ...input.limit !== void 0 && { limit: input.limit },
1461
+ ...input.name && { name: input.name }
1192
1462
  });
1193
- const parsed = parseListEnvelope(data, parseSupplier, "suppliers");
1194
- const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1195
1463
  return {
1196
- items: parsed.items,
1197
- truncated: pageMeta.truncated,
1198
- ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1464
+ items: result.items.map(parseSupplier),
1465
+ truncated: !result.pagination.last_page,
1466
+ ...!result.pagination.last_page && { next_cursor: String(result.pagination.page + 1) }
1199
1467
  };
1200
1468
  }
1469
+ /** One GET /suppliers request with raw records and response metadata. */
1470
+ async listSuppliersPage(input = {}) {
1471
+ const parsedInput = katanaListSuppliersPageInputSchema.safeParse(input);
1472
+ if (!parsedInput.success) throw new ToolError("Invalid Katana suppliers page input", {
1473
+ code: "bad_input",
1474
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1475
+ });
1476
+ const result = await this.#http.get("/suppliers", {
1477
+ label: "Katana listSuppliersPage",
1478
+ query: {
1479
+ page: parsedInput.data.page ?? 1,
1480
+ limit: parsedInput.data.limit ?? 50,
1481
+ ...parsedInput.data.name && { name: parsedInput.data.name },
1482
+ ...parsedInput.data.created_at_min && { created_at_min: parsedInput.data.created_at_min },
1483
+ ...parsedInput.data.created_at_max && { created_at_max: parsedInput.data.created_at_max },
1484
+ ...parsedInput.data.updated_at_min && { updated_at_min: parsedInput.data.updated_at_min },
1485
+ ...parsedInput.data.updated_at_max && { updated_at_max: parsedInput.data.updated_at_max },
1486
+ ...parsedInput.data.include_deleted !== void 0 && { include_deleted: parsedInput.data.include_deleted }
1487
+ }
1488
+ });
1489
+ return parseKatanaPage(result.data, result.headers, katanaSupplierRawSchema, "suppliers");
1490
+ }
1201
1491
  /** GET /suppliers/{id} */
1202
1492
  async getSupplier(input) {
1203
1493
  const { data } = await this.#http.get(`/suppliers/${input.supplier_id}`, { label: "Katana getSupplier" });
@@ -1211,26 +1501,45 @@ var KatanaClient = class KatanaClient {
1211
1501
  /** GET /purchase_orders */
1212
1502
  async listPurchaseOrders(input = {}) {
1213
1503
  const page = pageFromCursor(input.cursor);
1214
- const limit = input.limit ?? 50;
1215
- const { data } = await this.#http.get("/purchase_orders", {
1216
- label: "Katana listPurchaseOrders",
1217
- query: {
1218
- page,
1219
- limit,
1220
- ...input.status && { status: input.status },
1221
- ...input.supplier_id !== void 0 && { supplier_id: input.supplier_id },
1222
- ...input.order_no && { order_no: input.order_no },
1223
- ...input.location_id !== void 0 && { location_id: input.location_id }
1224
- }
1504
+ const result = await this.listPurchaseOrdersPage({
1505
+ page,
1506
+ ...input.limit !== void 0 && { limit: input.limit },
1507
+ ...input.status && { status: input.status },
1508
+ ...input.supplier_id !== void 0 && { supplier_id: input.supplier_id },
1509
+ ...input.order_no && { order_no: input.order_no },
1510
+ ...input.location_id !== void 0 && { location_id: input.location_id }
1225
1511
  });
1226
- const parsed = parseListEnvelope(data, parsePurchaseOrder, "purchase orders");
1227
- const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1228
1512
  return {
1229
- items: parsed.items,
1230
- truncated: pageMeta.truncated,
1231
- ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1513
+ items: result.items.map(parsePurchaseOrder),
1514
+ truncated: !result.pagination.last_page,
1515
+ ...!result.pagination.last_page && { next_cursor: String(result.pagination.page + 1) }
1232
1516
  };
1233
1517
  }
1518
+ /** One GET /purchase_orders request with raw records and response metadata. */
1519
+ async listPurchaseOrdersPage(input = {}) {
1520
+ const parsedInput = katanaListPurchaseOrdersPageInputSchema.safeParse(input);
1521
+ if (!parsedInput.success) throw new ToolError("Invalid Katana purchase orders page input", {
1522
+ code: "bad_input",
1523
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1524
+ });
1525
+ const result = await this.#http.get("/purchase_orders", {
1526
+ label: "Katana listPurchaseOrdersPage",
1527
+ query: {
1528
+ page: parsedInput.data.page ?? 1,
1529
+ limit: parsedInput.data.limit ?? 50,
1530
+ ...parsedInput.data.status && { status: parsedInput.data.status },
1531
+ ...parsedInput.data.supplier_id !== void 0 && { supplier_id: parsedInput.data.supplier_id },
1532
+ ...parsedInput.data.order_no && { order_no: parsedInput.data.order_no },
1533
+ ...parsedInput.data.location_id !== void 0 && { location_id: parsedInput.data.location_id },
1534
+ ...parsedInput.data.created_at_min && { created_at_min: parsedInput.data.created_at_min },
1535
+ ...parsedInput.data.created_at_max && { created_at_max: parsedInput.data.created_at_max },
1536
+ ...parsedInput.data.updated_at_min && { updated_at_min: parsedInput.data.updated_at_min },
1537
+ ...parsedInput.data.updated_at_max && { updated_at_max: parsedInput.data.updated_at_max },
1538
+ ...parsedInput.data.include_deleted !== void 0 && { include_deleted: parsedInput.data.include_deleted }
1539
+ }
1540
+ });
1541
+ return parseKatanaPage(result.data, result.headers, katanaPurchaseOrderRawSchema, "purchase orders");
1542
+ }
1234
1543
  /** GET /purchase_orders/{id} */
1235
1544
  async getPurchaseOrder(input) {
1236
1545
  const { data } = await this.#http.get(`/purchase_orders/${input.purchase_order_id}`, { label: "Katana getPurchaseOrder" });
@@ -1250,26 +1559,45 @@ var KatanaClient = class KatanaClient {
1250
1559
  /** GET /manufacturing_orders */
1251
1560
  async listManufacturingOrders(input = {}) {
1252
1561
  const page = pageFromCursor(input.cursor);
1253
- const limit = input.limit ?? 50;
1254
- const { data } = await this.#http.get("/manufacturing_orders", {
1255
- label: "Katana listManufacturingOrders",
1256
- query: {
1257
- page,
1258
- limit,
1259
- ...input.status && { status: input.status },
1260
- ...input.variant_id !== void 0 && { variant_id: input.variant_id },
1261
- ...input.location_id !== void 0 && { location_id: input.location_id },
1262
- ...input.order_no && { order_no: input.order_no }
1263
- }
1562
+ const result = await this.listManufacturingOrdersPage({
1563
+ page,
1564
+ ...input.limit !== void 0 && { limit: input.limit },
1565
+ ...input.status && { status: input.status },
1566
+ ...input.variant_id !== void 0 && { variant_id: input.variant_id },
1567
+ ...input.location_id !== void 0 && { location_id: input.location_id },
1568
+ ...input.order_no && { order_no: input.order_no }
1264
1569
  });
1265
- const parsed = parseListEnvelope(data, parseManufacturingOrder, "manufacturing orders");
1266
- const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1267
1570
  return {
1268
- items: parsed.items,
1269
- truncated: pageMeta.truncated,
1270
- ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1571
+ items: result.items.map(parseManufacturingOrder),
1572
+ truncated: !result.pagination.last_page,
1573
+ ...!result.pagination.last_page && { next_cursor: String(result.pagination.page + 1) }
1271
1574
  };
1272
1575
  }
1576
+ /** One GET /manufacturing_orders request with raw records and response metadata. */
1577
+ async listManufacturingOrdersPage(input = {}) {
1578
+ const parsedInput = katanaListManufacturingOrdersPageInputSchema.safeParse(input);
1579
+ if (!parsedInput.success) throw new ToolError("Invalid Katana manufacturing orders page input", {
1580
+ code: "bad_input",
1581
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1582
+ });
1583
+ const result = await this.#http.get("/manufacturing_orders", {
1584
+ label: "Katana listManufacturingOrdersPage",
1585
+ query: {
1586
+ page: parsedInput.data.page ?? 1,
1587
+ limit: parsedInput.data.limit ?? 50,
1588
+ ...parsedInput.data.status && { status: parsedInput.data.status },
1589
+ ...parsedInput.data.variant_id !== void 0 && { variant_id: parsedInput.data.variant_id },
1590
+ ...parsedInput.data.location_id !== void 0 && { location_id: parsedInput.data.location_id },
1591
+ ...parsedInput.data.order_no && { order_no: parsedInput.data.order_no },
1592
+ ...parsedInput.data.created_at_min && { created_at_min: parsedInput.data.created_at_min },
1593
+ ...parsedInput.data.created_at_max && { created_at_max: parsedInput.data.created_at_max },
1594
+ ...parsedInput.data.updated_at_min && { updated_at_min: parsedInput.data.updated_at_min },
1595
+ ...parsedInput.data.updated_at_max && { updated_at_max: parsedInput.data.updated_at_max },
1596
+ ...parsedInput.data.include_deleted !== void 0 && { include_deleted: parsedInput.data.include_deleted }
1597
+ }
1598
+ });
1599
+ return parseKatanaPage(result.data, result.headers, katanaManufacturingOrderRawSchema, "manufacturing orders");
1600
+ }
1273
1601
  /** GET /manufacturing_orders/{id} */
1274
1602
  async getManufacturingOrder(input) {
1275
1603
  const { data } = await this.#http.get(`/manufacturing_orders/${input.manufacturing_order_id}`, { label: "Katana getManufacturingOrder" });
@@ -1289,24 +1617,38 @@ var KatanaClient = class KatanaClient {
1289
1617
  /** GET /inventory */
1290
1618
  async listInventory(input = {}) {
1291
1619
  const page = pageFromCursor(input.cursor);
1292
- const limit = input.limit ?? 50;
1293
- const { data } = await this.#http.get("/inventory", {
1294
- label: "Katana listInventory",
1295
- query: {
1296
- page,
1297
- limit,
1298
- ...input.variant_id !== void 0 && { variant_id: input.variant_id },
1299
- ...input.location_id !== void 0 && { location_id: input.location_id }
1300
- }
1620
+ const result = await this.listInventoryPage({
1621
+ page,
1622
+ ...input.limit !== void 0 && { limit: input.limit },
1623
+ ...input.variant_id !== void 0 && { variant_id: [input.variant_id] },
1624
+ ...input.location_id !== void 0 && { location_id: input.location_id }
1301
1625
  });
1302
- const parsed = parseListEnvelope(data, parseInventory, "inventory");
1303
- const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1304
1626
  return {
1305
- items: parsed.items,
1306
- truncated: pageMeta.truncated,
1307
- ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1627
+ items: result.items.map(parseInventory),
1628
+ truncated: !result.pagination.last_page,
1629
+ ...!result.pagination.last_page && { next_cursor: String(result.pagination.page + 1) }
1308
1630
  };
1309
1631
  }
1632
+ /** One GET /inventory request with raw records and response metadata. */
1633
+ async listInventoryPage(input = {}) {
1634
+ const parsedInput = katanaListInventoryPageInputSchema.safeParse(input);
1635
+ if (!parsedInput.success) throw new ToolError("Invalid Katana inventory page input", {
1636
+ code: "bad_input",
1637
+ details: { issues: parsedInput.error.issues.map((issue) => issue.message) }
1638
+ });
1639
+ const result = await this.#http.get("/inventory", {
1640
+ label: "Katana listInventoryPage",
1641
+ query: {
1642
+ page: parsedInput.data.page ?? 1,
1643
+ limit: parsedInput.data.limit ?? 50,
1644
+ ...parsedInput.data.location_id !== void 0 && { location_id: parsedInput.data.location_id },
1645
+ ...parsedInput.data.variant_id && { variant_id: parsedInput.data.variant_id },
1646
+ ...parsedInput.data.include_archived !== void 0 && { include_archived: parsedInput.data.include_archived },
1647
+ ...parsedInput.data.extend && { extend: parsedInput.data.extend }
1648
+ }
1649
+ });
1650
+ return parseKatanaPage(result.data, result.headers, katanaInventoryRawSchema, "inventory");
1651
+ }
1310
1652
  };
1311
1653
  //#endregion
1312
1654
  //#region src/vendors/katana/module.ts
@@ -1634,6 +1976,6 @@ const katanaModule = defineModule({
1634
1976
  ]
1635
1977
  });
1636
1978
  //#endregion
1637
- export { KatanaClient, katanaAuthSchema, katanaCreateCustomerInputSchema, katanaCreateCustomerOutputSchema, katanaCreateCustomerTool, katanaCreateManufacturingOrderInputSchema, katanaCreateManufacturingOrderOutputSchema, katanaCreateManufacturingOrderTool, katanaCreateProductInputSchema, katanaCreateProductOutputSchema, katanaCreateProductTool, katanaCreatePurchaseOrderInputSchema, katanaCreatePurchaseOrderOutputSchema, katanaCreatePurchaseOrderTool, katanaCreateSalesOrderInputSchema, katanaCreateSalesOrderOutputSchema, katanaCreateSalesOrderTool, katanaCreateSupplierInputSchema, katanaCreateSupplierOutputSchema, katanaCreateSupplierTool, katanaCustomerSchema, katanaDeleteSalesOrderInputSchema, katanaDeleteSalesOrderOutputSchema, katanaDeleteSalesOrderTool, katanaGetCustomerInputSchema, katanaGetCustomerOutputSchema, katanaGetCustomerTool, katanaGetManufacturingOrderInputSchema, katanaGetManufacturingOrderOutputSchema, katanaGetManufacturingOrderTool, katanaGetMaterialInputSchema, katanaGetMaterialOutputSchema, katanaGetMaterialTool, katanaGetProductInputSchema, katanaGetProductOutputSchema, katanaGetProductTool, katanaGetPurchaseOrderInputSchema, katanaGetPurchaseOrderOutputSchema, katanaGetPurchaseOrderTool, katanaGetSalesOrderInputSchema, katanaGetSalesOrderOutputSchema, katanaGetSalesOrderTool, katanaGetSupplierInputSchema, katanaGetSupplierOutputSchema, katanaGetSupplierTool, katanaInventorySchema, katanaListCustomersInputSchema, katanaListCustomersOutputSchema, katanaListCustomersTool, katanaListInventoryInputSchema, katanaListInventoryOutputSchema, katanaListInventoryTool, katanaListManufacturingOrdersInputSchema, katanaListManufacturingOrdersOutputSchema, katanaListManufacturingOrdersTool, katanaListMaterialsInputSchema, katanaListMaterialsOutputSchema, katanaListMaterialsTool, katanaListProductsInputSchema, katanaListProductsOutputSchema, katanaListProductsTool, katanaListPurchaseOrdersInputSchema, katanaListPurchaseOrdersOutputSchema, katanaListPurchaseOrdersTool, katanaListSalesOrdersInputSchema, katanaListSalesOrdersOutputSchema, katanaListSalesOrdersTool, katanaListSuppliersInputSchema, katanaListSuppliersOutputSchema, katanaListSuppliersTool, katanaManufacturingOrderSchema, katanaMaterialSchema, katanaModule, katanaNormalizedSalesOrderRowSchema, katanaNormalizedSalesOrderSchema, katanaProductSchema, katanaProductVariantInputSchema, katanaPurchaseOrderRowInputSchema, katanaPurchaseOrderSchema, katanaQuerySalesOrderScopeSchema, katanaQuerySalesOrdersInputSchema, katanaQuerySalesOrdersOutputSchema, katanaQuerySalesOrdersTool, katanaSalesOrderRowInputSchema, katanaSalesOrderSchema, katanaSupplierSchema, katanaUpdateCustomerInputSchema, katanaUpdateCustomerOutputSchema, katanaUpdateCustomerTool, katanaUpdateManufacturingOrderInputSchema, katanaUpdateManufacturingOrderOutputSchema, katanaUpdateManufacturingOrderTool, katanaUpdateProductInputSchema, katanaUpdateProductOutputSchema, katanaUpdateProductTool, katanaUpdatePurchaseOrderInputSchema, katanaUpdatePurchaseOrderOutputSchema, katanaUpdatePurchaseOrderTool, katanaUpdateSalesOrderInputSchema, katanaUpdateSalesOrderOutputSchema, katanaUpdateSalesOrderTool };
1979
+ export { KatanaClient, katanaAuthSchema, katanaCreateCustomerInputSchema, katanaCreateCustomerOutputSchema, katanaCreateCustomerTool, katanaCreateManufacturingOrderInputSchema, katanaCreateManufacturingOrderOutputSchema, katanaCreateManufacturingOrderTool, katanaCreateProductInputSchema, katanaCreateProductOutputSchema, katanaCreateProductTool, katanaCreatePurchaseOrderInputSchema, katanaCreatePurchaseOrderOutputSchema, katanaCreatePurchaseOrderTool, katanaCreateSalesOrderInputSchema, katanaCreateSalesOrderOutputSchema, katanaCreateSalesOrderTool, katanaCreateSupplierInputSchema, katanaCreateSupplierOutputSchema, katanaCreateSupplierTool, katanaCustomerRawSchema, katanaCustomerSchema, katanaDeleteSalesOrderInputSchema, katanaDeleteSalesOrderOutputSchema, katanaDeleteSalesOrderTool, katanaGetCustomerInputSchema, katanaGetCustomerOutputSchema, katanaGetCustomerTool, katanaGetManufacturingOrderInputSchema, katanaGetManufacturingOrderOutputSchema, katanaGetManufacturingOrderTool, katanaGetMaterialInputSchema, katanaGetMaterialOutputSchema, katanaGetMaterialTool, katanaGetProductInputSchema, katanaGetProductOutputSchema, katanaGetProductTool, katanaGetPurchaseOrderInputSchema, katanaGetPurchaseOrderOutputSchema, katanaGetPurchaseOrderTool, katanaGetSalesOrderInputSchema, katanaGetSalesOrderOutputSchema, katanaGetSalesOrderTool, katanaGetSupplierInputSchema, katanaGetSupplierOutputSchema, katanaGetSupplierTool, katanaInventoryRawSchema, katanaInventorySchema, katanaListCustomersInputSchema, katanaListCustomersOutputSchema, katanaListCustomersPageInputSchema, katanaListCustomersPageOutputSchema, katanaListCustomersTool, katanaListInventoryInputSchema, katanaListInventoryOutputSchema, katanaListInventoryPageInputSchema, katanaListInventoryPageOutputSchema, katanaListInventoryTool, katanaListManufacturingOrdersInputSchema, katanaListManufacturingOrdersOutputSchema, katanaListManufacturingOrdersPageInputSchema, katanaListManufacturingOrdersPageOutputSchema, katanaListManufacturingOrdersTool, katanaListMaterialsInputSchema, katanaListMaterialsOutputSchema, katanaListMaterialsPageInputSchema, katanaListMaterialsPageOutputSchema, katanaListMaterialsTool, katanaListProductsInputSchema, katanaListProductsOutputSchema, katanaListProductsPageInputSchema, katanaListProductsPageOutputSchema, katanaListProductsTool, katanaListPurchaseOrdersInputSchema, katanaListPurchaseOrdersOutputSchema, katanaListPurchaseOrdersPageInputSchema, katanaListPurchaseOrdersPageOutputSchema, katanaListPurchaseOrdersTool, katanaListSalesOrdersInputSchema, katanaListSalesOrdersOutputSchema, katanaListSalesOrdersPageInputSchema, katanaListSalesOrdersPageOutputSchema, katanaListSalesOrdersTool, katanaListSuppliersInputSchema, katanaListSuppliersOutputSchema, katanaListSuppliersPageInputSchema, katanaListSuppliersPageOutputSchema, katanaListSuppliersTool, katanaManufacturingOrderRawSchema, katanaManufacturingOrderSchema, katanaMaterialRawSchema, katanaMaterialSchema, katanaModule, katanaNormalizedSalesOrderRowSchema, katanaNormalizedSalesOrderSchema, katanaPaginationSchema, katanaProductRawSchema, katanaProductSchema, katanaProductVariantInputSchema, katanaPurchaseOrderRawSchema, katanaPurchaseOrderRowInputSchema, katanaPurchaseOrderSchema, katanaQuerySalesOrderScopeSchema, katanaQuerySalesOrdersInputSchema, katanaQuerySalesOrdersOutputSchema, katanaQuerySalesOrdersTool, katanaRateLimitSchema, katanaRawRecordSchema, katanaSalesOrderRawSchema, katanaSalesOrderRowInputSchema, katanaSalesOrderSchema, katanaSupplierRawSchema, katanaSupplierSchema, katanaUpdateCustomerInputSchema, katanaUpdateCustomerOutputSchema, katanaUpdateCustomerTool, katanaUpdateManufacturingOrderInputSchema, katanaUpdateManufacturingOrderOutputSchema, katanaUpdateManufacturingOrderTool, katanaUpdateProductInputSchema, katanaUpdateProductOutputSchema, katanaUpdateProductTool, katanaUpdatePurchaseOrderInputSchema, katanaUpdatePurchaseOrderOutputSchema, katanaUpdatePurchaseOrderTool, katanaUpdateSalesOrderInputSchema, katanaUpdateSalesOrderOutputSchema, katanaUpdateSalesOrderTool };
1638
1980
 
1639
1981
  //# sourceMappingURL=index.js.map