@aphexcms/cms-core 9.2.2 → 9.3.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 (59) hide show
  1. package/dist/cli/index.js +22 -0
  2. package/dist/cli/index.js.map +1 -1
  3. package/dist/cli/migrate.d.ts +10 -0
  4. package/dist/cli/migrate.d.ts.map +1 -0
  5. package/dist/cli/migrate.js +80 -0
  6. package/dist/cli/migrate.js.map +1 -0
  7. package/dist/components/admin/DocumentVersionPanel.svelte +3 -0
  8. package/dist/components/admin/DocumentVersionPanel.svelte.d.ts.map +1 -1
  9. package/dist/components/admin/MediaBrowser.svelte +0 -1
  10. package/dist/components/admin/MediaBrowser.svelte.d.ts.map +1 -1
  11. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte +3 -0
  12. package/dist/components/admin/fields/richtext/PortableTextImageView.svelte.d.ts.map +1 -1
  13. package/dist/components/admin/fields/richtext/PortableTextInlineView.svelte +3 -1
  14. package/dist/components/admin/fields/richtext/PortableTextInlineView.svelte.d.ts.map +1 -1
  15. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte +3 -0
  16. package/dist/components/admin/fields/richtext/PortableTextObjectView.svelte.d.ts.map +1 -1
  17. package/dist/components/admin/fields/richtext/RichtextField.svelte +8 -20
  18. package/dist/components/admin/fields/richtext/RichtextField.svelte.d.ts.map +1 -1
  19. package/dist/components/admin/fields/richtext/block-defaults.d.ts +4 -0
  20. package/dist/components/admin/fields/richtext/block-defaults.d.ts.map +1 -0
  21. package/dist/components/admin/fields/richtext/block-defaults.js +8 -0
  22. package/dist/lib/components/admin/fields/richtext/block-defaults.d.ts +4 -0
  23. package/dist/lib/components/admin/fields/richtext/block-defaults.d.ts.map +1 -0
  24. package/dist/lib/components/admin/fields/richtext/block-defaults.js +9 -0
  25. package/dist/lib/components/admin/fields/richtext/block-defaults.js.map +1 -0
  26. package/dist/lib/mcp/tools.d.ts +28 -0
  27. package/dist/lib/mcp/tools.d.ts.map +1 -0
  28. package/dist/lib/mcp/tools.js +464 -0
  29. package/dist/lib/mcp/tools.js.map +1 -0
  30. package/dist/lib/routes/mcp.d.ts +5 -0
  31. package/dist/lib/routes/mcp.d.ts.map +1 -0
  32. package/dist/lib/routes/mcp.js +72 -0
  33. package/dist/lib/routes/mcp.js.map +1 -0
  34. package/dist/lib/schema-utils/validator.d.ts +6 -0
  35. package/dist/lib/schema-utils/validator.d.ts.map +1 -1
  36. package/dist/lib/schema-utils/validator.js +21 -15
  37. package/dist/lib/schema-utils/validator.js.map +1 -1
  38. package/dist/lib/server/index.d.ts +2 -1
  39. package/dist/lib/server/index.d.ts.map +1 -1
  40. package/dist/lib/server/index.js +4 -1
  41. package/dist/lib/server/index.js.map +1 -1
  42. package/dist/lib/vite/index.d.ts.map +1 -1
  43. package/dist/lib/vite/index.js +12 -1
  44. package/dist/lib/vite/index.js.map +1 -1
  45. package/dist/mcp/tools.d.ts +28 -0
  46. package/dist/mcp/tools.d.ts.map +1 -0
  47. package/dist/mcp/tools.js +463 -0
  48. package/dist/routes/mcp.d.ts +5 -0
  49. package/dist/routes/mcp.d.ts.map +1 -0
  50. package/dist/routes/mcp.js +71 -0
  51. package/dist/schema-utils/validator.d.ts +6 -0
  52. package/dist/schema-utils/validator.d.ts.map +1 -1
  53. package/dist/schema-utils/validator.js +21 -15
  54. package/dist/server/index.d.ts +2 -1
  55. package/dist/server/index.d.ts.map +1 -1
  56. package/dist/server/index.js +4 -1
  57. package/dist/vite/index.d.ts.map +1 -1
  58. package/dist/vite/index.js +12 -1
  59. package/package.json +3 -1
@@ -0,0 +1,464 @@
1
+ // MCP tool registry — transport-agnostic.
2
+ //
3
+ // Each tool is a plain { name, description, inputSchema, handler } descriptor.
4
+ // The MCP route (routes/mcp.ts) registers these into an MCP SDK server, but the
5
+ // registry itself has no MCP dependency — a future in-admin AI panel can consume
6
+ // the exact same tools. Input schemas are zod (matching the project's
7
+ // zod-as-contract convention). Tools are built per-request and bound to an
8
+ // authenticated LocalAPIContext, so every operation rides the caller's RBAC +
9
+ // RLS scope.
10
+ import { z } from 'zod';
11
+ import { VALID_FIELD_TYPES, RESERVED_FIELDS, validateSchemaReferences } from '../schema-utils/validator.js';
12
+ import { validateDocumentData } from '../field-validation/utils.js';
13
+ import { DEFAULT_BLOCK_STYLES, DEFAULT_BLOCK_DECORATORS, DEFAULT_BLOCK_LISTS } from '../components/admin/fields/richtext/block-defaults.js';
14
+ const ok = (data) => ({
15
+ content: [{ type: 'text', text: JSON.stringify(data, null, 2) }]
16
+ });
17
+ const fail = (message) => ({
18
+ content: [{ type: 'text', text: message }],
19
+ isError: true
20
+ });
21
+ function asString(args, key) {
22
+ const v = args[key];
23
+ return typeof v === 'string' && v.length > 0 ? v : null;
24
+ }
25
+ function asRecord(args, key) {
26
+ const v = args[key];
27
+ return v && typeof v === 'object' && !Array.isArray(v) ? v : null;
28
+ }
29
+ const perspectiveArg = (v) => v === 'published' ? 'published' : 'draft';
30
+ /** Walk a schema's fields (depth-limited) and collect reference edges from the real field data. */
31
+ function collectReferences(schemaName, fields, edges, prefix = '') {
32
+ for (const f of fields) {
33
+ const path = prefix ? `${prefix}.${f.name}` : f.name;
34
+ if (f.type === 'reference') {
35
+ edges.push({ from: schemaName, path, to: f.to.map((t) => t.type) });
36
+ }
37
+ else if (f.type === 'array') {
38
+ for (const ref of f.of) {
39
+ if (ref.to && ref.to.length > 0) {
40
+ edges.push({ from: schemaName, path: `${path}[]`, to: ref.to.map((t) => t.type) });
41
+ }
42
+ }
43
+ }
44
+ else if (f.type === 'object') {
45
+ collectReferences(schemaName, f.fields, edges, path);
46
+ }
47
+ }
48
+ }
49
+ /**
50
+ * Portable Text is an open spec (portabletext.org), so we do NOT re-document the
51
+ * block/span/mark node shape here — we point at the spec. What we DO surface is
52
+ * the part that is NOT in the spec and IS specific to this schema: the allowed
53
+ * block styles, mark decorators/annotations, and custom block types — all derived
54
+ * live from the schema. Returns null if the schema has no rich-text fields.
55
+ */
56
+ function portableTextGuide(schema) {
57
+ const buildCustomExample = (ref) => {
58
+ const example = { _type: ref.type, _key: '<unique>' };
59
+ for (const f of ref.fields ?? [])
60
+ example[f.name] = `<${f.type}>`;
61
+ return example;
62
+ };
63
+ const fields = {};
64
+ for (const field of schema.fields) {
65
+ if (field.type !== 'array')
66
+ continue;
67
+ const block = field.of.find((o) => o.type === 'block');
68
+ if (!block)
69
+ continue;
70
+ fields[field.name] = {
71
+ styles: block.styles?.map((s) => s.value) ?? DEFAULT_BLOCK_STYLES,
72
+ decorators: block.marks?.decorators?.map((d) => d.value) ?? DEFAULT_BLOCK_DECORATORS,
73
+ lists: block.lists?.map((l) => l.value) ?? DEFAULT_BLOCK_LISTS,
74
+ // `link` is always available in the editor; plus any schema-defined annotations.
75
+ annotations: ['link', ...(block.marks?.annotations?.map((a) => a.name) ?? [])],
76
+ customBlockTypes: field.of
77
+ .filter((o) => o.type !== 'block')
78
+ .map((o) => ({ type: o.type, example: buildCustomExample(o) }))
79
+ };
80
+ }
81
+ if (Object.keys(fields).length === 0)
82
+ return null;
83
+ return {
84
+ spec: 'https://portabletext.org',
85
+ note: "These fields are Portable Text (an open spec — follow it for the block/span/mark node shape). Every array item needs a unique string `_key`. The values below are this schema's specifics, not part of the spec: allowed block `style`s, mark decorators/annotations, and custom block types you can insert between text blocks.",
86
+ fields
87
+ };
88
+ }
89
+ /**
90
+ * Build the content-plane tools for one authenticated request.
91
+ * Safe to expose against a live instance: all writes go through LocalAPI, so a
92
+ * read-only API key is rejected by the permission layer, not by this registry.
93
+ */
94
+ export function buildContentTools({ aphexCMS, context }) {
95
+ const api = aphexCMS.localAPI;
96
+ const { assetService } = aphexCMS;
97
+ const orgId = context.organizationId;
98
+ return [
99
+ {
100
+ name: 'describe_cms',
101
+ description: 'Orientation for building against this CMS: all content types and their relationships, the valid field-type vocabulary, and what this API key is allowed to do. Call this first. All data is derived live from the running config — never stale. For exact field/schema TypeScript signatures, read the SchemaType and Field types from the `@aphexcms/cms-core` package (and the real schemas in src/lib/schemaTypes/*.ts).',
102
+ inputSchema: {},
103
+ handler: async () => {
104
+ const schemas = aphexCMS.config.schemaTypes;
105
+ const edges = [];
106
+ for (const s of schemas)
107
+ collectReferences(s.name, s.fields, edges);
108
+ const documentTypes = schemas
109
+ .filter((s) => s.type === 'document')
110
+ .map((s) => ({
111
+ name: s.name,
112
+ title: s.title,
113
+ singleton: s.type === 'document' ? (s.singleton ?? false) : false,
114
+ fieldCount: s.fields.length
115
+ }));
116
+ const objectTypes = schemas
117
+ .filter((s) => s.type === 'object')
118
+ .map((s) => ({ name: s.name, title: s.title, fieldCount: s.fields.length }));
119
+ const auth = context.auth;
120
+ const capabilities = auth?.type === 'api_key'
121
+ ? {
122
+ authType: 'api_key',
123
+ canWrite: auth.permissions.includes('write'),
124
+ permissions: auth.permissions,
125
+ capabilities: auth.capabilities
126
+ }
127
+ : auth?.type === 'session'
128
+ ? { authType: 'session', canWrite: true, capabilities: auth.capabilities }
129
+ : { authType: 'unknown', canWrite: false };
130
+ return ok({
131
+ organizationId: orgId,
132
+ documentTypes,
133
+ objectTypes,
134
+ referenceGraph: edges,
135
+ validFieldTypes: VALID_FIELD_TYPES,
136
+ reservedFieldNames: RESERVED_FIELDS,
137
+ capabilities,
138
+ typeReference: "Import SchemaType/Field from '@aphexcms/cms-core' for exact per-field-type props and validation Rule API; TypeScript enforces them. Read existing schemas in src/lib/schemaTypes/*.ts as working examples."
139
+ });
140
+ }
141
+ },
142
+ {
143
+ name: 'list_collections',
144
+ description: 'List the document collections (content types) available in this CMS, with their names and titles.',
145
+ inputSchema: {},
146
+ handler: async () => {
147
+ const names = api.getCollectionNames();
148
+ const collections = names.map((name) => {
149
+ const schema = api.getCollectionSchema(name);
150
+ return { name, title: schema?.title ?? name, singleton: schema?.singleton ?? false };
151
+ });
152
+ return ok({ collections });
153
+ }
154
+ },
155
+ {
156
+ name: 'get_schema',
157
+ description: "Get the field schema for one collection, so you know the shape to use when creating or updating its documents. Returns { schema, portableText? } — `portableText` is present when the type has rich-text (block) fields and links the open Portable Text spec plus this schema's allowed styles/marks/custom block types.",
158
+ inputSchema: { collection: z.string().describe('Collection name') },
159
+ handler: async (args) => {
160
+ const collection = asString(args, 'collection');
161
+ if (!collection)
162
+ return fail('Missing required string argument: collection');
163
+ const schema = api.getCollectionSchema(collection);
164
+ if (!schema)
165
+ return fail(`Unknown collection: ${collection}`);
166
+ const portableText = portableTextGuide(schema);
167
+ return ok(portableText ? { schema, portableText } : { schema });
168
+ }
169
+ },
170
+ {
171
+ name: 'validate_document',
172
+ description: 'Dry-run: validate document `data` against its collection schema WITHOUT saving, using the same validator as create/update. Returns field-level errors so you can fix them before create_document/update_document.',
173
+ inputSchema: {
174
+ collection: z.string().describe('Collection name'),
175
+ data: z.record(z.string(), z.unknown()).describe('Document field values to validate')
176
+ },
177
+ handler: async (args) => {
178
+ const collection = asString(args, 'collection');
179
+ const data = asRecord(args, 'data');
180
+ if (!collection || !data)
181
+ return fail('Missing required arguments: collection (string), data (object)');
182
+ const schema = api.getCollectionSchema(collection);
183
+ if (!schema)
184
+ return fail(`Unknown collection: ${collection}`);
185
+ try {
186
+ const result = await validateDocumentData(schema, data, data);
187
+ return ok({ isValid: result.isValid, errors: result.errors });
188
+ }
189
+ catch (err) {
190
+ return fail(`Validation failed: ${err instanceof Error ? err.message : String(err)}`);
191
+ }
192
+ }
193
+ },
194
+ {
195
+ name: 'validate_schema',
196
+ description: 'Validate a proposed schema definition (structure, field types, references, reserved field names) against the current CMS, WITHOUT writing a file. Use before writing a schema .ts file. Pass the schema as JSON — validation-rule functions are not needed for structural validation.',
197
+ inputSchema: {
198
+ schema: z
199
+ .record(z.string(), z.unknown())
200
+ .describe('Proposed SchemaType as JSON (type, name, title, fields, …)')
201
+ },
202
+ handler: async (args) => {
203
+ const proposed = asRecord(args, 'schema');
204
+ if (!proposed)
205
+ return fail('Missing required argument: schema (object)');
206
+ // Validate the proposed schema alongside the existing ones so its
207
+ // references resolve. `proposed` is external JSON asserted into SchemaType
208
+ // at this boundary; validateSchemaReferences is what actually checks it.
209
+ const all = [
210
+ ...aphexCMS.config.schemaTypes,
211
+ proposed
212
+ ];
213
+ try {
214
+ validateSchemaReferences(all);
215
+ return ok({ isValid: true, errors: [] });
216
+ }
217
+ catch (err) {
218
+ const message = err instanceof Error ? err.message : String(err);
219
+ return ok({ isValid: false, errors: message.split('\n') });
220
+ }
221
+ }
222
+ },
223
+ {
224
+ name: 'query_documents',
225
+ description: 'Query documents in a collection. Supports where filters, sorting, pagination, and draft/published perspective.',
226
+ inputSchema: {
227
+ collection: z.string().describe('Collection name'),
228
+ where: z
229
+ .record(z.string(), z.unknown())
230
+ .optional()
231
+ .describe('Filter conditions (LocalAPI Where syntax)'),
232
+ limit: z.number().optional().describe('Max results (default 50)'),
233
+ offset: z.number().optional().describe('Results to skip (default 0)'),
234
+ sort: z
235
+ .string()
236
+ .optional()
237
+ .describe("Sort field; prefix '-' for descending, e.g. '-updatedAt'"),
238
+ perspective: z
239
+ .enum(['draft', 'published'])
240
+ .optional()
241
+ .describe('Which content to read (default draft)')
242
+ },
243
+ handler: async (args) => {
244
+ const collection = asString(args, 'collection');
245
+ if (!collection)
246
+ return fail('Missing required string argument: collection');
247
+ const col = api.getCollection(collection);
248
+ if (!col)
249
+ return fail(`Unknown collection: ${collection}`);
250
+ // `where` is arbitrary filter JSON from the MCP client. WhereTyped permits
251
+ // dynamic field keys; assert the parsed object into it at this external
252
+ // boundary rather than validating every possible filter shape.
253
+ const where = (asRecord(args, 'where') ?? undefined);
254
+ const limit = typeof args.limit === 'number' ? args.limit : undefined;
255
+ const offset = typeof args.offset === 'number' ? args.offset : undefined;
256
+ const sort = asString(args, 'sort') ?? undefined;
257
+ try {
258
+ const result = await col.find(context, {
259
+ where,
260
+ limit,
261
+ offset,
262
+ sort,
263
+ perspective: perspectiveArg(args.perspective)
264
+ });
265
+ return ok(result);
266
+ }
267
+ catch (err) {
268
+ return fail(`Query failed: ${err instanceof Error ? err.message : String(err)}`);
269
+ }
270
+ }
271
+ },
272
+ {
273
+ name: 'get_document',
274
+ description: 'Get a single document by id from a collection.',
275
+ inputSchema: {
276
+ collection: z.string().describe('Collection name'),
277
+ id: z.string().describe('Document id'),
278
+ perspective: z.enum(['draft', 'published']).optional()
279
+ },
280
+ handler: async (args) => {
281
+ const collection = asString(args, 'collection');
282
+ const id = asString(args, 'id');
283
+ if (!collection || !id)
284
+ return fail('Missing required string arguments: collection, id');
285
+ const col = api.getCollection(collection);
286
+ if (!col)
287
+ return fail(`Unknown collection: ${collection}`);
288
+ try {
289
+ const doc = await col.findByID(context, id, {
290
+ perspective: perspectiveArg(args.perspective)
291
+ });
292
+ if (!doc)
293
+ return fail(`Document not found: ${collection}/${id}`);
294
+ return ok(doc);
295
+ }
296
+ catch (err) {
297
+ return fail(`Get failed: ${err instanceof Error ? err.message : String(err)}`);
298
+ }
299
+ }
300
+ },
301
+ {
302
+ name: 'create_document',
303
+ description: 'Create a document in a collection. Pass field values in `data` (matching the collection schema). Set publish:true to publish immediately, otherwise it is saved as a draft.',
304
+ inputSchema: {
305
+ collection: z.string().describe('Collection name'),
306
+ data: z
307
+ .record(z.string(), z.unknown())
308
+ .describe('Field values matching the collection schema'),
309
+ publish: z.boolean().optional().describe('Publish immediately (default false)')
310
+ },
311
+ handler: async (args) => {
312
+ const collection = asString(args, 'collection');
313
+ const data = asRecord(args, 'data');
314
+ if (!collection || !data)
315
+ return fail('Missing required arguments: collection (string), data (object)');
316
+ const col = api.getCollection(collection);
317
+ if (!col)
318
+ return fail(`Unknown collection: ${collection}`);
319
+ try {
320
+ const result = await col.create(context, data, { publish: args.publish === true });
321
+ return ok(result);
322
+ }
323
+ catch (err) {
324
+ return fail(`Create failed: ${err instanceof Error ? err.message : String(err)}`);
325
+ }
326
+ }
327
+ },
328
+ {
329
+ name: 'update_document',
330
+ description: 'Update fields on an existing document. Only include the fields you want to change in `data`. Set publish:true to publish the result.',
331
+ inputSchema: {
332
+ collection: z.string().describe('Collection name'),
333
+ id: z.string().describe('Document id'),
334
+ data: z.record(z.string(), z.unknown()).describe('Partial field values to update'),
335
+ publish: z.boolean().optional().describe('Publish after updating (default false)')
336
+ },
337
+ handler: async (args) => {
338
+ const collection = asString(args, 'collection');
339
+ const id = asString(args, 'id');
340
+ const data = asRecord(args, 'data');
341
+ if (!collection || !id || !data)
342
+ return fail('Missing required arguments: collection, id (strings), data (object)');
343
+ const col = api.getCollection(collection);
344
+ if (!col)
345
+ return fail(`Unknown collection: ${collection}`);
346
+ try {
347
+ const result = await col.update(context, id, data, { publish: args.publish === true });
348
+ if (!result)
349
+ return fail(`Document not found: ${collection}/${id}`);
350
+ return ok(result);
351
+ }
352
+ catch (err) {
353
+ return fail(`Update failed: ${err instanceof Error ? err.message : String(err)}`);
354
+ }
355
+ }
356
+ },
357
+ {
358
+ name: 'publish_document',
359
+ description: 'Publish a document (copies its current draft to the published perspective).',
360
+ inputSchema: {
361
+ collection: z.string().describe('Collection name'),
362
+ id: z.string().describe('Document id')
363
+ },
364
+ handler: async (args) => {
365
+ const collection = asString(args, 'collection');
366
+ const id = asString(args, 'id');
367
+ if (!collection || !id)
368
+ return fail('Missing required string arguments: collection, id');
369
+ const col = api.getCollection(collection);
370
+ if (!col)
371
+ return fail(`Unknown collection: ${collection}`);
372
+ try {
373
+ const doc = await col.publish(context, id);
374
+ if (!doc)
375
+ return fail(`Document not found: ${collection}/${id}`);
376
+ return ok(doc);
377
+ }
378
+ catch (err) {
379
+ return fail(`Publish failed: ${err instanceof Error ? err.message : String(err)}`);
380
+ }
381
+ }
382
+ },
383
+ {
384
+ name: 'get_singleton',
385
+ description: 'Get a singleton document (a type where exactly one exists, e.g. site settings — flagged `singleton: true` in describe_cms). No id needed; the canonical row is resolved (and lazily created empty on first access). Use this instead of get_document for singletons.',
386
+ inputSchema: {
387
+ collection: z.string().describe('Singleton collection name'),
388
+ perspective: z.enum(['draft', 'published']).optional()
389
+ },
390
+ handler: async (args) => {
391
+ const collection = asString(args, 'collection');
392
+ if (!collection)
393
+ return fail('Missing required string argument: collection');
394
+ const col = api.getCollection(collection);
395
+ if (!col)
396
+ return fail(`Unknown collection: ${collection}`);
397
+ try {
398
+ const doc = await col.get(context, { perspective: perspectiveArg(args.perspective) });
399
+ return ok(doc);
400
+ }
401
+ catch (err) {
402
+ // SingletonOperationError when the type isn't a singleton — surface its message.
403
+ return fail(err instanceof Error ? err.message : String(err));
404
+ }
405
+ }
406
+ },
407
+ {
408
+ name: 'update_singleton',
409
+ description: 'Update a singleton document (e.g. site settings). No id needed — the canonical row is resolved by type. Include only the fields to change in `data`. Set publish:true to publish the result. Use this instead of update_document for singletons.',
410
+ inputSchema: {
411
+ collection: z.string().describe('Singleton collection name'),
412
+ data: z.record(z.string(), z.unknown()).describe('Partial field values to update'),
413
+ publish: z.boolean().optional().describe('Publish after updating (default false)')
414
+ },
415
+ handler: async (args) => {
416
+ const collection = asString(args, 'collection');
417
+ const data = asRecord(args, 'data');
418
+ if (!collection || !data)
419
+ return fail('Missing required arguments: collection (string), data (object)');
420
+ const col = api.getCollection(collection);
421
+ if (!col)
422
+ return fail(`Unknown collection: ${collection}`);
423
+ const id = col.getSingletonId(context);
424
+ if (!id)
425
+ return fail(`'${collection}' is not a singleton. Use update_document instead.`);
426
+ try {
427
+ // Ensure the canonical row exists (get lazily creates it), then update.
428
+ await col.get(context);
429
+ const result = await col.update(context, id, data, { publish: args.publish === true });
430
+ if (!result)
431
+ return fail(`Failed to update singleton '${collection}'.`);
432
+ return ok(result);
433
+ }
434
+ catch (err) {
435
+ return fail(`Update failed: ${err instanceof Error ? err.message : String(err)}`);
436
+ }
437
+ }
438
+ },
439
+ {
440
+ name: 'list_assets',
441
+ description: 'List media assets (images and files) in this organization, optionally filtered.',
442
+ inputSchema: {
443
+ search: z.string().optional().describe('Filter by filename/text'),
444
+ assetType: z.enum(['image', 'file']).optional(),
445
+ limit: z.number().optional(),
446
+ offset: z.number().optional()
447
+ },
448
+ handler: async (args) => {
449
+ const search = asString(args, 'search') ?? undefined;
450
+ const assetType = args.assetType === 'image' || args.assetType === 'file' ? args.assetType : undefined;
451
+ const limit = typeof args.limit === 'number' ? args.limit : undefined;
452
+ const offset = typeof args.offset === 'number' ? args.offset : undefined;
453
+ try {
454
+ const assets = await assetService.findAssets(orgId, { search, assetType, limit, offset });
455
+ return ok({ assets, count: assets.length });
456
+ }
457
+ catch (err) {
458
+ return fail(`List assets failed: ${err instanceof Error ? err.message : String(err)}`);
459
+ }
460
+ }
461
+ }
462
+ ];
463
+ }
464
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/lib/mcp/tools.ts"],"names":[],"mappings":"AAAA,0CAA0C;AAC1C,EAAE;AACF,+EAA+E;AAC/E,gFAAgF;AAChF,iFAAiF;AACjF,sEAAsE;AACtE,2EAA2E;AAC3E,8EAA8E;AAC9E,aAAa;AAEb,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,OAAO,EACN,iBAAiB,EACjB,eAAe,EACf,wBAAwB,EACxB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACN,oBAAoB,EACpB,wBAAwB,EACxB,mBAAmB,EACnB,MAAM,oDAAoD,CAAC;AAoB5D,MAAM,EAAE,GAAG,CAAC,IAAa,EAAiB,EAAE,CAAC,CAAC;IAC7C,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;CAChE,CAAC,CAAC;AAEH,MAAM,IAAI,GAAG,CAAC,OAAe,EAAiB,EAAE,CAAC,CAAC;IACjD,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAC1C,OAAO,EAAE,IAAI;CACb,CAAC,CAAC;AAEH,SAAS,QAAQ,CAAC,IAA6B,EAAE,GAAW;IAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AACzD,CAAC;AAED,SAAS,QAAQ,CAAC,IAA6B,EAAE,GAAW;IAC3D,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IACpB,OAAO,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,CAA6B,CAAC,CAAC,CAAC,IAAI,CAAC;AAChG,CAAC;AAED,MAAM,cAAc,GAAG,CAAC,CAAU,EAAyB,EAAE,CAC5D,CAAC,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC;AAS3C,mGAAmG;AACnG,SAAS,iBAAiB,CACzB,UAAkB,EAClB,MAAe,EACf,KAAgB,EAChB,MAAM,GAAG,EAAE;IAEX,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACrD,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC/B,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,EAAE,EAAE,CAAC;gBACxB,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,IAAI,IAAI,EAAE,EAAE,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACpF,CAAC;YACF,CAAC;QACF,CAAC;aAAM,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAChC,iBAAiB,CAAC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC;IACF,CAAC;AACF,CAAC;AAED;;;;;;GAMG;AACH,SAAS,iBAAiB,CAAC,MAAkB;IAC5C,MAAM,kBAAkB,GAAG,CAAC,GAAkB,EAA2B,EAAE;QAC1E,MAAM,OAAO,GAA4B,EAAE,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;QAC/E,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,IAAI,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC;QAClE,OAAO,OAAO,CAAC;IAChB,CAAC,CAAC;IAEF,MAAM,MAAM,GAA4B,EAAE,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,SAAS;QACrC,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC;QACvD,IAAI,CAAC,KAAK;YAAE,SAAS;QACrB,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG;YACpB,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,oBAAoB;YACjE,UAAU,EAAE,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,wBAAwB;YACpF,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,mBAAmB;YAC9D,iFAAiF;YACjF,WAAW,EAAE,CAAC,MAAM,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YAC9E,gBAAgB,EAAE,KAAK,CAAC,EAAE;iBACxB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;iBACjC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;SAChE,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAClD,OAAO;QACN,IAAI,EAAE,0BAA0B;QAChC,IAAI,EAAE,kUAAkU;QACxU,MAAM;KACN,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAe;IACnE,MAAM,GAAG,GAAG,QAAQ,CAAC,QAAQ,CAAC;IAC9B,MAAM,EAAE,YAAY,EAAE,GAAG,QAAQ,CAAC;IAClC,MAAM,KAAK,GAAG,OAAO,CAAC,cAAc,CAAC;IAErC,OAAO;QACN;YACC,IAAI,EAAE,cAAc;YACpB,WAAW,EACV,6ZAA6Z;YAC9Z,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,KAAK,IAAI,EAAE;gBACnB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC5C,MAAM,KAAK,GAAc,EAAE,CAAC;gBAC5B,KAAK,MAAM,CAAC,IAAI,OAAO;oBAAE,iBAAiB,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;gBAEpE,MAAM,aAAa,GAAG,OAAO;qBAC3B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;qBACpC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBACZ,IAAI,EAAE,CAAC,CAAC,IAAI;oBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,SAAS,EAAE,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;oBACjE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;iBAC3B,CAAC,CAAC,CAAC;gBACL,MAAM,WAAW,GAAG,OAAO;qBACzB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC;qBAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAE9E,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;gBAC1B,MAAM,YAAY,GACjB,IAAI,EAAE,IAAI,KAAK,SAAS;oBACvB,CAAC,CAAC;wBACA,QAAQ,EAAE,SAAkB;wBAC5B,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;wBAC5C,WAAW,EAAE,IAAI,CAAC,WAAW;wBAC7B,YAAY,EAAE,IAAI,CAAC,YAAY;qBAC/B;oBACF,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,SAAS;wBACzB,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAkB,EAAE,QAAQ,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,CAAC,YAAY,EAAE;wBACnF,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAkB,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;gBAEvD,OAAO,EAAE,CAAC;oBACT,cAAc,EAAE,KAAK;oBACrB,aAAa;oBACb,WAAW;oBACX,cAAc,EAAE,KAAK;oBACrB,eAAe,EAAE,iBAAiB;oBAClC,kBAAkB,EAAE,eAAe;oBACnC,YAAY;oBACZ,aAAa,EACZ,4MAA4M;iBAC7M,CAAC,CAAC;YACJ,CAAC;SACD;QACD;YACC,IAAI,EAAE,kBAAkB;YACxB,WAAW,EACV,mGAAmG;YACpG,WAAW,EAAE,EAAE;YACf,OAAO,EAAE,KAAK,IAAI,EAAE;gBACnB,MAAM,KAAK,GAAG,GAAG,CAAC,kBAAkB,EAAE,CAAC;gBACvC,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;oBACtC,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC;oBAC7C,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,IAAI,KAAK,EAAE,CAAC;gBACtF,CAAC,CAAC,CAAC;gBACH,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;YAC5B,CAAC;SACD;QACD;YACC,IAAI,EAAE,YAAY;YAClB,WAAW,EACV,2TAA2T;YAC5T,WAAW,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC,EAAE;YACnE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAChD,IAAI,CAAC,UAAU;oBAAE,OAAO,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBAC7E,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBACnD,IAAI,CAAC,MAAM;oBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;gBAC9D,MAAM,YAAY,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;gBAC/C,OAAO,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;YACjE,CAAC;SACD;QACD;YACC,IAAI,EAAE,mBAAmB;YACzB,WAAW,EACV,mNAAmN;YACpN,WAAW,EAAE;gBACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBAClD,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;aACrF;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACpC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI;oBACvB,OAAO,IAAI,CAAC,gEAAgE,CAAC,CAAC;gBAC/E,MAAM,MAAM,GAAG,GAAG,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;gBACnD,IAAI,CAAC,MAAM;oBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;gBAC9D,IAAI,CAAC;oBACJ,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;oBAC9D,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC/D,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,IAAI,CAAC,sBAAsB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACvF,CAAC;YACF,CAAC;SACD;QACD;YACC,IAAI,EAAE,iBAAiB;YACvB,WAAW,EACV,uRAAuR;YACxR,WAAW,EAAE;gBACZ,MAAM,EAAE,CAAC;qBACP,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;qBAC/B,QAAQ,CAAC,4DAA4D,CAAC;aACxE;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;gBAC1C,IAAI,CAAC,QAAQ;oBAAE,OAAO,IAAI,CAAC,4CAA4C,CAAC,CAAC;gBACzE,kEAAkE;gBAClE,2EAA2E;gBAC3E,yEAAyE;gBACzE,MAAM,GAAG,GAAiB;oBACzB,GAAG,QAAQ,CAAC,MAAM,CAAC,WAAW;oBAC9B,QAAiC;iBACjC,CAAC;gBACF,IAAI,CAAC;oBACJ,wBAAwB,CAAC,GAAG,CAAC,CAAC;oBAC9B,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;gBAC1C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;oBACjE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBAC5D,CAAC;YACF,CAAC;SACD;QACD;YACC,IAAI,EAAE,iBAAiB;YACvB,WAAW,EACV,gHAAgH;YACjH,WAAW,EAAE;gBACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBAClD,KAAK,EAAE,CAAC;qBACN,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;qBAC/B,QAAQ,EAAE;qBACV,QAAQ,CAAC,2CAA2C,CAAC;gBACvD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,0BAA0B,CAAC;gBACjE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,6BAA6B,CAAC;gBACrE,IAAI,EAAE,CAAC;qBACL,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,0DAA0D,CAAC;gBACtE,WAAW,EAAE,CAAC;qBACZ,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;qBAC5B,QAAQ,EAAE;qBACV,QAAQ,CAAC,uCAAuC,CAAC;aACnD;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAChD,IAAI,CAAC,UAAU;oBAAE,OAAO,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBAC7E,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC1C,IAAI,CAAC,GAAG;oBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;gBAC3D,2EAA2E;gBAC3E,wEAAwE;gBACxE,+DAA+D;gBAC/D,MAAM,KAAK,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,SAAS,CAAoC,CAAC;gBACxF,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtE,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzE,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,SAAS,CAAC;gBACjD,IAAI,CAAC;oBACJ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,EAAE;wBACtC,KAAK;wBACL,KAAK;wBACL,MAAM;wBACN,IAAI;wBACJ,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;qBAC7C,CAAC,CAAC;oBACH,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,IAAI,CAAC,iBAAiB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClF,CAAC;YACF,CAAC;SACD;QACD;YACC,IAAI,EAAE,cAAc;YACpB,WAAW,EAAE,gDAAgD;YAC7D,WAAW,EAAE;gBACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBAClD,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;gBACtC,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;aACtD;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAChC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE;oBAAE,OAAO,IAAI,CAAC,mDAAmD,CAAC,CAAC;gBACzF,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC1C,IAAI,CAAC,GAAG;oBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;gBAC3D,IAAI,CAAC;oBACJ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,OAAO,EAAE,EAAE,EAAE;wBAC3C,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;qBAC7C,CAAC,CAAC;oBACH,IAAI,CAAC,GAAG;wBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC;oBACjE,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,IAAI,CAAC,eAAe,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAChF,CAAC;YACF,CAAC;SACD;QACD;YACC,IAAI,EAAE,iBAAiB;YACvB,WAAW,EACV,6KAA6K;YAC9K,WAAW,EAAE;gBACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBAClD,IAAI,EAAE,CAAC;qBACL,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;qBAC/B,QAAQ,CAAC,6CAA6C,CAAC;gBACzD,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,qCAAqC,CAAC;aAC/E;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACpC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI;oBACvB,OAAO,IAAI,CAAC,gEAAgE,CAAC,CAAC;gBAC/E,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC1C,IAAI,CAAC,GAAG;oBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;gBAC3D,IAAI,CAAC;oBACJ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC;oBACnF,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,IAAI,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnF,CAAC;YACF,CAAC;SACD;QACD;YACC,IAAI,EAAE,iBAAiB;YACvB,WAAW,EACV,sIAAsI;YACvI,WAAW,EAAE;gBACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBAClD,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;gBACtC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;gBAClF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;aAClF;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACpC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;oBAC9B,OAAO,IAAI,CAAC,qEAAqE,CAAC,CAAC;gBACpF,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC1C,IAAI,CAAC,GAAG;oBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;gBAC3D,IAAI,CAAC;oBACJ,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC;oBACvF,IAAI,CAAC,MAAM;wBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC;oBACpE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,IAAI,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnF,CAAC;YACF,CAAC;SACD;QACD;YACC,IAAI,EAAE,kBAAkB;YACxB,WAAW,EAAE,6EAA6E;YAC1F,WAAW,EAAE;gBACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,iBAAiB,CAAC;gBAClD,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;aACtC;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAChC,IAAI,CAAC,UAAU,IAAI,CAAC,EAAE;oBAAE,OAAO,IAAI,CAAC,mDAAmD,CAAC,CAAC;gBACzF,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC1C,IAAI,CAAC,GAAG;oBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;gBAC3D,IAAI,CAAC;oBACJ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;oBAC3C,IAAI,CAAC,GAAG;wBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC;oBACjE,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,IAAI,CAAC,mBAAmB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACpF,CAAC;YACF,CAAC;SACD;QACD;YACC,IAAI,EAAE,eAAe;YACrB,WAAW,EACV,sQAAsQ;YACvQ,WAAW,EAAE;gBACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;gBAC5D,WAAW,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE;aACtD;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAChD,IAAI,CAAC,UAAU;oBAAE,OAAO,IAAI,CAAC,8CAA8C,CAAC,CAAC;gBAC7E,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC1C,IAAI,CAAC,GAAG;oBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;gBAC3D,IAAI,CAAC;oBACJ,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;oBACtF,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;gBAChB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,iFAAiF;oBACjF,OAAO,IAAI,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC/D,CAAC;YACF,CAAC;SACD;QACD;YACC,IAAI,EAAE,kBAAkB;YACxB,WAAW,EACV,kPAAkP;YACnP,WAAW,EAAE;gBACZ,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,2BAA2B,CAAC;gBAC5D,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,gCAAgC,CAAC;gBAClF,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;aAClF;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;gBAChD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBACpC,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI;oBACvB,OAAO,IAAI,CAAC,gEAAgE,CAAC,CAAC;gBAC/E,MAAM,GAAG,GAAG,GAAG,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;gBAC1C,IAAI,CAAC,GAAG;oBAAE,OAAO,IAAI,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;gBAC3D,MAAM,EAAE,GAAG,GAAG,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBACvC,IAAI,CAAC,EAAE;oBAAE,OAAO,IAAI,CAAC,IAAI,UAAU,oDAAoD,CAAC,CAAC;gBACzF,IAAI,CAAC;oBACJ,wEAAwE;oBACxE,MAAM,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;oBACvB,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,CAAC;oBACvF,IAAI,CAAC,MAAM;wBAAE,OAAO,IAAI,CAAC,+BAA+B,UAAU,IAAI,CAAC,CAAC;oBACxE,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;gBACnB,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,IAAI,CAAC,kBAAkB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnF,CAAC;YACF,CAAC;SACD;QACD;YACC,IAAI,EAAE,aAAa;YACnB,WAAW,EACV,iFAAiF;YAClF,WAAW,EAAE;gBACZ,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,yBAAyB,CAAC;gBACjE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAE;gBAC/C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC5B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;aAC7B;YACD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,SAAS,CAAC;gBACrD,MAAM,SAAS,GACd,IAAI,CAAC,SAAS,KAAK,OAAO,IAAI,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtF,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;gBACtE,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzE,IAAI,CAAC;oBACJ,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC1F,OAAO,EAAE,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC7C,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACd,OAAO,IAAI,CAAC,uBAAuB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACxF,CAAC;YACF,CAAC;SACD;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { RequestHandler } from '@sveltejs/kit';
2
+ export declare const POST: RequestHandler;
3
+ export declare const GET: RequestHandler;
4
+ export declare const DELETE: RequestHandler;
5
+ //# sourceMappingURL=mcp.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.d.ts","sourceRoot":"","sources":["../../../src/lib/routes/mcp.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAwEpD,eAAO,MAAM,IAAI,gBAAS,CAAC;AAC3B,eAAO,MAAM,GAAG,gBAAS,CAAC;AAC1B,eAAO,MAAM,MAAM,gBAAS,CAAC"}
@@ -0,0 +1,72 @@
1
+ // MCP server route handler (Streamable HTTP transport).
2
+ //
3
+ // Lives in cms-core so it ships with the package — apps re-export it:
4
+ // export { POST, GET, DELETE } from '@aphexcms/cms-core/routes/mcp';
5
+ // A cms-core version bump ships MCP improvements + protocol conformance (owned
6
+ // by @modelcontextprotocol/sdk via @hono/mcp's web-standard transport), so the
7
+ // app's route file never changes.
8
+ //
9
+ // Auth: send the CMS API key as `x-api-key: <key>` (or `Authorization: Bearer
10
+ // <key>`). The key is org-bound; every tool call runs under its RBAC + RLS
11
+ // scope. A read-only key is rejected by the permission layer on writes.
12
+ //
13
+ // Mount at top-level `/mcp` (not `/api/mcp`): the `/api/*` auth hook treats
14
+ // every POST as a write and would 403 read-only keys on the MCP handshake,
15
+ // since MCP does everything over POST.
16
+ import { Hono } from 'hono';
17
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
18
+ import { StreamableHTTPTransport } from '@hono/mcp';
19
+ import { authToContext } from '../local-api/index.js';
20
+ import { buildContentTools } from '../mcp/tools.js';
21
+ const SERVER_INFO = { name: 'aphexcms', version: '0.1.0' };
22
+ /** Resolve the API key from either header into an Auth, or null. */
23
+ async function authenticate(request, locals) {
24
+ const { config, databaseAdapter } = locals.aphexCMS;
25
+ const provider = config.auth?.provider;
26
+ if (!provider)
27
+ return null;
28
+ let key = request.headers.get('x-api-key');
29
+ if (!key) {
30
+ const authz = request.headers.get('authorization');
31
+ const match = authz?.match(/^Bearer\s+(.+)$/i);
32
+ if (match && match[1])
33
+ key = match[1];
34
+ }
35
+ if (!key)
36
+ return null;
37
+ // validateApiKey only reads the x-api-key header — hand it a headers-only
38
+ // request so we never touch the real JSON-RPC body stream.
39
+ const keyRequest = new Request(request.url, { headers: { 'x-api-key': key } });
40
+ return provider.validateApiKey(keyRequest, databaseAdapter);
41
+ }
42
+ const app = new Hono();
43
+ app.all('*', async (c) => {
44
+ const { locals } = c.env;
45
+ const auth = await authenticate(c.req.raw, locals);
46
+ if (!auth) {
47
+ return c.json({ error: 'Unauthorized: missing or invalid API key' }, 401);
48
+ }
49
+ // Build a fresh server per request so tools are bound to this caller's
50
+ // authenticated context (RBAC + RLS). Stateless: new transport each request.
51
+ const context = authToContext(auth);
52
+ const tools = buildContentTools({ aphexCMS: locals.aphexCMS, context });
53
+ const server = new McpServer(SERVER_INFO, { capabilities: { tools: {} } });
54
+ for (const tool of tools) {
55
+ server.registerTool(tool.name, { description: tool.description, inputSchema: tool.inputSchema },
56
+ // The registry stays SDK-agnostic; adapt its neutral result to the SDK's
57
+ // CallToolResult (which adds an index signature) here at the boundary.
58
+ async (args) => {
59
+ const result = await tool.handler(args);
60
+ return { content: result.content, isError: result.isError };
61
+ });
62
+ }
63
+ const transport = new StreamableHTTPTransport();
64
+ await server.connect(transport);
65
+ const response = await transport.handleRequest(c);
66
+ return response ?? c.body(null, 202);
67
+ });
68
+ const handle = ({ request, locals }) => app.fetch(request, { locals });
69
+ export const POST = handle;
70
+ export const GET = handle;
71
+ export const DELETE = handle;
72
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../../../src/lib/routes/mcp.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,12 @@ import type { SchemaType } from '../types/schemas.js';
3
3
  * Check if a field name is reserved
4
4
  */
5
5
  export declare function isReservedFieldName(fieldName: string): boolean;
6
+ /** Field names that conflict with system properties and can't be used in a schema. */
7
+ export declare const RESERVED_FIELDS: readonly string[];
8
+ /** Primitive (leaf) field types. The single runtime source of truth. */
9
+ export declare const PRIMITIVE_FIELD_TYPES: string[];
10
+ /** All valid field types (primitives + containers). */
11
+ export declare const VALID_FIELD_TYPES: string[];
6
12
  /**
7
13
  * Validate all schema references to ensure they exist
8
14
  */
@@ -1 +1 @@
1
- {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/lib/schema-utils/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,kBAAkB,CAAC;AAmB1D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAkOpE"}
1
+ {"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../../src/lib/schema-utils/validator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAS,MAAM,kBAAkB,CAAC;AAmB1D;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED,sFAAsF;AACtF,eAAO,MAAM,eAAe,EAAE,SAAS,MAAM,EAAyB,CAAC;AAEvE,wEAAwE;AACxE,eAAO,MAAM,qBAAqB,EAAE,MAAM,EAYzC,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,EAAE,MAAM,EAAkD,CAAC;AAEzF;;GAEG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAsNpE"}