@open-mercato/cli 0.6.7-develop.6863.1.61001cf9a8 → 0.6.7

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 (278) hide show
  1. package/.turbo/turbo-build.log +4 -4
  2. package/build.mjs +7 -24
  3. package/dist/agentic/claude-code/hooks/entity-migration-check.ts +88 -32
  4. package/dist/agentic/codex/enforcement-rules.md +16 -2
  5. package/dist/agentic/cursor/hooks/entity-migration-check.mjs +50 -19
  6. package/dist/agentic/cursor/rules/entity-guard.mdc +21 -9
  7. package/dist/agentic/cursor/rules/generated-guard.mdc +5 -3
  8. package/dist/agentic/cursor/rules/open-mercato.mdc +29 -3
  9. package/dist/agentic/guides/cache.md +45 -0
  10. package/dist/agentic/guides/core.md +453 -0
  11. package/dist/agentic/guides/events.md +117 -0
  12. package/dist/agentic/guides/module-facts.json +3833 -115419
  13. package/dist/agentic/guides/module-system.md +127 -12
  14. package/dist/agentic/guides/modules/ai_assistant.md +28 -227
  15. package/dist/agentic/guides/modules/api_docs.md +2 -58
  16. package/dist/agentic/guides/modules/api_keys.md +7 -92
  17. package/dist/agentic/guides/modules/attachments.md +14 -119
  18. package/dist/agentic/guides/modules/audit_logs.md +10 -131
  19. package/dist/agentic/guides/modules/auth.md +33 -276
  20. package/dist/agentic/guides/modules/business_rules.md +14 -149
  21. package/dist/agentic/guides/modules/catalog.md +43 -475
  22. package/dist/agentic/guides/modules/channel_gmail.md +3 -82
  23. package/dist/agentic/guides/modules/channel_imap.md +3 -82
  24. package/dist/agentic/guides/modules/checkout.md +27 -299
  25. package/dist/agentic/guides/modules/communication_channels.md +33 -315
  26. package/dist/agentic/guides/modules/configs.md +8 -104
  27. package/dist/agentic/guides/modules/content.md +2 -57
  28. package/dist/agentic/guides/modules/currencies.md +17 -152
  29. package/dist/agentic/guides/modules/customer_accounts.md +45 -387
  30. package/dist/agentic/guides/modules/customers.md +85 -746
  31. package/dist/agentic/guides/modules/dashboards.md +10 -155
  32. package/dist/agentic/guides/modules/data_sync.md +16 -149
  33. package/dist/agentic/guides/modules/dictionaries.md +12 -107
  34. package/dist/agentic/guides/modules/directory.md +15 -148
  35. package/dist/agentic/guides/modules/entities.md +13 -145
  36. package/dist/agentic/guides/modules/events.md +2 -59
  37. package/dist/agentic/guides/modules/feature_toggles.md +9 -119
  38. package/dist/agentic/guides/modules/gateway_stripe.md +4 -92
  39. package/dist/agentic/guides/modules/generators.md +2 -45
  40. package/dist/agentic/guides/modules/inbox_ops.md +27 -207
  41. package/dist/agentic/guides/modules/integrations.md +16 -146
  42. package/dist/agentic/guides/modules/messages.md +24 -223
  43. package/dist/agentic/guides/modules/notifications.md +8 -96
  44. package/dist/agentic/guides/modules/onboarding.md +6 -77
  45. package/dist/agentic/guides/modules/payment_gateways.md +21 -164
  46. package/dist/agentic/guides/modules/perspectives.md +7 -77
  47. package/dist/agentic/guides/modules/planner.md +18 -136
  48. package/dist/agentic/guides/modules/portal.md +2 -93
  49. package/dist/agentic/guides/modules/progress.md +14 -104
  50. package/dist/agentic/guides/modules/query_index.md +15 -154
  51. package/dist/agentic/guides/modules/record_locks.md +21 -206
  52. package/dist/agentic/guides/modules/resources.md +30 -197
  53. package/dist/agentic/guides/modules/sales.md +84 -678
  54. package/dist/agentic/guides/modules/scheduler.md +14 -133
  55. package/dist/agentic/guides/modules/search.md +6 -170
  56. package/dist/agentic/guides/modules/security.md +35 -294
  57. package/dist/agentic/guides/modules/shipping_carriers.md +18 -134
  58. package/dist/agentic/guides/modules/sso.md +26 -151
  59. package/dist/agentic/guides/modules/staff.md +57 -369
  60. package/dist/agentic/guides/modules/storage_s3.md +5 -95
  61. package/dist/agentic/guides/modules/sync_akeneo.md +3 -85
  62. package/dist/agentic/guides/modules/sync_excel.md +6 -75
  63. package/dist/agentic/guides/modules/system_status_overlays.md +2 -60
  64. package/dist/agentic/guides/modules/translations.md +10 -104
  65. package/dist/agentic/guides/modules/webhooks.md +24 -203
  66. package/dist/agentic/guides/modules/wms.md +46 -441
  67. package/dist/agentic/guides/modules/workflows.md +43 -302
  68. package/dist/agentic/guides/queue.md +53 -0
  69. package/dist/agentic/guides/search.md +115 -0
  70. package/dist/agentic/guides/shared.md +108 -0
  71. package/dist/agentic/guides/ui.md +347 -0
  72. package/dist/agentic/shared/AGENTS.md.template +311 -124
  73. package/dist/agentic/shared/ai/agentic.config.json +0 -2
  74. package/dist/agentic/shared/ai/lessons.md +3 -26
  75. package/dist/agentic/shared/ai/skills/om-auto-continue-pr-loop/SKILL.md +27 -0
  76. package/dist/agentic/shared/ai/skills/om-auto-create-pr-loop/SKILL.md +27 -0
  77. package/dist/agentic/shared/ai/skills/om-auto-review-pr/SKILL.md +0 -4
  78. package/dist/agentic/shared/ai/skills/om-backend-ui-design/SKILL.md +241 -20
  79. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/ui-components.md +260 -0
  80. package/dist/agentic/shared/ai/skills/om-data-model-design/SKILL.md +601 -16
  81. package/dist/agentic/shared/ai/skills/om-data-model-design/references/mikro-orm-cheatsheet.md +146 -0
  82. package/dist/agentic/shared/ai/skills/om-eject-and-customize/SKILL.md +310 -14
  83. package/dist/agentic/shared/ai/skills/om-help/SKILL.md +97 -15
  84. package/dist/agentic/shared/ai/skills/om-help/references/skills-catalog.md +84 -0
  85. package/dist/agentic/shared/ai/skills/om-help/references/workflow-sequences.md +193 -0
  86. package/dist/agentic/shared/ai/skills/om-implement-spec/SKILL.md +152 -33
  87. package/dist/agentic/shared/ai/skills/om-integration-builder/SKILL.md +708 -24
  88. package/dist/agentic/shared/ai/skills/om-integration-builder/STANDALONE.md +34 -0
  89. package/dist/agentic/shared/ai/skills/om-integration-builder/references/adapter-contracts.md +762 -0
  90. package/dist/agentic/shared/ai/skills/om-module-scaffold/SKILL.md +820 -20
  91. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/naming-conventions.md +50 -0
  92. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/navigation-patterns.md +97 -0
  93. package/dist/agentic/shared/ai/skills/om-system-extension/SKILL.md +843 -19
  94. package/dist/agentic/shared/ai/skills/om-system-extension/references/extension-contracts.md +271 -0
  95. package/dist/agentic/shared/ai/skills/om-trim-unused-modules/SKILL.md +63 -15
  96. package/dist/agentic/shared/ai/skills/om-troubleshooter/SKILL.md +467 -16
  97. package/dist/agentic/shared/ai/skills/om-troubleshooter/references/diagnostic-commands.md +101 -0
  98. package/dist/agentic/shared/ai/skills/tiers.json +21 -143
  99. package/dist/agentic/shared/ai/skills/tiers.schema.json +40 -52
  100. package/dist/agentic/shared/ai/specs/README.md +3 -4
  101. package/dist/agentic/shared/ai/specs/SPEC-000-template.md +10 -226
  102. package/dist/agentic/shared/ai/trackers/github.md +4 -108
  103. package/dist/agentic/shared/scripts/install-skills.sh +694 -4
  104. package/dist/bin.js +1 -13
  105. package/dist/bin.js.map +2 -2
  106. package/dist/lib/__integration__/TC-INT-008.spec.js +8 -88
  107. package/dist/lib/__integration__/TC-INT-008.spec.js.map +2 -2
  108. package/dist/lib/agentic-init.js +3 -13
  109. package/dist/lib/agentic-init.js.map +2 -2
  110. package/dist/lib/agentic-setup.js +186 -418
  111. package/dist/lib/agentic-setup.js.map +2 -2
  112. package/dist/lib/generators/extensions/injection-widgets.js +0 -20
  113. package/dist/lib/generators/extensions/injection-widgets.js.map +2 -2
  114. package/dist/lib/generators/module-facts-discovery.js +7 -41
  115. package/dist/lib/generators/module-facts-discovery.js.map +2 -2
  116. package/dist/lib/generators/module-facts.js +45 -1387
  117. package/dist/lib/generators/module-facts.js.map +3 -3
  118. package/dist/lib/generators/module-registry.js +5 -11
  119. package/dist/lib/generators/module-registry.js.map +2 -2
  120. package/dist/lib/resolver.js +0 -2
  121. package/dist/lib/resolver.js.map +2 -2
  122. package/dist/lib/testing/integration.js +0 -5
  123. package/dist/lib/testing/integration.js.map +2 -2
  124. package/dist/mercato.js +1 -23
  125. package/dist/mercato.js.map +2 -2
  126. package/package.json +11 -13
  127. package/src/bin.ts +1 -33
  128. package/src/lib/__integration__/TC-INT-008.spec.ts +9 -107
  129. package/src/lib/__tests__/agentic-init.test.ts +5 -41
  130. package/src/lib/agentic-init.ts +3 -15
  131. package/src/lib/agentic-setup.ts +224 -530
  132. package/src/lib/generators/__tests__/module-facts.bc-guard.test.ts +2 -88
  133. package/src/lib/generators/__tests__/module-facts.customers.fixture.test.ts +0 -1
  134. package/src/lib/generators/__tests__/module-facts.discovery.test.ts +10 -54
  135. package/src/lib/generators/__tests__/module-subset.test.ts +0 -18
  136. package/src/lib/generators/extensions/injection-widgets.ts +0 -51
  137. package/src/lib/generators/module-facts-discovery.ts +7 -58
  138. package/src/lib/generators/module-facts.ts +46 -1851
  139. package/src/lib/generators/module-registry.ts +6 -16
  140. package/src/lib/resolver.ts +0 -3
  141. package/src/lib/testing/__tests__/integration.test.ts +0 -4
  142. package/src/lib/testing/integration.ts +0 -5
  143. package/src/mercato.ts +1 -26
  144. package/dist/agentic/guides/ai-workflows.md +0 -76
  145. package/dist/agentic/guides/architecture.md +0 -107
  146. package/dist/agentic/guides/backend-ui.md +0 -80
  147. package/dist/agentic/guides/contracts.md +0 -92
  148. package/dist/agentic/guides/extensions.md +0 -121
  149. package/dist/agentic/guides/framework-extension-points.md +0 -36
  150. package/dist/agentic/guides/integrations.md +0 -81
  151. package/dist/agentic/guides/modules/design_system.md +0 -102
  152. package/dist/agentic/guides/spec-delivery.md +0 -22
  153. package/dist/agentic/guides/testing-debugging.md +0 -80
  154. package/dist/agentic/guides/upstream/AGENTS.md +0 -298
  155. package/dist/agentic/guides/upstream/BACKWARD_COMPATIBILITY.md +0 -316
  156. package/dist/agentic/guides/upstream/manifest.json +0 -8
  157. package/dist/agentic/shared/ai/harness/README.md +0 -50
  158. package/dist/agentic/shared/ai/harness/RELEASE.md +0 -57
  159. package/dist/agentic/shared/ai/harness/cases.json +0 -13680
  160. package/dist/agentic/shared/ai/harness/cases.schema.json +0 -133
  161. package/dist/agentic/shared/ai/harness/fixtures/index.json +0 -49
  162. package/dist/agentic/shared/ai/harness/fixtures/seeds.json +0 -162
  163. package/dist/agentic/shared/ai/harness/generated-code-review-policy.md +0 -21
  164. package/dist/agentic/shared/ai/harness/generated-code-review-response.schema.json +0 -96
  165. package/dist/agentic/shared/ai/harness/generated-code-review-result.schema.json +0 -172
  166. package/dist/agentic/shared/ai/harness/release-matrix.json +0 -158
  167. package/dist/agentic/shared/ai/harness/release-result.schema.json +0 -219
  168. package/dist/agentic/shared/ai/harness/result.schema.json +0 -76
  169. package/dist/agentic/shared/ai/harness/routing-response.schema.json +0 -12
  170. package/dist/agentic/shared/ai/harness/target-validation-result.schema.json +0 -73
  171. package/dist/agentic/shared/ai/harness/validators.json +0 -78
  172. package/dist/agentic/shared/ai/harness/writable-ast-oracles.mjs +0 -2121
  173. package/dist/agentic/shared/ai/harness/writable-behavior-oracles.mjs +0 -1096
  174. package/dist/agentic/shared/ai/lessons/_template.md +0 -16
  175. package/dist/agentic/shared/ai/review-checklist.md +0 -36
  176. package/dist/agentic/shared/ai/skills/om-auto-implement-spec/SKILL.md +0 -21
  177. package/dist/agentic/shared/ai/skills/om-auto-upgrade-0.6.6-to-0.6.7/SKILL.md +0 -98
  178. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/crud-surfaces.md +0 -16
  179. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/frontend-and-design-system.md +0 -53
  180. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/page-and-navigation.md +0 -13
  181. package/dist/agentic/shared/ai/skills/om-backend-ui-design/references/quality-states.md +0 -11
  182. package/dist/agentic/shared/ai/skills/om-build-workflow/SKILL.md +0 -30
  183. package/dist/agentic/shared/ai/skills/om-build-workflow/references/activity-contracts.md +0 -12
  184. package/dist/agentic/shared/ai/skills/om-build-workflow/references/durability-and-progress.md +0 -13
  185. package/dist/agentic/shared/ai/skills/om-build-workflow/references/workflow-design.md +0 -14
  186. package/dist/agentic/shared/ai/skills/om-create-ai-agent/SKILL.md +0 -28
  187. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/attachments-and-overrides.md +0 -12
  188. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/module-agents-and-tools.md +0 -22
  189. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/orchestrator-agents.md +0 -12
  190. package/dist/agentic/shared/ai/skills/om-create-ai-agent/references/surface-selector.md +0 -19
  191. package/dist/agentic/shared/ai/skills/om-data-model-design/references/integrity-and-concurrency.md +0 -19
  192. package/dist/agentic/shared/ai/skills/om-data-model-design/references/migration-workflow.md +0 -13
  193. package/dist/agentic/shared/ai/skills/om-data-model-design/references/schema-design.md +0 -14
  194. package/dist/agentic/shared/ai/skills/om-data-model-design/references/sensitive-data.md +0 -10
  195. package/dist/agentic/shared/ai/skills/om-eject-and-customize/references/decision-and-procedure.md +0 -17
  196. package/dist/agentic/shared/ai/skills/om-evolve-harness/SKILL.md +0 -29
  197. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-template.md +0 -100
  198. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/case-workflow.md +0 -16
  199. package/dist/agentic/shared/ai/skills/om-evolve-harness/references/owner-selection.md +0 -17
  200. package/dist/agentic/shared/ai/skills/om-framework-context/SKILL.md +0 -25
  201. package/dist/agentic/shared/ai/skills/om-framework-context/references/resolver-procedure.md +0 -11
  202. package/dist/agentic/shared/ai/skills/om-framework-context/references/skew-and-escalation.md +0 -13
  203. package/dist/agentic/shared/ai/skills/om-help/references/delivery-workflows.md +0 -18
  204. package/dist/agentic/shared/ai/skills/om-help/references/task-families.md +0 -20
  205. package/dist/agentic/shared/ai/skills/om-implement-spec/references/phases-and-gates.md +0 -33
  206. package/dist/agentic/shared/ai/skills/om-implement-spec/references/planning-and-progress.md +0 -40
  207. package/dist/agentic/shared/ai/skills/om-implement-spec/references/report-templates.md +0 -27
  208. package/dist/agentic/shared/ai/skills/om-implement-spec/references/spec-resolution.md +0 -24
  209. package/dist/agentic/shared/ai/skills/om-integration-builder/references/package-and-activation.md +0 -16
  210. package/dist/agentic/shared/ai/skills/om-integration-builder/references/provider-families.md +0 -14
  211. package/dist/agentic/shared/ai/skills/om-integration-builder/references/security-and-reliability.md +0 -15
  212. package/dist/agentic/shared/ai/skills/om-integration-builder/references/sync-and-files.md +0 -12
  213. package/dist/agentic/shared/ai/skills/om-judge-agent-session/SKILL.md +0 -34
  214. package/dist/agentic/shared/ai/skills/om-judge-agent-session/agents/openai.yaml +0 -4
  215. package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/agentic-setup.md +0 -11
  216. package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/input-normalization.md +0 -31
  217. package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/judge-workflow.md +0 -39
  218. package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/report-template.md +0 -43
  219. package/dist/agentic/shared/ai/skills/om-judge-agent-session/references/rules.md +0 -11
  220. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/api-and-domain.md +0 -19
  221. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/business-one-shot-blueprints.md +0 -172
  222. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/data-and-migrations.md +0 -12
  223. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/discovery-surface-catalog.md +0 -83
  224. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/module-surfaces.md +0 -21
  225. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/planning.md +0 -11
  226. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/runtime-cache-and-queues.md +0 -22
  227. package/dist/agentic/shared/ai/skills/om-module-scaffold/references/verification.md +0 -13
  228. package/dist/agentic/shared/ai/skills/om-share-this-session/SKILL.md +0 -41
  229. package/dist/agentic/shared/ai/skills/om-share-this-session/references/agentic-setup.md +0 -19
  230. package/dist/agentic/shared/ai/skills/om-share-this-session/references/bundle-preparation.md +0 -44
  231. package/dist/agentic/shared/ai/skills/om-share-this-session/references/consent-and-review.md +0 -39
  232. package/dist/agentic/shared/ai/skills/om-share-this-session/references/publication.md +0 -20
  233. package/dist/agentic/shared/ai/skills/om-share-this-session/references/report-templates.md +0 -57
  234. package/dist/agentic/shared/ai/skills/om-share-this-session/references/rules.md +0 -11
  235. package/dist/agentic/shared/ai/skills/om-share-this-session/scripts/prepare-share-bundle.mjs +0 -486
  236. package/dist/agentic/shared/ai/skills/om-system-extension/references/extension-branches.md +0 -18
  237. package/dist/agentic/shared/ai/skills/om-system-extension/references/mechanism-selector.md +0 -27
  238. package/dist/agentic/shared/ai/skills/om-system-extension/references/read-write-roundtrip.md +0 -13
  239. package/dist/agentic/shared/ai/skills/om-system-extension/references/unified-overrides.md +0 -41
  240. package/dist/agentic/shared/ai/skills/om-system-extension/references/verification.md +0 -11
  241. package/dist/agentic/shared/ai/skills/om-trim-unused-modules/references/dependency-and-redirect.md +0 -15
  242. package/dist/agentic/shared/ai/skills/om-troubleshooter/references/diagnosis-map.md +0 -16
  243. package/dist/agentic/shared/ai/skills/om-troubleshooter/references/regression-oracles.md +0 -14
  244. package/dist/agentic/shared/scripts/agent-harness-tool-server.mjs +0 -187
  245. package/dist/agentic/shared/scripts/check-lessons.mjs +0 -178
  246. package/dist/agentic/shared/scripts/evaluate-agent-harness.mjs +0 -2958
  247. package/dist/agentic/shared/scripts/execution-sandbox.mjs +0 -329
  248. package/dist/agentic/shared/scripts/framework-context.mjs +0 -888
  249. package/dist/agentic/shared/scripts/install-skills.mjs +0 -1029
  250. package/dist/agentic/shared/scripts/prepare-agent-harness-fixture.mjs +0 -222
  251. package/dist/agentic/shared/scripts/run-agent-harness-release.mjs +0 -1774
  252. package/dist/lib/generators/module-extension-facts.js +0 -1840
  253. package/dist/lib/generators/module-extension-facts.js.map +0 -7
  254. package/dist/lib/generators/module-fact-sources.js +0 -70
  255. package/dist/lib/generators/module-fact-sources.js.map +0 -7
  256. package/dist/lib/generators/module-override-targets.js +0 -688
  257. package/dist/lib/generators/module-override-targets.js.map +0 -7
  258. package/dist/lib/load-env.js +0 -24
  259. package/dist/lib/load-env.js.map +0 -7
  260. package/dist/lib/telemetry-init.js +0 -358
  261. package/dist/lib/telemetry-init.js.map +0 -7
  262. package/src/lib/__tests__/agentic-setup.ownership.test.ts +0 -386
  263. package/src/lib/__tests__/injection-widget-id-validation.test.ts +0 -184
  264. package/src/lib/__tests__/load-env.test.ts +0 -65
  265. package/src/lib/__tests__/telemetry-init.test.ts +0 -298
  266. package/src/lib/generators/__tests__/activation-adapter-coverage.test.ts +0 -92
  267. package/src/lib/generators/__tests__/module-extension-activations.test.ts +0 -762
  268. package/src/lib/generators/__tests__/module-extension-facts.test.ts +0 -404
  269. package/src/lib/generators/__tests__/module-facts.extension-hosts.test.ts +0 -108
  270. package/src/lib/generators/__tests__/module-facts.owned-contracts.test.ts +0 -561
  271. package/src/lib/generators/__tests__/module-facts.source-links.test.ts +0 -119
  272. package/src/lib/generators/__tests__/module-override-targets.roundtrip.test.ts +0 -149
  273. package/src/lib/generators/__tests__/module-override-targets.test.ts +0 -304
  274. package/src/lib/generators/module-extension-facts.ts +0 -2365
  275. package/src/lib/generators/module-fact-sources.ts +0 -108
  276. package/src/lib/generators/module-override-targets.ts +0 -863
  277. package/src/lib/load-env.ts +0 -30
  278. package/src/lib/telemetry-init.ts +0 -461
@@ -1,7 +0,0 @@
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 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}\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\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): 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 /** 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\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 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 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 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\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, '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 */\nexport function getFrameworkOverrideModes(): Record<string, 'disable-replace' | 'replace' | 'additive'> {\n const modes: Record<string, 'disable-replace' | 'replace' | 'additive'> = {}\n for (const host of FRAMEWORK_OVERRIDE_HOSTS) {\n const dotted = host.key.replace(/^framework\\.module-override\\./, '')\n const mode = host.operations?.[0]\n if (mode === 'disable-replace' || mode === 'replace' || mode === 'additive') modes[dotted] = mode\n }\n return modes\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", "target"]
7
- }
@@ -1,70 +0,0 @@
1
- function identityKey(left, right) {
2
- return JSON.stringify([left, right]);
3
- }
4
- const SECTION_FACT_KINDS = {
5
- entities: "entity",
6
- events: "event",
7
- aclFeatures: "acl-feature",
8
- notifications: "notification",
9
- searchEntities: "search"
10
- };
11
- function buildFactSourceLookup(facts) {
12
- const bySection = /* @__PURE__ */ new Map();
13
- const register = (factSection, factKey, source) => {
14
- bySection.set(identityKey(factSection, factKey), source);
15
- };
16
- for (const route of facts.apiRoutes ?? []) {
17
- if (route.sourcePath) register("apiRoutes", route.path, { sourcePath: route.sourcePath });
18
- }
19
- for (const command of facts.cliCommands ?? []) {
20
- register("cliCommands", command.command, { sourcePath: command.sourcePath });
21
- }
22
- for (const page of facts.backendPages ?? []) register("backendPages", page.path, { sourcePath: page.sourcePath });
23
- for (const page of facts.frontendPages ?? []) register("frontendPages", page.path, { sourcePath: page.sourcePath });
24
- for (const tool of facts.aiTools ?? []) register("aiTools", tool.name, { sourcePath: tool.sourcePath });
25
- for (const agent of facts.aiAgents ?? []) register("aiAgents", agent.id, { sourcePath: agent.sourcePath });
26
- for (const [kind, ownedFacts] of Object.entries(facts.ownedContracts ?? {})) {
27
- for (const fact of ownedFacts ?? []) register(`ownedContracts.${kind}`, fact.id, fact.source);
28
- }
29
- for (const contribution of facts.extensionSurfaces?.contributions ?? []) {
30
- register("extensionSurfaces.contributions", contribution.id, { sourcePath: contribution.source.path });
31
- }
32
- const factRefHostTargets = /* @__PURE__ */ new Map();
33
- for (const host of facts.extensionSurfaces?.hosts ?? []) {
34
- if (host.source.kind === "fact-ref") {
35
- factRefHostTargets.set(host.key, { factSection: host.source.factSection, factKey: host.source.factKey });
36
- continue;
37
- }
38
- register("extensionSurfaces.hosts", host.key, { sourcePath: host.source.path });
39
- }
40
- const entries = /* @__PURE__ */ new Map();
41
- for (const entry of facts.factSources ?? []) {
42
- entries.set(identityKey(entry.kind, entry.id), {
43
- ...entry.source ? { source: entry.source } : {},
44
- ...entry.factRef ? { factSection: entry.factRef.factSection, factKey: entry.factRef.factKey } : {}
45
- });
46
- }
47
- const resolve = (kind, id, depth) => {
48
- if (depth > 2) return null;
49
- const entry = entries.get(identityKey(kind, id));
50
- if (!entry) return null;
51
- if (entry.source) return entry.source;
52
- if (entry.factSection === void 0) return null;
53
- const factKey = entry.factKey ?? id;
54
- const direct = bySection.get(identityKey(entry.factSection, factKey));
55
- if (direct) return direct;
56
- if (entry.factSection === "extensionSurfaces.hosts") {
57
- const hostTarget = factRefHostTargets.get(factKey);
58
- const hostKind = hostTarget ? SECTION_FACT_KINDS[hostTarget.factSection] : void 0;
59
- if (hostTarget && hostKind) return resolve(hostKind, hostTarget.factKey, depth + 1);
60
- if (hostTarget) return bySection.get(identityKey(hostTarget.factSection, hostTarget.factKey)) ?? null;
61
- }
62
- const sectionKind = SECTION_FACT_KINDS[entry.factSection];
63
- return sectionKind ? resolve(sectionKind, factKey, depth + 1) : null;
64
- };
65
- return (kind, id) => resolve(kind, id, 0);
66
- }
67
- export {
68
- buildFactSourceLookup
69
- };
70
- //# sourceMappingURL=module-fact-sources.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../src/lib/generators/module-fact-sources.ts"],
4
- "sourcesContent": ["import type {\n ModuleFactSourceKind,\n ModuleFactSourceRef,\n ModuleFactsJsonEntry,\n} from './module-facts'\n\n/**\n * The subset of a module's facts needed to resolve the provenance index. Both\n * the in-memory `ModuleFacts` and the emitted `ModuleFactsJsonEntry` satisfy it.\n */\nexport type FactSourceLookupInput = Pick<\n ModuleFactsJsonEntry,\n | 'apiRoutes'\n | 'cliCommands'\n | 'backendPages'\n | 'frontendPages'\n | 'aiTools'\n | 'aiAgents'\n | 'ownedContracts'\n | 'extensionSurfaces'\n | 'factSources'\n>\n\nexport type FactSourceLookup = (kind: ModuleFactSourceKind, id: string) => ModuleFactSourceRef | null\n\nfunction identityKey(left: string, right: string): string {\n return JSON.stringify([left, right])\n}\n\n/**\n * Fact sections that do not serialize a source inline: their provenance lives in\n * `factSources` under the mapped kind, so a `factRef` into them resolves with one\n * extra hop. Used by `fact-ref` extension hosts, which reference the fact they\n * expose rather than a declaration of their own.\n */\nconst SECTION_FACT_KINDS: Record<string, ModuleFactSourceKind> = {\n entities: 'entity',\n events: 'event',\n aclFeatures: 'acl-feature',\n notifications: 'notification',\n searchEntities: 'search',\n}\n\n/**\n * Builds the single provenance lookup every consumer uses. `factSources` entries\n * carrying an inline `source` resolve directly; `factRef` entries are followed\n * into the fact section that already serializes the declaration site, so every\n * proven `(kind, id)` resolves deterministically without duplicated payloads.\n */\nexport function buildFactSourceLookup(facts: FactSourceLookupInput): FactSourceLookup {\n const bySection = new Map<string, ModuleFactSourceRef>()\n const register = (factSection: string, factKey: string, source: ModuleFactSourceRef): void => {\n bySection.set(identityKey(factSection, factKey), source)\n }\n for (const route of facts.apiRoutes ?? []) {\n if (route.sourcePath) register('apiRoutes', route.path, { sourcePath: route.sourcePath })\n }\n for (const command of facts.cliCommands ?? []) {\n register('cliCommands', command.command, { sourcePath: command.sourcePath })\n }\n for (const page of facts.backendPages ?? []) register('backendPages', page.path, { sourcePath: page.sourcePath })\n for (const page of facts.frontendPages ?? []) register('frontendPages', page.path, { sourcePath: page.sourcePath })\n for (const tool of facts.aiTools ?? []) register('aiTools', tool.name, { sourcePath: tool.sourcePath })\n for (const agent of facts.aiAgents ?? []) register('aiAgents', agent.id, { sourcePath: agent.sourcePath })\n for (const [kind, ownedFacts] of Object.entries(facts.ownedContracts ?? {})) {\n for (const fact of ownedFacts ?? []) register(`ownedContracts.${kind}`, fact.id, fact.source)\n }\n for (const contribution of facts.extensionSurfaces?.contributions ?? []) {\n register('extensionSurfaces.contributions', contribution.id, { sourcePath: contribution.source.path })\n }\n const factRefHostTargets = new Map<string, { factSection: string; factKey: string }>()\n for (const host of facts.extensionSurfaces?.hosts ?? []) {\n if (host.source.kind === 'fact-ref') {\n factRefHostTargets.set(host.key, { factSection: host.source.factSection, factKey: host.source.factKey })\n continue\n }\n register('extensionSurfaces.hosts', host.key, { sourcePath: host.source.path })\n }\n\n const entries = new Map<string, { source?: ModuleFactSourceRef; factSection?: string; factKey?: string }>()\n for (const entry of facts.factSources ?? []) {\n entries.set(identityKey(entry.kind, entry.id), {\n ...(entry.source ? { source: entry.source } : {}),\n ...(entry.factRef ? { factSection: entry.factRef.factSection, factKey: entry.factRef.factKey } : {}),\n })\n }\n\n const resolve = (kind: ModuleFactSourceKind, id: string, depth: number): ModuleFactSourceRef | null => {\n if (depth > 2) return null\n const entry = entries.get(identityKey(kind, id))\n if (!entry) return null\n if (entry.source) return entry.source\n if (entry.factSection === undefined) return null\n const factKey = entry.factKey ?? id\n const direct = bySection.get(identityKey(entry.factSection, factKey))\n if (direct) return direct\n if (entry.factSection === 'extensionSurfaces.hosts') {\n const hostTarget = factRefHostTargets.get(factKey)\n const hostKind = hostTarget ? SECTION_FACT_KINDS[hostTarget.factSection] : undefined\n if (hostTarget && hostKind) return resolve(hostKind, hostTarget.factKey, depth + 1)\n if (hostTarget) return bySection.get(identityKey(hostTarget.factSection, hostTarget.factKey)) ?? null\n }\n const sectionKind = SECTION_FACT_KINDS[entry.factSection]\n return sectionKind ? resolve(sectionKind, factKey, depth + 1) : null\n }\n\n return (kind, id) => resolve(kind, id, 0)\n}\n"],
5
- "mappings": "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",
6
- "names": []
7
- }