@5ss/ai-tools 2.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (342) hide show
  1. package/CHANGELOG.md +112 -0
  2. package/LICENSE +21 -0
  3. package/README.md +221 -0
  4. package/dist/ai-sdk/index.d.ts +15 -0
  5. package/dist/ai-sdk/index.d.ts.map +1 -0
  6. package/dist/ai-sdk/index.js +24 -0
  7. package/dist/ai-sdk/index.js.map +1 -0
  8. package/dist/artifact-D064mHfK.js +44 -0
  9. package/dist/artifact-D064mHfK.js.map +1 -0
  10. package/dist/artifacts-O8g-40Pw.js +404 -0
  11. package/dist/artifacts-O8g-40Pw.js.map +1 -0
  12. package/dist/aws-json-CecFqzqX.js +23 -0
  13. package/dist/aws-json-CecFqzqX.js.map +1 -0
  14. package/dist/aws-service-msttbPrz.js +58 -0
  15. package/dist/aws-service-msttbPrz.js.map +1 -0
  16. package/dist/batch-BMM5dXqL.d.ts +22 -0
  17. package/dist/batch-BMM5dXqL.d.ts.map +1 -0
  18. package/dist/batch-Co1ujeAW.js +67 -0
  19. package/dist/batch-Co1ujeAW.js.map +1 -0
  20. package/dist/bedrock-agentcore-browser-a_qOs-NR.js +182 -0
  21. package/dist/bedrock-agentcore-browser-a_qOs-NR.js.map +1 -0
  22. package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js +357 -0
  23. package/dist/bedrock-agentcore-code-interpreter-MWK-8RhA.js.map +1 -0
  24. package/dist/bytes-BxpimpQx.js +45 -0
  25. package/dist/bytes-BxpimpQx.js.map +1 -0
  26. package/dist/client-CCKGsTeI.js +743 -0
  27. package/dist/client-CCKGsTeI.js.map +1 -0
  28. package/dist/cloudflare/index.d.ts +37 -0
  29. package/dist/cloudflare/index.d.ts.map +1 -0
  30. package/dist/cloudflare/index.js +41 -0
  31. package/dist/cloudflare/index.js.map +1 -0
  32. package/dist/cloudflare-browser-B6Yolpin.js +428 -0
  33. package/dist/cloudflare-browser-B6Yolpin.js.map +1 -0
  34. package/dist/cloudflare-email-Dy0KHeDf.js +197 -0
  35. package/dist/cloudflare-email-Dy0KHeDf.js.map +1 -0
  36. package/dist/cloudflare-sandbox-Dp_uNaqW.js +982 -0
  37. package/dist/cloudflare-sandbox-Dp_uNaqW.js.map +1 -0
  38. package/dist/content-type-CORxaxcv.js +49 -0
  39. package/dist/content-type-CORxaxcv.js.map +1 -0
  40. package/dist/core/index.d.ts +4 -0
  41. package/dist/core/index.js +204 -0
  42. package/dist/core/index.js.map +1 -0
  43. package/dist/define-CvpJ_pNP.js +115 -0
  44. package/dist/define-CvpJ_pNP.js.map +1 -0
  45. package/dist/errors-DoSpNHvs.js +20 -0
  46. package/dist/errors-DoSpNHvs.js.map +1 -0
  47. package/dist/errors-aKhko9T1.d.ts +18 -0
  48. package/dist/errors-aKhko9T1.d.ts.map +1 -0
  49. package/dist/eventbridge-scheduler-Bh6GqZY2.js +349 -0
  50. package/dist/eventbridge-scheduler-Bh6GqZY2.js.map +1 -0
  51. package/dist/framework-context-DVIIY8ZO.js +24 -0
  52. package/dist/framework-context-DVIIY8ZO.js.map +1 -0
  53. package/dist/gotenberg-NuJjxyln.js +291 -0
  54. package/dist/gotenberg-NuJjxyln.js.map +1 -0
  55. package/dist/http/index.d.ts +47 -0
  56. package/dist/http/index.d.ts.map +1 -0
  57. package/dist/http/index.js +3 -0
  58. package/dist/http-service-DDNCO1s4.js +254 -0
  59. package/dist/http-service-DDNCO1s4.js.map +1 -0
  60. package/dist/http-service-T7E5UjP8.d.ts +80 -0
  61. package/dist/http-service-T7E5UjP8.d.ts.map +1 -0
  62. package/dist/imessage-BSAFOI8Z.js +154 -0
  63. package/dist/imessage-BSAFOI8Z.js.map +1 -0
  64. package/dist/index-BU4gmYO8.d.ts +254 -0
  65. package/dist/index-BU4gmYO8.d.ts.map +1 -0
  66. package/dist/index-CCivzmxO.d.ts +188 -0
  67. package/dist/index-CCivzmxO.d.ts.map +1 -0
  68. package/dist/index-CLmTrcu5.d.ts +22 -0
  69. package/dist/index-CLmTrcu5.d.ts.map +1 -0
  70. package/dist/index-CZX5OeOF.d.ts +235 -0
  71. package/dist/index-CZX5OeOF.d.ts.map +1 -0
  72. package/dist/index-CdFmEfZO.d.ts +359 -0
  73. package/dist/index-CdFmEfZO.d.ts.map +1 -0
  74. package/dist/index-Cuh6eMWc.d.ts +285 -0
  75. package/dist/index-Cuh6eMWc.d.ts.map +1 -0
  76. package/dist/index-DuOGj7vc.d.ts +107 -0
  77. package/dist/index-DuOGj7vc.d.ts.map +1 -0
  78. package/dist/index-ccZ1XOHw.d.ts +69 -0
  79. package/dist/index-ccZ1XOHw.d.ts.map +1 -0
  80. package/dist/index-n8JTpNf1.d.ts +247 -0
  81. package/dist/index-n8JTpNf1.d.ts.map +1 -0
  82. package/dist/index-pwW1OsOx.d.ts +134 -0
  83. package/dist/index-pwW1OsOx.d.ts.map +1 -0
  84. package/dist/index-zK1ZwS4m.d.ts +347 -0
  85. package/dist/index-zK1ZwS4m.d.ts.map +1 -0
  86. package/dist/limits-hjrO8zUG.js +80 -0
  87. package/dist/limits-hjrO8zUG.js.map +1 -0
  88. package/dist/mastra/index.d.ts +14 -0
  89. package/dist/mastra/index.d.ts.map +1 -0
  90. package/dist/mastra/index.js +26 -0
  91. package/dist/mastra/index.js.map +1 -0
  92. package/dist/mastra-vector-Dhc6XZ8l.js +234 -0
  93. package/dist/mastra-vector-Dhc6XZ8l.js.map +1 -0
  94. package/dist/mcp/index.d.ts +80 -0
  95. package/dist/mcp/index.d.ts.map +1 -0
  96. package/dist/mcp/index.js +97 -0
  97. package/dist/mcp/index.js.map +1 -0
  98. package/dist/modules/artifacts/index.d.ts +337 -0
  99. package/dist/modules/artifacts/index.d.ts.map +1 -0
  100. package/dist/modules/artifacts/index.js +348 -0
  101. package/dist/modules/artifacts/index.js.map +1 -0
  102. package/dist/modules/browser/index.d.ts +516 -0
  103. package/dist/modules/browser/index.d.ts.map +1 -0
  104. package/dist/modules/browser/index.js +475 -0
  105. package/dist/modules/browser/index.js.map +1 -0
  106. package/dist/modules/calendar/index.d.ts +93 -0
  107. package/dist/modules/calendar/index.d.ts.map +1 -0
  108. package/dist/modules/calendar/index.js +131 -0
  109. package/dist/modules/calendar/index.js.map +1 -0
  110. package/dist/modules/code-sandbox/index.d.ts +317 -0
  111. package/dist/modules/code-sandbox/index.d.ts.map +1 -0
  112. package/dist/modules/code-sandbox/index.js +537 -0
  113. package/dist/modules/code-sandbox/index.js.map +1 -0
  114. package/dist/modules/content-type/index.d.ts +22 -0
  115. package/dist/modules/content-type/index.d.ts.map +1 -0
  116. package/dist/modules/content-type/index.js +66 -0
  117. package/dist/modules/content-type/index.js.map +1 -0
  118. package/dist/modules/crypto/index.d.ts +115 -0
  119. package/dist/modules/crypto/index.d.ts.map +1 -0
  120. package/dist/modules/crypto/index.js +139 -0
  121. package/dist/modules/crypto/index.js.map +1 -0
  122. package/dist/modules/document/index.d.ts +575 -0
  123. package/dist/modules/document/index.d.ts.map +1 -0
  124. package/dist/modules/document/index.js +444 -0
  125. package/dist/modules/document/index.js.map +1 -0
  126. package/dist/modules/document-extract/index.d.ts +438 -0
  127. package/dist/modules/document-extract/index.d.ts.map +1 -0
  128. package/dist/modules/document-extract/index.js +127 -0
  129. package/dist/modules/document-extract/index.js.map +1 -0
  130. package/dist/modules/document-render/index.d.ts +336 -0
  131. package/dist/modules/document-render/index.d.ts.map +1 -0
  132. package/dist/modules/document-render/index.js +155 -0
  133. package/dist/modules/document-render/index.js.map +1 -0
  134. package/dist/modules/email/index.d.ts +311 -0
  135. package/dist/modules/email/index.d.ts.map +1 -0
  136. package/dist/modules/email/index.js +167 -0
  137. package/dist/modules/email/index.js.map +1 -0
  138. package/dist/modules/email-message/index.d.ts +95 -0
  139. package/dist/modules/email-message/index.d.ts.map +1 -0
  140. package/dist/modules/email-message/index.js +264 -0
  141. package/dist/modules/email-message/index.js.map +1 -0
  142. package/dist/modules/file-convert/index.d.ts +273 -0
  143. package/dist/modules/file-convert/index.d.ts.map +1 -0
  144. package/dist/modules/file-convert/index.js +103 -0
  145. package/dist/modules/file-convert/index.js.map +1 -0
  146. package/dist/modules/files/index.d.ts +452 -0
  147. package/dist/modules/files/index.d.ts.map +1 -0
  148. package/dist/modules/files/index.js +733 -0
  149. package/dist/modules/files/index.js.map +1 -0
  150. package/dist/modules/image/index.d.ts +342 -0
  151. package/dist/modules/image/index.d.ts.map +1 -0
  152. package/dist/modules/image/index.js +281 -0
  153. package/dist/modules/image/index.js.map +1 -0
  154. package/dist/modules/messaging/index.d.ts +608 -0
  155. package/dist/modules/messaging/index.d.ts.map +1 -0
  156. package/dist/modules/messaging/index.js +1067 -0
  157. package/dist/modules/messaging/index.js.map +1 -0
  158. package/dist/modules/pdf/index.d.ts +287 -0
  159. package/dist/modules/pdf/index.d.ts.map +1 -0
  160. package/dist/modules/pdf/index.js +259 -0
  161. package/dist/modules/pdf/index.js.map +1 -0
  162. package/dist/modules/presentation/index.d.ts +247 -0
  163. package/dist/modules/presentation/index.d.ts.map +1 -0
  164. package/dist/modules/presentation/index.js +12657 -0
  165. package/dist/modules/presentation/index.js.map +1 -0
  166. package/dist/modules/queue/index.d.ts +129 -0
  167. package/dist/modules/queue/index.d.ts.map +1 -0
  168. package/dist/modules/queue/index.js +131 -0
  169. package/dist/modules/queue/index.js.map +1 -0
  170. package/dist/modules/rag/index.d.ts +250 -0
  171. package/dist/modules/rag/index.d.ts.map +1 -0
  172. package/dist/modules/rag/index.js +366 -0
  173. package/dist/modules/rag/index.js.map +1 -0
  174. package/dist/modules/scheduler/index.d.ts +216 -0
  175. package/dist/modules/scheduler/index.d.ts.map +1 -0
  176. package/dist/modules/scheduler/index.js +153 -0
  177. package/dist/modules/scheduler/index.js.map +1 -0
  178. package/dist/modules/skills/index.d.ts +205 -0
  179. package/dist/modules/skills/index.d.ts.map +1 -0
  180. package/dist/modules/skills/index.js +203 -0
  181. package/dist/modules/skills/index.js.map +1 -0
  182. package/dist/modules/tasks/index.d.ts +287 -0
  183. package/dist/modules/tasks/index.d.ts.map +1 -0
  184. package/dist/modules/tasks/index.js +207 -0
  185. package/dist/modules/tasks/index.js.map +1 -0
  186. package/dist/modules/vector-store/index.d.ts +3 -0
  187. package/dist/modules/vector-store/index.js +3 -0
  188. package/dist/modules/web-fetch/index.d.ts +99 -0
  189. package/dist/modules/web-fetch/index.d.ts.map +1 -0
  190. package/dist/modules/web-fetch/index.js +242 -0
  191. package/dist/modules/web-fetch/index.js.map +1 -0
  192. package/dist/object-artifact-store-CMTzCm_G.d.ts +7 -0
  193. package/dist/object-artifact-store-CMTzCm_G.d.ts.map +1 -0
  194. package/dist/object-artifact-store-wZ2j9cto.js +28 -0
  195. package/dist/object-artifact-store-wZ2j9cto.js.map +1 -0
  196. package/dist/pinecone-umY4t6OF.js +190 -0
  197. package/dist/pinecone-umY4t6OF.js.map +1 -0
  198. package/dist/provider-CgDAlg6K.js +34 -0
  199. package/dist/provider-CgDAlg6K.js.map +1 -0
  200. package/dist/qdrant-DMp4NhKR.js +253 -0
  201. package/dist/qdrant-DMp4NhKR.js.map +1 -0
  202. package/dist/resend-BAC38_dA.js +155 -0
  203. package/dist/resend-BAC38_dA.js.map +1 -0
  204. package/dist/s3-CsOaPWMP.js +955 -0
  205. package/dist/s3-CsOaPWMP.js.map +1 -0
  206. package/dist/schemas-ChOAhdo9.js +192 -0
  207. package/dist/schemas-ChOAhdo9.js.map +1 -0
  208. package/dist/slack-Di5BBNpt.js +1455 -0
  209. package/dist/slack-Di5BBNpt.js.map +1 -0
  210. package/dist/sqs-DCwS1i2N.js +225 -0
  211. package/dist/sqs-DCwS1i2N.js.map +1 -0
  212. package/dist/supabase-vector-Dpp9mmJR.js +218 -0
  213. package/dist/supabase-vector-Dpp9mmJR.js.map +1 -0
  214. package/dist/tanstack/index.d.ts +15 -0
  215. package/dist/tanstack/index.d.ts.map +1 -0
  216. package/dist/tanstack/index.js +28 -0
  217. package/dist/tanstack/index.js.map +1 -0
  218. package/dist/teams-DYAHNb39.js +835 -0
  219. package/dist/teams-DYAHNb39.js.map +1 -0
  220. package/dist/telegram-DDXWzkfL.js +734 -0
  221. package/dist/telegram-DDXWzkfL.js.map +1 -0
  222. package/dist/textract-CPLiB22H.js +554 -0
  223. package/dist/textract-CPLiB22H.js.map +1 -0
  224. package/dist/transport-B4vn-XiQ.js +157 -0
  225. package/dist/transport-B4vn-XiQ.js.map +1 -0
  226. package/dist/transport-i96ACAI_.d.ts +46 -0
  227. package/dist/transport-i96ACAI_.d.ts.map +1 -0
  228. package/dist/types-Ccb0DXY9.d.ts +150 -0
  229. package/dist/types-Ccb0DXY9.d.ts.map +1 -0
  230. package/dist/unique-EwBH1JPB.js +19 -0
  231. package/dist/unique-EwBH1JPB.js.map +1 -0
  232. package/dist/vector-store-C3nEO80e.js +193 -0
  233. package/dist/vector-store-C3nEO80e.js.map +1 -0
  234. package/dist/vendors/amazon-sp-api/index.d.ts +526 -0
  235. package/dist/vendors/amazon-sp-api/index.d.ts.map +1 -0
  236. package/dist/vendors/amazon-sp-api/index.js +975 -0
  237. package/dist/vendors/amazon-sp-api/index.js.map +1 -0
  238. package/dist/vendors/bedrock-agentcore-browser/index.d.ts +2 -0
  239. package/dist/vendors/bedrock-agentcore-browser/index.js +2 -0
  240. package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts +228 -0
  241. package/dist/vendors/bedrock-agentcore-code-interpreter/index.d.ts.map +1 -0
  242. package/dist/vendors/bedrock-agentcore-code-interpreter/index.js +2 -0
  243. package/dist/vendors/cloudflare-browser/index.d.ts +2 -0
  244. package/dist/vendors/cloudflare-browser/index.js +2 -0
  245. package/dist/vendors/cloudflare-email/index.d.ts +260 -0
  246. package/dist/vendors/cloudflare-email/index.d.ts.map +1 -0
  247. package/dist/vendors/cloudflare-email/index.js +3 -0
  248. package/dist/vendors/cloudflare-sandbox/index.d.ts +565 -0
  249. package/dist/vendors/cloudflare-sandbox/index.d.ts.map +1 -0
  250. package/dist/vendors/cloudflare-sandbox/index.js +2 -0
  251. package/dist/vendors/eventbridge-scheduler/index.d.ts +2 -0
  252. package/dist/vendors/eventbridge-scheduler/index.js +2 -0
  253. package/dist/vendors/gotenberg/index.d.ts +306 -0
  254. package/dist/vendors/gotenberg/index.d.ts.map +1 -0
  255. package/dist/vendors/gotenberg/index.js +2 -0
  256. package/dist/vendors/imessage/index.d.ts +420 -0
  257. package/dist/vendors/imessage/index.d.ts.map +1 -0
  258. package/dist/vendors/imessage/index.js +4 -0
  259. package/dist/vendors/katana/index.d.ts +1570 -0
  260. package/dist/vendors/katana/index.d.ts.map +1 -0
  261. package/dist/vendors/katana/index.js +1639 -0
  262. package/dist/vendors/katana/index.js.map +1 -0
  263. package/dist/vendors/mastra-vector/index.d.ts +120 -0
  264. package/dist/vendors/mastra-vector/index.d.ts.map +1 -0
  265. package/dist/vendors/mastra-vector/index.js +3 -0
  266. package/dist/vendors/pinecone/index.d.ts +75 -0
  267. package/dist/vendors/pinecone/index.d.ts.map +1 -0
  268. package/dist/vendors/pinecone/index.js +3 -0
  269. package/dist/vendors/qdrant/index.d.ts +75 -0
  270. package/dist/vendors/qdrant/index.d.ts.map +1 -0
  271. package/dist/vendors/qdrant/index.js +3 -0
  272. package/dist/vendors/resend/index.d.ts +3 -0
  273. package/dist/vendors/resend/index.js +3 -0
  274. package/dist/vendors/s3/index.d.ts +2 -0
  275. package/dist/vendors/s3/index.js +2 -0
  276. package/dist/vendors/slack/index.d.ts +576 -0
  277. package/dist/vendors/slack/index.d.ts.map +1 -0
  278. package/dist/vendors/slack/index.js +3 -0
  279. package/dist/vendors/sqs/index.d.ts +2 -0
  280. package/dist/vendors/sqs/index.js +2 -0
  281. package/dist/vendors/supabase-vector/index.d.ts +89 -0
  282. package/dist/vendors/supabase-vector/index.d.ts.map +1 -0
  283. package/dist/vendors/supabase-vector/index.js +3 -0
  284. package/dist/vendors/teams/index.d.ts +303 -0
  285. package/dist/vendors/teams/index.d.ts.map +1 -0
  286. package/dist/vendors/teams/index.js +3 -0
  287. package/dist/vendors/telegram/index.d.ts +319 -0
  288. package/dist/vendors/telegram/index.d.ts.map +1 -0
  289. package/dist/vendors/telegram/index.js +3 -0
  290. package/dist/vendors/textract/index.d.ts +2 -0
  291. package/dist/vendors/textract/index.js +2 -0
  292. package/dist/vendors/woocommerce/index.d.ts +1700 -0
  293. package/dist/vendors/woocommerce/index.d.ts.map +1 -0
  294. package/dist/vendors/woocommerce/index.js +1427 -0
  295. package/dist/vendors/woocommerce/index.js.map +1 -0
  296. package/dist/with-auth-CpKqTrGK.js +240 -0
  297. package/dist/with-auth-CpKqTrGK.js.map +1 -0
  298. package/logos/LUCIDE-ATTRIBUTION.txt +4 -0
  299. package/logos/README.md +89 -0
  300. package/logos/amazon.svg +6 -0
  301. package/logos/artifacts.svg +9 -0
  302. package/logos/browser.svg +9 -0
  303. package/logos/calendar.svg +15 -0
  304. package/logos/cloudflare-browser.svg +5 -0
  305. package/logos/cloudflare-email.svg +5 -0
  306. package/logos/cloudflare.svg +4 -0
  307. package/logos/code-sandbox.svg +8 -0
  308. package/logos/content-type.svg +10 -0
  309. package/logos/crypto.svg +7 -0
  310. package/logos/document-extract.svg +12 -0
  311. package/logos/document-render.svg +8 -0
  312. package/logos/document.svg +10 -0
  313. package/logos/email-message.svg +8 -0
  314. package/logos/email.svg +7 -0
  315. package/logos/file-convert.svg +9 -0
  316. package/logos/files.svg +6 -0
  317. package/logos/gotenberg.svg +340 -0
  318. package/logos/image.svg +8 -0
  319. package/logos/imessage.svg +7 -0
  320. package/logos/katana.svg +13 -0
  321. package/logos/mastra.svg +7 -0
  322. package/logos/messaging.svg +7 -0
  323. package/logos/pack-logos.json +48 -0
  324. package/logos/pdf.svg +10 -0
  325. package/logos/pinecone.svg +25 -0
  326. package/logos/presentation.svg +8 -0
  327. package/logos/qdrant.svg +4 -0
  328. package/logos/queue.svg +11 -0
  329. package/logos/rag.svg +18 -0
  330. package/logos/resend.svg +5 -0
  331. package/logos/scheduler.svg +7 -0
  332. package/logos/skills.svg +10 -0
  333. package/logos/slack.svg +14 -0
  334. package/logos/supabase.svg +4 -0
  335. package/logos/tasks.svg +10 -0
  336. package/logos/teams.svg +6 -0
  337. package/logos/telegram.svg +10 -0
  338. package/logos/textract.svg +5 -0
  339. package/logos/vector-store.svg +8 -0
  340. package/logos/web-fetch.svg +8 -0
  341. package/logos/woocommerce.svg +4 -0
  342. package/package.json +373 -0
@@ -0,0 +1,1639 @@
1
+ import { t as ToolError } from "../../errors-DoSpNHvs.js";
2
+ import { n as defineModule, r as defineTool } from "../../define-CvpJ_pNP.js";
3
+ import { n as requireAuth } from "../../provider-CgDAlg6K.js";
4
+ import { t as HttpService } from "../../http-service-DDNCO1s4.js";
5
+ import { isPlainObject, isString } from "es-toolkit";
6
+ import { z } from "zod";
7
+ //#region src/vendors/katana/contracts.ts
8
+ const katanaAuthSchema = z.object({ api_key: z.string().min(1).describe("Katana MRP Bearer access token") });
9
+ const listCursorFields = {
10
+ cursor: z.string().min(1).optional().describe("Page number from a prior next_cursor"),
11
+ limit: z.int().min(1).max(250).optional().describe("Page size (1-250, default 50)")
12
+ };
13
+ const listOutputMeta = {
14
+ next_cursor: z.string().optional(),
15
+ truncated: z.boolean()
16
+ };
17
+ const katanaSalesOrderRowInputSchema = z.object({
18
+ quantity: z.number().positive().describe("Line quantity"),
19
+ variant_id: z.int().positive().describe("Product variant id"),
20
+ tax_rate_id: z.int().positive().optional().describe("Tax rate id"),
21
+ location_id: z.int().positive().optional().describe("Ship-from location id for this row"),
22
+ price_per_unit: z.number().min(0).optional().describe("Unit price excluding tax"),
23
+ total_discount: z.number().min(0).optional().describe("Line discount total")
24
+ });
25
+ const katanaSalesOrderSchema = z.object({
26
+ id: z.number(),
27
+ order_no: z.string().optional(),
28
+ status: z.string().optional(),
29
+ customer_id: z.number().optional(),
30
+ order_created_date: z.string().optional(),
31
+ delivery_date: z.string().optional(),
32
+ location_id: z.number().optional(),
33
+ currency: z.string().optional(),
34
+ total: z.number().optional(),
35
+ additional_info: z.string().optional(),
36
+ customer_ref: z.string().optional(),
37
+ created_at: z.string().optional().describe("Resource created_at timestamp when returned by Katana")
38
+ });
39
+ const katanaListSalesOrdersInputSchema = z.object({
40
+ status: z.string().min(1).optional().describe("Sales order status filter"),
41
+ customer_id: z.int().positive().optional().describe("Filter by customer id"),
42
+ order_no: z.string().min(1).optional().describe("Filter by order number"),
43
+ location_id: z.int().positive().optional().describe("Filter by location id"),
44
+ ...listCursorFields
45
+ });
46
+ const katanaListSalesOrdersOutputSchema = z.object({
47
+ items: z.array(katanaSalesOrderSchema),
48
+ ...listOutputMeta
49
+ });
50
+ const katanaGetSalesOrderInputSchema = z.object({ sales_order_id: z.int().positive().describe("Sales order id") });
51
+ const katanaGetSalesOrderOutputSchema = z.object({ sales_order: katanaSalesOrderSchema });
52
+ const katanaCreateSalesOrderInputSchema = z.object({
53
+ customer_id: z.int().positive().describe("Customer id"),
54
+ sales_order_rows: z.array(katanaSalesOrderRowInputSchema).min(1).describe("Order line items (variant_id + quantity required)"),
55
+ order_no: z.string().min(1).optional().describe("Order number"),
56
+ order_created_date: z.string().min(1).optional().describe("Order created date (ISO 8601)"),
57
+ delivery_date: z.string().min(1).optional().describe("Delivery date (ISO 8601)"),
58
+ currency: z.string().min(1).optional().describe("ISO 4217 currency code"),
59
+ location_id: z.int().positive().optional().describe("Default ship-from location id"),
60
+ status: z.string().min(1).optional().describe("NOT_SHIPPED (default) or PENDING for quotes"),
61
+ additional_info: z.string().optional().describe("Internal notes"),
62
+ customer_ref: z.string().optional().describe("Customer reference")
63
+ });
64
+ const katanaCreateSalesOrderOutputSchema = katanaGetSalesOrderOutputSchema;
65
+ const katanaUpdateSalesOrderInputSchema = z.object({
66
+ sales_order_id: z.int().positive().describe("Sales order id"),
67
+ order_no: z.string().min(1).optional().describe("Order number"),
68
+ customer_id: z.int().positive().optional().describe("Customer id"),
69
+ order_created_date: z.string().min(1).optional().describe("Order created date (ISO 8601)"),
70
+ delivery_date: z.string().min(1).optional().describe("Delivery date (ISO 8601)"),
71
+ location_id: z.int().positive().optional().describe("Default ship-from location id"),
72
+ status: z.string().min(1).optional().describe("Order status (e.g. NOT_SHIPPED, PENDING, PACKED, DELIVERED)"),
73
+ currency: z.string().min(1).optional().describe("ISO 4217 currency code"),
74
+ additional_info: z.string().optional().describe("Internal notes"),
75
+ customer_ref: z.string().optional().describe("Customer reference")
76
+ });
77
+ const katanaUpdateSalesOrderOutputSchema = katanaGetSalesOrderOutputSchema;
78
+ const katanaDeleteSalesOrderInputSchema = z.object({ sales_order_id: z.int().positive().describe("Sales order id") });
79
+ const katanaDeleteSalesOrderOutputSchema = z.object({
80
+ deleted: z.boolean(),
81
+ id: z.number()
82
+ });
83
+ const katanaQuerySalesOrderScopeSchema = z.object({
84
+ created_from: z.string().min(1).optional().describe("ISO 8601 lower bound on resource created_at (maps to created_at_min)"),
85
+ order_created_from: z.string().min(1).optional().describe("ISO 8601 lower bound on order_created_date (client-side; list API has no order_created filter)"),
86
+ order_created_to: z.string().min(1).optional().describe("ISO 8601 upper bound on order_created_date (client-side; list API has no order_created filter)"),
87
+ statuses: z.array(z.string().min(1)).min(1).max(20).optional().describe("Sales order statuses to include for this scope (one API list pass each; single status per call)"),
88
+ customer_id: z.int().positive().optional().describe("Filter by customer id"),
89
+ location_id: z.int().positive().optional().describe("Filter by location id")
90
+ });
91
+ const katanaQuerySalesOrdersInputSchema = z.object({
92
+ scopes: z.array(katanaQuerySalesOrderScopeSchema).min(1).max(20).describe("Independent filter scopes; results are unioned and deduplicated by order id"),
93
+ max_pages_per_list: z.int().min(1).max(100).optional().describe("Max sequential pages per scope×status list call (default 20)"),
94
+ page_size: z.int().min(1).max(250).optional().describe("Page size for list calls (default 50)")
95
+ });
96
+ const katanaNormalizedSalesOrderRowSchema = z.object({
97
+ sku: z.string().optional().describe("Variant SKU when known"),
98
+ quantity: z.number().describe("Line quantity"),
99
+ tax_exclusive_total_cents: z.number().int().describe("Line revenue in safe integer cents: (quantity * price_per_unit - total_discount)"),
100
+ cogs_value_cents: z.number().int().describe("Line COGS in safe integer cents when variant cost is available; otherwise 0")
101
+ });
102
+ const katanaNormalizedSalesOrderSchema = z.object({
103
+ id: z.number(),
104
+ created_at: z.string().optional().describe("Resource created_at when returned by Katana"),
105
+ order_created_date: z.string().optional(),
106
+ order_no: z.string().optional(),
107
+ status: z.string().optional(),
108
+ customer_id: z.number().optional(),
109
+ customer_name: z.string().optional().describe("Enriched from customers API when available"),
110
+ rows: z.array(katanaNormalizedSalesOrderRowSchema)
111
+ });
112
+ const katanaQuerySalesOrdersOutputSchema = z.object({
113
+ orders: z.array(katanaNormalizedSalesOrderSchema),
114
+ order_count: z.number().int().describe("Number of unique orders after deduplication")
115
+ });
116
+ const katanaProductVariantInputSchema = z.object({
117
+ sku: z.string().min(1).optional().describe("Variant SKU"),
118
+ sales_price: z.number().min(0).optional().describe("Sales price"),
119
+ purchase_price: z.number().min(0).optional().describe("Purchase price")
120
+ });
121
+ const katanaProductSchema = z.object({
122
+ id: z.number(),
123
+ name: z.string().optional(),
124
+ uom: z.string().optional(),
125
+ category_name: z.string().optional(),
126
+ is_sellable: z.boolean().optional(),
127
+ is_producible: z.boolean().optional(),
128
+ is_purchasable: z.boolean().optional(),
129
+ type: z.string().optional(),
130
+ default_supplier_id: z.number().optional(),
131
+ additional_info: z.string().optional()
132
+ });
133
+ const katanaListProductsInputSchema = z.object({
134
+ name: z.string().min(1).optional().describe("Filter by product name"),
135
+ is_sellable: z.boolean().optional().describe("Filter sellable products"),
136
+ is_producible: z.boolean().optional().describe("Filter producible products"),
137
+ is_purchasable: z.boolean().optional().describe("Filter purchasable products"),
138
+ ...listCursorFields
139
+ });
140
+ const katanaListProductsOutputSchema = z.object({
141
+ items: z.array(katanaProductSchema),
142
+ ...listOutputMeta
143
+ });
144
+ const katanaGetProductInputSchema = z.object({ product_id: z.int().positive().describe("Product id") });
145
+ const katanaGetProductOutputSchema = z.object({ product: katanaProductSchema });
146
+ const katanaCreateProductInputSchema = z.object({
147
+ name: z.string().min(1).describe("Product name"),
148
+ variants: z.array(katanaProductVariantInputSchema).min(1).describe("At least one variant (sku/prices optional)"),
149
+ uom: z.string().min(1).optional().describe("Unit of measure (e.g. pcs)"),
150
+ category_name: z.string().min(1).optional().describe("Category name"),
151
+ is_sellable: z.boolean().optional().describe("Can be sold on sales orders"),
152
+ is_producible: z.boolean().optional().describe("Can be manufactured"),
153
+ is_purchasable: z.boolean().optional().describe("Can be purchased"),
154
+ is_auto_assembly: z.boolean().optional().describe("Bundle/kit auto-assembly"),
155
+ default_supplier_id: z.int().positive().optional().describe("Default supplier id"),
156
+ additional_info: z.string().optional().describe("Internal notes"),
157
+ batch_tracked: z.boolean().optional().describe("Enable batch tracking"),
158
+ serial_tracked: z.boolean().optional().describe("Enable serial tracking")
159
+ });
160
+ const katanaCreateProductOutputSchema = katanaGetProductOutputSchema;
161
+ const katanaUpdateProductInputSchema = z.object({
162
+ product_id: z.int().positive().describe("Product id"),
163
+ name: z.string().min(1).optional().describe("Product name"),
164
+ uom: z.string().min(1).optional().describe("Unit of measure"),
165
+ category_name: z.string().optional().describe("Category name"),
166
+ is_sellable: z.boolean().optional().describe("Can be sold on sales orders"),
167
+ is_producible: z.boolean().optional().describe("Can be manufactured"),
168
+ is_purchasable: z.boolean().optional().describe("Can be purchased"),
169
+ is_auto_assembly: z.boolean().optional().describe("Bundle/kit auto-assembly"),
170
+ default_supplier_id: z.int().positive().optional().describe("Default supplier id"),
171
+ additional_info: z.string().optional().describe("Internal notes"),
172
+ batch_tracked: z.boolean().optional().describe("Enable batch tracking"),
173
+ serial_tracked: z.boolean().optional().describe("Enable serial tracking")
174
+ });
175
+ const katanaUpdateProductOutputSchema = katanaGetProductOutputSchema;
176
+ const katanaMaterialSchema = z.object({
177
+ id: z.number(),
178
+ name: z.string().optional(),
179
+ uom: z.string().optional(),
180
+ category_name: z.string().optional(),
181
+ is_sellable: z.boolean().optional(),
182
+ type: z.string().optional(),
183
+ default_supplier_id: z.number().optional(),
184
+ additional_info: z.string().optional()
185
+ });
186
+ const katanaListMaterialsInputSchema = z.object({
187
+ name: z.string().min(1).optional().describe("Filter by material name"),
188
+ ...listCursorFields
189
+ });
190
+ const katanaListMaterialsOutputSchema = z.object({
191
+ items: z.array(katanaMaterialSchema),
192
+ ...listOutputMeta
193
+ });
194
+ const katanaGetMaterialInputSchema = z.object({ material_id: z.int().positive().describe("Material id") });
195
+ const katanaGetMaterialOutputSchema = z.object({ material: katanaMaterialSchema });
196
+ const katanaCustomerSchema = z.object({
197
+ id: z.number(),
198
+ name: z.string().optional(),
199
+ first_name: z.string().optional(),
200
+ last_name: z.string().optional(),
201
+ company: z.string().optional(),
202
+ email: z.string().optional(),
203
+ phone: z.string().optional(),
204
+ currency: z.string().optional(),
205
+ comment: z.string().optional(),
206
+ reference_id: z.string().optional(),
207
+ category: z.string().optional()
208
+ });
209
+ const katanaListCustomersInputSchema = z.object({
210
+ name: z.string().min(1).optional().describe("Filter by customer name"),
211
+ email: z.string().min(1).optional().describe("Filter by email"),
212
+ ...listCursorFields
213
+ });
214
+ const katanaListCustomersOutputSchema = z.object({
215
+ items: z.array(katanaCustomerSchema),
216
+ ...listOutputMeta
217
+ });
218
+ const katanaGetCustomerInputSchema = z.object({ customer_id: z.int().positive().describe("Customer id") });
219
+ const katanaGetCustomerOutputSchema = z.object({ customer: katanaCustomerSchema });
220
+ const katanaCreateCustomerInputSchema = z.object({
221
+ name: z.string().min(1).describe("Customer display name"),
222
+ first_name: z.string().optional().describe("First name"),
223
+ last_name: z.string().optional().describe("Last name"),
224
+ company: z.string().optional().describe("Company name"),
225
+ email: z.string().optional().describe("Email"),
226
+ phone: z.string().optional().describe("Phone"),
227
+ currency: z.string().min(1).optional().describe("ISO 4217 currency code"),
228
+ reference_id: z.string().optional().describe("External reference id"),
229
+ category: z.string().optional().describe("Customer category"),
230
+ comment: z.string().optional().describe("Internal comment"),
231
+ discount_rate: z.number().optional().describe("Default discount rate")
232
+ });
233
+ const katanaCreateCustomerOutputSchema = katanaGetCustomerOutputSchema;
234
+ const katanaUpdateCustomerInputSchema = z.object({
235
+ customer_id: z.int().positive().describe("Customer id"),
236
+ name: z.string().min(1).optional().describe("Customer display name"),
237
+ first_name: z.string().optional().describe("First name"),
238
+ last_name: z.string().optional().describe("Last name"),
239
+ company: z.string().optional().describe("Company name"),
240
+ email: z.string().optional().describe("Email"),
241
+ phone: z.string().optional().describe("Phone"),
242
+ currency: z.string().min(1).optional().describe("ISO 4217 currency code"),
243
+ reference_id: z.string().optional().describe("External reference id"),
244
+ category: z.string().optional().describe("Customer category"),
245
+ comment: z.string().optional().describe("Internal comment"),
246
+ discount_rate: z.number().optional().describe("Default discount rate")
247
+ });
248
+ const katanaUpdateCustomerOutputSchema = katanaGetCustomerOutputSchema;
249
+ const katanaSupplierSchema = z.object({
250
+ id: z.number(),
251
+ name: z.string().optional(),
252
+ email: z.string().optional(),
253
+ phone: z.string().optional(),
254
+ currency: z.string().optional(),
255
+ comment: z.string().optional()
256
+ });
257
+ const katanaListSuppliersInputSchema = z.object({
258
+ name: z.string().min(1).optional().describe("Filter by supplier name"),
259
+ ...listCursorFields
260
+ });
261
+ const katanaListSuppliersOutputSchema = z.object({
262
+ items: z.array(katanaSupplierSchema),
263
+ ...listOutputMeta
264
+ });
265
+ const katanaGetSupplierInputSchema = z.object({ supplier_id: z.int().positive().describe("Supplier id") });
266
+ const katanaGetSupplierOutputSchema = z.object({ supplier: katanaSupplierSchema });
267
+ const katanaCreateSupplierInputSchema = z.object({
268
+ name: z.string().min(1).describe("Supplier name"),
269
+ currency: z.string().min(1).optional().describe("ISO 4217 currency code"),
270
+ email: z.string().optional().describe("Email"),
271
+ phone: z.string().optional().describe("Phone"),
272
+ comment: z.string().optional().describe("Internal comment")
273
+ });
274
+ const katanaCreateSupplierOutputSchema = katanaGetSupplierOutputSchema;
275
+ const katanaPurchaseOrderRowInputSchema = z.object({
276
+ quantity: z.number().positive().describe("Line quantity"),
277
+ variant_id: z.int().positive().describe("Product or material variant id"),
278
+ price_per_unit: z.number().min(0).describe("Unit price excluding tax"),
279
+ tax_rate_id: z.int().positive().optional().describe("Tax rate id"),
280
+ purchase_uom: z.string().min(1).optional().describe("Purchase unit of measure"),
281
+ purchase_uom_conversion_rate: z.number().min(0).optional().describe("Conversion rate to stock UoM"),
282
+ arrival_date: z.string().min(1).optional().describe("Expected arrival date (ISO 8601)")
283
+ });
284
+ const katanaPurchaseOrderSchema = z.object({
285
+ id: z.number(),
286
+ order_no: z.string().optional(),
287
+ status: z.string().optional(),
288
+ supplier_id: z.number().optional(),
289
+ location_id: z.number().optional(),
290
+ currency: z.string().optional(),
291
+ entity_type: z.string().optional(),
292
+ order_created_date: z.string().optional(),
293
+ expected_arrival_date: z.string().optional(),
294
+ total: z.number().optional(),
295
+ additional_info: z.string().optional()
296
+ });
297
+ const katanaListPurchaseOrdersInputSchema = z.object({
298
+ status: z.string().min(1).optional().describe("Purchase order status filter"),
299
+ supplier_id: z.int().positive().optional().describe("Filter by supplier id"),
300
+ order_no: z.string().min(1).optional().describe("Filter by order number"),
301
+ location_id: z.int().positive().optional().describe("Filter by location id"),
302
+ ...listCursorFields
303
+ });
304
+ const katanaListPurchaseOrdersOutputSchema = z.object({
305
+ items: z.array(katanaPurchaseOrderSchema),
306
+ ...listOutputMeta
307
+ });
308
+ const katanaGetPurchaseOrderInputSchema = z.object({ purchase_order_id: z.int().positive().describe("Purchase order id") });
309
+ const katanaGetPurchaseOrderOutputSchema = z.object({ purchase_order: katanaPurchaseOrderSchema });
310
+ const katanaCreatePurchaseOrderInputSchema = z.object({
311
+ supplier_id: z.int().positive().describe("Supplier id"),
312
+ location_id: z.int().positive().describe("Receive-to location id"),
313
+ purchase_order_rows: z.array(katanaPurchaseOrderRowInputSchema).min(1).describe("Order line items (variant_id, quantity, price_per_unit required)"),
314
+ order_no: z.string().min(1).optional().describe("Order number"),
315
+ entity_type: z.string().min(1).optional().describe("regular or outsourced"),
316
+ currency: z.string().min(1).optional().describe("ISO 4217 currency code"),
317
+ status: z.string().min(1).optional().describe("DRAFT or NOT_RECEIVED"),
318
+ expected_arrival_date: z.string().min(1).optional().describe("Expected arrival date (ISO 8601)"),
319
+ order_created_date: z.string().min(1).optional().describe("Order created date (ISO 8601)"),
320
+ additional_info: z.string().optional().describe("Internal notes")
321
+ });
322
+ const katanaCreatePurchaseOrderOutputSchema = katanaGetPurchaseOrderOutputSchema;
323
+ const katanaUpdatePurchaseOrderInputSchema = z.object({
324
+ purchase_order_id: z.int().positive().describe("Purchase order id"),
325
+ order_no: z.string().min(1).optional().describe("Order number"),
326
+ supplier_id: z.int().positive().optional().describe("Supplier id"),
327
+ location_id: z.int().positive().optional().describe("Receive-to location id"),
328
+ currency: z.string().min(1).optional().describe("ISO 4217 currency code"),
329
+ status: z.string().min(1).optional().describe("Purchase order status"),
330
+ expected_arrival_date: z.string().min(1).optional().describe("Expected arrival date (ISO 8601)"),
331
+ order_created_date: z.string().min(1).optional().describe("Order created date (ISO 8601)"),
332
+ additional_info: z.string().optional().describe("Internal notes")
333
+ });
334
+ const katanaUpdatePurchaseOrderOutputSchema = katanaGetPurchaseOrderOutputSchema;
335
+ const katanaManufacturingOrderSchema = z.object({
336
+ id: z.number(),
337
+ order_no: z.string().optional(),
338
+ status: z.string().optional(),
339
+ variant_id: z.number().optional(),
340
+ location_id: z.number().optional(),
341
+ planned_quantity: z.number().optional(),
342
+ actual_quantity: z.number().optional(),
343
+ order_created_date: z.string().optional(),
344
+ production_deadline_date: z.string().optional(),
345
+ ingredient_availability: z.string().optional(),
346
+ additional_info: z.string().optional(),
347
+ sales_order_id: z.number().optional()
348
+ });
349
+ const katanaListManufacturingOrdersInputSchema = z.object({
350
+ status: z.string().min(1).optional().describe("Manufacturing order status filter"),
351
+ variant_id: z.int().positive().optional().describe("Filter by product variant id"),
352
+ location_id: z.int().positive().optional().describe("Filter by location id"),
353
+ order_no: z.string().min(1).optional().describe("Filter by order number"),
354
+ ...listCursorFields
355
+ });
356
+ const katanaListManufacturingOrdersOutputSchema = z.object({
357
+ items: z.array(katanaManufacturingOrderSchema),
358
+ ...listOutputMeta
359
+ });
360
+ const katanaGetManufacturingOrderInputSchema = z.object({ manufacturing_order_id: z.int().positive().describe("Manufacturing order id") });
361
+ const katanaGetManufacturingOrderOutputSchema = z.object({ manufacturing_order: katanaManufacturingOrderSchema });
362
+ const katanaCreateManufacturingOrderInputSchema = z.object({
363
+ variant_id: z.int().positive().describe("Product variant id to manufacture"),
364
+ location_id: z.int().positive().describe("Production location id"),
365
+ planned_quantity: z.number().positive().describe("Planned production quantity"),
366
+ order_no: z.string().min(1).optional().describe("Order number"),
367
+ order_created_date: z.string().min(1).optional().describe("Order created date (ISO 8601)"),
368
+ production_deadline_date: z.string().min(1).optional().describe("Production deadline (ISO 8601)"),
369
+ additional_info: z.string().optional().describe("Internal notes"),
370
+ status: z.string().min(1).optional().describe("Initial status (NOT_STARTED)")
371
+ });
372
+ const katanaCreateManufacturingOrderOutputSchema = katanaGetManufacturingOrderOutputSchema;
373
+ const katanaUpdateManufacturingOrderInputSchema = z.object({
374
+ manufacturing_order_id: z.int().positive().describe("Manufacturing order id"),
375
+ order_no: z.string().min(1).optional().describe("Order number"),
376
+ planned_quantity: z.number().positive().optional().describe("Planned production quantity"),
377
+ actual_quantity: z.number().min(0).optional().describe("Actual produced quantity"),
378
+ order_created_date: z.string().min(1).optional().describe("Order created date (ISO 8601)"),
379
+ production_deadline_date: z.string().min(1).optional().describe("Production deadline (ISO 8601)"),
380
+ additional_info: z.string().optional().describe("Internal notes"),
381
+ status: z.string().min(1).optional().describe("Manufacturing order status")
382
+ });
383
+ const katanaUpdateManufacturingOrderOutputSchema = katanaGetManufacturingOrderOutputSchema;
384
+ const katanaInventorySchema = z.object({
385
+ variant_id: z.number(),
386
+ location_id: z.number(),
387
+ quantity_in_stock: z.number().optional(),
388
+ quantity_committed: z.number().optional(),
389
+ quantity_expected: z.number().optional(),
390
+ quantity_missing_or_excess: z.number().optional(),
391
+ safety_stock_level: z.number().optional(),
392
+ average_cost: z.number().optional(),
393
+ value_in_stock: z.number().optional()
394
+ });
395
+ const katanaListInventoryInputSchema = z.object({
396
+ variant_id: z.int().positive().optional().describe("Filter by variant id"),
397
+ location_id: z.int().positive().optional().describe("Filter by location id"),
398
+ ...listCursorFields
399
+ });
400
+ const katanaListInventoryOutputSchema = z.object({
401
+ items: z.array(katanaInventorySchema),
402
+ ...listOutputMeta
403
+ });
404
+ //#endregion
405
+ //#region src/vendors/katana/domain.ts
406
+ /**
407
+ * Katana MRP payload helpers (no HTTP).
408
+ */
409
+ const KATANA_API_BASE = "https://api.katanamrp.com/v1";
410
+ function pageFromCursor(cursor) {
411
+ if (!cursor) return 1;
412
+ const n = Number.parseInt(cursor, 10);
413
+ if (!Number.isFinite(n) || n < 1) throw new ToolError("Invalid list cursor", {
414
+ code: "bad_input",
415
+ details: { cursor }
416
+ });
417
+ return n;
418
+ }
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
+ function optionalString(value) {
431
+ return isString(value) ? value : void 0;
432
+ }
433
+ function optionalNumber(value) {
434
+ if (typeof value === "number" && Number.isFinite(value)) return value;
435
+ if (isString(value) && value.trim().length > 0) {
436
+ const n = Number(value);
437
+ if (Number.isFinite(n)) return n;
438
+ }
439
+ }
440
+ function optionalBoolean(value) {
441
+ return typeof value === "boolean" ? value : void 0;
442
+ }
443
+ function unwrapResource(data) {
444
+ if (isPlainObject(data) && "data" in data) return data["data"];
445
+ return data;
446
+ }
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" });
462
+ const total = optionalNumber(value["total"] ?? value["total_price"]);
463
+ const orderNo = optionalString(value["order_no"]);
464
+ const status = optionalString(value["status"]);
465
+ const customerId = optionalNumber(value["customer_id"]);
466
+ const orderCreatedDate = optionalString(value["order_created_date"]);
467
+ const deliveryDate = optionalString(value["delivery_date"]);
468
+ const locationId = optionalNumber(value["location_id"]);
469
+ const currency = optionalString(value["currency"]);
470
+ const additionalInfo = optionalString(value["additional_info"]);
471
+ const customerRef = optionalString(value["customer_ref"]);
472
+ const createdAt = optionalString(value["created_at"]);
473
+ return {
474
+ id: value["id"],
475
+ ...orderNo && { order_no: orderNo },
476
+ ...status && { status },
477
+ ...customerId !== void 0 && { customer_id: customerId },
478
+ ...orderCreatedDate && { order_created_date: orderCreatedDate },
479
+ ...deliveryDate && { delivery_date: deliveryDate },
480
+ ...locationId !== void 0 && { location_id: locationId },
481
+ ...currency && { currency },
482
+ ...total !== void 0 && { total },
483
+ ...additionalInfo !== void 0 && { additional_info: additionalInfo },
484
+ ...customerRef !== void 0 && { customer_ref: customerRef },
485
+ ...createdAt && { created_at: createdAt }
486
+ };
487
+ }
488
+ /**
489
+ * Wire query params for GET /sales_orders date windows.
490
+ * Spike (Katana docs): `created_at_min` / `created_at_max` only — no `order_created_date` list filter.
491
+ * `order_created_*` scopes are applied client-side after list (see matchOrderCreatedDateScope).
492
+ */
493
+ function salesOrderListDateQuery(scope) {
494
+ const out = {};
495
+ if (scope.created_from) out["created_at_min"] = scope.created_from;
496
+ return out;
497
+ }
498
+ /** Client-side filter for order_created_date when the list endpoint cannot express it. */
499
+ function matchOrderCreatedDateScope(orderCreatedDate, scope) {
500
+ if (!scope.order_created_from && !scope.order_created_to) return true;
501
+ if (!orderCreatedDate) return false;
502
+ if (scope.order_created_from && orderCreatedDate < scope.order_created_from) return false;
503
+ if (scope.order_created_to && orderCreatedDate > scope.order_created_to) return false;
504
+ return true;
505
+ }
506
+ /**
507
+ * Convert a major-unit money amount to safe integer cents.
508
+ * Rounds half away from zero via Math.round after * 100.
509
+ */
510
+ function moneyToSafeCents(amount) {
511
+ if (!Number.isFinite(amount)) throw new ToolError("Invalid money amount for cents conversion", {
512
+ code: "upstream",
513
+ details: { amount }
514
+ });
515
+ const cents = Math.round(amount * 100);
516
+ if (!Number.isSafeInteger(cents)) throw new ToolError("Money amount exceeds safe integer cents range", {
517
+ code: "upstream",
518
+ details: { amount }
519
+ });
520
+ return cents;
521
+ }
522
+ /** Line revenue cents: quantity * price_per_unit - total_discount (tax exclusive). */
523
+ function lineTaxExclusiveTotalCents(quantity, pricePerUnit, totalDiscount) {
524
+ return moneyToSafeCents(quantity * pricePerUnit - totalDiscount);
525
+ }
526
+ function parseSalesOrderRow(value) {
527
+ if (!isPlainObject(value)) throw new ToolError("Katana returned an invalid sales order row", { code: "upstream" });
528
+ const salesOrderId = optionalNumber(value["sales_order_id"]);
529
+ const quantity = optionalNumber(value["quantity"]);
530
+ if (salesOrderId === void 0 || quantity === void 0) throw new ToolError("Katana sales order row missing sales_order_id or quantity", { code: "upstream" });
531
+ const pricePerUnit = optionalNumber(value["price_per_unit"]) ?? 0;
532
+ const totalDiscount = optionalNumber(value["total_discount"]) ?? 0;
533
+ const variantId = optionalNumber(value["variant_id"]);
534
+ const variant = value["variant"];
535
+ let sku = optionalString(value["sku"]);
536
+ 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"]);
540
+ }
541
+ return {
542
+ sales_order_id: salesOrderId,
543
+ quantity,
544
+ price_per_unit: pricePerUnit,
545
+ total_discount: totalDiscount,
546
+ ...variantId !== void 0 && { variant_id: variantId },
547
+ ...sku && { sku },
548
+ ...unitCost !== void 0 && { unit_cost: unitCost }
549
+ };
550
+ }
551
+ function normalizeSalesOrderRow(rows) {
552
+ return rows.map((row) => ({
553
+ quantity: row.quantity,
554
+ tax_exclusive_total_cents: lineTaxExclusiveTotalCents(row.quantity, row.price_per_unit, row.total_discount),
555
+ cogs_value_cents: moneyToSafeCents((row.unit_cost ?? 0) * row.quantity),
556
+ ...row.sku && { sku: row.sku }
557
+ }));
558
+ }
559
+ function normalizeSalesOrderHeader(order, customerName, rows) {
560
+ return {
561
+ id: order.id,
562
+ ...order.created_at && { created_at: order.created_at },
563
+ ...order.order_created_date && { order_created_date: order.order_created_date },
564
+ ...order.order_no && { order_no: order.order_no },
565
+ ...order.status && { status: order.status },
566
+ ...order.customer_id !== void 0 && { customer_id: order.customer_id },
567
+ ...customerName && { customer_name: customerName },
568
+ rows
569
+ };
570
+ }
571
+ /** Parse optional created_at onto a sales order (used by composite enrichment). */
572
+ function parseSalesOrderCreatedAt(value) {
573
+ if (!isPlainObject(value)) return void 0;
574
+ return optionalString(value["created_at"]);
575
+ }
576
+ function parseProduct(value) {
577
+ if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid product", { code: "upstream" });
578
+ const name = optionalString(value["name"]);
579
+ const uom = optionalString(value["uom"]);
580
+ const categoryName = optionalString(value["category_name"]);
581
+ const isSellable = optionalBoolean(value["is_sellable"]);
582
+ const isProducible = optionalBoolean(value["is_producible"]);
583
+ const isPurchasable = optionalBoolean(value["is_purchasable"]);
584
+ const type = optionalString(value["type"]);
585
+ const defaultSupplierId = optionalNumber(value["default_supplier_id"]);
586
+ const additionalInfo = optionalString(value["additional_info"]);
587
+ return {
588
+ id: value["id"],
589
+ ...name && { name },
590
+ ...uom && { uom },
591
+ ...categoryName && { category_name: categoryName },
592
+ ...isSellable !== void 0 && { is_sellable: isSellable },
593
+ ...isProducible !== void 0 && { is_producible: isProducible },
594
+ ...isPurchasable !== void 0 && { is_purchasable: isPurchasable },
595
+ ...type && { type },
596
+ ...defaultSupplierId !== void 0 && { default_supplier_id: defaultSupplierId },
597
+ ...additionalInfo !== void 0 && { additional_info: additionalInfo }
598
+ };
599
+ }
600
+ function parseMaterial(value) {
601
+ if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid material", { code: "upstream" });
602
+ const name = optionalString(value["name"]);
603
+ const uom = optionalString(value["uom"]);
604
+ const categoryName = optionalString(value["category_name"]);
605
+ const isSellable = optionalBoolean(value["is_sellable"]);
606
+ const type = optionalString(value["type"]);
607
+ const defaultSupplierId = optionalNumber(value["default_supplier_id"]);
608
+ const additionalInfo = optionalString(value["additional_info"]);
609
+ return {
610
+ id: value["id"],
611
+ ...name && { name },
612
+ ...uom && { uom },
613
+ ...categoryName && { category_name: categoryName },
614
+ ...isSellable !== void 0 && { is_sellable: isSellable },
615
+ ...type && { type },
616
+ ...defaultSupplierId !== void 0 && { default_supplier_id: defaultSupplierId },
617
+ ...additionalInfo !== void 0 && { additional_info: additionalInfo }
618
+ };
619
+ }
620
+ function parseCustomer(value) {
621
+ if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid customer", { code: "upstream" });
622
+ const name = optionalString(value["name"]);
623
+ const firstName = optionalString(value["first_name"]);
624
+ const lastName = optionalString(value["last_name"]);
625
+ const company = optionalString(value["company"]);
626
+ const email = optionalString(value["email"]);
627
+ const phone = optionalString(value["phone"]);
628
+ const currency = optionalString(value["currency"]);
629
+ const comment = optionalString(value["comment"]);
630
+ const referenceId = optionalString(value["reference_id"]);
631
+ const category = optionalString(value["category"]);
632
+ return {
633
+ id: value["id"],
634
+ ...name && { name },
635
+ ...firstName !== void 0 && { first_name: firstName },
636
+ ...lastName !== void 0 && { last_name: lastName },
637
+ ...company !== void 0 && { company },
638
+ ...email !== void 0 && { email },
639
+ ...phone !== void 0 && { phone },
640
+ ...currency && { currency },
641
+ ...comment !== void 0 && { comment },
642
+ ...referenceId !== void 0 && { reference_id: referenceId },
643
+ ...category !== void 0 && { category }
644
+ };
645
+ }
646
+ function parseSupplier(value) {
647
+ if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid supplier", { code: "upstream" });
648
+ const name = optionalString(value["name"]);
649
+ const email = optionalString(value["email"]);
650
+ const phone = optionalString(value["phone"]);
651
+ const currency = optionalString(value["currency"]);
652
+ const comment = optionalString(value["comment"]);
653
+ return {
654
+ id: value["id"],
655
+ ...name && { name },
656
+ ...email !== void 0 && { email },
657
+ ...phone !== void 0 && { phone },
658
+ ...currency && { currency },
659
+ ...comment !== void 0 && { comment }
660
+ };
661
+ }
662
+ function parsePurchaseOrder(value) {
663
+ if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid purchase order", { code: "upstream" });
664
+ const orderNo = optionalString(value["order_no"]);
665
+ const status = optionalString(value["status"]);
666
+ const supplierId = optionalNumber(value["supplier_id"]);
667
+ const locationId = optionalNumber(value["location_id"]);
668
+ const currency = optionalString(value["currency"]);
669
+ const entityType = optionalString(value["entity_type"]);
670
+ const orderCreatedDate = optionalString(value["order_created_date"]);
671
+ const expectedArrivalDate = optionalString(value["expected_arrival_date"]);
672
+ const total = optionalNumber(value["total"]);
673
+ const additionalInfo = optionalString(value["additional_info"]);
674
+ return {
675
+ id: value["id"],
676
+ ...orderNo && { order_no: orderNo },
677
+ ...status && { status },
678
+ ...supplierId !== void 0 && { supplier_id: supplierId },
679
+ ...locationId !== void 0 && { location_id: locationId },
680
+ ...currency && { currency },
681
+ ...entityType && { entity_type: entityType },
682
+ ...orderCreatedDate && { order_created_date: orderCreatedDate },
683
+ ...expectedArrivalDate && { expected_arrival_date: expectedArrivalDate },
684
+ ...total !== void 0 && { total },
685
+ ...additionalInfo !== void 0 && { additional_info: additionalInfo }
686
+ };
687
+ }
688
+ function parseManufacturingOrder(value) {
689
+ if (!isPlainObject(value) || typeof value["id"] !== "number") throw new ToolError("Katana returned an invalid manufacturing order", { code: "upstream" });
690
+ const orderNo = optionalString(value["order_no"]);
691
+ const status = optionalString(value["status"]);
692
+ const variantId = optionalNumber(value["variant_id"]);
693
+ const locationId = optionalNumber(value["location_id"]);
694
+ const plannedQuantity = optionalNumber(value["planned_quantity"]);
695
+ const actualQuantity = optionalNumber(value["actual_quantity"]);
696
+ const orderCreatedDate = optionalString(value["order_created_date"]);
697
+ const productionDeadlineDate = optionalString(value["production_deadline_date"]);
698
+ const ingredientAvailability = optionalString(value["ingredient_availability"]);
699
+ const additionalInfo = optionalString(value["additional_info"]);
700
+ const salesOrderId = optionalNumber(value["sales_order_id"]);
701
+ return {
702
+ id: value["id"],
703
+ ...orderNo && { order_no: orderNo },
704
+ ...status && { status },
705
+ ...variantId !== void 0 && { variant_id: variantId },
706
+ ...locationId !== void 0 && { location_id: locationId },
707
+ ...plannedQuantity !== void 0 && { planned_quantity: plannedQuantity },
708
+ ...actualQuantity !== void 0 && { actual_quantity: actualQuantity },
709
+ ...orderCreatedDate && { order_created_date: orderCreatedDate },
710
+ ...productionDeadlineDate && { production_deadline_date: productionDeadlineDate },
711
+ ...ingredientAvailability && { ingredient_availability: ingredientAvailability },
712
+ ...additionalInfo !== void 0 && { additional_info: additionalInfo },
713
+ ...salesOrderId !== void 0 && { sales_order_id: salesOrderId }
714
+ };
715
+ }
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" });
718
+ const quantityInStock = optionalNumber(value["quantity_in_stock"]);
719
+ const quantityCommitted = optionalNumber(value["quantity_committed"]);
720
+ const quantityExpected = optionalNumber(value["quantity_expected"]);
721
+ const quantityMissingOrExcess = optionalNumber(value["quantity_missing_or_excess"]);
722
+ const safetyStockLevel = optionalNumber(value["safety_stock_level"]);
723
+ const averageCost = optionalNumber(value["average_cost"]);
724
+ const valueInStock = optionalNumber(value["value_in_stock"]);
725
+ return {
726
+ variant_id: value["variant_id"],
727
+ location_id: value["location_id"],
728
+ ...quantityInStock !== void 0 && { quantity_in_stock: quantityInStock },
729
+ ...quantityCommitted !== void 0 && { quantity_committed: quantityCommitted },
730
+ ...quantityExpected !== void 0 && { quantity_expected: quantityExpected },
731
+ ...quantityMissingOrExcess !== void 0 && { quantity_missing_or_excess: quantityMissingOrExcess },
732
+ ...safetyStockLevel !== void 0 && { safety_stock_level: safetyStockLevel },
733
+ ...averageCost !== void 0 && { average_cost: averageCost },
734
+ ...valueInStock !== void 0 && { value_in_stock: valueInStock }
735
+ };
736
+ }
737
+ function salesOrderRowBody(row) {
738
+ return {
739
+ quantity: row.quantity,
740
+ variant_id: row.variant_id,
741
+ ...row.tax_rate_id !== void 0 && { tax_rate_id: row.tax_rate_id },
742
+ ...row.location_id !== void 0 && { location_id: row.location_id },
743
+ ...row.price_per_unit !== void 0 && { price_per_unit: row.price_per_unit },
744
+ ...row.total_discount !== void 0 && { total_discount: row.total_discount }
745
+ };
746
+ }
747
+ function salesOrderCreateBody(input) {
748
+ return {
749
+ customer_id: input.customer_id,
750
+ sales_order_rows: input.sales_order_rows.map(salesOrderRowBody),
751
+ ...input.order_no && { order_no: input.order_no },
752
+ ...input.order_created_date && { order_created_date: input.order_created_date },
753
+ ...input.delivery_date && { delivery_date: input.delivery_date },
754
+ ...input.currency && { currency: input.currency },
755
+ ...input.location_id !== void 0 && { location_id: input.location_id },
756
+ ...input.status && { status: input.status },
757
+ ...input.additional_info !== void 0 && { additional_info: input.additional_info },
758
+ ...input.customer_ref !== void 0 && { customer_ref: input.customer_ref }
759
+ };
760
+ }
761
+ function salesOrderUpdateBody(input) {
762
+ return {
763
+ ...input.order_no && { order_no: input.order_no },
764
+ ...input.customer_id !== void 0 && { customer_id: input.customer_id },
765
+ ...input.order_created_date && { order_created_date: input.order_created_date },
766
+ ...input.delivery_date && { delivery_date: input.delivery_date },
767
+ ...input.location_id !== void 0 && { location_id: input.location_id },
768
+ ...input.status && { status: input.status },
769
+ ...input.currency && { currency: input.currency },
770
+ ...input.additional_info !== void 0 && { additional_info: input.additional_info },
771
+ ...input.customer_ref !== void 0 && { customer_ref: input.customer_ref }
772
+ };
773
+ }
774
+ function productVariantBody(variant) {
775
+ return {
776
+ ...variant.sku && { sku: variant.sku },
777
+ ...variant.sales_price !== void 0 && { sales_price: variant.sales_price },
778
+ ...variant.purchase_price !== void 0 && { purchase_price: variant.purchase_price }
779
+ };
780
+ }
781
+ function productCreateBody(input) {
782
+ return {
783
+ name: input.name,
784
+ variants: input.variants.map(productVariantBody),
785
+ ...input.uom && { uom: input.uom },
786
+ ...input.category_name && { category_name: input.category_name },
787
+ ...input.is_sellable !== void 0 && { is_sellable: input.is_sellable },
788
+ ...input.is_producible !== void 0 && { is_producible: input.is_producible },
789
+ ...input.is_purchasable !== void 0 && { is_purchasable: input.is_purchasable },
790
+ ...input.is_auto_assembly !== void 0 && { is_auto_assembly: input.is_auto_assembly },
791
+ ...input.default_supplier_id !== void 0 && { default_supplier_id: input.default_supplier_id },
792
+ ...input.additional_info !== void 0 && { additional_info: input.additional_info },
793
+ ...input.batch_tracked !== void 0 && { batch_tracked: input.batch_tracked },
794
+ ...input.serial_tracked !== void 0 && { serial_tracked: input.serial_tracked }
795
+ };
796
+ }
797
+ function productUpdateBody(input) {
798
+ return {
799
+ ...input.name && { name: input.name },
800
+ ...input.uom && { uom: input.uom },
801
+ ...input.category_name !== void 0 && { category_name: input.category_name },
802
+ ...input.is_sellable !== void 0 && { is_sellable: input.is_sellable },
803
+ ...input.is_producible !== void 0 && { is_producible: input.is_producible },
804
+ ...input.is_purchasable !== void 0 && { is_purchasable: input.is_purchasable },
805
+ ...input.is_auto_assembly !== void 0 && { is_auto_assembly: input.is_auto_assembly },
806
+ ...input.default_supplier_id !== void 0 && { default_supplier_id: input.default_supplier_id },
807
+ ...input.additional_info !== void 0 && { additional_info: input.additional_info },
808
+ ...input.batch_tracked !== void 0 && { batch_tracked: input.batch_tracked },
809
+ ...input.serial_tracked !== void 0 && { serial_tracked: input.serial_tracked }
810
+ };
811
+ }
812
+ function customerWriteBody(input) {
813
+ const name = "name" in input ? input.name : void 0;
814
+ return {
815
+ ...name && { name },
816
+ ...input.first_name !== void 0 && { first_name: input.first_name },
817
+ ...input.last_name !== void 0 && { last_name: input.last_name },
818
+ ...input.company !== void 0 && { company: input.company },
819
+ ...input.email !== void 0 && { email: input.email },
820
+ ...input.phone !== void 0 && { phone: input.phone },
821
+ ...input.currency && { currency: input.currency },
822
+ ...input.reference_id !== void 0 && { reference_id: input.reference_id },
823
+ ...input.category !== void 0 && { category: input.category },
824
+ ...input.comment !== void 0 && { comment: input.comment },
825
+ ...input.discount_rate !== void 0 && { discount_rate: input.discount_rate }
826
+ };
827
+ }
828
+ function supplierCreateBody(input) {
829
+ return {
830
+ name: input.name,
831
+ ...input.currency && { currency: input.currency },
832
+ ...input.email !== void 0 && { email: input.email },
833
+ ...input.phone !== void 0 && { phone: input.phone },
834
+ ...input.comment !== void 0 && { comment: input.comment }
835
+ };
836
+ }
837
+ function purchaseOrderRowBody(row) {
838
+ return {
839
+ quantity: row.quantity,
840
+ variant_id: row.variant_id,
841
+ price_per_unit: row.price_per_unit,
842
+ ...row.tax_rate_id !== void 0 && { tax_rate_id: row.tax_rate_id },
843
+ ...row.purchase_uom && { purchase_uom: row.purchase_uom },
844
+ ...row.purchase_uom_conversion_rate !== void 0 && { purchase_uom_conversion_rate: row.purchase_uom_conversion_rate },
845
+ ...row.arrival_date && { arrival_date: row.arrival_date }
846
+ };
847
+ }
848
+ function purchaseOrderCreateBody(input) {
849
+ return {
850
+ supplier_id: input.supplier_id,
851
+ location_id: input.location_id,
852
+ purchase_order_rows: input.purchase_order_rows.map(purchaseOrderRowBody),
853
+ ...input.order_no && { order_no: input.order_no },
854
+ ...input.entity_type && { entity_type: input.entity_type },
855
+ ...input.currency && { currency: input.currency },
856
+ ...input.status && { status: input.status },
857
+ ...input.expected_arrival_date && { expected_arrival_date: input.expected_arrival_date },
858
+ ...input.order_created_date && { order_created_date: input.order_created_date },
859
+ ...input.additional_info !== void 0 && { additional_info: input.additional_info }
860
+ };
861
+ }
862
+ function purchaseOrderUpdateBody(input) {
863
+ return {
864
+ ...input.order_no && { order_no: input.order_no },
865
+ ...input.supplier_id !== void 0 && { supplier_id: input.supplier_id },
866
+ ...input.location_id !== void 0 && { location_id: input.location_id },
867
+ ...input.currency && { currency: input.currency },
868
+ ...input.status && { status: input.status },
869
+ ...input.expected_arrival_date && { expected_arrival_date: input.expected_arrival_date },
870
+ ...input.order_created_date && { order_created_date: input.order_created_date },
871
+ ...input.additional_info !== void 0 && { additional_info: input.additional_info }
872
+ };
873
+ }
874
+ function manufacturingOrderCreateBody(input) {
875
+ return {
876
+ variant_id: input.variant_id,
877
+ location_id: input.location_id,
878
+ planned_quantity: input.planned_quantity,
879
+ ...input.order_no && { order_no: input.order_no },
880
+ ...input.order_created_date && { order_created_date: input.order_created_date },
881
+ ...input.production_deadline_date && { production_deadline_date: input.production_deadline_date },
882
+ ...input.additional_info !== void 0 && { additional_info: input.additional_info },
883
+ ...input.status && { status: input.status }
884
+ };
885
+ }
886
+ function manufacturingOrderUpdateBody(input) {
887
+ return {
888
+ ...input.order_no && { order_no: input.order_no },
889
+ ...input.planned_quantity !== void 0 && { planned_quantity: input.planned_quantity },
890
+ ...input.actual_quantity !== void 0 && { actual_quantity: input.actual_quantity },
891
+ ...input.order_created_date && { order_created_date: input.order_created_date },
892
+ ...input.production_deadline_date && { production_deadline_date: input.production_deadline_date },
893
+ ...input.additional_info !== void 0 && { additional_info: input.additional_info },
894
+ ...input.status && { status: input.status }
895
+ };
896
+ }
897
+ //#endregion
898
+ //#region src/vendors/katana/client.ts
899
+ /**
900
+ * Katana MRP vendor client.
901
+ * Host: `new KatanaClient(auth)`. Agent tools: `fromContext(ctx)`.
902
+ */
903
+ var KatanaClient = class KatanaClient {
904
+ #http;
905
+ constructor(auth, options = {}) {
906
+ const parsed = katanaAuthSchema.safeParse(auth);
907
+ if (!parsed.success) throw new ToolError("Invalid Katana auth credentials", {
908
+ code: "bad_auth",
909
+ details: { issues: parsed.error.issues.map((issue) => issue.message) }
910
+ });
911
+ this.#http = new HttpService({
912
+ ...options,
913
+ baseURL: KATANA_API_BASE,
914
+ headers: {
915
+ Authorization: `Bearer ${parsed.data.api_key}`,
916
+ "Content-Type": "application/json"
917
+ },
918
+ label: "Katana"
919
+ });
920
+ }
921
+ static fromContext(ctx) {
922
+ const auth = requireAuth(ctx, katanaAuthSchema);
923
+ return new KatanaClient(auth, {
924
+ ...ctx.fetch && { fetch: ctx.fetch },
925
+ ...ctx.signal && { signal: ctx.signal }
926
+ });
927
+ }
928
+ /** GET /sales_orders */
929
+ async listSalesOrders(input = {}) {
930
+ 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
+ }
942
+ });
943
+ const parsed = parseListEnvelope(data, parseSalesOrder, "sales orders");
944
+ const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
945
+ return {
946
+ items: parsed.items,
947
+ truncated: pageMeta.truncated,
948
+ ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
949
+ };
950
+ }
951
+ /** GET /sales_orders/{id} */
952
+ async getSalesOrder(input) {
953
+ const { data } = await this.#http.get(`/sales_orders/${input.sales_order_id}`, { label: "Katana getSalesOrder" });
954
+ return { sales_order: parseSalesOrder(unwrapResource(data)) };
955
+ }
956
+ /** POST /sales_orders */
957
+ async createSalesOrder(input) {
958
+ const { data } = await this.#http.post("/sales_orders", salesOrderCreateBody(input), { label: "Katana createSalesOrder" });
959
+ return { sales_order: parseSalesOrder(unwrapResource(data)) };
960
+ }
961
+ /** PATCH /sales_orders/{id} */
962
+ async updateSalesOrder(input) {
963
+ const { sales_order_id, ...fields } = input;
964
+ const { data } = await this.#http.patch(`/sales_orders/${sales_order_id}`, salesOrderUpdateBody(fields), { label: "Katana updateSalesOrder" });
965
+ return { sales_order: parseSalesOrder(unwrapResource(data)) };
966
+ }
967
+ /** DELETE /sales_orders/{id} */
968
+ async deleteSalesOrder(input) {
969
+ await this.#http.delete(`/sales_orders/${input.sales_order_id}`, { label: "Katana deleteSalesOrder" });
970
+ return {
971
+ deleted: true,
972
+ id: input.sales_order_id
973
+ };
974
+ }
975
+ /**
976
+ * Composite sales-order query for reporting/reconciliation.
977
+ * Multi-scope × multi-status sequential pagination, dedupe by id, customer + row enrichment.
978
+ *
979
+ * API spike (GET /sales_orders): created_at_min/max, single status, customer_id, location_id.
980
+ * order_created_date ranges are client-side (no list filter). Rows via GET /sales_order_rows
981
+ * with sales_order_ids + extend=variant.
982
+ */
983
+ async querySalesOrders(input) {
984
+ const maxPages = input.max_pages_per_list ?? 20;
985
+ const pageSize = input.page_size ?? 50;
986
+ const byId = /* @__PURE__ */ new Map();
987
+ for (const scope of input.scopes) {
988
+ const statuses = scope.statuses && scope.statuses.length > 0 ? scope.statuses : [void 0];
989
+ const dateQuery = salesOrderListDateQuery(scope);
990
+ for (const status of statuses) {
991
+ let cursor;
992
+ for (let page = 0; page < maxPages; page += 1) {
993
+ 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
+ }
1004
+ });
1005
+ const parsed = parseListEnvelope(data, parseSalesOrder, "sales orders");
1006
+ for (const order of parsed.items) {
1007
+ if (byId.has(order.id)) continue;
1008
+ 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;
1010
+ byId.set(order.id, {
1011
+ ...order,
1012
+ ...rawCreated && { created_at: rawCreated }
1013
+ });
1014
+ }
1015
+ const pageMeta = listPageMeta(pageNum, pageSize, parsed.items.length, parsed.totalPages);
1016
+ if (!pageMeta.next_cursor) break;
1017
+ cursor = pageMeta.next_cursor;
1018
+ }
1019
+ }
1020
+ }
1021
+ const orderIds = [...byId.keys()];
1022
+ const customerCache = /* @__PURE__ */ new Map();
1023
+ const rowsByOrder = /* @__PURE__ */ new Map();
1024
+ const chunkSize = 50;
1025
+ for (let i = 0; i < orderIds.length; i += chunkSize) {
1026
+ const chunk = orderIds.slice(i, i + chunkSize);
1027
+ const rows = await this.#listSalesOrderRowsForOrders(chunk);
1028
+ for (const row of rows) {
1029
+ const list = rowsByOrder.get(row.sales_order_id) ?? [];
1030
+ list.push(row);
1031
+ rowsByOrder.set(row.sales_order_id, list);
1032
+ }
1033
+ }
1034
+ for (const order of byId.values()) {
1035
+ if (order.customer_id === void 0 || customerCache.has(order.customer_id)) continue;
1036
+ try {
1037
+ const { customer } = await this.getCustomer({ customer_id: order.customer_id });
1038
+ const combined = [customer.first_name, customer.last_name].filter(Boolean).join(" ");
1039
+ const name = customer.name ?? (combined.length > 0 ? combined : void 0) ?? customer.company;
1040
+ customerCache.set(order.customer_id, name && name.length > 0 ? name : void 0);
1041
+ } catch {
1042
+ customerCache.set(order.customer_id, void 0);
1043
+ }
1044
+ }
1045
+ const orders = orderIds.map((id) => {
1046
+ const order = byId.get(id);
1047
+ if (!order) throw new ToolError("Internal order map missing id", { code: "internal" });
1048
+ const rows = normalizeSalesOrderRow(rowsByOrder.get(id) ?? []);
1049
+ return normalizeSalesOrderHeader(order, order.customer_id !== void 0 ? customerCache.get(order.customer_id) : void 0, rows);
1050
+ });
1051
+ return {
1052
+ orders,
1053
+ order_count: orders.length
1054
+ };
1055
+ }
1056
+ async #listSalesOrderRowsForOrders(salesOrderIds) {
1057
+ if (salesOrderIds.length === 0) return [];
1058
+ const pageSize = 250;
1059
+ const out = [];
1060
+ let cursor;
1061
+ for (let page = 0; page < 100; page += 1) {
1062
+ const pageNum = pageFromCursor(cursor);
1063
+ const { data } = await this.#http.get("/sales_order_rows", {
1064
+ label: "Katana listSalesOrderRows",
1065
+ query: {
1066
+ page: pageNum,
1067
+ limit: pageSize,
1068
+ sales_order_ids: salesOrderIds.join(","),
1069
+ extend: "variant"
1070
+ }
1071
+ });
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;
1077
+ }
1078
+ return out;
1079
+ }
1080
+ /** GET /products */
1081
+ async listProducts(input = {}) {
1082
+ 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
+ }
1094
+ });
1095
+ const parsed = parseListEnvelope(data, parseProduct, "products");
1096
+ const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1097
+ return {
1098
+ items: parsed.items,
1099
+ truncated: pageMeta.truncated,
1100
+ ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1101
+ };
1102
+ }
1103
+ /** GET /products/{id} */
1104
+ async getProduct(input) {
1105
+ const { data } = await this.#http.get(`/products/${input.product_id}`, { label: "Katana getProduct" });
1106
+ return { product: parseProduct(unwrapResource(data)) };
1107
+ }
1108
+ /** POST /products */
1109
+ async createProduct(input) {
1110
+ const { data } = await this.#http.post("/products", productCreateBody(input), { label: "Katana createProduct" });
1111
+ return { product: parseProduct(unwrapResource(data)) };
1112
+ }
1113
+ /** PATCH /products/{id} */
1114
+ async updateProduct(input) {
1115
+ const { product_id, ...fields } = input;
1116
+ const { data } = await this.#http.patch(`/products/${product_id}`, productUpdateBody(fields), { label: "Katana updateProduct" });
1117
+ return { product: parseProduct(unwrapResource(data)) };
1118
+ }
1119
+ /** GET /materials */
1120
+ async listMaterials(input = {}) {
1121
+ 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
+ }
1130
+ });
1131
+ const parsed = parseListEnvelope(data, parseMaterial, "materials");
1132
+ const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1133
+ return {
1134
+ items: parsed.items,
1135
+ truncated: pageMeta.truncated,
1136
+ ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1137
+ };
1138
+ }
1139
+ /** GET /materials/{id} */
1140
+ async getMaterial(input) {
1141
+ const { data } = await this.#http.get(`/materials/${input.material_id}`, { label: "Katana getMaterial" });
1142
+ return { material: parseMaterial(unwrapResource(data)) };
1143
+ }
1144
+ /** GET /customers */
1145
+ async listCustomers(input = {}) {
1146
+ 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
+ }
1156
+ });
1157
+ const parsed = parseListEnvelope(data, parseCustomer, "customers");
1158
+ const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1159
+ return {
1160
+ items: parsed.items,
1161
+ truncated: pageMeta.truncated,
1162
+ ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1163
+ };
1164
+ }
1165
+ /** GET /customers/{id} */
1166
+ async getCustomer(input) {
1167
+ const { data } = await this.#http.get(`/customers/${input.customer_id}`, { label: "Katana getCustomer" });
1168
+ return { customer: parseCustomer(unwrapResource(data)) };
1169
+ }
1170
+ /** POST /customers */
1171
+ async createCustomer(input) {
1172
+ const { data } = await this.#http.post("/customers", customerWriteBody(input), { label: "Katana createCustomer" });
1173
+ return { customer: parseCustomer(unwrapResource(data)) };
1174
+ }
1175
+ /** PATCH /customers/{id} */
1176
+ async updateCustomer(input) {
1177
+ const { customer_id, ...fields } = input;
1178
+ const { data } = await this.#http.patch(`/customers/${customer_id}`, customerWriteBody(fields), { label: "Katana updateCustomer" });
1179
+ return { customer: parseCustomer(unwrapResource(data)) };
1180
+ }
1181
+ /** GET /suppliers */
1182
+ async listSuppliers(input = {}) {
1183
+ 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
+ }
1192
+ });
1193
+ const parsed = parseListEnvelope(data, parseSupplier, "suppliers");
1194
+ const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1195
+ return {
1196
+ items: parsed.items,
1197
+ truncated: pageMeta.truncated,
1198
+ ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1199
+ };
1200
+ }
1201
+ /** GET /suppliers/{id} */
1202
+ async getSupplier(input) {
1203
+ const { data } = await this.#http.get(`/suppliers/${input.supplier_id}`, { label: "Katana getSupplier" });
1204
+ return { supplier: parseSupplier(unwrapResource(data)) };
1205
+ }
1206
+ /** POST /suppliers */
1207
+ async createSupplier(input) {
1208
+ const { data } = await this.#http.post("/suppliers", supplierCreateBody(input), { label: "Katana createSupplier" });
1209
+ return { supplier: parseSupplier(unwrapResource(data)) };
1210
+ }
1211
+ /** GET /purchase_orders */
1212
+ async listPurchaseOrders(input = {}) {
1213
+ 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
+ }
1225
+ });
1226
+ const parsed = parseListEnvelope(data, parsePurchaseOrder, "purchase orders");
1227
+ const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1228
+ return {
1229
+ items: parsed.items,
1230
+ truncated: pageMeta.truncated,
1231
+ ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1232
+ };
1233
+ }
1234
+ /** GET /purchase_orders/{id} */
1235
+ async getPurchaseOrder(input) {
1236
+ const { data } = await this.#http.get(`/purchase_orders/${input.purchase_order_id}`, { label: "Katana getPurchaseOrder" });
1237
+ return { purchase_order: parsePurchaseOrder(unwrapResource(data)) };
1238
+ }
1239
+ /** POST /purchase_orders */
1240
+ async createPurchaseOrder(input) {
1241
+ const { data } = await this.#http.post("/purchase_orders", purchaseOrderCreateBody(input), { label: "Katana createPurchaseOrder" });
1242
+ return { purchase_order: parsePurchaseOrder(unwrapResource(data)) };
1243
+ }
1244
+ /** PATCH /purchase_orders/{id} */
1245
+ async updatePurchaseOrder(input) {
1246
+ const { purchase_order_id, ...fields } = input;
1247
+ const { data } = await this.#http.patch(`/purchase_orders/${purchase_order_id}`, purchaseOrderUpdateBody(fields), { label: "Katana updatePurchaseOrder" });
1248
+ return { purchase_order: parsePurchaseOrder(unwrapResource(data)) };
1249
+ }
1250
+ /** GET /manufacturing_orders */
1251
+ async listManufacturingOrders(input = {}) {
1252
+ 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
+ }
1264
+ });
1265
+ const parsed = parseListEnvelope(data, parseManufacturingOrder, "manufacturing orders");
1266
+ const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1267
+ return {
1268
+ items: parsed.items,
1269
+ truncated: pageMeta.truncated,
1270
+ ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1271
+ };
1272
+ }
1273
+ /** GET /manufacturing_orders/{id} */
1274
+ async getManufacturingOrder(input) {
1275
+ const { data } = await this.#http.get(`/manufacturing_orders/${input.manufacturing_order_id}`, { label: "Katana getManufacturingOrder" });
1276
+ return { manufacturing_order: parseManufacturingOrder(unwrapResource(data)) };
1277
+ }
1278
+ /** POST /manufacturing_orders */
1279
+ async createManufacturingOrder(input) {
1280
+ const { data } = await this.#http.post("/manufacturing_orders", manufacturingOrderCreateBody(input), { label: "Katana createManufacturingOrder" });
1281
+ return { manufacturing_order: parseManufacturingOrder(unwrapResource(data)) };
1282
+ }
1283
+ /** PATCH /manufacturing_orders/{id} */
1284
+ async updateManufacturingOrder(input) {
1285
+ const { manufacturing_order_id, ...fields } = input;
1286
+ const { data } = await this.#http.patch(`/manufacturing_orders/${manufacturing_order_id}`, manufacturingOrderUpdateBody(fields), { label: "Katana updateManufacturingOrder" });
1287
+ return { manufacturing_order: parseManufacturingOrder(unwrapResource(data)) };
1288
+ }
1289
+ /** GET /inventory */
1290
+ async listInventory(input = {}) {
1291
+ 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
+ }
1301
+ });
1302
+ const parsed = parseListEnvelope(data, parseInventory, "inventory");
1303
+ const pageMeta = listPageMeta(page, limit, parsed.items.length, parsed.totalPages);
1304
+ return {
1305
+ items: parsed.items,
1306
+ truncated: pageMeta.truncated,
1307
+ ...pageMeta.next_cursor && { next_cursor: pageMeta.next_cursor }
1308
+ };
1309
+ }
1310
+ };
1311
+ //#endregion
1312
+ //#region src/vendors/katana/module.ts
1313
+ const katanaListSalesOrdersTool = defineTool({
1314
+ id: "katana-list-sales-orders",
1315
+ name: "katanaListSalesOrders",
1316
+ description: "List Katana MRP sales orders with optional status, customer, order number, and location filters. Paginate with cursor (page number).",
1317
+ inputSchema: katanaListSalesOrdersInputSchema,
1318
+ outputSchema: katanaListSalesOrdersOutputSchema,
1319
+ sideEffect: "read",
1320
+ runtime: "both",
1321
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).listSalesOrders(input)
1322
+ });
1323
+ const katanaGetSalesOrderTool = defineTool({
1324
+ id: "katana-get-sales-order",
1325
+ name: "katanaGetSalesOrder",
1326
+ description: "Get one Katana MRP sales order by numeric id.",
1327
+ inputSchema: katanaGetSalesOrderInputSchema,
1328
+ outputSchema: katanaGetSalesOrderOutputSchema,
1329
+ sideEffect: "read",
1330
+ runtime: "both",
1331
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).getSalesOrder(input)
1332
+ });
1333
+ const katanaCreateSalesOrderTool = defineTool({
1334
+ id: "katana-create-sales-order",
1335
+ name: "katanaCreateSalesOrder",
1336
+ description: "Create a Katana MRP sales order (customer_id and sales_order_rows required). Optional order number, dates, currency, location, and status.",
1337
+ inputSchema: katanaCreateSalesOrderInputSchema,
1338
+ outputSchema: katanaCreateSalesOrderOutputSchema,
1339
+ sideEffect: "write",
1340
+ runtime: "both",
1341
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).createSalesOrder(input)
1342
+ });
1343
+ const katanaUpdateSalesOrderTool = defineTool({
1344
+ id: "katana-update-sales-order",
1345
+ name: "katanaUpdateSalesOrder",
1346
+ description: "Update a Katana MRP sales order by id (status, customer, dates, location, currency, notes, reference).",
1347
+ inputSchema: katanaUpdateSalesOrderInputSchema,
1348
+ outputSchema: katanaUpdateSalesOrderOutputSchema,
1349
+ sideEffect: "write",
1350
+ runtime: "both",
1351
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).updateSalesOrder(input)
1352
+ });
1353
+ const katanaDeleteSalesOrderTool = defineTool({
1354
+ id: "katana-delete-sales-order",
1355
+ name: "katanaDeleteSalesOrder",
1356
+ description: "Delete a Katana MRP sales order by numeric id.",
1357
+ inputSchema: katanaDeleteSalesOrderInputSchema,
1358
+ outputSchema: katanaDeleteSalesOrderOutputSchema,
1359
+ sideEffect: "delete",
1360
+ runtime: "both",
1361
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).deleteSalesOrder(input)
1362
+ });
1363
+ const katanaQuerySalesOrdersTool = defineTool({
1364
+ id: "katana-query-sales-orders",
1365
+ name: "katanaQuerySalesOrders",
1366
+ description: "Composite Katana MRP sales-order query for reporting: multi-scope union (status × date windows), sequential page drain, dedupe by order id, customer name enrichment, and line rows with tax-exclusive revenue and COGS in integer cents. Use when list/get alone are not enough for reconciliation.",
1367
+ inputSchema: katanaQuerySalesOrdersInputSchema,
1368
+ outputSchema: katanaQuerySalesOrdersOutputSchema,
1369
+ sideEffect: "read",
1370
+ runtime: "both",
1371
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).querySalesOrders(input)
1372
+ });
1373
+ const katanaListProductsTool = defineTool({
1374
+ id: "katana-list-products",
1375
+ name: "katanaListProducts",
1376
+ description: "List Katana MRP products with optional name and sellable/producible/purchasable filters. Paginate with cursor.",
1377
+ inputSchema: katanaListProductsInputSchema,
1378
+ outputSchema: katanaListProductsOutputSchema,
1379
+ sideEffect: "read",
1380
+ runtime: "both",
1381
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).listProducts(input)
1382
+ });
1383
+ const katanaGetProductTool = defineTool({
1384
+ id: "katana-get-product",
1385
+ name: "katanaGetProduct",
1386
+ description: "Get one Katana MRP product by numeric id.",
1387
+ inputSchema: katanaGetProductInputSchema,
1388
+ outputSchema: katanaGetProductOutputSchema,
1389
+ sideEffect: "read",
1390
+ runtime: "both",
1391
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).getProduct(input)
1392
+ });
1393
+ const katanaCreateProductTool = defineTool({
1394
+ id: "katana-create-product",
1395
+ name: "katanaCreateProduct",
1396
+ description: "Create a Katana MRP product (name and variants required). Optional UoM, category, sellable/producible/purchasable flags.",
1397
+ inputSchema: katanaCreateProductInputSchema,
1398
+ outputSchema: katanaCreateProductOutputSchema,
1399
+ sideEffect: "write",
1400
+ runtime: "both",
1401
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).createProduct(input)
1402
+ });
1403
+ const katanaUpdateProductTool = defineTool({
1404
+ id: "katana-update-product",
1405
+ name: "katanaUpdateProduct",
1406
+ description: "Update a Katana MRP product by id (name, UoM, category, flags, supplier, notes).",
1407
+ inputSchema: katanaUpdateProductInputSchema,
1408
+ outputSchema: katanaUpdateProductOutputSchema,
1409
+ sideEffect: "write",
1410
+ runtime: "both",
1411
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).updateProduct(input)
1412
+ });
1413
+ const katanaListMaterialsTool = defineTool({
1414
+ id: "katana-list-materials",
1415
+ name: "katanaListMaterials",
1416
+ description: "List Katana MRP materials with optional name filter. Paginate with cursor.",
1417
+ inputSchema: katanaListMaterialsInputSchema,
1418
+ outputSchema: katanaListMaterialsOutputSchema,
1419
+ sideEffect: "read",
1420
+ runtime: "both",
1421
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).listMaterials(input)
1422
+ });
1423
+ const katanaGetMaterialTool = defineTool({
1424
+ id: "katana-get-material",
1425
+ name: "katanaGetMaterial",
1426
+ description: "Get one Katana MRP material by numeric id.",
1427
+ inputSchema: katanaGetMaterialInputSchema,
1428
+ outputSchema: katanaGetMaterialOutputSchema,
1429
+ sideEffect: "read",
1430
+ runtime: "both",
1431
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).getMaterial(input)
1432
+ });
1433
+ const katanaListCustomersTool = defineTool({
1434
+ id: "katana-list-customers",
1435
+ name: "katanaListCustomers",
1436
+ description: "List Katana MRP customers with optional name and email filters. Paginate with cursor.",
1437
+ inputSchema: katanaListCustomersInputSchema,
1438
+ outputSchema: katanaListCustomersOutputSchema,
1439
+ sideEffect: "read",
1440
+ runtime: "both",
1441
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).listCustomers(input)
1442
+ });
1443
+ const katanaGetCustomerTool = defineTool({
1444
+ id: "katana-get-customer",
1445
+ name: "katanaGetCustomer",
1446
+ description: "Get one Katana MRP customer by numeric id.",
1447
+ inputSchema: katanaGetCustomerInputSchema,
1448
+ outputSchema: katanaGetCustomerOutputSchema,
1449
+ sideEffect: "read",
1450
+ runtime: "both",
1451
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).getCustomer(input)
1452
+ });
1453
+ const katanaCreateCustomerTool = defineTool({
1454
+ id: "katana-create-customer",
1455
+ name: "katanaCreateCustomer",
1456
+ description: "Create a Katana MRP customer (name required). Optional contact fields, currency, category, and discount.",
1457
+ inputSchema: katanaCreateCustomerInputSchema,
1458
+ outputSchema: katanaCreateCustomerOutputSchema,
1459
+ sideEffect: "write",
1460
+ runtime: "both",
1461
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).createCustomer(input)
1462
+ });
1463
+ const katanaUpdateCustomerTool = defineTool({
1464
+ id: "katana-update-customer",
1465
+ name: "katanaUpdateCustomer",
1466
+ description: "Update a Katana MRP customer by id (name, contact fields, currency, category, discount).",
1467
+ inputSchema: katanaUpdateCustomerInputSchema,
1468
+ outputSchema: katanaUpdateCustomerOutputSchema,
1469
+ sideEffect: "write",
1470
+ runtime: "both",
1471
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).updateCustomer(input)
1472
+ });
1473
+ const katanaListSuppliersTool = defineTool({
1474
+ id: "katana-list-suppliers",
1475
+ name: "katanaListSuppliers",
1476
+ description: "List Katana MRP suppliers with optional name filter. Paginate with cursor.",
1477
+ inputSchema: katanaListSuppliersInputSchema,
1478
+ outputSchema: katanaListSuppliersOutputSchema,
1479
+ sideEffect: "read",
1480
+ runtime: "both",
1481
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).listSuppliers(input)
1482
+ });
1483
+ const katanaGetSupplierTool = defineTool({
1484
+ id: "katana-get-supplier",
1485
+ name: "katanaGetSupplier",
1486
+ description: "Get one Katana MRP supplier by numeric id.",
1487
+ inputSchema: katanaGetSupplierInputSchema,
1488
+ outputSchema: katanaGetSupplierOutputSchema,
1489
+ sideEffect: "read",
1490
+ runtime: "both",
1491
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).getSupplier(input)
1492
+ });
1493
+ const katanaCreateSupplierTool = defineTool({
1494
+ id: "katana-create-supplier",
1495
+ name: "katanaCreateSupplier",
1496
+ description: "Create a Katana MRP supplier (name required). Optional currency, email, phone, and comment.",
1497
+ inputSchema: katanaCreateSupplierInputSchema,
1498
+ outputSchema: katanaCreateSupplierOutputSchema,
1499
+ sideEffect: "write",
1500
+ runtime: "both",
1501
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).createSupplier(input)
1502
+ });
1503
+ const katanaListPurchaseOrdersTool = defineTool({
1504
+ id: "katana-list-purchase-orders",
1505
+ name: "katanaListPurchaseOrders",
1506
+ description: "List Katana MRP purchase orders with optional status, supplier, order number, and location filters. Paginate with cursor.",
1507
+ inputSchema: katanaListPurchaseOrdersInputSchema,
1508
+ outputSchema: katanaListPurchaseOrdersOutputSchema,
1509
+ sideEffect: "read",
1510
+ runtime: "both",
1511
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).listPurchaseOrders(input)
1512
+ });
1513
+ const katanaGetPurchaseOrderTool = defineTool({
1514
+ id: "katana-get-purchase-order",
1515
+ name: "katanaGetPurchaseOrder",
1516
+ description: "Get one Katana MRP purchase order by numeric id.",
1517
+ inputSchema: katanaGetPurchaseOrderInputSchema,
1518
+ outputSchema: katanaGetPurchaseOrderOutputSchema,
1519
+ sideEffect: "read",
1520
+ runtime: "both",
1521
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).getPurchaseOrder(input)
1522
+ });
1523
+ const katanaCreatePurchaseOrderTool = defineTool({
1524
+ id: "katana-create-purchase-order",
1525
+ name: "katanaCreatePurchaseOrder",
1526
+ description: "Create a Katana MRP purchase order (supplier_id, location_id, and purchase_order_rows required).",
1527
+ inputSchema: katanaCreatePurchaseOrderInputSchema,
1528
+ outputSchema: katanaCreatePurchaseOrderOutputSchema,
1529
+ sideEffect: "write",
1530
+ runtime: "both",
1531
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).createPurchaseOrder(input)
1532
+ });
1533
+ const katanaUpdatePurchaseOrderTool = defineTool({
1534
+ id: "katana-update-purchase-order",
1535
+ name: "katanaUpdatePurchaseOrder",
1536
+ description: "Update a Katana MRP purchase order by id (status, supplier, location, dates, currency, notes).",
1537
+ inputSchema: katanaUpdatePurchaseOrderInputSchema,
1538
+ outputSchema: katanaUpdatePurchaseOrderOutputSchema,
1539
+ sideEffect: "write",
1540
+ runtime: "both",
1541
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).updatePurchaseOrder(input)
1542
+ });
1543
+ const katanaListManufacturingOrdersTool = defineTool({
1544
+ id: "katana-list-manufacturing-orders",
1545
+ name: "katanaListManufacturingOrders",
1546
+ description: "List Katana MRP manufacturing orders with optional status, variant, location, and order number filters. Paginate with cursor.",
1547
+ inputSchema: katanaListManufacturingOrdersInputSchema,
1548
+ outputSchema: katanaListManufacturingOrdersOutputSchema,
1549
+ sideEffect: "read",
1550
+ runtime: "both",
1551
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).listManufacturingOrders(input)
1552
+ });
1553
+ const katanaGetManufacturingOrderTool = defineTool({
1554
+ id: "katana-get-manufacturing-order",
1555
+ name: "katanaGetManufacturingOrder",
1556
+ description: "Get one Katana MRP manufacturing order by numeric id.",
1557
+ inputSchema: katanaGetManufacturingOrderInputSchema,
1558
+ outputSchema: katanaGetManufacturingOrderOutputSchema,
1559
+ sideEffect: "read",
1560
+ runtime: "both",
1561
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).getManufacturingOrder(input)
1562
+ });
1563
+ const katanaCreateManufacturingOrderTool = defineTool({
1564
+ id: "katana-create-manufacturing-order",
1565
+ name: "katanaCreateManufacturingOrder",
1566
+ description: "Create a Katana MRP manufacturing order (variant_id, location_id, and planned_quantity required). Recipe and operations are generated from the product.",
1567
+ inputSchema: katanaCreateManufacturingOrderInputSchema,
1568
+ outputSchema: katanaCreateManufacturingOrderOutputSchema,
1569
+ sideEffect: "write",
1570
+ runtime: "both",
1571
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).createManufacturingOrder(input)
1572
+ });
1573
+ const katanaUpdateManufacturingOrderTool = defineTool({
1574
+ id: "katana-update-manufacturing-order",
1575
+ name: "katanaUpdateManufacturingOrder",
1576
+ description: "Update a Katana MRP manufacturing order by id (status, quantities, dates, notes, order number).",
1577
+ inputSchema: katanaUpdateManufacturingOrderInputSchema,
1578
+ outputSchema: katanaUpdateManufacturingOrderOutputSchema,
1579
+ sideEffect: "write",
1580
+ runtime: "both",
1581
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).updateManufacturingOrder(input)
1582
+ });
1583
+ const katanaListInventoryTool = defineTool({
1584
+ id: "katana-list-inventory",
1585
+ name: "katanaListInventory",
1586
+ description: "List current Katana MRP inventory levels by variant and location. Optional variant_id and location_id filters. Paginate with cursor.",
1587
+ inputSchema: katanaListInventoryInputSchema,
1588
+ outputSchema: katanaListInventoryOutputSchema,
1589
+ sideEffect: "read",
1590
+ runtime: "both",
1591
+ execute: async (input, ctx) => KatanaClient.fromContext(ctx).listInventory(input)
1592
+ });
1593
+ const katanaModule = defineModule({
1594
+ id: "katana",
1595
+ title: "Katana",
1596
+ description: "Katana MRP vendor pack: sales orders (including composite query for reporting), products, materials, customers, suppliers, purchase orders, manufacturing orders, and inventory.",
1597
+ runtime: "both",
1598
+ auth: {
1599
+ type: "custom",
1600
+ schema: katanaAuthSchema
1601
+ },
1602
+ categories: ["commerce", "inventory"],
1603
+ classification: "pii",
1604
+ tags: ["sales-orders"],
1605
+ tools: [
1606
+ katanaListSalesOrdersTool,
1607
+ katanaGetSalesOrderTool,
1608
+ katanaCreateSalesOrderTool,
1609
+ katanaUpdateSalesOrderTool,
1610
+ katanaDeleteSalesOrderTool,
1611
+ katanaQuerySalesOrdersTool,
1612
+ katanaListProductsTool,
1613
+ katanaGetProductTool,
1614
+ katanaCreateProductTool,
1615
+ katanaUpdateProductTool,
1616
+ katanaListMaterialsTool,
1617
+ katanaGetMaterialTool,
1618
+ katanaListCustomersTool,
1619
+ katanaGetCustomerTool,
1620
+ katanaCreateCustomerTool,
1621
+ katanaUpdateCustomerTool,
1622
+ katanaListSuppliersTool,
1623
+ katanaGetSupplierTool,
1624
+ katanaCreateSupplierTool,
1625
+ katanaListPurchaseOrdersTool,
1626
+ katanaGetPurchaseOrderTool,
1627
+ katanaCreatePurchaseOrderTool,
1628
+ katanaUpdatePurchaseOrderTool,
1629
+ katanaListManufacturingOrdersTool,
1630
+ katanaGetManufacturingOrderTool,
1631
+ katanaCreateManufacturingOrderTool,
1632
+ katanaUpdateManufacturingOrderTool,
1633
+ katanaListInventoryTool
1634
+ ]
1635
+ });
1636
+ //#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 };
1638
+
1639
+ //# sourceMappingURL=index.js.map