unreal-engine-mcp-server 0.6.0-beta-c → 0.6.0-beta-e

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 (102) hide show
  1. package/CHANGELOG.md +148 -9
  2. package/README.md +2 -2
  3. package/dist/gateway/gateway-manifest.generated.json +838 -133
  4. package/dist/proxy/native-proxy.js +6 -5
  5. package/dist/server/gateway/gateway-execute-dispatch.js +2 -1
  6. package/dist/server/gateway/gateway-execute-envelope.js +5 -1
  7. package/dist/server/gateway/gateway-execute-lookup.js +1 -1
  8. package/dist/server/gateway/gateway-execute.js +17 -4
  9. package/dist/server/gateway/gateway-schema-validate.js +13 -2
  10. package/dist/server/gateway/gateway-task-results.d.ts +6 -0
  11. package/dist/server/gateway/gateway-task-results.js +40 -0
  12. package/dist/server/tool-registry-manage-tools.js +4 -1
  13. package/dist/tools/catalog/capabilities/generated/canonical-registry.generated.d.ts +2 -2
  14. package/dist/tools/catalog/capabilities/generated/canonical-registry.generated.js +2 -2
  15. package/dist/tools/catalog/capabilities/generated/canonical-registry.generated.json +4079 -618
  16. package/dist/tools/catalog/capabilities/generated/capability-cost-index.generated.d.ts +1 -1
  17. package/dist/tools/catalog/capabilities/generated/capability-cost-index.generated.js +18 -1
  18. package/dist/tools/catalog/capabilities/generated/parent-tool-definitions.generated.js +1546 -212
  19. package/dist/tools/catalog/capabilities/records/aggregate.d.ts +1 -1
  20. package/dist/tools/catalog/capabilities/records/aggregate.js +1 -1
  21. package/dist/tools/catalog/capabilities/records/build-environment/spline.data.js +4 -3
  22. package/dist/tools/catalog/capabilities/records/build-environment/water.data.js +8 -5
  23. package/dist/tools/catalog/capabilities/records/control-actor/advanced-records.js +29 -8
  24. package/dist/tools/catalog/capabilities/records/control-actor/search-records.js +2 -2
  25. package/dist/tools/catalog/capabilities/records/control-actor/spawn-records.js +13 -5
  26. package/dist/tools/catalog/capabilities/records/control-actor/state-records.js +2 -1
  27. package/dist/tools/catalog/capabilities/records/control-actor/transform-records.js +27 -9
  28. package/dist/tools/catalog/capabilities/records/control-editor/asset.js +4 -1
  29. package/dist/tools/catalog/capabilities/records/control-editor/camera.js +5 -1
  30. package/dist/tools/catalog/capabilities/records/control-editor/command.js +5 -1
  31. package/dist/tools/catalog/capabilities/records/control-editor/input.js +2 -1
  32. package/dist/tools/catalog/capabilities/records/control-editor/screenshot.js +2 -1
  33. package/dist/tools/catalog/capabilities/records/control-editor/session.js +8 -1
  34. package/dist/tools/catalog/capabilities/records/control-editor/timing.js +5 -3
  35. package/dist/tools/catalog/capabilities/records/core/builder.d.ts +1 -0
  36. package/dist/tools/catalog/capabilities/records/core/builder.js +1 -0
  37. package/dist/tools/catalog/capabilities/records/folds/build-environment.folds.js +2 -2
  38. package/dist/tools/catalog/capabilities/records/folds/control-actor.folds.js +2 -2
  39. package/dist/tools/catalog/capabilities/records/folds/manage-asset.folds.js +8 -8
  40. package/dist/tools/catalog/capabilities/records/folds/manage-audio.folds.js +5 -5
  41. package/dist/tools/catalog/capabilities/records/folds/manage-blueprint.folds.js +2 -2
  42. package/dist/tools/catalog/capabilities/records/folds/manage-effect.folds.js +3 -3
  43. package/dist/tools/catalog/capabilities/records/folds/manage-sequence.folds.js +6 -6
  44. package/dist/tools/catalog/capabilities/records/folds/system-control.folds.js +2 -2
  45. package/dist/tools/catalog/capabilities/records/gameplay/animation-physics/animation-properties.js +7 -5
  46. package/dist/tools/catalog/capabilities/records/gameplay/animation-physics/authoring-1.data.js +86 -1
  47. package/dist/tools/catalog/capabilities/records/gameplay/animation-physics/authoring-2.data.js +7 -2
  48. package/dist/tools/catalog/capabilities/records/gameplay/manage-effect/effect-properties.js +7 -6
  49. package/dist/tools/catalog/capabilities/records/gameplay/manage-effect/effect.data.js +38 -27
  50. package/dist/tools/catalog/capabilities/records/inspect/component-actor.data.js +1 -1
  51. package/dist/tools/catalog/capabilities/records/inspect/object-property.data.js +188 -10
  52. package/dist/tools/catalog/capabilities/records/inspect/properties.d.ts +1 -0
  53. package/dist/tools/catalog/capabilities/records/inspect/properties.js +2 -1
  54. package/dist/tools/catalog/capabilities/records/inspect/runtime.data.js +2 -1
  55. package/dist/tools/catalog/capabilities/records/inspect/stats.data.js +6 -2
  56. package/dist/tools/catalog/capabilities/records/manage-asset/asset-advanced.js +46 -0
  57. package/dist/tools/catalog/capabilities/records/manage-asset/asset-lifecycle.js +2 -2
  58. package/dist/tools/catalog/capabilities/records/manage-asset/asset-query.js +4 -3
  59. package/dist/tools/catalog/capabilities/records/manage-asset/builder.d.ts +3 -0
  60. package/dist/tools/catalog/capabilities/records/manage-asset/builder.js +3 -0
  61. package/dist/tools/catalog/capabilities/records/manage-asset/content-sources.js +3 -1
  62. package/dist/tools/catalog/capabilities/records/manage-asset/material-create.js +17 -2
  63. package/dist/tools/catalog/capabilities/records/manage-asset/material-graph.js +7 -5
  64. package/dist/tools/catalog/capabilities/records/manage-asset/material-params.js +5 -5
  65. package/dist/tools/catalog/capabilities/records/manage-audio/authoring.data.js +15 -5
  66. package/dist/tools/catalog/capabilities/records/manage-audio/runtime.data.js +1 -0
  67. package/dist/tools/catalog/capabilities/records/manage-blueprint/functions-events.js +3 -2
  68. package/dist/tools/catalog/capabilities/records/manage-blueprint/graph-batch.js +2 -2
  69. package/dist/tools/catalog/capabilities/records/manage-blueprint/graph-pins.js +6 -2
  70. package/dist/tools/catalog/capabilities/records/manage-blueprint/properties.js +4 -2
  71. package/dist/tools/catalog/capabilities/records/manage-blueprint/scs-components.js +7 -2
  72. package/dist/tools/catalog/capabilities/records/manage-blueprint/variables-metadata.js +8 -2
  73. package/dist/tools/catalog/capabilities/records/manage-blueprint/widget-animation.js +14 -4
  74. package/dist/tools/catalog/capabilities/records/manage-blueprint/widget-lifecycle.js +13 -5
  75. package/dist/tools/catalog/capabilities/records/manage-blueprint/widget-panels.js +1 -1
  76. package/dist/tools/catalog/capabilities/records/manage-sequence/cinematic.js +12 -3
  77. package/dist/tools/catalog/capabilities/records/manage-sequence/helpers.js +2 -2
  78. package/dist/tools/catalog/capabilities/records/manage-sequence/mrq.js +23 -4
  79. package/dist/tools/catalog/capabilities/records/manage-sequence/timeline-bindings.js +2 -2
  80. package/dist/tools/catalog/capabilities/records/manage-sequence/timeline-lifecycle.js +7 -2
  81. package/dist/tools/catalog/capabilities/records/manage-sequence/timeline-playback.js +9 -5
  82. package/dist/tools/catalog/capabilities/records/manage-sequence/timeline-state-ranges.js +19 -0
  83. package/dist/tools/catalog/capabilities/records/manage-sequence/timeline-tracks.js +10 -5
  84. package/dist/tools/catalog/capabilities/records/manage-tools/index.js +30 -2
  85. package/dist/tools/catalog/capabilities/records/system-control/console.js +3 -1
  86. package/dist/tools/catalog/capabilities/records/system-control/system-ops.js +122 -10
  87. package/dist/tools/catalog/capabilities/records/utility/output-glossary.js +11 -0
  88. package/dist/tools/catalog/capabilities/records/utility/utility-schema-pins.js +6 -3
  89. package/dist/tools/catalog/capabilities/records/world/manage-geometry.optimize.data.js +29 -0
  90. package/dist/tools/catalog/capabilities/records/world/manage-geometry.primitives.data.js +2 -1
  91. package/dist/tools/catalog/capabilities/records/world/properties.js +2 -2
  92. package/dist/tools/catalog/capabilities/semantic/envelope.d.ts +1 -1
  93. package/dist/tools/catalog/capabilities/semantic/errors.d.ts +1 -1
  94. package/dist/tools/catalog/unreal-gateway-definition.js +2 -2
  95. package/dist/utils/responses/gateway-reply-compaction.d.ts +6 -0
  96. package/dist/utils/responses/gateway-reply-compaction.js +264 -0
  97. package/dist/utils/responses/response-content.d.ts +0 -1
  98. package/dist/utils/responses/response-content.js +0 -172
  99. package/dist/utils/responses/response-validator.d.ts +1 -1
  100. package/dist/utils/responses/response-validator.js +39 -8
  101. package/package.json +2 -2
  102. package/server.json +2 -2
@@ -1,7 +1,7 @@
1
1
  import { request } from 'node:http';
2
- import { readFileSync, writeFileSync } from 'node:fs';
3
- import { tmpdir } from 'node:os';
4
- import { join } from 'node:path';
2
+ import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { homedir } from 'node:os';
4
+ import { dirname, join } from 'node:path';
5
5
  import { createInterface } from 'node:readline';
6
6
  import { CapabilityTokenProvider } from '../automation/capability-token-provider.js';
7
7
  import { PACKAGE } from '../constants.js';
@@ -16,7 +16,7 @@ const PLACEHOLDER_TOOL = {
16
16
  export function startNativeProxy(options = {}) {
17
17
  const upstream = options.upstream ?? process.env.UNREAL_MCP_URL ?? 'http://127.0.0.1:3000/mcp';
18
18
  const cacheFile = options.cacheFile ?? process.env.UNREAL_MCP_PROXY_CACHE
19
- ?? join(tmpdir(), `unreal-mcp-proxy-${new URL(upstream).port || '80'}.json`);
19
+ ?? join(process.env.LOCALAPPDATA ?? process.env.XDG_CACHE_HOME ?? join(homedir(), '.cache'), 'unreal-mcp', `proxy-${new URL(upstream).port || '80'}.json`);
20
20
  const output = options.output ?? process.stdout;
21
21
  const log = new Logger('NativeProxy');
22
22
  const tokenProvider = new CapabilityTokenProvider(undefined, log);
@@ -39,7 +39,8 @@ export function startNativeProxy(options = {}) {
39
39
  const remember = (patch) => {
40
40
  cache = { ...cache, ...patch };
41
41
  try {
42
- writeFileSync(cacheFile, JSON.stringify(cache));
42
+ mkdirSync(dirname(cacheFile), { recursive: true, mode: 0o700 });
43
+ writeFileSync(cacheFile, JSON.stringify(cache), { mode: 0o600 });
43
44
  }
44
45
  catch (error) {
45
46
  log.warn(`cache not written: ${String(error)}`);
@@ -34,7 +34,8 @@ export function projectCanonicalOutput(result, schema) {
34
34
  const details = existing ? { ...existing } : {};
35
35
  const fold = (source) => {
36
36
  for (const [name, value] of Object.entries(source)) {
37
- if (name === 'data' || name === 'requestId' || name === 'type' || name in schema.properties)
37
+ if (name === 'data' || name === 'requestId' || name === 'type' || name === 'liveRevisions' || name === 'message'
38
+ || name in schema.properties)
38
39
  continue;
39
40
  if (!(name in details))
40
41
  details[name] = value;
@@ -162,7 +162,7 @@ export function executeSuccessEnvelope(input, context) {
162
162
  capabilityId,
163
163
  data: publishedData,
164
164
  handles: extractHandles(input.result),
165
- changes: extractChanges(input.result),
165
+ changes: input.record.behavior.effect === 'read' ? [] : extractChanges(input.result),
166
166
  task: extractTask(input.result),
167
167
  warnings: input.warnings,
168
168
  ...correlationFields(context),
@@ -171,9 +171,13 @@ export function executeSuccessEnvelope(input, context) {
171
171
  validation: { outputSchema: 'passed' },
172
172
  liveRevisions
173
173
  });
174
+ const handlerMessage = typeof input.result === 'object' && input.result !== null && 'message' in input.result
175
+ ? input.result.message
176
+ : undefined;
174
177
  return definedOnly({
175
178
  success: true,
176
179
  operation: 'execute',
180
+ message: typeof handlerMessage === 'string' && handlerMessage !== '' ? redactText(handlerMessage) : undefined,
177
181
  correlationId: context.correlationId,
178
182
  catalogRevision: catalogRevision(),
179
183
  ...capabilityFields(input.record),
@@ -69,7 +69,7 @@ function lookupByLegacyPair(requestedTool, action, index) {
69
69
  kind: 'failed',
70
70
  failure: {
71
71
  errorCode: 'UNKNOWN_ACTION',
72
- message: `Unknown action for ${tool}.${guide.hint} Call describe before execute.`,
72
+ message: `Unknown action ${action === undefined ? '' : `'${action}' `}for ${tool}.${guide.hint} Call describe before execute.`,
73
73
  availableActions: available,
74
74
  suggestions: guide.suggestions,
75
75
  nextCall: guide.nextCall
@@ -10,6 +10,7 @@ import { dispatchAndValidate } from './gateway-execute-dispatch.js';
10
10
  import { checkConsentAuthorization, checkExpectedCatalogRevision, checkScopeAuthorization, matchedFoldedGrant } from './gateway-execute-policy.js';
11
11
  import { ConsentGrantSchema } from '../../tools/catalog/capabilities/semantic/authorization.js';
12
12
  import { buildReceiptContext } from './gateway-receipt-context.js';
13
+ import { noteTaskDone, noteTaskRunning } from './gateway-task-results.js';
13
14
  import { conflictMessage, IDEMPOTENCY_CONFLICT_CODE, LOCAL_PRINCIPAL, markReplayed, runWithIdempotency, sharedExecuteLedger } from './gateway-execute-idempotency.js';
14
15
  export async function executeGatewayCall(args, context, correlationId) {
15
16
  const options = isRecord(args.options) ? args.options : undefined;
@@ -106,7 +107,7 @@ export async function executeGatewayCall(args, context, correlationId) {
106
107
  action: target.legacy.action
107
108
  })
108
109
  }, receiptContext), (recorded) => markReplayed(recorded, receiptContext.correlationId));
109
- if (receiptContext.idempotencyId === undefined || checked.timeoutMs !== undefined)
110
+ if (checked.timeoutMs !== undefined)
110
111
  return await settled;
111
112
  return await answerWhileRunning(settled, target.record, receiptContext, context);
112
113
  }
@@ -119,12 +120,24 @@ async function answerWhileRunning(settled, record, receiptContext, context) {
119
120
  const first = await Promise.race([settled, running]).finally(() => clearTimeout(timer));
120
121
  if (first !== undefined)
121
122
  return first;
122
- settled.then((receipt) => context.logger.info(`${record.id} finished after its still-running answer (success=${String(receipt.success)}).`), (error) => context.logger.warn(`${record.id} failed after its still-running answer: ${error instanceof Error ? error.message : String(error)}`));
123
+ const taskId = receiptContext.correlationId;
124
+ noteTaskRunning(taskId);
125
+ settled.then((receipt) => {
126
+ noteTaskDone(taskId, receipt);
127
+ context.logger.info(`${record.id} finished after its still-running answer (success=${String(receipt.success)}).`);
128
+ }, (error) => {
129
+ const text = error instanceof Error ? error.message : String(error);
130
+ noteTaskDone(taskId, { success: false, errorCode: 'EXECUTION_ERROR', message: text });
131
+ context.logger.warn(`${record.id} failed after its still-running answer: ${text}`);
132
+ });
133
+ const again = receiptContext.idempotencyId === undefined
134
+ ? 'do not send this call again: it would run twice.'
135
+ : 'the same call with the same idempotencyKey also answers with it instead of running again.';
123
136
  const message = `Still running after ${STILL_RUNNING_AFTER_MS / 1000} s. Unreal keeps going; this answer does not stop it. `
124
- + 'Send this call again with the same idempotencyKey once it is done: it answers with the result instead of running again.';
137
+ + `Read its result with manage_tools get_task_result taskId ${taskId} once it is done; ${again}`;
125
138
  return executeSuccessEnvelope({
126
139
  record,
127
- result: { success: true, message, task: { taskId: receiptContext.correlationId, state: 'running' } },
140
+ result: { success: true, message, task: { taskId, state: 'running' } },
128
141
  canonicalOutput: { message },
129
142
  warnings: []
130
143
  }, receiptContext);
@@ -131,10 +131,14 @@ function validateObject(value, schema, pointer) {
131
131
  if (Array.isArray(schema.required)) {
132
132
  for (const name of schema.required) {
133
133
  if (typeof name === 'string' && !Object.hasOwn(value, name)) {
134
+ const stray = schema.additionalProperties === false
135
+ ? Object.keys(value).filter((key) => properties === undefined || !Object.hasOwn(properties, key))
136
+ : [];
137
+ const missing = describeMissingParameter(name, properties);
134
138
  return {
135
139
  reason: 'missing-required',
136
140
  pointer: `${pointer}/${name}`,
137
- message: describeMissingParameter(name, properties)
141
+ message: stray.length === 0 ? missing : `${missing}; sent ${stray.join(', ')}, which this action does not take`
138
142
  };
139
143
  }
140
144
  }
@@ -227,9 +231,9 @@ export function applyDeclaredDefaults(params, schema) {
227
231
  return withDefaults;
228
232
  }
229
233
  export const VECTOR_KEY_SETS = [
234
+ ['pitch', 'yaw', 'roll'],
230
235
  ['x', 'y', 'z', 'w'],
231
236
  ['x', 'y', 'z'],
232
- ['pitch', 'yaw', 'roll'],
233
237
  ['r', 'g', 'b', 'a'],
234
238
  ['width', 'height'],
235
239
  ['x', 'y']
@@ -255,6 +259,11 @@ function objectToVector(value) {
255
259
  }
256
260
  return undefined;
257
261
  }
262
+ function isShadowedByLongerSet(keys, declared) {
263
+ return VECTOR_KEY_SETS.some((longer) => longer.length > keys.length
264
+ && keys.every((key) => longer.includes(key))
265
+ && longer.some((key) => !keys.includes(key) && declared.includes(key)));
266
+ }
258
267
  function vectorToObject(values, propertySchema) {
259
268
  const declared = isRecord(propertySchema.properties) ? Object.keys(propertySchema.properties) : [];
260
269
  if (declared.length === 0)
@@ -263,6 +272,8 @@ function vectorToObject(values, propertySchema) {
263
272
  const required = keys.length === 4 ? keys.length - 1 : keys.length;
264
273
  if (!keys.slice(0, required).every((key) => declared.includes(key)))
265
274
  continue;
275
+ if (isShadowedByLongerSet(keys, declared))
276
+ continue;
266
277
  const consumed = keys.filter((key) => declared.includes(key));
267
278
  if (values.length < required || values.length > consumed.length)
268
279
  continue;
@@ -0,0 +1,6 @@
1
+ export declare const MAX_KEPT_TASKS = 32;
2
+ export declare function noteTaskRunning(taskId: string): void;
3
+ export declare function noteTaskDone(taskId: string, reply: Record<string, unknown>): void;
4
+ export declare function describeTask(taskId: string): Record<string, unknown>;
5
+ export declare function resetTasksForTest(): void;
6
+ //# sourceMappingURL=gateway-task-results.d.ts.map
@@ -0,0 +1,40 @@
1
+ import { compactGatewayReply } from '../../utils/responses/gateway-reply-compaction.js';
2
+ export const MAX_KEPT_TASKS = 32;
3
+ const tasks = new Map();
4
+ function remember(taskId, entry) {
5
+ tasks.delete(taskId);
6
+ tasks.set(taskId, entry);
7
+ while (tasks.size > MAX_KEPT_TASKS) {
8
+ const oldest = tasks.keys().next().value;
9
+ if (oldest === undefined)
10
+ break;
11
+ tasks.delete(oldest);
12
+ }
13
+ }
14
+ export function noteTaskRunning(taskId) {
15
+ remember(taskId, { state: 'running' });
16
+ }
17
+ export function noteTaskDone(taskId, reply) {
18
+ remember(taskId, { state: 'done', reply });
19
+ }
20
+ export function describeTask(taskId) {
21
+ const entry = tasks.get(taskId);
22
+ if (entry === undefined) {
23
+ return {
24
+ success: false,
25
+ errorCode: 'TASK_NOT_FOUND',
26
+ error: `No task ${taskId}: only a call answered "still running" since the server started is kept, the last ${MAX_KEPT_TASKS} of them.`
27
+ };
28
+ }
29
+ if (entry.state === 'running') {
30
+ return { success: true, taskId, state: 'running', message: `Task ${taskId} is still running.` };
31
+ }
32
+ const outcome = { ...compactGatewayReply(entry.reply) };
33
+ delete outcome.operation;
34
+ outcome.success = entry.reply.success === true;
35
+ return { success: true, taskId, state: 'done', outcome, message: `Task ${taskId} is done.` };
36
+ }
37
+ export function resetTasksForTest() {
38
+ tasks.clear();
39
+ }
40
+ //# sourceMappingURL=gateway-task-results.js.map
@@ -1,6 +1,7 @@
1
1
  import { CATALOG_REVISION } from '../tools/catalog/capabilities/generated/canonical-registry.generated.js';
2
2
  import { dynamicToolManager } from '../tools/dynamic/dynamic-tool-manager.js';
3
3
  import { getString } from './gateway/gateway-shared.js';
4
+ import { describeTask } from './gateway/gateway-task-results.js';
4
5
  const VALID_TOOL_CATEGORIES = ['core', 'world', 'gameplay', 'utility', 'all'];
5
6
  function getStringArray(args, key) {
6
7
  const val = args[key];
@@ -29,6 +30,8 @@ export async function handleManageToolsCall(args) {
29
30
  return setCategoryEnabled(args, false);
30
31
  case 'get_status':
31
32
  return getStatus();
33
+ case 'get_task_result':
34
+ return describeTask(getString(args, 'taskId') ?? '');
32
35
  case 'reset': {
33
36
  const result = dynamicToolManager.reset();
34
37
  return {
@@ -40,7 +43,7 @@ export async function handleManageToolsCall(args) {
40
43
  default:
41
44
  return {
42
45
  success: false,
43
- error: `Unknown action: ${action}. Available: list_tools, list_categories, enable_tools, disable_tools, enable_category, disable_category, get_status, reset`,
46
+ error: `Unknown action: ${action}. Available: list_tools, list_categories, enable_tools, disable_tools, enable_category, disable_category, get_status, get_task_result, reset`,
44
47
  errorCode: 'UNKNOWN_ACTION'
45
48
  };
46
49
  }
@@ -1,6 +1,6 @@
1
1
  import type { CapabilityRecord } from '../model.js';
2
- export declare const CANONICAL_CAPABILITY_RECORD_COUNT = 393;
3
- export declare const CATALOG_REVISION = "28be41e4be57ba03";
2
+ export declare const CANONICAL_CAPABILITY_RECORD_COUNT = 405;
3
+ export declare const CATALOG_REVISION = "6a9b00e40ef5b820";
4
4
  export declare const CANONICAL_CAPABILITY_RECORDS: readonly CapabilityRecord[];
5
5
  export type { CapabilityRecord };
6
6
  //# sourceMappingURL=canonical-registry.generated.d.ts.map
@@ -1,6 +1,6 @@
1
1
  import registry from './canonical-registry.generated.json' with { type: 'json' };
2
2
  import { parseCapabilityCatalog } from '../parser.js';
3
- export const CANONICAL_CAPABILITY_RECORD_COUNT = 393;
4
- export const CATALOG_REVISION = "28be41e4be57ba03";
3
+ export const CANONICAL_CAPABILITY_RECORD_COUNT = 405;
4
+ export const CATALOG_REVISION = "6a9b00e40ef5b820";
5
5
  export const CANONICAL_CAPABILITY_RECORDS = parseCapabilityCatalog(registry.records);
6
6
  //# sourceMappingURL=canonical-registry.generated.js.map