@hayodev/crystallize-mcp 0.1.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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +304 -0
  3. package/build/src/audit.d.ts +23 -0
  4. package/build/src/audit.d.ts.map +1 -0
  5. package/build/src/audit.js +38 -0
  6. package/build/src/audit.js.map +1 -0
  7. package/build/src/bin/crystallize-mcp.d.ts +12 -0
  8. package/build/src/bin/crystallize-mcp.d.ts.map +1 -0
  9. package/build/src/bin/crystallize-mcp.js +45 -0
  10. package/build/src/bin/crystallize-mcp.js.map +1 -0
  11. package/build/src/bin/setup.d.ts +12 -0
  12. package/build/src/bin/setup.d.ts.map +1 -0
  13. package/build/src/bin/setup.js +171 -0
  14. package/build/src/bin/setup.js.map +1 -0
  15. package/build/src/client.d.ts +28 -0
  16. package/build/src/client.d.ts.map +1 -0
  17. package/build/src/client.js +124 -0
  18. package/build/src/client.js.map +1 -0
  19. package/build/src/credentials.d.ts +25 -0
  20. package/build/src/credentials.d.ts.map +1 -0
  21. package/build/src/credentials.js +104 -0
  22. package/build/src/credentials.js.map +1 -0
  23. package/build/src/errors.d.ts +12 -0
  24. package/build/src/errors.d.ts.map +1 -0
  25. package/build/src/errors.js +66 -0
  26. package/build/src/errors.js.map +1 -0
  27. package/build/src/index.d.ts +12 -0
  28. package/build/src/index.d.ts.map +1 -0
  29. package/build/src/index.js +83 -0
  30. package/build/src/index.js.map +1 -0
  31. package/build/src/pii.d.ts +20 -0
  32. package/build/src/pii.d.ts.map +1 -0
  33. package/build/src/pii.js +85 -0
  34. package/build/src/pii.js.map +1 -0
  35. package/build/src/tools/catalogue.d.ts +7 -0
  36. package/build/src/tools/catalogue.d.ts.map +1 -0
  37. package/build/src/tools/catalogue.js +329 -0
  38. package/build/src/tools/catalogue.js.map +1 -0
  39. package/build/src/tools/customers.d.ts +7 -0
  40. package/build/src/tools/customers.d.ts.map +1 -0
  41. package/build/src/tools/customers.js +278 -0
  42. package/build/src/tools/customers.js.map +1 -0
  43. package/build/src/tools/discovery.d.ts +10 -0
  44. package/build/src/tools/discovery.d.ts.map +1 -0
  45. package/build/src/tools/discovery.js +285 -0
  46. package/build/src/tools/discovery.js.map +1 -0
  47. package/build/src/tools/orders.d.ts +7 -0
  48. package/build/src/tools/orders.d.ts.map +1 -0
  49. package/build/src/tools/orders.js +250 -0
  50. package/build/src/tools/orders.js.map +1 -0
  51. package/build/src/tools/shapes.d.ts +7 -0
  52. package/build/src/tools/shapes.d.ts.map +1 -0
  53. package/build/src/tools/shapes.js +194 -0
  54. package/build/src/tools/shapes.js.map +1 -0
  55. package/build/src/types.d.ts +43 -0
  56. package/build/src/types.d.ts.map +1 -0
  57. package/build/src/types.js +5 -0
  58. package/build/src/types.js.map +1 -0
  59. package/package.json +75 -0
@@ -0,0 +1,285 @@
1
+ /**
2
+ * Discovery API tools — browse shapes, introspect schema, search via browse.
3
+ *
4
+ * Uses the Discovery API's semantic browse queries where each shape
5
+ * is a top-level field with its own filters, pagination, and fields.
6
+ */
7
+ import { z } from 'zod';
8
+ /** Cache introspected schema per tenant to avoid repeated introspection. */
9
+ let schemaCache = null;
10
+ const CACHE_TTL_MS = 5 * 60 * 1000; // 5 minutes
11
+ async function introspectShapes(client) {
12
+ if (schemaCache && Date.now() - schemaCache.timestamp < CACHE_TTL_MS) {
13
+ return schemaCache.shapes;
14
+ }
15
+ // Step 1: Get all browse entry points (shapes)
16
+ const browseData = (await client.api.discoveryApi(`{
17
+ __type(name: "BrowseQuery") {
18
+ fields {
19
+ name
20
+ type { kind ofType { name kind } }
21
+ }
22
+ }
23
+ }`));
24
+ const shapeEntries = browseData.__type.fields;
25
+ // Step 2: For each shape, get the hit type's fields
26
+ // Batch introspect hit types (the hit type name = lowercase shape name)
27
+ const hitTypeQueries = shapeEntries
28
+ .map((s, i) => `s${i}: __type(name: "${s.name}") { fields { name type { name kind ofType { name kind ofType { name } } } } }`)
29
+ .join('\n');
30
+ const hitData = (await client.api.discoveryApi(`{ ${hitTypeQueries} }`));
31
+ const shapes = shapeEntries.map((entry, i) => {
32
+ const hitType = hitData[`s${i}`];
33
+ const fields = (hitType?.fields ?? []).map(f => {
34
+ const t = f.type;
35
+ const typeName = t.name ?? t.ofType?.name ?? t.ofType?.ofType?.name ?? t.kind;
36
+ const isScalar = t.kind === 'SCALAR' || t.kind === 'ENUM';
37
+ return { name: f.name, typeName, kind: t.kind, isScalar };
38
+ });
39
+ return {
40
+ name: entry.name,
41
+ queryTypeName: entry.type.ofType?.name ?? entry.name,
42
+ hitTypeName: entry.name,
43
+ fields,
44
+ };
45
+ });
46
+ schemaCache = { shapes, timestamp: Date.now() };
47
+ return shapes;
48
+ }
49
+ /** Get scalar fields for a shape that are useful for a summary view. */
50
+ function getDefaultFields(shape) {
51
+ const always = ['name', 'path', 'itemId'];
52
+ const useful = [
53
+ 'externalReference',
54
+ 'language',
55
+ 'type',
56
+ 'shape',
57
+ 'publishedAt',
58
+ ];
59
+ const result = always.filter(f => shape.fields.some(sf => sf.name === f));
60
+ for (const field of useful) {
61
+ if (shape.fields.some(sf => sf.name === field && sf.isScalar)) {
62
+ result.push(field);
63
+ }
64
+ }
65
+ return result;
66
+ }
67
+ export function discoveryTools(client) {
68
+ return [
69
+ {
70
+ name: 'list_discovery_shapes',
71
+ description: 'List all shapes available in the Discovery API with their queryable fields. Use this to understand what shapes exist and what data you can query before calling browse_shape.',
72
+ schema: {
73
+ verbose: z
74
+ .boolean()
75
+ .default(false)
76
+ .describe('If true, show all fields per shape. If false, show only shape names and field counts.'),
77
+ },
78
+ handler: async (params) => {
79
+ const shapes = await introspectShapes(client);
80
+ const lines = [
81
+ `${shapes.length} shapes in tenant "${client.config.tenantIdentifier}":\n`,
82
+ ];
83
+ for (const shape of shapes) {
84
+ if (params.verbose) {
85
+ lines.push(`${shape.name} (${shape.fields.length} fields)`);
86
+ const scalarFields = shape.fields.filter(f => f.isScalar);
87
+ const objectFields = shape.fields.filter(f => !f.isScalar);
88
+ if (scalarFields.length > 0) {
89
+ lines.push(` Scalar: ${scalarFields.map(f => f.name).join(', ')}`);
90
+ }
91
+ if (objectFields.length > 0) {
92
+ lines.push(` Objects: ${objectFields.map(f => `${f.name} (${f.typeName})`).join(', ')}`);
93
+ }
94
+ lines.push('');
95
+ }
96
+ else {
97
+ const scalarCount = shape.fields.filter(f => f.isScalar).length;
98
+ const objectCount = shape.fields.filter(f => !f.isScalar).length;
99
+ lines.push(` ${shape.name} — ${scalarCount} scalar, ${objectCount} object fields`);
100
+ }
101
+ }
102
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
103
+ },
104
+ },
105
+ {
106
+ name: 'browse_shape',
107
+ description: 'Browse items of a specific shape using the Discovery API. Supports pagination, search terms, and selecting specific fields. Use list_discovery_shapes first to see available shapes and fields.',
108
+ schema: {
109
+ shape: z
110
+ .string()
111
+ .describe('Shape name to browse, e.g. "produktHageland", "hagesenter", "kategori"'),
112
+ fields: z
113
+ .array(z.string())
114
+ .optional()
115
+ .describe('Fields to return on each hit. Omit for default fields (name, path, itemId). Use list_discovery_shapes with verbose=true to see available fields.'),
116
+ variant_fields: z
117
+ .array(z.string())
118
+ .optional()
119
+ .describe('Fields to return on defaultVariant (for product shapes), e.g. ["sku", "name", "defaultPrice"]'),
120
+ term: z
121
+ .string()
122
+ .optional()
123
+ .describe('Search term to filter results within this shape'),
124
+ limit: z.number().default(10).describe('Number of results (max 100)'),
125
+ after: z
126
+ .string()
127
+ .optional()
128
+ .describe('Pagination token from a previous result (endToken)'),
129
+ },
130
+ handler: async (params) => {
131
+ const shapes = await introspectShapes(client);
132
+ const shape = shapes.find(s => s.name === params.shape);
133
+ if (!shape) {
134
+ const available = shapes.map(s => s.name).join(', ');
135
+ return {
136
+ content: [
137
+ {
138
+ type: 'text',
139
+ text: `Shape "${params.shape}" not found.\n\nAvailable shapes: ${available}`,
140
+ },
141
+ ],
142
+ isError: true,
143
+ };
144
+ }
145
+ const limit = Math.min(Math.max(params.limit, 1), 100);
146
+ // Build field selection
147
+ const selectedFields = params.fields ?? getDefaultFields(shape);
148
+ // Validate fields exist on shape
149
+ const invalidFields = selectedFields.filter((f) => !shape.fields.some(sf => sf.name === f));
150
+ if (invalidFields.length > 0) {
151
+ const available = shape.fields.map(f => f.name).join(', ');
152
+ return {
153
+ content: [
154
+ {
155
+ type: 'text',
156
+ text: `Invalid fields for shape "${params.shape}": ${invalidFields.join(', ')}\n\nAvailable: ${available}`,
157
+ },
158
+ ],
159
+ isError: true,
160
+ };
161
+ }
162
+ // Build variant fields if requested
163
+ let variantSelection = '';
164
+ if (params.variant_fields?.length) {
165
+ const hasVariants = shape.fields.some(f => f.name === 'defaultVariant');
166
+ if (hasVariants) {
167
+ variantSelection = `defaultVariant { ${params.variant_fields.join(' ')} }`;
168
+ }
169
+ }
170
+ // Build query args
171
+ const args = [
172
+ `pagination: { limit: ${limit}${params.after ? `, after: "${params.after}"` : ''} }`,
173
+ ];
174
+ if (params.term) {
175
+ args.push(`term: "${params.term.replace(/"/g, '\\"')}"`);
176
+ }
177
+ const query = `{
178
+ browse {
179
+ ${params.shape}(${args.join(', ')}) {
180
+ summary { totalHits hasMoreHits endToken }
181
+ hits {
182
+ ${selectedFields.join('\n ')}
183
+ ${variantSelection}
184
+ }
185
+ }
186
+ }
187
+ }`;
188
+ const data = (await client.api.discoveryApi(query));
189
+ const result = data.browse[params.shape];
190
+ if (!result?.hits?.length) {
191
+ return {
192
+ content: [
193
+ {
194
+ type: 'text',
195
+ text: `No results for shape "${params.shape}"${params.term ? ` with term "${params.term}"` : ''}`,
196
+ },
197
+ ],
198
+ };
199
+ }
200
+ return {
201
+ content: [
202
+ {
203
+ type: 'text',
204
+ text: formatBrowseResult(params.shape, result, client),
205
+ },
206
+ ],
207
+ };
208
+ },
209
+ },
210
+ {
211
+ name: 'get_shape_fields',
212
+ description: 'Get detailed field information for a specific shape in the Discovery API. Shows all scalar and object fields with their types.',
213
+ schema: {
214
+ shape: z.string().describe('Shape name, e.g. "produktHageland"'),
215
+ },
216
+ handler: async (params) => {
217
+ const shapes = await introspectShapes(client);
218
+ const shape = shapes.find(s => s.name === params.shape);
219
+ if (!shape) {
220
+ const available = shapes.map(s => s.name).join(', ');
221
+ return {
222
+ content: [
223
+ {
224
+ type: 'text',
225
+ text: `Shape "${params.shape}" not found.\n\nAvailable: ${available}`,
226
+ },
227
+ ],
228
+ isError: true,
229
+ };
230
+ }
231
+ const lines = [
232
+ `${shape.name} — ${shape.fields.length} fields`,
233
+ `Link: ${client.shapeLink(shape.name)}`,
234
+ '',
235
+ 'Fields:',
236
+ ];
237
+ for (const field of shape.fields) {
238
+ const scalar = field.isScalar ? '' : ' (object)';
239
+ lines.push(` ${field.name}: ${field.typeName}${scalar}`);
240
+ }
241
+ return { content: [{ type: 'text', text: lines.join('\n') }] };
242
+ },
243
+ },
244
+ ];
245
+ }
246
+ // --- Formatters ---
247
+ function formatBrowseResult(shapeName, result, client) {
248
+ const { summary, hits } = result;
249
+ const lines = [
250
+ `${shapeName} — ${summary.totalHits} total, showing ${hits.length}`,
251
+ '',
252
+ ];
253
+ for (const hit of hits) {
254
+ const name = hit.name ?? 'Unnamed';
255
+ const itemId = hit.itemId;
256
+ lines.push(`${name}`);
257
+ // Show all scalar fields except name (already shown)
258
+ for (const [key, value] of Object.entries(hit)) {
259
+ if (key === 'name') {
260
+ continue;
261
+ }
262
+ if (value === null || value === undefined) {
263
+ continue;
264
+ }
265
+ if (typeof value === 'string' ||
266
+ typeof value === 'number' ||
267
+ typeof value === 'boolean') {
268
+ lines.push(` ${key}: ${value}`);
269
+ }
270
+ else if (typeof value === 'object') {
271
+ lines.push(` ${key}: ${JSON.stringify(value)}`);
272
+ }
273
+ }
274
+ if (itemId) {
275
+ const itemType = hit.type ?? 'document';
276
+ lines.push(` Link: ${client.itemLink(itemId, itemType)}`);
277
+ }
278
+ lines.push('');
279
+ }
280
+ if (summary.hasMoreHits && summary.endToken) {
281
+ lines.push(`--- More results available. Use after: "${summary.endToken}" to paginate ---`);
282
+ }
283
+ return lines.join('\n');
284
+ }
285
+ //# sourceMappingURL=discovery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"discovery.js","sourceRoot":"","sources":["../../../src/tools/discovery.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,4EAA4E;AAC5E,IAAI,WAAW,GAAsD,IAAI,CAAC;AAC1E,MAAM,YAAY,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,YAAY;AAgBhD,KAAK,UAAU,gBAAgB,CAC7B,MAAyB;IAEzB,IAAI,WAAW,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,GAAG,YAAY,EAAE,CAAC;QACrE,OAAO,WAAW,CAAC,MAAM,CAAC;IAC5B,CAAC;IAED,+CAA+C;IAC/C,MAAM,UAAU,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;;;;;;;IAOhD,CAAC,CAOF,CAAC;IAEF,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC;IAE9C,oDAAoD;IACpD,wEAAwE;IACxE,MAAM,cAAc,GAAG,YAAY;SAChC,GAAG,CACF,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,gFAAgF,CACjH;SACA,IAAI,CAAC,IAAI,CAAC,CAAC;IAEd,MAAM,OAAO,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,CAC5C,KAAK,cAAc,IAAI,CACxB,CAgBA,CAAC;IAEF,MAAM,MAAM,GAAgB,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QACxD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,MAAM,GAAgB,CAAC,OAAO,EAAE,MAAM,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE;YAC1D,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACjB,MAAM,QAAQ,GACZ,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC;YAC/D,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC;YAC1D,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC5D,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,aAAa,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,KAAK,CAAC,IAAI;YACpD,WAAW,EAAE,KAAK,CAAC,IAAI;YACvB,MAAM;SACP,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,WAAW,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;IAChD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,wEAAwE;AACxE,SAAS,gBAAgB,CAAC,KAAgB;IACxC,MAAM,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG;QACb,mBAAmB;QACnB,UAAU;QACV,MAAM;QACN,OAAO;QACP,aAAa;KACd,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IAE1E,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAyB;IACtD,OAAO;QACL;YACE,IAAI,EAAE,uBAAuB;YAC7B,WAAW,EACT,+KAA+K;YACjL,MAAM,EAAE;gBACN,OAAO,EAAE,CAAC;qBACP,OAAO,EAAE;qBACT,OAAO,CAAC,KAAK,CAAC;qBACd,QAAQ,CACP,uFAAuF,CACxF;aACJ;YACD,OAAO,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;gBACtB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAE9C,MAAM,KAAK,GAAa;oBACtB,GAAG,MAAM,CAAC,MAAM,sBAAsB,MAAM,CAAC,MAAM,CAAC,gBAAgB,MAAM;iBAC3E,CAAC;gBAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,KAAK,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,MAAM,CAAC,MAAM,UAAU,CAAC,CAAC;wBAC5D,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;wBAC1D,MAAM,YAAY,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;wBAE3D,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC5B,KAAK,CAAC,IAAI,CACR,aAAa,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACxD,CAAC;wBACJ,CAAC;wBACD,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;4BAC5B,KAAK,CAAC,IAAI,CACR,cAAc,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC9E,CAAC;wBACJ,CAAC;wBACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACjB,CAAC;yBAAM,CAAC;wBACN,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;wBAChE,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC;wBACjE,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,CAAC,IAAI,MAAM,WAAW,YAAY,WAAW,gBAAgB,CACxE,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACjE,CAAC;SACF;QAED;YACE,IAAI,EAAE,cAAc;YACpB,WAAW,EACT,iMAAiM;YACnM,MAAM,EAAE;gBACN,KAAK,EAAE,CAAC;qBACL,MAAM,EAAE;qBACR,QAAQ,CACP,wEAAwE,CACzE;gBACH,MAAM,EAAE,CAAC;qBACN,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;qBACjB,QAAQ,EAAE;qBACV,QAAQ,CACP,kJAAkJ,CACnJ;gBACH,cAAc,EAAE,CAAC;qBACd,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;qBACjB,QAAQ,EAAE;qBACV,QAAQ,CACP,+FAA+F,CAChG;gBACH,IAAI,EAAE,CAAC;qBACJ,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,iDAAiD,CAAC;gBAC9D,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,6BAA6B,CAAC;gBACrE,KAAK,EAAE,CAAC;qBACL,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,oDAAoD,CAAC;aAClE;YACD,OAAO,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;gBACtB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;gBAExD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrD,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,qCAAqC,SAAS,EAAE;6BAC7E;yBACF;wBACD,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;gBAEvD,wBAAwB;gBACxB,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,IAAI,gBAAgB,CAAC,KAAK,CAAC,CAAC;gBAChE,iCAAiC;gBACjC,MAAM,aAAa,GAAG,cAAc,CAAC,MAAM,CACzC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,CAAC,CACvD,CAAC;gBACF,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC3D,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,6BAA6B,MAAM,CAAC,KAAK,MAAM,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,SAAS,EAAE;6BAC3G;yBACF;wBACD,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,oCAAoC;gBACpC,IAAI,gBAAgB,GAAG,EAAE,CAAC;gBAC1B,IAAI,MAAM,CAAC,cAAc,EAAE,MAAM,EAAE,CAAC;oBAClC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,CAAC,IAAI,CACnC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,gBAAgB,CACjC,CAAC;oBACF,IAAI,WAAW,EAAE,CAAC;wBAChB,gBAAgB,GAAG,oBAAoB,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;oBAC7E,CAAC;gBACH,CAAC;gBAED,mBAAmB;gBACnB,MAAM,IAAI,GAAa;oBACrB,wBAAwB,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,aAAa,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI;iBACrF,CAAC;gBACF,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;oBAChB,IAAI,CAAC,IAAI,CAAC,UAAU,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC3D,CAAC;gBAED,MAAM,KAAK,GAAG;;cAER,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;;;kBAG3B,cAAc,CAAC,IAAI,CAAC,oBAAoB,CAAC;kBACzC,gBAAgB;;;;UAIxB,CAAC;gBAEH,MAAM,IAAI,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC,KAAK,CAAC,CAKjD,CAAC;gBAEF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAEzC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oBAC1B,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,yBAAyB,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;6BAClG;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE;wBACP;4BACE,IAAI,EAAE,MAAM;4BACZ,IAAI,EAAE,kBAAkB,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC;yBACvD;qBACF;iBACF,CAAC;YACJ,CAAC;SACF;QAED;YACE,IAAI,EAAE,kBAAkB;YACxB,WAAW,EACT,gIAAgI;YAClI,MAAM,EAAE;gBACN,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,oCAAoC,CAAC;aACjE;YACD,OAAO,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;gBACtB,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;gBAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,KAAK,CAAC,CAAC;gBAExD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,MAAM,SAAS,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACrD,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,UAAU,MAAM,CAAC,KAAK,8BAA8B,SAAS,EAAE;6BACtE;yBACF;wBACD,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,MAAM,KAAK,GAAa;oBACtB,GAAG,KAAK,CAAC,IAAI,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,SAAS;oBAC/C,SAAS,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;oBACvC,EAAE;oBACF,SAAS;iBACV,CAAC;gBAEF,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;oBACjC,MAAM,MAAM,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC;oBACjD,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,IAAI,KAAK,KAAK,CAAC,QAAQ,GAAG,MAAM,EAAE,CAAC,CAAC;gBAC5D,CAAC;gBAED,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;YACjE,CAAC;SACF;KACF,CAAC;AACJ,CAAC;AAUD,qBAAqB;AAErB,SAAS,kBAAkB,CACzB,SAAiB,EACjB,MAA6D,EAC7D,MAAyB;IAEzB,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;IAEjC,MAAM,KAAK,GAAa;QACtB,GAAG,SAAS,MAAM,OAAO,CAAC,SAAS,mBAAmB,IAAI,CAAC,MAAM,EAAE;QACnE,EAAE;KACH,CAAC;IAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,IAAI,GAAI,GAAG,CAAC,IAAe,IAAI,SAAS,CAAC;QAC/C,MAAM,MAAM,GAAG,GAAG,CAAC,MAA4B,CAAC;QAEhD,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC;QAEtB,qDAAqD;QACrD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/C,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;gBACnB,SAAS;YACX,CAAC;YACD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBAC1C,SAAS;YACX,CAAC;YAED,IACE,OAAO,KAAK,KAAK,QAAQ;gBACzB,OAAO,KAAK,KAAK,QAAQ;gBACzB,OAAO,KAAK,KAAK,SAAS,EAC1B,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC;YACnC,CAAC;iBAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;gBACrC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;QAED,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,QAAQ,GAAI,GAAG,CAAC,IAAe,IAAI,UAAU,CAAC;YACpD,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAC7D,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,IAAI,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CACR,2CAA2C,OAAO,CAAC,QAAQ,mBAAmB,CAC/E,CAAC;IACJ,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Order tools — list and inspect orders.
3
+ */
4
+ import type { CrystallizeClient } from '../client.js';
5
+ import type { ToolDefinition } from '../types.js';
6
+ export declare function orderTools(client: CrystallizeClient): ToolDefinition[];
7
+ //# sourceMappingURL=orders.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orders.d.ts","sourceRoot":"","sources":["../../../src/tools/orders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAGlD,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAmRtE"}
@@ -0,0 +1,250 @@
1
+ /**
2
+ * Order tools — list and inspect orders.
3
+ */
4
+ import { z } from 'zod';
5
+ import { maskEmail } from '../pii.js';
6
+ export function orderTools(client) {
7
+ return [
8
+ {
9
+ name: 'list_orders',
10
+ description: 'List orders for a customer by their identifier. Returns order IDs, dates, totals, and deep links to the Crystallize UI. Supports pagination.',
11
+ schema: {
12
+ customerIdentifier: z
13
+ .string()
14
+ .describe('Customer identifier (email or unique ID)'),
15
+ first: z.number().default(20).describe('Max orders to return'),
16
+ after: z
17
+ .string()
18
+ .optional()
19
+ .describe('Pagination cursor from a previous response'),
20
+ },
21
+ handler: async (params) => {
22
+ const { customerIdentifier, first, after } = params;
23
+ const afterArg = after ? `, after: "${after}"` : '';
24
+ const query = `
25
+ query ListOrders($customerIdentifier: String!, $first: Int) {
26
+ orders {
27
+ getAll(customerIdentifier: $customerIdentifier, first: $first${afterArg}) {
28
+ pageInfo {
29
+ hasNextPage
30
+ hasPreviousPage
31
+ startCursor
32
+ endCursor
33
+ totalNodes
34
+ }
35
+ edges {
36
+ node {
37
+ id
38
+ createdAt
39
+ updatedAt
40
+ customer {
41
+ identifier
42
+ firstName
43
+ lastName
44
+ }
45
+ total {
46
+ gross
47
+ net
48
+ currency
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ `;
56
+ const data = await client.api.orderApi(query, {
57
+ customerIdentifier,
58
+ first,
59
+ });
60
+ const result = data.orders?.getAll;
61
+ if (!result) {
62
+ return {
63
+ content: [
64
+ {
65
+ type: 'text',
66
+ text: `No orders found for customer "${customerIdentifier}"`,
67
+ },
68
+ ],
69
+ };
70
+ }
71
+ const orders = (result.edges ?? []).map(e => e.node);
72
+ if (orders.length === 0) {
73
+ return {
74
+ content: [
75
+ {
76
+ type: 'text',
77
+ text: `No orders found for customer "${customerIdentifier}"`,
78
+ },
79
+ ],
80
+ };
81
+ }
82
+ const total = result.pageInfo.totalNodes ?? orders.length;
83
+ const pii = client.config.piiMode;
84
+ const displayIdentifier = pii !== 'full' && customerIdentifier.includes('@')
85
+ ? maskEmail(customerIdentifier)
86
+ : customerIdentifier;
87
+ const lines = [
88
+ `Orders for "${displayIdentifier}" (${orders.length} of ${total}):`,
89
+ '',
90
+ ];
91
+ for (const order of orders) {
92
+ lines.push(`Order ${order.id}`);
93
+ lines.push(` Created: ${order.createdAt}`);
94
+ if (pii !== 'none') {
95
+ const name = [order.customer?.firstName, order.customer?.lastName]
96
+ .filter(Boolean)
97
+ .join(' ');
98
+ if (name) {
99
+ lines.push(` Customer: ${name}`);
100
+ }
101
+ }
102
+ if (order.total) {
103
+ lines.push(` Total: ${order.total.gross} ${order.total.currency} (net: ${order.total.net})`);
104
+ }
105
+ lines.push(` Link: ${client.orderLink(order.id)}`);
106
+ lines.push('');
107
+ }
108
+ if (result.pageInfo.hasNextPage && result.pageInfo.endCursor) {
109
+ lines.push(`Next page cursor: ${result.pageInfo.endCursor}`);
110
+ }
111
+ return {
112
+ content: [{ type: 'text', text: lines.join('\n') }],
113
+ };
114
+ },
115
+ },
116
+ {
117
+ name: 'get_order',
118
+ description: 'Get full details for an order by ID. Returns cart items, customer info, totals, payment provider, and a deep link to the Crystallize UI.',
119
+ schema: {
120
+ id: z.string().describe('Order ID'),
121
+ },
122
+ handler: async (params) => {
123
+ const { id } = params;
124
+ const query = `
125
+ query GetOrder($id: ID!) {
126
+ orders {
127
+ get(id: $id) {
128
+ id
129
+ createdAt
130
+ updatedAt
131
+ customer {
132
+ identifier
133
+ firstName
134
+ lastName
135
+ addresses {
136
+ type
137
+ street
138
+ city
139
+ country
140
+ email
141
+ phone
142
+ }
143
+ }
144
+ cart {
145
+ name
146
+ sku
147
+ quantity
148
+ imageUrl
149
+ price {
150
+ gross
151
+ net
152
+ discounts { percent }
153
+ }
154
+ }
155
+ total {
156
+ gross
157
+ net
158
+ currency
159
+ tax { name percent }
160
+ }
161
+ payment {
162
+ __typename
163
+ ... on CustomPayment { provider }
164
+ }
165
+ }
166
+ }
167
+ }
168
+ `;
169
+ const data = await client.api.orderApi(query, { id });
170
+ const order = data.orders?.get;
171
+ if (!order) {
172
+ return {
173
+ content: [{ type: 'text', text: `Order "${id}" not found.` }],
174
+ isError: true,
175
+ };
176
+ }
177
+ const lines = [
178
+ `Order ${order.id}`,
179
+ ` Created: ${order.createdAt}`,
180
+ ` Updated: ${order.updatedAt}`,
181
+ ` Link: ${client.orderLink(order.id)}`,
182
+ ];
183
+ const pii = client.config.piiMode;
184
+ if (order.customer) {
185
+ const c = order.customer;
186
+ lines.push('');
187
+ const maskedId = pii !== 'full' && c.identifier.includes('@')
188
+ ? maskEmail(c.identifier)
189
+ : c.identifier;
190
+ if (pii === 'none') {
191
+ lines.push(`Customer: ${maskedId}`);
192
+ }
193
+ else {
194
+ const name = [c.firstName, c.lastName].filter(Boolean).join(' ');
195
+ lines.push(`Customer: ${name || maskedId} (${maskedId})`);
196
+ for (const addr of c.addresses ?? []) {
197
+ if (pii === 'masked') {
198
+ const addrStr = [addr.city, addr.country]
199
+ .filter(Boolean)
200
+ .join(', ');
201
+ lines.push(` ${addr.type}: ${addrStr || '(masked)'}`);
202
+ }
203
+ else {
204
+ const addrStr = [addr.street, addr.city, addr.country]
205
+ .filter(Boolean)
206
+ .join(', ');
207
+ lines.push(` ${addr.type}: ${addrStr}`);
208
+ if (addr.email) {
209
+ lines.push(` Email: ${addr.email}`);
210
+ }
211
+ if (addr.phone) {
212
+ lines.push(` Phone: ${addr.phone}`);
213
+ }
214
+ }
215
+ }
216
+ }
217
+ }
218
+ if (order.cart?.length) {
219
+ lines.push('');
220
+ lines.push(`Cart (${order.cart.length} item(s)):`);
221
+ for (const item of order.cart) {
222
+ lines.push(` ${item.name ?? item.sku} × ${item.quantity}`);
223
+ lines.push(` SKU: ${item.sku}`);
224
+ if (item.price) {
225
+ lines.push(` Price: ${item.price.gross} (net: ${item.price.net})`);
226
+ }
227
+ }
228
+ }
229
+ if (order.total) {
230
+ lines.push('');
231
+ lines.push(`Total: ${order.total.gross} ${order.total.currency} (net: ${order.total.net})`);
232
+ if (order.total.tax) {
233
+ lines.push(` Tax: ${order.total.tax.name} ${order.total.tax.percent}%`);
234
+ }
235
+ }
236
+ if (order.payment?.length) {
237
+ const providers = order.payment
238
+ .map(p => p.provider ?? p.__typename ?? 'unknown')
239
+ .join(', ');
240
+ lines.push('');
241
+ lines.push(`Payment: ${providers}`);
242
+ }
243
+ return {
244
+ content: [{ type: 'text', text: lines.join('\n') }],
245
+ };
246
+ },
247
+ },
248
+ ];
249
+ }
250
+ //# sourceMappingURL=orders.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"orders.js","sourceRoot":"","sources":["../../../src/tools/orders.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,MAAM,UAAU,UAAU,CAAC,MAAyB;IAClD,OAAO;QACL;YACE,IAAI,EAAE,aAAa;YACnB,WAAW,EACT,8IAA8I;YAChJ,MAAM,EAAE;gBACN,kBAAkB,EAAE,CAAC;qBAClB,MAAM,EAAE;qBACR,QAAQ,CAAC,0CAA0C,CAAC;gBACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;gBAC9D,KAAK,EAAE,CAAC;qBACL,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,4CAA4C,CAAC;aAC1D;YACD,OAAO,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;gBACtB,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;gBAEpD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,MAAM,KAAK,GAAG;;;6EAGuD,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA4B5E,CAAC;gBAEF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE;oBAC5C,kBAAkB;oBAClB,KAAK;iBACN,CAAC,CAAC;gBACH,MAAM,MAAM,GAAI,IAA2B,CAAC,MAAM,EAAE,MAAM,CAAC;gBAE3D,IAAI,CAAC,MAAM,EAAE,CAAC;oBACZ,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,iCAAiC,kBAAkB,GAAG;6BAC7D;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;gBAErD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACxB,OAAO;wBACL,OAAO,EAAE;4BACP;gCACE,IAAI,EAAE,MAAM;gCACZ,IAAI,EAAE,iCAAiC,kBAAkB,GAAG;6BAC7D;yBACF;qBACF,CAAC;gBACJ,CAAC;gBAED,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC;gBAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;gBAElC,MAAM,iBAAiB,GACrB,GAAG,KAAK,MAAM,IAAI,kBAAkB,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAChD,CAAC,CAAC,SAAS,CAAC,kBAAkB,CAAC;oBAC/B,CAAC,CAAC,kBAAkB,CAAC;gBAEzB,MAAM,KAAK,GAAa;oBACtB,eAAe,iBAAiB,MAAM,MAAM,CAAC,MAAM,OAAO,KAAK,IAAI;oBACnE,EAAE;iBACH,CAAC;gBAEF,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;oBAChC,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;oBAC5C,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;wBACnB,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,CAAC;6BAC/D,MAAM,CAAC,OAAO,CAAC;6BACf,IAAI,CAAC,GAAG,CAAC,CAAC;wBACb,IAAI,IAAI,EAAE,CAAC;4BACT,KAAK,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC;wBACpC,CAAC;oBACH,CAAC;oBACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;wBAChB,KAAK,CAAC,IAAI,CACR,YAAY,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,UAAU,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAClF,CAAC;oBACJ,CAAC;oBACD,KAAK,CAAC,IAAI,CAAC,WAAW,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;oBACpD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjB,CAAC;gBAED,IAAI,MAAM,CAAC,QAAQ,CAAC,WAAW,IAAI,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;oBAC7D,KAAK,CAAC,IAAI,CAAC,qBAAqB,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;gBAC/D,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;iBACpD,CAAC;YACJ,CAAC;SACF;QAED;YACE,IAAI,EAAE,WAAW;YACjB,WAAW,EACT,0IAA0I;YAC5I,MAAM,EAAE;gBACN,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;aACpC;YACD,OAAO,EAAE,KAAK,EAAC,MAAM,EAAC,EAAE;gBACtB,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;gBAEtB,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA4Cb,CAAC;gBAEF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;gBACtD,MAAM,KAAK,GAAI,IAAyB,CAAC,MAAM,EAAE,GAAG,CAAC;gBAErD,IAAI,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO;wBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,UAAU,EAAE,cAAc,EAAE,CAAC;wBAC7D,OAAO,EAAE,IAAI;qBACd,CAAC;gBACJ,CAAC;gBAED,MAAM,KAAK,GAAa;oBACtB,SAAS,KAAK,CAAC,EAAE,EAAE;oBACnB,cAAc,KAAK,CAAC,SAAS,EAAE;oBAC/B,cAAc,KAAK,CAAC,SAAS,EAAE;oBAC/B,WAAW,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE;iBACxC,CAAC;gBAEF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC;gBAElC,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;oBACnB,MAAM,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC;oBACzB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,MAAM,QAAQ,GACZ,GAAG,KAAK,MAAM,IAAI,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC;wBAC1C,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;wBACzB,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC;oBACnB,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;wBACnB,KAAK,CAAC,IAAI,CAAC,aAAa,QAAQ,EAAE,CAAC,CAAC;oBACtC,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;wBACjE,KAAK,CAAC,IAAI,CAAC,aAAa,IAAI,IAAI,QAAQ,KAAK,QAAQ,GAAG,CAAC,CAAC;wBAC1D,KAAK,MAAM,IAAI,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;4BACrC,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;gCACrB,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC;qCACtC,MAAM,CAAC,OAAO,CAAC;qCACf,IAAI,CAAC,IAAI,CAAC,CAAC;gCACd,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,UAAU,EAAE,CAAC,CAAC;4BACzD,CAAC;iCAAM,CAAC;gCACN,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC;qCACnD,MAAM,CAAC,OAAO,CAAC;qCACf,IAAI,CAAC,IAAI,CAAC,CAAC;gCACd,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;gCACzC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oCACf,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gCACzC,CAAC;gCACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;oCACf,KAAK,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;gCACzC,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;oBACvB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,MAAM,YAAY,CAAC,CAAC;oBACnD,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBAC9B,KAAK,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;wBAC5D,KAAK,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;wBACnC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;4BACf,KAAK,CAAC,IAAI,CACR,cAAc,IAAI,CAAC,KAAK,CAAC,KAAK,UAAU,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,CAC1D,CAAC;wBACJ,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;oBAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,KAAK,CAAC,IAAI,CACR,UAAU,KAAK,CAAC,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,UAAU,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,CAChF,CAAC;oBACF,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;wBACpB,KAAK,CAAC,IAAI,CACR,UAAU,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,CAC7D,CAAC;oBACJ,CAAC;gBACH,CAAC;gBAED,IAAI,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,CAAC;oBAC1B,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO;yBAC5B,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,IAAI,SAAS,CAAC;yBACjD,IAAI,CAAC,IAAI,CAAC,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;oBACf,KAAK,CAAC,IAAI,CAAC,YAAY,SAAS,EAAE,CAAC,CAAC;gBACtC,CAAC;gBAED,OAAO;oBACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;iBACpD,CAAC;YACJ,CAAC;SACF;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Shape & tenant tools — inspect shapes, components, and tenant configuration.
3
+ */
4
+ import type { CrystallizeClient } from '../client.js';
5
+ import type { ToolDefinition } from '../types.js';
6
+ export declare function shapeTools(client: CrystallizeClient): ToolDefinition[];
7
+ //# sourceMappingURL=shapes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shapes.d.ts","sourceRoot":"","sources":["../../../src/tools/shapes.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,wBAAgB,UAAU,CAAC,MAAM,EAAE,iBAAiB,GAAG,cAAc,EAAE,CAiNtE"}