@warpgogol/werkstatt-shared 0.2.0

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 (403) hide show
  1. package/package.json +352 -0
  2. package/src/checks/index.ts +24 -0
  3. package/src/checks/lib/astro-site-url.ts +30 -0
  4. package/src/checks/lib/i18n.ts +30 -0
  5. package/src/checks/result-helpers.ts +102 -0
  6. package/src/checks/suppressions-config.ts +195 -0
  7. package/src/index.ts +14 -0
  8. package/src/integration/README.md +38 -0
  9. package/src/integration/adapters.ts +143 -0
  10. package/src/integration/crm-buffer.ts +491 -0
  11. package/src/integration/dispatch.ts +106 -0
  12. package/src/integration/funnel.ts +379 -0
  13. package/src/integration/index.ts +56 -0
  14. package/src/integration/lifecycle.ts +155 -0
  15. package/src/integration/orchestration.ts +439 -0
  16. package/src/integration/port-barrel.ts +124 -0
  17. package/src/integration/port.ts +143 -0
  18. package/src/integration/qstash.ts +134 -0
  19. package/src/integration/sharding.ts +133 -0
  20. package/src/integration/tests/deliver-event.test.ts +52 -0
  21. package/src/integration/tests/dispatch.test.ts +88 -0
  22. package/src/integration/tests/funnel-bridge.test.ts +46 -0
  23. package/src/integration/tests/hub-runtime.test.ts +128 -0
  24. package/src/integration/tests/lifecycle.test.ts +69 -0
  25. package/src/integration/tests/qstash.test.ts +83 -0
  26. package/src/integration/tests/sharding.test.ts +64 -0
  27. package/src/integration/vitest.config.ts +8 -0
  28. package/src/integration-adapter-supabase-crm/adapter.ts +437 -0
  29. package/src/integration-adapter-supabase-crm/client.ts +605 -0
  30. package/src/integration-adapter-supabase-crm/index.ts +28 -0
  31. package/src/integration-adapter-supabase-crm/pipedrive-sync-target.ts +482 -0
  32. package/src/integration-adapter-supabase-crm/supabase-rest.ts +89 -0
  33. package/src/integration-adapter-supabase-crm/tenant-registry.ts +334 -0
  34. package/src/integration-adapter-supabase-crm/tests/change-balance.pbt.test.ts +83 -0
  35. package/src/integration-adapter-supabase-crm/tests/funnel-persistence.test.ts +409 -0
  36. package/src/integration-adapter-supabase-crm/tests/lifecycle-sync.test.ts +288 -0
  37. package/src/integration-adapter-supabase-crm/tests/stage-map.test.ts +80 -0
  38. package/src/integration-adapter-supabase-crm/vitest.config.ts +8 -0
  39. package/src/integration-adapter-supabase-crm/worker.ts +223 -0
  40. package/src/observability/conventions.ts +93 -0
  41. package/src/observability/env-resolver.ts +57 -0
  42. package/src/observability/index.ts +57 -0
  43. package/src/observability/metric-registry.ts +184 -0
  44. package/src/observability/otlp-converter.ts +125 -0
  45. package/src/observability/otlp-json.ts +135 -0
  46. package/src/observability/otlp-transport.ts +68 -0
  47. package/src/observability/pusher.ts +142 -0
  48. package/src/observability/redact.ts +27 -0
  49. package/src/observability/tests/conventions.test.ts +100 -0
  50. package/src/observability/tests/metric-registry.test.ts +117 -0
  51. package/src/observability/tests/otlp-converter.pbt.test.ts +77 -0
  52. package/src/observability/tests/otlp-converter.test.ts +157 -0
  53. package/src/observability/tests/otlp-json.test.ts +120 -0
  54. package/src/observability/tests/pusher.test.ts +75 -0
  55. package/src/observability/tests/redact.pbt.test.ts +71 -0
  56. package/src/observability/tests/redact.test.ts +37 -0
  57. package/src/observability/typed-refs.ts +137 -0
  58. package/src/observability/vitest.config.ts +8 -0
  59. package/src/ontology/analytics/matomo-binding.yaml +172 -0
  60. package/src/ontology/analytics/matomo-fleet.registry.yaml +26 -0
  61. package/src/ontology/analytics/messkanon.yaml +151 -0
  62. package/src/ontology/archetype-registry.ts +61 -0
  63. package/src/ontology/archetypes/components/brand-label.yaml +19 -0
  64. package/src/ontology/archetypes/components/copyright.yaml +19 -0
  65. package/src/ontology/archetypes/components/currency-aware-price-display.yaml +19 -0
  66. package/src/ontology/archetypes/components/currency-selector.yaml +19 -0
  67. package/src/ontology/archetypes/components/footer-promo.yaml +19 -0
  68. package/src/ontology/archetypes/components/lang-switcher.yaml +19 -0
  69. package/src/ontology/archetypes/components/layout.yaml +19 -0
  70. package/src/ontology/archetypes/components/live-photo.yaml +20 -0
  71. package/src/ontology/archetypes/components/material-credit.yaml +20 -0
  72. package/src/ontology/archetypes/components/media.yaml +21 -0
  73. package/src/ontology/archetypes/components/nachweis-card.yaml +34 -0
  74. package/src/ontology/archetypes/components/nachweis-detail.yaml +43 -0
  75. package/src/ontology/archetypes/components/nachweis-list.yaml +37 -0
  76. package/src/ontology/archetypes/components/nachweis-verify.yaml +31 -0
  77. package/src/ontology/archetypes/components/not-found.yaml +22 -0
  78. package/src/ontology/archetypes/components/offer-capacity.yaml +21 -0
  79. package/src/ontology/archetypes/components/passport-header.yaml +19 -0
  80. package/src/ontology/archetypes/components/passport-provenance.yaml +20 -0
  81. package/src/ontology/archetypes/components/passport-score-grid.yaml +20 -0
  82. package/src/ontology/archetypes/components/passport-star-map.yaml +20 -0
  83. package/src/ontology/archetypes/components/person-profile.yaml +20 -0
  84. package/src/ontology/archetypes/components/pulsar.yaml +20 -0
  85. package/src/ontology/archetypes/components/responsive-image.yaml +19 -0
  86. package/src/ontology/archetypes/components/scroll-to-top.yaml +22 -0
  87. package/src/ontology/archetypes/components/social-meta.yaml +20 -0
  88. package/src/ontology/archetypes/components/structured-data.yaml +19 -0
  89. package/src/ontology/archetypes/index.json +1003 -0
  90. package/src/ontology/archetypes/index.yaml +821 -0
  91. package/src/ontology/archetypes/sections/approach.yaml +23 -0
  92. package/src/ontology/archetypes/sections/article-list.yaml +30 -0
  93. package/src/ontology/archetypes/sections/audience-cards.yaml +30 -0
  94. package/src/ontology/archetypes/sections/breadcrumbs.yaml +21 -0
  95. package/src/ontology/archetypes/sections/chat-widget.yaml +37 -0
  96. package/src/ontology/archetypes/sections/comparison-cards.yaml +31 -0
  97. package/src/ontology/archetypes/sections/controlled-responsibility-block.yaml +34 -0
  98. package/src/ontology/archetypes/sections/credits.yaml +29 -0
  99. package/src/ontology/archetypes/sections/donation-card.yaml +53 -0
  100. package/src/ontology/archetypes/sections/donation-use.yaml +23 -0
  101. package/src/ontology/archetypes/sections/dynamic-status-block.yaml +35 -0
  102. package/src/ontology/archetypes/sections/faq-list.yaml +26 -0
  103. package/src/ontology/archetypes/sections/final-cta.yaml +53 -0
  104. package/src/ontology/archetypes/sections/hero-decision-card.yaml +65 -0
  105. package/src/ontology/archetypes/sections/hero.yaml +50 -0
  106. package/src/ontology/archetypes/sections/impact.yaml +23 -0
  107. package/src/ontology/archetypes/sections/markdown.yaml +43 -0
  108. package/src/ontology/archetypes/sections/mountain-journey.yaml +43 -0
  109. package/src/ontology/archetypes/sections/navigation.yaml +20 -0
  110. package/src/ontology/archetypes/sections/notausgang-block.yaml +41 -0
  111. package/src/ontology/archetypes/sections/open-source-registry.yaml +26 -0
  112. package/src/ontology/archetypes/sections/ownership-block.yaml +57 -0
  113. package/src/ontology/archetypes/sections/people.yaml +48 -0
  114. package/src/ontology/archetypes/sections/price-card.yaml +50 -0
  115. package/src/ontology/archetypes/sections/problem.yaml +23 -0
  116. package/src/ontology/archetypes/sections/send-message.yaml +63 -0
  117. package/src/ontology/archetypes/sections/service-metadata-block.yaml +40 -0
  118. package/src/ontology/archetypes/sections/social-proof.yaml +27 -0
  119. package/src/ontology/archetypes/sections/transparency.yaml +32 -0
  120. package/src/ontology/archetypes/sections/trust-strip.yaml +42 -0
  121. package/src/ontology/archetypes/sections/video-section.yaml +27 -0
  122. package/src/ontology/archetypes/sections/women.yaml +29 -0
  123. package/src/ontology/biome-token-projection.ts +229 -0
  124. package/src/ontology/biomes/check-concrete-blueprint.yaml +118 -0
  125. package/src/ontology/biomes/handwerk-material-warm.yaml +135 -0
  126. package/src/ontology/biomes/nonprofit-trust.yaml +123 -0
  127. package/src/ontology/blueprints/offer.yaml +39 -0
  128. package/src/ontology/blueprints/prompts/local-market-signal.md +13 -0
  129. package/src/ontology/blueprints/prompts/website-local-narrative.md +24 -0
  130. package/src/ontology/blueprints/ratgeber.yaml +62 -0
  131. package/src/ontology/blueprints/website-local.yaml +309 -0
  132. package/src/ontology/blueprints/website-service.yaml +84 -0
  133. package/src/ontology/capabilities/lead.submit.yaml +44 -0
  134. package/src/ontology/cosmic/index.ts +48 -0
  135. package/src/ontology/cosmic/moon-catalog.ts +173 -0
  136. package/src/ontology/cosmic/planet-catalog.ts +82 -0
  137. package/src/ontology/cosmic/star-catalog.ts +337 -0
  138. package/src/ontology/enums.ts +159 -0
  139. package/src/ontology/external-surfaces/index.ts +158 -0
  140. package/src/ontology/external-surfaces/jsonld-types.yaml +135 -0
  141. package/src/ontology/external-surfaces/sitemap-shape.yaml +6 -0
  142. package/src/ontology/external-surfaces/url-schema.yaml +95 -0
  143. package/src/ontology/growth/events/contact-email-click.yaml +21 -0
  144. package/src/ontology/growth/events/contact-form-submit.yaml +25 -0
  145. package/src/ontology/growth/events/contact-phone-click.yaml +21 -0
  146. package/src/ontology/growth/events/contact-route-click.yaml +21 -0
  147. package/src/ontology/growth/events/contact-submit.yaml +28 -0
  148. package/src/ontology/growth/events/contact-whatsapp-click.yaml +21 -0
  149. package/src/ontology/growth/events/cta-click.yaml +30 -0
  150. package/src/ontology/growth/events/donation-confirmed.yaml +32 -0
  151. package/src/ontology/growth/events/donation-form-start.yaml +21 -0
  152. package/src/ontology/growth/events/donation-form-submit.yaml +29 -0
  153. package/src/ontology/growth/events/donation-intent.yaml +29 -0
  154. package/src/ontology/growth/events/form-error.yaml +27 -0
  155. package/src/ontology/growth/events/form-start.yaml +21 -0
  156. package/src/ontology/growth/events/form-submit.yaml +21 -0
  157. package/src/ontology/growth/events/outbound-click.yaml +25 -0
  158. package/src/ontology/growth/events/page-view.yaml +24 -0
  159. package/src/ontology/growth/events/passport-view.yaml +28 -0
  160. package/src/ontology/growth/events/star-map-navigate.yaml +30 -0
  161. package/src/ontology/index.ts +165 -0
  162. package/src/ontology/manifest.ts +344 -0
  163. package/src/ontology/operations/index.ts +1 -0
  164. package/src/ontology/schemas/biome.ts +303 -0
  165. package/src/ontology/schemas/capability.ts +104 -0
  166. package/src/ontology/schemas/constellation.ts +114 -0
  167. package/src/ontology/schemas/dns-records.ts +53 -0
  168. package/src/ontology/schemas/index.ts +95 -0
  169. package/src/ontology/schemas/manifest-resolver.ts +123 -0
  170. package/src/ontology/schemas/page-entry.ts +213 -0
  171. package/src/ontology/schemas/section-archetype.ts +109 -0
  172. package/src/ontology/schemas/site-family.ts +98 -0
  173. package/src/ontology/schemas/system/growth.ts +80 -0
  174. package/src/ontology/schemas/system/integrations.ts +143 -0
  175. package/src/ontology/schemas/system/manifest.ts +492 -0
  176. package/src/ontology/schemas/system/page-output.ts +99 -0
  177. package/src/ontology/schemas/system/release.ts +58 -0
  178. package/src/ontology/schemas/system/text.ts +58 -0
  179. package/src/ontology/schemas/system.ts +53 -0
  180. package/src/ontology/shared-section-props/body-fragments.ts +182 -0
  181. package/src/ontology/shared-section-props/catalog.ts +195 -0
  182. package/src/ontology/shared-section-props/common.ts +178 -0
  183. package/src/ontology/shared-section-props/index.ts +34 -0
  184. package/src/ontology/shared-section-props/visual-header.ts +163 -0
  185. package/src/ontology/site-families/charity-donation-trust/cultural-rules.yaml +6 -0
  186. package/src/ontology/site-families/charity-donation-trust/family.yaml +44 -0
  187. package/src/ontology/site-families/charity-donation-trust/linguistic-rules.yaml +6 -0
  188. package/src/ontology/site-families/check-quality-operator/cultural-rules.yaml +6 -0
  189. package/src/ontology/site-families/check-quality-operator/family.yaml +40 -0
  190. package/src/ontology/site-families/check-quality-operator/linguistic-rules.yaml +6 -0
  191. package/src/ontology/site-families/handwerk-trust-engineering/cultural-rules.yaml +6 -0
  192. package/src/ontology/site-families/handwerk-trust-engineering/family.yaml +53 -0
  193. package/src/ontology/site-families/handwerk-trust-engineering/linguistic-rules.yaml +6 -0
  194. package/src/ontology/tests/catalogs.pbt.test.ts +89 -0
  195. package/src/ontology/tests/enums.test.ts +203 -0
  196. package/src/ontology/tests/sternsystem-owner.test.ts +63 -0
  197. package/src/ontology/vitest.config.ts +8 -0
  198. package/src/passport/dht-sign.test.ts +99 -0
  199. package/src/passport/dht-sign.ts +73 -0
  200. package/src/passport/identity-sign.test.ts +134 -0
  201. package/src/passport/identity-sign.ts +85 -0
  202. package/src/passport/index.ts +53 -0
  203. package/src/passport/key-rotate.ts +133 -0
  204. package/src/passport/schema.ts +198 -0
  205. package/src/passport/sign.ts +225 -0
  206. package/src/passport/tests/schema.pbt.test.ts +93 -0
  207. package/src/passport/tests/schema.test.ts +222 -0
  208. package/src/passport/vitest.config.ts +8 -0
  209. package/src/share/agent/api-catalog.ts +77 -0
  210. package/src/share/agent/capability.ts +68 -0
  211. package/src/share/agent/dns-aid.test.ts +74 -0
  212. package/src/share/agent/dns-aid.ts +53 -0
  213. package/src/share/agent/fleet-catalog.ts +149 -0
  214. package/src/share/agent/index.ts +29 -0
  215. package/src/share/agent/knowledge.ts +96 -0
  216. package/src/share/agent/manifest.ts +126 -0
  217. package/src/share/agent/mcp-card.ts +63 -0
  218. package/src/share/agent/omit-empty.ts +77 -0
  219. package/src/share/agent/openapi.ts +157 -0
  220. package/src/share/agent/proof.ts +61 -0
  221. package/src/share/attribution-display.ts +86 -0
  222. package/src/share/check-hints.ts +38 -0
  223. package/src/share/content/entity-id.ts +65 -0
  224. package/src/share/content/index.ts +16 -0
  225. package/src/share/content/merge.ts +86 -0
  226. package/src/share/content/resolve-field-path.ts +39 -0
  227. package/src/share/content/substitute-deep.ts +47 -0
  228. package/src/share/content-discipline/index.ts +14 -0
  229. package/src/share/content-discipline/parsers.ts +66 -0
  230. package/src/share/content-discipline/types.ts +118 -0
  231. package/src/share/content-reference.ts +333 -0
  232. package/src/share/counter-utils.ts +75 -0
  233. package/src/share/css-value-normalize.ts +48 -0
  234. package/src/share/dev-props-validator.ts +131 -0
  235. package/src/share/entitlement.ts +172 -0
  236. package/src/share/env.d.ts +73 -0
  237. package/src/share/feature-policy.ts +367 -0
  238. package/src/share/formula-eval.ts +364 -0
  239. package/src/share/fs/index.ts +96 -0
  240. package/src/share/i18n/localization.ts +57 -0
  241. package/src/share/image-provider.ts +314 -0
  242. package/src/share/index.ts +86 -0
  243. package/src/share/knowledge/claim.ts +129 -0
  244. package/src/share/knowledge/derivation.ts +55 -0
  245. package/src/share/knowledge/freshness.ts +127 -0
  246. package/src/share/knowledge/index.ts +23 -0
  247. package/src/share/knowledge/ledger.ts +222 -0
  248. package/src/share/knowledge/plan.ts +122 -0
  249. package/src/share/knowledge/source.ts +170 -0
  250. package/src/share/legal/translation-policy.ts +133 -0
  251. package/src/share/material-credits.ts +181 -0
  252. package/src/share/middleware/language-redirect.ts +49 -0
  253. package/src/share/offer-capacity.ts +149 -0
  254. package/src/share/onboarding-yaml/index.ts +162 -0
  255. package/src/share/page.ts +351 -0
  256. package/src/share/redirects.test.ts +62 -0
  257. package/src/share/redirects.ts +54 -0
  258. package/src/share/rfc0042-utils.ts +95 -0
  259. package/src/share/runtime-context.ts +70 -0
  260. package/src/share/schemas/claim-records.ts +69 -0
  261. package/src/share/schemas/claims.ts +150 -0
  262. package/src/share/schemas/effects.ts +212 -0
  263. package/src/share/schemas/features.ts +147 -0
  264. package/src/share/schemas/horizontal-align.ts +22 -0
  265. package/src/share/schemas/icon-color.ts +27 -0
  266. package/src/share/schemas/index.ts +43 -0
  267. package/src/share/schemas/live-photo.ts +53 -0
  268. package/src/share/schemas/material-credit.ts +292 -0
  269. package/src/share/schemas/media.ts +220 -0
  270. package/src/share/schemas/navigation.ts +74 -0
  271. package/src/share/schemas/page-base.ts +33 -0
  272. package/src/share/schemas/participant.ts +247 -0
  273. package/src/share/schemas/person.ts +24 -0
  274. package/src/share/schemas/print.ts +93 -0
  275. package/src/share/schemas/section-background.ts +106 -0
  276. package/src/share/schemas/section-body.ts +138 -0
  277. package/src/share/schemas/section-cards.ts +37 -0
  278. package/src/share/schemas/section-cta.ts +74 -0
  279. package/src/share/schemas/section-header.ts +77 -0
  280. package/src/share/schemas/section-image.ts +77 -0
  281. package/src/share/schemas/section-motion.ts +52 -0
  282. package/src/share/schemas/section-shell.ts +63 -0
  283. package/src/share/schemas/section-stats.ts +37 -0
  284. package/src/share/schemas/site-background.ts +78 -0
  285. package/src/share/schemas/standard-list-item.ts +38 -0
  286. package/src/share/scripts/external-links.ts +45 -0
  287. package/src/share/scripts/gsap-counter.ts +168 -0
  288. package/src/share/scripts/gsap-mountain-journey.ts +236 -0
  289. package/src/share/scripts/gsap-parallax.ts +50 -0
  290. package/src/share/scripts/gsap-reveal.ts +65 -0
  291. package/src/share/scripts/gsap-stagger.ts +54 -0
  292. package/src/share/scripts/index.ts +25 -0
  293. package/src/share/scripts/inline-number-animation.ts +120 -0
  294. package/src/share/scripts/lenis.ts +109 -0
  295. package/src/share/scripts/live-photos.ts +250 -0
  296. package/src/share/scripts/lordicon.ts +94 -0
  297. package/src/share/scripts/orchestrator.ts +138 -0
  298. package/src/share/scripts/scheduler.ts +53 -0
  299. package/src/share/scripts/video-player.ts +116 -0
  300. package/src/share/semantic/ai.ts +140 -0
  301. package/src/share/semantic/block-extraction.ts +52 -0
  302. package/src/share/semantic/block-extractors/index.ts +502 -0
  303. package/src/share/semantic/breadcrumbs.ts +120 -0
  304. package/src/share/semantic/build-page.ts +309 -0
  305. package/src/share/semantic/business-projection.ts +278 -0
  306. package/src/share/semantic/derived-prices-loader.ts +36 -0
  307. package/src/share/semantic/extract.ts +118 -0
  308. package/src/share/semantic/feed.ts +124 -0
  309. package/src/share/semantic/ids.ts +76 -0
  310. package/src/share/semantic/image-sitemap.ts +153 -0
  311. package/src/share/semantic/index.ts +36 -0
  312. package/src/share/semantic/jsonld/article.ts +47 -0
  313. package/src/share/semantic/jsonld/breadcrumb.ts +47 -0
  314. package/src/share/semantic/jsonld/collection-list.ts +30 -0
  315. package/src/share/semantic/jsonld/context.ts +46 -0
  316. package/src/share/semantic/jsonld/faq.ts +49 -0
  317. package/src/share/semantic/jsonld/initiative.ts +53 -0
  318. package/src/share/semantic/jsonld/organization.ts +101 -0
  319. package/src/share/semantic/jsonld/person.ts +71 -0
  320. package/src/share/semantic/jsonld/service.ts +80 -0
  321. package/src/share/semantic/jsonld/shared.ts +31 -0
  322. package/src/share/semantic/jsonld/types.ts +18 -0
  323. package/src/share/semantic/jsonld/webpage.ts +98 -0
  324. package/src/share/semantic/jsonld/website.ts +27 -0
  325. package/src/share/semantic/jsonld.ts +75 -0
  326. package/src/share/semantic/llms-policy.ts +74 -0
  327. package/src/share/semantic/llms.ts +394 -0
  328. package/src/share/semantic/markdown-hygiene.ts +68 -0
  329. package/src/share/semantic/markdown-twin-provenance.ts +242 -0
  330. package/src/share/semantic/models.ts +402 -0
  331. package/src/share/semantic/organization-profile.ts +160 -0
  332. package/src/share/semantic/output-projection.ts +131 -0
  333. package/src/share/semantic/page-builders/markdown-page.ts +84 -0
  334. package/src/share/semantic/page-markdown.ts +234 -0
  335. package/src/share/semantic/page-utils.ts +125 -0
  336. package/src/share/semantic/price-marker-resolver.ts +92 -0
  337. package/src/share/semantic/robots.ts +127 -0
  338. package/src/share/semantic/update-stamp.ts +136 -0
  339. package/src/share/shared-context.ts +177 -0
  340. package/src/share/string-utils.ts +19 -0
  341. package/src/share/tests/api-catalog.test.ts +97 -0
  342. package/src/share/tests/breadcrumbs.test.ts +126 -0
  343. package/src/share/tests/build-page-price-markers.test.ts +160 -0
  344. package/src/share/tests/capability.test.ts +107 -0
  345. package/src/share/tests/claim.test.ts +90 -0
  346. package/src/share/tests/content-ref-index.test.ts +328 -0
  347. package/src/share/tests/create-dev-props-validator.test.ts +38 -0
  348. package/src/share/tests/derivation.test.ts +39 -0
  349. package/src/share/tests/dev-props-validator.test.ts +88 -0
  350. package/src/share/tests/fleet-catalog.test.ts +134 -0
  351. package/src/share/tests/formula-eval.test.ts +619 -0
  352. package/src/share/tests/freshness.test.ts +60 -0
  353. package/src/share/tests/hero-section-numbering-parity.test.ts +51 -0
  354. package/src/share/tests/image-sitemap.test.ts +101 -0
  355. package/src/share/tests/jsonld-service.test.ts +282 -0
  356. package/src/share/tests/knowledge.test.ts +86 -0
  357. package/src/share/tests/ledger.test.ts +125 -0
  358. package/src/share/tests/llms-0789.test.ts +63 -0
  359. package/src/share/tests/manifest.test.ts +100 -0
  360. package/src/share/tests/markdown-twin-provenance.test.ts +108 -0
  361. package/src/share/tests/mcp-card.test.ts +57 -0
  362. package/src/share/tests/onboarding-yaml.test.ts +111 -0
  363. package/src/share/tests/ontology-role-by-cosmic-name.test.ts +28 -0
  364. package/src/share/tests/openapi.test.ts +116 -0
  365. package/src/share/tests/organization-jsonld.test.ts +74 -0
  366. package/src/share/tests/output-projection.test.ts +61 -0
  367. package/src/share/tests/plan.test.ts +97 -0
  368. package/src/share/tests/price-marker-resolver.test.ts +141 -0
  369. package/src/share/tests/proof.test.ts +72 -0
  370. package/src/share/tests/resolve-field-path.test.ts +52 -0
  371. package/src/share/tests/source.test.ts +81 -0
  372. package/src/share/tests/substitute-deep.test.ts +65 -0
  373. package/src/share/tests/text-normalize.pbt.test.ts +143 -0
  374. package/src/share/tests/text-normalize.test.ts +285 -0
  375. package/src/share/tests/twin-path.test.ts +43 -0
  376. package/src/share/text-normalize.ts +548 -0
  377. package/src/share/text-position.ts +19 -0
  378. package/src/share/types/hls-js-light.d.ts +16 -0
  379. package/src/share/visibility.ts +167 -0
  380. package/src/share/vitest.config.ts +8 -0
  381. package/src/share/wrap-inline-numbers.ts +139 -0
  382. package/src/surface/blueprint-schema.ts +314 -0
  383. package/src/surface/blueprint-types.ts +256 -0
  384. package/src/surface/blueprint.ts +300 -0
  385. package/src/surface/breaker.ts +57 -0
  386. package/src/surface/decision-composer.ts +156 -0
  387. package/src/surface/eligibility.ts +372 -0
  388. package/src/surface/evidence-records.ts +97 -0
  389. package/src/surface/fleet.ts +60 -0
  390. package/src/surface/geo.ts +170 -0
  391. package/src/surface/governance.ts +146 -0
  392. package/src/surface/index.ts +216 -0
  393. package/src/surface/io/index.ts +18 -0
  394. package/src/surface/io/surface-module-context-io.ts +60 -0
  395. package/src/surface/io/visibility-outcomes-io.ts +46 -0
  396. package/src/surface/module-context.ts +120 -0
  397. package/src/surface/substance.ts +161 -0
  398. package/src/surface/tests/eligibility.pbt.test.ts +137 -0
  399. package/src/surface/tests/eligibility.test.ts +302 -0
  400. package/src/surface/types.ts +289 -0
  401. package/src/surface/visibility.ts +57 -0
  402. package/src/surface/vitest.config.ts +8 -0
  403. package/tsconfig.json +17 -0
@@ -0,0 +1,439 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ RFC-0168 / RFC-0176 / RFC-0181: Integration orchestration — adapter registries,
5
+ fan-out functions, inbound authentication, and legacy delivery substrate types.
6
+ Separated from the barrel (index.ts) so type-only consumers don't transitively
7
+ import adapter implementations.
8
+ </purpose>
9
+ <non-goals>
10
+ <item>Do not import astro:env — the caller injects the secrets bag.</item>
11
+ <item>Do not re-export sibling module types — that is the barrel's job.</item>
12
+ </non-goals>
13
+ </MODULE_CONTRACT>
14
+ <CHANGE_SUMMARY>
15
+ <item>Extracted from integration/index.ts — registries + fan-out + legacy types moved here; index.ts is now a pure barrel.</item>
16
+ </CHANGE_SUMMARY>
17
+ */
18
+
19
+ import {
20
+ pipedriveCrmAdapter,
21
+ pipedriveDestinationAdapter,
22
+ telegramChannelAdapter,
23
+ whatsappChannelAdapter,
24
+ } from "./adapters.ts";
25
+ import type {
26
+ CrmAdapter,
27
+ DestinationAdapter,
28
+ DestinationKind,
29
+ IntegrationChannelAdapter,
30
+ IntegrationEvent,
31
+ IntegrationSecrets,
32
+ Lead,
33
+ LeadMessage,
34
+ } from "./port.ts";
35
+ import { DESTINATION_KINDS, EXECUTION_MODES, eventToLeadMessage } from "./port.ts";
36
+ import { LifecycleEventPayloadSchema } from "./lifecycle.ts";
37
+ import { z } from "zod";
38
+
39
+ // @ai-invariant: CHANNEL_ADAPTERS and CRM_ADAPTERS are closed registries.
40
+ // Adding a channel/CRM = add one adapter entry here. The adapter self-enables
41
+ // by secret presence — no per-channel code in routes. Never log the secrets
42
+ // bag; log only adapter id + error message.
43
+
44
+ /** Closed channel adapter registry (RFC-0168). Add a channel = add an entry here.
45
+ * RFC-0181: email is no longer a fetch channel adapter — it is sent via Cloudflare
46
+ * Email Routing (send_email binding) in the delivery callback. */
47
+ export const CHANNEL_ADAPTERS: readonly IntegrationChannelAdapter[] = [
48
+ telegramChannelAdapter,
49
+ whatsappChannelAdapter,
50
+ ];
51
+
52
+ /** Closed CRM adapter registry (RFC-0168). */
53
+ export const CRM_ADAPTERS: readonly CrmAdapter[] = [pipedriveCrmAdapter];
54
+
55
+ /**
56
+ * Closed catalog of configurable channel adapter ids (RFC-0168). `"null"` is the
57
+ * safe no-op binding (explicitly declared "no channel"). Used by
58
+ * integration.config.validate to reject unknown adapter ids in system.md.
59
+ */
60
+ export const CHANNEL_ADAPTER_IDS: readonly string[] = [
61
+ ...CHANNEL_ADAPTERS.map((adapter) => adapter.id),
62
+ "null",
63
+ ];
64
+
65
+ /** Closed catalog of configurable CRM adapter ids (RFC-0168). `"null"` = no CRM. */
66
+ export const CRM_ADAPTER_IDS: readonly string[] = [
67
+ ...CRM_ADAPTERS.map((adapter) => adapter.id),
68
+ "null",
69
+ ];
70
+
71
+ /**
72
+ * Adapter id → required env secret names, across channels + CRM (RFC-0168). The
73
+ * `"null"` adapter requires none. Used by integration.secrets.validate to assert a
74
+ * configured adapter's secrets are present in the generated env schema.
75
+ */
76
+ export const INTEGRATION_ADAPTER_SECRETS: Readonly<Record<string, readonly string[]>> = {
77
+ null: [],
78
+ ...Object.fromEntries(CHANNEL_ADAPTERS.map((adapter) => [adapter.id, adapter.requiredSecrets])),
79
+ ...Object.fromEntries(CRM_ADAPTERS.map((adapter) => [adapter.id, adapter.requiredSecrets])),
80
+ };
81
+
82
+ function hasAllSecrets(secrets: IntegrationSecrets, keys: readonly string[]): boolean {
83
+ return keys.every((key) => Boolean(secrets[key]?.trim()));
84
+ }
85
+
86
+ export interface DeliverResult {
87
+ delivered: string[];
88
+ failed: string[];
89
+ /** Channels left dormant because their required secrets are absent. */
90
+ skipped: string[];
91
+ }
92
+
93
+ /** Fan out to every channel whose required secrets are present. Best-effort. */
94
+ export async function deliverLead(
95
+ message: LeadMessage,
96
+ secrets: IntegrationSecrets,
97
+ ): Promise<DeliverResult> {
98
+ const delivered: string[] = [];
99
+ const failed: string[] = [];
100
+ const skipped: string[] = [];
101
+ for (const adapter of CHANNEL_ADAPTERS) {
102
+ if (!hasAllSecrets(secrets, adapter.requiredSecrets)) {
103
+ skipped.push(adapter.id);
104
+ continue;
105
+ }
106
+ try {
107
+ await adapter.deliver(message, secrets);
108
+ delivered.push(adapter.id);
109
+ } catch (err) {
110
+ // Never log the secrets bag; log only the adapter id + error message.
111
+ console.warn(`[integration] channel "${adapter.id}" failed:`, (err as Error).message);
112
+ failed.push(adapter.id);
113
+ }
114
+ }
115
+ return { delivered, failed, skipped };
116
+ }
117
+
118
+ /** Readiness of one adapter: ready when every required secret is present. */
119
+ export interface AdapterReadiness {
120
+ id: string;
121
+ kind: "channel" | "crm";
122
+ ready: boolean;
123
+ /** Required secret keys that are absent (gentle, actionable hint — names only). */
124
+ missing: string[];
125
+ }
126
+
127
+ /**
128
+ * Pure, framework-agnostic readiness audit shared across the ecosystem (RFC-0168):
129
+ * the send-message handler uses it for a gentle server-side notice, and
130
+ * `integration.secrets.audit` uses it for the build-time advisory. Reports only
131
+ * secret NAMES, never values. Pass `ids` to restrict the audit to the adapters a
132
+ * site actually intends (e.g. its system.md `integrations:` block).
133
+ */
134
+ export function auditIntegrationReadiness(
135
+ secrets: IntegrationSecrets,
136
+ ids?: { channels?: readonly string[]; crm?: readonly string[] },
137
+ ): AdapterReadiness[] {
138
+ const wantChannel = (id: string) => !ids?.channels || ids.channels.includes(id);
139
+ const wantCrm = (id: string) => !ids?.crm || ids.crm.includes(id);
140
+ const report: AdapterReadiness[] = [];
141
+ for (const adapter of CHANNEL_ADAPTERS) {
142
+ if (!wantChannel(adapter.id)) continue;
143
+ const missing = adapter.requiredSecrets.filter((key) => !secrets[key]?.trim());
144
+ report.push({ id: adapter.id, kind: "channel", ready: missing.length === 0, missing });
145
+ }
146
+ for (const adapter of CRM_ADAPTERS) {
147
+ if (!wantCrm(adapter.id)) continue;
148
+ const missing = adapter.requiredSecrets.filter((key) => !secrets[key]?.trim());
149
+ report.push({ id: adapter.id, kind: "crm", ready: missing.length === 0, missing });
150
+ }
151
+ return report;
152
+ }
153
+
154
+ // ---------------------------------------------------------------------------
155
+ // RFC-0176: source-agnostic destination hub
156
+ // ---------------------------------------------------------------------------
157
+
158
+ // @ai-invariant: DESTINATION_ADAPTERS is a closed registry. Every destination
159
+ // adapter self-enables by secret presence. When BOTH a buffer adapter AND a
160
+ // direct adapter are active for the same (kind, vendor),
161
+ // integration.config.validate reports "multiple-active-executors".
162
+
163
+ /** Closed registry of gogol-adapter destination implementations (RFC-0176). */
164
+ export const DESTINATION_ADAPTERS: readonly DestinationAdapter[] = [pipedriveDestinationAdapter];
165
+
166
+ /**
167
+ * Externally-implemented destination vendors whose adapters live in separate packages
168
+ * (RFC-0186/0190). These vendors are valid `gogol-adapter` targets but cannot be
169
+ * registered in `DESTINATION_ADAPTERS` because their adapter packages depend on
170
+ * `@warpgogol/werkstatt-site/integration` (circular-dep guard). The adapter is injected at runtime via
171
+ * `extraAdapters`; the validator checks vendor + secrets against these catalogs.
172
+ */
173
+ export const EXTERNAL_DESTINATION_VENDORS: Readonly<Record<DestinationKind, readonly string[]>> = {
174
+ crm: ["supabase-buffer"],
175
+ calendar: [],
176
+ email: [],
177
+ scheduler: [],
178
+ };
179
+
180
+ /** Per `(kind, vendor)` → required secret names for externally-implemented adapters. */
181
+ export const EXTERNAL_DESTINATION_SECRETS: Readonly<Record<string, readonly string[]>> = {
182
+ "crm:supabase-buffer": [
183
+ "SUPABASE_BUFFER_URL",
184
+ "SUPABASE_BUFFER_SERVICE_KEY",
185
+ "SUPABASE_BUFFER_TENANT_ID",
186
+ ],
187
+ };
188
+
189
+ /** Closed per-kind vendor catalog, derived from the registry + external vendors (RFC-0176/0186). */
190
+ export const DESTINATION_VENDORS_BY_KIND: Readonly<Record<DestinationKind, readonly string[]>> =
191
+ Object.fromEntries(
192
+ DESTINATION_KINDS.map((kind) => [
193
+ kind,
194
+ [
195
+ ...new Set(DESTINATION_ADAPTERS.filter((a) => a.kind === kind).map((a) => a.vendor)),
196
+ ...(EXTERNAL_DESTINATION_VENDORS[kind] ?? []),
197
+ ],
198
+ ]),
199
+ ) as unknown as Record<DestinationKind, readonly string[]>;
200
+
201
+ /** Per `(kind, vendor)` → required secret names (gogol-adapter mode only). */
202
+ export const DESTINATION_ADAPTER_SECRETS: Readonly<Record<string, readonly string[]>> = {
203
+ ...Object.fromEntries(
204
+ DESTINATION_ADAPTERS.map((a) => [`${a.kind}:${a.vendor}`, a.requiredSecrets]),
205
+ ),
206
+ ...EXTERNAL_DESTINATION_SECRETS,
207
+ };
208
+
209
+ /** A configured destination from system.md integrations.destinations[]. */
210
+ export interface DestinationConfig {
211
+ kind: DestinationKind;
212
+ vendor: string;
213
+ mode: (typeof EXECUTION_MODES)[number];
214
+ }
215
+
216
+ export interface RouteResult {
217
+ /** `${kind}:${vendor}` ids routed successfully. */
218
+ routed: string[];
219
+ /** `${kind}:${vendor}` ids that threw. */
220
+ failed: string[];
221
+ /** Skipped because dedup saw this eventId+destination, or secrets absent. */
222
+ skipped: string[];
223
+ }
224
+
225
+ /**
226
+ * Route an IntegrationEvent to its configured `gogol-adapter` destinations,
227
+ * running on the client's site with the client's tokens. `vendor-native`
228
+ * destinations are NOT executed here (an upstream vendor runs them).
229
+ *
230
+ * Pure + injectable: pass `seen` (a dedup set keyed by `${eventId}:${kind}:${vendor}`)
231
+ * so a queue redelivery never double-writes. Best-effort per destination.
232
+ */
233
+ export async function routeEvent(
234
+ event: IntegrationEvent,
235
+ destinations: readonly DestinationConfig[],
236
+ secrets: IntegrationSecrets,
237
+ seen?: { has(key: string): boolean | Promise<boolean>; add(key: string): unknown },
238
+ /** Optional adapter registry override — defaults to DESTINATION_ADAPTERS. */
239
+ adapters?: readonly DestinationAdapter[],
240
+ ): Promise<RouteResult> {
241
+ const registry = adapters ?? DESTINATION_ADAPTERS;
242
+ const routed: string[] = [];
243
+ const failed: string[] = [];
244
+ const skipped: string[] = [];
245
+ for (const dest of destinations) {
246
+ const id = `${dest.kind}:${dest.vendor}`;
247
+ if (dest.mode !== "gogol-adapter") continue; // vendor-native: executed upstream
248
+ const adapter = registry.find((a) => a.kind === dest.kind && a.vendor === dest.vendor);
249
+ if (!adapter || !hasAllSecrets(secrets, adapter.requiredSecrets)) {
250
+ skipped.push(id);
251
+ continue;
252
+ }
253
+ const dedupKey = `${event.eventId}:${id}`;
254
+ if (seen && (await seen.has(dedupKey))) {
255
+ skipped.push(id);
256
+ continue;
257
+ }
258
+ try {
259
+ await adapter.route(event, secrets);
260
+ seen?.add(dedupKey);
261
+ routed.push(id);
262
+ } catch (err) {
263
+ console.warn(`[integration] destination "${id}" failed:`, (err as Error).message);
264
+ failed.push(id);
265
+ }
266
+ }
267
+ return { routed, failed, skipped };
268
+ }
269
+
270
+ // @ai-invariant: authenticateInbound uses constant-time comparison. Must remain
271
+ // fail-closed: an unconfigured inbound route (secret unset) authenticates nothing.
272
+ // IntegrationEventSchema is the validation gate for ALL inbound events.
273
+
274
+ /** Zod schema for an inbound IntegrationEvent (RFC-0176). Rejects malformed posts. */
275
+ export const IntegrationEventSchema = z.object({
276
+ eventId: z.string().min(1),
277
+ kind: z.enum(["lead", "message", "appointment"]),
278
+ source: z.string().min(1),
279
+ locale: z.string().min(2),
280
+ occurredAt: z.string().min(1),
281
+ contact: z
282
+ .object({
283
+ name: z.string().optional(),
284
+ email: z.string().optional(),
285
+ phone: z.string().optional(),
286
+ })
287
+ .optional(),
288
+ payload: z.record(z.string(), z.unknown()).default({}),
289
+ // RFC-0191: optional typed lifecycle payload (Stripe billing events). Additive — a
290
+ // funnel/lead event without it still validates.
291
+ lifecycle: LifecycleEventPayloadSchema.optional(),
292
+ });
293
+
294
+ /**
295
+ * Constant-time-ish equality for the inbound webhook secret. Authenticates a
296
+ * source POST to /api/integration-inbound via a bearer token or X-Integration-Secret
297
+ * header against INTEGRATION_INBOUND_SECRET. Returns false when the secret is unset
298
+ * (fail-closed: an unconfigured inbound route authenticates nothing).
299
+ */
300
+ export function authenticateInbound(headers: Headers, secret: string | undefined): boolean {
301
+ if (!secret) return false;
302
+ const provided =
303
+ headers.get("x-integration-secret") ??
304
+ headers.get("authorization")?.replace(/^Bearer\s+/i, "") ??
305
+ "";
306
+ if (provided.length !== secret.length) return false;
307
+ let mismatch = 0;
308
+ for (let i = 0; i < secret.length; i += 1) {
309
+ mismatch |= provided.charCodeAt(i) ^ secret.charCodeAt(i);
310
+ }
311
+ return mismatch === 0;
312
+ }
313
+
314
+ /**
315
+ * Route an event to every registered gogol-adapter destination whose required
316
+ * secrets are present (self-enabling, mirroring the channel fan-out). Used by the
317
+ * inbound handler and the queue consumer when no explicit destinations list is
318
+ * supplied. `seen` is the optional dedup set (RFC-0176).
319
+ *
320
+ * `extraAdapters` lets a specific site's delivery callback inject additional
321
+ * DestinationAdapters (e.g. supabaseBufferDestinationAdapter) without modifying
322
+ * the closed shared registry. They are self-enabling (skip if secrets absent).
323
+ */
324
+ export function routeEventToReady(
325
+ event: IntegrationEvent,
326
+ secrets: IntegrationSecrets,
327
+ seen?: { has(key: string): boolean | Promise<boolean>; add(key: string): unknown },
328
+ extraAdapters?: readonly DestinationAdapter[],
329
+ ): Promise<RouteResult> {
330
+ const allAdapters = extraAdapters
331
+ ? [...DESTINATION_ADAPTERS, ...extraAdapters]
332
+ : DESTINATION_ADAPTERS;
333
+ const destinations: DestinationConfig[] = allAdapters.map((a) => ({
334
+ kind: a.kind,
335
+ vendor: a.vendor,
336
+ mode: "gogol-adapter",
337
+ }));
338
+ return routeEvent(event, destinations, secrets, seen, allAdapters);
339
+ }
340
+
341
+ /** Combined result of a unified event delivery (channels + destinations). RFC-0181. */
342
+ export interface DeliverEventResult {
343
+ channels: DeliverResult;
344
+ destinations: RouteResult;
345
+ }
346
+
347
+ /**
348
+ * RFC-0181: the standardized fan-out for ANY source (send-message form, chat widget).
349
+ * Runs the event through the channel adapters (Telegram/WhatsApp) AND the gogol-adapter
350
+ * destinations (CRM), with the client's own tokens. Email is NOT here — it is sent via
351
+ * Cloudflare Email Routing (send_email binding) in the callback route. `seen` dedups the
352
+ * destination side on redelivery. Best-effort per sink; the caller decides ack vs retry.
353
+ * `extraAdapters` lets a specific site inject additional DestinationAdapters (e.g.
354
+ * supabaseBufferDestinationAdapter) without modifying the closed shared registry.
355
+ */
356
+ export async function deliverEvent(
357
+ event: IntegrationEvent,
358
+ secrets: IntegrationSecrets,
359
+ seen?: { has(key: string): boolean | Promise<boolean>; add(key: string): unknown },
360
+ extraAdapters?: readonly DestinationAdapter[],
361
+ ): Promise<DeliverEventResult> {
362
+ const channels = await deliverLead(eventToLeadMessage(event), secrets);
363
+ const destinations = await routeEventToReady(event, secrets, seen, extraAdapters);
364
+ return { channels, destinations };
365
+ }
366
+
367
+ /*
368
+ * LEGACY delivery substrate (RFC-0176, Cloudflare Queues + KV).
369
+ *
370
+ * SUPERSEDED for the EU path by the QStash + Upstash Redis substrate in ./qstash.ts
371
+ * (RFC-0181): Cloudflare Queues/KV cannot be pinned to the EU, and the per-site
372
+ * consumer Worker was retired. `cloudflare.residency.validate` now fails the build if a
373
+ * wrangler.jsonc declares queues/KV. These primitives are kept only for the structural
374
+ * contracts + the unit test; production routes publish to QStash and fan out via
375
+ * /api/integration-route. Do NOT wire these into a live delivery path.
376
+ * See docs/specs/integration-delivery.md (authoritative).
377
+ */
378
+
379
+ /** Minimal structural type for a Cloudflare Queue binding (no hard dependency). */
380
+ export interface QueueBinding<T = IntegrationEvent> {
381
+ send(message: T): Promise<void>;
382
+ }
383
+
384
+ /** Minimal structural type for a Cloudflare KV namespace used for dedup. */
385
+ export interface KvDedupStore {
386
+ get(key: string): Promise<string | null>;
387
+ put(key: string, value: string, options?: { expirationTtl?: number }): Promise<void>;
388
+ }
389
+
390
+ /** Wrap a KV namespace as a dedup `seen` set with a short TTL (in-flight only). */
391
+ export function kvDedup(kv: KvDedupStore, ttlSeconds = 86400) {
392
+ return {
393
+ async has(key: string): Promise<boolean> {
394
+ return (await kv.get(key)) !== null;
395
+ },
396
+ add(key: string): void {
397
+ void kv.put(key, "1", { expirationTtl: ttlSeconds });
398
+ },
399
+ };
400
+ }
401
+
402
+ /**
403
+ * LEGACY (RFC-0176, see the banner above). Enqueue an event onto a Cloudflare Queue.
404
+ * The live EU path no longer uses this — sources publish to QStash (./qstash.ts,
405
+ * RFC-0181). Retained for the structural contract + unit test only.
406
+ */
407
+ export async function enqueueEvent(queue: QueueBinding, event: IntegrationEvent): Promise<void> {
408
+ await queue.send(event);
409
+ }
410
+
411
+ /**
412
+ * Process a batch of queued events (the Cloudflare `queue()` consumer body).
413
+ * Dedups via KV, routes to ready gogol-adapter destinations, and ACKs each
414
+ * message; a thrown route lets the platform retry that message (bounded → DLQ).
415
+ */
416
+ export async function consumeIntegrationBatch(
417
+ events: readonly IntegrationEvent[],
418
+ secrets: IntegrationSecrets,
419
+ dedup?: { has(key: string): boolean | Promise<boolean>; add(key: string): unknown },
420
+ ): Promise<RouteResult[]> {
421
+ const results: RouteResult[] = [];
422
+ for (const event of events) {
423
+ results.push(await routeEventToReady(event, secrets, dedup));
424
+ }
425
+ return results;
426
+ }
427
+
428
+ export async function upsertLead(lead: Lead, secrets: IntegrationSecrets): Promise<string | null> {
429
+ for (const adapter of CRM_ADAPTERS) {
430
+ if (!hasAllSecrets(secrets, adapter.requiredSecrets)) continue;
431
+ try {
432
+ const result = await adapter.upsertLead(lead, secrets);
433
+ return result?.id ?? null;
434
+ } catch (err) {
435
+ console.warn(`[integration] crm "${adapter.id}" failed:`, (err as Error).message);
436
+ }
437
+ }
438
+ return null;
439
+ }
@@ -0,0 +1,124 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ RFC-0168: Integration Port barrel — types and pure contracts only. Re-exports from
5
+ port.ts, crm-buffer.ts, funnel.ts, lifecycle.ts, sharding.ts, dispatch.ts, and qstash.ts.
6
+ Type-only consumers import from here to avoid transitively pulling in adapter
7
+ implementations (orchestration.ts → adapters.ts).
8
+ </purpose>
9
+ <non-goals>
10
+ <item>Do not re-export orchestration.ts, delivery-handler.ts, or adapters.ts — those are runtime.</item>
11
+ <item>Do not define logic here — pure re-export barrel.</item>
12
+ </non-goals>
13
+ </MODULE_CONTRACT>
14
+ <CHANGE_SUMMARY>
15
+ <item>Architecture review: split from index.ts so type-only consumers don't transitively import adapter implementations.</item>
16
+ </CHANGE_SUMMARY>
17
+ */
18
+
19
+ export type { IntegrationSecrets } from "./port.ts";
20
+ export type { LeadMessage, Lead, IntegrationChannelAdapter, CrmAdapter } from "./port.ts";
21
+ export type { IntegrationEvent, DestinationAdapter } from "./port.ts";
22
+ export { DESTINATION_KINDS, EXECUTION_MODES, eventToLeadMessage, eventToLead } from "./port.ts";
23
+ export type { DestinationKind, ExecutionMode } from "./port.ts";
24
+
25
+ export type {
26
+ BufferContact,
27
+ BufferOrganization,
28
+ BufferDeal,
29
+ BufferStageTransition,
30
+ BufferFunnelEvent,
31
+ BufferConsentEvent,
32
+ BufferSubscription,
33
+ BufferInvoice,
34
+ BufferUpsertResult,
35
+ OutboxWriteResult,
36
+ CrmBufferWriter,
37
+ CrmBufferReader,
38
+ CrmBufferClient,
39
+ DealPipedriveIdPatch,
40
+ SyncOutboxRow,
41
+ } from "./crm-buffer.ts";
42
+ export {
43
+ BUFFER_DEAL_STAGES,
44
+ FUNNEL_STAGE_TO_BUFFER_STAGE,
45
+ bridgeFunnelStage,
46
+ isFunnelStage,
47
+ SYNC_OUTBOX_STATUSES,
48
+ SYNC_OUTBOX_OPS,
49
+ } from "./crm-buffer.ts";
50
+ export type { BufferDealStage, SyncOutboxStatus, SyncOutboxOp } from "./crm-buffer.ts";
51
+
52
+ export type {
53
+ VisitorFunnelEventPayload,
54
+ FunnelSystemTrigger,
55
+ FunnelTransitionTrigger,
56
+ } from "./funnel.ts";
57
+ export {
58
+ FUNNEL_VERSION,
59
+ VISITOR_FUNNEL_STAGES,
60
+ FUNNEL_ENTRY_STAGE,
61
+ FUNNEL_TERMINAL_STAGES,
62
+ VISITOR_FUNNEL_EVENT_KINDS,
63
+ VISITOR_FUNNEL_INTENTS,
64
+ VISITOR_FUNNEL_SOURCES,
65
+ VISITOR_BUYER_TYPES,
66
+ FUNNEL_TRANSITIONS,
67
+ isValidFunnelStage,
68
+ canTransition,
69
+ nextStages,
70
+ reachableStages,
71
+ FUNNEL_SYSTEM_TRIGGERS,
72
+ FUNNEL_TRANSITION_TRIGGERS,
73
+ LEGACY_FUNNEL_STAGES,
74
+ scanForMakeComReferences,
75
+ } from "./funnel.ts";
76
+ export type {
77
+ VisitorFunnelStage,
78
+ VisitorFunnelEventKind,
79
+ VisitorFunnelIntent,
80
+ VisitorFunnelSource,
81
+ VisitorBuyerType,
82
+ } from "./funnel.ts";
83
+
84
+ export type { LifecycleEventPayload } from "./lifecycle.ts";
85
+ export {
86
+ LIFECYCLE_EVENT_KINDS,
87
+ SUBSCRIPTION_STATUSES,
88
+ INVOICE_KINDS,
89
+ INVOICE_STATUSES,
90
+ SUBSCRIPTION_PLANS,
91
+ LifecycleEventPayloadSchema,
92
+ isLifecycleEventKind,
93
+ SUBSCRIPTION_TRANSITIONS,
94
+ SUBSCRIPTION_TRANSITION_TRIGGERS,
95
+ } from "./lifecycle.ts";
96
+ export type {
97
+ LifecycleEventKind,
98
+ SubscriptionStatus,
99
+ InvoiceKind,
100
+ InvoiceStatus,
101
+ SubscriptionPlan,
102
+ } from "./lifecycle.ts";
103
+
104
+ export type { ShardAssignment, ResolveShardOptions } from "./sharding.ts";
105
+ export { DELIVERY_REGIONS, DELIVERY_TIERS, fnv1a, resolveShard } from "./sharding.ts";
106
+ export type { DeliveryRegion, DeliveryTier } from "./sharding.ts";
107
+
108
+ export type {
109
+ DispatchExecuteRequest,
110
+ DispatchExecuteResult,
111
+ DispatchNamespaceBinding,
112
+ DispatchOutcome,
113
+ } from "./dispatch.ts";
114
+ export { DISPATCH_ROUTE, executeDispatch, dispatchToTenant } from "./dispatch.ts";
115
+
116
+ export type { QstashPublishConfig, IdempotencyLedger, RestRedisConfig } from "./qstash.ts";
117
+ export {
118
+ QSTASH_EU_BASE,
119
+ UPSTASH_QSTASH_SECRETS,
120
+ UPSTASH_REDIS_SECRETS,
121
+ UPSTASH_DELIVERY_SECRETS,
122
+ buildQstashPublish,
123
+ restRedisLedger,
124
+ } from "./qstash.ts";