@open-mercato/cli 0.8.1-develop.7207.1.901ef7e47a → 0.8.1-develop.7215.1.60786cf836

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 (84) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/dist/agentic/guides/module-facts.json +140 -140
  3. package/dist/agentic/guides/module-facts.v2.json +140 -140
  4. package/dist/agentic/guides/modules/agent_orchestrator/index.md +1 -1
  5. package/dist/agentic/guides/modules/ai_assistant/index.md +1 -1
  6. package/dist/agentic/guides/modules/api_docs/index.md +1 -1
  7. package/dist/agentic/guides/modules/api_keys/index.md +1 -1
  8. package/dist/agentic/guides/modules/attachments/index.md +1 -1
  9. package/dist/agentic/guides/modules/audit_logs/index.md +1 -1
  10. package/dist/agentic/guides/modules/auth/index.md +1 -1
  11. package/dist/agentic/guides/modules/business_rules/index.md +1 -1
  12. package/dist/agentic/guides/modules/catalog/index.md +1 -1
  13. package/dist/agentic/guides/modules/channel_apns/index.md +1 -1
  14. package/dist/agentic/guides/modules/channel_discord/index.md +1 -1
  15. package/dist/agentic/guides/modules/channel_expo/index.md +1 -1
  16. package/dist/agentic/guides/modules/channel_fcm/index.md +1 -1
  17. package/dist/agentic/guides/modules/channel_gmail/index.md +1 -1
  18. package/dist/agentic/guides/modules/channel_imap/index.md +1 -1
  19. package/dist/agentic/guides/modules/channel_resend/index.md +1 -1
  20. package/dist/agentic/guides/modules/channel_ses/index.md +1 -1
  21. package/dist/agentic/guides/modules/checkout/index.md +1 -1
  22. package/dist/agentic/guides/modules/communication_channels/index.md +1 -1
  23. package/dist/agentic/guides/modules/configs/index.md +1 -1
  24. package/dist/agentic/guides/modules/content/index.md +1 -1
  25. package/dist/agentic/guides/modules/currencies/index.md +1 -1
  26. package/dist/agentic/guides/modules/customer_accounts/index.md +1 -1
  27. package/dist/agentic/guides/modules/customers/index.md +1 -1
  28. package/dist/agentic/guides/modules/dashboards/index.md +1 -1
  29. package/dist/agentic/guides/modules/data_sync/index.md +1 -1
  30. package/dist/agentic/guides/modules/design_system/index.md +1 -1
  31. package/dist/agentic/guides/modules/devices/index.md +1 -1
  32. package/dist/agentic/guides/modules/dictionaries/index.md +1 -1
  33. package/dist/agentic/guides/modules/directory/index.md +1 -1
  34. package/dist/agentic/guides/modules/documents/index.md +1 -1
  35. package/dist/agentic/guides/modules/entities/index.md +1 -1
  36. package/dist/agentic/guides/modules/eudr/index.md +1 -1
  37. package/dist/agentic/guides/modules/events/index.md +1 -1
  38. package/dist/agentic/guides/modules/feature_toggles/index.md +1 -1
  39. package/dist/agentic/guides/modules/gateway_stripe/index.md +1 -1
  40. package/dist/agentic/guides/modules/generators/index.md +1 -1
  41. package/dist/agentic/guides/modules/inbox_ops/index.md +1 -1
  42. package/dist/agentic/guides/modules/integrations/index.md +1 -1
  43. package/dist/agentic/guides/modules/messages/index.md +1 -1
  44. package/dist/agentic/guides/modules/notifications/index.md +1 -1
  45. package/dist/agentic/guides/modules/onboarding/index.md +1 -1
  46. package/dist/agentic/guides/modules/payment_gateways/index.md +1 -1
  47. package/dist/agentic/guides/modules/perspectives/index.md +1 -1
  48. package/dist/agentic/guides/modules/phone_calls/index.md +1 -1
  49. package/dist/agentic/guides/modules/planner/index.md +1 -1
  50. package/dist/agentic/guides/modules/portal/index.md +1 -1
  51. package/dist/agentic/guides/modules/progress/index.md +1 -1
  52. package/dist/agentic/guides/modules/push_notifications/index.md +1 -1
  53. package/dist/agentic/guides/modules/query_index/index.md +1 -1
  54. package/dist/agentic/guides/modules/record_locks/index.md +1 -1
  55. package/dist/agentic/guides/modules/resources/index.md +1 -1
  56. package/dist/agentic/guides/modules/sales/index.md +1 -1
  57. package/dist/agentic/guides/modules/scheduler/index.md +1 -1
  58. package/dist/agentic/guides/modules/search/index.md +1 -1
  59. package/dist/agentic/guides/modules/security/index.md +1 -1
  60. package/dist/agentic/guides/modules/seeds/index.md +1 -1
  61. package/dist/agentic/guides/modules/shipping_carriers/index.md +1 -1
  62. package/dist/agentic/guides/modules/sso/index.md +1 -1
  63. package/dist/agentic/guides/modules/staff/index.md +1 -1
  64. package/dist/agentic/guides/modules/storage_s3/index.md +1 -1
  65. package/dist/agentic/guides/modules/sync_akeneo/index.md +1 -1
  66. package/dist/agentic/guides/modules/sync_excel/index.md +1 -1
  67. package/dist/agentic/guides/modules/system_status_overlays/index.md +1 -1
  68. package/dist/agentic/guides/modules/tillio/index.md +1 -1
  69. package/dist/agentic/guides/modules/translations/index.md +1 -1
  70. package/dist/agentic/guides/modules/warranty_claims/index.md +1 -1
  71. package/dist/agentic/guides/modules/webhooks/index.md +1 -1
  72. package/dist/agentic/guides/modules/wms/index.md +1 -1
  73. package/dist/agentic/guides/modules/workflows/index.md +1 -1
  74. package/dist/agentic/guides/reference-module-facts.json +1 -1
  75. package/dist/agentic/guides/upstream/manifest.json +1 -1
  76. package/dist/lib/generators/module-extension-facts.js +11 -2
  77. package/dist/lib/generators/module-extension-facts.js.map +2 -2
  78. package/dist/mercato.js +1 -1
  79. package/dist/mercato.js.map +2 -2
  80. package/package.json +6 -6
  81. package/src/__tests__/mercato.test.ts +79 -0
  82. package/src/lib/generators/__tests__/module-extension-facts.test.ts +35 -0
  83. package/src/lib/generators/module-extension-facts.ts +18 -2
  84. package/src/mercato.ts +1 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/lib/generators/module-extension-facts.ts"],
4
- "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport ts from 'typescript-js'\nimport {\n CRUD_FORM_EXTENSION_SURFACES,\n CRUD_FORM_LIFECYCLE_PHASES,\n DATA_TABLE_EXTENSION_SURFACES,\n} from '@open-mercato/shared/modules/widgets/extension-points'\nimport type {\n ExtensionHostCapability,\n ExtensionHostFamily,\n ModuleContributionResolution,\n ModuleExtensionActivation,\n ModuleExtensionActivationKind,\n ModuleExtensionContributionFact,\n ModuleExtensionContributionBase,\n ModuleExtensionContributionKind,\n ModuleExtensionHostFact,\n ModuleExtensionResolution,\n ModuleExtensionSurfaceFacts,\n ModuleExtensionTargetFact,\n ModuleExtensionTargetRef,\n ModuleExtensionUnresolvedFact,\n ModuleFactSourceRef,\n ModuleIncomingExtensionRef,\n} from '@open-mercato/shared/modules/widgets/extension-points'\nimport { extractCommandIdsFromSource } from './module-registry'\nimport { scanModuleDir, SCAN_CONFIGS } from './scanner'\n\ntype StaticScalar = string | number | boolean | null\ntype StaticValue = StaticScalar | StaticValue[] | { [key: string]: StaticValue }\ntype StaticObject = { [key: string]: StaticValue }\ntype SpecializedRegistry = Extract<ModuleExtensionContributionFact, {\n kind: 'specialized-registry'\n}>['details']['registry']\n\nexport interface ExtensionFactEntityRef {\n id: string\n}\n\nexport interface ExtensionFactEventRef {\n id: string\n clientBroadcast?: boolean\n portalBroadcast?: boolean\n}\n\nexport interface ExtensionFactApiRouteRef {\n path: string\n methods: string[]\n}\n\nexport interface ExtractModuleExtensionFactsOptions {\n moduleId: string\n moduleRoot: string\n sourceRoot: string\n entities: readonly ExtensionFactEntityRef[]\n events: readonly ExtensionFactEventRef[]\n apiRoutes: readonly ExtensionFactApiRouteRef[]\n searchEntities: readonly string[]\n notifications?: readonly string[]\n aiTools?: ReadonlyArray<{ name: string; sourcePath: string }>\n aiAgents?: ReadonlyArray<{ id: string; sourcePath: string }>\n /** Generated-facts compatibility projection. Omitted means the corrected v2 contract. */\n factsContractVersion?: 1 | 2\n}\n\nexport interface CorrelateExtensionFactsOptions {\n surfacesByModule: Readonly<Record<string, ModuleExtensionSurfaceFacts>>\n entityIds: ReadonlySet<string>\n eventIds: ReadonlySet<string>\n apiRoutes: ReadonlySet<string>\n commandIds?: ReadonlySet<string>\n contributingModuleId?: string\n /** Generated-facts compatibility projection. Omitted means the corrected v2 contract. */\n factsContractVersion?: 1 | 2\n}\n\ntype StaticContext = {\n initializers: Map<string, ts.Expression | ts.FunctionDeclaration>\n sourceFile: ts.SourceFile\n resolving: Set<string>\n factsContractVersion: 1 | 2\n}\n\ntype ApiExtensionHostIds = {\n entityIds: string[]\n /** Declaring `api/**` file per entity host id, so the host links to a real source. */\n entitySourceFiles: Record<string, string>\n commandIds: string[]\n routeIds: string[]\n}\n\ntype ModuleExtensionFactExtractionCache = {\n sourceFiles: Map<string, ts.SourceFile | null>\n sourceFilesBelow: Map<string, string[]>\n apiExtensionHostIds: Map<string, ApiExtensionHostIds>\n}\n\nlet activeExtractionCache: ModuleExtensionFactExtractionCache | null = null\n\n/** @internal */\nexport function withModuleExtensionFactExtractionCache<Result>(operation: () => Result): Result {\n if (activeExtractionCache) return operation()\n activeExtractionCache = {\n sourceFiles: new Map(),\n sourceFilesBelow: new Map(),\n apiExtensionHostIds: new Map(),\n }\n try {\n return operation()\n } finally {\n activeExtractionCache = null\n }\n}\n\nconst FRAMEWORK_PREFIXES = [\n 'dashboard:',\n 'menu:',\n 'notification:',\n 'integration:',\n 'integrations.detail:',\n 'system-status:',\n 'topbar:',\n]\n\nconst FRAMEWORK_HOSTS: ModuleExtensionHostFact[] = [\n frameworkHost('framework.backend.sidebar', 'menu:backend.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.settings.sidebar', 'menu:settings.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.profile.sidebar', 'menu:profile.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.portal.sidebar', 'menu:portal.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.dashboard', 'dashboard:*', 'dashboard', ['registry-contribution']),\n frameworkHost('framework.notifications', 'notification:*', 'notification', ['registry-contribution']),\n frameworkHost('framework.integration-detail', 'integrations.detail:{integrationId}', 'integration', ['render-widget']),\n frameworkHost('framework.integration-detail-fallback', 'integrations.detail:tabs', 'integration', ['render-widget']),\n frameworkHost('framework.backend-mutation', 'backend-mutation:global', 'generic', ['headless-widget']),\n frameworkHost('framework.crud-form-wildcard', 'crud-form:*', 'crud-form', ['field-widget', 'lifecycle-handler']),\n]\n\nfunction frameworkHost(\n key: string,\n id: string,\n family: ExtensionHostFamily,\n capabilities: ExtensionHostCapability[],\n): ModuleExtensionHostFact {\n return {\n key,\n id,\n resolution: id.includes('*') || id.includes('{') ? 'pattern' : 'framework',\n family,\n ownerModule: 'framework',\n capabilities,\n bound: true,\n stability: 'frozen',\n source: { kind: 'framework', path: 'packages/ui/src', symbol: key },\n }\n}\n\nfunction frameworkOverrideHost(\n key: string,\n mode: 'disable-replace' | 'replace' | 'additive',\n): ModuleExtensionHostFact {\n return {\n key: `framework.module-override.${key}`,\n id: `module-override:${key}`,\n resolution: 'framework',\n family: 'module-override',\n ownerModule: 'framework',\n capabilities: ['module-override'],\n operations: [mode],\n bound: true,\n stability: 'stable',\n source: {\n kind: 'framework',\n path: 'packages/shared/src/modules/overrides.ts',\n symbol: `ModuleOverrides.${key}`,\n },\n }\n}\n\nconst FRAMEWORK_OVERRIDE_HOSTS = [\n frameworkOverrideHost('ai.agents', 'disable-replace'),\n frameworkOverrideHost('ai.tools', 'disable-replace'),\n frameworkOverrideHost('ai.extensions', 'additive'),\n frameworkOverrideHost('routes.api', 'disable-replace'),\n frameworkOverrideHost('routes.pages', 'disable-replace'),\n frameworkOverrideHost('events.subscribers', 'disable-replace'),\n frameworkOverrideHost('workers', 'disable-replace'),\n frameworkOverrideHost('widgets.injection', 'disable-replace'),\n frameworkOverrideHost('widgets.components', 'disable-replace'),\n frameworkOverrideHost('widgets.dashboard', 'disable-replace'),\n frameworkOverrideHost('notifications.types', 'disable-replace'),\n frameworkOverrideHost('notifications.handlers', 'disable-replace'),\n frameworkOverrideHost('interceptors', 'disable-replace'),\n frameworkOverrideHost('commandInterceptors', 'disable-replace'),\n frameworkOverrideHost('enrichers', 'disable-replace'),\n frameworkOverrideHost('guards', 'disable-replace'),\n frameworkOverrideHost('cli', 'disable-replace'),\n frameworkOverrideHost('setup', 'replace'),\n frameworkOverrideHost('acl.features', 'disable-replace'),\n frameworkOverrideHost('di', 'disable-replace'),\n frameworkOverrideHost('encryption.maps', 'disable-replace'),\n frameworkOverrideHost('nav.groupOrder', 'additive'),\n] as const\n\nfunction allFrameworkHosts(): ModuleExtensionHostFact[] {\n return [...FRAMEWORK_HOSTS, ...FRAMEWORK_OVERRIDE_HOSTS]\n}\n\nfunction sourceFile(filePath: string): ts.SourceFile | null {\n const cached = activeExtractionCache?.sourceFiles.get(filePath)\n if (cached !== undefined) return cached\n if (!fs.existsSync(filePath)) return null\n const scriptKind = filePath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n const parsed = ts.createSourceFile(filePath, fs.readFileSync(filePath, 'utf8'), ts.ScriptTarget.ES2020, true, scriptKind)\n activeExtractionCache?.sourceFiles.set(filePath, parsed)\n return parsed\n}\n\nfunction unwrap(expression: ts.Expression): ts.Expression {\n let current = expression\n while (\n ts.isAsExpression(current)\n || ts.isTypeAssertionExpression(current)\n || ts.isParenthesizedExpression(current)\n || ts.isSatisfiesExpression(current)\n ) {\n current = current.expression\n }\n return current\n}\n\nfunction propertyName(node: ts.PropertyName): string | null {\n if (ts.isIdentifier(node) || ts.isStringLiteralLike(node) || ts.isNumericLiteral(node)) return node.text\n return null\n}\n\nfunction buildStaticContext(file: ts.SourceFile, factsContractVersion: 1 | 2 = 2): StaticContext {\n const initializers = new Map<string, ts.Expression | ts.FunctionDeclaration>()\n const visit = (node: ts.Node): void => {\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer) {\n initializers.set(node.name.text, node.initializer)\n }\n if (ts.isFunctionDeclaration(node) && node.name && node.body) {\n initializers.set(node.name.text, node)\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n return { initializers, sourceFile: file, resolving: new Set(), factsContractVersion }\n}\n\nfunction entityRegistryValue(expression: ts.PropertyAccessExpression): string | null {\n const parts: string[] = []\n let current: ts.Expression = expression\n while (ts.isPropertyAccessExpression(current)) {\n parts.unshift(current.name.text)\n current = current.expression\n }\n return ts.isIdentifier(current) && current.text === 'E' && parts.length === 2\n ? `${parts[0]}:${parts[1]}`\n : null\n}\n\nfunction staticTemplate(expression: ts.TemplateExpression, context: StaticContext): string | null {\n let value = expression.head.text\n for (const span of expression.templateSpans) {\n const substitution = staticValue(span.expression, context)\n if (typeof substitution !== 'string' && typeof substitution !== 'number') return null\n value += `${substitution}${span.literal.text}`\n }\n return value\n}\n\n/**\n * A function-valued property carries no statically readable value, but its\n * PRESENCE is the discriminant several conventions are keyed on (a\n * `ComponentOverride` is a wrapper/props-transform/replacement depending on\n * which callable it declares; an enricher declares `enrichOne`/`enrichMany`).\n * Method shorthand (`enrichOne() {}`) is already recorded as `true`, so an\n * arrow/function-expression property \u2014 or an identifier bound to one \u2014 records\n * the same marker instead of vanishing from the object.\n */\nfunction isFunctionLikeInitializer(expression: ts.Expression, context: StaticContext): boolean {\n const current = unwrap(expression)\n if (ts.isArrowFunction(current) || ts.isFunctionExpression(current)) return true\n if (!ts.isIdentifier(current)) return false\n const initializer = context.initializers.get(current.text)\n if (!initializer) return false\n if (ts.isFunctionDeclaration(initializer)) return true\n const resolved = unwrap(initializer)\n return ts.isArrowFunction(resolved) || ts.isFunctionExpression(resolved)\n}\n\nfunction staticObject(expression: ts.ObjectLiteralExpression, context: StaticContext): StaticObject {\n const result: StaticObject = {}\n for (const property of expression.properties) {\n if (ts.isPropertyAssignment(property)) {\n const name = propertyName(property.name)\n if (!name) continue\n const value = staticValue(property.initializer, context)\n if (value !== undefined) result[name] = value\n else if (context.factsContractVersion === 2 && isFunctionLikeInitializer(property.initializer, context)) result[name] = true\n continue\n }\n if (ts.isShorthandPropertyAssignment(property)) {\n const value = staticValue(property.name, context)\n if (value !== undefined) result[property.name.text] = value\n continue\n }\n if (ts.isMethodDeclaration(property)) {\n const name = propertyName(property.name)\n if (name) result[name] = true\n continue\n }\n if (ts.isSpreadAssignment(property)) {\n const value = staticValue(property.expression, context)\n if (isStaticObject(value)) Object.assign(result, value)\n }\n }\n return result\n}\n\nfunction staticValue(expression: ts.Expression, context: StaticContext): StaticValue | undefined {\n const current = unwrap(expression)\n if (ts.isStringLiteralLike(current) || ts.isNumericLiteral(current)) return current.text\n if (current.kind === ts.SyntaxKind.TrueKeyword) return true\n if (current.kind === ts.SyntaxKind.FalseKeyword) return false\n if (current.kind === ts.SyntaxKind.NullKeyword) return null\n if (ts.isNoSubstitutionTemplateLiteral(current)) return current.text\n if (ts.isTemplateExpression(current)) return staticTemplate(current, context) ?? undefined\n if (ts.isArrayLiteralExpression(current)) {\n return current.elements.flatMap((element) => {\n if (ts.isSpreadElement(element)) {\n const spread = staticValue(element.expression, context)\n return Array.isArray(spread) ? spread : []\n }\n const value = staticValue(element, context)\n return value === undefined ? [] : [value]\n })\n }\n if (ts.isObjectLiteralExpression(current)) return staticObject(current, context)\n if (ts.isPropertyAccessExpression(current)) {\n return entityRegistryValue(current) ?? undefined\n }\n if (ts.isIdentifier(current)) {\n if (context.resolving.has(current.text)) return undefined\n const initializer = context.initializers.get(current.text)\n if (!initializer) return undefined\n context.resolving.add(current.text)\n const value = ts.isFunctionDeclaration(initializer) ? undefined : staticValue(initializer, context)\n context.resolving.delete(current.text)\n return value\n }\n if (ts.isCallExpression(current)) {\n const handle = componentReplacementHandle(current, context)\n if (handle) {\n if (context.factsContractVersion === 2) return handle.resolved\n const firstArgument = current.arguments[0]\n return firstArgument ? staticValue(firstArgument, context) : undefined\n }\n if (ts.isIdentifier(current.expression)) {\n const callable = context.initializers.get(current.expression.text)\n if (callable && (ts.isArrowFunction(callable) || ts.isFunctionExpression(callable) || ts.isFunctionDeclaration(callable))) {\n const initializers = new Map(context.initializers)\n callable.parameters.forEach((parameter, index) => {\n if (ts.isIdentifier(parameter.name) && current.arguments[index]) {\n initializers.set(parameter.name.text, current.arguments[index])\n }\n })\n const childContext: StaticContext = {\n initializers,\n sourceFile: context.sourceFile,\n resolving: new Set(context.resolving),\n factsContractVersion: context.factsContractVersion,\n }\n if (callable.body && ts.isExpression(callable.body)) return staticValue(callable.body, childContext)\n const returnStatement = callable.body?.statements.find(ts.isReturnStatement)\n if (returnStatement?.expression) return staticValue(returnStatement.expression, childContext)\n }\n }\n // Factory-style `defineThing({ \u2026 })` calls forward their configuration object,\n // but a member call (`Handles.section('a', 'b')`) computes a value from its\n // arguments \u2014 forwarding the first one there invents a wrong id, so it stays\n // unresolved unless a formula above knows the builder.\n const firstArgument = current.arguments[0]\n if (firstArgument && (context.factsContractVersion === 1 || ts.isIdentifier(current.expression))) {\n const value = staticValue(firstArgument, context)\n if (!isStaticObject(value) || !ts.isIdentifier(current.expression)) return value\n if (current.expression.text === 'dataTableExtensionHost') return { family: 'data-table', ...value }\n if (current.expression.text === 'crudFormExtensionHost') return { family: 'crud-form', ...value }\n if (current.expression.text === 'componentExtensionHost') return { family: 'component-handle', ...value }\n return value\n }\n }\n if (ts.isConditionalExpression(current)) {\n const left = staticValue(current.whenTrue, context)\n const right = staticValue(current.whenFalse, context)\n return left !== undefined && JSON.stringify(left) === JSON.stringify(right) ? left : undefined\n }\n return undefined\n}\n\n/**\n * `ComponentReplacementHandles` (packages/shared/src/modules/widgets/component-registry.ts)\n * is the framework-owned builder every `widgets/components.ts` uses to name a\n * replacement handle. Without these formulas the generic call fallback would read\n * `ComponentReplacementHandles.section('ui.detail', 'NotesSection')` as its first\n * argument and publish `ui.detail` as the handle \u2014 a target id that exists nowhere.\n */\nconst COMPONENT_REPLACEMENT_HANDLE_BUILDERS: Record<string, (args: Array<string | undefined>) => string | undefined> = {\n page: ([routePath]) => routePath ? `page:${routePath}` : undefined,\n dataTable: ([tableId]) => tableId ? `data-table:${tableId}` : undefined,\n crudForm: ([entityId]) => entityId ? `crud-form:${entityId}` : undefined,\n section: ([scope, sectionId]) => scope && sectionId ? `section:${scope}.${sectionId}` : undefined,\n}\n\nfunction componentReplacementHandle(\n expression: ts.CallExpression,\n context: StaticContext,\n): { resolved: string | undefined } | null {\n if (!ts.isPropertyAccessExpression(expression.expression)) return null\n const callee = expression.expression\n if (!ts.isIdentifier(callee.expression) || callee.expression.text !== 'ComponentReplacementHandles') return null\n const builder = COMPONENT_REPLACEMENT_HANDLE_BUILDERS[callee.name.text]\n if (!builder) return { resolved: undefined }\n const args = expression.arguments.map((argument) => stringValue(staticValue(argument, context)))\n return { resolved: builder(args) }\n}\n\nfunction isStaticObject(value: StaticValue | undefined): value is StaticObject {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction strings(value: StaticValue | undefined): string[] {\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : []\n}\n\nfunction stringValue(value: StaticValue | undefined): string | undefined {\n return typeof value === 'string' ? value : undefined\n}\n\nfunction numberValue(value: StaticValue | undefined): number | undefined {\n if (typeof value === 'number') return value\n if (typeof value === 'string' && /^\\d+$/.test(value)) return Number(value)\n return undefined\n}\n\nfunction booleanValue(value: StaticValue | undefined): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined\n}\n\nfunction portablePath(moduleRoot: string, sourceRoot: string, filePath: string): string {\n return path.posix.join(sourceRoot, path.relative(moduleRoot, filePath).split(path.sep).join('/'))\n}\n\nfunction conventionPath(moduleRoot: string, relativePath: string): string | null {\n const direct = path.join(moduleRoot, relativePath)\n if (fs.existsSync(direct)) return direct\n if (relativePath.endsWith('.ts')) {\n const tsx = `${direct.slice(0, -3)}.tsx`\n if (fs.existsSync(tsx)) return tsx\n }\n return null\n}\n\nfunction readConventionObjectArrayForContract(\n filePath: string,\n exportName: string,\n factsContractVersion: 1 | 2,\n): StaticObject[] {\n const file = sourceFile(filePath)\n if (!file) return []\n const context = buildStaticContext(file, factsContractVersion)\n const initializer = context.initializers.get(exportName)\n if (!initializer || ts.isFunctionDeclaration(initializer)) return []\n const value = staticValue(initializer, context)\n return Array.isArray(value) ? value.filter(isStaticObject) : []\n}\n\nexport function readConventionObjectArray(filePath: string, exportName: string): StaticObject[] {\n return readConventionObjectArrayForContract(filePath, exportName, 2)\n}\n\nfunction readRootObject(\n filePath: string,\n variableName: string,\n factsContractVersion: 1 | 2 = 2,\n): StaticObject | null {\n const file = sourceFile(filePath)\n if (!file) return null\n const context = buildStaticContext(file, factsContractVersion)\n const initializer = context.initializers.get(variableName)\n if (!initializer || ts.isFunctionDeclaration(initializer)) return null\n const value = staticValue(initializer, context)\n return isStaticObject(value) ? value : null\n}\n\nfunction readCallObjectArguments(filePath: string, calleeNames: ReadonlySet<string>): Array<{\n callee: string\n value: StaticObject\n}> {\n const file = sourceFile(filePath)\n if (!file) return []\n const context = buildStaticContext(file)\n const result: Array<{ callee: string; value: StaticObject }> = []\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && calleeNames.has(node.expression.text)) {\n const firstArgument = node.arguments[0]\n const value = firstArgument ? staticValue(firstArgument, context) : undefined\n if (isStaticObject(value)) result.push({ callee: node.expression.text, value })\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n return result\n}\n\nfunction sortHosts(hosts: ModuleExtensionHostFact[]): ModuleExtensionHostFact[] {\n const sourceKey = (host: ModuleExtensionHostFact): string => host.source.kind === 'fact-ref'\n ? `${host.source.factSection}:${host.source.factKey}`\n : `${host.source.path}:${host.source.symbol}`\n return hosts.sort((left, right) =>\n left.family.localeCompare(right.family)\n || left.id.localeCompare(right.id)\n || sourceKey(left).localeCompare(sourceKey(right))\n || left.key.localeCompare(right.key))\n}\n\nfunction sortContributions(contributions: ModuleExtensionContributionFact[]): ModuleExtensionContributionFact[] {\n const targetKey = (contribution: ModuleExtensionContributionFact): string => contribution.targets\n .map((entry) => entry.id)\n .join('\\u0000')\n const sourceKey = (contribution: ModuleExtensionContributionFact): string =>\n `${contribution.source.path}:${contribution.source.symbol ?? ''}`\n return contributions.sort((left, right) =>\n left.kind.localeCompare(right.kind)\n || left.id.localeCompare(right.id)\n || targetKey(left).localeCompare(targetKey(right))\n || sourceKey(left).localeCompare(sourceKey(right)))\n}\n\nfunction target(id: string, resolution: ModuleExtensionTargetFact['resolution'] = 'unresolved'): ModuleExtensionTargetFact {\n return { id, resolution }\n}\n\nfunction factTarget(id: string, factSection: string, factKey = id): ModuleExtensionTargetFact {\n return { id, resolution: 'fact-ref', factRef: { factSection, factKey } }\n}\n\nfunction openTarget(id: string): ModuleExtensionTargetFact {\n return target(id)\n}\n\nfunction declarationSource(sourceRoot: string, symbol: string): ModuleExtensionHostFact['source'] {\n return { kind: 'declaration', path: path.posix.join(sourceRoot, 'extension-points.ts'), symbol }\n}\n\nfunction hasDeclarationBinding(\n moduleRoot: string,\n hostKey: string,\n declaration: StaticObject,\n): boolean {\n const relativeSource = stringValue(declaration.source)\n if (!relativeSource) return false\n const bindingFile = sourceFile(path.join(moduleRoot, relativeSource))\n if (!bindingFile) return false\n const escapedHostKey = hostKey.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const bindingPattern = new RegExp(\n `extensionPoints\\\\s*\\\\.\\\\s*hosts(?:\\\\s*\\\\.\\\\s*${escapedHostKey}|\\\\s*\\\\[\\\\s*['\\\"]${escapedHostKey}['\\\"]\\\\s*\\\\])`,\n )\n if (bindingPattern.test(bindingFile.text)) return true\n return declaration.family === 'integration'\n && typeof declaration.pattern === 'string'\n && /resolveIntegrationDetailWidgetSpotId\\s*\\(/.test(bindingFile.text)\n}\n\nfunction baseHost(options: {\n key: string\n id: string\n moduleId: string\n family: ExtensionHostFamily\n capabilities: ExtensionHostCapability[]\n sourceRoot: string\n declaration: StaticObject\n bound?: boolean\n resolution?: ModuleExtensionHostFact['resolution']\n}): ModuleExtensionHostFact {\n const { declaration } = options\n const aliases = strings(declaration.aliases)\n const fallbacks = strings(declaration.fallbacks)\n const fact: ModuleExtensionHostFact = {\n key: options.key,\n id: options.id,\n resolution: options.resolution ?? (options.id.includes('{') || options.id.includes('*') ? 'pattern' : 'exact'),\n family: options.family,\n ownerModule: options.moduleId,\n capabilities: options.capabilities,\n bound: options.bound ?? true,\n stability: 'frozen',\n source: declarationSource(options.sourceRoot, `extensionPoints.hosts.${options.key.split('.')[0]}`),\n }\n const contextContract = stringValue(declaration.contextContract)\n const dataContract = stringValue(declaration.dataContract)\n const scopeContract = stringValue(declaration.scopeContract)\n const runtimeContract = stringValue(declaration.runtimeContract)\n const activation = stringValue(declaration.activation) as ModuleExtensionHostFact['activation']\n if (contextContract) fact.contextContract = contextContract\n if (dataContract) fact.dataContract = dataContract\n if (scopeContract) fact.scopeContract = scopeContract\n if (runtimeContract) fact.runtimeContract = runtimeContract\n if (activation) fact.activation = activation\n if (aliases.length > 0) fact.aliases = aliases\n if (fallbacks.length > 0) fact.fallbacks = fallbacks\n return fact\n}\n\nfunction extractDeclaredHosts(options: ExtractModuleExtensionFactsOptions): {\n hosts: ModuleExtensionHostFact[]\n unresolved: ModuleExtensionUnresolvedFact[]\n} {\n const filePath = conventionPath(options.moduleRoot, 'extension-points.ts')\n if (!filePath) return { hosts: [], unresolved: [] }\n const declaration = readRootObject(filePath, 'extensionPoints')\n const hostsObject = declaration && isStaticObject(declaration.hosts) ? declaration.hosts : null\n if (!hostsObject) {\n return {\n hosts: [],\n unresolved: [{\n key: `${options.moduleId}.extension-points`,\n source: { path: portablePath(options.moduleRoot, options.sourceRoot, filePath), symbol: 'extensionPoints' },\n reason: 'unclassified-binding',\n }],\n }\n }\n\n const hosts: ModuleExtensionHostFact[] = []\n const unresolved: ModuleExtensionUnresolvedFact[] = []\n for (const hostKey of Object.keys(hostsObject).sort((left, right) => left.localeCompare(right))) {\n const host = hostsObject[hostKey]\n if (!isStaticObject(host)) continue\n const family = stringValue(host.family) as ExtensionHostFamily | undefined\n if (!family) continue\n const declarationBound = hasDeclarationBinding(options.moduleRoot, hostKey, host)\n if (!declarationBound) {\n unresolved.push({\n key: `${options.moduleId}.${hostKey}`,\n source: {\n path: stringValue(host.source) ?? portablePath(options.moduleRoot, options.sourceRoot, filePath),\n symbol: `extensionPoints.hosts.${hostKey}`,\n },\n reason: 'unbound-declaration',\n })\n }\n if (family === 'data-table') {\n const tableId = stringValue(host.tableId)\n if (!tableId) continue\n const baseSpotId = stringValue(host.baseSpotId) ?? `data-table:${tableId}`\n for (const surface of DATA_TABLE_EXTENSION_SURFACES) {\n const usesBase = ['header', 'footer', 'toolbar', 'searchTrailing', 'emptyState'].includes(surface.key)\n const id = surface.key === 'replacement'\n ? `data-table:${tableId}`\n : `${usesBase ? baseSpotId : `data-table:${tableId}`}:${surface.suffix}`\n hosts.push(baseHost({\n key: `${hostKey}.${surface.key}`,\n id,\n moduleId: options.moduleId,\n family,\n capabilities: [...surface.capabilities],\n sourceRoot: options.sourceRoot,\n declaration: host,\n bound: surface.bound && declarationBound,\n }))\n }\n continue\n }\n if (family === 'crud-form') {\n const entityId = stringValue(host.entityId)\n if (!entityId) continue\n const spotId = stringValue(host.spotId) ?? `crud-form:${entityId}`\n for (const surface of CRUD_FORM_EXTENSION_SURFACES) {\n const id = surface.suffix ? `${spotId}:${surface.suffix}` : spotId\n const fact = baseHost({\n key: `${hostKey}.${surface.key}`,\n id,\n moduleId: options.moduleId,\n family,\n capabilities: [...surface.capabilities],\n sourceRoot: options.sourceRoot,\n declaration: host,\n bound: surface.bound && declarationBound,\n })\n if (surface.key === 'base') fact.phases = [...CRUD_FORM_LIFECYCLE_PHASES]\n hosts.push(fact)\n }\n continue\n }\n const id = stringValue(host.spotId) ?? stringValue(host.pattern) ?? stringValue(host.componentId)\n if (!id) {\n unresolved.push({\n key: `${options.moduleId}.${hostKey}`,\n source: { path: portablePath(options.moduleRoot, options.sourceRoot, filePath), symbol: hostKey },\n reason: 'dynamic-without-pattern',\n })\n continue\n }\n const capabilities = family === 'component-handle'\n ? ['component-replacement'] as ExtensionHostCapability[]\n : strings(host.supported) as ExtensionHostCapability[]\n const fact = baseHost({\n key: hostKey,\n id,\n moduleId: options.moduleId,\n family,\n capabilities,\n sourceRoot: options.sourceRoot,\n declaration: host,\n bound: declarationBound,\n })\n if (isStaticObject(host.parameters)) {\n fact.patternParameters = Object.fromEntries(Object.entries(host.parameters).flatMap(([key, value]) => {\n if (!isStaticObject(value) || typeof value.source !== 'string') return []\n return [[key, {\n source: value.source,\n ...(typeof value.pattern === 'string' ? { pattern: value.pattern } : {}),\n }]]\n }))\n }\n hosts.push(fact)\n }\n return { hosts: sortHosts(hosts), unresolved }\n}\n\nfunction factRefHost(options: {\n key: string\n id: string\n moduleId: string\n family: ExtensionHostFamily\n capabilities: ExtensionHostCapability[]\n factSection: string\n /** Key inside `factSection`; defaults to the host id when the two coincide. */\n factKey?: string\n phases?: string[]\n activation?: ModuleExtensionHostFact['activation']\n scopeContract?: string\n}): ModuleExtensionHostFact {\n return {\n key: options.key,\n id: options.id,\n resolution: 'fact-ref',\n family: options.family,\n ownerModule: options.moduleId,\n capabilities: options.capabilities,\n ...(options.phases ? { phases: options.phases } : {}),\n ...(options.activation ? { activation: options.activation } : {}),\n ...(options.scopeContract ? { scopeContract: options.scopeContract } : {}),\n bound: true,\n stability: 'stable',\n source: { kind: 'fact-ref', factSection: options.factSection, factKey: options.factKey ?? options.id },\n }\n}\n\nfunction sourceFilesBelow(directory: string): string[] {\n const cached = activeExtractionCache?.sourceFilesBelow.get(directory)\n if (cached) return cached\n if (!fs.existsSync(directory)) return []\n const files: string[] = []\n const visit = (current: string): void => {\n for (const entry of fs.readdirSync(current, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name))) {\n const entryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n if (entry.name !== '__tests__' && entry.name !== '__integration__') visit(entryPath)\n continue\n }\n if (entry.isFile() && /\\.(?:ts|tsx)$/.test(entry.name) && !/\\.(?:test|spec)\\./.test(entry.name)) files.push(entryPath)\n }\n }\n visit(directory)\n activeExtractionCache?.sourceFilesBelow.set(directory, files)\n return files\n}\n\nfunction apiRouteId(moduleId: string, moduleRoot: string, filePath: string): string | null {\n const relative = path.relative(path.join(moduleRoot, 'api'), filePath).split(path.sep).join('/')\n if (relative === 'interceptors.ts' || relative === 'openapi.ts') return null\n const withoutExtension = relative.replace(/\\.tsx?$/, '')\n const suffix = withoutExtension.endsWith('/route') ? withoutExtension.slice(0, -6) : withoutExtension\n return suffix && !suffix.includes('__tests__') ? `${moduleId.replace(/_/g, '-')}/${suffix}` : null\n}\n\nfunction apiExtensionHostIds(moduleId: string, moduleRoot: string): ApiExtensionHostIds {\n const cacheKey = `${moduleId}\\0${moduleRoot}`\n const cached = activeExtractionCache?.apiExtensionHostIds.get(cacheKey)\n if (cached) return cached\n const entityIds = new Set<string>()\n const entitySourceFiles: Record<string, string> = {}\n const commandIds = new Set<string>()\n const routeIds = new Set<string>()\n for (const filePath of sourceFilesBelow(path.join(moduleRoot, 'api'))) {\n const routeId = apiRouteId(moduleId, moduleRoot, filePath)\n if (routeId) routeIds.add(routeId)\n const file = sourceFile(filePath)\n if (!file) continue\n const context = buildStaticContext(file)\n const visit = (node: ts.Node): void => {\n if (ts.isPropertyAssignment(node)) {\n const name = propertyName(node.name)\n if (name === 'commandId') {\n const id = stringValue(staticValue(node.initializer, context))\n if (id) commandIds.add(id)\n }\n if (name === 'enrichers') {\n const config = staticValue(node.initializer, context)\n const entityId = isStaticObject(config) ? stringValue(config.entityId) : undefined\n if (entityId) {\n entityIds.add(entityId)\n if (!entitySourceFiles[entityId]) entitySourceFiles[entityId] = filePath\n }\n }\n }\n if (\n ts.isCallExpression(node)\n && ts.isIdentifier(node.expression)\n && node.expression.text === 'validateCrudMutationGuard'\n ) {\n const input = node.arguments[1] ? staticValue(node.arguments[1], context) : undefined\n const entityId = isStaticObject(input) ? stringValue(input.resourceKind) : undefined\n if (entityId) {\n entityIds.add(entityId)\n if (!entitySourceFiles[entityId]) entitySourceFiles[entityId] = filePath\n }\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n }\n const result = {\n entityIds: [...entityIds].sort((left, right) => left.localeCompare(right)),\n entitySourceFiles,\n commandIds: [...commandIds].sort((left, right) => left.localeCompare(right)),\n routeIds: [...routeIds].sort((left, right) => left.localeCompare(right)),\n }\n activeExtractionCache?.apiExtensionHostIds.set(cacheKey, result)\n return result\n}\n\nfunction moduleCommandIds(moduleRoot: string, apiCommandIds: readonly string[]): string[] {\n const commandIds = new Set(apiCommandIds)\n for (const filePath of sourceFilesBelow(path.join(moduleRoot, 'commands'))) {\n if (path.basename(filePath).replace(/\\.(?:ts|tsx)$/, '') === 'interceptors') continue\n for (const id of extractCommandIdsFromSource(filePath)) commandIds.add(id)\n }\n return [...commandIds].sort((left, right) => left.localeCompare(right))\n}\n\nexport function extractKnownApiRouteIds(moduleId: string, moduleRoot: string): string[] {\n return apiExtensionHostIds(moduleId, moduleRoot).routeIds\n}\n\nexport function extractKnownCommandIds(moduleId: string, moduleRoot: string): string[] {\n const apiHosts = apiExtensionHostIds(moduleId, moduleRoot)\n return moduleCommandIds(moduleRoot, apiHosts.commandIds)\n}\n\nconst HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'] as const\nexport type ApiInterceptorPhase = 'before' | 'after'\nexport type ApiRouteInterceptorBridge = {\n method: (typeof HTTP_METHODS)[number]\n phases: ApiInterceptorPhase[]\n}\n\nconst API_INTERCEPTOR_BRIDGE_CALLS: Record<string, ApiInterceptorPhase> = {\n runApiInterceptorsBefore: 'before',\n runApiInterceptorsAfter: 'after',\n}\n\nfunction isHttpMethodName(value: string): value is (typeof HTTP_METHODS)[number] {\n return (HTTP_METHODS as readonly string[]).includes(value)\n}\n\n/** HTTP method handlers a route file actually exports. */\nfunction exportedHttpMethods(file: ts.SourceFile): Array<(typeof HTTP_METHODS)[number]> {\n const methods = new Set<(typeof HTTP_METHODS)[number]>()\n const consider = (name: string | undefined): void => {\n if (name && isHttpMethodName(name)) methods.add(name)\n }\n const considerBindingName = (name: ts.BindingName): void => {\n if (ts.isIdentifier(name)) {\n consider(name.text)\n return\n }\n for (const element of name.elements) {\n if (ts.isBindingElement(element)) considerBindingName(element.name)\n }\n }\n const visit = (node: ts.Node): void => {\n if (ts.isVariableStatement(node) && node.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)) {\n for (const declaration of node.declarationList.declarations) {\n considerBindingName(declaration.name)\n }\n }\n if (\n ts.isFunctionDeclaration(node)\n && node.name\n && node.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)\n ) {\n consider(node.name.text)\n }\n if (ts.isExportDeclaration(node) && node.exportClause && ts.isNamedExports(node.exportClause)) {\n for (const element of node.exportClause.elements) consider(element.name.text)\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n return [...methods].sort((left, right) => left.localeCompare(right))\n}\n\n/**\n * The interceptor pipeline runs only where a route wires it: `makeCrudRoute` runs\n * both phases for every method it handles, and a hand-written route runs whichever\n * of `runApiInterceptorsBefore` / `runApiInterceptorsAfter` it calls. A custom route\n * that calls neither has no bridge, so an interceptor targeting it is never bound.\n */\nfunction extractApiRouteInterceptorBridges(file: ts.SourceFile, context: StaticContext): ApiRouteInterceptorBridge[] {\n const exportedMethods = exportedHttpMethods(file)\n const phasesByMethod = new Map<(typeof HTTP_METHODS)[number], Set<ApiInterceptorPhase>>()\n const addPhase = (method: (typeof HTTP_METHODS)[number], phase: ApiInterceptorPhase): void => {\n const phases = phasesByMethod.get(method) ?? new Set<ApiInterceptorPhase>()\n phases.add(phase)\n phasesByMethod.set(method, phases)\n }\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {\n const calleeName = node.expression.text\n if (calleeName === 'makeCrudRoute') {\n for (const method of exportedMethods) {\n addPhase(method, 'before')\n addPhase(method, 'after')\n }\n }\n const phase = API_INTERCEPTOR_BRIDGE_CALLS[calleeName]\n if (phase) {\n const callOptions = node.arguments[0] ? staticValue(node.arguments[0], context) : undefined\n const declaredMethod = isStaticObject(callOptions) ? stringValue(callOptions.method) : undefined\n const methods = declaredMethod && isHttpMethodName(declaredMethod) ? [declaredMethod] : exportedMethods\n for (const method of methods) addPhase(method, phase)\n }\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n return [...phasesByMethod.entries()]\n .map(([method, phases]) => ({\n method,\n phases: [...phases].sort((left, right) => left.localeCompare(right)),\n }))\n .sort((left, right) => left.method.localeCompare(right.method))\n}\n\n/**\n * Concrete runtime-id owners a module contributes as activation targets: its real\n * `api/**` route ids (with the interceptor bridges each route actually wires) and\n * its `commands/**` command ids (dispatched through the command bus). Used\n * post-selection to synthesize `host-reference`/`owner-reference` bindings with a\n * portable source.\n */\nexport function extractActivationTargetOwners(options: {\n moduleId: string\n moduleRoot: string\n sourceRoot: string\n}): {\n apiRoutes: Array<{ id: string; source: ModuleFactSourceRef; bridges: ApiRouteInterceptorBridge[] }>\n commands: Array<{ id: string; source: ModuleFactSourceRef }>\n} {\n const apiRoutes: Array<{ id: string; source: ModuleFactSourceRef; bridges: ApiRouteInterceptorBridge[] }> = []\n for (const filePath of sourceFilesBelow(path.join(options.moduleRoot, 'api'))) {\n const routeId = apiRouteId(options.moduleId, options.moduleRoot, filePath)\n if (!routeId) continue\n const file = sourceFile(filePath)\n const bridges = file ? extractApiRouteInterceptorBridges(file, buildStaticContext(file)) : []\n apiRoutes.push({\n id: routeId,\n source: { sourcePath: portablePath(options.moduleRoot, options.sourceRoot, filePath) },\n bridges,\n })\n }\n const commands: Array<{ id: string; source: ModuleFactSourceRef }> = []\n const seenCommands = new Set<string>()\n for (const filePath of sourceFilesBelow(path.join(options.moduleRoot, 'commands'))) {\n if (path.basename(filePath).replace(/\\.(?:ts|tsx)$/, '') === 'interceptors') continue\n const source: ModuleFactSourceRef = { sourcePath: portablePath(options.moduleRoot, options.sourceRoot, filePath) }\n for (const id of extractCommandIdsFromSource(filePath)) {\n if (seenCommands.has(id)) continue\n seenCommands.add(id)\n commands.push({ id, source })\n }\n }\n return { apiRoutes, commands }\n}\n\nfunction extractFactRefHosts(options: ExtractModuleExtensionFactsOptions): ModuleExtensionHostFact[] {\n const hosts: ModuleExtensionHostFact[] = []\n for (const entity of options.entities) {\n hosts.push(factRefHost({\n key: `entity.${entity.id}`,\n id: entity.id,\n moduleId: options.moduleId,\n family: 'entity',\n capabilities: ['response-enricher', 'query-enricher', 'mutation-guard', 'entity-extension'],\n factSection: 'entities',\n activation: 'host-opt-in',\n scopeContract: 'tenant-and-organization',\n }))\n }\n for (const route of options.apiRoutes) {\n hosts.push(factRefHost({\n key: `api-route.${route.path}`,\n id: route.path,\n moduleId: options.moduleId,\n family: 'api-route',\n capabilities: ['api-interceptor', 'mutation-guard'],\n factSection: 'apiRoutes',\n phases: ['before', 'after'],\n activation: 'host-opt-in',\n scopeContract: 'request-auth-scope',\n }))\n }\n for (const event of options.events) {\n const capabilities: ExtensionHostCapability[] = ['async-subscriber', 'sync-subscriber']\n if (event.clientBroadcast) capabilities.push('browser-client')\n if (event.portalBroadcast) capabilities.push('browser-portal')\n hosts.push(factRefHost({\n key: `event.${event.id}`,\n id: event.id,\n moduleId: options.moduleId,\n family: 'event',\n capabilities,\n factSection: 'events',\n scopeContract: 'tenant-organization-and-audience',\n }))\n }\n for (const entityId of options.searchEntities) {\n const eventStem = entityId.replace(':', '.')\n for (const phase of ['querying', 'queried'] as const) {\n hosts.push(factRefHost({\n key: `query-lifecycle.${eventStem}.${phase}`,\n id: `${eventStem}.${phase}`,\n moduleId: options.moduleId,\n family: 'query-lifecycle',\n capabilities: ['sync-subscriber'],\n factSection: 'searchEntities',\n factKey: entityId,\n phases: phase === 'querying' ? ['block', 'query-transform'] : ['result-transform', 'scope-reapply'],\n activation: 'caller-opt-in',\n scopeContract: 'tenant-and-organization-reapplied-after-result',\n }))\n }\n }\n const apiHosts = apiExtensionHostIds(options.moduleId, options.moduleRoot)\n for (const entityId of apiHosts.entityIds) {\n const declaringFile = apiHosts.entitySourceFiles[entityId]\n const host = factRefHost({\n key: `api-entity.${entityId}`,\n id: entityId,\n moduleId: options.moduleId,\n family: 'entity',\n capabilities: ['response-enricher', 'query-enricher', 'mutation-guard'],\n factSection: 'apiRoutes',\n activation: 'host-opt-in',\n scopeContract: 'tenant-and-organization',\n })\n hosts.push(declaringFile\n ? {\n ...host,\n source: {\n kind: 'declaration',\n path: portablePath(options.moduleRoot, options.sourceRoot, declaringFile),\n symbol: entityId,\n },\n }\n : host)\n }\n return sortHosts([...new Map(hosts.map((host) => [`${host.family}:${host.id}`, host])).values()])\n}\n\nfunction contributionBase(\n id: string,\n sourcePath: string,\n sourceSymbol?: string,\n): ModuleExtensionContributionBase {\n return {\n id,\n targets: [],\n scopeContract: 'tenant-and-organization',\n source: { path: sourcePath, ...(sourceSymbol ? { symbol: sourceSymbol } : {}) },\n }\n}\n\n/**\n * `ModuleInjectionTable` maps a spot to `ModuleInjectionSlot | ModuleInjectionSlot[]`,\n * and a slot is either a bare widget-id string or a placement object. The runtime\n * loader normalizes all three shapes (`injection-loader.ts` \u2192 `loadInjectionTable`);\n * reading only the array form here silently dropped every string and single-object\n * slot from the generated contribution facts.\n */\nfunction injectionTableSlots(value: StaticValue | undefined): StaticValue[] {\n if (value === undefined) return []\n return Array.isArray(value) ? value : [value]\n}\n\nfunction extractInjectionTable(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n const filePath = conventionPath(options.moduleRoot, 'widgets/injection-table.ts')\n if (!filePath) return []\n const table = readRootObject(filePath, 'injectionTable', options.factsContractVersion ?? 2)\n if (!table) return []\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, filePath)\n const facts: ModuleExtensionContributionFact[] = []\n for (const targetId of Object.keys(table).sort((left, right) => left.localeCompare(right))) {\n const entries = options.factsContractVersion === 1\n ? (Array.isArray(table[targetId]) ? table[targetId] as StaticValue[] : [])\n : injectionTableSlots(table[targetId])\n for (const entry of entries) {\n if (options.factsContractVersion === 1 && !isStaticObject(entry)) continue\n const slot = isStaticObject(entry) ? entry : null\n const widgetId = typeof entry === 'string' ? entry : slot ? stringValue(slot.widgetId) : undefined\n if (!widgetId) continue\n const features = slot ? strings(slot.features) : []\n const priority = slot ? numberValue(slot.priority) : undefined\n const payload = targetId.endsWith(':columns') ? 'column'\n : targetId.endsWith(':row-actions') ? 'row-action'\n : targetId.endsWith(':bulk-actions') ? 'bulk-action'\n : targetId.endsWith(':filters') ? 'filter'\n : targetId.endsWith(':fields') ? 'field'\n : 'render'\n const base = contributionBase(`${widgetId}@${targetId}`, sourcePath, 'injectionTable')\n const shared = {\n ...base,\n targets: [target(targetId)],\n features,\n placement: priority !== undefined ? { priority } : undefined,\n }\n if (targetId.startsWith('data-table:')) {\n facts.push({\n ...shared,\n kind: 'data-table',\n details: {\n payload: payload === 'field' ? 'render' : payload,\n tableId: targetId.replace(/^data-table:/, '').replace(/:(?:columns|row-actions|bulk-actions|filters|toolbar|header|footer|search-trailing)$/, ''),\n executionGuard: features.length > 0 ? 'both' : 'host',\n },\n })\n } else if (targetId.startsWith('crud-form:')) {\n facts.push({\n ...shared,\n kind: 'crud-form',\n details: {\n payload: payload === 'field' ? 'field' : 'render',\n entityId: targetId.replace(/^crud-form:/, '').replace(/:(?:fields|header)$/, ''),\n requestHeaderCapability: payload === 'field',\n },\n })\n } else {\n facts.push({\n ...shared,\n kind: 'widget',\n details: {\n payload: 'render',\n registryKey: widgetId,\n executionGuard: features.length > 0 ? 'both' : 'host',\n },\n })\n }\n }\n }\n return facts\n}\n\nfunction extractObjectConvention(options: {\n module: ExtractModuleExtensionFactsOptions\n relativePath: string\n exportName: string\n exportAliases?: string[]\n build: (entry: StaticObject, sourcePath: string, index: number) => ModuleExtensionContributionFact | null\n}): ModuleExtensionContributionFact[] {\n const filePath = conventionPath(options.module.moduleRoot, options.relativePath)\n if (!filePath) return []\n const exportNames = [options.exportName, ...(options.exportAliases ?? [])]\n const entries = exportNames.reduce<StaticObject[]>((found, exportName) =>\n found.length > 0\n ? found\n : readConventionObjectArrayForContract(filePath, exportName, options.module.factsContractVersion ?? 2), [])\n const sourcePath = portablePath(options.module.moduleRoot, options.module.sourceRoot, filePath)\n return entries.flatMap((entry, index) => options.build(entry, sourcePath, index) ?? [])\n}\n\nfunction methodPhases(entry: StaticObject, map: ReadonlyArray<[string, string]>): string[] {\n return map.flatMap(([property, phase]) => entry[property] === true ? [phase] : [])\n}\n\nfunction extractEnrichers(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'data/enrichers.ts',\n exportName: 'enrichers',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.enricher.${index}`\n const targetEntity = stringValue(entry.targetEntity)\n if (!targetEntity) return null\n const timeoutMs = numberValue(entry.timeout) ?? 2000\n const queryEngineConfig = isStaticObject(entry.queryEngine) ? entry.queryEngine : null\n // `enricher-registry` selects query-engine enrichers by `queryEngine.enabled === true`,\n // so a config object that omits it (or sets it false) is NOT query-enabled.\n const queryEngine = queryEngineConfig && booleanValue(queryEngineConfig.enabled) === true\n ? queryEngineConfig\n : null\n const surfaces = [entry.enrichMany === true ? 'list' : null, entry.enrichOne === true ? 'detail' : null]\n .filter((value): value is 'list' | 'detail' => value !== null)\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'response-enricher',\n targets: [openTarget(targetEntity)],\n features: strings(entry.features),\n phases: surfaces,\n activation: queryEngine ? 'caller-opt-in' : 'host-opt-in',\n roundTripId: `${targetEntity}:read`,\n details: {\n targetEntity,\n surfaces,\n timeoutMs,\n fallback: entry.fallback === undefined ? 'none' : 'configured',\n critical: booleanValue(entry.critical) ?? false,\n cachePosture: 'rerun-on-list-cache-hit',\n ...(queryEngine ? { queryEngine: {\n engines: strings(queryEngine.engines),\n applyOn: (strings(queryEngine.applyOn).length > 0 ? strings(queryEngine.applyOn) : ['list', 'detail'])\n .filter((value): value is 'list' | 'detail' => value === 'list' || value === 'detail'),\n activation: 'caller-opt-in' as const,\n } } : {}),\n },\n }\n },\n })\n}\n\nfunction extractApiInterceptors(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'api/interceptors.ts',\n exportName: 'interceptors',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.api-interceptor.${index}`\n const targetRoute = stringValue(entry.targetRoute)\n if (!targetRoute) return null\n const phases = methodPhases(entry, [['before', 'before'], ['after', 'after']])\n .filter((phase): phase is 'before' | 'after' => phase === 'before' || phase === 'after')\n const methods = strings(entry.methods)\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'api-interceptor',\n targets: [openTarget(targetRoute)],\n phases,\n features: strings(entry.features),\n details: {\n route: targetRoute,\n methods,\n phases,\n activation: targetRoute.startsWith('/') ? 'custom-route-bridge' : 'crud-pipeline',\n timeoutMs: numberValue(entry.timeout) ?? 2000,\n failurePosture: booleanValue(entry.critical) ? 'fail-closed' : 'fallback',\n },\n }\n },\n })\n}\n\nfunction extractCommandInterceptors(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'commands/interceptors.ts',\n exportName: 'interceptors',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.command-interceptor.${index}`\n const targetCommand = stringValue(entry.targetCommand)\n if (!targetCommand) return null\n const phases = methodPhases(entry, [\n ['beforeExecute', 'before-execute'],\n ['afterExecute', 'after-execute'],\n ['beforeUndo', 'before-undo'],\n ['afterUndo', 'after-undo'],\n ]).filter((phase): phase is 'before-execute' | 'after-execute' | 'before-undo' | 'after-undo' =>\n phase === 'before-execute' || phase === 'after-execute' || phase === 'before-undo' || phase === 'after-undo')\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'command-interceptor',\n targets: [openTarget(targetCommand)],\n phases,\n features: strings(entry.features),\n details: { targetCommand, phases },\n }\n },\n })\n}\n\nfunction extractGuards(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'data/guards.ts',\n exportName: 'guards',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.guard.${index}`\n const targetEntity = stringValue(entry.targetEntity)\n if (!targetEntity) return null\n const operations = strings(entry.operations)\n .filter((operation): operation is 'create' | 'update' | 'delete' =>\n operation === 'create' || operation === 'update' || operation === 'delete')\n const capabilities = [entry.validate === true ? 'block' : null, entry.validate === true ? 'rewrite' : null, entry.afterSuccess === true ? 'after-success' : null]\n .filter((value): value is 'block' | 'rewrite' | 'after-success' => value !== null)\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'mutation-guard',\n targets: [openTarget(targetEntity)],\n operations,\n features: strings(entry.features),\n roundTripId: `${targetEntity}:write`,\n details: { entityId: targetEntity, operations, capabilities, optimisticLock: 'preserved' },\n }\n },\n })\n}\n\nfunction extractEntityExtensions(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'data/extensions.ts',\n exportName: 'entityExtensions',\n exportAliases: ['extensions'],\n build(entry, sourcePath, index) {\n const baseEntity = stringValue(entry.base)\n const extensionEntity = stringValue(entry.extension)\n const join = isStaticObject(entry.join) ? entry.join : null\n if (!baseEntity || !extensionEntity || !join) return null\n const id = `${options.moduleId}.entity-extension.${index}:${baseEntity}->${extensionEntity}`\n const contribution = contributionBase(id, sourcePath, 'extensions')\n return {\n ...contribution,\n kind: 'entity-extension',\n targets: [openTarget(baseEntity)],\n details: {\n hostEntityId: baseEntity,\n extensionEntityId: extensionEntity,\n linkId: `${stringValue(join.baseKey) ?? 'id'}:${stringValue(join.extensionKey) ?? 'id'}`,\n scopeContract: 'tenant-and-organization',\n orphanContract: booleanValue(entry.required) ? 'required' : 'optional',\n },\n }\n },\n })\n}\n\nfunction extractSubscribers(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n const directory = path.join(options.moduleRoot, 'subscribers')\n if (!fs.existsSync(directory)) return []\n const facts: ModuleExtensionContributionFact[] = []\n for (const filePath of sourceFilesBelow(directory)) {\n const metadata = readRootObject(filePath, 'metadata')\n if (!metadata) continue\n const event = stringValue(metadata.event)\n if (!event) continue\n const relativeStem = path.relative(directory, filePath).replace(/\\.tsx?$/, '').split(path.sep).join('/')\n const subscriberId = stringValue(metadata.id) ?? `${options.moduleId}:${relativeStem}`\n const persistent = booleanValue(metadata.persistent) ?? false\n const sync = booleanValue(metadata.sync) ?? !persistent\n const contribution = contributionBase(subscriberId, portablePath(options.moduleRoot, options.sourceRoot, filePath), 'metadata')\n facts.push({\n ...contribution,\n kind: 'subscriber',\n targets: [openTarget(event)],\n phases: sync ? ['before-or-after'] : ['async-delivery'],\n details: {\n event,\n subscriberId,\n persistent,\n sync,\n ...(numberValue(metadata.priority) !== undefined ? { priority: numberValue(metadata.priority) as number } : {}),\n },\n })\n }\n return facts\n}\n\nfunction extractBrowserReactions(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return options.events.flatMap((event) => {\n const transports = [event.clientBroadcast ? 'client' : null, event.portalBroadcast ? 'portal' : null]\n .filter((value): value is 'client' | 'portal' => value !== null)\n if (transports.length === 0) return []\n const contribution = contributionBase(`${event.id}.browser`, path.posix.join(options.sourceRoot, 'events.ts'), 'events')\n return [{\n ...contribution,\n kind: 'browser-reaction' as const,\n targets: [factTarget(event.id, 'events')],\n details: {\n transports,\n hooks: transports.flatMap((transport) => transport === 'client' ? ['useAppEvent', 'useOperationProgress'] : ['usePortalAppEvent']),\n audienceScopeContract: 'tenant-organization-user-role-and-customer',\n },\n }]\n })\n}\n\nfunction extractNotificationReactions(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'notifications.handlers.ts',\n exportName: 'notificationHandlers',\n build(entry, sourcePath, index) {\n const notificationType = stringValue(entry.notificationType)\n if (!notificationType) return null\n const declaredId = stringValue(entry.id)\n const id = declaredId ?? `${options.moduleId}.notification-handler.${index}`\n const contribution = contributionBase(id, sourcePath, 'notificationHandlers')\n return {\n ...contribution,\n kind: 'browser-reaction',\n targets: [factTarget(notificationType, 'notifications')],\n features: strings(entry.features),\n placement: numberValue(entry.priority) !== undefined ? { priority: numberValue(entry.priority) } : undefined,\n details: {\n transports: ['notification-effect'],\n hooks: ['useNotificationEffect'],\n audienceScopeContract: 'tenant-organization-user-role-and-customer',\n ...(declaredId ? { overrideKey: declaredId } : {}),\n },\n }\n },\n })\n}\n\nfunction extractComponentOverrides(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'widgets/components.ts',\n exportName: 'componentOverrides',\n build(entry, sourcePath, index) {\n const targetDefinition = isStaticObject(entry.target) ? entry.target : null\n const handle = targetDefinition ? stringValue(targetDefinition.componentId) : undefined\n if (!handle) return null\n // `ComponentOverride` discriminates on `wrapper` / `propsTransform` /\n // `replacement` \u2014 never on a `props` property, which the union has no member for.\n const mode = options.factsContractVersion === 1\n ? (entry.wrapper !== undefined ? 'wrapper' : entry.props !== undefined ? 'props' : 'replace')\n : (entry.wrapper !== undefined ? 'wrapper' : entry.propsTransform !== undefined ? 'props' : 'replace')\n const id = `${options.moduleId}.component-override.${index}:${handle}`\n const contribution = contributionBase(id, sourcePath, 'componentOverrides')\n return {\n ...contribution,\n kind: 'component-override',\n targets: [target(handle)],\n details: {\n handle,\n mode,\n propsContract: stringValue(entry.propsContract) ?? 'component-props-schema',\n },\n }\n },\n })\n}\n\nfunction extractSpecializedRegistries(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n const facts: ModuleExtensionContributionFact[] = []\n const add = (\n id: string,\n registry: SpecializedRegistry,\n sourcePath: string,\n specialistRoute: string,\n symbol = id,\n ): void => {\n const contributionId = `${registry}:${id}`\n const contribution = contributionBase(contributionId, sourcePath, id)\n const fact: ModuleExtensionContributionFact = {\n ...contribution,\n kind: 'specialized-registry',\n targets: [factTarget(id, specialistRoute)],\n source: { path: sourcePath, symbol },\n details: { registry, registryId: id, specialistRoute },\n }\n const existingIndex = facts.findIndex((entry) => entry.id === contributionId)\n if (existingIndex >= 0) facts[existingIndex] = fact\n else facts.push(fact)\n }\n for (const id of options.notifications ?? []) add(id, 'notification', path.posix.join(options.sourceRoot, 'notifications.ts'), 'notifications')\n for (const id of options.searchEntities) add(id, 'search', path.posix.join(options.sourceRoot, 'search.ts'), 'search')\n for (const tool of options.aiTools ?? []) add(tool.name, 'ai', tool.sourcePath, 'aiTools')\n for (const agent of options.aiAgents ?? []) add(agent.id, 'ai', agent.sourcePath, 'aiAgents')\n\n const vectorPath = conventionPath(options.moduleRoot, 'vector.ts')\n if (vectorPath) {\n const vectorConfig = readRootObject(vectorPath, 'vectorConfig') ?? readRootObject(vectorPath, 'config')\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, vectorPath)\n if (vectorConfig && Array.isArray(vectorConfig.entities)) {\n for (const entity of vectorConfig.entities) {\n if (!isStaticObject(entity)) continue\n const entityId = stringValue(entity.entityId)\n if (entityId) add(entityId, 'vector', sourcePath, 'vector', 'vectorConfig')\n }\n }\n }\n\n const integrationPath = conventionPath(options.moduleRoot, 'integration.ts')\n if (integrationPath) {\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, integrationPath)\n const addIntegration = (integration: StaticObject, symbol: string, bundleId?: string): void => {\n const integrationId = stringValue(integration.id)\n if (integrationId) {\n add(integrationId, 'integration', sourcePath, 'integrations', bundleId ? `${symbol}[${bundleId}]` : symbol)\n }\n const providerKey = stringValue(integration.providerKey)\n const category = stringValue(integration.category)\n const categoryRegistry = category === 'payment' ? 'payment'\n : category === 'shipping' ? 'shipping'\n : category === 'currency' ? 'currency'\n : null\n if (providerKey && categoryRegistry) {\n const specialistRoute = categoryRegistry === 'payment' ? 'paymentGateways'\n : categoryRegistry === 'shipping' ? 'shippingCarriers'\n : 'currencies'\n add(providerKey, categoryRegistry, sourcePath, specialistRoute, `${symbol}.providerKey`)\n }\n }\n const singular = readRootObject(integrationPath, 'integration')\n if (singular) addIntegration(singular, 'integration')\n for (const integration of readConventionObjectArray(integrationPath, 'integrations')) {\n addIntegration(integration, 'integrations')\n }\n const bundle = readRootObject(integrationPath, 'integrationBundle') ?? readRootObject(integrationPath, 'bundle')\n if (bundle) {\n const bundleId = stringValue(bundle.id) ?? 'bundle'\n const members = Array.isArray(bundle.integrations) ? bundle.integrations : []\n for (const member of members) {\n if (isStaticObject(member)) addIntegration(member, 'integrationBundle', bundleId)\n }\n }\n }\n\n const workflowsPath = conventionPath(options.moduleRoot, 'workflows.ts')\n if (workflowsPath) {\n const config = readRootObject(workflowsPath, 'workflowsConfig')\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, workflowsPath)\n if (config && Array.isArray(config.workflows)) {\n for (const workflow of config.workflows) {\n if (!isStaticObject(workflow)) continue\n const workflowId = stringValue(workflow.workflowId)\n if (workflowId) add(workflowId, 'workflow', sourcePath, 'workflows', 'workflowsConfig')\n }\n }\n }\n\n const diPath = conventionPath(options.moduleRoot, 'di.ts')\n if (diPath) {\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, diPath)\n const registrations = readCallObjectArguments(diPath, new Set([\n 'registerPaymentGatewayDescriptor',\n 'registerShippingAdapter',\n 'registerCurrencyProvider',\n ]))\n for (const registration of registrations) {\n const registry = registration.callee === 'registerPaymentGatewayDescriptor' ? 'payment'\n : registration.callee === 'registerShippingAdapter' ? 'shipping'\n : 'currency'\n const registryId = stringValue(registration.value.providerKey)\n ?? stringValue(registration.value.key)\n ?? stringValue(registration.value.id)\n if (!registryId) continue\n const specialistRoute = registry === 'payment' ? 'paymentGateways'\n : registry === 'shipping' ? 'shippingCarriers'\n : 'currencies'\n add(registryId, registry, sourcePath, specialistRoute, registration.callee)\n }\n }\n\n const dashboardRoots = { appBase: path.join(options.moduleRoot, '__app__'), pkgBase: options.moduleRoot }\n for (const widgetFile of scanModuleDir(dashboardRoots, SCAN_CONFIGS.dashboardWidgets)) {\n const filePath = path.join(options.moduleRoot, 'widgets', 'dashboard', widgetFile.relPath)\n const widget = readRootObject(filePath, 'widget')\n const metadata = widget && isStaticObject(widget.metadata) ? widget.metadata : null\n if (!metadata) continue\n const widgetId = stringValue(metadata.id)\n if (!widgetId) continue\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, filePath)\n const contribution = contributionBase(`dashboard:${widgetId}`, sourcePath, 'widget.metadata')\n facts.push({\n ...contribution,\n kind: 'widget',\n targets: [target(`dashboard:${widgetId}`)],\n features: strings(metadata.features),\n details: {\n payload: 'dashboard',\n registryKey: widgetId,\n executionGuard: strings(metadata.features).length > 0 ? 'both' : 'host',\n },\n })\n }\n return facts\n}\n\n/**\n * Closed activation-adapter registry (Spec 2). Each `ModuleExtensionActivationKind`\n * maps to the contribution kinds it can bind and to the mode by which a `bound`\n * resolution is proven:\n *\n * - `call-site-object` \u2014 the host module owns a distinct opt-in call site (a\n * `makeCrudRoute` option or a mutation-guard bridge). Presence of the option \u2014\n * NOT mere entity/route existence \u2014 produces an emitted `ModuleExtensionActivation`\n * object. This is what makes \"the entity could host X\" (capability-only) different\n * from \"this route actually activates X\" (bound).\n * - `host-reference` \u2014 the runtime bridge is universal for any matching host\n * (every api route runs the interceptor pipeline; a bound widget/component host\n * proves consumption). No object is duplicated; `bound` is derived from the\n * existing bound host fact and the incoming row carries no `activationId`.\n * - `owner-reference` \u2014 like host-reference but proven by the target module owning\n * the concrete runtime id (command ids have no host fact of their own).\n *\n * The registry is exhaustive by construction: the `Record` key set is the full\n * `ModuleExtensionActivationKind` union, so adding a kind fails the typecheck until\n * it is classified. `activation-adapter-coverage.test.ts` re-checks this at runtime.\n */\ntype ActivationAdapterMode = 'call-site-object' | 'host-reference' | 'owner-reference'\n\nexport const ACTIVATION_ADAPTERS: Record<ModuleExtensionActivationKind, {\n contributionKinds: ModuleExtensionContributionKind[]\n mode: ActivationAdapterMode\n}> = {\n 'crud-response-enricher': { contributionKinds: ['response-enricher'], mode: 'call-site-object' },\n 'query-enricher': { contributionKinds: ['response-enricher'], mode: 'call-site-object' },\n 'mutation-guard': { contributionKinds: ['mutation-guard'], mode: 'call-site-object' },\n 'api-interceptor-bridge': { contributionKinds: ['api-interceptor'], mode: 'host-reference' },\n 'command-interceptor-bridge': { contributionKinds: ['command-interceptor'], mode: 'owner-reference' },\n 'widget-injection-consumer': { contributionKinds: ['widget', 'data-table', 'crud-form'], mode: 'host-reference' },\n 'component-extension-consumer': { contributionKinds: ['component-override'], mode: 'host-reference' },\n 'dashboard-host-consumer': { contributionKinds: ['widget'], mode: 'host-reference' },\n}\n\n/**\n * Every UMES contribution kind classified against the activation registry: either\n * the ordered set of activation kinds that can bind it, or `capability-only` for\n * contributions that are always active by declaration/registration and never gain\n * a route/entity activation. Exhaustive by `Record` construction \u2014 a new kind fails\n * the typecheck until classified.\n */\nexport const CONTRIBUTION_ACTIVATION_CLASSIFICATION: Record<\n ModuleExtensionContributionKind,\n ModuleExtensionActivationKind[] | 'capability-only'\n> = {\n 'response-enricher': ['crud-response-enricher', 'query-enricher'],\n 'mutation-guard': ['mutation-guard'],\n 'api-interceptor': ['api-interceptor-bridge'],\n 'command-interceptor': ['command-interceptor-bridge'],\n 'widget': ['widget-injection-consumer', 'dashboard-host-consumer'],\n 'data-table': ['widget-injection-consumer'],\n 'crud-form': ['widget-injection-consumer'],\n 'component-override': ['component-extension-consumer'],\n 'entity-extension': 'capability-only',\n 'subscriber': 'capability-only',\n 'browser-reaction': 'capability-only',\n 'specialized-registry': 'capability-only',\n 'module-override': 'capability-only',\n}\n\nexport const ALL_ACTIVATION_KINDS = Object.keys(ACTIVATION_ADAPTERS) as ModuleExtensionActivationKind[]\nexport const ALL_CONTRIBUTION_KINDS = Object.keys(CONTRIBUTION_ACTIVATION_CLASSIFICATION) as ModuleExtensionContributionKind[]\n\n/**\n * Verified mutation-guard bridge shapes. The canonical route helper nests the\n * resource under `input` (`runRouteMutationGuards({ \u2026, input: { resourceKind } })`),\n * while the legacy helpers take the resource object directly. Module wrappers around\n * the canonical helper live under `lib/` as often as under `api/`, so both trees are\n * scanned.\n */\nconst MUTATION_GUARD_BRIDGE_ADAPTERS: Record<string, { resourceArgument: 'input-property' | 'any-argument' }> = {\n runRouteMutationGuards: { resourceArgument: 'input-property' },\n validateCrudMutationGuard: { resourceArgument: 'any-argument' },\n runMutationGuards: { resourceArgument: 'any-argument' },\n}\n\nconst MUTATION_GUARD_SOURCE_DIRECTORIES = ['api', 'lib'] as const\n\nconst MUTATION_GUARD_OPERATIONS = new Set(['create', 'update', 'delete', 'custom'])\n\n/**\n * `'custom'` action endpoints are mapped by `toRegistryMutationOperation` onto the\n * closest registry operation, `'update'`.\n */\nfunction toRegistryGuardOperation(operation: string): string {\n return operation === 'custom' ? 'update' : operation\n}\n\nfunction readMutationGuardBridge(\n node: ts.CallExpression,\n context: StaticContext,\n): { entityId: string; operations: string[] } | null {\n const callee = node.expression\n const calleeName = ts.isIdentifier(callee)\n ? callee.text\n : ts.isPropertyAccessExpression(callee)\n ? callee.name.text\n : null\n const adapter = calleeName ? MUTATION_GUARD_BRIDGE_ADAPTERS[calleeName] : undefined\n if (!adapter) return null\n\n const argumentObjects = node.arguments\n .map((argument) => staticValue(argument, context))\n .filter(isStaticObject)\n const resourceObjects = adapter.resourceArgument === 'input-property'\n ? argumentObjects.flatMap((argumentObject) => (isStaticObject(argumentObject.input) ? [argumentObject.input] : []))\n : argumentObjects\n for (const resourceObject of resourceObjects) {\n const entityId = stringValue(resourceObject.resourceKind) ?? stringValue(resourceObject.entityId)\n if (!entityId) continue\n const declaredOperation = stringValue(resourceObject.operation)\n const operations = declaredOperation && MUTATION_GUARD_OPERATIONS.has(declaredOperation)\n ? [toRegistryGuardOperation(declaredOperation)]\n : []\n return { entityId, operations }\n }\n return null\n}\n\nfunction nodeLine(file: ts.SourceFile, node: ts.Node): number {\n return file.getLineAndCharacterOfPosition(node.getStart(file)).line + 1\n}\n\nfunction activationId(host: ModuleExtensionTargetRef, kind: ModuleExtensionActivationKind): string {\n const method = host.method ? `:${host.method}` : ''\n return `${host.kind}:${host.id}${method}:${kind}`\n}\n\nfunction sortActivations(activations: ModuleExtensionActivation[]): ModuleExtensionActivation[] {\n return [...activations].sort((left, right) => left.id.localeCompare(right.id))\n}\n\n/**\n * Extract the `call-site-object` activations (CRUD response/query enrichers and\n * mutation guards) from a module's real `api/**` opt-in sites. Entity or route\n * presence alone never lands here \u2014 only a literal `enrichers: { entityId }`\n * option or a mutation-guard bridge call with a static `resourceKind`/`entityId`.\n */\n/**\n * `<engine>.query(entityId, { \u2026, extensions })` \u2014 the only call shape that enables the\n * query-engine enricher and sync query-lifecycle stages.\n */\nfunction isQueryWithExtensionsCall(node: ts.Node, context: StaticContext): node is ts.CallExpression {\n if (!ts.isCallExpression(node)) return false\n const callee = node.expression\n const calleeName = ts.isPropertyAccessExpression(callee)\n ? callee.name.text\n : ts.isIdentifier(callee)\n ? callee.text\n : null\n if (calleeName !== 'query') return false\n const queryOptions = node.arguments[1] ? staticValue(node.arguments[1], context) : undefined\n return isStaticObject(queryOptions) && queryOptions.extensions !== undefined\n}\n\nfunction extractCallSiteActivations(options: ExtractModuleExtensionFactsOptions): ModuleExtensionActivation[] {\n const activations: ModuleExtensionActivation[] = []\n const byId = new Map<string, ModuleExtensionActivation>()\n const push = (activation: ModuleExtensionActivation): void => {\n const existing = byId.get(activation.id)\n if (existing) {\n if (!existing.operations || !activation.operations) {\n delete existing.operations\n } else {\n existing.operations = [...new Set([...existing.operations, ...activation.operations])]\n .sort((left, right) => left.localeCompare(right))\n }\n return\n }\n byId.set(activation.id, activation)\n activations.push(activation)\n }\n const scannedFiles = MUTATION_GUARD_SOURCE_DIRECTORIES\n .flatMap((directory) => sourceFilesBelow(path.join(options.moduleRoot, directory)))\n for (const filePath of scannedFiles) {\n const file = sourceFile(filePath)\n if (!file) continue\n const context = buildStaticContext(file)\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, filePath)\n const visit = (node: ts.Node): void => {\n // `enrichers: { entityId }` on a CRUD route runs `applyResponseEnrichers` after the\n // list/detail hook. It does NOT enable the query-engine enricher stage.\n if (ts.isPropertyAssignment(node) && propertyName(node.name) === 'enrichers') {\n const config = staticValue(node.initializer, context)\n const entityId = isStaticObject(config) ? stringValue(config.entityId) : undefined\n if (entityId) {\n const host: ModuleExtensionTargetRef = { kind: 'entity', id: entityId, moduleId: options.moduleId }\n push({\n id: activationId(host, 'crud-response-enricher'),\n kind: 'crud-response-enricher',\n host,\n contributionKinds: ['response-enricher'],\n source: { sourcePath, line: nodeLine(file, node) },\n })\n }\n }\n // The query-engine enricher stage runs only for a query that passes `extensions`,\n // so the bound call site is `queryEngine.query('<entityId>', { \u2026, extensions })`.\n if (isQueryWithExtensionsCall(node, context)) {\n const entityId = stringValue(staticValue(node.arguments[0], context))\n if (entityId) {\n const host: ModuleExtensionTargetRef = { kind: 'entity', id: entityId, moduleId: options.moduleId }\n push({\n id: activationId(host, 'query-enricher'),\n kind: 'query-enricher',\n host,\n contributionKinds: ['response-enricher'],\n source: { sourcePath, line: nodeLine(file, node) },\n })\n }\n }\n if (ts.isCallExpression(node)) {\n const bridge = readMutationGuardBridge(node, context)\n if (bridge) {\n const host: ModuleExtensionTargetRef = { kind: 'entity', id: bridge.entityId, moduleId: options.moduleId }\n push({\n id: activationId(host, 'mutation-guard'),\n kind: 'mutation-guard',\n host,\n contributionKinds: ['mutation-guard'],\n ...(bridge.operations.length > 0 ? { operations: bridge.operations } : {}),\n source: { sourcePath, line: nodeLine(file, node) },\n })\n }\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n }\n return sortActivations(activations)\n}\n\nexport function extractModuleExtensionFacts(options: ExtractModuleExtensionFactsOptions): ModuleExtensionSurfaceFacts {\n const declared = extractDeclaredHosts(options)\n const hosts = sortHosts([...declared.hosts, ...extractFactRefHosts(options)])\n const contributions = sortContributions([\n ...extractInjectionTable(options),\n ...extractEnrichers(options),\n ...extractApiInterceptors(options),\n ...extractCommandInterceptors(options),\n ...extractGuards(options),\n ...extractEntityExtensions(options),\n ...extractSubscribers(options),\n ...extractBrowserReactions(options),\n ...extractNotificationReactions(options),\n ...extractComponentOverrides(options),\n ...extractSpecializedRegistries(options),\n ])\n return {\n hosts,\n contributions,\n unresolved: declared.unresolved,\n activations: extractCallSiteActivations(options),\n }\n}\n\nfunction patternMatches(pattern: string, targetId: string): boolean {\n const escaped = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\\\\\{[^}]+\\\\\\}/g, '[^:]+')\n .replace(/\\*/g, '.*')\n return new RegExp(`^${escaped}$`).test(targetId)\n}\n\nfunction targetModuleId(targetId: string): string | null {\n const withoutPrefix = targetId.replace(/^(?:data-table|crud-form|detail|portal-page):/, '')\n const match = /^([a-z][a-z0-9_]*)[.:]/.exec(withoutPrefix)\n return match?.[1] ?? null\n}\n\nfunction normalizedEntityId(value: string): string {\n return value.replace(/^([a-z][a-z0-9_]*):/, '$1.')\n}\n\nfunction entityFactKeyForTarget(targetId: string, entityIds: ReadonlySet<string>): string | null {\n const normalizedTarget = normalizedEntityId(targetId)\n for (const entityId of entityIds) {\n const normalizedEntity = normalizedEntityId(entityId)\n if (normalizedTarget === normalizedEntity) return entityId\n if (normalizedTarget.startsWith(`${normalizedEntity}.`) && /\\.(?:creating|created|updating|updated|deleting|deleted)$/.test(normalizedTarget)) {\n return entityId\n }\n }\n return null\n}\n\nexport function correlateExtensionTarget(\n targetFact: ModuleExtensionTargetFact,\n options: CorrelateExtensionFactsOptions,\n): ModuleExtensionTargetFact {\n if (targetFact.resolution !== 'unresolved') return targetFact\n const allHosts = Object.values(options.surfacesByModule).flatMap((surface) => surface.hosts)\n if (targetFact.id.includes('*') || targetFact.id.includes('{')) {\n const knownIds = [\n ...allHosts.filter((host) => host.bound).map((host) => host.id),\n ...options.entityIds,\n ...options.eventIds,\n ...options.apiRoutes,\n ...(options.commandIds ?? []),\n ]\n if (targetFact.id === '*' || knownIds.some((knownId) => patternMatches(targetFact.id, knownId))) {\n return { id: targetFact.id, resolution: 'pattern' }\n }\n }\n const exact = allHosts.find((host) => host.bound && (\n host.id === targetFact.id\n || host.aliases?.includes(targetFact.id)\n || (host.family === 'api-route' && host.id.endsWith(`/${targetFact.id}`))\n ))\n if (exact) {\n return exact.source.kind === 'fact-ref'\n ? factTarget(targetFact.id, exact.source.factSection, exact.source.factKey)\n : { id: targetFact.id, resolution: 'exact' }\n }\n const patterned = allHosts.find((host) => host.bound && host.resolution === 'pattern' && patternMatches(host.id, targetFact.id))\n if (patterned) return { id: targetFact.id, resolution: 'pattern' }\n const framework = allFrameworkHosts().find((host) => patternMatches(host.id, targetFact.id))\n ?? (FRAMEWORK_PREFIXES.some((prefix) => targetFact.id.startsWith(prefix)) ? FRAMEWORK_HOSTS[0] : undefined)\n if (framework) return { id: targetFact.id, resolution: 'framework' }\n const entityFactKey = options.factsContractVersion === 1\n ? (options.entityIds.has(targetFact.id) ? targetFact.id : null)\n : entityFactKeyForTarget(targetFact.id, options.entityIds)\n if (entityFactKey) {\n return { id: targetFact.id, resolution: 'fact-ref', factRef: { factSection: 'entities', factKey: entityFactKey } }\n }\n if (options.eventIds.has(targetFact.id)) {\n return { id: targetFact.id, resolution: 'fact-ref', factRef: { factSection: 'events', factKey: targetFact.id } }\n }\n if (options.commandIds?.has(targetFact.id)) {\n return factTarget(targetFact.id, 'ownedContracts.command')\n }\n const route = [...options.apiRoutes].find((apiRoute) => apiRoute === targetFact.id || apiRoute.endsWith(`/${targetFact.id}`))\n if (route) return { id: targetFact.id, resolution: 'fact-ref', factRef: { factSection: 'apiRoutes', factKey: route } }\n const ownerModule = targetModuleId(targetFact.id)\n if (ownerModule && !options.surfacesByModule[ownerModule]) {\n return { id: targetFact.id, resolution: 'optional-external', optionalOwnerPackage: `module:${ownerModule}` }\n }\n if (ownerModule && options.contributingModuleId && ownerModule !== options.contributingModuleId) {\n return { id: targetFact.id, resolution: 'optional-external', optionalOwnerPackage: `module:${ownerModule}` }\n }\n return targetFact\n}\n\nexport function correlateModuleExtensionFacts(options: CorrelateExtensionFactsOptions): Record<string, ModuleExtensionSurfaceFacts> {\n const result: Record<string, ModuleExtensionSurfaceFacts> = {}\n for (const moduleId of Object.keys(options.surfacesByModule).sort((left, right) => left.localeCompare(right))) {\n const surface = options.surfacesByModule[moduleId]\n const unresolved: ModuleExtensionUnresolvedFact[] = [...surface.unresolved]\n const contributions = surface.contributions.map((contribution) => {\n const targets = contribution.targets.map((entry) => correlateExtensionTarget(entry, {\n ...options,\n contributingModuleId: moduleId,\n }))\n for (const entry of targets) {\n if (entry.resolution !== 'unresolved') continue\n unresolved.push({\n key: `${contribution.id}:${entry.id}`,\n source: contribution.source,\n reason: 'unresolved-first-party-target',\n })\n }\n return { ...contribution, targets }\n })\n result[moduleId] = {\n hosts: sortHosts([...surface.hosts]),\n contributions: sortContributions(contributions),\n unresolved: unresolved.sort((left, right) => left.key.localeCompare(right.key)),\n activations: sortActivations([...(surface.activations ?? [])]),\n }\n }\n return result\n}\n\ntype IncomingTargetOwner = {\n moduleId: string\n source: ModuleFactSourceRef\n /** Interceptor bridges the owning api route wires (api-route owners only). */\n bridges?: ApiRouteInterceptorBridge[]\n}\n\nexport interface CorrelateIncomingExtensionsOptions {\n surfacesByModule: Readonly<Record<string, ModuleExtensionSurfaceFacts>>\n /** Concrete runtime-id owner maps derived from the fully-selected module set. */\n apiRouteOwners?: ReadonlyMap<string, IncomingTargetOwner>\n commandOwners?: ReadonlyMap<string, IncomingTargetOwner>\n}\n\nfunction normalizeRouteId(routeId: string): string {\n return routeId.replace(/^\\//, '')\n}\n\n/**\n * Owner marker for a contribution bound to a framework host (dashboard, menus,\n * notifications, \u2026). Framework hosts have no module surface of their own, so the\n * activation is recorded on the contributor and never produces an incoming row.\n */\nconst FRAMEWORK_HOST_OWNER = 'framework'\n\n/**\n * Framework host families each host-reference adapter may bind, so a dashboard\n * contribution resolves through `dashboard-host-consumer` rather than being claimed\n * by the generic widget-injection adapter that runs first.\n */\nconst FRAMEWORK_HOST_FAMILIES_BY_ACTIVATION: Partial<Record<ModuleExtensionActivationKind, ExtensionHostFamily[]>> = {\n 'dashboard-host-consumer': ['dashboard'],\n 'widget-injection-consumer': ['menu', 'generic', 'crud-form', 'data-table', 'notification', 'integration'],\n 'component-extension-consumer': ['component-handle'],\n}\n\n/**\n * Resolves a target id against the framework host catalog \u2014 exact ids first, then\n * the patterned entries (`dashboard:*`, `crud-form:*`, `integrations.detail:{id}`),\n * so a concrete `dashboard:<widget>` contribution reaches `framework.dashboard`.\n */\nfunction findFrameworkHost(\n targetId: string,\n activationKind: ModuleExtensionActivationKind,\n): ModuleExtensionHostFact | null {\n const families = FRAMEWORK_HOST_FAMILIES_BY_ACTIVATION[activationKind]\n if (!families) return null\n const candidates = FRAMEWORK_HOSTS.filter((host) => families.includes(host.family))\n const exact = candidates.find((host) => host.id === targetId)\n if (exact) return exact\n return candidates.find((host) => host.resolution === 'pattern' && patternMatches(host.id, targetId)) ?? null\n}\n\n/**\n * A call site that guards only some operations does not activate a contribution\n * declaring none of them. Either side leaving operations undeclared means \"any\".\n */\nfunction operationsIntersect(\n activationOperations: readonly string[] | undefined,\n contributionOperations: readonly string[] | undefined,\n): boolean {\n if (!activationOperations || activationOperations.length === 0) return true\n if (!contributionOperations || contributionOperations.length === 0) return true\n return contributionOperations.some((operation) => activationOperations.includes(operation))\n}\n\nfunction contributionSourceRef(contribution: ModuleExtensionContributionFact): ModuleFactSourceRef {\n return {\n sourcePath: contribution.source.path,\n ...(contribution.source.symbol ? { exportName: contribution.source.symbol } : {}),\n }\n}\n\nfunction targetRefKindFor(\n contribution: ModuleExtensionContributionFact,\n targetId: string,\n): ModuleExtensionTargetRef['kind'] {\n if (targetId === '*' || targetId.includes('*') || targetId.includes('{')) return 'wildcard'\n switch (contribution.kind) {\n case 'response-enricher':\n case 'mutation-guard':\n case 'entity-extension':\n return 'entity'\n case 'api-interceptor':\n return 'api-route'\n case 'command-interceptor':\n return 'command'\n case 'component-override':\n return 'component'\n case 'subscriber':\n return 'event'\n case 'browser-reaction':\n return contribution.details.transports.includes('notification-effect') ? 'notification' : 'event'\n case 'widget':\n case 'data-table':\n case 'crud-form':\n return 'widget-spot'\n case 'specialized-registry':\n case 'module-override':\n return 'module'\n default:\n return 'module'\n }\n}\n\n/**\n * Builds the bidirectional incoming/resolution index after every module fact is\n * extracted and target-correlated. For each contribution target it records one\n * contributor-owned `ModuleContributionResolution` and, when a concrete target\n * owner exists, one target-owned `ModuleIncomingExtensionRef` per matching\n * activation. It never duplicates contribution behavior metadata \u2014 incoming rows\n * point back to the source-owned contribution by `contributorModuleId + contributionId`.\n */\nexport function correlateIncomingExtensions(\n options: CorrelateIncomingExtensionsOptions,\n): Record<string, ModuleExtensionSurfaceFacts> {\n const moduleIds = Object.keys(options.surfacesByModule).sort((left, right) => left.localeCompare(right))\n const apiRouteOwners = options.apiRouteOwners ?? new Map<string, IncomingTargetOwner>()\n const commandOwners = options.commandOwners ?? new Map<string, IncomingTargetOwner>()\n\n // Index call-site activations by (kind, normalized host id).\n const activationIndex = new Map<string, Array<{ moduleId: string; activation: ModuleExtensionActivation }>>()\n const activationKey = (kind: ModuleExtensionActivationKind, hostKind: ModuleExtensionTargetRef['kind'], id: string): string => {\n const normId = hostKind === 'api-route' ? normalizeRouteId(id) : id\n return JSON.stringify([kind, hostKind, normId])\n }\n // Index bound hosts by their runtime id for host-reference resolution.\n const boundHostIndex = new Map<string, { moduleId: string; host: ModuleExtensionHostFact }>()\n\n for (const moduleId of moduleIds) {\n const surface = options.surfacesByModule[moduleId]\n for (const activation of surface.activations ?? []) {\n const key = activationKey(activation.kind, activation.host.kind, activation.host.id)\n const bucket = activationIndex.get(key)\n if (bucket) bucket.push({ moduleId, activation })\n else activationIndex.set(key, [{ moduleId, activation }])\n }\n for (const host of surface.hosts) {\n if (!host.bound) continue\n if (!boundHostIndex.has(host.id)) boundHostIndex.set(host.id, { moduleId, host })\n }\n }\n\n const incomingByModule: Record<string, ModuleIncomingExtensionRef[]> = {}\n const resolutionsByModule: Record<string, ModuleContributionResolution[]> = {}\n const syntheticActivations: Record<string, ModuleExtensionActivation[]> = {}\n for (const moduleId of moduleIds) {\n incomingByModule[moduleId] = []\n resolutionsByModule[moduleId] = []\n syntheticActivations[moduleId] = []\n }\n const registerSyntheticActivation = (ownerModule: string, activation: ModuleExtensionActivation): void => {\n if (!syntheticActivations[ownerModule]) syntheticActivations[ownerModule] = []\n if (!syntheticActivations[ownerModule].some((entry) => entry.id === activation.id)) {\n syntheticActivations[ownerModule].push(activation)\n }\n }\n\n const findCallSiteActivations = (\n contributionKind: ModuleExtensionContributionKind,\n activationKinds: ModuleExtensionActivationKind[],\n targetRef: ModuleExtensionTargetRef,\n contributionOperations: readonly string[] | undefined,\n ): Array<{ moduleId: string; activation: ModuleExtensionActivation }> => {\n const matches: Array<{ moduleId: string; activation: ModuleExtensionActivation }> = []\n for (const kind of activationKinds) {\n if (ACTIVATION_ADAPTERS[kind].mode !== 'call-site-object') continue\n const bucket = activationIndex.get(activationKey(kind, targetRef.kind, targetRef.id)) ?? []\n for (const entry of bucket) {\n if (!entry.activation.contributionKinds.includes(contributionKind)) continue\n if (!operationsIntersect(entry.activation.operations, contributionOperations)) continue\n matches.push(entry)\n }\n }\n return matches.sort((left, right) => left.activation.id.localeCompare(right.activation.id))\n }\n\n for (const contributorModuleId of moduleIds) {\n const surface = options.surfacesByModule[contributorModuleId]\n for (const contribution of surface.contributions) {\n const classification = CONTRIBUTION_ACTIVATION_CLASSIFICATION[contribution.kind]\n for (const resolvedTarget of contribution.targets) {\n const targetKind = targetRefKindFor(contribution, resolvedTarget.id)\n const baseTarget: ModuleExtensionTargetRef = { kind: targetKind, id: resolvedTarget.id }\n\n let resolution: ModuleExtensionResolution\n let ownerModule: string | null = null\n let boundActivationIds: string[] = []\n\n if (targetKind === 'wildcard' || resolvedTarget.resolution === 'pattern') {\n resolution = 'wildcard'\n } else if (resolvedTarget.resolution === 'optional-external') {\n resolution = 'optional-target-missing'\n } else if (resolvedTarget.resolution === 'unresolved') {\n resolution = 'unresolved'\n } else {\n const activationKinds = classification === 'capability-only' ? [] : classification\n const callSiteMatches = findCallSiteActivations(\n contribution.kind,\n activationKinds,\n baseTarget,\n contribution.operations,\n )\n if (callSiteMatches.length > 0) {\n resolution = 'bound'\n ownerModule = callSiteMatches[0].moduleId\n boundActivationIds = callSiteMatches.map((entry) => entry.activation.id)\n } else {\n const referenceBinding = resolveReferenceBinding({\n contribution,\n activationKinds,\n targetRef: baseTarget,\n boundHostIndex,\n apiRouteOwners,\n commandOwners,\n })\n if (referenceBinding) {\n resolution = 'bound'\n // A framework host owns no module surface: record the activation on the\n // contributor and leave `ownerModule` unset so no incoming row is emitted.\n const isFrameworkHost = referenceBinding.ownerModule === FRAMEWORK_HOST_OWNER\n ownerModule = isFrameworkHost ? null : referenceBinding.ownerModule\n const activationOwner = isFrameworkHost ? contributorModuleId : referenceBinding.ownerModule\n for (const activation of referenceBinding.activations) {\n registerSyntheticActivation(activationOwner, activation)\n }\n boundActivationIds = referenceBinding.activations.map((activation) => activation.id)\n } else {\n const hostOwner = boundHostIndex.get(resolvedTarget.id)\n if (hostOwner) {\n resolution = 'capability-only'\n ownerModule = hostOwner.moduleId\n } else {\n resolution = 'capability-only'\n ownerModule = null\n }\n }\n }\n }\n\n const resolutionTarget: ModuleExtensionTargetRef = ownerModule\n ? { ...baseTarget, moduleId: ownerModule }\n : baseTarget\n resolutionsByModule[contributorModuleId].push({\n contributionId: contribution.id,\n target: resolutionTarget,\n resolution,\n activationIds: [...boundActivationIds].sort((left, right) => left.localeCompare(right)),\n })\n\n // Incoming rows document contributions installed by OTHER modules onto a\n // target module's surface (cross-module discovery). Same-module targets are\n // already fully covered by the contributor-owned resolution row above, so\n // emitting a self-incoming row would only duplicate that fact and bloat the\n // generated context.\n if (ownerModule && ownerModule !== contributorModuleId && (resolution === 'bound' || resolution === 'capability-only')) {\n const source = contributionSourceRef(contribution)\n const incomingTarget: ModuleExtensionTargetRef = { ...baseTarget, moduleId: ownerModule }\n if (resolution === 'bound' && boundActivationIds.length > 0) {\n for (const activationRefId of boundActivationIds) {\n incomingByModule[ownerModule].push({\n contributionId: contribution.id,\n contributionKind: contribution.kind,\n contributorModuleId,\n target: incomingTarget,\n activationId: activationRefId,\n resolution: 'bound',\n source,\n })\n }\n } else {\n incomingByModule[ownerModule].push({\n contributionId: contribution.id,\n contributionKind: contribution.kind,\n contributorModuleId,\n target: incomingTarget,\n resolution,\n source,\n })\n }\n }\n }\n }\n }\n\n const result: Record<string, ModuleExtensionSurfaceFacts> = {}\n for (const moduleId of moduleIds) {\n const surface = options.surfacesByModule[moduleId]\n result[moduleId] = {\n ...surface,\n activations: sortActivations([...(surface.activations ?? []), ...syntheticActivations[moduleId]]),\n incoming: dedupeIncoming(incomingByModule[moduleId]),\n contributionResolutions: sortResolutions(resolutionsByModule[moduleId]),\n }\n }\n return result\n}\n\n/**\n * Intersects an api-interceptor contribution's declared methods and phases with the\n * bridges its target route actually wires. A route with no bridge, a phase the route\n * never runs, or a method the route does not handle yields no binding, so the\n * contribution stays `capability-only` instead of being reported as active.\n */\nfunction matchApiInterceptorBridges(\n contribution: ModuleExtensionContributionFact,\n owner: IncomingTargetOwner,\n): ApiRouteInterceptorBridge[] {\n if (contribution.kind !== 'api-interceptor') return []\n const bridges = owner.bridges ?? []\n const declaredMethods = contribution.details.methods ?? []\n const declaredPhases = contribution.phases ?? []\n const matched: ApiRouteInterceptorBridge[] = []\n for (const bridge of bridges) {\n if (declaredMethods.length > 0 && !declaredMethods.includes(bridge.method)) continue\n const phases = declaredPhases.length > 0\n ? bridge.phases.filter((phase) => declaredPhases.includes(phase))\n : bridge.phases\n if (phases.length === 0) continue\n matched.push({ method: bridge.method, phases })\n }\n return matched\n}\n\nfunction resolveReferenceBinding(input: {\n contribution: ModuleExtensionContributionFact\n activationKinds: ModuleExtensionActivationKind[]\n targetRef: ModuleExtensionTargetRef\n boundHostIndex: ReadonlyMap<string, { moduleId: string; host: ModuleExtensionHostFact }>\n apiRouteOwners: ReadonlyMap<string, IncomingTargetOwner>\n commandOwners: ReadonlyMap<string, IncomingTargetOwner>\n}): { ownerModule: string; activations: ModuleExtensionActivation[] } | null {\n for (const kind of input.activationKinds) {\n const adapter = ACTIVATION_ADAPTERS[kind]\n if (adapter.mode === 'call-site-object') continue\n if (!adapter.contributionKinds.includes(input.contribution.kind)) continue\n\n if (adapter.mode === 'host-reference' && kind === 'api-interceptor-bridge') {\n const routeId = normalizeRouteId(input.targetRef.id)\n const owner = input.apiRouteOwners.get(routeId)\n if (!owner) continue\n const matchedBridges = matchApiInterceptorBridges(input.contribution, owner)\n if (matchedBridges.length === 0) continue\n return {\n ownerModule: owner.moduleId,\n activations: matchedBridges.map((bridge) => {\n const host: ModuleExtensionTargetRef = {\n kind: 'api-route',\n id: routeId,\n moduleId: owner.moduleId,\n method: bridge.method,\n }\n return {\n id: activationId(host, kind),\n kind,\n host,\n contributionKinds: ['api-interceptor'],\n phases: bridge.phases,\n source: owner.source,\n bridge: { factSection: 'apiRoutes', factKey: `/${routeId}` },\n }\n }),\n }\n }\n\n if (adapter.mode === 'owner-reference' && kind === 'command-interceptor-bridge') {\n const owner = input.commandOwners.get(input.targetRef.id)\n if (!owner) continue\n const host: ModuleExtensionTargetRef = { kind: 'command', id: input.targetRef.id, moduleId: owner.moduleId }\n return {\n ownerModule: owner.moduleId,\n activations: [{\n id: activationId(host, kind),\n kind,\n host,\n contributionKinds: ['command-interceptor'],\n source: owner.source,\n bridge: { factSection: 'ownedContracts.command', factKey: input.targetRef.id },\n }],\n }\n }\n\n if (adapter.mode === 'host-reference' && (kind === 'widget-injection-consumer' || kind === 'component-extension-consumer' || kind === 'dashboard-host-consumer')) {\n const frameworkHostFact = input.boundHostIndex.has(input.targetRef.id)\n ? null\n : findFrameworkHost(input.targetRef.id, kind)\n const hostEntry = input.boundHostIndex.get(input.targetRef.id)\n ?? (frameworkHostFact ? { moduleId: FRAMEWORK_HOST_OWNER, host: frameworkHostFact } : undefined)\n if (!hostEntry) continue\n const hostSource = hostReferenceSource(hostEntry.host)\n if (!hostSource) continue\n const host: ModuleExtensionTargetRef = { ...input.targetRef, moduleId: hostEntry.moduleId }\n return {\n ownerModule: hostEntry.moduleId,\n activations: [{\n id: activationId(host, kind),\n kind,\n host,\n contributionKinds: adapter.contributionKinds,\n source: hostSource,\n bridge: { factSection: 'hosts', factKey: hostEntry.host.key },\n }],\n }\n }\n }\n return null\n}\n\nfunction hostReferenceSource(host: ModuleExtensionHostFact): ModuleFactSourceRef | null {\n if (host.source.kind === 'declaration' || host.source.kind === 'framework') {\n return { sourcePath: host.source.path, exportName: host.source.symbol }\n }\n return null\n}\n\nfunction incomingIdentity(entry: ModuleIncomingExtensionRef): string {\n const target = JSON.stringify([entry.target.kind, entry.target.id])\n return JSON.stringify([entry.contributorModuleId, entry.contributionId, target, entry.activationId ?? entry.resolution])\n}\n\nfunction dedupeIncoming(entries: ModuleIncomingExtensionRef[]): ModuleIncomingExtensionRef[] {\n const seen = new Set<string>()\n const unique: ModuleIncomingExtensionRef[] = []\n for (const entry of entries) {\n const identity = incomingIdentity(entry)\n if (seen.has(identity)) continue\n seen.add(identity)\n unique.push(entry)\n }\n return unique.sort((left, right) => incomingIdentity(left).localeCompare(incomingIdentity(right)))\n}\n\nfunction resolutionIdentity(entry: ModuleContributionResolution): string {\n return JSON.stringify([entry.contributionId, entry.target.kind, entry.target.id, entry.resolution])\n}\n\nfunction sortResolutions(entries: ModuleContributionResolution[]): ModuleContributionResolution[] {\n const seen = new Set<string>()\n const unique: ModuleContributionResolution[] = []\n for (const entry of entries) {\n const identity = resolutionIdentity(entry)\n if (seen.has(identity)) continue\n seen.add(identity)\n unique.push(entry)\n }\n return unique.sort((left, right) => resolutionIdentity(left).localeCompare(resolutionIdentity(right)))\n}\n\nexport function assertNoUnresolvedExtensionTargets(\n surfacesByModule: Readonly<Record<string, ModuleExtensionSurfaceFacts>>,\n): void {\n const unresolved = Object.entries(surfacesByModule).flatMap(([moduleId, surface]) =>\n surface.unresolved\n .filter((entry) => entry.reason === 'unresolved-first-party-target')\n .map((entry) => `${moduleId}:${entry.key}`),\n ).sort((left, right) => left.localeCompare(right))\n if (unresolved.length > 0) {\n throw new Error(`[module-facts] unresolved first-party extension targets: ${unresolved.join(', ')}`)\n }\n}\n\n/**\n * Supported merge/replace/disable modes for each dotted unified-override host,\n * derived from {@link FRAMEWORK_OVERRIDE_HOSTS} (the framework catalog authority\n * \u2014 spec 2026-08-02-module-facts-exact-override-targets). Keyed by the dotted\n * host id (e.g. `routes.api`, `ai.extensions`, `nav.groupOrder`) so the module\n * override-target adapters share one mode source of truth with the catalog.\n *\n * @deprecated Use {@link getFrameworkOverrideHostOperations}. This helper drops any host whose\n * declared operation is not one of the three recognized modes, which collapses \"the catalog does\n * not describe this host\" into \"the catalog describes it with a mode this generator has fallen\n * behind on\" \u2014 the distinction the `unknown-framework-domain` / `unknown-framework-mode`\n * diagnostics exist to keep apart. Every in-tree consumer has moved; the export is retained\n * because `BACKWARD_COMPATIBILITY.md` classifies exported generator helpers as removable only\n * through the deprecation protocol, and it stays behaviour-identical for as long as it exists.\n */\nexport function getFrameworkOverrideModes(\n hosts: readonly ModuleExtensionHostFact[] = FRAMEWORK_OVERRIDE_HOSTS,\n): Record<string, 'disable-replace' | 'replace' | 'additive'> {\n const modes: Record<string, 'disable-replace' | 'replace' | 'additive'> = {}\n for (const [dotted, operation] of Object.entries(getFrameworkOverrideHostOperations(hosts))) {\n if (operation === 'disable-replace' || operation === 'replace' || operation === 'additive') {\n modes[dotted] = operation\n }\n }\n return modes\n}\n\n/**\n * The catalog's declared first operation for every dotted unified-override host,\n * **without** validating it against the known mode set.\n *\n * {@link getFrameworkOverrideModes} silently drops a host whose operation is not a\n * recognized mode, which makes \"the catalog does not describe this host at all\"\n * indistinguishable from \"the catalog describes it with a mode this generator does\n * not understand\". Consumers that must tell those apart (the override-target\n * adapters, which emit different diagnostics for each) read the raw operations\n * here instead \u2014 spec `2026-07-31-standalone-canonical-example-module.md`,\n * \u00A7 PR #4883 Module-Fact and Extension-Topology Contract.\n *\n * `hosts` defaults to the framework catalog. Every catalog host declares a valid\n * mode today, so the pass-through is unobservable against the real catalog; passing\n * an explicit host list is how `module-override-targets.unknown-mode.test.ts` proves\n * that an operation this generator does not recognize really does survive here.\n */\nexport function getFrameworkOverrideHostOperations(\n hosts: readonly ModuleExtensionHostFact[] = FRAMEWORK_OVERRIDE_HOSTS,\n): Record<string, string> {\n const operations: Record<string, string> = {}\n for (const host of hosts) {\n const dotted = host.key.replace(/^framework\\.module-override\\./, '')\n const operation = host.operations?.[0]\n if (typeof operation === 'string') operations[dotted] = operation\n }\n return operations\n}\n\nexport function getFrameworkExtensionHosts(): ModuleExtensionHostFact[] {\n return sortHosts(allFrameworkHosts().map((host) => ({\n ...host,\n capabilities: [...host.capabilities],\n ...(host.operations ? { operations: [...host.operations] } : {}),\n })))\n}\n\nexport function renderFrameworkExtensionPointsMarkdown(): string {\n const rows = getFrameworkExtensionHosts().map((host) =>\n `| ${host.id} | ${host.family} | ${[...host.capabilities, ...(host.operations ?? [])].join(', ')} | ${host.stability.toUpperCase()} |`,\n )\n return [\n '# Framework extension points (generated, do not edit)',\n '',\n '| ID / pattern | Family | Supports | Stability |',\n '|---|---|---|---|',\n ...rows,\n '',\n ].join('\\n')\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import fs from 'node:fs'\nimport path from 'node:path'\nimport ts from 'typescript-js'\nimport {\n CRUD_FORM_EXTENSION_SURFACES,\n CRUD_FORM_LIFECYCLE_PHASES,\n DATA_TABLE_EXTENSION_SURFACES,\n} from '@open-mercato/shared/modules/widgets/extension-points'\nimport type {\n ExtensionHostCapability,\n ExtensionHostFamily,\n ModuleContributionResolution,\n ModuleExtensionActivation,\n ModuleExtensionActivationKind,\n ModuleExtensionContributionFact,\n ModuleExtensionContributionBase,\n ModuleExtensionContributionKind,\n ModuleExtensionHostFact,\n ModuleExtensionResolution,\n ModuleExtensionSurfaceFacts,\n ModuleExtensionTargetFact,\n ModuleExtensionTargetRef,\n ModuleExtensionUnresolvedFact,\n ModuleFactSourceRef,\n ModuleIncomingExtensionRef,\n} from '@open-mercato/shared/modules/widgets/extension-points'\nimport { extractCommandIdsFromSource } from './module-registry'\nimport { scanModuleDir, SCAN_CONFIGS } from './scanner'\n\ntype StaticScalar = string | number | boolean | null\ntype StaticValue = StaticScalar | StaticValue[] | { [key: string]: StaticValue }\ntype StaticObject = { [key: string]: StaticValue }\ntype SpecializedRegistry = Extract<ModuleExtensionContributionFact, {\n kind: 'specialized-registry'\n}>['details']['registry']\n\nexport interface ExtensionFactEntityRef {\n id: string\n}\n\nexport interface ExtensionFactEventRef {\n id: string\n clientBroadcast?: boolean\n portalBroadcast?: boolean\n}\n\nexport interface ExtensionFactApiRouteRef {\n path: string\n methods: string[]\n}\n\nexport interface ExtractModuleExtensionFactsOptions {\n moduleId: string\n moduleRoot: string\n sourceRoot: string\n entities: readonly ExtensionFactEntityRef[]\n events: readonly ExtensionFactEventRef[]\n apiRoutes: readonly ExtensionFactApiRouteRef[]\n searchEntities: readonly string[]\n notifications?: readonly string[]\n aiTools?: ReadonlyArray<{ name: string; sourcePath: string }>\n aiAgents?: ReadonlyArray<{ id: string; sourcePath: string }>\n /** Generated-facts compatibility projection. Omitted means the corrected v2 contract. */\n factsContractVersion?: 1 | 2\n}\n\nexport interface CorrelateExtensionFactsOptions {\n surfacesByModule: Readonly<Record<string, ModuleExtensionSurfaceFacts>>\n entityIds: ReadonlySet<string>\n eventIds: ReadonlySet<string>\n apiRoutes: ReadonlySet<string>\n commandIds?: ReadonlySet<string>\n contributingModuleId?: string\n /** Generated-facts compatibility projection. Omitted means the corrected v2 contract. */\n factsContractVersion?: 1 | 2\n}\n\ntype StaticContext = {\n initializers: Map<string, ts.Expression | ts.FunctionDeclaration>\n sourceFile: ts.SourceFile\n resolving: Set<string>\n factsContractVersion: 1 | 2\n}\n\ntype ApiExtensionHostIds = {\n entityIds: string[]\n /** Declaring `api/**` file per entity host id, so the host links to a real source. */\n entitySourceFiles: Record<string, string>\n commandIds: string[]\n routeIds: string[]\n}\n\ntype ModuleExtensionFactExtractionCache = {\n sourceFiles: Map<string, ts.SourceFile | null>\n sourceFilesBelow: Map<string, string[]>\n apiExtensionHostIds: Map<string, ApiExtensionHostIds>\n}\n\nlet activeExtractionCache: ModuleExtensionFactExtractionCache | null = null\n\n/** @internal */\nexport function withModuleExtensionFactExtractionCache<Result>(operation: () => Result): Result {\n if (activeExtractionCache) return operation()\n activeExtractionCache = {\n sourceFiles: new Map(),\n sourceFilesBelow: new Map(),\n apiExtensionHostIds: new Map(),\n }\n try {\n return operation()\n } finally {\n activeExtractionCache = null\n }\n}\n\nconst FRAMEWORK_PREFIXES = [\n 'dashboard:',\n 'menu:',\n 'notification:',\n 'integration:',\n 'integrations.detail:',\n 'system-status:',\n 'topbar:',\n]\n\nconst FRAMEWORK_HOSTS: ModuleExtensionHostFact[] = [\n frameworkHost('framework.backend.sidebar', 'menu:backend.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.settings.sidebar', 'menu:settings.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.profile.sidebar', 'menu:profile.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.portal.sidebar', 'menu:portal.sidebar', 'menu', ['menu-item']),\n frameworkHost('framework.dashboard', 'dashboard:*', 'dashboard', ['registry-contribution']),\n frameworkHost('framework.notifications', 'notification:*', 'notification', ['registry-contribution']),\n frameworkHost('framework.integration-detail', 'integrations.detail:{integrationId}', 'integration', ['render-widget']),\n frameworkHost('framework.integration-detail-fallback', 'integrations.detail:tabs', 'integration', ['render-widget']),\n frameworkHost('framework.backend-mutation', 'backend-mutation:global', 'generic', ['headless-widget']),\n frameworkHost('framework.crud-form-wildcard', 'crud-form:*', 'crud-form', ['field-widget', 'lifecycle-handler']),\n]\n\nfunction frameworkHost(\n key: string,\n id: string,\n family: ExtensionHostFamily,\n capabilities: ExtensionHostCapability[],\n): ModuleExtensionHostFact {\n return {\n key,\n id,\n resolution: id.includes('*') || id.includes('{') ? 'pattern' : 'framework',\n family,\n ownerModule: 'framework',\n capabilities,\n bound: true,\n stability: 'frozen',\n source: { kind: 'framework', path: 'packages/ui/src', symbol: key },\n }\n}\n\nfunction frameworkOverrideHost(\n key: string,\n mode: 'disable-replace' | 'replace' | 'additive',\n): ModuleExtensionHostFact {\n return {\n key: `framework.module-override.${key}`,\n id: `module-override:${key}`,\n resolution: 'framework',\n family: 'module-override',\n ownerModule: 'framework',\n capabilities: ['module-override'],\n operations: [mode],\n bound: true,\n stability: 'stable',\n source: {\n kind: 'framework',\n path: 'packages/shared/src/modules/overrides.ts',\n symbol: `ModuleOverrides.${key}`,\n },\n }\n}\n\nconst FRAMEWORK_OVERRIDE_HOSTS = [\n frameworkOverrideHost('ai.agents', 'disable-replace'),\n frameworkOverrideHost('ai.tools', 'disable-replace'),\n frameworkOverrideHost('ai.extensions', 'additive'),\n frameworkOverrideHost('routes.api', 'disable-replace'),\n frameworkOverrideHost('routes.pages', 'disable-replace'),\n frameworkOverrideHost('events.subscribers', 'disable-replace'),\n frameworkOverrideHost('workers', 'disable-replace'),\n frameworkOverrideHost('widgets.injection', 'disable-replace'),\n frameworkOverrideHost('widgets.components', 'disable-replace'),\n frameworkOverrideHost('widgets.dashboard', 'disable-replace'),\n frameworkOverrideHost('notifications.types', 'disable-replace'),\n frameworkOverrideHost('notifications.handlers', 'disable-replace'),\n frameworkOverrideHost('interceptors', 'disable-replace'),\n frameworkOverrideHost('commandInterceptors', 'disable-replace'),\n frameworkOverrideHost('enrichers', 'disable-replace'),\n frameworkOverrideHost('guards', 'disable-replace'),\n frameworkOverrideHost('cli', 'disable-replace'),\n frameworkOverrideHost('setup', 'replace'),\n frameworkOverrideHost('acl.features', 'disable-replace'),\n frameworkOverrideHost('di', 'disable-replace'),\n frameworkOverrideHost('encryption.maps', 'disable-replace'),\n frameworkOverrideHost('nav.groupOrder', 'additive'),\n] as const\n\nfunction allFrameworkHosts(): ModuleExtensionHostFact[] {\n return [...FRAMEWORK_HOSTS, ...FRAMEWORK_OVERRIDE_HOSTS]\n}\n\nfunction sourceFile(filePath: string): ts.SourceFile | null {\n const cached = activeExtractionCache?.sourceFiles.get(filePath)\n if (cached !== undefined) return cached\n if (!fs.existsSync(filePath)) return null\n const scriptKind = filePath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n const parsed = ts.createSourceFile(filePath, fs.readFileSync(filePath, 'utf8'), ts.ScriptTarget.ES2020, true, scriptKind)\n activeExtractionCache?.sourceFiles.set(filePath, parsed)\n return parsed\n}\n\nfunction unwrap(expression: ts.Expression): ts.Expression {\n let current = expression\n while (\n ts.isAsExpression(current)\n || ts.isTypeAssertionExpression(current)\n || ts.isParenthesizedExpression(current)\n || ts.isSatisfiesExpression(current)\n ) {\n current = current.expression\n }\n return current\n}\n\nfunction propertyName(node: ts.PropertyName): string | null {\n if (ts.isIdentifier(node) || ts.isStringLiteralLike(node) || ts.isNumericLiteral(node)) return node.text\n return null\n}\n\nfunction buildStaticContext(file: ts.SourceFile, factsContractVersion: 1 | 2 = 2): StaticContext {\n const initializers = new Map<string, ts.Expression | ts.FunctionDeclaration>()\n const visit = (node: ts.Node): void => {\n if (ts.isVariableDeclaration(node) && ts.isIdentifier(node.name) && node.initializer) {\n initializers.set(node.name.text, node.initializer)\n }\n if (ts.isFunctionDeclaration(node) && node.name && node.body) {\n initializers.set(node.name.text, node)\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n return { initializers, sourceFile: file, resolving: new Set(), factsContractVersion }\n}\n\nfunction entityRegistryValue(expression: ts.PropertyAccessExpression): string | null {\n const parts: string[] = []\n let current: ts.Expression = expression\n while (ts.isPropertyAccessExpression(current)) {\n parts.unshift(current.name.text)\n current = current.expression\n }\n return ts.isIdentifier(current) && current.text === 'E' && parts.length === 2\n ? `${parts[0]}:${parts[1]}`\n : null\n}\n\nfunction staticTemplate(expression: ts.TemplateExpression, context: StaticContext): string | null {\n let value = expression.head.text\n for (const span of expression.templateSpans) {\n const substitution = staticValue(span.expression, context)\n if (typeof substitution !== 'string' && typeof substitution !== 'number') return null\n value += `${substitution}${span.literal.text}`\n }\n return value\n}\n\n/**\n * A function-valued property carries no statically readable value, but its\n * PRESENCE is the discriminant several conventions are keyed on (a\n * `ComponentOverride` is a wrapper/props-transform/replacement depending on\n * which callable it declares; an enricher declares `enrichOne`/`enrichMany`).\n * Method shorthand (`enrichOne() {}`) is already recorded as `true`, so an\n * arrow/function-expression property \u2014 or an identifier bound to one \u2014 records\n * the same marker instead of vanishing from the object.\n */\nfunction isFunctionLikeInitializer(expression: ts.Expression, context: StaticContext): boolean {\n const current = unwrap(expression)\n if (ts.isArrowFunction(current) || ts.isFunctionExpression(current)) return true\n if (!ts.isIdentifier(current)) return false\n const initializer = context.initializers.get(current.text)\n if (!initializer) return false\n if (ts.isFunctionDeclaration(initializer)) return true\n const resolved = unwrap(initializer)\n return ts.isArrowFunction(resolved) || ts.isFunctionExpression(resolved)\n}\n\nfunction staticObject(expression: ts.ObjectLiteralExpression, context: StaticContext): StaticObject {\n const result: StaticObject = {}\n for (const property of expression.properties) {\n if (ts.isPropertyAssignment(property)) {\n const name = propertyName(property.name)\n if (!name) continue\n const value = staticValue(property.initializer, context)\n if (value !== undefined) result[name] = value\n else if (context.factsContractVersion === 2 && isFunctionLikeInitializer(property.initializer, context)) result[name] = true\n continue\n }\n if (ts.isShorthandPropertyAssignment(property)) {\n const value = staticValue(property.name, context)\n if (value !== undefined) result[property.name.text] = value\n continue\n }\n if (ts.isMethodDeclaration(property)) {\n const name = propertyName(property.name)\n if (name) result[name] = true\n continue\n }\n if (ts.isSpreadAssignment(property)) {\n const value = staticValue(property.expression, context)\n if (isStaticObject(value)) Object.assign(result, value)\n }\n }\n return result\n}\n\nfunction staticValue(expression: ts.Expression, context: StaticContext): StaticValue | undefined {\n const current = unwrap(expression)\n if (ts.isStringLiteralLike(current) || ts.isNumericLiteral(current)) return current.text\n if (current.kind === ts.SyntaxKind.TrueKeyword) return true\n if (current.kind === ts.SyntaxKind.FalseKeyword) return false\n if (current.kind === ts.SyntaxKind.NullKeyword) return null\n if (ts.isNoSubstitutionTemplateLiteral(current)) return current.text\n if (ts.isTemplateExpression(current)) return staticTemplate(current, context) ?? undefined\n if (ts.isArrayLiteralExpression(current)) {\n return current.elements.flatMap((element) => {\n if (ts.isSpreadElement(element)) {\n const spread = staticValue(element.expression, context)\n return Array.isArray(spread) ? spread : []\n }\n const value = staticValue(element, context)\n return value === undefined ? [] : [value]\n })\n }\n if (ts.isObjectLiteralExpression(current)) return staticObject(current, context)\n if (ts.isPropertyAccessExpression(current)) {\n return entityRegistryValue(current) ?? undefined\n }\n if (ts.isIdentifier(current)) {\n if (context.resolving.has(current.text)) return undefined\n const initializer = context.initializers.get(current.text)\n if (!initializer) return undefined\n context.resolving.add(current.text)\n const value = ts.isFunctionDeclaration(initializer) ? undefined : staticValue(initializer, context)\n context.resolving.delete(current.text)\n return value\n }\n if (ts.isCallExpression(current)) {\n const handle = componentReplacementHandle(current, context)\n if (handle) {\n if (context.factsContractVersion === 2) return handle.resolved\n const firstArgument = current.arguments[0]\n return firstArgument ? staticValue(firstArgument, context) : undefined\n }\n if (ts.isIdentifier(current.expression)) {\n const callable = context.initializers.get(current.expression.text)\n if (callable && (ts.isArrowFunction(callable) || ts.isFunctionExpression(callable) || ts.isFunctionDeclaration(callable))) {\n const initializers = new Map(context.initializers)\n callable.parameters.forEach((parameter, index) => {\n if (ts.isIdentifier(parameter.name) && current.arguments[index]) {\n initializers.set(parameter.name.text, current.arguments[index])\n }\n })\n const childContext: StaticContext = {\n initializers,\n sourceFile: context.sourceFile,\n resolving: new Set(context.resolving),\n factsContractVersion: context.factsContractVersion,\n }\n if (callable.body && ts.isExpression(callable.body)) return staticValue(callable.body, childContext)\n const returnStatement = callable.body?.statements.find(ts.isReturnStatement)\n if (returnStatement?.expression) return staticValue(returnStatement.expression, childContext)\n }\n }\n // Factory-style `defineThing({ \u2026 })` calls forward their configuration object,\n // but a member call (`Handles.section('a', 'b')`) computes a value from its\n // arguments \u2014 forwarding the first one there invents a wrong id, so it stays\n // unresolved unless a formula above knows the builder.\n const firstArgument = current.arguments[0]\n if (firstArgument && (context.factsContractVersion === 1 || ts.isIdentifier(current.expression))) {\n const value = staticValue(firstArgument, context)\n if (!isStaticObject(value) || !ts.isIdentifier(current.expression)) return value\n if (current.expression.text === 'dataTableExtensionHost') return { family: 'data-table', ...value }\n if (current.expression.text === 'crudFormExtensionHost') return { family: 'crud-form', ...value }\n if (current.expression.text === 'componentExtensionHost') return { family: 'component-handle', ...value }\n return value\n }\n }\n if (ts.isConditionalExpression(current)) {\n const left = staticValue(current.whenTrue, context)\n const right = staticValue(current.whenFalse, context)\n return left !== undefined && JSON.stringify(left) === JSON.stringify(right) ? left : undefined\n }\n return undefined\n}\n\n/**\n * `ComponentReplacementHandles` (packages/shared/src/modules/widgets/component-registry.ts)\n * is the framework-owned builder every `widgets/components.ts` uses to name a\n * replacement handle. Without these formulas the generic call fallback would read\n * `ComponentReplacementHandles.section('ui.detail', 'NotesSection')` as its first\n * argument and publish `ui.detail` as the handle \u2014 a target id that exists nowhere.\n */\nconst COMPONENT_REPLACEMENT_HANDLE_BUILDERS: Record<string, (args: Array<string | undefined>) => string | undefined> = {\n page: ([routePath]) => routePath ? `page:${routePath}` : undefined,\n dataTable: ([tableId]) => tableId ? `data-table:${tableId}` : undefined,\n crudForm: ([entityId]) => entityId ? `crud-form:${entityId}` : undefined,\n section: ([scope, sectionId]) => scope && sectionId ? `section:${scope}.${sectionId}` : undefined,\n}\n\nfunction componentReplacementHandle(\n expression: ts.CallExpression,\n context: StaticContext,\n): { resolved: string | undefined } | null {\n if (!ts.isPropertyAccessExpression(expression.expression)) return null\n const callee = expression.expression\n if (!ts.isIdentifier(callee.expression) || callee.expression.text !== 'ComponentReplacementHandles') return null\n const builder = COMPONENT_REPLACEMENT_HANDLE_BUILDERS[callee.name.text]\n if (!builder) return { resolved: undefined }\n const args = expression.arguments.map((argument) => stringValue(staticValue(argument, context)))\n return { resolved: builder(args) }\n}\n\nfunction isStaticObject(value: StaticValue | undefined): value is StaticObject {\n return !!value && typeof value === 'object' && !Array.isArray(value)\n}\n\nfunction strings(value: StaticValue | undefined): string[] {\n return Array.isArray(value) ? value.filter((entry): entry is string => typeof entry === 'string') : []\n}\n\nfunction stringValue(value: StaticValue | undefined): string | undefined {\n return typeof value === 'string' ? value : undefined\n}\n\n/**\n * Normalizes a `source` declaration (single string or array of strings) into\n * an ordered list. The first entry stays the authoritative provenance path;\n * any remaining entries are additional mount points.\n */\nfunction sourceEntries(value: StaticValue | undefined): string[] {\n if (typeof value === 'string') return [value]\n return strings(value)\n}\n\nfunction primarySource(value: StaticValue | undefined): string | undefined {\n return sourceEntries(value)[0]\n}\n\nfunction numberValue(value: StaticValue | undefined): number | undefined {\n if (typeof value === 'number') return value\n if (typeof value === 'string' && /^\\d+$/.test(value)) return Number(value)\n return undefined\n}\n\nfunction booleanValue(value: StaticValue | undefined): boolean | undefined {\n return typeof value === 'boolean' ? value : undefined\n}\n\nfunction portablePath(moduleRoot: string, sourceRoot: string, filePath: string): string {\n return path.posix.join(sourceRoot, path.relative(moduleRoot, filePath).split(path.sep).join('/'))\n}\n\nfunction conventionPath(moduleRoot: string, relativePath: string): string | null {\n const direct = path.join(moduleRoot, relativePath)\n if (fs.existsSync(direct)) return direct\n if (relativePath.endsWith('.ts')) {\n const tsx = `${direct.slice(0, -3)}.tsx`\n if (fs.existsSync(tsx)) return tsx\n }\n return null\n}\n\nfunction readConventionObjectArrayForContract(\n filePath: string,\n exportName: string,\n factsContractVersion: 1 | 2,\n): StaticObject[] {\n const file = sourceFile(filePath)\n if (!file) return []\n const context = buildStaticContext(file, factsContractVersion)\n const initializer = context.initializers.get(exportName)\n if (!initializer || ts.isFunctionDeclaration(initializer)) return []\n const value = staticValue(initializer, context)\n return Array.isArray(value) ? value.filter(isStaticObject) : []\n}\n\nexport function readConventionObjectArray(filePath: string, exportName: string): StaticObject[] {\n return readConventionObjectArrayForContract(filePath, exportName, 2)\n}\n\nfunction readRootObject(\n filePath: string,\n variableName: string,\n factsContractVersion: 1 | 2 = 2,\n): StaticObject | null {\n const file = sourceFile(filePath)\n if (!file) return null\n const context = buildStaticContext(file, factsContractVersion)\n const initializer = context.initializers.get(variableName)\n if (!initializer || ts.isFunctionDeclaration(initializer)) return null\n const value = staticValue(initializer, context)\n return isStaticObject(value) ? value : null\n}\n\nfunction readCallObjectArguments(filePath: string, calleeNames: ReadonlySet<string>): Array<{\n callee: string\n value: StaticObject\n}> {\n const file = sourceFile(filePath)\n if (!file) return []\n const context = buildStaticContext(file)\n const result: Array<{ callee: string; value: StaticObject }> = []\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && calleeNames.has(node.expression.text)) {\n const firstArgument = node.arguments[0]\n const value = firstArgument ? staticValue(firstArgument, context) : undefined\n if (isStaticObject(value)) result.push({ callee: node.expression.text, value })\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n return result\n}\n\nfunction sortHosts(hosts: ModuleExtensionHostFact[]): ModuleExtensionHostFact[] {\n const sourceKey = (host: ModuleExtensionHostFact): string => host.source.kind === 'fact-ref'\n ? `${host.source.factSection}:${host.source.factKey}`\n : `${host.source.path}:${host.source.symbol}`\n return hosts.sort((left, right) =>\n left.family.localeCompare(right.family)\n || left.id.localeCompare(right.id)\n || sourceKey(left).localeCompare(sourceKey(right))\n || left.key.localeCompare(right.key))\n}\n\nfunction sortContributions(contributions: ModuleExtensionContributionFact[]): ModuleExtensionContributionFact[] {\n const targetKey = (contribution: ModuleExtensionContributionFact): string => contribution.targets\n .map((entry) => entry.id)\n .join('\\u0000')\n const sourceKey = (contribution: ModuleExtensionContributionFact): string =>\n `${contribution.source.path}:${contribution.source.symbol ?? ''}`\n return contributions.sort((left, right) =>\n left.kind.localeCompare(right.kind)\n || left.id.localeCompare(right.id)\n || targetKey(left).localeCompare(targetKey(right))\n || sourceKey(left).localeCompare(sourceKey(right)))\n}\n\nfunction target(id: string, resolution: ModuleExtensionTargetFact['resolution'] = 'unresolved'): ModuleExtensionTargetFact {\n return { id, resolution }\n}\n\nfunction factTarget(id: string, factSection: string, factKey = id): ModuleExtensionTargetFact {\n return { id, resolution: 'fact-ref', factRef: { factSection, factKey } }\n}\n\nfunction openTarget(id: string): ModuleExtensionTargetFact {\n return target(id)\n}\n\nfunction declarationSource(sourceRoot: string, symbol: string): ModuleExtensionHostFact['source'] {\n return { kind: 'declaration', path: path.posix.join(sourceRoot, 'extension-points.ts'), symbol }\n}\n\nfunction hasDeclarationBinding(\n moduleRoot: string,\n hostKey: string,\n declaration: StaticObject,\n): boolean {\n const relativeSource = primarySource(declaration.source)\n if (!relativeSource) return false\n const bindingFile = sourceFile(path.join(moduleRoot, relativeSource))\n if (!bindingFile) return false\n const escapedHostKey = hostKey.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const bindingPattern = new RegExp(\n `extensionPoints\\\\s*\\\\.\\\\s*hosts(?:\\\\s*\\\\.\\\\s*${escapedHostKey}|\\\\s*\\\\[\\\\s*['\\\"]${escapedHostKey}['\\\"]\\\\s*\\\\])`,\n )\n if (bindingPattern.test(bindingFile.text)) return true\n return declaration.family === 'integration'\n && typeof declaration.pattern === 'string'\n && /resolveIntegrationDetailWidgetSpotId\\s*\\(/.test(bindingFile.text)\n}\n\nfunction baseHost(options: {\n key: string\n id: string\n moduleId: string\n family: ExtensionHostFamily\n capabilities: ExtensionHostCapability[]\n sourceRoot: string\n declaration: StaticObject\n bound?: boolean\n resolution?: ModuleExtensionHostFact['resolution']\n}): ModuleExtensionHostFact {\n const { declaration } = options\n const aliases = strings(declaration.aliases)\n const fallbacks = strings(declaration.fallbacks)\n const additionalSources = sourceEntries(declaration.source).slice(1)\n const fact: ModuleExtensionHostFact = {\n key: options.key,\n id: options.id,\n resolution: options.resolution ?? (options.id.includes('{') || options.id.includes('*') ? 'pattern' : 'exact'),\n family: options.family,\n ownerModule: options.moduleId,\n capabilities: options.capabilities,\n bound: options.bound ?? true,\n stability: 'frozen',\n source: declarationSource(options.sourceRoot, `extensionPoints.hosts.${options.key.split('.')[0]}`),\n }\n const contextContract = stringValue(declaration.contextContract)\n const dataContract = stringValue(declaration.dataContract)\n const scopeContract = stringValue(declaration.scopeContract)\n const runtimeContract = stringValue(declaration.runtimeContract)\n const activation = stringValue(declaration.activation) as ModuleExtensionHostFact['activation']\n if (contextContract) fact.contextContract = contextContract\n if (dataContract) fact.dataContract = dataContract\n if (scopeContract) fact.scopeContract = scopeContract\n if (runtimeContract) fact.runtimeContract = runtimeContract\n if (activation) fact.activation = activation\n if (aliases.length > 0) fact.aliases = aliases\n if (fallbacks.length > 0) fact.fallbacks = fallbacks\n if (additionalSources.length > 0) fact.additionalSources = additionalSources\n return fact\n}\n\nfunction extractDeclaredHosts(options: ExtractModuleExtensionFactsOptions): {\n hosts: ModuleExtensionHostFact[]\n unresolved: ModuleExtensionUnresolvedFact[]\n} {\n const filePath = conventionPath(options.moduleRoot, 'extension-points.ts')\n if (!filePath) return { hosts: [], unresolved: [] }\n const declaration = readRootObject(filePath, 'extensionPoints')\n const hostsObject = declaration && isStaticObject(declaration.hosts) ? declaration.hosts : null\n if (!hostsObject) {\n return {\n hosts: [],\n unresolved: [{\n key: `${options.moduleId}.extension-points`,\n source: { path: portablePath(options.moduleRoot, options.sourceRoot, filePath), symbol: 'extensionPoints' },\n reason: 'unclassified-binding',\n }],\n }\n }\n\n const hosts: ModuleExtensionHostFact[] = []\n const unresolved: ModuleExtensionUnresolvedFact[] = []\n for (const hostKey of Object.keys(hostsObject).sort((left, right) => left.localeCompare(right))) {\n const host = hostsObject[hostKey]\n if (!isStaticObject(host)) continue\n const family = stringValue(host.family) as ExtensionHostFamily | undefined\n if (!family) continue\n const declarationBound = hasDeclarationBinding(options.moduleRoot, hostKey, host)\n if (!declarationBound) {\n unresolved.push({\n key: `${options.moduleId}.${hostKey}`,\n source: {\n path: primarySource(host.source) ?? portablePath(options.moduleRoot, options.sourceRoot, filePath),\n symbol: `extensionPoints.hosts.${hostKey}`,\n },\n reason: 'unbound-declaration',\n })\n }\n if (family === 'data-table') {\n const tableId = stringValue(host.tableId)\n if (!tableId) continue\n const baseSpotId = stringValue(host.baseSpotId) ?? `data-table:${tableId}`\n for (const surface of DATA_TABLE_EXTENSION_SURFACES) {\n const usesBase = ['header', 'footer', 'toolbar', 'searchTrailing', 'emptyState'].includes(surface.key)\n const id = surface.key === 'replacement'\n ? `data-table:${tableId}`\n : `${usesBase ? baseSpotId : `data-table:${tableId}`}:${surface.suffix}`\n hosts.push(baseHost({\n key: `${hostKey}.${surface.key}`,\n id,\n moduleId: options.moduleId,\n family,\n capabilities: [...surface.capabilities],\n sourceRoot: options.sourceRoot,\n declaration: host,\n bound: surface.bound && declarationBound,\n }))\n }\n continue\n }\n if (family === 'crud-form') {\n const entityId = stringValue(host.entityId)\n if (!entityId) continue\n const spotId = stringValue(host.spotId) ?? `crud-form:${entityId}`\n for (const surface of CRUD_FORM_EXTENSION_SURFACES) {\n const id = surface.suffix ? `${spotId}:${surface.suffix}` : spotId\n const fact = baseHost({\n key: `${hostKey}.${surface.key}`,\n id,\n moduleId: options.moduleId,\n family,\n capabilities: [...surface.capabilities],\n sourceRoot: options.sourceRoot,\n declaration: host,\n bound: surface.bound && declarationBound,\n })\n if (surface.key === 'base') fact.phases = [...CRUD_FORM_LIFECYCLE_PHASES]\n hosts.push(fact)\n }\n continue\n }\n const id = stringValue(host.spotId) ?? stringValue(host.pattern) ?? stringValue(host.componentId)\n if (!id) {\n unresolved.push({\n key: `${options.moduleId}.${hostKey}`,\n source: { path: portablePath(options.moduleRoot, options.sourceRoot, filePath), symbol: hostKey },\n reason: 'dynamic-without-pattern',\n })\n continue\n }\n const capabilities = family === 'component-handle'\n ? ['component-replacement'] as ExtensionHostCapability[]\n : strings(host.supported) as ExtensionHostCapability[]\n const fact = baseHost({\n key: hostKey,\n id,\n moduleId: options.moduleId,\n family,\n capabilities,\n sourceRoot: options.sourceRoot,\n declaration: host,\n bound: declarationBound,\n })\n if (isStaticObject(host.parameters)) {\n fact.patternParameters = Object.fromEntries(Object.entries(host.parameters).flatMap(([key, value]) => {\n if (!isStaticObject(value) || typeof value.source !== 'string') return []\n return [[key, {\n source: value.source,\n ...(typeof value.pattern === 'string' ? { pattern: value.pattern } : {}),\n }]]\n }))\n }\n hosts.push(fact)\n }\n return { hosts: sortHosts(hosts), unresolved }\n}\n\nfunction factRefHost(options: {\n key: string\n id: string\n moduleId: string\n family: ExtensionHostFamily\n capabilities: ExtensionHostCapability[]\n factSection: string\n /** Key inside `factSection`; defaults to the host id when the two coincide. */\n factKey?: string\n phases?: string[]\n activation?: ModuleExtensionHostFact['activation']\n scopeContract?: string\n}): ModuleExtensionHostFact {\n return {\n key: options.key,\n id: options.id,\n resolution: 'fact-ref',\n family: options.family,\n ownerModule: options.moduleId,\n capabilities: options.capabilities,\n ...(options.phases ? { phases: options.phases } : {}),\n ...(options.activation ? { activation: options.activation } : {}),\n ...(options.scopeContract ? { scopeContract: options.scopeContract } : {}),\n bound: true,\n stability: 'stable',\n source: { kind: 'fact-ref', factSection: options.factSection, factKey: options.factKey ?? options.id },\n }\n}\n\nfunction sourceFilesBelow(directory: string): string[] {\n const cached = activeExtractionCache?.sourceFilesBelow.get(directory)\n if (cached) return cached\n if (!fs.existsSync(directory)) return []\n const files: string[] = []\n const visit = (current: string): void => {\n for (const entry of fs.readdirSync(current, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name))) {\n const entryPath = path.join(current, entry.name)\n if (entry.isDirectory()) {\n if (entry.name !== '__tests__' && entry.name !== '__integration__') visit(entryPath)\n continue\n }\n if (entry.isFile() && /\\.(?:ts|tsx)$/.test(entry.name) && !/\\.(?:test|spec)\\./.test(entry.name)) files.push(entryPath)\n }\n }\n visit(directory)\n activeExtractionCache?.sourceFilesBelow.set(directory, files)\n return files\n}\n\nfunction apiRouteId(moduleId: string, moduleRoot: string, filePath: string): string | null {\n const relative = path.relative(path.join(moduleRoot, 'api'), filePath).split(path.sep).join('/')\n if (relative === 'interceptors.ts' || relative === 'openapi.ts') return null\n const withoutExtension = relative.replace(/\\.tsx?$/, '')\n const suffix = withoutExtension.endsWith('/route') ? withoutExtension.slice(0, -6) : withoutExtension\n return suffix && !suffix.includes('__tests__') ? `${moduleId.replace(/_/g, '-')}/${suffix}` : null\n}\n\nfunction apiExtensionHostIds(moduleId: string, moduleRoot: string): ApiExtensionHostIds {\n const cacheKey = `${moduleId}\\0${moduleRoot}`\n const cached = activeExtractionCache?.apiExtensionHostIds.get(cacheKey)\n if (cached) return cached\n const entityIds = new Set<string>()\n const entitySourceFiles: Record<string, string> = {}\n const commandIds = new Set<string>()\n const routeIds = new Set<string>()\n for (const filePath of sourceFilesBelow(path.join(moduleRoot, 'api'))) {\n const routeId = apiRouteId(moduleId, moduleRoot, filePath)\n if (routeId) routeIds.add(routeId)\n const file = sourceFile(filePath)\n if (!file) continue\n const context = buildStaticContext(file)\n const visit = (node: ts.Node): void => {\n if (ts.isPropertyAssignment(node)) {\n const name = propertyName(node.name)\n if (name === 'commandId') {\n const id = stringValue(staticValue(node.initializer, context))\n if (id) commandIds.add(id)\n }\n if (name === 'enrichers') {\n const config = staticValue(node.initializer, context)\n const entityId = isStaticObject(config) ? stringValue(config.entityId) : undefined\n if (entityId) {\n entityIds.add(entityId)\n if (!entitySourceFiles[entityId]) entitySourceFiles[entityId] = filePath\n }\n }\n }\n if (\n ts.isCallExpression(node)\n && ts.isIdentifier(node.expression)\n && node.expression.text === 'validateCrudMutationGuard'\n ) {\n const input = node.arguments[1] ? staticValue(node.arguments[1], context) : undefined\n const entityId = isStaticObject(input) ? stringValue(input.resourceKind) : undefined\n if (entityId) {\n entityIds.add(entityId)\n if (!entitySourceFiles[entityId]) entitySourceFiles[entityId] = filePath\n }\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n }\n const result = {\n entityIds: [...entityIds].sort((left, right) => left.localeCompare(right)),\n entitySourceFiles,\n commandIds: [...commandIds].sort((left, right) => left.localeCompare(right)),\n routeIds: [...routeIds].sort((left, right) => left.localeCompare(right)),\n }\n activeExtractionCache?.apiExtensionHostIds.set(cacheKey, result)\n return result\n}\n\nfunction moduleCommandIds(moduleRoot: string, apiCommandIds: readonly string[]): string[] {\n const commandIds = new Set(apiCommandIds)\n for (const filePath of sourceFilesBelow(path.join(moduleRoot, 'commands'))) {\n if (path.basename(filePath).replace(/\\.(?:ts|tsx)$/, '') === 'interceptors') continue\n for (const id of extractCommandIdsFromSource(filePath)) commandIds.add(id)\n }\n return [...commandIds].sort((left, right) => left.localeCompare(right))\n}\n\nexport function extractKnownApiRouteIds(moduleId: string, moduleRoot: string): string[] {\n return apiExtensionHostIds(moduleId, moduleRoot).routeIds\n}\n\nexport function extractKnownCommandIds(moduleId: string, moduleRoot: string): string[] {\n const apiHosts = apiExtensionHostIds(moduleId, moduleRoot)\n return moduleCommandIds(moduleRoot, apiHosts.commandIds)\n}\n\nconst HTTP_METHODS = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'] as const\nexport type ApiInterceptorPhase = 'before' | 'after'\nexport type ApiRouteInterceptorBridge = {\n method: (typeof HTTP_METHODS)[number]\n phases: ApiInterceptorPhase[]\n}\n\nconst API_INTERCEPTOR_BRIDGE_CALLS: Record<string, ApiInterceptorPhase> = {\n runApiInterceptorsBefore: 'before',\n runApiInterceptorsAfter: 'after',\n}\n\nfunction isHttpMethodName(value: string): value is (typeof HTTP_METHODS)[number] {\n return (HTTP_METHODS as readonly string[]).includes(value)\n}\n\n/** HTTP method handlers a route file actually exports. */\nfunction exportedHttpMethods(file: ts.SourceFile): Array<(typeof HTTP_METHODS)[number]> {\n const methods = new Set<(typeof HTTP_METHODS)[number]>()\n const consider = (name: string | undefined): void => {\n if (name && isHttpMethodName(name)) methods.add(name)\n }\n const considerBindingName = (name: ts.BindingName): void => {\n if (ts.isIdentifier(name)) {\n consider(name.text)\n return\n }\n for (const element of name.elements) {\n if (ts.isBindingElement(element)) considerBindingName(element.name)\n }\n }\n const visit = (node: ts.Node): void => {\n if (ts.isVariableStatement(node) && node.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)) {\n for (const declaration of node.declarationList.declarations) {\n considerBindingName(declaration.name)\n }\n }\n if (\n ts.isFunctionDeclaration(node)\n && node.name\n && node.modifiers?.some((modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword)\n ) {\n consider(node.name.text)\n }\n if (ts.isExportDeclaration(node) && node.exportClause && ts.isNamedExports(node.exportClause)) {\n for (const element of node.exportClause.elements) consider(element.name.text)\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n return [...methods].sort((left, right) => left.localeCompare(right))\n}\n\n/**\n * The interceptor pipeline runs only where a route wires it: `makeCrudRoute` runs\n * both phases for every method it handles, and a hand-written route runs whichever\n * of `runApiInterceptorsBefore` / `runApiInterceptorsAfter` it calls. A custom route\n * that calls neither has no bridge, so an interceptor targeting it is never bound.\n */\nfunction extractApiRouteInterceptorBridges(file: ts.SourceFile, context: StaticContext): ApiRouteInterceptorBridge[] {\n const exportedMethods = exportedHttpMethods(file)\n const phasesByMethod = new Map<(typeof HTTP_METHODS)[number], Set<ApiInterceptorPhase>>()\n const addPhase = (method: (typeof HTTP_METHODS)[number], phase: ApiInterceptorPhase): void => {\n const phases = phasesByMethod.get(method) ?? new Set<ApiInterceptorPhase>()\n phases.add(phase)\n phasesByMethod.set(method, phases)\n }\n const visit = (node: ts.Node): void => {\n if (ts.isCallExpression(node) && ts.isIdentifier(node.expression)) {\n const calleeName = node.expression.text\n if (calleeName === 'makeCrudRoute') {\n for (const method of exportedMethods) {\n addPhase(method, 'before')\n addPhase(method, 'after')\n }\n }\n const phase = API_INTERCEPTOR_BRIDGE_CALLS[calleeName]\n if (phase) {\n const callOptions = node.arguments[0] ? staticValue(node.arguments[0], context) : undefined\n const declaredMethod = isStaticObject(callOptions) ? stringValue(callOptions.method) : undefined\n const methods = declaredMethod && isHttpMethodName(declaredMethod) ? [declaredMethod] : exportedMethods\n for (const method of methods) addPhase(method, phase)\n }\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n return [...phasesByMethod.entries()]\n .map(([method, phases]) => ({\n method,\n phases: [...phases].sort((left, right) => left.localeCompare(right)),\n }))\n .sort((left, right) => left.method.localeCompare(right.method))\n}\n\n/**\n * Concrete runtime-id owners a module contributes as activation targets: its real\n * `api/**` route ids (with the interceptor bridges each route actually wires) and\n * its `commands/**` command ids (dispatched through the command bus). Used\n * post-selection to synthesize `host-reference`/`owner-reference` bindings with a\n * portable source.\n */\nexport function extractActivationTargetOwners(options: {\n moduleId: string\n moduleRoot: string\n sourceRoot: string\n}): {\n apiRoutes: Array<{ id: string; source: ModuleFactSourceRef; bridges: ApiRouteInterceptorBridge[] }>\n commands: Array<{ id: string; source: ModuleFactSourceRef }>\n} {\n const apiRoutes: Array<{ id: string; source: ModuleFactSourceRef; bridges: ApiRouteInterceptorBridge[] }> = []\n for (const filePath of sourceFilesBelow(path.join(options.moduleRoot, 'api'))) {\n const routeId = apiRouteId(options.moduleId, options.moduleRoot, filePath)\n if (!routeId) continue\n const file = sourceFile(filePath)\n const bridges = file ? extractApiRouteInterceptorBridges(file, buildStaticContext(file)) : []\n apiRoutes.push({\n id: routeId,\n source: { sourcePath: portablePath(options.moduleRoot, options.sourceRoot, filePath) },\n bridges,\n })\n }\n const commands: Array<{ id: string; source: ModuleFactSourceRef }> = []\n const seenCommands = new Set<string>()\n for (const filePath of sourceFilesBelow(path.join(options.moduleRoot, 'commands'))) {\n if (path.basename(filePath).replace(/\\.(?:ts|tsx)$/, '') === 'interceptors') continue\n const source: ModuleFactSourceRef = { sourcePath: portablePath(options.moduleRoot, options.sourceRoot, filePath) }\n for (const id of extractCommandIdsFromSource(filePath)) {\n if (seenCommands.has(id)) continue\n seenCommands.add(id)\n commands.push({ id, source })\n }\n }\n return { apiRoutes, commands }\n}\n\nfunction extractFactRefHosts(options: ExtractModuleExtensionFactsOptions): ModuleExtensionHostFact[] {\n const hosts: ModuleExtensionHostFact[] = []\n for (const entity of options.entities) {\n hosts.push(factRefHost({\n key: `entity.${entity.id}`,\n id: entity.id,\n moduleId: options.moduleId,\n family: 'entity',\n capabilities: ['response-enricher', 'query-enricher', 'mutation-guard', 'entity-extension'],\n factSection: 'entities',\n activation: 'host-opt-in',\n scopeContract: 'tenant-and-organization',\n }))\n }\n for (const route of options.apiRoutes) {\n hosts.push(factRefHost({\n key: `api-route.${route.path}`,\n id: route.path,\n moduleId: options.moduleId,\n family: 'api-route',\n capabilities: ['api-interceptor', 'mutation-guard'],\n factSection: 'apiRoutes',\n phases: ['before', 'after'],\n activation: 'host-opt-in',\n scopeContract: 'request-auth-scope',\n }))\n }\n for (const event of options.events) {\n const capabilities: ExtensionHostCapability[] = ['async-subscriber', 'sync-subscriber']\n if (event.clientBroadcast) capabilities.push('browser-client')\n if (event.portalBroadcast) capabilities.push('browser-portal')\n hosts.push(factRefHost({\n key: `event.${event.id}`,\n id: event.id,\n moduleId: options.moduleId,\n family: 'event',\n capabilities,\n factSection: 'events',\n scopeContract: 'tenant-organization-and-audience',\n }))\n }\n for (const entityId of options.searchEntities) {\n const eventStem = entityId.replace(':', '.')\n for (const phase of ['querying', 'queried'] as const) {\n hosts.push(factRefHost({\n key: `query-lifecycle.${eventStem}.${phase}`,\n id: `${eventStem}.${phase}`,\n moduleId: options.moduleId,\n family: 'query-lifecycle',\n capabilities: ['sync-subscriber'],\n factSection: 'searchEntities',\n factKey: entityId,\n phases: phase === 'querying' ? ['block', 'query-transform'] : ['result-transform', 'scope-reapply'],\n activation: 'caller-opt-in',\n scopeContract: 'tenant-and-organization-reapplied-after-result',\n }))\n }\n }\n const apiHosts = apiExtensionHostIds(options.moduleId, options.moduleRoot)\n for (const entityId of apiHosts.entityIds) {\n const declaringFile = apiHosts.entitySourceFiles[entityId]\n const host = factRefHost({\n key: `api-entity.${entityId}`,\n id: entityId,\n moduleId: options.moduleId,\n family: 'entity',\n capabilities: ['response-enricher', 'query-enricher', 'mutation-guard'],\n factSection: 'apiRoutes',\n activation: 'host-opt-in',\n scopeContract: 'tenant-and-organization',\n })\n hosts.push(declaringFile\n ? {\n ...host,\n source: {\n kind: 'declaration',\n path: portablePath(options.moduleRoot, options.sourceRoot, declaringFile),\n symbol: entityId,\n },\n }\n : host)\n }\n return sortHosts([...new Map(hosts.map((host) => [`${host.family}:${host.id}`, host])).values()])\n}\n\nfunction contributionBase(\n id: string,\n sourcePath: string,\n sourceSymbol?: string,\n): ModuleExtensionContributionBase {\n return {\n id,\n targets: [],\n scopeContract: 'tenant-and-organization',\n source: { path: sourcePath, ...(sourceSymbol ? { symbol: sourceSymbol } : {}) },\n }\n}\n\n/**\n * `ModuleInjectionTable` maps a spot to `ModuleInjectionSlot | ModuleInjectionSlot[]`,\n * and a slot is either a bare widget-id string or a placement object. The runtime\n * loader normalizes all three shapes (`injection-loader.ts` \u2192 `loadInjectionTable`);\n * reading only the array form here silently dropped every string and single-object\n * slot from the generated contribution facts.\n */\nfunction injectionTableSlots(value: StaticValue | undefined): StaticValue[] {\n if (value === undefined) return []\n return Array.isArray(value) ? value : [value]\n}\n\nfunction extractInjectionTable(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n const filePath = conventionPath(options.moduleRoot, 'widgets/injection-table.ts')\n if (!filePath) return []\n const table = readRootObject(filePath, 'injectionTable', options.factsContractVersion ?? 2)\n if (!table) return []\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, filePath)\n const facts: ModuleExtensionContributionFact[] = []\n for (const targetId of Object.keys(table).sort((left, right) => left.localeCompare(right))) {\n const entries = options.factsContractVersion === 1\n ? (Array.isArray(table[targetId]) ? table[targetId] as StaticValue[] : [])\n : injectionTableSlots(table[targetId])\n for (const entry of entries) {\n if (options.factsContractVersion === 1 && !isStaticObject(entry)) continue\n const slot = isStaticObject(entry) ? entry : null\n const widgetId = typeof entry === 'string' ? entry : slot ? stringValue(slot.widgetId) : undefined\n if (!widgetId) continue\n const features = slot ? strings(slot.features) : []\n const priority = slot ? numberValue(slot.priority) : undefined\n const payload = targetId.endsWith(':columns') ? 'column'\n : targetId.endsWith(':row-actions') ? 'row-action'\n : targetId.endsWith(':bulk-actions') ? 'bulk-action'\n : targetId.endsWith(':filters') ? 'filter'\n : targetId.endsWith(':fields') ? 'field'\n : 'render'\n const base = contributionBase(`${widgetId}@${targetId}`, sourcePath, 'injectionTable')\n const shared = {\n ...base,\n targets: [target(targetId)],\n features,\n placement: priority !== undefined ? { priority } : undefined,\n }\n if (targetId.startsWith('data-table:')) {\n facts.push({\n ...shared,\n kind: 'data-table',\n details: {\n payload: payload === 'field' ? 'render' : payload,\n tableId: targetId.replace(/^data-table:/, '').replace(/:(?:columns|row-actions|bulk-actions|filters|toolbar|header|footer|search-trailing)$/, ''),\n executionGuard: features.length > 0 ? 'both' : 'host',\n },\n })\n } else if (targetId.startsWith('crud-form:')) {\n facts.push({\n ...shared,\n kind: 'crud-form',\n details: {\n payload: payload === 'field' ? 'field' : 'render',\n entityId: targetId.replace(/^crud-form:/, '').replace(/:(?:fields|header)$/, ''),\n requestHeaderCapability: payload === 'field',\n },\n })\n } else {\n facts.push({\n ...shared,\n kind: 'widget',\n details: {\n payload: 'render',\n registryKey: widgetId,\n executionGuard: features.length > 0 ? 'both' : 'host',\n },\n })\n }\n }\n }\n return facts\n}\n\nfunction extractObjectConvention(options: {\n module: ExtractModuleExtensionFactsOptions\n relativePath: string\n exportName: string\n exportAliases?: string[]\n build: (entry: StaticObject, sourcePath: string, index: number) => ModuleExtensionContributionFact | null\n}): ModuleExtensionContributionFact[] {\n const filePath = conventionPath(options.module.moduleRoot, options.relativePath)\n if (!filePath) return []\n const exportNames = [options.exportName, ...(options.exportAliases ?? [])]\n const entries = exportNames.reduce<StaticObject[]>((found, exportName) =>\n found.length > 0\n ? found\n : readConventionObjectArrayForContract(filePath, exportName, options.module.factsContractVersion ?? 2), [])\n const sourcePath = portablePath(options.module.moduleRoot, options.module.sourceRoot, filePath)\n return entries.flatMap((entry, index) => options.build(entry, sourcePath, index) ?? [])\n}\n\nfunction methodPhases(entry: StaticObject, map: ReadonlyArray<[string, string]>): string[] {\n return map.flatMap(([property, phase]) => entry[property] === true ? [phase] : [])\n}\n\nfunction extractEnrichers(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'data/enrichers.ts',\n exportName: 'enrichers',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.enricher.${index}`\n const targetEntity = stringValue(entry.targetEntity)\n if (!targetEntity) return null\n const timeoutMs = numberValue(entry.timeout) ?? 2000\n const queryEngineConfig = isStaticObject(entry.queryEngine) ? entry.queryEngine : null\n // `enricher-registry` selects query-engine enrichers by `queryEngine.enabled === true`,\n // so a config object that omits it (or sets it false) is NOT query-enabled.\n const queryEngine = queryEngineConfig && booleanValue(queryEngineConfig.enabled) === true\n ? queryEngineConfig\n : null\n const surfaces = [entry.enrichMany === true ? 'list' : null, entry.enrichOne === true ? 'detail' : null]\n .filter((value): value is 'list' | 'detail' => value !== null)\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'response-enricher',\n targets: [openTarget(targetEntity)],\n features: strings(entry.features),\n phases: surfaces,\n activation: queryEngine ? 'caller-opt-in' : 'host-opt-in',\n roundTripId: `${targetEntity}:read`,\n details: {\n targetEntity,\n surfaces,\n timeoutMs,\n fallback: entry.fallback === undefined ? 'none' : 'configured',\n critical: booleanValue(entry.critical) ?? false,\n cachePosture: 'rerun-on-list-cache-hit',\n ...(queryEngine ? { queryEngine: {\n engines: strings(queryEngine.engines),\n applyOn: (strings(queryEngine.applyOn).length > 0 ? strings(queryEngine.applyOn) : ['list', 'detail'])\n .filter((value): value is 'list' | 'detail' => value === 'list' || value === 'detail'),\n activation: 'caller-opt-in' as const,\n } } : {}),\n },\n }\n },\n })\n}\n\nfunction extractApiInterceptors(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'api/interceptors.ts',\n exportName: 'interceptors',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.api-interceptor.${index}`\n const targetRoute = stringValue(entry.targetRoute)\n if (!targetRoute) return null\n const phases = methodPhases(entry, [['before', 'before'], ['after', 'after']])\n .filter((phase): phase is 'before' | 'after' => phase === 'before' || phase === 'after')\n const methods = strings(entry.methods)\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'api-interceptor',\n targets: [openTarget(targetRoute)],\n phases,\n features: strings(entry.features),\n details: {\n route: targetRoute,\n methods,\n phases,\n activation: targetRoute.startsWith('/') ? 'custom-route-bridge' : 'crud-pipeline',\n timeoutMs: numberValue(entry.timeout) ?? 2000,\n failurePosture: booleanValue(entry.critical) ? 'fail-closed' : 'fallback',\n },\n }\n },\n })\n}\n\nfunction extractCommandInterceptors(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'commands/interceptors.ts',\n exportName: 'interceptors',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.command-interceptor.${index}`\n const targetCommand = stringValue(entry.targetCommand)\n if (!targetCommand) return null\n const phases = methodPhases(entry, [\n ['beforeExecute', 'before-execute'],\n ['afterExecute', 'after-execute'],\n ['beforeUndo', 'before-undo'],\n ['afterUndo', 'after-undo'],\n ]).filter((phase): phase is 'before-execute' | 'after-execute' | 'before-undo' | 'after-undo' =>\n phase === 'before-execute' || phase === 'after-execute' || phase === 'before-undo' || phase === 'after-undo')\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'command-interceptor',\n targets: [openTarget(targetCommand)],\n phases,\n features: strings(entry.features),\n details: { targetCommand, phases },\n }\n },\n })\n}\n\nfunction extractGuards(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'data/guards.ts',\n exportName: 'guards',\n build(entry, sourcePath, index) {\n const id = stringValue(entry.id) ?? `${options.moduleId}.guard.${index}`\n const targetEntity = stringValue(entry.targetEntity)\n if (!targetEntity) return null\n const operations = strings(entry.operations)\n .filter((operation): operation is 'create' | 'update' | 'delete' =>\n operation === 'create' || operation === 'update' || operation === 'delete')\n const capabilities = [entry.validate === true ? 'block' : null, entry.validate === true ? 'rewrite' : null, entry.afterSuccess === true ? 'after-success' : null]\n .filter((value): value is 'block' | 'rewrite' | 'after-success' => value !== null)\n const base = contributionBase(id, sourcePath, id)\n return {\n ...base,\n kind: 'mutation-guard',\n targets: [openTarget(targetEntity)],\n operations,\n features: strings(entry.features),\n roundTripId: `${targetEntity}:write`,\n details: { entityId: targetEntity, operations, capabilities, optimisticLock: 'preserved' },\n }\n },\n })\n}\n\nfunction extractEntityExtensions(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'data/extensions.ts',\n exportName: 'entityExtensions',\n exportAliases: ['extensions'],\n build(entry, sourcePath, index) {\n const baseEntity = stringValue(entry.base)\n const extensionEntity = stringValue(entry.extension)\n const join = isStaticObject(entry.join) ? entry.join : null\n if (!baseEntity || !extensionEntity || !join) return null\n const id = `${options.moduleId}.entity-extension.${index}:${baseEntity}->${extensionEntity}`\n const contribution = contributionBase(id, sourcePath, 'extensions')\n return {\n ...contribution,\n kind: 'entity-extension',\n targets: [openTarget(baseEntity)],\n details: {\n hostEntityId: baseEntity,\n extensionEntityId: extensionEntity,\n linkId: `${stringValue(join.baseKey) ?? 'id'}:${stringValue(join.extensionKey) ?? 'id'}`,\n scopeContract: 'tenant-and-organization',\n orphanContract: booleanValue(entry.required) ? 'required' : 'optional',\n },\n }\n },\n })\n}\n\nfunction extractSubscribers(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n const directory = path.join(options.moduleRoot, 'subscribers')\n if (!fs.existsSync(directory)) return []\n const facts: ModuleExtensionContributionFact[] = []\n for (const filePath of sourceFilesBelow(directory)) {\n const metadata = readRootObject(filePath, 'metadata')\n if (!metadata) continue\n const event = stringValue(metadata.event)\n if (!event) continue\n const relativeStem = path.relative(directory, filePath).replace(/\\.tsx?$/, '').split(path.sep).join('/')\n const subscriberId = stringValue(metadata.id) ?? `${options.moduleId}:${relativeStem}`\n const persistent = booleanValue(metadata.persistent) ?? false\n const sync = booleanValue(metadata.sync) ?? !persistent\n const contribution = contributionBase(subscriberId, portablePath(options.moduleRoot, options.sourceRoot, filePath), 'metadata')\n facts.push({\n ...contribution,\n kind: 'subscriber',\n targets: [openTarget(event)],\n phases: sync ? ['before-or-after'] : ['async-delivery'],\n details: {\n event,\n subscriberId,\n persistent,\n sync,\n ...(numberValue(metadata.priority) !== undefined ? { priority: numberValue(metadata.priority) as number } : {}),\n },\n })\n }\n return facts\n}\n\nfunction extractBrowserReactions(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return options.events.flatMap((event) => {\n const transports = [event.clientBroadcast ? 'client' : null, event.portalBroadcast ? 'portal' : null]\n .filter((value): value is 'client' | 'portal' => value !== null)\n if (transports.length === 0) return []\n const contribution = contributionBase(`${event.id}.browser`, path.posix.join(options.sourceRoot, 'events.ts'), 'events')\n return [{\n ...contribution,\n kind: 'browser-reaction' as const,\n targets: [factTarget(event.id, 'events')],\n details: {\n transports,\n hooks: transports.flatMap((transport) => transport === 'client' ? ['useAppEvent', 'useOperationProgress'] : ['usePortalAppEvent']),\n audienceScopeContract: 'tenant-organization-user-role-and-customer',\n },\n }]\n })\n}\n\nfunction extractNotificationReactions(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'notifications.handlers.ts',\n exportName: 'notificationHandlers',\n build(entry, sourcePath, index) {\n const notificationType = stringValue(entry.notificationType)\n if (!notificationType) return null\n const declaredId = stringValue(entry.id)\n const id = declaredId ?? `${options.moduleId}.notification-handler.${index}`\n const contribution = contributionBase(id, sourcePath, 'notificationHandlers')\n return {\n ...contribution,\n kind: 'browser-reaction',\n targets: [factTarget(notificationType, 'notifications')],\n features: strings(entry.features),\n placement: numberValue(entry.priority) !== undefined ? { priority: numberValue(entry.priority) } : undefined,\n details: {\n transports: ['notification-effect'],\n hooks: ['useNotificationEffect'],\n audienceScopeContract: 'tenant-organization-user-role-and-customer',\n ...(declaredId ? { overrideKey: declaredId } : {}),\n },\n }\n },\n })\n}\n\nfunction extractComponentOverrides(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n return extractObjectConvention({\n module: options,\n relativePath: 'widgets/components.ts',\n exportName: 'componentOverrides',\n build(entry, sourcePath, index) {\n const targetDefinition = isStaticObject(entry.target) ? entry.target : null\n const handle = targetDefinition ? stringValue(targetDefinition.componentId) : undefined\n if (!handle) return null\n // `ComponentOverride` discriminates on `wrapper` / `propsTransform` /\n // `replacement` \u2014 never on a `props` property, which the union has no member for.\n const mode = options.factsContractVersion === 1\n ? (entry.wrapper !== undefined ? 'wrapper' : entry.props !== undefined ? 'props' : 'replace')\n : (entry.wrapper !== undefined ? 'wrapper' : entry.propsTransform !== undefined ? 'props' : 'replace')\n const id = `${options.moduleId}.component-override.${index}:${handle}`\n const contribution = contributionBase(id, sourcePath, 'componentOverrides')\n return {\n ...contribution,\n kind: 'component-override',\n targets: [target(handle)],\n details: {\n handle,\n mode,\n propsContract: stringValue(entry.propsContract) ?? 'component-props-schema',\n },\n }\n },\n })\n}\n\nfunction extractSpecializedRegistries(options: ExtractModuleExtensionFactsOptions): ModuleExtensionContributionFact[] {\n const facts: ModuleExtensionContributionFact[] = []\n const add = (\n id: string,\n registry: SpecializedRegistry,\n sourcePath: string,\n specialistRoute: string,\n symbol = id,\n ): void => {\n const contributionId = `${registry}:${id}`\n const contribution = contributionBase(contributionId, sourcePath, id)\n const fact: ModuleExtensionContributionFact = {\n ...contribution,\n kind: 'specialized-registry',\n targets: [factTarget(id, specialistRoute)],\n source: { path: sourcePath, symbol },\n details: { registry, registryId: id, specialistRoute },\n }\n const existingIndex = facts.findIndex((entry) => entry.id === contributionId)\n if (existingIndex >= 0) facts[existingIndex] = fact\n else facts.push(fact)\n }\n for (const id of options.notifications ?? []) add(id, 'notification', path.posix.join(options.sourceRoot, 'notifications.ts'), 'notifications')\n for (const id of options.searchEntities) add(id, 'search', path.posix.join(options.sourceRoot, 'search.ts'), 'search')\n for (const tool of options.aiTools ?? []) add(tool.name, 'ai', tool.sourcePath, 'aiTools')\n for (const agent of options.aiAgents ?? []) add(agent.id, 'ai', agent.sourcePath, 'aiAgents')\n\n const vectorPath = conventionPath(options.moduleRoot, 'vector.ts')\n if (vectorPath) {\n const vectorConfig = readRootObject(vectorPath, 'vectorConfig') ?? readRootObject(vectorPath, 'config')\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, vectorPath)\n if (vectorConfig && Array.isArray(vectorConfig.entities)) {\n for (const entity of vectorConfig.entities) {\n if (!isStaticObject(entity)) continue\n const entityId = stringValue(entity.entityId)\n if (entityId) add(entityId, 'vector', sourcePath, 'vector', 'vectorConfig')\n }\n }\n }\n\n const integrationPath = conventionPath(options.moduleRoot, 'integration.ts')\n if (integrationPath) {\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, integrationPath)\n const addIntegration = (integration: StaticObject, symbol: string, bundleId?: string): void => {\n const integrationId = stringValue(integration.id)\n if (integrationId) {\n add(integrationId, 'integration', sourcePath, 'integrations', bundleId ? `${symbol}[${bundleId}]` : symbol)\n }\n const providerKey = stringValue(integration.providerKey)\n const category = stringValue(integration.category)\n const categoryRegistry = category === 'payment' ? 'payment'\n : category === 'shipping' ? 'shipping'\n : category === 'currency' ? 'currency'\n : null\n if (providerKey && categoryRegistry) {\n const specialistRoute = categoryRegistry === 'payment' ? 'paymentGateways'\n : categoryRegistry === 'shipping' ? 'shippingCarriers'\n : 'currencies'\n add(providerKey, categoryRegistry, sourcePath, specialistRoute, `${symbol}.providerKey`)\n }\n }\n const singular = readRootObject(integrationPath, 'integration')\n if (singular) addIntegration(singular, 'integration')\n for (const integration of readConventionObjectArray(integrationPath, 'integrations')) {\n addIntegration(integration, 'integrations')\n }\n const bundle = readRootObject(integrationPath, 'integrationBundle') ?? readRootObject(integrationPath, 'bundle')\n if (bundle) {\n const bundleId = stringValue(bundle.id) ?? 'bundle'\n const members = Array.isArray(bundle.integrations) ? bundle.integrations : []\n for (const member of members) {\n if (isStaticObject(member)) addIntegration(member, 'integrationBundle', bundleId)\n }\n }\n }\n\n const workflowsPath = conventionPath(options.moduleRoot, 'workflows.ts')\n if (workflowsPath) {\n const config = readRootObject(workflowsPath, 'workflowsConfig')\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, workflowsPath)\n if (config && Array.isArray(config.workflows)) {\n for (const workflow of config.workflows) {\n if (!isStaticObject(workflow)) continue\n const workflowId = stringValue(workflow.workflowId)\n if (workflowId) add(workflowId, 'workflow', sourcePath, 'workflows', 'workflowsConfig')\n }\n }\n }\n\n const diPath = conventionPath(options.moduleRoot, 'di.ts')\n if (diPath) {\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, diPath)\n const registrations = readCallObjectArguments(diPath, new Set([\n 'registerPaymentGatewayDescriptor',\n 'registerShippingAdapter',\n 'registerCurrencyProvider',\n ]))\n for (const registration of registrations) {\n const registry = registration.callee === 'registerPaymentGatewayDescriptor' ? 'payment'\n : registration.callee === 'registerShippingAdapter' ? 'shipping'\n : 'currency'\n const registryId = stringValue(registration.value.providerKey)\n ?? stringValue(registration.value.key)\n ?? stringValue(registration.value.id)\n if (!registryId) continue\n const specialistRoute = registry === 'payment' ? 'paymentGateways'\n : registry === 'shipping' ? 'shippingCarriers'\n : 'currencies'\n add(registryId, registry, sourcePath, specialistRoute, registration.callee)\n }\n }\n\n const dashboardRoots = { appBase: path.join(options.moduleRoot, '__app__'), pkgBase: options.moduleRoot }\n for (const widgetFile of scanModuleDir(dashboardRoots, SCAN_CONFIGS.dashboardWidgets)) {\n const filePath = path.join(options.moduleRoot, 'widgets', 'dashboard', widgetFile.relPath)\n const widget = readRootObject(filePath, 'widget')\n const metadata = widget && isStaticObject(widget.metadata) ? widget.metadata : null\n if (!metadata) continue\n const widgetId = stringValue(metadata.id)\n if (!widgetId) continue\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, filePath)\n const contribution = contributionBase(`dashboard:${widgetId}`, sourcePath, 'widget.metadata')\n facts.push({\n ...contribution,\n kind: 'widget',\n targets: [target(`dashboard:${widgetId}`)],\n features: strings(metadata.features),\n details: {\n payload: 'dashboard',\n registryKey: widgetId,\n executionGuard: strings(metadata.features).length > 0 ? 'both' : 'host',\n },\n })\n }\n return facts\n}\n\n/**\n * Closed activation-adapter registry (Spec 2). Each `ModuleExtensionActivationKind`\n * maps to the contribution kinds it can bind and to the mode by which a `bound`\n * resolution is proven:\n *\n * - `call-site-object` \u2014 the host module owns a distinct opt-in call site (a\n * `makeCrudRoute` option or a mutation-guard bridge). Presence of the option \u2014\n * NOT mere entity/route existence \u2014 produces an emitted `ModuleExtensionActivation`\n * object. This is what makes \"the entity could host X\" (capability-only) different\n * from \"this route actually activates X\" (bound).\n * - `host-reference` \u2014 the runtime bridge is universal for any matching host\n * (every api route runs the interceptor pipeline; a bound widget/component host\n * proves consumption). No object is duplicated; `bound` is derived from the\n * existing bound host fact and the incoming row carries no `activationId`.\n * - `owner-reference` \u2014 like host-reference but proven by the target module owning\n * the concrete runtime id (command ids have no host fact of their own).\n *\n * The registry is exhaustive by construction: the `Record` key set is the full\n * `ModuleExtensionActivationKind` union, so adding a kind fails the typecheck until\n * it is classified. `activation-adapter-coverage.test.ts` re-checks this at runtime.\n */\ntype ActivationAdapterMode = 'call-site-object' | 'host-reference' | 'owner-reference'\n\nexport const ACTIVATION_ADAPTERS: Record<ModuleExtensionActivationKind, {\n contributionKinds: ModuleExtensionContributionKind[]\n mode: ActivationAdapterMode\n}> = {\n 'crud-response-enricher': { contributionKinds: ['response-enricher'], mode: 'call-site-object' },\n 'query-enricher': { contributionKinds: ['response-enricher'], mode: 'call-site-object' },\n 'mutation-guard': { contributionKinds: ['mutation-guard'], mode: 'call-site-object' },\n 'api-interceptor-bridge': { contributionKinds: ['api-interceptor'], mode: 'host-reference' },\n 'command-interceptor-bridge': { contributionKinds: ['command-interceptor'], mode: 'owner-reference' },\n 'widget-injection-consumer': { contributionKinds: ['widget', 'data-table', 'crud-form'], mode: 'host-reference' },\n 'component-extension-consumer': { contributionKinds: ['component-override'], mode: 'host-reference' },\n 'dashboard-host-consumer': { contributionKinds: ['widget'], mode: 'host-reference' },\n}\n\n/**\n * Every UMES contribution kind classified against the activation registry: either\n * the ordered set of activation kinds that can bind it, or `capability-only` for\n * contributions that are always active by declaration/registration and never gain\n * a route/entity activation. Exhaustive by `Record` construction \u2014 a new kind fails\n * the typecheck until classified.\n */\nexport const CONTRIBUTION_ACTIVATION_CLASSIFICATION: Record<\n ModuleExtensionContributionKind,\n ModuleExtensionActivationKind[] | 'capability-only'\n> = {\n 'response-enricher': ['crud-response-enricher', 'query-enricher'],\n 'mutation-guard': ['mutation-guard'],\n 'api-interceptor': ['api-interceptor-bridge'],\n 'command-interceptor': ['command-interceptor-bridge'],\n 'widget': ['widget-injection-consumer', 'dashboard-host-consumer'],\n 'data-table': ['widget-injection-consumer'],\n 'crud-form': ['widget-injection-consumer'],\n 'component-override': ['component-extension-consumer'],\n 'entity-extension': 'capability-only',\n 'subscriber': 'capability-only',\n 'browser-reaction': 'capability-only',\n 'specialized-registry': 'capability-only',\n 'module-override': 'capability-only',\n}\n\nexport const ALL_ACTIVATION_KINDS = Object.keys(ACTIVATION_ADAPTERS) as ModuleExtensionActivationKind[]\nexport const ALL_CONTRIBUTION_KINDS = Object.keys(CONTRIBUTION_ACTIVATION_CLASSIFICATION) as ModuleExtensionContributionKind[]\n\n/**\n * Verified mutation-guard bridge shapes. The canonical route helper nests the\n * resource under `input` (`runRouteMutationGuards({ \u2026, input: { resourceKind } })`),\n * while the legacy helpers take the resource object directly. Module wrappers around\n * the canonical helper live under `lib/` as often as under `api/`, so both trees are\n * scanned.\n */\nconst MUTATION_GUARD_BRIDGE_ADAPTERS: Record<string, { resourceArgument: 'input-property' | 'any-argument' }> = {\n runRouteMutationGuards: { resourceArgument: 'input-property' },\n validateCrudMutationGuard: { resourceArgument: 'any-argument' },\n runMutationGuards: { resourceArgument: 'any-argument' },\n}\n\nconst MUTATION_GUARD_SOURCE_DIRECTORIES = ['api', 'lib'] as const\n\nconst MUTATION_GUARD_OPERATIONS = new Set(['create', 'update', 'delete', 'custom'])\n\n/**\n * `'custom'` action endpoints are mapped by `toRegistryMutationOperation` onto the\n * closest registry operation, `'update'`.\n */\nfunction toRegistryGuardOperation(operation: string): string {\n return operation === 'custom' ? 'update' : operation\n}\n\nfunction readMutationGuardBridge(\n node: ts.CallExpression,\n context: StaticContext,\n): { entityId: string; operations: string[] } | null {\n const callee = node.expression\n const calleeName = ts.isIdentifier(callee)\n ? callee.text\n : ts.isPropertyAccessExpression(callee)\n ? callee.name.text\n : null\n const adapter = calleeName ? MUTATION_GUARD_BRIDGE_ADAPTERS[calleeName] : undefined\n if (!adapter) return null\n\n const argumentObjects = node.arguments\n .map((argument) => staticValue(argument, context))\n .filter(isStaticObject)\n const resourceObjects = adapter.resourceArgument === 'input-property'\n ? argumentObjects.flatMap((argumentObject) => (isStaticObject(argumentObject.input) ? [argumentObject.input] : []))\n : argumentObjects\n for (const resourceObject of resourceObjects) {\n const entityId = stringValue(resourceObject.resourceKind) ?? stringValue(resourceObject.entityId)\n if (!entityId) continue\n const declaredOperation = stringValue(resourceObject.operation)\n const operations = declaredOperation && MUTATION_GUARD_OPERATIONS.has(declaredOperation)\n ? [toRegistryGuardOperation(declaredOperation)]\n : []\n return { entityId, operations }\n }\n return null\n}\n\nfunction nodeLine(file: ts.SourceFile, node: ts.Node): number {\n return file.getLineAndCharacterOfPosition(node.getStart(file)).line + 1\n}\n\nfunction activationId(host: ModuleExtensionTargetRef, kind: ModuleExtensionActivationKind): string {\n const method = host.method ? `:${host.method}` : ''\n return `${host.kind}:${host.id}${method}:${kind}`\n}\n\nfunction sortActivations(activations: ModuleExtensionActivation[]): ModuleExtensionActivation[] {\n return [...activations].sort((left, right) => left.id.localeCompare(right.id))\n}\n\n/**\n * Extract the `call-site-object` activations (CRUD response/query enrichers and\n * mutation guards) from a module's real `api/**` opt-in sites. Entity or route\n * presence alone never lands here \u2014 only a literal `enrichers: { entityId }`\n * option or a mutation-guard bridge call with a static `resourceKind`/`entityId`.\n */\n/**\n * `<engine>.query(entityId, { \u2026, extensions })` \u2014 the only call shape that enables the\n * query-engine enricher and sync query-lifecycle stages.\n */\nfunction isQueryWithExtensionsCall(node: ts.Node, context: StaticContext): node is ts.CallExpression {\n if (!ts.isCallExpression(node)) return false\n const callee = node.expression\n const calleeName = ts.isPropertyAccessExpression(callee)\n ? callee.name.text\n : ts.isIdentifier(callee)\n ? callee.text\n : null\n if (calleeName !== 'query') return false\n const queryOptions = node.arguments[1] ? staticValue(node.arguments[1], context) : undefined\n return isStaticObject(queryOptions) && queryOptions.extensions !== undefined\n}\n\nfunction extractCallSiteActivations(options: ExtractModuleExtensionFactsOptions): ModuleExtensionActivation[] {\n const activations: ModuleExtensionActivation[] = []\n const byId = new Map<string, ModuleExtensionActivation>()\n const push = (activation: ModuleExtensionActivation): void => {\n const existing = byId.get(activation.id)\n if (existing) {\n if (!existing.operations || !activation.operations) {\n delete existing.operations\n } else {\n existing.operations = [...new Set([...existing.operations, ...activation.operations])]\n .sort((left, right) => left.localeCompare(right))\n }\n return\n }\n byId.set(activation.id, activation)\n activations.push(activation)\n }\n const scannedFiles = MUTATION_GUARD_SOURCE_DIRECTORIES\n .flatMap((directory) => sourceFilesBelow(path.join(options.moduleRoot, directory)))\n for (const filePath of scannedFiles) {\n const file = sourceFile(filePath)\n if (!file) continue\n const context = buildStaticContext(file)\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, filePath)\n const visit = (node: ts.Node): void => {\n // `enrichers: { entityId }` on a CRUD route runs `applyResponseEnrichers` after the\n // list/detail hook. It does NOT enable the query-engine enricher stage.\n if (ts.isPropertyAssignment(node) && propertyName(node.name) === 'enrichers') {\n const config = staticValue(node.initializer, context)\n const entityId = isStaticObject(config) ? stringValue(config.entityId) : undefined\n if (entityId) {\n const host: ModuleExtensionTargetRef = { kind: 'entity', id: entityId, moduleId: options.moduleId }\n push({\n id: activationId(host, 'crud-response-enricher'),\n kind: 'crud-response-enricher',\n host,\n contributionKinds: ['response-enricher'],\n source: { sourcePath, line: nodeLine(file, node) },\n })\n }\n }\n // The query-engine enricher stage runs only for a query that passes `extensions`,\n // so the bound call site is `queryEngine.query('<entityId>', { \u2026, extensions })`.\n if (isQueryWithExtensionsCall(node, context)) {\n const entityId = stringValue(staticValue(node.arguments[0], context))\n if (entityId) {\n const host: ModuleExtensionTargetRef = { kind: 'entity', id: entityId, moduleId: options.moduleId }\n push({\n id: activationId(host, 'query-enricher'),\n kind: 'query-enricher',\n host,\n contributionKinds: ['response-enricher'],\n source: { sourcePath, line: nodeLine(file, node) },\n })\n }\n }\n if (ts.isCallExpression(node)) {\n const bridge = readMutationGuardBridge(node, context)\n if (bridge) {\n const host: ModuleExtensionTargetRef = { kind: 'entity', id: bridge.entityId, moduleId: options.moduleId }\n push({\n id: activationId(host, 'mutation-guard'),\n kind: 'mutation-guard',\n host,\n contributionKinds: ['mutation-guard'],\n ...(bridge.operations.length > 0 ? { operations: bridge.operations } : {}),\n source: { sourcePath, line: nodeLine(file, node) },\n })\n }\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n }\n return sortActivations(activations)\n}\n\nexport function extractModuleExtensionFacts(options: ExtractModuleExtensionFactsOptions): ModuleExtensionSurfaceFacts {\n const declared = extractDeclaredHosts(options)\n const hosts = sortHosts([...declared.hosts, ...extractFactRefHosts(options)])\n const contributions = sortContributions([\n ...extractInjectionTable(options),\n ...extractEnrichers(options),\n ...extractApiInterceptors(options),\n ...extractCommandInterceptors(options),\n ...extractGuards(options),\n ...extractEntityExtensions(options),\n ...extractSubscribers(options),\n ...extractBrowserReactions(options),\n ...extractNotificationReactions(options),\n ...extractComponentOverrides(options),\n ...extractSpecializedRegistries(options),\n ])\n return {\n hosts,\n contributions,\n unresolved: declared.unresolved,\n activations: extractCallSiteActivations(options),\n }\n}\n\nfunction patternMatches(pattern: string, targetId: string): boolean {\n const escaped = pattern\n .replace(/[.+?^${}()|[\\]\\\\]/g, '\\\\$&')\n .replace(/\\\\\\{[^}]+\\\\\\}/g, '[^:]+')\n .replace(/\\*/g, '.*')\n return new RegExp(`^${escaped}$`).test(targetId)\n}\n\nfunction targetModuleId(targetId: string): string | null {\n const withoutPrefix = targetId.replace(/^(?:data-table|crud-form|detail|portal-page):/, '')\n const match = /^([a-z][a-z0-9_]*)[.:]/.exec(withoutPrefix)\n return match?.[1] ?? null\n}\n\nfunction normalizedEntityId(value: string): string {\n return value.replace(/^([a-z][a-z0-9_]*):/, '$1.')\n}\n\nfunction entityFactKeyForTarget(targetId: string, entityIds: ReadonlySet<string>): string | null {\n const normalizedTarget = normalizedEntityId(targetId)\n for (const entityId of entityIds) {\n const normalizedEntity = normalizedEntityId(entityId)\n if (normalizedTarget === normalizedEntity) return entityId\n if (normalizedTarget.startsWith(`${normalizedEntity}.`) && /\\.(?:creating|created|updating|updated|deleting|deleted)$/.test(normalizedTarget)) {\n return entityId\n }\n }\n return null\n}\n\nexport function correlateExtensionTarget(\n targetFact: ModuleExtensionTargetFact,\n options: CorrelateExtensionFactsOptions,\n): ModuleExtensionTargetFact {\n if (targetFact.resolution !== 'unresolved') return targetFact\n const allHosts = Object.values(options.surfacesByModule).flatMap((surface) => surface.hosts)\n if (targetFact.id.includes('*') || targetFact.id.includes('{')) {\n const knownIds = [\n ...allHosts.filter((host) => host.bound).map((host) => host.id),\n ...options.entityIds,\n ...options.eventIds,\n ...options.apiRoutes,\n ...(options.commandIds ?? []),\n ]\n if (targetFact.id === '*' || knownIds.some((knownId) => patternMatches(targetFact.id, knownId))) {\n return { id: targetFact.id, resolution: 'pattern' }\n }\n }\n const exact = allHosts.find((host) => host.bound && (\n host.id === targetFact.id\n || host.aliases?.includes(targetFact.id)\n || (host.family === 'api-route' && host.id.endsWith(`/${targetFact.id}`))\n ))\n if (exact) {\n return exact.source.kind === 'fact-ref'\n ? factTarget(targetFact.id, exact.source.factSection, exact.source.factKey)\n : { id: targetFact.id, resolution: 'exact' }\n }\n const patterned = allHosts.find((host) => host.bound && host.resolution === 'pattern' && patternMatches(host.id, targetFact.id))\n if (patterned) return { id: targetFact.id, resolution: 'pattern' }\n const framework = allFrameworkHosts().find((host) => patternMatches(host.id, targetFact.id))\n ?? (FRAMEWORK_PREFIXES.some((prefix) => targetFact.id.startsWith(prefix)) ? FRAMEWORK_HOSTS[0] : undefined)\n if (framework) return { id: targetFact.id, resolution: 'framework' }\n const entityFactKey = options.factsContractVersion === 1\n ? (options.entityIds.has(targetFact.id) ? targetFact.id : null)\n : entityFactKeyForTarget(targetFact.id, options.entityIds)\n if (entityFactKey) {\n return { id: targetFact.id, resolution: 'fact-ref', factRef: { factSection: 'entities', factKey: entityFactKey } }\n }\n if (options.eventIds.has(targetFact.id)) {\n return { id: targetFact.id, resolution: 'fact-ref', factRef: { factSection: 'events', factKey: targetFact.id } }\n }\n if (options.commandIds?.has(targetFact.id)) {\n return factTarget(targetFact.id, 'ownedContracts.command')\n }\n const route = [...options.apiRoutes].find((apiRoute) => apiRoute === targetFact.id || apiRoute.endsWith(`/${targetFact.id}`))\n if (route) return { id: targetFact.id, resolution: 'fact-ref', factRef: { factSection: 'apiRoutes', factKey: route } }\n const ownerModule = targetModuleId(targetFact.id)\n if (ownerModule && !options.surfacesByModule[ownerModule]) {\n return { id: targetFact.id, resolution: 'optional-external', optionalOwnerPackage: `module:${ownerModule}` }\n }\n if (ownerModule && options.contributingModuleId && ownerModule !== options.contributingModuleId) {\n return { id: targetFact.id, resolution: 'optional-external', optionalOwnerPackage: `module:${ownerModule}` }\n }\n return targetFact\n}\n\nexport function correlateModuleExtensionFacts(options: CorrelateExtensionFactsOptions): Record<string, ModuleExtensionSurfaceFacts> {\n const result: Record<string, ModuleExtensionSurfaceFacts> = {}\n for (const moduleId of Object.keys(options.surfacesByModule).sort((left, right) => left.localeCompare(right))) {\n const surface = options.surfacesByModule[moduleId]\n const unresolved: ModuleExtensionUnresolvedFact[] = [...surface.unresolved]\n const contributions = surface.contributions.map((contribution) => {\n const targets = contribution.targets.map((entry) => correlateExtensionTarget(entry, {\n ...options,\n contributingModuleId: moduleId,\n }))\n for (const entry of targets) {\n if (entry.resolution !== 'unresolved') continue\n unresolved.push({\n key: `${contribution.id}:${entry.id}`,\n source: contribution.source,\n reason: 'unresolved-first-party-target',\n })\n }\n return { ...contribution, targets }\n })\n result[moduleId] = {\n hosts: sortHosts([...surface.hosts]),\n contributions: sortContributions(contributions),\n unresolved: unresolved.sort((left, right) => left.key.localeCompare(right.key)),\n activations: sortActivations([...(surface.activations ?? [])]),\n }\n }\n return result\n}\n\ntype IncomingTargetOwner = {\n moduleId: string\n source: ModuleFactSourceRef\n /** Interceptor bridges the owning api route wires (api-route owners only). */\n bridges?: ApiRouteInterceptorBridge[]\n}\n\nexport interface CorrelateIncomingExtensionsOptions {\n surfacesByModule: Readonly<Record<string, ModuleExtensionSurfaceFacts>>\n /** Concrete runtime-id owner maps derived from the fully-selected module set. */\n apiRouteOwners?: ReadonlyMap<string, IncomingTargetOwner>\n commandOwners?: ReadonlyMap<string, IncomingTargetOwner>\n}\n\nfunction normalizeRouteId(routeId: string): string {\n return routeId.replace(/^\\//, '')\n}\n\n/**\n * Owner marker for a contribution bound to a framework host (dashboard, menus,\n * notifications, \u2026). Framework hosts have no module surface of their own, so the\n * activation is recorded on the contributor and never produces an incoming row.\n */\nconst FRAMEWORK_HOST_OWNER = 'framework'\n\n/**\n * Framework host families each host-reference adapter may bind, so a dashboard\n * contribution resolves through `dashboard-host-consumer` rather than being claimed\n * by the generic widget-injection adapter that runs first.\n */\nconst FRAMEWORK_HOST_FAMILIES_BY_ACTIVATION: Partial<Record<ModuleExtensionActivationKind, ExtensionHostFamily[]>> = {\n 'dashboard-host-consumer': ['dashboard'],\n 'widget-injection-consumer': ['menu', 'generic', 'crud-form', 'data-table', 'notification', 'integration'],\n 'component-extension-consumer': ['component-handle'],\n}\n\n/**\n * Resolves a target id against the framework host catalog \u2014 exact ids first, then\n * the patterned entries (`dashboard:*`, `crud-form:*`, `integrations.detail:{id}`),\n * so a concrete `dashboard:<widget>` contribution reaches `framework.dashboard`.\n */\nfunction findFrameworkHost(\n targetId: string,\n activationKind: ModuleExtensionActivationKind,\n): ModuleExtensionHostFact | null {\n const families = FRAMEWORK_HOST_FAMILIES_BY_ACTIVATION[activationKind]\n if (!families) return null\n const candidates = FRAMEWORK_HOSTS.filter((host) => families.includes(host.family))\n const exact = candidates.find((host) => host.id === targetId)\n if (exact) return exact\n return candidates.find((host) => host.resolution === 'pattern' && patternMatches(host.id, targetId)) ?? null\n}\n\n/**\n * A call site that guards only some operations does not activate a contribution\n * declaring none of them. Either side leaving operations undeclared means \"any\".\n */\nfunction operationsIntersect(\n activationOperations: readonly string[] | undefined,\n contributionOperations: readonly string[] | undefined,\n): boolean {\n if (!activationOperations || activationOperations.length === 0) return true\n if (!contributionOperations || contributionOperations.length === 0) return true\n return contributionOperations.some((operation) => activationOperations.includes(operation))\n}\n\nfunction contributionSourceRef(contribution: ModuleExtensionContributionFact): ModuleFactSourceRef {\n return {\n sourcePath: contribution.source.path,\n ...(contribution.source.symbol ? { exportName: contribution.source.symbol } : {}),\n }\n}\n\nfunction targetRefKindFor(\n contribution: ModuleExtensionContributionFact,\n targetId: string,\n): ModuleExtensionTargetRef['kind'] {\n if (targetId === '*' || targetId.includes('*') || targetId.includes('{')) return 'wildcard'\n switch (contribution.kind) {\n case 'response-enricher':\n case 'mutation-guard':\n case 'entity-extension':\n return 'entity'\n case 'api-interceptor':\n return 'api-route'\n case 'command-interceptor':\n return 'command'\n case 'component-override':\n return 'component'\n case 'subscriber':\n return 'event'\n case 'browser-reaction':\n return contribution.details.transports.includes('notification-effect') ? 'notification' : 'event'\n case 'widget':\n case 'data-table':\n case 'crud-form':\n return 'widget-spot'\n case 'specialized-registry':\n case 'module-override':\n return 'module'\n default:\n return 'module'\n }\n}\n\n/**\n * Builds the bidirectional incoming/resolution index after every module fact is\n * extracted and target-correlated. For each contribution target it records one\n * contributor-owned `ModuleContributionResolution` and, when a concrete target\n * owner exists, one target-owned `ModuleIncomingExtensionRef` per matching\n * activation. It never duplicates contribution behavior metadata \u2014 incoming rows\n * point back to the source-owned contribution by `contributorModuleId + contributionId`.\n */\nexport function correlateIncomingExtensions(\n options: CorrelateIncomingExtensionsOptions,\n): Record<string, ModuleExtensionSurfaceFacts> {\n const moduleIds = Object.keys(options.surfacesByModule).sort((left, right) => left.localeCompare(right))\n const apiRouteOwners = options.apiRouteOwners ?? new Map<string, IncomingTargetOwner>()\n const commandOwners = options.commandOwners ?? new Map<string, IncomingTargetOwner>()\n\n // Index call-site activations by (kind, normalized host id).\n const activationIndex = new Map<string, Array<{ moduleId: string; activation: ModuleExtensionActivation }>>()\n const activationKey = (kind: ModuleExtensionActivationKind, hostKind: ModuleExtensionTargetRef['kind'], id: string): string => {\n const normId = hostKind === 'api-route' ? normalizeRouteId(id) : id\n return JSON.stringify([kind, hostKind, normId])\n }\n // Index bound hosts by their runtime id for host-reference resolution.\n const boundHostIndex = new Map<string, { moduleId: string; host: ModuleExtensionHostFact }>()\n\n for (const moduleId of moduleIds) {\n const surface = options.surfacesByModule[moduleId]\n for (const activation of surface.activations ?? []) {\n const key = activationKey(activation.kind, activation.host.kind, activation.host.id)\n const bucket = activationIndex.get(key)\n if (bucket) bucket.push({ moduleId, activation })\n else activationIndex.set(key, [{ moduleId, activation }])\n }\n for (const host of surface.hosts) {\n if (!host.bound) continue\n if (!boundHostIndex.has(host.id)) boundHostIndex.set(host.id, { moduleId, host })\n }\n }\n\n const incomingByModule: Record<string, ModuleIncomingExtensionRef[]> = {}\n const resolutionsByModule: Record<string, ModuleContributionResolution[]> = {}\n const syntheticActivations: Record<string, ModuleExtensionActivation[]> = {}\n for (const moduleId of moduleIds) {\n incomingByModule[moduleId] = []\n resolutionsByModule[moduleId] = []\n syntheticActivations[moduleId] = []\n }\n const registerSyntheticActivation = (ownerModule: string, activation: ModuleExtensionActivation): void => {\n if (!syntheticActivations[ownerModule]) syntheticActivations[ownerModule] = []\n if (!syntheticActivations[ownerModule].some((entry) => entry.id === activation.id)) {\n syntheticActivations[ownerModule].push(activation)\n }\n }\n\n const findCallSiteActivations = (\n contributionKind: ModuleExtensionContributionKind,\n activationKinds: ModuleExtensionActivationKind[],\n targetRef: ModuleExtensionTargetRef,\n contributionOperations: readonly string[] | undefined,\n ): Array<{ moduleId: string; activation: ModuleExtensionActivation }> => {\n const matches: Array<{ moduleId: string; activation: ModuleExtensionActivation }> = []\n for (const kind of activationKinds) {\n if (ACTIVATION_ADAPTERS[kind].mode !== 'call-site-object') continue\n const bucket = activationIndex.get(activationKey(kind, targetRef.kind, targetRef.id)) ?? []\n for (const entry of bucket) {\n if (!entry.activation.contributionKinds.includes(contributionKind)) continue\n if (!operationsIntersect(entry.activation.operations, contributionOperations)) continue\n matches.push(entry)\n }\n }\n return matches.sort((left, right) => left.activation.id.localeCompare(right.activation.id))\n }\n\n for (const contributorModuleId of moduleIds) {\n const surface = options.surfacesByModule[contributorModuleId]\n for (const contribution of surface.contributions) {\n const classification = CONTRIBUTION_ACTIVATION_CLASSIFICATION[contribution.kind]\n for (const resolvedTarget of contribution.targets) {\n const targetKind = targetRefKindFor(contribution, resolvedTarget.id)\n const baseTarget: ModuleExtensionTargetRef = { kind: targetKind, id: resolvedTarget.id }\n\n let resolution: ModuleExtensionResolution\n let ownerModule: string | null = null\n let boundActivationIds: string[] = []\n\n if (targetKind === 'wildcard' || resolvedTarget.resolution === 'pattern') {\n resolution = 'wildcard'\n } else if (resolvedTarget.resolution === 'optional-external') {\n resolution = 'optional-target-missing'\n } else if (resolvedTarget.resolution === 'unresolved') {\n resolution = 'unresolved'\n } else {\n const activationKinds = classification === 'capability-only' ? [] : classification\n const callSiteMatches = findCallSiteActivations(\n contribution.kind,\n activationKinds,\n baseTarget,\n contribution.operations,\n )\n if (callSiteMatches.length > 0) {\n resolution = 'bound'\n ownerModule = callSiteMatches[0].moduleId\n boundActivationIds = callSiteMatches.map((entry) => entry.activation.id)\n } else {\n const referenceBinding = resolveReferenceBinding({\n contribution,\n activationKinds,\n targetRef: baseTarget,\n boundHostIndex,\n apiRouteOwners,\n commandOwners,\n })\n if (referenceBinding) {\n resolution = 'bound'\n // A framework host owns no module surface: record the activation on the\n // contributor and leave `ownerModule` unset so no incoming row is emitted.\n const isFrameworkHost = referenceBinding.ownerModule === FRAMEWORK_HOST_OWNER\n ownerModule = isFrameworkHost ? null : referenceBinding.ownerModule\n const activationOwner = isFrameworkHost ? contributorModuleId : referenceBinding.ownerModule\n for (const activation of referenceBinding.activations) {\n registerSyntheticActivation(activationOwner, activation)\n }\n boundActivationIds = referenceBinding.activations.map((activation) => activation.id)\n } else {\n const hostOwner = boundHostIndex.get(resolvedTarget.id)\n if (hostOwner) {\n resolution = 'capability-only'\n ownerModule = hostOwner.moduleId\n } else {\n resolution = 'capability-only'\n ownerModule = null\n }\n }\n }\n }\n\n const resolutionTarget: ModuleExtensionTargetRef = ownerModule\n ? { ...baseTarget, moduleId: ownerModule }\n : baseTarget\n resolutionsByModule[contributorModuleId].push({\n contributionId: contribution.id,\n target: resolutionTarget,\n resolution,\n activationIds: [...boundActivationIds].sort((left, right) => left.localeCompare(right)),\n })\n\n // Incoming rows document contributions installed by OTHER modules onto a\n // target module's surface (cross-module discovery). Same-module targets are\n // already fully covered by the contributor-owned resolution row above, so\n // emitting a self-incoming row would only duplicate that fact and bloat the\n // generated context.\n if (ownerModule && ownerModule !== contributorModuleId && (resolution === 'bound' || resolution === 'capability-only')) {\n const source = contributionSourceRef(contribution)\n const incomingTarget: ModuleExtensionTargetRef = { ...baseTarget, moduleId: ownerModule }\n if (resolution === 'bound' && boundActivationIds.length > 0) {\n for (const activationRefId of boundActivationIds) {\n incomingByModule[ownerModule].push({\n contributionId: contribution.id,\n contributionKind: contribution.kind,\n contributorModuleId,\n target: incomingTarget,\n activationId: activationRefId,\n resolution: 'bound',\n source,\n })\n }\n } else {\n incomingByModule[ownerModule].push({\n contributionId: contribution.id,\n contributionKind: contribution.kind,\n contributorModuleId,\n target: incomingTarget,\n resolution,\n source,\n })\n }\n }\n }\n }\n }\n\n const result: Record<string, ModuleExtensionSurfaceFacts> = {}\n for (const moduleId of moduleIds) {\n const surface = options.surfacesByModule[moduleId]\n result[moduleId] = {\n ...surface,\n activations: sortActivations([...(surface.activations ?? []), ...syntheticActivations[moduleId]]),\n incoming: dedupeIncoming(incomingByModule[moduleId]),\n contributionResolutions: sortResolutions(resolutionsByModule[moduleId]),\n }\n }\n return result\n}\n\n/**\n * Intersects an api-interceptor contribution's declared methods and phases with the\n * bridges its target route actually wires. A route with no bridge, a phase the route\n * never runs, or a method the route does not handle yields no binding, so the\n * contribution stays `capability-only` instead of being reported as active.\n */\nfunction matchApiInterceptorBridges(\n contribution: ModuleExtensionContributionFact,\n owner: IncomingTargetOwner,\n): ApiRouteInterceptorBridge[] {\n if (contribution.kind !== 'api-interceptor') return []\n const bridges = owner.bridges ?? []\n const declaredMethods = contribution.details.methods ?? []\n const declaredPhases = contribution.phases ?? []\n const matched: ApiRouteInterceptorBridge[] = []\n for (const bridge of bridges) {\n if (declaredMethods.length > 0 && !declaredMethods.includes(bridge.method)) continue\n const phases = declaredPhases.length > 0\n ? bridge.phases.filter((phase) => declaredPhases.includes(phase))\n : bridge.phases\n if (phases.length === 0) continue\n matched.push({ method: bridge.method, phases })\n }\n return matched\n}\n\nfunction resolveReferenceBinding(input: {\n contribution: ModuleExtensionContributionFact\n activationKinds: ModuleExtensionActivationKind[]\n targetRef: ModuleExtensionTargetRef\n boundHostIndex: ReadonlyMap<string, { moduleId: string; host: ModuleExtensionHostFact }>\n apiRouteOwners: ReadonlyMap<string, IncomingTargetOwner>\n commandOwners: ReadonlyMap<string, IncomingTargetOwner>\n}): { ownerModule: string; activations: ModuleExtensionActivation[] } | null {\n for (const kind of input.activationKinds) {\n const adapter = ACTIVATION_ADAPTERS[kind]\n if (adapter.mode === 'call-site-object') continue\n if (!adapter.contributionKinds.includes(input.contribution.kind)) continue\n\n if (adapter.mode === 'host-reference' && kind === 'api-interceptor-bridge') {\n const routeId = normalizeRouteId(input.targetRef.id)\n const owner = input.apiRouteOwners.get(routeId)\n if (!owner) continue\n const matchedBridges = matchApiInterceptorBridges(input.contribution, owner)\n if (matchedBridges.length === 0) continue\n return {\n ownerModule: owner.moduleId,\n activations: matchedBridges.map((bridge) => {\n const host: ModuleExtensionTargetRef = {\n kind: 'api-route',\n id: routeId,\n moduleId: owner.moduleId,\n method: bridge.method,\n }\n return {\n id: activationId(host, kind),\n kind,\n host,\n contributionKinds: ['api-interceptor'],\n phases: bridge.phases,\n source: owner.source,\n bridge: { factSection: 'apiRoutes', factKey: `/${routeId}` },\n }\n }),\n }\n }\n\n if (adapter.mode === 'owner-reference' && kind === 'command-interceptor-bridge') {\n const owner = input.commandOwners.get(input.targetRef.id)\n if (!owner) continue\n const host: ModuleExtensionTargetRef = { kind: 'command', id: input.targetRef.id, moduleId: owner.moduleId }\n return {\n ownerModule: owner.moduleId,\n activations: [{\n id: activationId(host, kind),\n kind,\n host,\n contributionKinds: ['command-interceptor'],\n source: owner.source,\n bridge: { factSection: 'ownedContracts.command', factKey: input.targetRef.id },\n }],\n }\n }\n\n if (adapter.mode === 'host-reference' && (kind === 'widget-injection-consumer' || kind === 'component-extension-consumer' || kind === 'dashboard-host-consumer')) {\n const frameworkHostFact = input.boundHostIndex.has(input.targetRef.id)\n ? null\n : findFrameworkHost(input.targetRef.id, kind)\n const hostEntry = input.boundHostIndex.get(input.targetRef.id)\n ?? (frameworkHostFact ? { moduleId: FRAMEWORK_HOST_OWNER, host: frameworkHostFact } : undefined)\n if (!hostEntry) continue\n const hostSource = hostReferenceSource(hostEntry.host)\n if (!hostSource) continue\n const host: ModuleExtensionTargetRef = { ...input.targetRef, moduleId: hostEntry.moduleId }\n return {\n ownerModule: hostEntry.moduleId,\n activations: [{\n id: activationId(host, kind),\n kind,\n host,\n contributionKinds: adapter.contributionKinds,\n source: hostSource,\n bridge: { factSection: 'hosts', factKey: hostEntry.host.key },\n }],\n }\n }\n }\n return null\n}\n\nfunction hostReferenceSource(host: ModuleExtensionHostFact): ModuleFactSourceRef | null {\n if (host.source.kind === 'declaration' || host.source.kind === 'framework') {\n return { sourcePath: host.source.path, exportName: host.source.symbol }\n }\n return null\n}\n\nfunction incomingIdentity(entry: ModuleIncomingExtensionRef): string {\n const target = JSON.stringify([entry.target.kind, entry.target.id])\n return JSON.stringify([entry.contributorModuleId, entry.contributionId, target, entry.activationId ?? entry.resolution])\n}\n\nfunction dedupeIncoming(entries: ModuleIncomingExtensionRef[]): ModuleIncomingExtensionRef[] {\n const seen = new Set<string>()\n const unique: ModuleIncomingExtensionRef[] = []\n for (const entry of entries) {\n const identity = incomingIdentity(entry)\n if (seen.has(identity)) continue\n seen.add(identity)\n unique.push(entry)\n }\n return unique.sort((left, right) => incomingIdentity(left).localeCompare(incomingIdentity(right)))\n}\n\nfunction resolutionIdentity(entry: ModuleContributionResolution): string {\n return JSON.stringify([entry.contributionId, entry.target.kind, entry.target.id, entry.resolution])\n}\n\nfunction sortResolutions(entries: ModuleContributionResolution[]): ModuleContributionResolution[] {\n const seen = new Set<string>()\n const unique: ModuleContributionResolution[] = []\n for (const entry of entries) {\n const identity = resolutionIdentity(entry)\n if (seen.has(identity)) continue\n seen.add(identity)\n unique.push(entry)\n }\n return unique.sort((left, right) => resolutionIdentity(left).localeCompare(resolutionIdentity(right)))\n}\n\nexport function assertNoUnresolvedExtensionTargets(\n surfacesByModule: Readonly<Record<string, ModuleExtensionSurfaceFacts>>,\n): void {\n const unresolved = Object.entries(surfacesByModule).flatMap(([moduleId, surface]) =>\n surface.unresolved\n .filter((entry) => entry.reason === 'unresolved-first-party-target')\n .map((entry) => `${moduleId}:${entry.key}`),\n ).sort((left, right) => left.localeCompare(right))\n if (unresolved.length > 0) {\n throw new Error(`[module-facts] unresolved first-party extension targets: ${unresolved.join(', ')}`)\n }\n}\n\n/**\n * Supported merge/replace/disable modes for each dotted unified-override host,\n * derived from {@link FRAMEWORK_OVERRIDE_HOSTS} (the framework catalog authority\n * \u2014 spec 2026-08-02-module-facts-exact-override-targets). Keyed by the dotted\n * host id (e.g. `routes.api`, `ai.extensions`, `nav.groupOrder`) so the module\n * override-target adapters share one mode source of truth with the catalog.\n *\n * @deprecated Use {@link getFrameworkOverrideHostOperations}. This helper drops any host whose\n * declared operation is not one of the three recognized modes, which collapses \"the catalog does\n * not describe this host\" into \"the catalog describes it with a mode this generator has fallen\n * behind on\" \u2014 the distinction the `unknown-framework-domain` / `unknown-framework-mode`\n * diagnostics exist to keep apart. Every in-tree consumer has moved; the export is retained\n * because `BACKWARD_COMPATIBILITY.md` classifies exported generator helpers as removable only\n * through the deprecation protocol, and it stays behaviour-identical for as long as it exists.\n */\nexport function getFrameworkOverrideModes(\n hosts: readonly ModuleExtensionHostFact[] = FRAMEWORK_OVERRIDE_HOSTS,\n): Record<string, 'disable-replace' | 'replace' | 'additive'> {\n const modes: Record<string, 'disable-replace' | 'replace' | 'additive'> = {}\n for (const [dotted, operation] of Object.entries(getFrameworkOverrideHostOperations(hosts))) {\n if (operation === 'disable-replace' || operation === 'replace' || operation === 'additive') {\n modes[dotted] = operation\n }\n }\n return modes\n}\n\n/**\n * The catalog's declared first operation for every dotted unified-override host,\n * **without** validating it against the known mode set.\n *\n * {@link getFrameworkOverrideModes} silently drops a host whose operation is not a\n * recognized mode, which makes \"the catalog does not describe this host at all\"\n * indistinguishable from \"the catalog describes it with a mode this generator does\n * not understand\". Consumers that must tell those apart (the override-target\n * adapters, which emit different diagnostics for each) read the raw operations\n * here instead \u2014 spec `2026-07-31-standalone-canonical-example-module.md`,\n * \u00A7 PR #4883 Module-Fact and Extension-Topology Contract.\n *\n * `hosts` defaults to the framework catalog. Every catalog host declares a valid\n * mode today, so the pass-through is unobservable against the real catalog; passing\n * an explicit host list is how `module-override-targets.unknown-mode.test.ts` proves\n * that an operation this generator does not recognize really does survive here.\n */\nexport function getFrameworkOverrideHostOperations(\n hosts: readonly ModuleExtensionHostFact[] = FRAMEWORK_OVERRIDE_HOSTS,\n): Record<string, string> {\n const operations: Record<string, string> = {}\n for (const host of hosts) {\n const dotted = host.key.replace(/^framework\\.module-override\\./, '')\n const operation = host.operations?.[0]\n if (typeof operation === 'string') operations[dotted] = operation\n }\n return operations\n}\n\nexport function getFrameworkExtensionHosts(): ModuleExtensionHostFact[] {\n return sortHosts(allFrameworkHosts().map((host) => ({\n ...host,\n capabilities: [...host.capabilities],\n ...(host.operations ? { operations: [...host.operations] } : {}),\n })))\n}\n\nexport function renderFrameworkExtensionPointsMarkdown(): string {\n const rows = getFrameworkExtensionHosts().map((host) =>\n `| ${host.id} | ${host.family} | ${[...host.capabilities, ...(host.operations ?? [])].join(', ')} | ${host.stability.toUpperCase()} |`,\n )\n return [\n '# Framework extension points (generated, do not edit)',\n '',\n '| ID / pattern | Family | Supports | Stability |',\n '|---|---|---|---|',\n ...rows,\n '',\n ].join('\\n')\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["firstArgument", "id", "fact", "target"]
7
7
  }