@wix/web5-core 1.63.23 → 1.63.24

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.
@@ -25,6 +25,27 @@ function normalizeResolveOptions(intentOrOptions, semantic) {
25
25
  }
26
26
  return intentOrOptions;
27
27
  }
28
+
29
+ /**
30
+ * Intent keys are matched case-insensitively.
31
+ *
32
+ * The intent that reaches resolution has already been through
33
+ * `intent.trim().toUpperCase()` — in this package's `intentExtractor`, and
34
+ * again in `web50-server-ui`'s own copy of it, which calls it with no
35
+ * `validIntents` and passes the result as `providedIntent`, bypassing the
36
+ * validated path here. A client that registers its variants in the lowercase
37
+ * spelling its own taxonomy doc uses therefore matched nothing, and every
38
+ * intent-scoped variant silently fell through to the section default.
39
+ *
40
+ * That is not hypothetical: it was true of the whole seed registry. Measured
41
+ * across 11 live answers, 10 rendered the same hero whatever the intent, and
42
+ * one registered hero component never rendered at all. Nothing errors, nothing
43
+ * logs, and the page looks plausible — which is why this belongs at the Map
44
+ * rather than in either extractor.
45
+ *
46
+ * Normalizing on write AND on read makes the spelling a client's own business.
47
+ */
48
+ const normalizeIntentKey = intent => intent.trim().toUpperCase();
28
49
  class ComponentRegistry {
29
50
  constructor(fallback) {
30
51
  this.fallback = fallback;
@@ -151,14 +172,14 @@ class ComponentRegistry {
151
172
  }
152
173
  if (intent && semantic) {
153
174
  var _node$byIntent;
154
- const found = (_node$byIntent = node.byIntent) == null || (_node$byIntent = _node$byIntent.get(intent)) == null || (_node$byIntent = _node$byIntent.bySemantic) == null ? void 0 : _node$byIntent.get(semantic);
175
+ const found = (_node$byIntent = node.byIntent) == null || (_node$byIntent = _node$byIntent.get(normalizeIntentKey(intent))) == null || (_node$byIntent = _node$byIntent.bySemantic) == null ? void 0 : _node$byIntent.get(semantic);
155
176
  if (found) {
156
177
  return found;
157
178
  }
158
179
  }
159
180
  if (intent) {
160
181
  var _node$byIntent2;
161
- const found = (_node$byIntent2 = node.byIntent) == null || (_node$byIntent2 = _node$byIntent2.get(intent)) == null ? void 0 : _node$byIntent2.default;
182
+ const found = (_node$byIntent2 = node.byIntent) == null || (_node$byIntent2 = _node$byIntent2.get(normalizeIntentKey(intent))) == null ? void 0 : _node$byIntent2.default;
162
183
  if (found) {
163
184
  return found;
164
185
  }
@@ -229,14 +250,14 @@ class ComponentRegistry {
229
250
  }
230
251
  if (intent && semantic) {
231
252
  var _node$byIntent3;
232
- const found = (_node$byIntent3 = node.byIntent) == null || (_node$byIntent3 = _node$byIntent3.get(intent)) == null || (_node$byIntent3 = _node$byIntent3.bySemantic) == null ? void 0 : _node$byIntent3.get(semantic);
253
+ const found = (_node$byIntent3 = node.byIntent) == null || (_node$byIntent3 = _node$byIntent3.get(normalizeIntentKey(intent))) == null || (_node$byIntent3 = _node$byIntent3.bySemantic) == null ? void 0 : _node$byIntent3.get(semantic);
233
254
  if (found) {
234
255
  return found;
235
256
  }
236
257
  }
237
258
  if (intent) {
238
259
  var _node$byIntent4;
239
- const found = (_node$byIntent4 = node.byIntent) == null || (_node$byIntent4 = _node$byIntent4.get(intent)) == null ? void 0 : _node$byIntent4.default;
260
+ const found = (_node$byIntent4 = node.byIntent) == null || (_node$byIntent4 = _node$byIntent4.get(normalizeIntentKey(intent))) == null ? void 0 : _node$byIntent4.default;
240
261
  if (found) {
241
262
  return found;
242
263
  }
@@ -268,6 +289,10 @@ class ComponentRegistry {
268
289
  * registered. Assembly uses this to validate an incoming intent before it
269
290
  * becomes a resolution key, falling back to core's `DEFAULT_INTENTS` only
270
291
  * when a client registers no intent variants at all.
292
+ *
293
+ * Returned NORMALIZED (upper case), whatever spelling the client registered,
294
+ * because these are the map keys. Both consumers compare case-insensitively,
295
+ * so the only visible difference is in a debug view.
271
296
  */
272
297
  getKnownIntents() {
273
298
  const intents = new Set();
@@ -435,10 +460,11 @@ class ComponentRegistry {
435
460
  if (!node.byIntent) {
436
461
  node.byIntent = new Map();
437
462
  }
438
- let intentNode = node.byIntent.get(intent);
463
+ const key = normalizeIntentKey(intent);
464
+ let intentNode = node.byIntent.get(key);
439
465
  if (!intentNode) {
440
466
  intentNode = {};
441
- node.byIntent.set(intent, intentNode);
467
+ node.byIntent.set(key, intentNode);
442
468
  }
443
469
  return intentNode;
444
470
  }
@@ -446,10 +472,11 @@ class ComponentRegistry {
446
472
  if (!node.byIntent) {
447
473
  node.byIntent = new Map();
448
474
  }
449
- let intentNode = node.byIntent.get(intent);
475
+ const key = normalizeIntentKey(intent);
476
+ let intentNode = node.byIntent.get(key);
450
477
  if (!intentNode) {
451
478
  intentNode = {};
452
- node.byIntent.set(intent, intentNode);
479
+ node.byIntent.set(key, intentNode);
453
480
  }
454
481
  return intentNode;
455
482
  }
@@ -1 +1 @@
1
- {"version":3,"names":["normalizeResolveOptions","intentOrOptions","semantic","intent","ComponentRegistry","constructor","fallback","_defineProperty2","default","Map","registerSlot","name","component","options","node","slots","get","set","intentNode","ensureSlotIntent","bySemantic","register","definition","variants","console","warn","definitions","sectionType","registration","sections","placement","placementId","forPlacementById","forPlacement","ensureSectionIntent","registerAction","handler","actions","resolveSlot","_node$byIntent","found","byIntent","_node$byIntent2","_node$bySemantic","resolveSection","resolveSectionRegistration","resolveSectionOptions","_this$resolveSectionR","undefined","_node$forPlacementByI","byId","_node$byIntent3","_node$byIntent4","_node$bySemantic2","getAllSlots","Array","from","keys","getAllSections","getKnownIntents","intents","Set","values","_node$byIntent5","forEach","_variant","key","add","_node$byIntent6","getAllDefinitions","entries","map","getDefinition","isPlacementOnly","_node$forPlacementByI2","_node$byIntent7","_node$bySemantic3","hasPlacement","size","hasNonPlacement","getSlotVariants","push","getSectionVariants","hasAction","has","executeAction","params","success","message","getRegisteredActions","getCatalog","exports"],"sources":["../../../src/registry/ComponentRegistry.ts"],"sourcesContent":["import type { SectionDefinition } from '../component/componentDefinitions';\nimport type {\n SlotOptions,\n SectionOptions,\n SectionRegistration,\n SlotNode,\n SlotIntentNode,\n SectionNode,\n SectionIntentNode,\n SlotVariant,\n SectionVariant,\n RegistryCatalog,\n ResolveSectionOptions,\n ActionHandler,\n ActionResult,\n} from './types';\n\n/**\n * Accept the legacy positional form `(intent, semantic)` and the new\n * options-object form `({ intent, semantic, placement })`. Returns a\n * normalized `ResolveSectionOptions`.\n */\nfunction normalizeResolveOptions(\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n): ResolveSectionOptions {\n if (intentOrOptions == null) {\n return semantic ? { semantic } : {};\n }\n if (typeof intentOrOptions === 'string') {\n return semantic ? { intent: intentOrOptions, semantic } : { intent: intentOrOptions };\n }\n return intentOrOptions;\n}\n\nexport class ComponentRegistry<C> {\n private slots = new Map<string, SlotNode<C>>();\n private sections = new Map<string, SectionNode<C>>();\n private definitions = new Map<string, SectionDefinition>();\n private actions = new Map<string, ActionHandler>();\n\n constructor(private fallback: C) {}\n\n // ---------------------------------------------------------------------------\n // Registration\n // ---------------------------------------------------------------------------\n\n registerSlot(name: string, component: C, options?: SlotOptions): this {\n let node = this.slots.get(name);\n if (!node) {\n node = {};\n this.slots.set(name, node);\n }\n\n const { intent, semantic } = options ?? {};\n\n if (intent && semantic) {\n const intentNode = this.ensureSlotIntent(node, intent);\n if (!intentNode.bySemantic) {\n intentNode.bySemantic = new Map();\n }\n intentNode.bySemantic.set(semantic, component);\n } else if (intent) {\n const intentNode = this.ensureSlotIntent(node, intent);\n intentNode.default = component;\n } else if (semantic) {\n if (!node.bySemantic) {\n node.bySemantic = new Map();\n }\n node.bySemantic.set(semantic, component);\n } else {\n node.default = component;\n }\n\n return this;\n }\n\n register(\n definition: SectionDefinition,\n variants?: SectionRegistration<C>[],\n ): this {\n // Tolerate missing definitions instead of crashing app init. This\n // happens when a client UMD references a `SectionDefinition` symbol\n // that doesn't exist on the consuming bundle's `Web5Core` global\n // (e.g. UMD built against newer `web5-core` than the app bundle).\n // Without this guard a single missing export breaks every other\n // section the client tries to register.\n if (definition == null) {\n // eslint-disable-next-line no-console\n console.warn(\n '[ComponentRegistry] register() called with a null/undefined SectionDefinition — ' +\n 'likely a version skew between the client UMD and web5-core ' +\n '(an exported definition the UMD imports does not exist on this Web5Core). Skipping.',\n );\n return this;\n }\n this.definitions.set(definition.sectionType, definition);\n\n if (variants) {\n const sectionType = definition.sectionType;\n for (const registration of variants) {\n let node = this.sections.get(sectionType);\n if (!node) {\n node = {};\n this.sections.set(sectionType, node);\n }\n const { intent, semantic, placement, placementId } =\n registration.options ?? {};\n\n // Placement variants are stored on their own slot — no further\n // intent/semantic sub-variants (DL #088 D3.1). If a developer also\n // supplies intent/semantic alongside placement, those are ignored for\n // the placement registration. To register both a placement variant AND\n // an intent variant, register them as separate entries.\n if (placement) {\n // Scoped to a specific placement slot id — keyed so one section type\n // can render differently per placement. An id-less placement variant\n // remains the generic fallback.\n if (placementId) {\n if (!node.forPlacementById) {\n node.forPlacementById = new Map();\n }\n node.forPlacementById.set(placementId, registration);\n } else {\n node.forPlacement = registration;\n }\n continue;\n }\n\n if (intent && semantic) {\n const intentNode = this.ensureSectionIntent(node, intent);\n if (!intentNode.bySemantic) {\n intentNode.bySemantic = new Map();\n }\n intentNode.bySemantic.set(semantic, registration);\n } else if (intent) {\n const intentNode = this.ensureSectionIntent(node, intent);\n intentNode.default = registration;\n } else if (semantic) {\n if (!node.bySemantic) {\n node.bySemantic = new Map();\n }\n node.bySemantic.set(semantic, registration);\n } else {\n node.default = registration;\n }\n }\n }\n\n return this;\n }\n\n registerAction(name: string, handler: ActionHandler): this {\n this.actions.set(name, handler);\n return this;\n }\n\n // ---------------------------------------------------------------------------\n // Resolution\n // ---------------------------------------------------------------------------\n\n resolveSlot(name: string, intent?: string, semantic?: string): C {\n const node = this.slots.get(name);\n if (!node) {\n return this.fallback;\n }\n\n if (intent && semantic) {\n const found = node.byIntent?.get(intent)?.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n if (intent) {\n const found = node.byIntent?.get(intent)?.default;\n if (found) {\n return found;\n }\n }\n if (semantic) {\n const found = node.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n\n return node.default ?? this.fallback;\n }\n\n /**\n * Resolve a section component by type, optionally narrowed by intent /\n * semantic / placement.\n *\n * Accepts both call forms for backward compatibility:\n * resolveSection('hero') — default\n * resolveSection('hero', 'DISCOVERY') — intent (legacy positional)\n * resolveSection('hero', 'DISCOVERY', 'compact') — intent + semantic (legacy)\n * resolveSection('hero', { intent: 'DISCOVERY' }) — options object\n * resolveSection('hero', { placement: true }) — placement variant (DL #088 D3.1)\n * resolveSection('hero', { intent: 'X', placement: true }) — placement wins\n */\n resolveSection(sectionType: string, intent?: string, semantic?: string): C;\n resolveSection(sectionType: string, options: ResolveSectionOptions): C;\n resolveSection(\n sectionType: string,\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n ): C {\n const registration = this.resolveSectionRegistration(\n sectionType,\n normalizeResolveOptions(intentOrOptions, semantic),\n );\n return registration?.component ?? this.fallback;\n }\n\n /**\n * Resolve the options bundle associated with the matched registration.\n * Same overload semantics as `resolveSection`.\n */\n resolveSectionOptions(\n sectionType: string,\n intent?: string,\n semantic?: string,\n ): SectionOptions | undefined;\n resolveSectionOptions(\n sectionType: string,\n options: ResolveSectionOptions,\n ): SectionOptions | undefined;\n resolveSectionOptions(\n sectionType: string,\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n ): SectionOptions | undefined {\n return this.resolveSectionRegistration(\n sectionType,\n normalizeResolveOptions(intentOrOptions, semantic),\n )?.options;\n }\n\n private resolveSectionRegistration(\n sectionType: string,\n options: ResolveSectionOptions,\n ): SectionRegistration<C> | undefined {\n const node = this.sections.get(sectionType);\n if (!node) {\n return undefined;\n }\n\n const { intent, semantic, placement, placementId } = options;\n\n // Placement wins over intent / semantic when requested AND a placement\n // variant is registered for this section (DL #088 D3.1). Cascade:\n // id-scoped variant → generic placement variant → regular chain.\n if (placement) {\n if (placementId) {\n const byId = node.forPlacementById?.get(placementId);\n if (byId) {\n return byId;\n }\n }\n if (node.forPlacement) {\n return node.forPlacement;\n }\n }\n\n if (intent && semantic) {\n const found = node.byIntent?.get(intent as string)?.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n if (intent) {\n const found = node.byIntent?.get(intent as string)?.default;\n if (found) {\n return found;\n }\n }\n if (semantic) {\n const found = node.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n\n return node.default;\n }\n\n // ---------------------------------------------------------------------------\n // Introspection\n // ---------------------------------------------------------------------------\n\n getAllSlots(): string[] {\n return Array.from(this.slots.keys());\n }\n\n getAllSections(): string[] {\n return Array.from(this.sections.keys());\n }\n\n /**\n * Every intent that has at least one registered slot or section variant —\n * i.e. the client's own intent list, derived from what it actually\n * registered. Assembly uses this to validate an incoming intent before it\n * becomes a resolution key, falling back to core's `DEFAULT_INTENTS` only\n * when a client registers no intent variants at all.\n */\n getKnownIntents(): string[] {\n const intents = new Set<string>();\n for (const node of this.slots.values()) {\n node.byIntent?.forEach((_variant, key) => intents.add(key));\n }\n for (const node of this.sections.values()) {\n node.byIntent?.forEach((_variant, key) => intents.add(key));\n }\n return Array.from(intents);\n }\n\n getAllDefinitions(): {\n sectionType: string;\n definition: SectionDefinition;\n }[] {\n return Array.from(this.definitions.entries()).map(\n ([sectionType, definition]) => ({\n sectionType,\n definition,\n }),\n );\n }\n\n getDefinition(sectionType: string): SectionDefinition | undefined {\n return this.definitions.get(sectionType);\n }\n\n /**\n * True when a section type was registered with placement variant(s) only —\n * a `{ placement: true }` (or `placementId`) registration and NO\n * non-placement variant (default / intent / semantic). Such a section is\n * meaningful only inside a placement render; the parser skips its definition\n * when matching in a non-placement context (the main app), so its markdown\n * falls through to the generic sections there.\n *\n * A definition registered with no variants at all (structural defs like\n * `skipNodes` / `htmlComment`) is NOT placement-only — it still matches\n * everywhere.\n */\n isPlacementOnly(sectionType: string): boolean {\n const node = this.sections.get(sectionType);\n if (!node) {\n return false;\n }\n const hasPlacement =\n node.forPlacement != null || (node.forPlacementById?.size ?? 0) > 0;\n const hasNonPlacement =\n node.default != null ||\n (node.byIntent?.size ?? 0) > 0 ||\n (node.bySemantic?.size ?? 0) > 0;\n return hasPlacement && !hasNonPlacement;\n }\n\n getSlotVariants(name: string): SlotVariant[] {\n const node = this.slots.get(name);\n if (!node) {\n return [];\n }\n\n const variants: SlotVariant[] = [];\n if (node.default) {\n variants.push({});\n }\n\n if (node.bySemantic) {\n for (const semantic of node.bySemantic.keys()) {\n variants.push({ semantic });\n }\n }\n\n if (node.byIntent) {\n for (const [intent, intentNode] of node.byIntent) {\n if (intentNode.default) {\n variants.push({ intent });\n }\n if (intentNode.bySemantic) {\n for (const semantic of intentNode.bySemantic.keys()) {\n variants.push({ intent, semantic });\n }\n }\n }\n }\n\n return variants;\n }\n\n getSectionVariants(sectionType: string): SectionVariant[] {\n const node = this.sections.get(sectionType);\n if (!node) {\n return [];\n }\n\n const variants: SectionVariant[] = [];\n if (node.default) {\n variants.push({});\n }\n\n if (node.bySemantic) {\n for (const semantic of node.bySemantic.keys()) {\n variants.push({ semantic });\n }\n }\n\n if (node.byIntent) {\n for (const [intent, intentNode] of node.byIntent) {\n if (intentNode.default) {\n variants.push({ intent });\n }\n if (intentNode.bySemantic) {\n for (const semantic of intentNode.bySemantic.keys()) {\n variants.push({ intent, semantic });\n }\n }\n }\n }\n\n if (node.forPlacement) {\n variants.push({ placement: true });\n }\n\n if (node.forPlacementById) {\n for (const placementId of node.forPlacementById.keys()) {\n variants.push({ placement: true, placementId });\n }\n }\n\n return variants;\n }\n\n hasAction(name: string): boolean {\n return this.actions.has(name);\n }\n\n async executeAction(\n name: string,\n params: Record<string, string>,\n ): Promise<ActionResult> {\n const handler = this.actions.get(name);\n if (!handler) {\n console.warn(`[Action] No handler for: \"${name}\"`);\n return { success: false, message: `Unknown action: ${name}` };\n }\n return handler(params);\n }\n\n getRegisteredActions(): string[] {\n return Array.from(this.actions.keys());\n }\n\n getCatalog(): RegistryCatalog {\n return {\n slots: this.getAllSlots().map((name) => ({\n name,\n variants: this.getSlotVariants(name),\n })),\n sections: this.getAllSections().map((sectionType) => ({\n name: sectionType,\n variants: this.getSectionVariants(sectionType),\n })),\n definitions: this.getAllDefinitions(),\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private ensureSectionIntent(\n node: SectionNode<C>,\n intent: string,\n ): SectionIntentNode<C> {\n if (!node.byIntent) {\n node.byIntent = new Map();\n }\n let intentNode = node.byIntent.get(intent);\n if (!intentNode) {\n intentNode = {};\n node.byIntent.set(intent, intentNode);\n }\n return intentNode;\n }\n\n private ensureSlotIntent(\n node: SlotNode<C>,\n intent: string,\n ): SlotIntentNode<C> {\n if (!node.byIntent) {\n node.byIntent = new Map();\n }\n let intentNode = node.byIntent.get(intent);\n if (!intentNode) {\n intentNode = {};\n node.byIntent.set(intent, intentNode);\n }\n return intentNode;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["normalizeResolveOptions","intentOrOptions","semantic","intent","normalizeIntentKey","trim","toUpperCase","ComponentRegistry","constructor","fallback","_defineProperty2","default","Map","registerSlot","name","component","options","node","slots","get","set","intentNode","ensureSlotIntent","bySemantic","register","definition","variants","console","warn","definitions","sectionType","registration","sections","placement","placementId","forPlacementById","forPlacement","ensureSectionIntent","registerAction","handler","actions","resolveSlot","_node$byIntent","found","byIntent","_node$byIntent2","_node$bySemantic","resolveSection","resolveSectionRegistration","resolveSectionOptions","_this$resolveSectionR","undefined","_node$forPlacementByI","byId","_node$byIntent3","_node$byIntent4","_node$bySemantic2","getAllSlots","Array","from","keys","getAllSections","getKnownIntents","intents","Set","values","_node$byIntent5","forEach","_variant","key","add","_node$byIntent6","getAllDefinitions","entries","map","getDefinition","isPlacementOnly","_node$forPlacementByI2","_node$byIntent7","_node$bySemantic3","hasPlacement","size","hasNonPlacement","getSlotVariants","push","getSectionVariants","hasAction","has","executeAction","params","success","message","getRegisteredActions","getCatalog","exports"],"sources":["../../../src/registry/ComponentRegistry.ts"],"sourcesContent":["import type { SectionDefinition } from '../component/componentDefinitions';\nimport type {\n SlotOptions,\n SectionOptions,\n SectionRegistration,\n SlotNode,\n SlotIntentNode,\n SectionNode,\n SectionIntentNode,\n SlotVariant,\n SectionVariant,\n RegistryCatalog,\n ResolveSectionOptions,\n ActionHandler,\n ActionResult,\n} from './types';\n\n/**\n * Accept the legacy positional form `(intent, semantic)` and the new\n * options-object form `({ intent, semantic, placement })`. Returns a\n * normalized `ResolveSectionOptions`.\n */\nfunction normalizeResolveOptions(\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n): ResolveSectionOptions {\n if (intentOrOptions == null) {\n return semantic ? { semantic } : {};\n }\n if (typeof intentOrOptions === 'string') {\n return semantic ? { intent: intentOrOptions, semantic } : { intent: intentOrOptions };\n }\n return intentOrOptions;\n}\n\n/**\n * Intent keys are matched case-insensitively.\n *\n * The intent that reaches resolution has already been through\n * `intent.trim().toUpperCase()` — in this package's `intentExtractor`, and\n * again in `web50-server-ui`'s own copy of it, which calls it with no\n * `validIntents` and passes the result as `providedIntent`, bypassing the\n * validated path here. A client that registers its variants in the lowercase\n * spelling its own taxonomy doc uses therefore matched nothing, and every\n * intent-scoped variant silently fell through to the section default.\n *\n * That is not hypothetical: it was true of the whole seed registry. Measured\n * across 11 live answers, 10 rendered the same hero whatever the intent, and\n * one registered hero component never rendered at all. Nothing errors, nothing\n * logs, and the page looks plausible — which is why this belongs at the Map\n * rather than in either extractor.\n *\n * Normalizing on write AND on read makes the spelling a client's own business.\n */\nconst normalizeIntentKey = (intent: string): string =>\n intent.trim().toUpperCase();\n\nexport class ComponentRegistry<C> {\n private slots = new Map<string, SlotNode<C>>();\n private sections = new Map<string, SectionNode<C>>();\n private definitions = new Map<string, SectionDefinition>();\n private actions = new Map<string, ActionHandler>();\n\n constructor(private fallback: C) {}\n\n // ---------------------------------------------------------------------------\n // Registration\n // ---------------------------------------------------------------------------\n\n registerSlot(name: string, component: C, options?: SlotOptions): this {\n let node = this.slots.get(name);\n if (!node) {\n node = {};\n this.slots.set(name, node);\n }\n\n const { intent, semantic } = options ?? {};\n\n if (intent && semantic) {\n const intentNode = this.ensureSlotIntent(node, intent);\n if (!intentNode.bySemantic) {\n intentNode.bySemantic = new Map();\n }\n intentNode.bySemantic.set(semantic, component);\n } else if (intent) {\n const intentNode = this.ensureSlotIntent(node, intent);\n intentNode.default = component;\n } else if (semantic) {\n if (!node.bySemantic) {\n node.bySemantic = new Map();\n }\n node.bySemantic.set(semantic, component);\n } else {\n node.default = component;\n }\n\n return this;\n }\n\n register(\n definition: SectionDefinition,\n variants?: SectionRegistration<C>[],\n ): this {\n // Tolerate missing definitions instead of crashing app init. This\n // happens when a client UMD references a `SectionDefinition` symbol\n // that doesn't exist on the consuming bundle's `Web5Core` global\n // (e.g. UMD built against newer `web5-core` than the app bundle).\n // Without this guard a single missing export breaks every other\n // section the client tries to register.\n if (definition == null) {\n // eslint-disable-next-line no-console\n console.warn(\n '[ComponentRegistry] register() called with a null/undefined SectionDefinition — ' +\n 'likely a version skew between the client UMD and web5-core ' +\n '(an exported definition the UMD imports does not exist on this Web5Core). Skipping.',\n );\n return this;\n }\n this.definitions.set(definition.sectionType, definition);\n\n if (variants) {\n const sectionType = definition.sectionType;\n for (const registration of variants) {\n let node = this.sections.get(sectionType);\n if (!node) {\n node = {};\n this.sections.set(sectionType, node);\n }\n const { intent, semantic, placement, placementId } =\n registration.options ?? {};\n\n // Placement variants are stored on their own slot — no further\n // intent/semantic sub-variants (DL #088 D3.1). If a developer also\n // supplies intent/semantic alongside placement, those are ignored for\n // the placement registration. To register both a placement variant AND\n // an intent variant, register them as separate entries.\n if (placement) {\n // Scoped to a specific placement slot id — keyed so one section type\n // can render differently per placement. An id-less placement variant\n // remains the generic fallback.\n if (placementId) {\n if (!node.forPlacementById) {\n node.forPlacementById = new Map();\n }\n node.forPlacementById.set(placementId, registration);\n } else {\n node.forPlacement = registration;\n }\n continue;\n }\n\n if (intent && semantic) {\n const intentNode = this.ensureSectionIntent(node, intent);\n if (!intentNode.bySemantic) {\n intentNode.bySemantic = new Map();\n }\n intentNode.bySemantic.set(semantic, registration);\n } else if (intent) {\n const intentNode = this.ensureSectionIntent(node, intent);\n intentNode.default = registration;\n } else if (semantic) {\n if (!node.bySemantic) {\n node.bySemantic = new Map();\n }\n node.bySemantic.set(semantic, registration);\n } else {\n node.default = registration;\n }\n }\n }\n\n return this;\n }\n\n registerAction(name: string, handler: ActionHandler): this {\n this.actions.set(name, handler);\n return this;\n }\n\n // ---------------------------------------------------------------------------\n // Resolution\n // ---------------------------------------------------------------------------\n\n resolveSlot(name: string, intent?: string, semantic?: string): C {\n const node = this.slots.get(name);\n if (!node) {\n return this.fallback;\n }\n\n if (intent && semantic) {\n const found = node.byIntent\n ?.get(normalizeIntentKey(intent))\n ?.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n if (intent) {\n const found = node.byIntent?.get(normalizeIntentKey(intent))?.default;\n if (found) {\n return found;\n }\n }\n if (semantic) {\n const found = node.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n\n return node.default ?? this.fallback;\n }\n\n /**\n * Resolve a section component by type, optionally narrowed by intent /\n * semantic / placement.\n *\n * Accepts both call forms for backward compatibility:\n * resolveSection('hero') — default\n * resolveSection('hero', 'DISCOVERY') — intent (legacy positional)\n * resolveSection('hero', 'DISCOVERY', 'compact') — intent + semantic (legacy)\n * resolveSection('hero', { intent: 'DISCOVERY' }) — options object\n * resolveSection('hero', { placement: true }) — placement variant (DL #088 D3.1)\n * resolveSection('hero', { intent: 'X', placement: true }) — placement wins\n */\n resolveSection(sectionType: string, intent?: string, semantic?: string): C;\n resolveSection(sectionType: string, options: ResolveSectionOptions): C;\n resolveSection(\n sectionType: string,\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n ): C {\n const registration = this.resolveSectionRegistration(\n sectionType,\n normalizeResolveOptions(intentOrOptions, semantic),\n );\n return registration?.component ?? this.fallback;\n }\n\n /**\n * Resolve the options bundle associated with the matched registration.\n * Same overload semantics as `resolveSection`.\n */\n resolveSectionOptions(\n sectionType: string,\n intent?: string,\n semantic?: string,\n ): SectionOptions | undefined;\n resolveSectionOptions(\n sectionType: string,\n options: ResolveSectionOptions,\n ): SectionOptions | undefined;\n resolveSectionOptions(\n sectionType: string,\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n ): SectionOptions | undefined {\n return this.resolveSectionRegistration(\n sectionType,\n normalizeResolveOptions(intentOrOptions, semantic),\n )?.options;\n }\n\n private resolveSectionRegistration(\n sectionType: string,\n options: ResolveSectionOptions,\n ): SectionRegistration<C> | undefined {\n const node = this.sections.get(sectionType);\n if (!node) {\n return undefined;\n }\n\n const { intent, semantic, placement, placementId } = options;\n\n // Placement wins over intent / semantic when requested AND a placement\n // variant is registered for this section (DL #088 D3.1). Cascade:\n // id-scoped variant → generic placement variant → regular chain.\n if (placement) {\n if (placementId) {\n const byId = node.forPlacementById?.get(placementId);\n if (byId) {\n return byId;\n }\n }\n if (node.forPlacement) {\n return node.forPlacement;\n }\n }\n\n if (intent && semantic) {\n const found = node.byIntent\n ?.get(normalizeIntentKey(intent as string))\n ?.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n if (intent) {\n const found = node.byIntent?.get(normalizeIntentKey(intent as string))\n ?.default;\n if (found) {\n return found;\n }\n }\n if (semantic) {\n const found = node.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n\n return node.default;\n }\n\n // ---------------------------------------------------------------------------\n // Introspection\n // ---------------------------------------------------------------------------\n\n getAllSlots(): string[] {\n return Array.from(this.slots.keys());\n }\n\n getAllSections(): string[] {\n return Array.from(this.sections.keys());\n }\n\n /**\n * Every intent that has at least one registered slot or section variant —\n * i.e. the client's own intent list, derived from what it actually\n * registered. Assembly uses this to validate an incoming intent before it\n * becomes a resolution key, falling back to core's `DEFAULT_INTENTS` only\n * when a client registers no intent variants at all.\n *\n * Returned NORMALIZED (upper case), whatever spelling the client registered,\n * because these are the map keys. Both consumers compare case-insensitively,\n * so the only visible difference is in a debug view.\n */\n getKnownIntents(): string[] {\n const intents = new Set<string>();\n for (const node of this.slots.values()) {\n node.byIntent?.forEach((_variant, key) => intents.add(key));\n }\n for (const node of this.sections.values()) {\n node.byIntent?.forEach((_variant, key) => intents.add(key));\n }\n return Array.from(intents);\n }\n\n getAllDefinitions(): {\n sectionType: string;\n definition: SectionDefinition;\n }[] {\n return Array.from(this.definitions.entries()).map(\n ([sectionType, definition]) => ({\n sectionType,\n definition,\n }),\n );\n }\n\n getDefinition(sectionType: string): SectionDefinition | undefined {\n return this.definitions.get(sectionType);\n }\n\n /**\n * True when a section type was registered with placement variant(s) only —\n * a `{ placement: true }` (or `placementId`) registration and NO\n * non-placement variant (default / intent / semantic). Such a section is\n * meaningful only inside a placement render; the parser skips its definition\n * when matching in a non-placement context (the main app), so its markdown\n * falls through to the generic sections there.\n *\n * A definition registered with no variants at all (structural defs like\n * `skipNodes` / `htmlComment`) is NOT placement-only — it still matches\n * everywhere.\n */\n isPlacementOnly(sectionType: string): boolean {\n const node = this.sections.get(sectionType);\n if (!node) {\n return false;\n }\n const hasPlacement =\n node.forPlacement != null || (node.forPlacementById?.size ?? 0) > 0;\n const hasNonPlacement =\n node.default != null ||\n (node.byIntent?.size ?? 0) > 0 ||\n (node.bySemantic?.size ?? 0) > 0;\n return hasPlacement && !hasNonPlacement;\n }\n\n getSlotVariants(name: string): SlotVariant[] {\n const node = this.slots.get(name);\n if (!node) {\n return [];\n }\n\n const variants: SlotVariant[] = [];\n if (node.default) {\n variants.push({});\n }\n\n if (node.bySemantic) {\n for (const semantic of node.bySemantic.keys()) {\n variants.push({ semantic });\n }\n }\n\n if (node.byIntent) {\n for (const [intent, intentNode] of node.byIntent) {\n if (intentNode.default) {\n variants.push({ intent });\n }\n if (intentNode.bySemantic) {\n for (const semantic of intentNode.bySemantic.keys()) {\n variants.push({ intent, semantic });\n }\n }\n }\n }\n\n return variants;\n }\n\n getSectionVariants(sectionType: string): SectionVariant[] {\n const node = this.sections.get(sectionType);\n if (!node) {\n return [];\n }\n\n const variants: SectionVariant[] = [];\n if (node.default) {\n variants.push({});\n }\n\n if (node.bySemantic) {\n for (const semantic of node.bySemantic.keys()) {\n variants.push({ semantic });\n }\n }\n\n if (node.byIntent) {\n for (const [intent, intentNode] of node.byIntent) {\n if (intentNode.default) {\n variants.push({ intent });\n }\n if (intentNode.bySemantic) {\n for (const semantic of intentNode.bySemantic.keys()) {\n variants.push({ intent, semantic });\n }\n }\n }\n }\n\n if (node.forPlacement) {\n variants.push({ placement: true });\n }\n\n if (node.forPlacementById) {\n for (const placementId of node.forPlacementById.keys()) {\n variants.push({ placement: true, placementId });\n }\n }\n\n return variants;\n }\n\n hasAction(name: string): boolean {\n return this.actions.has(name);\n }\n\n async executeAction(\n name: string,\n params: Record<string, string>,\n ): Promise<ActionResult> {\n const handler = this.actions.get(name);\n if (!handler) {\n console.warn(`[Action] No handler for: \"${name}\"`);\n return { success: false, message: `Unknown action: ${name}` };\n }\n return handler(params);\n }\n\n getRegisteredActions(): string[] {\n return Array.from(this.actions.keys());\n }\n\n getCatalog(): RegistryCatalog {\n return {\n slots: this.getAllSlots().map((name) => ({\n name,\n variants: this.getSlotVariants(name),\n })),\n sections: this.getAllSections().map((sectionType) => ({\n name: sectionType,\n variants: this.getSectionVariants(sectionType),\n })),\n definitions: this.getAllDefinitions(),\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private ensureSectionIntent(\n node: SectionNode<C>,\n intent: string,\n ): SectionIntentNode<C> {\n if (!node.byIntent) {\n node.byIntent = new Map();\n }\n const key = normalizeIntentKey(intent);\n let intentNode = node.byIntent.get(key);\n if (!intentNode) {\n intentNode = {};\n node.byIntent.set(key, intentNode);\n }\n return intentNode;\n }\n\n private ensureSlotIntent(\n node: SlotNode<C>,\n intent: string,\n ): SlotIntentNode<C> {\n if (!node.byIntent) {\n node.byIntent = new Map();\n }\n const key = normalizeIntentKey(intent);\n let intentNode = node.byIntent.get(key);\n if (!intentNode) {\n intentNode = {};\n node.byIntent.set(key, intentNode);\n }\n return intentNode;\n }\n}\n"],"mappings":";;;;;;AAiBA;AACA;AACA;AACA;AACA;AACA,SAASA,uBAAuBA,CAC9BC,eAAgD,EAChDC,QAAiB,EACM;EACvB,IAAID,eAAe,IAAI,IAAI,EAAE;IAC3B,OAAOC,QAAQ,GAAG;MAAEA;IAAS,CAAC,GAAG,CAAC,CAAC;EACrC;EACA,IAAI,OAAOD,eAAe,KAAK,QAAQ,EAAE;IACvC,OAAOC,QAAQ,GAAG;MAAEC,MAAM,EAAEF,eAAe;MAAEC;IAAS,CAAC,GAAG;MAAEC,MAAM,EAAEF;IAAgB,CAAC;EACvF;EACA,OAAOA,eAAe;AACxB;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMG,kBAAkB,GAAID,MAAc,IACxCA,MAAM,CAACE,IAAI,CAAC,CAAC,CAACC,WAAW,CAAC,CAAC;AAEtB,MAAMC,iBAAiB,CAAI;EAMhCC,WAAWA,CAASC,QAAW,EAAE;IAAA,KAAbA,QAAW,GAAXA,QAAW;IAAA,IAAAC,gBAAA,CAAAC,OAAA,iBALf,IAAIC,GAAG,CAAsB,CAAC;IAAA,IAAAF,gBAAA,CAAAC,OAAA,oBAC3B,IAAIC,GAAG,CAAyB,CAAC;IAAA,IAAAF,gBAAA,CAAAC,OAAA,uBAC9B,IAAIC,GAAG,CAA4B,CAAC;IAAA,IAAAF,gBAAA,CAAAC,OAAA,mBACxC,IAAIC,GAAG,CAAwB,CAAC;EAEhB;;EAElC;EACA;EACA;;EAEAC,YAAYA,CAACC,IAAY,EAAEC,SAAY,EAAEC,OAAqB,EAAQ;IACpE,IAAIC,IAAI,GAAG,IAAI,CAACC,KAAK,CAACC,GAAG,CAACL,IAAI,CAAC;IAC/B,IAAI,CAACG,IAAI,EAAE;MACTA,IAAI,GAAG,CAAC,CAAC;MACT,IAAI,CAACC,KAAK,CAACE,GAAG,CAACN,IAAI,EAAEG,IAAI,CAAC;IAC5B;IAEA,MAAM;MAAEd,MAAM;MAAED;IAAS,CAAC,GAAGc,OAAO,IAAI,CAAC,CAAC;IAE1C,IAAIb,MAAM,IAAID,QAAQ,EAAE;MACtB,MAAMmB,UAAU,GAAG,IAAI,CAACC,gBAAgB,CAACL,IAAI,EAAEd,MAAM,CAAC;MACtD,IAAI,CAACkB,UAAU,CAACE,UAAU,EAAE;QAC1BF,UAAU,CAACE,UAAU,GAAG,IAAIX,GAAG,CAAC,CAAC;MACnC;MACAS,UAAU,CAACE,UAAU,CAACH,GAAG,CAAClB,QAAQ,EAAEa,SAAS,CAAC;IAChD,CAAC,MAAM,IAAIZ,MAAM,EAAE;MACjB,MAAMkB,UAAU,GAAG,IAAI,CAACC,gBAAgB,CAACL,IAAI,EAAEd,MAAM,CAAC;MACtDkB,UAAU,CAACV,OAAO,GAAGI,SAAS;IAChC,CAAC,MAAM,IAAIb,QAAQ,EAAE;MACnB,IAAI,CAACe,IAAI,CAACM,UAAU,EAAE;QACpBN,IAAI,CAACM,UAAU,GAAG,IAAIX,GAAG,CAAC,CAAC;MAC7B;MACAK,IAAI,CAACM,UAAU,CAACH,GAAG,CAAClB,QAAQ,EAAEa,SAAS,CAAC;IAC1C,CAAC,MAAM;MACLE,IAAI,CAACN,OAAO,GAAGI,SAAS;IAC1B;IAEA,OAAO,IAAI;EACb;EAEAS,QAAQA,CACNC,UAA6B,EAC7BC,QAAmC,EAC7B;IACN;IACA;IACA;IACA;IACA;IACA;IACA,IAAID,UAAU,IAAI,IAAI,EAAE;MACtB;MACAE,OAAO,CAACC,IAAI,CACV,kFAAkF,GAChF,6DAA6D,GAC7D,qFACJ,CAAC;MACD,OAAO,IAAI;IACb;IACA,IAAI,CAACC,WAAW,CAACT,GAAG,CAACK,UAAU,CAACK,WAAW,EAAEL,UAAU,CAAC;IAExD,IAAIC,QAAQ,EAAE;MACZ,MAAMI,WAAW,GAAGL,UAAU,CAACK,WAAW;MAC1C,KAAK,MAAMC,YAAY,IAAIL,QAAQ,EAAE;QACnC,IAAIT,IAAI,GAAG,IAAI,CAACe,QAAQ,CAACb,GAAG,CAACW,WAAW,CAAC;QACzC,IAAI,CAACb,IAAI,EAAE;UACTA,IAAI,GAAG,CAAC,CAAC;UACT,IAAI,CAACe,QAAQ,CAACZ,GAAG,CAACU,WAAW,EAAEb,IAAI,CAAC;QACtC;QACA,MAAM;UAAEd,MAAM;UAAED,QAAQ;UAAE+B,SAAS;UAAEC;QAAY,CAAC,GAChDH,YAAY,CAACf,OAAO,IAAI,CAAC,CAAC;;QAE5B;QACA;QACA;QACA;QACA;QACA,IAAIiB,SAAS,EAAE;UACb;UACA;UACA;UACA,IAAIC,WAAW,EAAE;YACf,IAAI,CAACjB,IAAI,CAACkB,gBAAgB,EAAE;cAC1BlB,IAAI,CAACkB,gBAAgB,GAAG,IAAIvB,GAAG,CAAC,CAAC;YACnC;YACAK,IAAI,CAACkB,gBAAgB,CAACf,GAAG,CAACc,WAAW,EAAEH,YAAY,CAAC;UACtD,CAAC,MAAM;YACLd,IAAI,CAACmB,YAAY,GAAGL,YAAY;UAClC;UACA;QACF;QAEA,IAAI5B,MAAM,IAAID,QAAQ,EAAE;UACtB,MAAMmB,UAAU,GAAG,IAAI,CAACgB,mBAAmB,CAACpB,IAAI,EAAEd,MAAM,CAAC;UACzD,IAAI,CAACkB,UAAU,CAACE,UAAU,EAAE;YAC1BF,UAAU,CAACE,UAAU,GAAG,IAAIX,GAAG,CAAC,CAAC;UACnC;UACAS,UAAU,CAACE,UAAU,CAACH,GAAG,CAAClB,QAAQ,EAAE6B,YAAY,CAAC;QACnD,CAAC,MAAM,IAAI5B,MAAM,EAAE;UACjB,MAAMkB,UAAU,GAAG,IAAI,CAACgB,mBAAmB,CAACpB,IAAI,EAAEd,MAAM,CAAC;UACzDkB,UAAU,CAACV,OAAO,GAAGoB,YAAY;QACnC,CAAC,MAAM,IAAI7B,QAAQ,EAAE;UACnB,IAAI,CAACe,IAAI,CAACM,UAAU,EAAE;YACpBN,IAAI,CAACM,UAAU,GAAG,IAAIX,GAAG,CAAC,CAAC;UAC7B;UACAK,IAAI,CAACM,UAAU,CAACH,GAAG,CAAClB,QAAQ,EAAE6B,YAAY,CAAC;QAC7C,CAAC,MAAM;UACLd,IAAI,CAACN,OAAO,GAAGoB,YAAY;QAC7B;MACF;IACF;IAEA,OAAO,IAAI;EACb;EAEAO,cAAcA,CAACxB,IAAY,EAAEyB,OAAsB,EAAQ;IACzD,IAAI,CAACC,OAAO,CAACpB,GAAG,CAACN,IAAI,EAAEyB,OAAO,CAAC;IAC/B,OAAO,IAAI;EACb;;EAEA;EACA;EACA;;EAEAE,WAAWA,CAAC3B,IAAY,EAAEX,MAAe,EAAED,QAAiB,EAAK;IAC/D,MAAMe,IAAI,GAAG,IAAI,CAACC,KAAK,CAACC,GAAG,CAACL,IAAI,CAAC;IACjC,IAAI,CAACG,IAAI,EAAE;MACT,OAAO,IAAI,CAACR,QAAQ;IACtB;IAEA,IAAIN,MAAM,IAAID,QAAQ,EAAE;MAAA,IAAAwC,cAAA;MACtB,MAAMC,KAAK,IAAAD,cAAA,GAAGzB,IAAI,CAAC2B,QAAQ,cAAAF,cAAA,GAAbA,cAAA,CACVvB,GAAG,CAACf,kBAAkB,CAACD,MAAM,CAAC,CAAC,cAAAuC,cAAA,GADrBA,cAAA,CAEVnB,UAAU,qBAFAmB,cAAA,CAEEvB,GAAG,CAACjB,QAAQ,CAAC;MAC7B,IAAIyC,KAAK,EAAE;QACT,OAAOA,KAAK;MACd;IACF;IACA,IAAIxC,MAAM,EAAE;MAAA,IAAA0C,eAAA;MACV,MAAMF,KAAK,IAAAE,eAAA,GAAG5B,IAAI,CAAC2B,QAAQ,cAAAC,eAAA,GAAbA,eAAA,CAAe1B,GAAG,CAACf,kBAAkB,CAACD,MAAM,CAAC,CAAC,qBAA9C0C,eAAA,CAAgDlC,OAAO;MACrE,IAAIgC,KAAK,EAAE;QACT,OAAOA,KAAK;MACd;IACF;IACA,IAAIzC,QAAQ,EAAE;MAAA,IAAA4C,gBAAA;MACZ,MAAMH,KAAK,IAAAG,gBAAA,GAAG7B,IAAI,CAACM,UAAU,qBAAfuB,gBAAA,CAAiB3B,GAAG,CAACjB,QAAQ,CAAC;MAC5C,IAAIyC,KAAK,EAAE;QACT,OAAOA,KAAK;MACd;IACF;IAEA,OAAO1B,IAAI,CAACN,OAAO,IAAI,IAAI,CAACF,QAAQ;EACtC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;EAGEsC,cAAcA,CACZjB,WAAmB,EACnB7B,eAAgD,EAChDC,QAAiB,EACd;IACH,MAAM6B,YAAY,GAAG,IAAI,CAACiB,0BAA0B,CAClDlB,WAAW,EACX9B,uBAAuB,CAACC,eAAe,EAAEC,QAAQ,CACnD,CAAC;IACD,OAAO,CAAA6B,YAAY,oBAAZA,YAAY,CAAEhB,SAAS,KAAI,IAAI,CAACN,QAAQ;EACjD;;EAEA;AACF;AACA;AACA;;EAUEwC,qBAAqBA,CACnBnB,WAAmB,EACnB7B,eAAgD,EAChDC,QAAiB,EACW;IAAA,IAAAgD,qBAAA;IAC5B,QAAAA,qBAAA,GAAO,IAAI,CAACF,0BAA0B,CACpClB,WAAW,EACX9B,uBAAuB,CAACC,eAAe,EAAEC,QAAQ,CACnD,CAAC,qBAHMgD,qBAAA,CAGJlC,OAAO;EACZ;EAEQgC,0BAA0BA,CAChClB,WAAmB,EACnBd,OAA8B,EACM;IACpC,MAAMC,IAAI,GAAG,IAAI,CAACe,QAAQ,CAACb,GAAG,CAACW,WAAW,CAAC;IAC3C,IAAI,CAACb,IAAI,EAAE;MACT,OAAOkC,SAAS;IAClB;IAEA,MAAM;MAAEhD,MAAM;MAAED,QAAQ;MAAE+B,SAAS;MAAEC;IAAY,CAAC,GAAGlB,OAAO;;IAE5D;IACA;IACA;IACA,IAAIiB,SAAS,EAAE;MACb,IAAIC,WAAW,EAAE;QAAA,IAAAkB,qBAAA;QACf,MAAMC,IAAI,IAAAD,qBAAA,GAAGnC,IAAI,CAACkB,gBAAgB,qBAArBiB,qBAAA,CAAuBjC,GAAG,CAACe,WAAW,CAAC;QACpD,IAAImB,IAAI,EAAE;UACR,OAAOA,IAAI;QACb;MACF;MACA,IAAIpC,IAAI,CAACmB,YAAY,EAAE;QACrB,OAAOnB,IAAI,CAACmB,YAAY;MAC1B;IACF;IAEA,IAAIjC,MAAM,IAAID,QAAQ,EAAE;MAAA,IAAAoD,eAAA;MACtB,MAAMX,KAAK,IAAAW,eAAA,GAAGrC,IAAI,CAAC2B,QAAQ,cAAAU,eAAA,GAAbA,eAAA,CACVnC,GAAG,CAACf,kBAAkB,CAACD,MAAgB,CAAC,CAAC,cAAAmD,eAAA,GAD/BA,eAAA,CAEV/B,UAAU,qBAFA+B,eAAA,CAEEnC,GAAG,CAACjB,QAAQ,CAAC;MAC7B,IAAIyC,KAAK,EAAE;QACT,OAAOA,KAAK;MACd;IACF;IACA,IAAIxC,MAAM,EAAE;MAAA,IAAAoD,eAAA;MACV,MAAMZ,KAAK,IAAAY,eAAA,GAAGtC,IAAI,CAAC2B,QAAQ,cAAAW,eAAA,GAAbA,eAAA,CAAepC,GAAG,CAACf,kBAAkB,CAACD,MAAgB,CAAC,CAAC,qBAAxDoD,eAAA,CACV5C,OAAO;MACX,IAAIgC,KAAK,EAAE;QACT,OAAOA,KAAK;MACd;IACF;IACA,IAAIzC,QAAQ,EAAE;MAAA,IAAAsD,iBAAA;MACZ,MAAMb,KAAK,IAAAa,iBAAA,GAAGvC,IAAI,CAACM,UAAU,qBAAfiC,iBAAA,CAAiBrC,GAAG,CAACjB,QAAQ,CAAC;MAC5C,IAAIyC,KAAK,EAAE;QACT,OAAOA,KAAK;MACd;IACF;IAEA,OAAO1B,IAAI,CAACN,OAAO;EACrB;;EAEA;EACA;EACA;;EAEA8C,WAAWA,CAAA,EAAa;IACtB,OAAOC,KAAK,CAACC,IAAI,CAAC,IAAI,CAACzC,KAAK,CAAC0C,IAAI,CAAC,CAAC,CAAC;EACtC;EAEAC,cAAcA,CAAA,EAAa;IACzB,OAAOH,KAAK,CAACC,IAAI,CAAC,IAAI,CAAC3B,QAAQ,CAAC4B,IAAI,CAAC,CAAC,CAAC;EACzC;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACEE,eAAeA,CAAA,EAAa;IAC1B,MAAMC,OAAO,GAAG,IAAIC,GAAG,CAAS,CAAC;IACjC,KAAK,MAAM/C,IAAI,IAAI,IAAI,CAACC,KAAK,CAAC+C,MAAM,CAAC,CAAC,EAAE;MAAA,IAAAC,eAAA;MACtC,CAAAA,eAAA,GAAAjD,IAAI,CAAC2B,QAAQ,aAAbsB,eAAA,CAAeC,OAAO,CAAC,CAACC,QAAQ,EAAEC,GAAG,KAAKN,OAAO,CAACO,GAAG,CAACD,GAAG,CAAC,CAAC;IAC7D;IACA,KAAK,MAAMpD,IAAI,IAAI,IAAI,CAACe,QAAQ,CAACiC,MAAM,CAAC,CAAC,EAAE;MAAA,IAAAM,eAAA;MACzC,CAAAA,eAAA,GAAAtD,IAAI,CAAC2B,QAAQ,aAAb2B,eAAA,CAAeJ,OAAO,CAAC,CAACC,QAAQ,EAAEC,GAAG,KAAKN,OAAO,CAACO,GAAG,CAACD,GAAG,CAAC,CAAC;IAC7D;IACA,OAAOX,KAAK,CAACC,IAAI,CAACI,OAAO,CAAC;EAC5B;EAEAS,iBAAiBA,CAAA,EAGb;IACF,OAAOd,KAAK,CAACC,IAAI,CAAC,IAAI,CAAC9B,WAAW,CAAC4C,OAAO,CAAC,CAAC,CAAC,CAACC,GAAG,CAC/C,CAAC,CAAC5C,WAAW,EAAEL,UAAU,CAAC,MAAM;MAC9BK,WAAW;MACXL;IACF,CAAC,CACH,CAAC;EACH;EAEAkD,aAAaA,CAAC7C,WAAmB,EAAiC;IAChE,OAAO,IAAI,CAACD,WAAW,CAACV,GAAG,CAACW,WAAW,CAAC;EAC1C;;EAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE8C,eAAeA,CAAC9C,WAAmB,EAAW;IAAA,IAAA+C,sBAAA,EAAAC,eAAA,EAAAC,iBAAA;IAC5C,MAAM9D,IAAI,GAAG,IAAI,CAACe,QAAQ,CAACb,GAAG,CAACW,WAAW,CAAC;IAC3C,IAAI,CAACb,IAAI,EAAE;MACT,OAAO,KAAK;IACd;IACA,MAAM+D,YAAY,GAChB/D,IAAI,CAACmB,YAAY,IAAI,IAAI,IAAI,CAAC,EAAAyC,sBAAA,GAAA5D,IAAI,CAACkB,gBAAgB,qBAArB0C,sBAAA,CAAuBI,IAAI,KAAI,CAAC,IAAI,CAAC;IACrE,MAAMC,eAAe,GACnBjE,IAAI,CAACN,OAAO,IAAI,IAAI,IACpB,CAAC,EAAAmE,eAAA,GAAA7D,IAAI,CAAC2B,QAAQ,qBAAbkC,eAAA,CAAeG,IAAI,KAAI,CAAC,IAAI,CAAC,IAC9B,CAAC,EAAAF,iBAAA,GAAA9D,IAAI,CAACM,UAAU,qBAAfwD,iBAAA,CAAiBE,IAAI,KAAI,CAAC,IAAI,CAAC;IAClC,OAAOD,YAAY,IAAI,CAACE,eAAe;EACzC;EAEAC,eAAeA,CAACrE,IAAY,EAAiB;IAC3C,MAAMG,IAAI,GAAG,IAAI,CAACC,KAAK,CAACC,GAAG,CAACL,IAAI,CAAC;IACjC,IAAI,CAACG,IAAI,EAAE;MACT,OAAO,EAAE;IACX;IAEA,MAAMS,QAAuB,GAAG,EAAE;IAClC,IAAIT,IAAI,CAACN,OAAO,EAAE;MAChBe,QAAQ,CAAC0D,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB;IAEA,IAAInE,IAAI,CAACM,UAAU,EAAE;MACnB,KAAK,MAAMrB,QAAQ,IAAIe,IAAI,CAACM,UAAU,CAACqC,IAAI,CAAC,CAAC,EAAE;QAC7ClC,QAAQ,CAAC0D,IAAI,CAAC;UAAElF;QAAS,CAAC,CAAC;MAC7B;IACF;IAEA,IAAIe,IAAI,CAAC2B,QAAQ,EAAE;MACjB,KAAK,MAAM,CAACzC,MAAM,EAAEkB,UAAU,CAAC,IAAIJ,IAAI,CAAC2B,QAAQ,EAAE;QAChD,IAAIvB,UAAU,CAACV,OAAO,EAAE;UACtBe,QAAQ,CAAC0D,IAAI,CAAC;YAAEjF;UAAO,CAAC,CAAC;QAC3B;QACA,IAAIkB,UAAU,CAACE,UAAU,EAAE;UACzB,KAAK,MAAMrB,QAAQ,IAAImB,UAAU,CAACE,UAAU,CAACqC,IAAI,CAAC,CAAC,EAAE;YACnDlC,QAAQ,CAAC0D,IAAI,CAAC;cAAEjF,MAAM;cAAED;YAAS,CAAC,CAAC;UACrC;QACF;MACF;IACF;IAEA,OAAOwB,QAAQ;EACjB;EAEA2D,kBAAkBA,CAACvD,WAAmB,EAAoB;IACxD,MAAMb,IAAI,GAAG,IAAI,CAACe,QAAQ,CAACb,GAAG,CAACW,WAAW,CAAC;IAC3C,IAAI,CAACb,IAAI,EAAE;MACT,OAAO,EAAE;IACX;IAEA,MAAMS,QAA0B,GAAG,EAAE;IACrC,IAAIT,IAAI,CAACN,OAAO,EAAE;MAChBe,QAAQ,CAAC0D,IAAI,CAAC,CAAC,CAAC,CAAC;IACnB;IAEA,IAAInE,IAAI,CAACM,UAAU,EAAE;MACnB,KAAK,MAAMrB,QAAQ,IAAIe,IAAI,CAACM,UAAU,CAACqC,IAAI,CAAC,CAAC,EAAE;QAC7ClC,QAAQ,CAAC0D,IAAI,CAAC;UAAElF;QAAS,CAAC,CAAC;MAC7B;IACF;IAEA,IAAIe,IAAI,CAAC2B,QAAQ,EAAE;MACjB,KAAK,MAAM,CAACzC,MAAM,EAAEkB,UAAU,CAAC,IAAIJ,IAAI,CAAC2B,QAAQ,EAAE;QAChD,IAAIvB,UAAU,CAACV,OAAO,EAAE;UACtBe,QAAQ,CAAC0D,IAAI,CAAC;YAAEjF;UAAO,CAAC,CAAC;QAC3B;QACA,IAAIkB,UAAU,CAACE,UAAU,EAAE;UACzB,KAAK,MAAMrB,QAAQ,IAAImB,UAAU,CAACE,UAAU,CAACqC,IAAI,CAAC,CAAC,EAAE;YACnDlC,QAAQ,CAAC0D,IAAI,CAAC;cAAEjF,MAAM;cAAED;YAAS,CAAC,CAAC;UACrC;QACF;MACF;IACF;IAEA,IAAIe,IAAI,CAACmB,YAAY,EAAE;MACrBV,QAAQ,CAAC0D,IAAI,CAAC;QAAEnD,SAAS,EAAE;MAAK,CAAC,CAAC;IACpC;IAEA,IAAIhB,IAAI,CAACkB,gBAAgB,EAAE;MACzB,KAAK,MAAMD,WAAW,IAAIjB,IAAI,CAACkB,gBAAgB,CAACyB,IAAI,CAAC,CAAC,EAAE;QACtDlC,QAAQ,CAAC0D,IAAI,CAAC;UAAEnD,SAAS,EAAE,IAAI;UAAEC;QAAY,CAAC,CAAC;MACjD;IACF;IAEA,OAAOR,QAAQ;EACjB;EAEA4D,SAASA,CAACxE,IAAY,EAAW;IAC/B,OAAO,IAAI,CAAC0B,OAAO,CAAC+C,GAAG,CAACzE,IAAI,CAAC;EAC/B;EAEA,MAAM0E,aAAaA,CACjB1E,IAAY,EACZ2E,MAA8B,EACP;IACvB,MAAMlD,OAAO,GAAG,IAAI,CAACC,OAAO,CAACrB,GAAG,CAACL,IAAI,CAAC;IACtC,IAAI,CAACyB,OAAO,EAAE;MACZZ,OAAO,CAACC,IAAI,CAAC,6BAA6Bd,IAAI,GAAG,CAAC;MAClD,OAAO;QAAE4E,OAAO,EAAE,KAAK;QAAEC,OAAO,EAAE,mBAAmB7E,IAAI;MAAG,CAAC;IAC/D;IACA,OAAOyB,OAAO,CAACkD,MAAM,CAAC;EACxB;EAEAG,oBAAoBA,CAAA,EAAa;IAC/B,OAAOlC,KAAK,CAACC,IAAI,CAAC,IAAI,CAACnB,OAAO,CAACoB,IAAI,CAAC,CAAC,CAAC;EACxC;EAEAiC,UAAUA,CAAA,EAAoB;IAC5B,OAAO;MACL3E,KAAK,EAAE,IAAI,CAACuC,WAAW,CAAC,CAAC,CAACiB,GAAG,CAAE5D,IAAI,KAAM;QACvCA,IAAI;QACJY,QAAQ,EAAE,IAAI,CAACyD,eAAe,CAACrE,IAAI;MACrC,CAAC,CAAC,CAAC;MACHkB,QAAQ,EAAE,IAAI,CAAC6B,cAAc,CAAC,CAAC,CAACa,GAAG,CAAE5C,WAAW,KAAM;QACpDhB,IAAI,EAAEgB,WAAW;QACjBJ,QAAQ,EAAE,IAAI,CAAC2D,kBAAkB,CAACvD,WAAW;MAC/C,CAAC,CAAC,CAAC;MACHD,WAAW,EAAE,IAAI,CAAC2C,iBAAiB,CAAC;IACtC,CAAC;EACH;;EAEA;EACA;EACA;;EAEQnC,mBAAmBA,CACzBpB,IAAoB,EACpBd,MAAc,EACQ;IACtB,IAAI,CAACc,IAAI,CAAC2B,QAAQ,EAAE;MAClB3B,IAAI,CAAC2B,QAAQ,GAAG,IAAIhC,GAAG,CAAC,CAAC;IAC3B;IACA,MAAMyD,GAAG,GAAGjE,kBAAkB,CAACD,MAAM,CAAC;IACtC,IAAIkB,UAAU,GAAGJ,IAAI,CAAC2B,QAAQ,CAACzB,GAAG,CAACkD,GAAG,CAAC;IACvC,IAAI,CAAChD,UAAU,EAAE;MACfA,UAAU,GAAG,CAAC,CAAC;MACfJ,IAAI,CAAC2B,QAAQ,CAACxB,GAAG,CAACiD,GAAG,EAAEhD,UAAU,CAAC;IACpC;IACA,OAAOA,UAAU;EACnB;EAEQC,gBAAgBA,CACtBL,IAAiB,EACjBd,MAAc,EACK;IACnB,IAAI,CAACc,IAAI,CAAC2B,QAAQ,EAAE;MAClB3B,IAAI,CAAC2B,QAAQ,GAAG,IAAIhC,GAAG,CAAC,CAAC;IAC3B;IACA,MAAMyD,GAAG,GAAGjE,kBAAkB,CAACD,MAAM,CAAC;IACtC,IAAIkB,UAAU,GAAGJ,IAAI,CAAC2B,QAAQ,CAACzB,GAAG,CAACkD,GAAG,CAAC;IACvC,IAAI,CAAChD,UAAU,EAAE;MACfA,UAAU,GAAG,CAAC,CAAC;MACfJ,IAAI,CAAC2B,QAAQ,CAACxB,GAAG,CAACiD,GAAG,EAAEhD,UAAU,CAAC;IACpC;IACA,OAAOA,UAAU;EACnB;AACF;AAACyE,OAAA,CAAAvF,iBAAA,GAAAA,iBAAA","ignoreList":[]}
@@ -20,6 +20,27 @@ function normalizeResolveOptions(intentOrOptions, semantic) {
20
20
  }
21
21
  return intentOrOptions;
22
22
  }
23
+
24
+ /**
25
+ * Intent keys are matched case-insensitively.
26
+ *
27
+ * The intent that reaches resolution has already been through
28
+ * `intent.trim().toUpperCase()` — in this package's `intentExtractor`, and
29
+ * again in `web50-server-ui`'s own copy of it, which calls it with no
30
+ * `validIntents` and passes the result as `providedIntent`, bypassing the
31
+ * validated path here. A client that registers its variants in the lowercase
32
+ * spelling its own taxonomy doc uses therefore matched nothing, and every
33
+ * intent-scoped variant silently fell through to the section default.
34
+ *
35
+ * That is not hypothetical: it was true of the whole seed registry. Measured
36
+ * across 11 live answers, 10 rendered the same hero whatever the intent, and
37
+ * one registered hero component never rendered at all. Nothing errors, nothing
38
+ * logs, and the page looks plausible — which is why this belongs at the Map
39
+ * rather than in either extractor.
40
+ *
41
+ * Normalizing on write AND on read makes the spelling a client's own business.
42
+ */
43
+ const normalizeIntentKey = intent => intent.trim().toUpperCase();
23
44
  export class ComponentRegistry {
24
45
  constructor(fallback) {
25
46
  this.fallback = fallback;
@@ -146,14 +167,14 @@ export class ComponentRegistry {
146
167
  }
147
168
  if (intent && semantic) {
148
169
  var _node$byIntent;
149
- const found = (_node$byIntent = node.byIntent) == null || (_node$byIntent = _node$byIntent.get(intent)) == null || (_node$byIntent = _node$byIntent.bySemantic) == null ? void 0 : _node$byIntent.get(semantic);
170
+ const found = (_node$byIntent = node.byIntent) == null || (_node$byIntent = _node$byIntent.get(normalizeIntentKey(intent))) == null || (_node$byIntent = _node$byIntent.bySemantic) == null ? void 0 : _node$byIntent.get(semantic);
150
171
  if (found) {
151
172
  return found;
152
173
  }
153
174
  }
154
175
  if (intent) {
155
176
  var _node$byIntent2;
156
- const found = (_node$byIntent2 = node.byIntent) == null || (_node$byIntent2 = _node$byIntent2.get(intent)) == null ? void 0 : _node$byIntent2.default;
177
+ const found = (_node$byIntent2 = node.byIntent) == null || (_node$byIntent2 = _node$byIntent2.get(normalizeIntentKey(intent))) == null ? void 0 : _node$byIntent2.default;
157
178
  if (found) {
158
179
  return found;
159
180
  }
@@ -224,14 +245,14 @@ export class ComponentRegistry {
224
245
  }
225
246
  if (intent && semantic) {
226
247
  var _node$byIntent3;
227
- const found = (_node$byIntent3 = node.byIntent) == null || (_node$byIntent3 = _node$byIntent3.get(intent)) == null || (_node$byIntent3 = _node$byIntent3.bySemantic) == null ? void 0 : _node$byIntent3.get(semantic);
248
+ const found = (_node$byIntent3 = node.byIntent) == null || (_node$byIntent3 = _node$byIntent3.get(normalizeIntentKey(intent))) == null || (_node$byIntent3 = _node$byIntent3.bySemantic) == null ? void 0 : _node$byIntent3.get(semantic);
228
249
  if (found) {
229
250
  return found;
230
251
  }
231
252
  }
232
253
  if (intent) {
233
254
  var _node$byIntent4;
234
- const found = (_node$byIntent4 = node.byIntent) == null || (_node$byIntent4 = _node$byIntent4.get(intent)) == null ? void 0 : _node$byIntent4.default;
255
+ const found = (_node$byIntent4 = node.byIntent) == null || (_node$byIntent4 = _node$byIntent4.get(normalizeIntentKey(intent))) == null ? void 0 : _node$byIntent4.default;
235
256
  if (found) {
236
257
  return found;
237
258
  }
@@ -263,6 +284,10 @@ export class ComponentRegistry {
263
284
  * registered. Assembly uses this to validate an incoming intent before it
264
285
  * becomes a resolution key, falling back to core's `DEFAULT_INTENTS` only
265
286
  * when a client registers no intent variants at all.
287
+ *
288
+ * Returned NORMALIZED (upper case), whatever spelling the client registered,
289
+ * because these are the map keys. Both consumers compare case-insensitively,
290
+ * so the only visible difference is in a debug view.
266
291
  */
267
292
  getKnownIntents() {
268
293
  const intents = new Set();
@@ -433,10 +458,11 @@ export class ComponentRegistry {
433
458
  if (!node.byIntent) {
434
459
  node.byIntent = new Map();
435
460
  }
436
- let intentNode = node.byIntent.get(intent);
461
+ const key = normalizeIntentKey(intent);
462
+ let intentNode = node.byIntent.get(key);
437
463
  if (!intentNode) {
438
464
  intentNode = {};
439
- node.byIntent.set(intent, intentNode);
465
+ node.byIntent.set(key, intentNode);
440
466
  }
441
467
  return intentNode;
442
468
  }
@@ -444,10 +470,11 @@ export class ComponentRegistry {
444
470
  if (!node.byIntent) {
445
471
  node.byIntent = new Map();
446
472
  }
447
- let intentNode = node.byIntent.get(intent);
473
+ const key = normalizeIntentKey(intent);
474
+ let intentNode = node.byIntent.get(key);
448
475
  if (!intentNode) {
449
476
  intentNode = {};
450
- node.byIntent.set(intent, intentNode);
477
+ node.byIntent.set(key, intentNode);
451
478
  }
452
479
  return intentNode;
453
480
  }
@@ -1 +1 @@
1
- {"version":3,"names":["normalizeResolveOptions","intentOrOptions","semantic","intent","ComponentRegistry","constructor","fallback","_defineProperty","Map","registerSlot","name","component","options","node","slots","get","set","intentNode","ensureSlotIntent","bySemantic","default","register","definition","variants","console","warn","definitions","sectionType","registration","sections","placement","placementId","forPlacementById","forPlacement","ensureSectionIntent","registerAction","handler","actions","resolveSlot","_node$byIntent","found","byIntent","_node$byIntent2","_node$bySemantic","resolveSection","resolveSectionRegistration","resolveSectionOptions","_this$resolveSectionR","undefined","_node$forPlacementByI","byId","_node$byIntent3","_node$byIntent4","_node$bySemantic2","getAllSlots","Array","from","keys","getAllSections","getKnownIntents","intents","Set","values","_node$byIntent5","forEach","_variant","key","add","_node$byIntent6","getAllDefinitions","entries","map","_ref","getDefinition","isPlacementOnly","_node$forPlacementByI2","_node$byIntent7","_node$bySemantic3","hasPlacement","size","hasNonPlacement","getSlotVariants","push","getSectionVariants","hasAction","has","executeAction","params","success","message","getRegisteredActions","getCatalog"],"sources":["../../../src/registry/ComponentRegistry.ts"],"sourcesContent":["import type { SectionDefinition } from '../component/componentDefinitions';\nimport type {\n SlotOptions,\n SectionOptions,\n SectionRegistration,\n SlotNode,\n SlotIntentNode,\n SectionNode,\n SectionIntentNode,\n SlotVariant,\n SectionVariant,\n RegistryCatalog,\n ResolveSectionOptions,\n ActionHandler,\n ActionResult,\n} from './types';\n\n/**\n * Accept the legacy positional form `(intent, semantic)` and the new\n * options-object form `({ intent, semantic, placement })`. Returns a\n * normalized `ResolveSectionOptions`.\n */\nfunction normalizeResolveOptions(\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n): ResolveSectionOptions {\n if (intentOrOptions == null) {\n return semantic ? { semantic } : {};\n }\n if (typeof intentOrOptions === 'string') {\n return semantic ? { intent: intentOrOptions, semantic } : { intent: intentOrOptions };\n }\n return intentOrOptions;\n}\n\nexport class ComponentRegistry<C> {\n private slots = new Map<string, SlotNode<C>>();\n private sections = new Map<string, SectionNode<C>>();\n private definitions = new Map<string, SectionDefinition>();\n private actions = new Map<string, ActionHandler>();\n\n constructor(private fallback: C) {}\n\n // ---------------------------------------------------------------------------\n // Registration\n // ---------------------------------------------------------------------------\n\n registerSlot(name: string, component: C, options?: SlotOptions): this {\n let node = this.slots.get(name);\n if (!node) {\n node = {};\n this.slots.set(name, node);\n }\n\n const { intent, semantic } = options ?? {};\n\n if (intent && semantic) {\n const intentNode = this.ensureSlotIntent(node, intent);\n if (!intentNode.bySemantic) {\n intentNode.bySemantic = new Map();\n }\n intentNode.bySemantic.set(semantic, component);\n } else if (intent) {\n const intentNode = this.ensureSlotIntent(node, intent);\n intentNode.default = component;\n } else if (semantic) {\n if (!node.bySemantic) {\n node.bySemantic = new Map();\n }\n node.bySemantic.set(semantic, component);\n } else {\n node.default = component;\n }\n\n return this;\n }\n\n register(\n definition: SectionDefinition,\n variants?: SectionRegistration<C>[],\n ): this {\n // Tolerate missing definitions instead of crashing app init. This\n // happens when a client UMD references a `SectionDefinition` symbol\n // that doesn't exist on the consuming bundle's `Web5Core` global\n // (e.g. UMD built against newer `web5-core` than the app bundle).\n // Without this guard a single missing export breaks every other\n // section the client tries to register.\n if (definition == null) {\n // eslint-disable-next-line no-console\n console.warn(\n '[ComponentRegistry] register() called with a null/undefined SectionDefinition — ' +\n 'likely a version skew between the client UMD and web5-core ' +\n '(an exported definition the UMD imports does not exist on this Web5Core). Skipping.',\n );\n return this;\n }\n this.definitions.set(definition.sectionType, definition);\n\n if (variants) {\n const sectionType = definition.sectionType;\n for (const registration of variants) {\n let node = this.sections.get(sectionType);\n if (!node) {\n node = {};\n this.sections.set(sectionType, node);\n }\n const { intent, semantic, placement, placementId } =\n registration.options ?? {};\n\n // Placement variants are stored on their own slot — no further\n // intent/semantic sub-variants (DL #088 D3.1). If a developer also\n // supplies intent/semantic alongside placement, those are ignored for\n // the placement registration. To register both a placement variant AND\n // an intent variant, register them as separate entries.\n if (placement) {\n // Scoped to a specific placement slot id — keyed so one section type\n // can render differently per placement. An id-less placement variant\n // remains the generic fallback.\n if (placementId) {\n if (!node.forPlacementById) {\n node.forPlacementById = new Map();\n }\n node.forPlacementById.set(placementId, registration);\n } else {\n node.forPlacement = registration;\n }\n continue;\n }\n\n if (intent && semantic) {\n const intentNode = this.ensureSectionIntent(node, intent);\n if (!intentNode.bySemantic) {\n intentNode.bySemantic = new Map();\n }\n intentNode.bySemantic.set(semantic, registration);\n } else if (intent) {\n const intentNode = this.ensureSectionIntent(node, intent);\n intentNode.default = registration;\n } else if (semantic) {\n if (!node.bySemantic) {\n node.bySemantic = new Map();\n }\n node.bySemantic.set(semantic, registration);\n } else {\n node.default = registration;\n }\n }\n }\n\n return this;\n }\n\n registerAction(name: string, handler: ActionHandler): this {\n this.actions.set(name, handler);\n return this;\n }\n\n // ---------------------------------------------------------------------------\n // Resolution\n // ---------------------------------------------------------------------------\n\n resolveSlot(name: string, intent?: string, semantic?: string): C {\n const node = this.slots.get(name);\n if (!node) {\n return this.fallback;\n }\n\n if (intent && semantic) {\n const found = node.byIntent?.get(intent)?.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n if (intent) {\n const found = node.byIntent?.get(intent)?.default;\n if (found) {\n return found;\n }\n }\n if (semantic) {\n const found = node.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n\n return node.default ?? this.fallback;\n }\n\n /**\n * Resolve a section component by type, optionally narrowed by intent /\n * semantic / placement.\n *\n * Accepts both call forms for backward compatibility:\n * resolveSection('hero') — default\n * resolveSection('hero', 'DISCOVERY') — intent (legacy positional)\n * resolveSection('hero', 'DISCOVERY', 'compact') — intent + semantic (legacy)\n * resolveSection('hero', { intent: 'DISCOVERY' }) — options object\n * resolveSection('hero', { placement: true }) — placement variant (DL #088 D3.1)\n * resolveSection('hero', { intent: 'X', placement: true }) — placement wins\n */\n resolveSection(sectionType: string, intent?: string, semantic?: string): C;\n resolveSection(sectionType: string, options: ResolveSectionOptions): C;\n resolveSection(\n sectionType: string,\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n ): C {\n const registration = this.resolveSectionRegistration(\n sectionType,\n normalizeResolveOptions(intentOrOptions, semantic),\n );\n return registration?.component ?? this.fallback;\n }\n\n /**\n * Resolve the options bundle associated with the matched registration.\n * Same overload semantics as `resolveSection`.\n */\n resolveSectionOptions(\n sectionType: string,\n intent?: string,\n semantic?: string,\n ): SectionOptions | undefined;\n resolveSectionOptions(\n sectionType: string,\n options: ResolveSectionOptions,\n ): SectionOptions | undefined;\n resolveSectionOptions(\n sectionType: string,\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n ): SectionOptions | undefined {\n return this.resolveSectionRegistration(\n sectionType,\n normalizeResolveOptions(intentOrOptions, semantic),\n )?.options;\n }\n\n private resolveSectionRegistration(\n sectionType: string,\n options: ResolveSectionOptions,\n ): SectionRegistration<C> | undefined {\n const node = this.sections.get(sectionType);\n if (!node) {\n return undefined;\n }\n\n const { intent, semantic, placement, placementId } = options;\n\n // Placement wins over intent / semantic when requested AND a placement\n // variant is registered for this section (DL #088 D3.1). Cascade:\n // id-scoped variant → generic placement variant → regular chain.\n if (placement) {\n if (placementId) {\n const byId = node.forPlacementById?.get(placementId);\n if (byId) {\n return byId;\n }\n }\n if (node.forPlacement) {\n return node.forPlacement;\n }\n }\n\n if (intent && semantic) {\n const found = node.byIntent?.get(intent as string)?.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n if (intent) {\n const found = node.byIntent?.get(intent as string)?.default;\n if (found) {\n return found;\n }\n }\n if (semantic) {\n const found = node.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n\n return node.default;\n }\n\n // ---------------------------------------------------------------------------\n // Introspection\n // ---------------------------------------------------------------------------\n\n getAllSlots(): string[] {\n return Array.from(this.slots.keys());\n }\n\n getAllSections(): string[] {\n return Array.from(this.sections.keys());\n }\n\n /**\n * Every intent that has at least one registered slot or section variant —\n * i.e. the client's own intent list, derived from what it actually\n * registered. Assembly uses this to validate an incoming intent before it\n * becomes a resolution key, falling back to core's `DEFAULT_INTENTS` only\n * when a client registers no intent variants at all.\n */\n getKnownIntents(): string[] {\n const intents = new Set<string>();\n for (const node of this.slots.values()) {\n node.byIntent?.forEach((_variant, key) => intents.add(key));\n }\n for (const node of this.sections.values()) {\n node.byIntent?.forEach((_variant, key) => intents.add(key));\n }\n return Array.from(intents);\n }\n\n getAllDefinitions(): {\n sectionType: string;\n definition: SectionDefinition;\n }[] {\n return Array.from(this.definitions.entries()).map(\n ([sectionType, definition]) => ({\n sectionType,\n definition,\n }),\n );\n }\n\n getDefinition(sectionType: string): SectionDefinition | undefined {\n return this.definitions.get(sectionType);\n }\n\n /**\n * True when a section type was registered with placement variant(s) only —\n * a `{ placement: true }` (or `placementId`) registration and NO\n * non-placement variant (default / intent / semantic). Such a section is\n * meaningful only inside a placement render; the parser skips its definition\n * when matching in a non-placement context (the main app), so its markdown\n * falls through to the generic sections there.\n *\n * A definition registered with no variants at all (structural defs like\n * `skipNodes` / `htmlComment`) is NOT placement-only — it still matches\n * everywhere.\n */\n isPlacementOnly(sectionType: string): boolean {\n const node = this.sections.get(sectionType);\n if (!node) {\n return false;\n }\n const hasPlacement =\n node.forPlacement != null || (node.forPlacementById?.size ?? 0) > 0;\n const hasNonPlacement =\n node.default != null ||\n (node.byIntent?.size ?? 0) > 0 ||\n (node.bySemantic?.size ?? 0) > 0;\n return hasPlacement && !hasNonPlacement;\n }\n\n getSlotVariants(name: string): SlotVariant[] {\n const node = this.slots.get(name);\n if (!node) {\n return [];\n }\n\n const variants: SlotVariant[] = [];\n if (node.default) {\n variants.push({});\n }\n\n if (node.bySemantic) {\n for (const semantic of node.bySemantic.keys()) {\n variants.push({ semantic });\n }\n }\n\n if (node.byIntent) {\n for (const [intent, intentNode] of node.byIntent) {\n if (intentNode.default) {\n variants.push({ intent });\n }\n if (intentNode.bySemantic) {\n for (const semantic of intentNode.bySemantic.keys()) {\n variants.push({ intent, semantic });\n }\n }\n }\n }\n\n return variants;\n }\n\n getSectionVariants(sectionType: string): SectionVariant[] {\n const node = this.sections.get(sectionType);\n if (!node) {\n return [];\n }\n\n const variants: SectionVariant[] = [];\n if (node.default) {\n variants.push({});\n }\n\n if (node.bySemantic) {\n for (const semantic of node.bySemantic.keys()) {\n variants.push({ semantic });\n }\n }\n\n if (node.byIntent) {\n for (const [intent, intentNode] of node.byIntent) {\n if (intentNode.default) {\n variants.push({ intent });\n }\n if (intentNode.bySemantic) {\n for (const semantic of intentNode.bySemantic.keys()) {\n variants.push({ intent, semantic });\n }\n }\n }\n }\n\n if (node.forPlacement) {\n variants.push({ placement: true });\n }\n\n if (node.forPlacementById) {\n for (const placementId of node.forPlacementById.keys()) {\n variants.push({ placement: true, placementId });\n }\n }\n\n return variants;\n }\n\n hasAction(name: string): boolean {\n return this.actions.has(name);\n }\n\n async executeAction(\n name: string,\n params: Record<string, string>,\n ): Promise<ActionResult> {\n const handler = this.actions.get(name);\n if (!handler) {\n console.warn(`[Action] No handler for: \"${name}\"`);\n return { success: false, message: `Unknown action: ${name}` };\n }\n return handler(params);\n }\n\n getRegisteredActions(): string[] {\n return Array.from(this.actions.keys());\n }\n\n getCatalog(): RegistryCatalog {\n return {\n slots: this.getAllSlots().map((name) => ({\n name,\n variants: this.getSlotVariants(name),\n })),\n sections: this.getAllSections().map((sectionType) => ({\n name: sectionType,\n variants: this.getSectionVariants(sectionType),\n })),\n definitions: this.getAllDefinitions(),\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private ensureSectionIntent(\n node: SectionNode<C>,\n intent: string,\n ): SectionIntentNode<C> {\n if (!node.byIntent) {\n node.byIntent = new Map();\n }\n let intentNode = node.byIntent.get(intent);\n if (!intentNode) {\n intentNode = {};\n node.byIntent.set(intent, intentNode);\n }\n return intentNode;\n }\n\n private ensureSlotIntent(\n node: SlotNode<C>,\n intent: string,\n ): SlotIntentNode<C> {\n if (!node.byIntent) {\n node.byIntent = new Map();\n }\n let intentNode = node.byIntent.get(intent);\n if (!intentNode) {\n intentNode = {};\n node.byIntent.set(intent, intentNode);\n }\n return intentNode;\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["normalizeResolveOptions","intentOrOptions","semantic","intent","normalizeIntentKey","trim","toUpperCase","ComponentRegistry","constructor","fallback","_defineProperty","Map","registerSlot","name","component","options","node","slots","get","set","intentNode","ensureSlotIntent","bySemantic","default","register","definition","variants","console","warn","definitions","sectionType","registration","sections","placement","placementId","forPlacementById","forPlacement","ensureSectionIntent","registerAction","handler","actions","resolveSlot","_node$byIntent","found","byIntent","_node$byIntent2","_node$bySemantic","resolveSection","resolveSectionRegistration","resolveSectionOptions","_this$resolveSectionR","undefined","_node$forPlacementByI","byId","_node$byIntent3","_node$byIntent4","_node$bySemantic2","getAllSlots","Array","from","keys","getAllSections","getKnownIntents","intents","Set","values","_node$byIntent5","forEach","_variant","key","add","_node$byIntent6","getAllDefinitions","entries","map","_ref","getDefinition","isPlacementOnly","_node$forPlacementByI2","_node$byIntent7","_node$bySemantic3","hasPlacement","size","hasNonPlacement","getSlotVariants","push","getSectionVariants","hasAction","has","executeAction","params","success","message","getRegisteredActions","getCatalog"],"sources":["../../../src/registry/ComponentRegistry.ts"],"sourcesContent":["import type { SectionDefinition } from '../component/componentDefinitions';\nimport type {\n SlotOptions,\n SectionOptions,\n SectionRegistration,\n SlotNode,\n SlotIntentNode,\n SectionNode,\n SectionIntentNode,\n SlotVariant,\n SectionVariant,\n RegistryCatalog,\n ResolveSectionOptions,\n ActionHandler,\n ActionResult,\n} from './types';\n\n/**\n * Accept the legacy positional form `(intent, semantic)` and the new\n * options-object form `({ intent, semantic, placement })`. Returns a\n * normalized `ResolveSectionOptions`.\n */\nfunction normalizeResolveOptions(\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n): ResolveSectionOptions {\n if (intentOrOptions == null) {\n return semantic ? { semantic } : {};\n }\n if (typeof intentOrOptions === 'string') {\n return semantic ? { intent: intentOrOptions, semantic } : { intent: intentOrOptions };\n }\n return intentOrOptions;\n}\n\n/**\n * Intent keys are matched case-insensitively.\n *\n * The intent that reaches resolution has already been through\n * `intent.trim().toUpperCase()` — in this package's `intentExtractor`, and\n * again in `web50-server-ui`'s own copy of it, which calls it with no\n * `validIntents` and passes the result as `providedIntent`, bypassing the\n * validated path here. A client that registers its variants in the lowercase\n * spelling its own taxonomy doc uses therefore matched nothing, and every\n * intent-scoped variant silently fell through to the section default.\n *\n * That is not hypothetical: it was true of the whole seed registry. Measured\n * across 11 live answers, 10 rendered the same hero whatever the intent, and\n * one registered hero component never rendered at all. Nothing errors, nothing\n * logs, and the page looks plausible — which is why this belongs at the Map\n * rather than in either extractor.\n *\n * Normalizing on write AND on read makes the spelling a client's own business.\n */\nconst normalizeIntentKey = (intent: string): string =>\n intent.trim().toUpperCase();\n\nexport class ComponentRegistry<C> {\n private slots = new Map<string, SlotNode<C>>();\n private sections = new Map<string, SectionNode<C>>();\n private definitions = new Map<string, SectionDefinition>();\n private actions = new Map<string, ActionHandler>();\n\n constructor(private fallback: C) {}\n\n // ---------------------------------------------------------------------------\n // Registration\n // ---------------------------------------------------------------------------\n\n registerSlot(name: string, component: C, options?: SlotOptions): this {\n let node = this.slots.get(name);\n if (!node) {\n node = {};\n this.slots.set(name, node);\n }\n\n const { intent, semantic } = options ?? {};\n\n if (intent && semantic) {\n const intentNode = this.ensureSlotIntent(node, intent);\n if (!intentNode.bySemantic) {\n intentNode.bySemantic = new Map();\n }\n intentNode.bySemantic.set(semantic, component);\n } else if (intent) {\n const intentNode = this.ensureSlotIntent(node, intent);\n intentNode.default = component;\n } else if (semantic) {\n if (!node.bySemantic) {\n node.bySemantic = new Map();\n }\n node.bySemantic.set(semantic, component);\n } else {\n node.default = component;\n }\n\n return this;\n }\n\n register(\n definition: SectionDefinition,\n variants?: SectionRegistration<C>[],\n ): this {\n // Tolerate missing definitions instead of crashing app init. This\n // happens when a client UMD references a `SectionDefinition` symbol\n // that doesn't exist on the consuming bundle's `Web5Core` global\n // (e.g. UMD built against newer `web5-core` than the app bundle).\n // Without this guard a single missing export breaks every other\n // section the client tries to register.\n if (definition == null) {\n // eslint-disable-next-line no-console\n console.warn(\n '[ComponentRegistry] register() called with a null/undefined SectionDefinition — ' +\n 'likely a version skew between the client UMD and web5-core ' +\n '(an exported definition the UMD imports does not exist on this Web5Core). Skipping.',\n );\n return this;\n }\n this.definitions.set(definition.sectionType, definition);\n\n if (variants) {\n const sectionType = definition.sectionType;\n for (const registration of variants) {\n let node = this.sections.get(sectionType);\n if (!node) {\n node = {};\n this.sections.set(sectionType, node);\n }\n const { intent, semantic, placement, placementId } =\n registration.options ?? {};\n\n // Placement variants are stored on their own slot — no further\n // intent/semantic sub-variants (DL #088 D3.1). If a developer also\n // supplies intent/semantic alongside placement, those are ignored for\n // the placement registration. To register both a placement variant AND\n // an intent variant, register them as separate entries.\n if (placement) {\n // Scoped to a specific placement slot id — keyed so one section type\n // can render differently per placement. An id-less placement variant\n // remains the generic fallback.\n if (placementId) {\n if (!node.forPlacementById) {\n node.forPlacementById = new Map();\n }\n node.forPlacementById.set(placementId, registration);\n } else {\n node.forPlacement = registration;\n }\n continue;\n }\n\n if (intent && semantic) {\n const intentNode = this.ensureSectionIntent(node, intent);\n if (!intentNode.bySemantic) {\n intentNode.bySemantic = new Map();\n }\n intentNode.bySemantic.set(semantic, registration);\n } else if (intent) {\n const intentNode = this.ensureSectionIntent(node, intent);\n intentNode.default = registration;\n } else if (semantic) {\n if (!node.bySemantic) {\n node.bySemantic = new Map();\n }\n node.bySemantic.set(semantic, registration);\n } else {\n node.default = registration;\n }\n }\n }\n\n return this;\n }\n\n registerAction(name: string, handler: ActionHandler): this {\n this.actions.set(name, handler);\n return this;\n }\n\n // ---------------------------------------------------------------------------\n // Resolution\n // ---------------------------------------------------------------------------\n\n resolveSlot(name: string, intent?: string, semantic?: string): C {\n const node = this.slots.get(name);\n if (!node) {\n return this.fallback;\n }\n\n if (intent && semantic) {\n const found = node.byIntent\n ?.get(normalizeIntentKey(intent))\n ?.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n if (intent) {\n const found = node.byIntent?.get(normalizeIntentKey(intent))?.default;\n if (found) {\n return found;\n }\n }\n if (semantic) {\n const found = node.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n\n return node.default ?? this.fallback;\n }\n\n /**\n * Resolve a section component by type, optionally narrowed by intent /\n * semantic / placement.\n *\n * Accepts both call forms for backward compatibility:\n * resolveSection('hero') — default\n * resolveSection('hero', 'DISCOVERY') — intent (legacy positional)\n * resolveSection('hero', 'DISCOVERY', 'compact') — intent + semantic (legacy)\n * resolveSection('hero', { intent: 'DISCOVERY' }) — options object\n * resolveSection('hero', { placement: true }) — placement variant (DL #088 D3.1)\n * resolveSection('hero', { intent: 'X', placement: true }) — placement wins\n */\n resolveSection(sectionType: string, intent?: string, semantic?: string): C;\n resolveSection(sectionType: string, options: ResolveSectionOptions): C;\n resolveSection(\n sectionType: string,\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n ): C {\n const registration = this.resolveSectionRegistration(\n sectionType,\n normalizeResolveOptions(intentOrOptions, semantic),\n );\n return registration?.component ?? this.fallback;\n }\n\n /**\n * Resolve the options bundle associated with the matched registration.\n * Same overload semantics as `resolveSection`.\n */\n resolveSectionOptions(\n sectionType: string,\n intent?: string,\n semantic?: string,\n ): SectionOptions | undefined;\n resolveSectionOptions(\n sectionType: string,\n options: ResolveSectionOptions,\n ): SectionOptions | undefined;\n resolveSectionOptions(\n sectionType: string,\n intentOrOptions?: string | ResolveSectionOptions,\n semantic?: string,\n ): SectionOptions | undefined {\n return this.resolveSectionRegistration(\n sectionType,\n normalizeResolveOptions(intentOrOptions, semantic),\n )?.options;\n }\n\n private resolveSectionRegistration(\n sectionType: string,\n options: ResolveSectionOptions,\n ): SectionRegistration<C> | undefined {\n const node = this.sections.get(sectionType);\n if (!node) {\n return undefined;\n }\n\n const { intent, semantic, placement, placementId } = options;\n\n // Placement wins over intent / semantic when requested AND a placement\n // variant is registered for this section (DL #088 D3.1). Cascade:\n // id-scoped variant → generic placement variant → regular chain.\n if (placement) {\n if (placementId) {\n const byId = node.forPlacementById?.get(placementId);\n if (byId) {\n return byId;\n }\n }\n if (node.forPlacement) {\n return node.forPlacement;\n }\n }\n\n if (intent && semantic) {\n const found = node.byIntent\n ?.get(normalizeIntentKey(intent as string))\n ?.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n if (intent) {\n const found = node.byIntent?.get(normalizeIntentKey(intent as string))\n ?.default;\n if (found) {\n return found;\n }\n }\n if (semantic) {\n const found = node.bySemantic?.get(semantic);\n if (found) {\n return found;\n }\n }\n\n return node.default;\n }\n\n // ---------------------------------------------------------------------------\n // Introspection\n // ---------------------------------------------------------------------------\n\n getAllSlots(): string[] {\n return Array.from(this.slots.keys());\n }\n\n getAllSections(): string[] {\n return Array.from(this.sections.keys());\n }\n\n /**\n * Every intent that has at least one registered slot or section variant —\n * i.e. the client's own intent list, derived from what it actually\n * registered. Assembly uses this to validate an incoming intent before it\n * becomes a resolution key, falling back to core's `DEFAULT_INTENTS` only\n * when a client registers no intent variants at all.\n *\n * Returned NORMALIZED (upper case), whatever spelling the client registered,\n * because these are the map keys. Both consumers compare case-insensitively,\n * so the only visible difference is in a debug view.\n */\n getKnownIntents(): string[] {\n const intents = new Set<string>();\n for (const node of this.slots.values()) {\n node.byIntent?.forEach((_variant, key) => intents.add(key));\n }\n for (const node of this.sections.values()) {\n node.byIntent?.forEach((_variant, key) => intents.add(key));\n }\n return Array.from(intents);\n }\n\n getAllDefinitions(): {\n sectionType: string;\n definition: SectionDefinition;\n }[] {\n return Array.from(this.definitions.entries()).map(\n ([sectionType, definition]) => ({\n sectionType,\n definition,\n }),\n );\n }\n\n getDefinition(sectionType: string): SectionDefinition | undefined {\n return this.definitions.get(sectionType);\n }\n\n /**\n * True when a section type was registered with placement variant(s) only —\n * a `{ placement: true }` (or `placementId`) registration and NO\n * non-placement variant (default / intent / semantic). Such a section is\n * meaningful only inside a placement render; the parser skips its definition\n * when matching in a non-placement context (the main app), so its markdown\n * falls through to the generic sections there.\n *\n * A definition registered with no variants at all (structural defs like\n * `skipNodes` / `htmlComment`) is NOT placement-only — it still matches\n * everywhere.\n */\n isPlacementOnly(sectionType: string): boolean {\n const node = this.sections.get(sectionType);\n if (!node) {\n return false;\n }\n const hasPlacement =\n node.forPlacement != null || (node.forPlacementById?.size ?? 0) > 0;\n const hasNonPlacement =\n node.default != null ||\n (node.byIntent?.size ?? 0) > 0 ||\n (node.bySemantic?.size ?? 0) > 0;\n return hasPlacement && !hasNonPlacement;\n }\n\n getSlotVariants(name: string): SlotVariant[] {\n const node = this.slots.get(name);\n if (!node) {\n return [];\n }\n\n const variants: SlotVariant[] = [];\n if (node.default) {\n variants.push({});\n }\n\n if (node.bySemantic) {\n for (const semantic of node.bySemantic.keys()) {\n variants.push({ semantic });\n }\n }\n\n if (node.byIntent) {\n for (const [intent, intentNode] of node.byIntent) {\n if (intentNode.default) {\n variants.push({ intent });\n }\n if (intentNode.bySemantic) {\n for (const semantic of intentNode.bySemantic.keys()) {\n variants.push({ intent, semantic });\n }\n }\n }\n }\n\n return variants;\n }\n\n getSectionVariants(sectionType: string): SectionVariant[] {\n const node = this.sections.get(sectionType);\n if (!node) {\n return [];\n }\n\n const variants: SectionVariant[] = [];\n if (node.default) {\n variants.push({});\n }\n\n if (node.bySemantic) {\n for (const semantic of node.bySemantic.keys()) {\n variants.push({ semantic });\n }\n }\n\n if (node.byIntent) {\n for (const [intent, intentNode] of node.byIntent) {\n if (intentNode.default) {\n variants.push({ intent });\n }\n if (intentNode.bySemantic) {\n for (const semantic of intentNode.bySemantic.keys()) {\n variants.push({ intent, semantic });\n }\n }\n }\n }\n\n if (node.forPlacement) {\n variants.push({ placement: true });\n }\n\n if (node.forPlacementById) {\n for (const placementId of node.forPlacementById.keys()) {\n variants.push({ placement: true, placementId });\n }\n }\n\n return variants;\n }\n\n hasAction(name: string): boolean {\n return this.actions.has(name);\n }\n\n async executeAction(\n name: string,\n params: Record<string, string>,\n ): Promise<ActionResult> {\n const handler = this.actions.get(name);\n if (!handler) {\n console.warn(`[Action] No handler for: \"${name}\"`);\n return { success: false, message: `Unknown action: ${name}` };\n }\n return handler(params);\n }\n\n getRegisteredActions(): string[] {\n return Array.from(this.actions.keys());\n }\n\n getCatalog(): RegistryCatalog {\n return {\n slots: this.getAllSlots().map((name) => ({\n name,\n variants: this.getSlotVariants(name),\n })),\n sections: this.getAllSections().map((sectionType) => ({\n name: sectionType,\n variants: this.getSectionVariants(sectionType),\n })),\n definitions: this.getAllDefinitions(),\n };\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private ensureSectionIntent(\n node: SectionNode<C>,\n intent: string,\n ): SectionIntentNode<C> {\n if (!node.byIntent) {\n node.byIntent = new Map();\n }\n const key = normalizeIntentKey(intent);\n let intentNode = node.byIntent.get(key);\n if (!intentNode) {\n intentNode = {};\n node.byIntent.set(key, intentNode);\n }\n return intentNode;\n }\n\n private ensureSlotIntent(\n node: SlotNode<C>,\n intent: string,\n ): SlotIntentNode<C> {\n if (!node.byIntent) {\n node.byIntent = new Map();\n }\n const key = normalizeIntentKey(intent);\n let intentNode = node.byIntent.get(key);\n if (!intentNode) {\n intentNode = {};\n node.byIntent.set(key, intentNode);\n }\n return intentNode;\n }\n}\n"],"mappings":"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","ignoreList":[]}
@@ -40,6 +40,10 @@ export declare class ComponentRegistry<C> {
40
40
  * registered. Assembly uses this to validate an incoming intent before it
41
41
  * becomes a resolution key, falling back to core's `DEFAULT_INTENTS` only
42
42
  * when a client registers no intent variants at all.
43
+ *
44
+ * Returned NORMALIZED (upper case), whatever spelling the client registered,
45
+ * because these are the map keys. Both consumers compare case-insensitively,
46
+ * so the only visible difference is in a debug view.
43
47
  */
44
48
  getKnownIntents(): string[];
45
49
  getAllDefinitions(): {
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentRegistry.d.ts","sourceRoot":"","sources":["../../../src/registry/ComponentRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,mBAAmB,EAKnB,WAAW,EACX,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,YAAY,EACb,MAAM,SAAS,CAAC;AAoBjB,qBAAa,iBAAiB,CAAC,CAAC;IAMlB,OAAO,CAAC,QAAQ;IAL5B,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,OAAO,CAAoC;gBAE/B,QAAQ,EAAE,CAAC;IAM/B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;IA8BrE,QAAQ,CACN,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,GAClC,IAAI;IAwEP,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAS1D,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC;IA4BhE;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC;IAC1E,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,CAAC;IAatE;;;OAGG;IACH,qBAAqB,CACnB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc,GAAG,SAAS;IAC7B,qBAAqB,CACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,qBAAqB,GAC7B,cAAc,GAAG,SAAS;IAY7B,OAAO,CAAC,0BAA0B;IAoDlC,WAAW,IAAI,MAAM,EAAE;IAIvB,cAAc,IAAI,MAAM,EAAE;IAI1B;;;;;;OAMG;IACH,eAAe,IAAI,MAAM,EAAE;IAW3B,iBAAiB,IAAI;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,iBAAiB,CAAC;KAC/B,EAAE;IASH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIjE;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAc7C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE;IAiC5C,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE;IA2CzD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,YAAY,CAAC;IASxB,oBAAoB,IAAI,MAAM,EAAE;IAIhC,UAAU,IAAI,eAAe;IAkB7B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,gBAAgB;CAczB"}
1
+ {"version":3,"file":"ComponentRegistry.d.ts","sourceRoot":"","sources":["../../../src/registry/ComponentRegistry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,KAAK,EACV,WAAW,EACX,cAAc,EACd,mBAAmB,EAKnB,WAAW,EACX,cAAc,EACd,eAAe,EACf,qBAAqB,EACrB,aAAa,EACb,YAAY,EACb,MAAM,SAAS,CAAC;AA0CjB,qBAAa,iBAAiB,CAAC,CAAC;IAMlB,OAAO,CAAC,QAAQ;IAL5B,OAAO,CAAC,KAAK,CAAkC;IAC/C,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,OAAO,CAAoC;gBAE/B,QAAQ,EAAE,CAAC;IAM/B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;IA8BrE,QAAQ,CACN,UAAU,EAAE,iBAAiB,EAC7B,QAAQ,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAC,EAAE,GAClC,IAAI;IAwEP,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,GAAG,IAAI;IAS1D,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC;IA8BhE;;;;;;;;;;;OAWG;IACH,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,CAAC;IAC1E,cAAc,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,qBAAqB,GAAG,CAAC;IAatE;;;OAGG;IACH,qBAAqB,CACnB,WAAW,EAAE,MAAM,EACnB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,CAAC,EAAE,MAAM,GAChB,cAAc,GAAG,SAAS;IAC7B,qBAAqB,CACnB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,qBAAqB,GAC7B,cAAc,GAAG,SAAS;IAY7B,OAAO,CAAC,0BAA0B;IAuDlC,WAAW,IAAI,MAAM,EAAE;IAIvB,cAAc,IAAI,MAAM,EAAE;IAI1B;;;;;;;;;;OAUG;IACH,eAAe,IAAI,MAAM,EAAE;IAW3B,iBAAiB,IAAI;QACnB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,iBAAiB,CAAC;KAC/B,EAAE;IASH,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIjE;;;;;;;;;;;OAWG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;IAc7C,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE;IAiC5C,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,EAAE;IA2CzD,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,aAAa,CACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAC7B,OAAO,CAAC,YAAY,CAAC;IASxB,oBAAoB,IAAI,MAAM,EAAE;IAIhC,UAAU,IAAI,eAAe;IAkB7B,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,gBAAgB;CAezB"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@wix/web5-core",
3
3
  "license": "MIT",
4
- "version": "1.63.23",
4
+ "version": "1.63.24",
5
5
  "author": {
6
6
  "name": "tsachis",
7
7
  "email": "tsachis@wix.com"
@@ -100,5 +100,5 @@
100
100
  "wallaby": {
101
101
  "autoDetect": true
102
102
  },
103
- "falconPackageHash": "9cf0d77d9d3d6c55654ab488de4f708332efc9e24712eeaa1c4b3d32"
103
+ "falconPackageHash": "cf2a34e70436a1a11df28a8c6e7d92b7ab726480ed923f8d756fd9b3"
104
104
  }