@open-mercato/cli 0.6.7-develop.6756.1.5300c41145 → 0.6.7-develop.6766.1.40c9011995

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 (79) hide show
  1. package/.turbo/turbo-build.log +1 -1
  2. package/build.mjs +2 -1
  3. package/dist/agentic/guides/extensions.md +20 -3
  4. package/dist/agentic/guides/framework-extension-points.md +36 -0
  5. package/dist/agentic/guides/module-facts.json +39708 -230
  6. package/dist/agentic/guides/modules/ai_assistant.md +49 -9
  7. package/dist/agentic/guides/modules/api_docs.md +11 -1
  8. package/dist/agentic/guides/modules/api_keys.md +24 -1
  9. package/dist/agentic/guides/modules/attachments.md +22 -6
  10. package/dist/agentic/guides/modules/audit_logs.md +35 -1
  11. package/dist/agentic/guides/modules/auth.md +79 -15
  12. package/dist/agentic/guides/modules/business_rules.md +36 -3
  13. package/dist/agentic/guides/modules/catalog.md +160 -22
  14. package/dist/agentic/guides/modules/channel_gmail.md +14 -1
  15. package/dist/agentic/guides/modules/channel_imap.md +14 -1
  16. package/dist/agentic/guides/modules/checkout.md +134 -19
  17. package/dist/agentic/guides/modules/communication_channels.md +110 -20
  18. package/dist/agentic/guides/modules/configs.md +15 -1
  19. package/dist/agentic/guides/modules/content.md +11 -1
  20. package/dist/agentic/guides/modules/currencies.md +50 -9
  21. package/dist/agentic/guides/modules/customer_accounts.md +151 -28
  22. package/dist/agentic/guides/modules/customers.md +299 -52
  23. package/dist/agentic/guides/modules/dashboards.md +30 -1
  24. package/dist/agentic/guides/modules/data_sync.md +40 -7
  25. package/dist/agentic/guides/modules/dictionaries.md +24 -6
  26. package/dist/agentic/guides/modules/directory.md +52 -9
  27. package/dist/agentic/guides/modules/entities.md +41 -1
  28. package/dist/agentic/guides/modules/events.md +11 -1
  29. package/dist/agentic/guides/modules/feature_toggles.md +15 -1
  30. package/dist/agentic/guides/modules/gateway_stripe.md +14 -1
  31. package/dist/agentic/guides/modules/generators.md +11 -1
  32. package/dist/agentic/guides/modules/inbox_ops.md +58 -16
  33. package/dist/agentic/guides/modules/integrations.md +30 -7
  34. package/dist/agentic/guides/modules/messages.md +68 -13
  35. package/dist/agentic/guides/modules/notifications.md +13 -1
  36. package/dist/agentic/guides/modules/onboarding.md +13 -1
  37. package/dist/agentic/guides/modules/payment_gateways.md +51 -12
  38. package/dist/agentic/guides/modules/perspectives.md +16 -1
  39. package/dist/agentic/guides/modules/planner.md +33 -9
  40. package/dist/agentic/guides/modules/portal.md +24 -1
  41. package/dist/agentic/guides/modules/progress.md +34 -9
  42. package/dist/agentic/guides/modules/query_index.md +56 -3
  43. package/dist/agentic/guides/modules/record_locks.md +60 -13
  44. package/dist/agentic/guides/modules/resources.md +79 -18
  45. package/dist/agentic/guides/modules/sales.md +238 -48
  46. package/dist/agentic/guides/modules/scheduler.md +23 -7
  47. package/dist/agentic/guides/modules/search.md +28 -3
  48. package/dist/agentic/guides/modules/security.md +106 -23
  49. package/dist/agentic/guides/modules/shipping_carriers.md +38 -10
  50. package/dist/agentic/guides/modules/sso.md +47 -15
  51. package/dist/agentic/guides/modules/staff.md +117 -38
  52. package/dist/agentic/guides/modules/storage_s3.md +13 -1
  53. package/dist/agentic/guides/modules/sync_akeneo.md +13 -1
  54. package/dist/agentic/guides/modules/sync_excel.md +15 -1
  55. package/dist/agentic/guides/modules/system_status_overlays.md +14 -1
  56. package/dist/agentic/guides/modules/translations.md +25 -5
  57. package/dist/agentic/guides/modules/webhooks.md +85 -15
  58. package/dist/agentic/guides/modules/wms.md +234 -31
  59. package/dist/agentic/guides/modules/workflows.md +114 -30
  60. package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +7 -0
  61. package/dist/agentic/guides/upstream/manifest.json +2 -2
  62. package/dist/agentic/shared/AGENTS.md.template +2 -2
  63. package/dist/agentic/shared/ai/harness/README.md +2 -0
  64. package/dist/agentic/shared/ai/harness/cases.json +80 -39
  65. package/dist/agentic/shared/ai/skills/om-system-extension/references/mechanism-selector.md +3 -1
  66. package/dist/agentic/shared/ai/skills/om-system-extension/references/unified-overrides.md +2 -1
  67. package/dist/agentic/shared/scripts/framework-context.mjs +3 -9
  68. package/dist/lib/generators/module-extension-facts.js +1185 -0
  69. package/dist/lib/generators/module-extension-facts.js.map +7 -0
  70. package/dist/lib/generators/module-facts.js +134 -7
  71. package/dist/lib/generators/module-facts.js.map +2 -2
  72. package/dist/lib/generators/module-registry.js +1 -0
  73. package/dist/lib/generators/module-registry.js.map +2 -2
  74. package/package.json +5 -5
  75. package/src/lib/generators/__tests__/module-extension-facts.test.ts +402 -0
  76. package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +39 -2
  77. package/src/lib/generators/module-extension-facts.ts +1428 -0
  78. package/src/lib/generators/module-facts.ts +143 -6
  79. package/src/lib/generators/module-registry.ts +1 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 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 ModuleExtensionContributionFact,\n ModuleExtensionContributionBase,\n ModuleExtensionHostFact,\n ModuleExtensionSurfaceFacts,\n ModuleExtensionTargetFact,\n ModuleExtensionUnresolvedFact,\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}\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}\n\ntype StaticContext = {\n initializers: Map<string, ts.Expression | ts.FunctionDeclaration>\n sourceFile: ts.SourceFile\n resolving: Set<string>\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 if (!fs.existsSync(filePath)) return null\n const scriptKind = filePath.endsWith('.tsx') ? ts.ScriptKind.TSX : ts.ScriptKind.TS\n return ts.createSourceFile(filePath, fs.readFileSync(filePath, 'utf8'), ts.ScriptTarget.ES2020, true, scriptKind)\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): 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() }\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\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 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 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 }\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 const firstArgument = current.arguments[0]\n if (firstArgument) {\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\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\nexport function readConventionObjectArray(filePath: string, exportName: string): StaticObject[] {\n const file = sourceFile(filePath)\n if (!file) return []\n const context = buildStaticContext(file)\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\nfunction readRootObject(filePath: string, variableName: string): StaticObject | null {\n const file = sourceFile(filePath)\n if (!file) return null\n const context = buildStaticContext(file)\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 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.id },\n }\n}\n\nfunction sourceFilesBelow(directory: string): string[] {\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 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): { entityIds: string[]; commandIds: string[]; routeIds: string[] } {\n const entityIds = new Set<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) entityIds.add(entityId)\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) entityIds.add(entityId)\n }\n node.forEachChild(visit)\n }\n file.forEachChild(visit)\n }\n return {\n entityIds: [...entityIds].sort((left, right) => left.localeCompare(right)),\n commandIds: [...commandIds].sort((left, right) => left.localeCompare(right)),\n routeIds: [...routeIds].sort((left, right) => left.localeCompare(right)),\n }\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\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 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 hosts.push(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 }\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\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')\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 = table[targetId]\n if (!Array.isArray(entries)) continue\n for (const entry of entries) {\n if (!isStaticObject(entry)) continue\n const widgetId = stringValue(entry.widgetId)\n if (!widgetId) continue\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: strings(entry.features),\n placement: numberValue(entry.priority) !== undefined ? { priority: numberValue(entry.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: strings(entry.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: strings(entry.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 ? found : readConventionObjectArray(filePath, exportName), [])\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 queryEngine = isStaticObject(entry.queryEngine) ? entry.queryEngine : 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 entry of fs.readdirSync(directory, { withFileTypes: true }).sort((left, right) => left.name.localeCompare(right.name))) {\n if (!entry.isFile() || !/\\.(?:ts|tsx)$/.test(entry.name) || /\\.(?:test|spec)\\./.test(entry.name)) continue\n const filePath = path.join(directory, entry.name)\n const metadata = readRootObject(filePath, 'metadata')\n if (!metadata) continue\n const event = stringValue(metadata.event)\n if (!event) continue\n const subscriberId = stringValue(metadata.id) ?? `${options.moduleId}:${entry.name.replace(/\\.tsx?$/, '')}`\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 id = stringValue(entry.id) ?? `${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 },\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 const mode = entry.wrapper !== undefined ? 'wrapper' : entry.props !== 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 integration = readRootObject(integrationPath, 'integration')\n const sourcePath = portablePath(options.moduleRoot, options.sourceRoot, integrationPath)\n const integrationId = integration ? stringValue(integration.id) : undefined\n if (integrationId) add(integrationId, 'integration', sourcePath, 'integrations', 'integration')\n const providerKey = integration ? stringValue(integration.providerKey) : undefined\n const category = integration ? stringValue(integration.category) : undefined\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, 'integration.providerKey')\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\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 { hosts, contributions, unresolved: declared.unresolved }\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\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 if (options.entityIds.has(targetFact.id)) {\n return { id: targetFact.id, resolution: 'fact-ref', factRef: { factSection: 'entities', factKey: targetFact.id } }\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, 'commands')\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 }\n }\n return result\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\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
+ "names": ["id", "fact"]
7
+ }
@@ -2,6 +2,14 @@ import fs from "node:fs";
2
2
  import path from "node:path";
3
3
  import ts from "typescript-js";
4
4
  import { toSnake } from "../utils.js";
5
+ import {
6
+ assertNoUnresolvedExtensionTargets,
7
+ correlateModuleExtensionFacts,
8
+ extractKnownApiRouteIds,
9
+ extractKnownCommandIds,
10
+ extractModuleExtensionFacts,
11
+ renderFrameworkExtensionPointsMarkdown
12
+ } from "./module-extension-facts.js";
5
13
  function readSourceFile(filePath) {
6
14
  if (!fs.existsSync(filePath)) return null;
7
15
  const source = fs.readFileSync(filePath, "utf8");
@@ -240,7 +248,11 @@ function extractEvents(eventsFilePath) {
240
248
  category: category ?? null,
241
249
  entity: entity ?? null
242
250
  };
251
+ const clientBroadcast = readBooleanPropertyInitializer(element, "clientBroadcast");
252
+ const portalBroadcast = readBooleanPropertyInitializer(element, "portalBroadcast");
243
253
  if (label !== void 0) fact.label = label;
254
+ if (clientBroadcast !== void 0) fact.clientBroadcast = clientBroadcast;
255
+ if (portalBroadcast !== void 0) fact.portalBroadcast = portalBroadcast;
244
256
  facts.push(fact);
245
257
  }
246
258
  return facts;
@@ -753,6 +765,18 @@ function extractModuleFacts(options) {
753
765
  entityIds: extractHostEntityIds(entities),
754
766
  tableIds: extractTableIds(moduleRoot)
755
767
  };
768
+ const extensionSurfaces = extractModuleExtensionFacts({
769
+ moduleId,
770
+ moduleRoot,
771
+ sourceRoot,
772
+ entities,
773
+ events,
774
+ apiRoutes,
775
+ searchEntities,
776
+ notifications,
777
+ aiTools,
778
+ aiAgents
779
+ });
756
780
  return {
757
781
  module: moduleId,
758
782
  title,
@@ -775,6 +799,7 @@ function extractModuleFacts(options) {
775
799
  cliCommands,
776
800
  aiTools,
777
801
  aiAgents,
802
+ extensionSurfaces,
778
803
  warnings
779
804
  };
780
805
  }
@@ -802,9 +827,12 @@ function renderEventsSection(events) {
802
827
  if (events.length === 0) return `${heading}
803
828
 
804
829
  ${EMPTY_SECTION_MARKER}`;
805
- const header = "| ID | Category | Entity |";
806
- const divider = "|---|---|---|";
807
- const rows = events.map((event) => `| ${event.id} | ${event.category ?? "\u2014"} | ${event.entity ?? "\u2014"} |`);
830
+ const header = "| ID | Category | Entity | Browser transport |";
831
+ const divider = "|---|---|---|---|";
832
+ const rows = events.map((event) => {
833
+ const transports = [event.clientBroadcast ? "client" : null, event.portalBroadcast ? "portal" : null].filter((value) => value !== null);
834
+ return `| ${event.id} | ${event.category ?? "\u2014"} | ${event.entity ?? "\u2014"} | ${transports.join(", ") || "\u2014"} |`;
835
+ });
808
836
  return [heading, "", header, divider, ...rows].join("\n");
809
837
  }
810
838
  function renderInlineListSection(heading, values) {
@@ -859,7 +887,70 @@ function renderHostTokensSection(hostTokens) {
859
887
  const tableIdsLine = hostTokens.tableIds.length > 0 ? hostTokens.tableIds.join(" \xB7 ") : EMPTY_SECTION_MARKER;
860
888
  return ["## Host extension points", "", `- Entity IDs: ${entityIdsLine}`, `- Table IDs: ${tableIdsLine}`].join("\n");
861
889
  }
890
+ function renderExtensionHostContext(host) {
891
+ return host.contextContract ?? host.runtimeContract ?? host.scopeContract ?? "\u2014";
892
+ }
893
+ function renderExtensionHostsSection(extensionSurfaces) {
894
+ const boundHosts = extensionSurfaces.hosts.filter((host) => host.bound);
895
+ if (boundHosts.length === 0) return `## UMES hosts
896
+
897
+ ${EMPTY_SECTION_MARKER}`;
898
+ const rows = boundHosts.map(
899
+ (host) => `| ${host.id} | ${host.family} | ${host.capabilities.join(", ") || "\u2014"} | ${renderExtensionHostContext(host)} | ${host.stability.toUpperCase()} |`
900
+ );
901
+ return [
902
+ "## UMES hosts",
903
+ "",
904
+ "| ID / pattern | Family | Supports | Context | Stability |",
905
+ "|---|---|---|---|---|",
906
+ ...rows
907
+ ].join("\n");
908
+ }
909
+ function compactContributionDetails(contribution) {
910
+ const details = contribution.details;
911
+ return Object.keys(details).sort((left, right) => left.localeCompare(right)).flatMap((key) => {
912
+ const value = details[key];
913
+ if (value === void 0) return [];
914
+ if (Array.isArray(value)) return [`${key}=${value.join(",") || "none"}`];
915
+ if (value && typeof value === "object") {
916
+ const nested = Object.keys(value).sort((left, right) => left.localeCompare(right)).map((nestedKey) => {
917
+ const nestedValue = value[nestedKey];
918
+ return `${nestedKey}:${Array.isArray(nestedValue) ? nestedValue.join(",") : String(nestedValue)}`;
919
+ });
920
+ return [`${key}={${nested.join(";")}}`];
921
+ }
922
+ return [`${key}=${String(value)}`];
923
+ }).join("; ");
924
+ }
925
+ function renderExtensionContributionsSection(extensionSurfaces) {
926
+ if (extensionSurfaces.contributions.length === 0) return `## UMES contributions
927
+
928
+ ${EMPTY_SECTION_MARKER}`;
929
+ const rows = extensionSurfaces.contributions.map((contribution) => {
930
+ const targets = contribution.targets.map((entry) => entry.id).join(", ");
931
+ const resolution = contribution.targets.map((entry) => entry.resolution).join(", ");
932
+ const phases = [...contribution.phases ?? [], ...contribution.operations ?? []].join(", ") || "\u2014";
933
+ return `| ${contribution.id} | ${contribution.kind} | ${targets || "\u2014"} | ${phases} | ${compactContributionDetails(contribution)} | ${resolution || "\u2014"} |`;
934
+ });
935
+ return [
936
+ "## UMES contributions",
937
+ "",
938
+ "| ID | Kind | Target | Phase / operations | Contract | Resolution |",
939
+ "|---|---|---|---|---|---|",
940
+ ...rows
941
+ ].join("\n");
942
+ }
943
+ function renderExtensionDiagnosticsSection(extensionSurfaces) {
944
+ const unbound = extensionSurfaces.hosts.filter((host) => !host.bound);
945
+ if (unbound.length === 0 && extensionSurfaces.unresolved.length === 0) return "";
946
+ const diagnostics = [
947
+ ...unbound.map((host) => `- unbound-helper: ${host.id}`),
948
+ ...extensionSurfaces.unresolved.map((entry) => `- ${entry.reason}: ${entry.key} (${entry.source.path})`)
949
+ ];
950
+ return ["## UMES diagnostics", "", ...diagnostics].join("\n");
951
+ }
862
952
  function renderModuleFactsMarkdown(facts) {
953
+ const extensionSurfaces = facts.extensionSurfaces ?? { hosts: [], contributions: [], unresolved: [] };
863
954
  const sections = [
864
955
  `# ${facts.module} \u2014 module facts (generated, do not edit)`,
865
956
  renderVersionStamp(facts.coreVersion, facts.sourcePackage, facts.sourceVersion),
@@ -883,6 +974,12 @@ function renderModuleFactsMarkdown(facts) {
883
974
  "",
884
975
  renderHostTokensSection(facts.hostTokens),
885
976
  "",
977
+ renderExtensionHostsSection(extensionSurfaces),
978
+ "",
979
+ renderExtensionContributionsSection(extensionSurfaces),
980
+ "",
981
+ renderExtensionDiagnosticsSection(extensionSurfaces),
982
+ "",
886
983
  renderInlineListSection("## Notifications", facts.notifications),
887
984
  "",
888
985
  renderLinkedFactsSection("## CLI commands", facts.cliCommands.map((command) => ({ label: command.command, sourcePath: command.sourcePath }))),
@@ -903,7 +1000,13 @@ function toModuleFactsJsonEntry(facts) {
903
1000
  sourceVersion: facts.sourceVersion,
904
1001
  sourceRoot: facts.sourceRoot,
905
1002
  entities: facts.entities,
906
- events: facts.events.map((event) => ({ id: event.id, category: event.category, entity: event.entity })),
1003
+ events: facts.events.map((event) => ({
1004
+ id: event.id,
1005
+ category: event.category,
1006
+ entity: event.entity,
1007
+ ...event.clientBroadcast !== void 0 ? { clientBroadcast: event.clientBroadcast } : {},
1008
+ ...event.portalBroadcast !== void 0 ? { portalBroadcast: event.portalBroadcast } : {}
1009
+ })),
907
1010
  aclFeatures: facts.aclFeatures,
908
1011
  apiRoutes: facts.apiRoutes,
909
1012
  diTokens: facts.diTokens,
@@ -915,7 +1018,8 @@ function toModuleFactsJsonEntry(facts) {
915
1018
  frontendPages: facts.frontendPages,
916
1019
  cliCommands: facts.cliCommands,
917
1020
  aiTools: facts.aiTools,
918
- aiAgents: facts.aiAgents
1021
+ aiAgents: facts.aiAgents,
1022
+ ...facts.extensionSurfaces ? { extensionSurfaces: facts.extensionSurfaces } : {}
919
1023
  };
920
1024
  }
921
1025
  function buildModuleFactsJsonObject(factsByModule) {
@@ -948,10 +1052,33 @@ function extractAllModuleFacts(options) {
948
1052
  registrySource: options.registrySource ?? null
949
1053
  });
950
1054
  factsByModule[source.moduleId] = facts;
951
- markdownByModule[source.moduleId] = renderModuleFactsMarkdown(facts);
952
1055
  warnings.push(...facts.warnings);
953
1056
  }
954
- return { factsByModule, markdownByModule, warnings };
1057
+ const surfacesByModule = Object.fromEntries(
1058
+ Object.entries(factsByModule).map(([moduleId, facts]) => [
1059
+ moduleId,
1060
+ facts.extensionSurfaces ?? { hosts: [], contributions: [], unresolved: [] }
1061
+ ])
1062
+ );
1063
+ const correlated = correlateModuleExtensionFacts({
1064
+ surfacesByModule,
1065
+ entityIds: new Set(Object.values(factsByModule).flatMap((facts) => facts.entities.map((entity) => entity.id))),
1066
+ eventIds: new Set(Object.values(factsByModule).flatMap((facts) => facts.events.map((event) => event.id))),
1067
+ apiRoutes: /* @__PURE__ */ new Set([
1068
+ ...Object.values(factsByModule).flatMap((facts) => facts.apiRoutes.map((route) => route.path)),
1069
+ ...sources.flatMap((source) => extractKnownApiRouteIds(source.moduleId, source.moduleRoot))
1070
+ ]),
1071
+ commandIds: new Set(sources.flatMap((source) => extractKnownCommandIds(source.moduleId, source.moduleRoot)))
1072
+ });
1073
+ assertNoUnresolvedExtensionTargets(correlated);
1074
+ for (const moduleId of Object.keys(factsByModule).sort((left, right) => left.localeCompare(right))) {
1075
+ factsByModule[moduleId].extensionSurfaces = correlated[moduleId];
1076
+ markdownByModule[moduleId] = renderModuleFactsMarkdown(factsByModule[moduleId]);
1077
+ warnings.push(...correlated[moduleId].unresolved.map(
1078
+ (entry) => `[module-facts] ${moduleId} ${entry.reason}: ${entry.key} (${entry.source.path})`
1079
+ ));
1080
+ }
1081
+ return { factsByModule, markdownByModule, warnings, frameworkMarkdown: renderFrameworkExtensionPointsMarkdown() };
955
1082
  }
956
1083
  export {
957
1084
  buildModuleFactsJsonObject,