@energio/holded-mcp 1.0.0

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 (243) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1040 -0
  3. package/dist/constants.d.ts +60 -0
  4. package/dist/constants.d.ts.map +1 -0
  5. package/dist/constants.js +72 -0
  6. package/dist/constants.js.map +1 -0
  7. package/dist/index.d.ts +11 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +86 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/schemas/accounting/account-balances.d.ts +19 -0
  12. package/dist/schemas/accounting/account-balances.d.ts.map +1 -0
  13. package/dist/schemas/accounting/account-balances.js +28 -0
  14. package/dist/schemas/accounting/account-balances.js.map +1 -0
  15. package/dist/schemas/accounting/accounts.d.ts +49 -0
  16. package/dist/schemas/accounting/accounts.d.ts.map +1 -0
  17. package/dist/schemas/accounting/accounts.js +50 -0
  18. package/dist/schemas/accounting/accounts.js.map +1 -0
  19. package/dist/schemas/accounting/daily-ledger.d.ts +45 -0
  20. package/dist/schemas/accounting/daily-ledger.d.ts.map +1 -0
  21. package/dist/schemas/accounting/daily-ledger.js +57 -0
  22. package/dist/schemas/accounting/daily-ledger.js.map +1 -0
  23. package/dist/schemas/common.d.ts +118 -0
  24. package/dist/schemas/common.d.ts.map +1 -0
  25. package/dist/schemas/common.js +126 -0
  26. package/dist/schemas/common.js.map +1 -0
  27. package/dist/schemas/crm/bookings.d.ts +108 -0
  28. package/dist/schemas/crm/bookings.d.ts.map +1 -0
  29. package/dist/schemas/crm/bookings.js +96 -0
  30. package/dist/schemas/crm/bookings.js.map +1 -0
  31. package/dist/schemas/crm/events.d.ts +57 -0
  32. package/dist/schemas/crm/events.d.ts.map +1 -0
  33. package/dist/schemas/crm/events.js +53 -0
  34. package/dist/schemas/crm/events.js.map +1 -0
  35. package/dist/schemas/crm/funnels.d.ts +60 -0
  36. package/dist/schemas/crm/funnels.d.ts.map +1 -0
  37. package/dist/schemas/crm/funnels.js +48 -0
  38. package/dist/schemas/crm/funnels.js.map +1 -0
  39. package/dist/schemas/crm/leads.d.ts +146 -0
  40. package/dist/schemas/crm/leads.d.ts.map +1 -0
  41. package/dist/schemas/crm/leads.js +129 -0
  42. package/dist/schemas/crm/leads.js.map +1 -0
  43. package/dist/schemas/invoicing/contacts.d.ts +352 -0
  44. package/dist/schemas/invoicing/contacts.d.ts.map +1 -0
  45. package/dist/schemas/invoicing/contacts.js +187 -0
  46. package/dist/schemas/invoicing/contacts.js.map +1 -0
  47. package/dist/schemas/invoicing/documents.d.ts +424 -0
  48. package/dist/schemas/invoicing/documents.d.ts.map +1 -0
  49. package/dist/schemas/invoicing/documents.js +217 -0
  50. package/dist/schemas/invoicing/documents.js.map +1 -0
  51. package/dist/schemas/invoicing/expenses-accounts.d.ts +47 -0
  52. package/dist/schemas/invoicing/expenses-accounts.d.ts.map +1 -0
  53. package/dist/schemas/invoicing/expenses-accounts.js +43 -0
  54. package/dist/schemas/invoicing/expenses-accounts.js.map +1 -0
  55. package/dist/schemas/invoicing/numbering-series.d.ts +94 -0
  56. package/dist/schemas/invoicing/numbering-series.d.ts.map +1 -0
  57. package/dist/schemas/invoicing/numbering-series.js +43 -0
  58. package/dist/schemas/invoicing/numbering-series.js.map +1 -0
  59. package/dist/schemas/invoicing/payments.d.ts +50 -0
  60. package/dist/schemas/invoicing/payments.d.ts.map +1 -0
  61. package/dist/schemas/invoicing/payments.js +46 -0
  62. package/dist/schemas/invoicing/payments.js.map +1 -0
  63. package/dist/schemas/invoicing/products.d.ts +176 -0
  64. package/dist/schemas/invoicing/products.d.ts.map +1 -0
  65. package/dist/schemas/invoicing/products.js +149 -0
  66. package/dist/schemas/invoicing/products.js.map +1 -0
  67. package/dist/schemas/invoicing/remittances.d.ts +21 -0
  68. package/dist/schemas/invoicing/remittances.d.ts.map +1 -0
  69. package/dist/schemas/invoicing/remittances.js +20 -0
  70. package/dist/schemas/invoicing/remittances.js.map +1 -0
  71. package/dist/schemas/invoicing/sales-channels.d.ts +45 -0
  72. package/dist/schemas/invoicing/sales-channels.d.ts.map +1 -0
  73. package/dist/schemas/invoicing/sales-channels.js +41 -0
  74. package/dist/schemas/invoicing/sales-channels.js.map +1 -0
  75. package/dist/schemas/invoicing/services.d.ts +55 -0
  76. package/dist/schemas/invoicing/services.d.ts.map +1 -0
  77. package/dist/schemas/invoicing/services.js +51 -0
  78. package/dist/schemas/invoicing/services.js.map +1 -0
  79. package/dist/schemas/invoicing/taxes.d.ts +12 -0
  80. package/dist/schemas/invoicing/taxes.d.ts.map +1 -0
  81. package/dist/schemas/invoicing/taxes.js +12 -0
  82. package/dist/schemas/invoicing/taxes.js.map +1 -0
  83. package/dist/schemas/invoicing/treasury.d.ts +42 -0
  84. package/dist/schemas/invoicing/treasury.d.ts.map +1 -0
  85. package/dist/schemas/invoicing/treasury.js +39 -0
  86. package/dist/schemas/invoicing/treasury.js.map +1 -0
  87. package/dist/schemas/invoicing/warehouses.d.ts +61 -0
  88. package/dist/schemas/invoicing/warehouses.d.ts.map +1 -0
  89. package/dist/schemas/invoicing/warehouses.js +43 -0
  90. package/dist/schemas/invoicing/warehouses.js.map +1 -0
  91. package/dist/schemas/projects/projects.d.ts +60 -0
  92. package/dist/schemas/projects/projects.d.ts.map +1 -0
  93. package/dist/schemas/projects/projects.js +55 -0
  94. package/dist/schemas/projects/projects.js.map +1 -0
  95. package/dist/schemas/projects/tasks.d.ts +68 -0
  96. package/dist/schemas/projects/tasks.d.ts.map +1 -0
  97. package/dist/schemas/projects/tasks.js +64 -0
  98. package/dist/schemas/projects/tasks.js.map +1 -0
  99. package/dist/schemas/projects/time-tracking.d.ts +80 -0
  100. package/dist/schemas/projects/time-tracking.d.ts.map +1 -0
  101. package/dist/schemas/projects/time-tracking.js +75 -0
  102. package/dist/schemas/projects/time-tracking.js.map +1 -0
  103. package/dist/schemas/team/employees.d.ts +135 -0
  104. package/dist/schemas/team/employees.d.ts.map +1 -0
  105. package/dist/schemas/team/employees.js +144 -0
  106. package/dist/schemas/team/employees.js.map +1 -0
  107. package/dist/schemas/team/time-tracking.d.ts +98 -0
  108. package/dist/schemas/team/time-tracking.d.ts.map +1 -0
  109. package/dist/schemas/team/time-tracking.js +89 -0
  110. package/dist/schemas/team/time-tracking.js.map +1 -0
  111. package/dist/services/api.d.ts +118 -0
  112. package/dist/services/api.d.ts.map +1 -0
  113. package/dist/services/api.js +441 -0
  114. package/dist/services/api.js.map +1 -0
  115. package/dist/tools/accounting/account-balances.d.ts +44 -0
  116. package/dist/tools/accounting/account-balances.d.ts.map +1 -0
  117. package/dist/tools/accounting/account-balances.js +240 -0
  118. package/dist/tools/accounting/account-balances.js.map +1 -0
  119. package/dist/tools/accounting/accounts.d.ts +18 -0
  120. package/dist/tools/accounting/accounts.d.ts.map +1 -0
  121. package/dist/tools/accounting/accounts.js +131 -0
  122. package/dist/tools/accounting/accounts.js.map +1 -0
  123. package/dist/tools/accounting/daily-ledger.d.ts +9 -0
  124. package/dist/tools/accounting/daily-ledger.d.ts.map +1 -0
  125. package/dist/tools/accounting/daily-ledger.js +117 -0
  126. package/dist/tools/accounting/daily-ledger.js.map +1 -0
  127. package/dist/tools/accounting/index.d.ts +9 -0
  128. package/dist/tools/accounting/index.d.ts.map +1 -0
  129. package/dist/tools/accounting/index.js +15 -0
  130. package/dist/tools/accounting/index.js.map +1 -0
  131. package/dist/tools/crm/bookings.d.ts +18 -0
  132. package/dist/tools/crm/bookings.d.ts.map +1 -0
  133. package/dist/tools/crm/bookings.js +272 -0
  134. package/dist/tools/crm/bookings.js.map +1 -0
  135. package/dist/tools/crm/events.d.ts +18 -0
  136. package/dist/tools/crm/events.d.ts.map +1 -0
  137. package/dist/tools/crm/events.js +134 -0
  138. package/dist/tools/crm/events.js.map +1 -0
  139. package/dist/tools/crm/funnels.d.ts +18 -0
  140. package/dist/tools/crm/funnels.d.ts.map +1 -0
  141. package/dist/tools/crm/funnels.js +113 -0
  142. package/dist/tools/crm/funnels.js.map +1 -0
  143. package/dist/tools/crm/index.d.ts +9 -0
  144. package/dist/tools/crm/index.d.ts.map +1 -0
  145. package/dist/tools/crm/index.js +17 -0
  146. package/dist/tools/crm/index.js.map +1 -0
  147. package/dist/tools/crm/leads.d.ts +18 -0
  148. package/dist/tools/crm/leads.d.ts.map +1 -0
  149. package/dist/tools/crm/leads.js +519 -0
  150. package/dist/tools/crm/leads.js.map +1 -0
  151. package/dist/tools/factory.d.ts +55 -0
  152. package/dist/tools/factory.d.ts.map +1 -0
  153. package/dist/tools/factory.js +145 -0
  154. package/dist/tools/factory.js.map +1 -0
  155. package/dist/tools/invoicing/contacts.d.ts +26 -0
  156. package/dist/tools/invoicing/contacts.d.ts.map +1 -0
  157. package/dist/tools/invoicing/contacts.js +358 -0
  158. package/dist/tools/invoicing/contacts.js.map +1 -0
  159. package/dist/tools/invoicing/documents.d.ts +18 -0
  160. package/dist/tools/invoicing/documents.d.ts.map +1 -0
  161. package/dist/tools/invoicing/documents.js +578 -0
  162. package/dist/tools/invoicing/documents.js.map +1 -0
  163. package/dist/tools/invoicing/expenses-accounts.d.ts +25 -0
  164. package/dist/tools/invoicing/expenses-accounts.d.ts.map +1 -0
  165. package/dist/tools/invoicing/expenses-accounts.js +111 -0
  166. package/dist/tools/invoicing/expenses-accounts.js.map +1 -0
  167. package/dist/tools/invoicing/index.d.ts +9 -0
  168. package/dist/tools/invoicing/index.d.ts.map +1 -0
  169. package/dist/tools/invoicing/index.js +33 -0
  170. package/dist/tools/invoicing/index.js.map +1 -0
  171. package/dist/tools/invoicing/numbering-series.d.ts +9 -0
  172. package/dist/tools/invoicing/numbering-series.d.ts.map +1 -0
  173. package/dist/tools/invoicing/numbering-series.js +161 -0
  174. package/dist/tools/invoicing/numbering-series.js.map +1 -0
  175. package/dist/tools/invoicing/payments.d.ts +18 -0
  176. package/dist/tools/invoicing/payments.d.ts.map +1 -0
  177. package/dist/tools/invoicing/payments.js +175 -0
  178. package/dist/tools/invoicing/payments.js.map +1 -0
  179. package/dist/tools/invoicing/products.d.ts +18 -0
  180. package/dist/tools/invoicing/products.d.ts.map +1 -0
  181. package/dist/tools/invoicing/products.js +389 -0
  182. package/dist/tools/invoicing/products.js.map +1 -0
  183. package/dist/tools/invoicing/remittances.d.ts +17 -0
  184. package/dist/tools/invoicing/remittances.d.ts.map +1 -0
  185. package/dist/tools/invoicing/remittances.js +76 -0
  186. package/dist/tools/invoicing/remittances.js.map +1 -0
  187. package/dist/tools/invoicing/sales-channels.d.ts +24 -0
  188. package/dist/tools/invoicing/sales-channels.d.ts.map +1 -0
  189. package/dist/tools/invoicing/sales-channels.js +105 -0
  190. package/dist/tools/invoicing/sales-channels.js.map +1 -0
  191. package/dist/tools/invoicing/services.d.ts +29 -0
  192. package/dist/tools/invoicing/services.d.ts.map +1 -0
  193. package/dist/tools/invoicing/services.js +124 -0
  194. package/dist/tools/invoicing/services.js.map +1 -0
  195. package/dist/tools/invoicing/taxes.d.ts +18 -0
  196. package/dist/tools/invoicing/taxes.d.ts.map +1 -0
  197. package/dist/tools/invoicing/taxes.js +58 -0
  198. package/dist/tools/invoicing/taxes.js.map +1 -0
  199. package/dist/tools/invoicing/treasury.d.ts +9 -0
  200. package/dist/tools/invoicing/treasury.d.ts.map +1 -0
  201. package/dist/tools/invoicing/treasury.js +196 -0
  202. package/dist/tools/invoicing/treasury.js.map +1 -0
  203. package/dist/tools/invoicing/warehouses.d.ts +18 -0
  204. package/dist/tools/invoicing/warehouses.d.ts.map +1 -0
  205. package/dist/tools/invoicing/warehouses.js +133 -0
  206. package/dist/tools/invoicing/warehouses.js.map +1 -0
  207. package/dist/tools/projects/index.d.ts +9 -0
  208. package/dist/tools/projects/index.d.ts.map +1 -0
  209. package/dist/tools/projects/index.js +15 -0
  210. package/dist/tools/projects/index.js.map +1 -0
  211. package/dist/tools/projects/projects.d.ts +18 -0
  212. package/dist/tools/projects/projects.d.ts.map +1 -0
  213. package/dist/tools/projects/projects.js +203 -0
  214. package/dist/tools/projects/projects.js.map +1 -0
  215. package/dist/tools/projects/tasks.d.ts +18 -0
  216. package/dist/tools/projects/tasks.d.ts.map +1 -0
  217. package/dist/tools/projects/tasks.js +154 -0
  218. package/dist/tools/projects/tasks.js.map +1 -0
  219. package/dist/tools/projects/time-tracking.d.ts +14 -0
  220. package/dist/tools/projects/time-tracking.d.ts.map +1 -0
  221. package/dist/tools/projects/time-tracking.js +291 -0
  222. package/dist/tools/projects/time-tracking.js.map +1 -0
  223. package/dist/tools/team/employees.d.ts +18 -0
  224. package/dist/tools/team/employees.d.ts.map +1 -0
  225. package/dist/tools/team/employees.js +149 -0
  226. package/dist/tools/team/employees.js.map +1 -0
  227. package/dist/tools/team/index.d.ts +9 -0
  228. package/dist/tools/team/index.d.ts.map +1 -0
  229. package/dist/tools/team/index.js +13 -0
  230. package/dist/tools/team/index.js.map +1 -0
  231. package/dist/tools/team/time-tracking.d.ts +18 -0
  232. package/dist/tools/team/time-tracking.d.ts.map +1 -0
  233. package/dist/tools/team/time-tracking.js +398 -0
  234. package/dist/tools/team/time-tracking.js.map +1 -0
  235. package/dist/tools/utilities.d.ts +45 -0
  236. package/dist/tools/utilities.d.ts.map +1 -0
  237. package/dist/tools/utilities.js +55 -0
  238. package/dist/tools/utilities.js.map +1 -0
  239. package/dist/types.d.ts +640 -0
  240. package/dist/types.d.ts.map +1 -0
  241. package/dist/types.js +29 -0
  242. package/dist/types.js.map +1 -0
  243. package/package.json +70 -0
@@ -0,0 +1,389 @@
1
+ /**
2
+ * Product tools for Holded API
3
+ */
4
+ import { makeApiRequest, makeMultipartApiRequest } from "../../services/api.js";
5
+ import { ResponseFormat } from "../../constants.js";
6
+ import { ListProductsInputSchema, GetProductInputSchema, CreateProductInputSchema, UpdateProductInputSchema, DeleteProductInputSchema, ListProductsStockInputSchema, UpdateProductStockInputSchema, GetProductImageInputSchema, ListProductImagesInputSchema, GetProductSecondaryImageInputSchema, UploadProductImageInputSchema, } from "../../schemas/invoicing/products.js";
7
+ import { registerCrudTools } from "../factory.js";
8
+ import { withErrorHandling } from "../utilities.js";
9
+ /**
10
+ * Format products as markdown
11
+ */
12
+ export function formatProductsMarkdown(products) {
13
+ if (!products.length) {
14
+ return "No products found.";
15
+ }
16
+ const lines = ["# Products", "", `Found ${products.length} products:`, ""];
17
+ for (const product of products) {
18
+ lines.push(`## ${product.name}`);
19
+ lines.push(`- **ID**: ${product.id}`);
20
+ if (product.sku)
21
+ lines.push(`- **SKU**: ${product.sku}`);
22
+ if (product.kind)
23
+ lines.push(`- **Kind**: ${product.kind}`);
24
+ if (product.price !== undefined)
25
+ lines.push(`- **Price**: ${product.price}`);
26
+ if (product.stock !== undefined)
27
+ lines.push(`- **Stock**: ${product.stock}`);
28
+ lines.push("");
29
+ }
30
+ return lines.join("\n");
31
+ }
32
+ /**
33
+ * Format a single product as markdown
34
+ */
35
+ export function formatProductMarkdown(product) {
36
+ const lines = [`# ${product.name}`, "", `**ID**: ${product.id}`, ""];
37
+ if (product.sku)
38
+ lines.push(`- **SKU**: ${product.sku}`);
39
+ if (product.kind)
40
+ lines.push(`- **Kind**: ${product.kind}`);
41
+ if (product.type)
42
+ lines.push(`- **Type**: ${product.type}`);
43
+ if (product.desc)
44
+ lines.push(`- **Description**: ${product.desc}`);
45
+ if (product.price !== undefined)
46
+ lines.push(`- **Price**: ${product.price}`);
47
+ if (product.costPrice !== undefined)
48
+ lines.push(`- **Cost Price**: ${product.costPrice}`);
49
+ if (product.tax)
50
+ lines.push(`- **Tax**: ${product.tax}`);
51
+ if (product.stock !== undefined)
52
+ lines.push(`- **Stock**: ${product.stock}`);
53
+ if (product.stockControl !== undefined)
54
+ lines.push(`- **Stock Control**: ${product.stockControl}`);
55
+ if (product.barcode)
56
+ lines.push(`- **Barcode**: ${product.barcode}`);
57
+ if (product.weight !== undefined)
58
+ lines.push(`- **Weight**: ${product.weight}`);
59
+ if (product.variants && product.variants.length > 0) {
60
+ lines.push("", "### Variants");
61
+ for (const variant of product.variants) {
62
+ lines.push(`- **${variant.name}** (ID: ${variant.id})`);
63
+ if (variant.sku)
64
+ lines.push(` - SKU: ${variant.sku}`);
65
+ if (variant.price !== undefined)
66
+ lines.push(` - Price: ${variant.price}`);
67
+ if (variant.stock !== undefined)
68
+ lines.push(` - Stock: ${variant.stock}`);
69
+ }
70
+ }
71
+ if (product.tags && product.tags.length > 0) {
72
+ lines.push("", `**Tags**: ${product.tags.join(", ")}`);
73
+ }
74
+ return lines.join("\n");
75
+ }
76
+ /**
77
+ * Register all product-related tools
78
+ */
79
+ export function registerProductTools(server) {
80
+ // ── Standard CRUD via factory ─────────────────────────
81
+ registerCrudTools(server, {
82
+ module: "invoicing",
83
+ toolPrefix: "holded_invoicing",
84
+ resource: "product",
85
+ resourcePlural: "products",
86
+ endpoint: "products",
87
+ idParam: "product_id",
88
+ schemas: {
89
+ list: ListProductsInputSchema,
90
+ get: GetProductInputSchema,
91
+ create: CreateProductInputSchema,
92
+ update: UpdateProductInputSchema,
93
+ delete: DeleteProductInputSchema,
94
+ },
95
+ titles: {
96
+ list: "List Holded Products",
97
+ get: "Get Holded Product",
98
+ create: "Create Holded Product",
99
+ update: "Update Holded Product",
100
+ delete: "Delete Holded Product",
101
+ },
102
+ descriptions: {
103
+ list: `List all products from Holded.
104
+
105
+ Returns paginated list of products. Use page parameter to navigate through results.
106
+
107
+ Args:
108
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
109
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
110
+
111
+ Returns:
112
+ Array of products with id, name, sku, price, stock, and other details.`,
113
+ get: `Get a specific product by ID from Holded.
114
+
115
+ Args:
116
+ - product_id (string): The product ID to retrieve (required)
117
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
118
+
119
+ Returns:
120
+ Product details including name, sku, price, stock, variants, and custom fields.`,
121
+ create: `Create a new product in Holded.
122
+
123
+ Args:
124
+ - name (string): Product name (required)
125
+ - sku (string): Stock Keeping Unit
126
+ - kind ('product' | 'service' | 'pack'): Product kind
127
+ - price (number): Selling price
128
+ - costPrice (number): Cost price
129
+ - stock (number): Initial stock quantity
130
+ - And other optional fields for variants, custom fields, etc.
131
+
132
+ Returns:
133
+ The created product with its assigned ID.`,
134
+ update: `Update an existing product in Holded. Only provided fields will be updated.
135
+
136
+ Args:
137
+ - product_id (string): The product ID to update (required)
138
+ - name (string): Product name
139
+ - sku (string): Stock Keeping Unit
140
+ - price (number): Selling price
141
+ - And other optional fields to update
142
+
143
+ Returns:
144
+ The updated product.`,
145
+ delete: `Delete a product from Holded.
146
+
147
+ Args:
148
+ - product_id (string): The product ID to delete (required)
149
+
150
+ Returns:
151
+ Confirmation of deletion.`,
152
+ },
153
+ formatters: {
154
+ list: formatProductsMarkdown,
155
+ single: formatProductMarkdown,
156
+ },
157
+ });
158
+ // ── Manual tools (non-standard endpoints) ─────────────
159
+ // List Products Stock
160
+ server.registerTool("holded_invoicing_list_products_stock", {
161
+ title: "List Holded Products Stock",
162
+ description: `List stock levels for products in a specific warehouse in Holded.
163
+
164
+ Args:
165
+ - warehouse_id (string): The warehouse ID to list stock for (required)
166
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
167
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
168
+
169
+ Returns:
170
+ Array of products with their stock levels for the specified warehouse.`,
171
+ inputSchema: ListProductsStockInputSchema,
172
+ annotations: {
173
+ readOnlyHint: true,
174
+ destructiveHint: false,
175
+ idempotentHint: true,
176
+ openWorldHint: true,
177
+ },
178
+ }, withErrorHandling(async (params) => {
179
+ const typedParams = params;
180
+ const queryParams = {};
181
+ if (typedParams.page > 1) {
182
+ queryParams.page = typedParams.page;
183
+ }
184
+ const stocks = await makeApiRequest("invoicing", `warehouses/${typedParams.warehouse_id}/stock`, "GET", undefined, queryParams);
185
+ let textContent;
186
+ if (typedParams.response_format === ResponseFormat.MARKDOWN) {
187
+ if (!stocks.length) {
188
+ textContent = `No product stock information found for warehouse ${typedParams.warehouse_id}.`;
189
+ }
190
+ else {
191
+ const lines = ["# Product Stock Levels", "", `**Warehouse ID**: ${typedParams.warehouse_id}`, "", `Found ${stocks.length} products:`, ""];
192
+ for (const stock of stocks) {
193
+ lines.push(`## ${stock.name || stock.productId}`);
194
+ lines.push(`- **ID**: ${stock.productId}`);
195
+ if (stock.sku)
196
+ lines.push(`- **SKU**: ${stock.sku}`);
197
+ lines.push(`- **Stock**: ${stock.stock}`);
198
+ lines.push("");
199
+ }
200
+ textContent = lines.join("\n");
201
+ }
202
+ }
203
+ else {
204
+ textContent = JSON.stringify(stocks, null, 2);
205
+ }
206
+ return {
207
+ content: [{ type: "text", text: textContent }],
208
+ structuredContent: { stocks, count: stocks.length, page: typedParams.page, warehouseId: typedParams.warehouse_id },
209
+ };
210
+ }));
211
+ // Update Product Stock
212
+ server.registerTool("holded_invoicing_update_product_stock", {
213
+ title: "Update Holded Product Stock",
214
+ description: `Update stock level for a product in Holded.
215
+
216
+ Args:
217
+ - product_id (string): The product ID to update stock for (required, path parameter)
218
+ - stock (object): Nested object structure: stock[warehouseId][productId/variantId] = quantity
219
+ Example: { "warehouse1": { "product123": 10, "variant456": 5 } }
220
+
221
+ Returns:
222
+ Confirmation of stock update.`,
223
+ inputSchema: UpdateProductStockInputSchema,
224
+ annotations: {
225
+ readOnlyHint: false,
226
+ destructiveHint: false,
227
+ idempotentHint: false,
228
+ openWorldHint: true,
229
+ },
230
+ }, withErrorHandling(async (params) => {
231
+ const { product_id, stock } = params;
232
+ const result = await makeApiRequest("invoicing", `products/${product_id}/stock`, "PUT", { stock });
233
+ return {
234
+ content: [
235
+ {
236
+ type: "text",
237
+ text: `Product stock updated successfully.\n\n${JSON.stringify(result, null, 2)}`,
238
+ },
239
+ ],
240
+ structuredContent: { updated: true, productId: product_id, stock },
241
+ };
242
+ }));
243
+ // Get Product Main Image
244
+ server.registerTool("holded_invoicing_get_product_image", {
245
+ title: "Get Holded Product Main Image",
246
+ description: `Get the main image of a specific product from Holded.
247
+
248
+ Args:
249
+ - product_id (string): The product ID to get the main image for (required)
250
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
251
+
252
+ Returns:
253
+ Product main image data (URL or base64 encoded).`,
254
+ inputSchema: GetProductImageInputSchema,
255
+ annotations: {
256
+ readOnlyHint: true,
257
+ destructiveHint: false,
258
+ idempotentHint: true,
259
+ openWorldHint: true,
260
+ },
261
+ }, withErrorHandling(async (params) => {
262
+ const typedParams = params;
263
+ const result = await makeApiRequest("invoicing", `products/${typedParams.product_id}/image`, "GET");
264
+ const textContent = typedParams.response_format === ResponseFormat.MARKDOWN
265
+ ? result.url
266
+ ? `# Product Main Image\n\n**URL**: ${result.url}`
267
+ : `# Product Main Image\n\nImage data available.`
268
+ : JSON.stringify(result, null, 2);
269
+ return {
270
+ content: [{ type: "text", text: textContent }],
271
+ structuredContent: { productId: typedParams.product_id, ...result },
272
+ };
273
+ }));
274
+ // List Product Images
275
+ server.registerTool("holded_invoicing_list_product_images", {
276
+ title: "List Holded Product Images",
277
+ description: `List all secondary product images from Holded.
278
+
279
+ Args:
280
+ - product_id (string): The product ID to list images for (required)
281
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
282
+
283
+ Returns:
284
+ Array of product image file names or image data.`,
285
+ inputSchema: ListProductImagesInputSchema,
286
+ annotations: {
287
+ readOnlyHint: true,
288
+ destructiveHint: false,
289
+ idempotentHint: true,
290
+ openWorldHint: true,
291
+ },
292
+ }, withErrorHandling(async (params) => {
293
+ const typedParams = params;
294
+ const images = await makeApiRequest("invoicing", `products/${typedParams.product_id}/imagesList`, "GET");
295
+ let textContent;
296
+ if (typedParams.response_format === ResponseFormat.MARKDOWN) {
297
+ if (!images.length) {
298
+ textContent = `No product images found for product ${typedParams.product_id}.`;
299
+ }
300
+ else {
301
+ const lines = ["# Product Images", "", `Found ${images.length} images:`, ""];
302
+ for (const image of images) {
303
+ if (typeof image === "string") {
304
+ lines.push(`- ${image}`);
305
+ }
306
+ else {
307
+ lines.push(`- ${image.name || image.url || "Image"}`);
308
+ }
309
+ }
310
+ textContent = lines.join("\n");
311
+ }
312
+ }
313
+ else {
314
+ textContent = JSON.stringify(images, null, 2);
315
+ }
316
+ return {
317
+ content: [{ type: "text", text: textContent }],
318
+ structuredContent: { images, count: images.length, productId: typedParams.product_id },
319
+ };
320
+ }));
321
+ // Get Product Secondary Image
322
+ server.registerTool("holded_invoicing_get_product_secondary_image", {
323
+ title: "Get Holded Product Secondary Image",
324
+ description: `Get a specific secondary image of a product from Holded.
325
+
326
+ Args:
327
+ - product_id (string): The product ID (required)
328
+ - image_file_name (string): The image file name (required)
329
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
330
+
331
+ Returns:
332
+ Product secondary image data (URL or base64 encoded).`,
333
+ inputSchema: GetProductSecondaryImageInputSchema,
334
+ annotations: {
335
+ readOnlyHint: true,
336
+ destructiveHint: false,
337
+ idempotentHint: true,
338
+ openWorldHint: true,
339
+ },
340
+ }, withErrorHandling(async (params) => {
341
+ const typedParams = params;
342
+ const result = await makeApiRequest("invoicing", `products/${typedParams.product_id}/image/${typedParams.image_file_name}`, "GET");
343
+ const textContent = typedParams.response_format === ResponseFormat.MARKDOWN
344
+ ? result.url
345
+ ? `# Product Secondary Image\n\n**File**: ${typedParams.image_file_name}\n**URL**: ${result.url}`
346
+ : `# Product Secondary Image\n\n**File**: ${typedParams.image_file_name}\nImage data available.`
347
+ : JSON.stringify(result, null, 2);
348
+ return {
349
+ content: [{ type: "text", text: textContent }],
350
+ structuredContent: { productId: typedParams.product_id, imageFileName: typedParams.image_file_name, ...result },
351
+ };
352
+ }));
353
+ // Upload Product Image
354
+ server.registerTool("holded_invoicing_upload_product_image", {
355
+ title: "Upload Holded Product Image",
356
+ description: `Upload an image to a product in Holded.
357
+
358
+ Args:
359
+ - product_id (string): The product ID to upload image to (required)
360
+ - file_content (string): Image file content as base64 encoded string (required)
361
+ - file_name (string): Image file name (required)
362
+ - set_main (boolean): Set this image as the main product image
363
+
364
+ Returns:
365
+ Confirmation of image upload with status and info.`,
366
+ inputSchema: UploadProductImageInputSchema,
367
+ annotations: {
368
+ readOnlyHint: false,
369
+ destructiveHint: false,
370
+ idempotentHint: false,
371
+ openWorldHint: true,
372
+ },
373
+ }, withErrorHandling(async (params) => {
374
+ const { product_id, file_content, file_name, set_main } = params;
375
+ // Convert base64 to buffer
376
+ const fileBuffer = Buffer.from(file_content, "base64");
377
+ const result = await makeMultipartApiRequest("invoicing", `products/${product_id}/image`, fileBuffer, file_name, set_main);
378
+ return {
379
+ content: [
380
+ {
381
+ type: "text",
382
+ text: `Product image uploaded successfully.\n\n${JSON.stringify(result, null, 2)}`,
383
+ },
384
+ ],
385
+ structuredContent: { uploaded: true, productId: product_id, fileName: file_name, ...result },
386
+ };
387
+ }));
388
+ }
389
+ //# sourceMappingURL=products.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"products.js","sourceRoot":"","sources":["../../../src/tools/invoicing/products.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Remittance tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ /**
6
+ * Format remittances as markdown
7
+ */
8
+ export declare function formatRemittancesMarkdown(remittances: Record<string, unknown>[]): string;
9
+ /**
10
+ * Format a single remittance as markdown
11
+ */
12
+ export declare function formatRemittanceMarkdown(remittance: Record<string, unknown>): string;
13
+ /**
14
+ * Register remittance tools
15
+ */
16
+ export declare function registerRemittanceTools(server: McpServer): void;
17
+ //# sourceMappingURL=remittances.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remittances.d.ts","sourceRoot":"","sources":["../../../src/tools/invoicing/remittances.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,MAAM,CAcxF;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAUpF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuC/D"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Remittance tools for Holded API
3
+ */
4
+ import { ListRemittancesInputSchema, GetRemittanceInputSchema, } from "../../schemas/invoicing/remittances.js";
5
+ import { registerCrudTools } from "../factory.js";
6
+ /**
7
+ * Format remittances as markdown
8
+ */
9
+ export function formatRemittancesMarkdown(remittances) {
10
+ if (!remittances.length) {
11
+ return "No remittances found.";
12
+ }
13
+ const lines = ["# Remittances", "", `Found ${remittances.length} remittances:`, ""];
14
+ for (const remittance of remittances) {
15
+ lines.push(`## Remittance ${remittance.id}`);
16
+ lines.push(`- **ID**: ${remittance.id}`);
17
+ lines.push("");
18
+ }
19
+ return lines.join("\n");
20
+ }
21
+ /**
22
+ * Format a single remittance as markdown
23
+ */
24
+ export function formatRemittanceMarkdown(remittance) {
25
+ const lines = [`# Remittance ${remittance.id || "Unknown"}`, ""];
26
+ for (const [key, value] of Object.entries(remittance)) {
27
+ if (value !== null && value !== undefined) {
28
+ lines.push(`- **${key}**: ${String(value)}`);
29
+ }
30
+ }
31
+ return lines.join("\n");
32
+ }
33
+ /**
34
+ * Register remittance tools
35
+ */
36
+ export function registerRemittanceTools(server) {
37
+ registerCrudTools(server, {
38
+ module: "invoicing",
39
+ toolPrefix: "holded_invoicing",
40
+ resource: "remittance",
41
+ resourcePlural: "remittances",
42
+ endpoint: "remittances",
43
+ idParam: "remittance_id",
44
+ schemas: {
45
+ list: ListRemittancesInputSchema,
46
+ get: GetRemittanceInputSchema,
47
+ },
48
+ titles: {
49
+ list: "List Holded Remittances",
50
+ get: "Get Holded Remittance",
51
+ },
52
+ descriptions: {
53
+ list: `List all remittances from Holded.
54
+
55
+ Args:
56
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
57
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
58
+
59
+ Returns:
60
+ Array of remittances.`,
61
+ get: `Get a specific remittance by ID from Holded.
62
+
63
+ Args:
64
+ - remittance_id (string): The remittance ID to retrieve (required)
65
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
66
+
67
+ Returns:
68
+ Remittance details.`,
69
+ },
70
+ formatters: {
71
+ list: formatRemittancesMarkdown,
72
+ single: formatRemittanceMarkdown,
73
+ },
74
+ });
75
+ }
76
+ //# sourceMappingURL=remittances.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remittances.js","sourceRoot":"","sources":["../../../src/tools/invoicing/remittances.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,GACzB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,WAAsC;IAC9E,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC;QACxB,OAAO,uBAAuB,CAAC;IACjC,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,eAAe,EAAE,EAAE,EAAE,SAAS,WAAW,CAAC,MAAM,eAAe,EAAE,EAAE,CAAC,CAAC;IAEpF,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,iBAAiB,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,KAAK,CAAC,IAAI,CAAC,aAAa,UAAU,CAAC,EAAE,EAAE,CAAC,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,wBAAwB,CAAC,UAAmC;IAC1E,MAAM,KAAK,GAAG,CAAC,gBAAgB,UAAU,CAAC,EAAE,IAAI,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAEjE,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;QACtD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,OAAO,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,iBAAiB,CAA0B,MAAM,EAAE;QACjD,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,kBAAkB;QAC9B,QAAQ,EAAE,YAAY;QACtB,cAAc,EAAE,aAAa;QAC7B,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE;YACP,IAAI,EAAE,0BAA0B;YAChC,GAAG,EAAE,wBAAwB;SAC9B;QACD,MAAM,EAAE;YACN,IAAI,EAAE,yBAAyB;YAC/B,GAAG,EAAE,uBAAuB;SAC7B;QACD,YAAY,EAAE;YACZ,IAAI,EAAE;;;;;;;wBAOY;YAClB,GAAG,EAAE;;;;;;;sBAOW;SACjB;QACD,UAAU,EAAE;YACV,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,wBAAwB;SACjC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Sales Channel tools for Holded API
3
+ */
4
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
5
+ interface SalesChannel {
6
+ id: string;
7
+ name: string;
8
+ description?: string;
9
+ [key: string]: unknown;
10
+ }
11
+ /**
12
+ * Format sales channels as markdown
13
+ */
14
+ export declare function formatSalesChannelsMarkdown(channels: SalesChannel[]): string;
15
+ /**
16
+ * Format a single sales channel as markdown
17
+ */
18
+ export declare function formatSalesChannelMarkdown(channel: SalesChannel): string;
19
+ /**
20
+ * Register all sales channel-related tools
21
+ */
22
+ export declare function registerSalesChannelTools(server: McpServer): void;
23
+ export {};
24
+ //# sourceMappingURL=sales-channels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sales-channels.d.ts","sourceRoot":"","sources":["../../../src/tools/invoicing/sales-channels.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,UAAU,YAAY;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,YAAY,EAAE,GAAG,MAAM,CAe5E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CAKxE;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqEjE"}
@@ -0,0 +1,105 @@
1
+ /**
2
+ * Sales Channel tools for Holded API
3
+ */
4
+ import { ListSalesChannelsInputSchema, GetSalesChannelInputSchema, CreateSalesChannelInputSchema, UpdateSalesChannelInputSchema, DeleteSalesChannelInputSchema, } from "../../schemas/invoicing/sales-channels.js";
5
+ import { registerCrudTools } from "../factory.js";
6
+ /**
7
+ * Format sales channels as markdown
8
+ */
9
+ export function formatSalesChannelsMarkdown(channels) {
10
+ if (!channels.length) {
11
+ return "No sales channels found.";
12
+ }
13
+ const lines = ["# Sales Channels", "", `Found ${channels.length} sales channels:`, ""];
14
+ for (const channel of channels) {
15
+ lines.push(`## ${channel.name}`);
16
+ lines.push(`- **ID**: ${channel.id}`);
17
+ if (channel.description)
18
+ lines.push(`- **Description**: ${channel.description}`);
19
+ lines.push("");
20
+ }
21
+ return lines.join("\n");
22
+ }
23
+ /**
24
+ * Format a single sales channel as markdown
25
+ */
26
+ export function formatSalesChannelMarkdown(channel) {
27
+ const lines = [`# ${channel.name}`, "", `**ID**: ${channel.id}`, ""];
28
+ if (channel.description)
29
+ lines.push(`- **Description**: ${channel.description}`);
30
+ return lines.join("\n");
31
+ }
32
+ /**
33
+ * Register all sales channel-related tools
34
+ */
35
+ export function registerSalesChannelTools(server) {
36
+ registerCrudTools(server, {
37
+ module: "invoicing",
38
+ toolPrefix: "holded_invoicing",
39
+ resource: "sales_channel",
40
+ resourcePlural: "sales_channels",
41
+ endpoint: "saleschannels",
42
+ idParam: "sales_channel_id",
43
+ schemas: {
44
+ list: ListSalesChannelsInputSchema,
45
+ get: GetSalesChannelInputSchema,
46
+ create: CreateSalesChannelInputSchema,
47
+ update: UpdateSalesChannelInputSchema,
48
+ delete: DeleteSalesChannelInputSchema,
49
+ },
50
+ titles: {
51
+ list: "List Holded Sales Channels",
52
+ get: "Get Holded Sales Channel",
53
+ create: "Create Holded Sales Channel",
54
+ update: "Update Holded Sales Channel",
55
+ delete: "Delete Holded Sales Channel",
56
+ },
57
+ descriptions: {
58
+ list: `List all sales channels from Holded.
59
+
60
+ Args:
61
+ - page (number): Page number for pagination (default: 1, max 500 items per page)
62
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
63
+
64
+ Returns:
65
+ Array of sales channels with id, name, and description.`,
66
+ get: `Get a specific sales channel by ID from Holded.
67
+
68
+ Args:
69
+ - sales_channel_id (string): The sales channel ID to retrieve (required)
70
+ - response_format ('json' | 'markdown'): Output format (default: 'json')
71
+
72
+ Returns:
73
+ Sales channel details including name and description.`,
74
+ create: `Create a new sales channel in Holded.
75
+
76
+ Args:
77
+ - name (string): Sales channel name (required)
78
+ - description (string): Sales channel description
79
+
80
+ Returns:
81
+ The created sales channel with its assigned ID.`,
82
+ update: `Update an existing sales channel in Holded.
83
+
84
+ Args:
85
+ - sales_channel_id (string): The sales channel ID to update (required)
86
+ - name (string): Sales channel name
87
+ - description (string): Sales channel description
88
+
89
+ Returns:
90
+ The updated sales channel.`,
91
+ delete: `Delete a sales channel from Holded.
92
+
93
+ Args:
94
+ - sales_channel_id (string): The sales channel ID to delete (required)
95
+
96
+ Returns:
97
+ Confirmation of deletion.`,
98
+ },
99
+ formatters: {
100
+ list: formatSalesChannelsMarkdown,
101
+ single: formatSalesChannelMarkdown,
102
+ },
103
+ });
104
+ }
105
+ //# sourceMappingURL=sales-channels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sales-channels.js","sourceRoot":"","sources":["../../../src/tools/invoicing/sales-channels.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EACL,4BAA4B,EAC5B,0BAA0B,EAC1B,6BAA6B,EAC7B,6BAA6B,EAC7B,6BAA6B,GAC9B,MAAM,2CAA2C,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AASlD;;GAEG;AACH,MAAM,UAAU,2BAA2B,CAAC,QAAwB;IAClE,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;QACrB,OAAO,0BAA0B,CAAC;IACpC,CAAC;IAED,MAAM,KAAK,GAAG,CAAC,kBAAkB,EAAE,EAAE,EAAE,SAAS,QAAQ,CAAC,MAAM,kBAAkB,EAAE,EAAE,CAAC,CAAC;IAEvF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,KAAK,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,aAAa,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;QACtC,IAAI,OAAO,CAAC,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QACjF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,0BAA0B,CAAC,OAAqB;IAC9D,MAAM,KAAK,GAAG,CAAC,KAAK,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,WAAW,OAAO,CAAC,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IACrE,IAAI,OAAO,CAAC,WAAW;QAAE,KAAK,CAAC,IAAI,CAAC,sBAAsB,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAEjF,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,MAAiB;IACzD,iBAAiB,CAAe,MAAM,EAAE;QACtC,MAAM,EAAE,WAAW;QACnB,UAAU,EAAE,kBAAkB;QAC9B,QAAQ,EAAE,eAAe;QACzB,cAAc,EAAE,gBAAgB;QAChC,QAAQ,EAAE,eAAe;QACzB,OAAO,EAAE,kBAAkB;QAC3B,OAAO,EAAE;YACP,IAAI,EAAE,4BAA4B;YAClC,GAAG,EAAE,0BAA0B;YAC/B,MAAM,EAAE,6BAA6B;YACrC,MAAM,EAAE,6BAA6B;YACrC,MAAM,EAAE,6BAA6B;SACtC;QACD,MAAM,EAAE;YACN,IAAI,EAAE,4BAA4B;YAClC,GAAG,EAAE,0BAA0B;YAC/B,MAAM,EAAE,6BAA6B;YACrC,MAAM,EAAE,6BAA6B;YACrC,MAAM,EAAE,6BAA6B;SACtC;QACD,YAAY,EAAE;YACZ,IAAI,EAAE;;;;;;;0DAO8C;YACpD,GAAG,EAAE;;;;;;;wDAO6C;YAClD,MAAM,EAAE;;;;;;;kDAOoC;YAC5C,MAAM,EAAE;;;;;;;;6BAQe;YACvB,MAAM,EAAE;;;;;;4BAMc;SACvB;QACD,UAAU,EAAE;YACV,IAAI,EAAE,2BAA2B;YACjC,MAAM,EAAE,0BAA0B;SACnC;KACF,CAAC,CAAC;AACL,CAAC"}