@warpgogol/werkstatt-shared 0.14.0 → 0.15.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 (437) hide show
  1. package/README.md +31 -13
  2. package/README.uk.md +25 -15
  3. package/package.json +519 -762
  4. package/src/{share/agent → agent}/ard-catalog.ts +6 -1
  5. package/src/{share/agent → agent}/dns-aid.test.ts +2 -2
  6. package/src/{share/agent → agent}/manifest.ts +15 -1
  7. package/src/{share/agent → agent}/search.ts +6 -1
  8. package/src/{share → agent}/tests/api-catalog.test.ts +2 -2
  9. package/src/{share → agent}/tests/ard-catalog.test.ts +2 -2
  10. package/src/{share → agent}/tests/capability.test.ts +1 -1
  11. package/src/{share → agent}/tests/fleet-catalog.test.ts +1 -1
  12. package/src/{share → agent}/tests/knowledge.test.ts +2 -2
  13. package/src/{share → agent}/tests/manifest.test.ts +1 -1
  14. package/src/{share → agent}/tests/mcp-card.test.ts +2 -2
  15. package/src/agent/tests/omit-empty.test.ts +33 -0
  16. package/src/{share → agent}/tests/openapi.test.ts +2 -2
  17. package/src/{share → agent}/tests/proof.test.ts +1 -1
  18. package/src/{share → attribution}/material-credits.ts +4 -4
  19. package/src/{share → checks}/check-hints.ts +6 -1
  20. package/src/checks/index.ts +4 -1
  21. package/src/checks/lib/astro-site-url.ts +6 -1
  22. package/src/checks/lib/i18n.ts +14 -0
  23. package/src/checks/result-helpers.ts +22 -5
  24. package/src/checks/tests/remediation-auto-populate.test.ts +83 -0
  25. package/src/{share → client-scripts}/counter-utils.ts +6 -2
  26. package/src/{share/scripts → client-scripts}/external-link-qr.ts +11 -16
  27. package/src/{share/scripts → client-scripts}/external-links.ts +12 -1
  28. package/src/{share/scripts → client-scripts}/gsap-counter.ts +8 -3
  29. package/src/client-scripts/index.ts +35 -0
  30. package/src/{share/scripts → client-scripts}/inline-number-animation.ts +1 -1
  31. package/src/{share/scripts → client-scripts}/lenis.ts +6 -1
  32. package/src/{share/scripts → client-scripts}/lordicon.ts +6 -1
  33. package/src/{share/scripts → client-scripts}/orchestrator.ts +10 -1
  34. package/src/{share/scripts → client-scripts}/scheduler.ts +6 -1
  35. package/src/client-scripts/scroll-spy.ts +106 -0
  36. package/src/client-scripts/tests/external-link-qr.test.ts +8 -0
  37. package/src/client-scripts/tests/external-links.test.ts +25 -0
  38. package/src/client-scripts/tests/gsap-counter.test.ts +8 -0
  39. package/src/client-scripts/tests/gsap-mountain-journey.test.ts +8 -0
  40. package/src/client-scripts/tests/gsap-parallax.test.ts +8 -0
  41. package/src/client-scripts/tests/gsap-reveal.test.ts +8 -0
  42. package/src/client-scripts/tests/gsap-stagger.test.ts +8 -0
  43. package/src/client-scripts/tests/inline-number-animation.test.ts +8 -0
  44. package/src/client-scripts/tests/lenis.test.ts +8 -0
  45. package/src/client-scripts/tests/live-photos.test.ts +8 -0
  46. package/src/client-scripts/tests/lordicon.test.ts +8 -0
  47. package/src/client-scripts/tests/orchestrator.test.ts +47 -0
  48. package/src/client-scripts/tests/scheduler.test.ts +23 -0
  49. package/src/client-scripts/tests/scroll-spy.test.ts +204 -0
  50. package/src/{share/scripts → client-scripts/tests}/video-player.test.ts +51 -31
  51. package/src/component/contracts.ts +206 -0
  52. package/src/component/index.ts +11 -0
  53. package/src/{share → content}/content-reference.ts +3 -3
  54. package/src/{share/content → content}/entity-id.ts +6 -3
  55. package/src/content/index.ts +3 -0
  56. package/src/{share/content → content}/merge.ts +6 -1
  57. package/src/content/system-manifest.test.ts +107 -0
  58. package/src/content/system-manifest.ts +12 -94
  59. package/src/{share → content}/tests/resolve-field-path.test.ts +1 -1
  60. package/src/{share → content}/tests/substitute-deep.test.ts +1 -1
  61. package/src/content-discipline/index.ts +19 -0
  62. package/src/{share/content-discipline → content-discipline}/parsers.ts +2 -2
  63. package/src/{share/env.d.ts → env.d.ts} +6 -3
  64. package/src/fingerprint/canonical-json.ts +731 -0
  65. package/src/fingerprint/index.ts +12 -0
  66. package/src/fingerprint/primitives.ts +72 -0
  67. package/src/{share/i18n → i18n}/localization.ts +6 -2
  68. package/src/integration/adapters.ts +10 -71
  69. package/src/integration/dispatch.ts +1 -1
  70. package/src/integration/funnel.ts +6 -1
  71. package/src/integration/index.ts +101 -4
  72. package/src/integration/lagebild-destination-adapter.ts +108 -0
  73. package/src/integration/lagebild-ingress.ts +7 -12
  74. package/src/integration/orchestration.ts +11 -10
  75. package/src/integration/tests/deliver-event.test.ts +1 -1
  76. package/src/integration/tests/dispatch.test.ts +4 -4
  77. package/src/integration/tests/hub-runtime.test.ts +22 -14
  78. package/src/integration/vitest.config.ts +8 -0
  79. package/src/kernel/desired-state.ts +227 -0
  80. package/src/kernel/diagnostic.ts +289 -0
  81. package/src/kernel/fs-atomic.ts +131 -0
  82. package/src/kernel/index.ts +15 -0
  83. package/src/kernel/tests/fs-atomic.test.ts +150 -0
  84. package/src/kernel/tests/workspace-io.test.ts +187 -0
  85. package/src/kernel/types.ts +459 -0
  86. package/src/kernel/workspace-io.ts +248 -0
  87. package/src/{share → knowledge}/tests/claim.test.ts +1 -1
  88. package/src/{share → knowledge}/tests/derivation.test.ts +1 -1
  89. package/src/{share → knowledge}/tests/freshness.test.ts +1 -1
  90. package/src/{share → knowledge}/tests/ledger.test.ts +1 -1
  91. package/src/{share → knowledge}/tests/plan.test.ts +1 -1
  92. package/src/{share → knowledge}/tests/source.test.ts +1 -1
  93. package/src/legal/index.ts +15 -0
  94. package/src/{share/middleware → middleware}/access-protection.ts +8 -8
  95. package/src/{share → node}/dev-props-validator.ts +6 -1
  96. package/src/{share → node}/import-scan.ts +23 -3
  97. package/src/{share → node}/semantic/derived-prices-loader.ts +4 -2
  98. package/src/{share → node}/semantic/markdown-twin-provenance.ts +1 -1
  99. package/src/node/tests/derived-prices-loader.test.ts +59 -0
  100. package/src/node/tests/markdown-twin-provenance.test.ts +152 -0
  101. package/src/observability/env-resolver.ts +6 -1
  102. package/src/observability/index.ts +6 -1
  103. package/src/observability/otlp-converter.ts +6 -1
  104. package/src/observability/otlp-transport.ts +6 -1
  105. package/src/observability/pusher.ts +6 -1
  106. package/src/observability/redact.ts +6 -1
  107. package/src/observability/typed-refs.ts +6 -2
  108. package/src/observability/vitest.config.ts +1 -0
  109. package/src/{share → offers}/formula-eval.ts +3 -3
  110. package/src/{share → offers}/tests/formula-eval.test.ts +2 -2
  111. package/src/onboarding/index.ts +1 -0
  112. package/src/{share → onboarding}/tests/onboarding-yaml.test.ts +1 -1
  113. package/src/ontology/archetype-registry.ts +6 -1
  114. package/src/ontology/archetypes/index.json +33 -1
  115. package/src/ontology/archetypes/index.yaml +27 -1
  116. package/src/ontology/archetypes/sections/entity-grid.yaml +46 -0
  117. package/src/ontology/archetypes/sections/exit-diagram.yaml +43 -0
  118. package/src/ontology/biome-token-projection.ts +6 -1
  119. package/src/ontology/cosmic/index.ts +6 -1
  120. package/src/ontology/cosmic/moon-catalog.ts +6 -1
  121. package/src/ontology/cosmic/planet-catalog.ts +6 -1
  122. package/src/ontology/cosmic/star-catalog.ts +6 -1
  123. package/src/ontology/enums.ts +6 -1
  124. package/src/ontology/external-surfaces/index.ts +1 -1
  125. package/src/ontology/index.ts +6 -2
  126. package/src/ontology/manifest.ts +26 -4
  127. package/src/ontology/operations/artifact-store.ts +45 -0
  128. package/src/ontology/operations/dht.ts +98 -0
  129. package/src/ontology/operations/handoff.ts +92 -0
  130. package/src/ontology/operations/index.ts +187 -1
  131. package/src/ontology/operations/leitstand.ts +99 -0
  132. package/src/ontology/operations/materialization.ts +90 -0
  133. package/src/ontology/operations/mission.ts +111 -0
  134. package/src/ontology/operations/naming-policy.ts +132 -0
  135. package/src/ontology/operations/notausgang.ts +64 -0
  136. package/src/ontology/operations/release.ts +121 -0
  137. package/src/ontology/operations/sternsystem.ts +192 -0
  138. package/src/ontology/operations/werkstatt.ts +48 -0
  139. package/src/ontology/schemas/biome.ts +7 -2
  140. package/src/ontology/schemas/capability.ts +1 -1
  141. package/src/ontology/schemas/constellation.ts +6 -1
  142. package/src/ontology/schemas/index.ts +6 -2
  143. package/src/ontology/schemas/manifest-resolver.ts +6 -1
  144. package/src/ontology/schemas/page-entry.ts +9 -5
  145. package/src/ontology/schemas/system/growth.ts +6 -1
  146. package/src/ontology/schemas/system/manifest.ts +40 -1
  147. package/src/ontology/schemas/system/page-output.ts +7 -6
  148. package/src/ontology/schemas/system/tests/growth.test.ts +22 -0
  149. package/src/ontology/schemas/system/tests/integrations.test.ts +12 -0
  150. package/src/ontology/schemas/system/tests/manifest.test.ts +22 -0
  151. package/src/ontology/schemas/system/tests/page-output.test.ts +13 -0
  152. package/src/ontology/schemas/system/tests/release.test.ts +22 -0
  153. package/src/ontology/schemas/system/tests/text.test.ts +18 -0
  154. package/src/ontology/schemas/system/tests/verification.test.ts +12 -0
  155. package/src/ontology/schemas/system/text.ts +15 -0
  156. package/src/ontology/schemas/system.ts +6 -2
  157. package/src/ontology/schemas/tests/biome.test.ts +19 -0
  158. package/src/ontology/schemas/tests/capability.test.ts +22 -0
  159. package/src/ontology/schemas/tests/constellation.test.ts +22 -0
  160. package/src/ontology/schemas/tests/dns-records.test.ts +13 -0
  161. package/src/ontology/schemas/tests/manifest-resolver.test.ts +13 -0
  162. package/src/ontology/schemas/tests/page-entry.test.ts +22 -0
  163. package/src/ontology/schemas/tests/section-archetype.test.ts +12 -0
  164. package/src/ontology/schemas/tests/site-family.test.ts +18 -0
  165. package/src/ontology/schemas/tests/system.test.ts +20 -0
  166. package/src/ontology/shared-section-props/body-fragments.ts +2 -0
  167. package/src/ontology/tests/sternsystem-owner.test.ts +1 -1
  168. package/src/ontology/vitest.config.ts +1 -0
  169. package/src/{share → page}/page.ts +13 -9
  170. package/src/{share → page}/tests/dev-props-validator.test.ts +1 -1
  171. package/src/{share → page}/tests/hero-section-numbering-parity.test.ts +1 -1
  172. package/src/passport/index.ts +6 -1
  173. package/src/passport/key-rotate.ts +10 -2
  174. package/src/passport/schema.ts +6 -1
  175. package/src/passport/sign.ts +8 -3
  176. package/src/passport/vitest.config.ts +1 -0
  177. package/src/pbt/index.test.ts +95 -0
  178. package/src/pbt/index.ts +251 -0
  179. package/src/plugin/plugin-contract.ts +1 -1
  180. package/src/{share → policy}/entitlement.ts +24 -4
  181. package/src/{share → policy}/feature-policy.ts +8 -3
  182. package/src/{share → policy}/visibility.ts +7 -2
  183. package/src/redirects/redirects.ts +117 -0
  184. package/src/{share → redirects/tests}/redirects.test.ts +1 -1
  185. package/src/remediation/remediation-catalog.ts +316 -0
  186. package/src/{share/routes → routes}/template-filter.ts +1 -1
  187. package/src/{share → runtime}/runtime-context.ts +7 -2
  188. package/src/{share → runtime}/shared-context.ts +1 -1
  189. package/src/{share/schemas → schemas}/claims.ts +2 -2
  190. package/src/{share/schemas → schemas}/effects.ts +6 -1
  191. package/src/{share/schemas → schemas}/features.ts +1 -1
  192. package/src/{share/schemas → schemas}/index.ts +3 -3
  193. package/src/{share/schemas → schemas}/navigation.ts +6 -1
  194. package/src/{share/schemas → schemas}/page-base.ts +6 -2
  195. package/src/{share/schemas → schemas}/person.ts +1 -1
  196. package/src/{share/schemas → schemas}/standard-list-item.ts +1 -1
  197. package/src/schemas/tests/claim-records.test.ts +52 -0
  198. package/src/schemas/tests/claims.test.ts +23 -0
  199. package/src/schemas/tests/effects.test.ts +116 -0
  200. package/src/schemas/tests/features.test.ts +61 -0
  201. package/src/schemas/tests/horizontal-align.test.ts +16 -0
  202. package/src/schemas/tests/icon-color.test.ts +16 -0
  203. package/src/schemas/tests/live-photo.test.ts +40 -0
  204. package/src/schemas/tests/material-credit.test.ts +51 -0
  205. package/src/schemas/tests/media.test.ts +26 -0
  206. package/src/schemas/tests/navigation.test.ts +58 -0
  207. package/src/schemas/tests/page-base.test.ts +19 -0
  208. package/src/schemas/tests/participant.test.ts +26 -0
  209. package/src/schemas/tests/person.test.ts +12 -0
  210. package/src/schemas/tests/print.test.ts +30 -0
  211. package/src/schemas/tests/section-background.test.ts +31 -0
  212. package/src/schemas/tests/section-body.test.ts +16 -0
  213. package/src/schemas/tests/section-cards.test.ts +17 -0
  214. package/src/schemas/tests/section-cta.test.ts +41 -0
  215. package/src/schemas/tests/section-header.test.ts +31 -0
  216. package/src/schemas/tests/section-image.test.ts +24 -0
  217. package/src/schemas/tests/section-motion.test.ts +29 -0
  218. package/src/schemas/tests/section-shell.test.ts +42 -0
  219. package/src/schemas/tests/section-stats.test.ts +17 -0
  220. package/src/schemas/tests/site-background.test.ts +33 -0
  221. package/src/schemas/tests/standard-list-item.test.ts +16 -0
  222. package/src/{share → sections}/rfc0042-utils.ts +1 -1
  223. package/src/{share/semantic → semantic}/block-extractors/index.ts +20 -1
  224. package/src/{share/semantic → semantic}/business-projection.ts +95 -1
  225. package/src/semantic/canonical-uri.ts +54 -0
  226. package/src/{share/semantic → semantic}/extract.ts +100 -1
  227. package/src/semantic/fact-extraction.test.ts +47 -0
  228. package/src/semantic/fact-extraction.ts +46 -0
  229. package/src/semantic/freshness.ts +67 -0
  230. package/src/{share/semantic → semantic}/ids.ts +6 -1
  231. package/src/{share/semantic → semantic}/index.ts +9 -2
  232. package/src/{share/semantic → semantic}/jsonld/breadcrumb.ts +6 -2
  233. package/src/{share/semantic → semantic}/jsonld/context.ts +6 -2
  234. package/src/{share/semantic → semantic}/jsonld/faq.ts +6 -2
  235. package/src/{share/semantic → semantic}/jsonld/initiative.ts +6 -1
  236. package/src/{share/semantic → semantic}/jsonld/organization.ts +6 -1
  237. package/src/{share/semantic → semantic}/jsonld/person.ts +6 -2
  238. package/src/{share/semantic → semantic}/jsonld/service.ts +6 -2
  239. package/src/semantic/jsonld/shared.ts +36 -0
  240. package/src/semantic/jsonld/tests/article.test.ts +89 -0
  241. package/src/semantic/jsonld/tests/breadcrumb.test.ts +62 -0
  242. package/src/semantic/jsonld/tests/collection-list.test.ts +39 -0
  243. package/src/semantic/jsonld/tests/faq.test.ts +60 -0
  244. package/src/semantic/jsonld/tests/initiative.test.ts +56 -0
  245. package/src/semantic/jsonld/tests/organization.test.ts +123 -0
  246. package/src/semantic/jsonld/tests/person.test.ts +89 -0
  247. package/src/semantic/jsonld/tests/service.test.ts +65 -0
  248. package/src/semantic/jsonld/tests/shared.test.ts +41 -0
  249. package/src/semantic/jsonld/tests/video.test.ts +84 -0
  250. package/src/semantic/jsonld/tests/webpage.test.ts +93 -0
  251. package/src/semantic/jsonld/tests/website.test.ts +27 -0
  252. package/src/semantic/jsonld/types.ts +24 -0
  253. package/src/{share/semantic → semantic}/jsonld/webpage.ts +6 -1
  254. package/src/semantic/jsonld/website.ts +32 -0
  255. package/src/{share/semantic → semantic}/jsonld.ts +6 -1
  256. package/src/{share/semantic → semantic}/llms.ts +41 -3
  257. package/src/{share/semantic → semantic}/models.ts +27 -38
  258. package/src/{share/semantic → semantic}/organization-profile.ts +3 -0
  259. package/src/{share/semantic → semantic}/page-builders/markdown-page.ts +6 -3
  260. package/src/{share/semantic → semantic}/page-utils.ts +6 -3
  261. package/src/semantic/tests/ai.test.ts +55 -0
  262. package/src/semantic/tests/block-extraction.test.ts +34 -0
  263. package/src/{share/tests/breadcrumbs.test.ts → semantic/tests/breadcrumbs-0229.test.ts} +1 -1
  264. package/src/semantic/tests/breadcrumbs.test.ts +127 -0
  265. package/src/{share → semantic}/tests/build-page-price-markers.test.ts +2 -2
  266. package/src/semantic/tests/build-page.test.ts +122 -0
  267. package/src/semantic/tests/business-projection.test.ts +367 -0
  268. package/src/semantic/tests/canonical-uri.test.ts +56 -0
  269. package/src/semantic/tests/extract.test.ts +209 -0
  270. package/src/semantic/tests/feed.test.ts +113 -0
  271. package/src/semantic/tests/freshness.pbt.test.ts +108 -0
  272. package/src/semantic/tests/helpers.ts +32 -0
  273. package/src/semantic/tests/ids.test.ts +118 -0
  274. package/src/{share/tests/image-sitemap.test.ts → semantic/tests/image-sitemap-0150.test.ts} +1 -1
  275. package/src/semantic/tests/image-sitemap.test.ts +109 -0
  276. package/src/{share → semantic}/tests/jsonld-service.test.ts +2 -2
  277. package/src/{share → semantic}/tests/jsonld-video.test.ts +3 -3
  278. package/src/{share → semantic}/tests/jsonld-webpage.test.ts +3 -3
  279. package/src/semantic/tests/jsonld.test.ts +61 -0
  280. package/src/{share → semantic}/tests/llms-0789.test.ts +2 -2
  281. package/src/semantic/tests/llms-policy.test.ts +60 -0
  282. package/src/semantic/tests/llms.test.ts +164 -0
  283. package/src/semantic/tests/markdown-hygiene.test.ts +72 -0
  284. package/src/semantic/tests/markdown-page.test.ts +97 -0
  285. package/src/{share → semantic}/tests/organization-jsonld.test.ts +3 -3
  286. package/src/semantic/tests/organization-profile.test.ts +107 -0
  287. package/src/{share/tests/output-projection.test.ts → semantic/tests/output-projection-0143.test.ts} +1 -1
  288. package/src/semantic/tests/output-projection.test.ts +77 -0
  289. package/src/semantic/tests/page-markdown.test.ts +98 -0
  290. package/src/semantic/tests/page-utils.test.ts +88 -0
  291. package/src/{share/tests/price-marker-resolver.test.ts → semantic/tests/price-marker-resolver-0767.test.ts} +2 -2
  292. package/src/semantic/tests/price-marker-resolver.test.ts +90 -0
  293. package/src/semantic/tests/project-claims.pbt.test.ts +60 -0
  294. package/src/semantic/tests/robots.test.ts +70 -0
  295. package/src/{share/semantic → semantic}/tests/split-sentences.test.ts +1 -1
  296. package/src/{share → semantic}/tests/twin-path.test.ts +1 -1
  297. package/src/semantic/tests/update-stamp.test.ts +102 -0
  298. package/src/signing/index.ts +13 -0
  299. package/src/signing/key.ts +139 -0
  300. package/src/signing/sign.ts +66 -0
  301. package/src/signing/types.ts +29 -0
  302. package/src/{share/slug → slug}/slug-url.ts +4 -1
  303. package/src/stack/run-tool.ts +108 -0
  304. package/src/stack/stack-checks.ts +124 -0
  305. package/src/stack/tests/run-tool.test.ts +138 -0
  306. package/src/stack/tests/stack-checks.test.ts +141 -0
  307. package/src/stack/tests/walk-files.test.ts +131 -0
  308. package/src/stack/walk-files.ts +114 -0
  309. package/src/surface/blueprint.ts +342 -66
  310. package/src/surface/decision-composer.ts +6 -1
  311. package/src/surface/geo.ts +6 -1
  312. package/src/surface/index.ts +11 -7
  313. package/src/surface/types.ts +2 -2
  314. package/src/surface/vitest.config.ts +1 -0
  315. package/src/tests/signing-core.test.ts +129 -0
  316. package/src/{share → text}/css-value-normalize.ts +6 -1
  317. package/src/text/string-utils.ts +24 -0
  318. package/src/{share → text}/tests/text-normalize.test.ts +5 -0
  319. package/src/{share → text}/text-normalize.ts +4 -3
  320. package/src/{share → text}/wrap-inline-numbers.ts +1 -1
  321. package/src/types/axiom-study.d.ts +36 -0
  322. package/src/types/hls-js-light.d.ts +21 -0
  323. package/src/types/qrcode-browser.d.ts +23 -0
  324. package/src/typography/fix.pbt.test.ts +208 -0
  325. package/src/typography/fix.ts +148 -0
  326. package/src/typography/index.ts +54 -0
  327. package/src/typography/locale-defaults.ts +97 -0
  328. package/src/typography/rules-tier1.test.ts +459 -0
  329. package/src/typography/rules-tier1.ts +925 -0
  330. package/src/typography/rules-tier2-locale.pbt.test.ts +190 -0
  331. package/src/typography/rules-tier2-locale.test.ts +286 -0
  332. package/src/typography/rules-tier2-locale.ts +399 -0
  333. package/src/typography/rules-tier2-structure.test.ts +330 -0
  334. package/src/typography/rules-tier2-structure.ts +378 -0
  335. package/src/typography/rules-tier3-advisory.test.ts +290 -0
  336. package/src/typography/rules-tier3-advisory.ts +239 -0
  337. package/src/typography/text-surface.test.ts +244 -0
  338. package/src/typography/text-surface.ts +448 -0
  339. package/src/index.ts +0 -14
  340. package/src/integration/port-barrel.ts +0 -105
  341. package/src/share/content/index.ts +0 -16
  342. package/src/share/content-discipline/index.ts +0 -14
  343. package/src/share/index.ts +0 -86
  344. package/src/share/legal/index.ts +0 -1
  345. package/src/share/redirects.ts +0 -54
  346. package/src/share/scripts/index.ts +0 -26
  347. package/src/share/semantic/jsonld/shared.ts +0 -31
  348. package/src/share/semantic/jsonld/types.ts +0 -18
  349. package/src/share/semantic/jsonld/website.ts +0 -27
  350. package/src/share/string-utils.ts +0 -19
  351. package/src/share/types/axiom-study.d.ts +0 -22
  352. package/src/share/types/hls-js-light.d.ts +0 -16
  353. package/src/share/types/qrcode-browser.d.ts +0 -18
  354. package/src/share/utility-registry.yaml +0 -36
  355. package/src/share/vitest.config.ts +0 -8
  356. package/src/surface/blueprint-schema.ts +0 -314
  357. package/src/surface/blueprint-types.ts +0 -256
  358. /package/src/{share/agent → agent}/api-catalog.ts +0 -0
  359. /package/src/{share/agent → agent}/capability.ts +0 -0
  360. /package/src/{share/agent → agent}/dns-aid.ts +0 -0
  361. /package/src/{share/agent → agent}/fleet-catalog.ts +0 -0
  362. /package/src/{share/agent → agent}/index.ts +0 -0
  363. /package/src/{share/agent → agent}/knowledge.ts +0 -0
  364. /package/src/{share/agent → agent}/mcp-card.ts +0 -0
  365. /package/src/{share/agent → agent}/omit-empty.ts +0 -0
  366. /package/src/{share/agent → agent}/openapi.ts +0 -0
  367. /package/src/{share/agent → agent}/proof.ts +0 -0
  368. /package/src/{share/agent → agent}/search.test.ts +0 -0
  369. /package/src/{share → attribution}/attribution-display.ts +0 -0
  370. /package/src/{share/scripts → client-scripts}/gsap-mountain-journey.ts +0 -0
  371. /package/src/{share/scripts → client-scripts}/gsap-parallax.ts +0 -0
  372. /package/src/{share/scripts → client-scripts}/gsap-reveal.ts +0 -0
  373. /package/src/{share/scripts → client-scripts}/gsap-stagger.ts +0 -0
  374. /package/src/{share/scripts → client-scripts}/live-photos.ts +0 -0
  375. /package/src/{share/scripts → client-scripts}/video-player.ts +0 -0
  376. /package/src/{share/content → content}/resolve-field-path.ts +0 -0
  377. /package/src/{share/content → content}/substitute-deep.ts +0 -0
  378. /package/src/{share → content}/tests/content-ref-index.test.ts +0 -0
  379. /package/src/{share/content-discipline → content-discipline}/types.ts +0 -0
  380. /package/src/{share → image-provider}/image-provider.ts +0 -0
  381. /package/src/{share/knowledge → knowledge}/claim.ts +0 -0
  382. /package/src/{share/knowledge → knowledge}/derivation.ts +0 -0
  383. /package/src/{share/knowledge → knowledge}/freshness.ts +0 -0
  384. /package/src/{share/knowledge → knowledge}/index.ts +0 -0
  385. /package/src/{share/knowledge → knowledge}/ledger.ts +0 -0
  386. /package/src/{share/knowledge → knowledge}/plan.ts +0 -0
  387. /package/src/{share/knowledge → knowledge}/source.ts +0 -0
  388. /package/src/{share/legal → legal}/translation-policy.ts +0 -0
  389. /package/src/{share/middleware → middleware}/language-redirect.ts +0 -0
  390. /package/src/{share/middleware → middleware}/tests/access-protection.test.ts +0 -0
  391. /package/src/{share → node}/fs/index.ts +0 -0
  392. /package/src/{share/tests/markdown-twin-provenance.test.ts → node/tests/markdown-twin-provenance-0613.test.ts} +0 -0
  393. /package/src/{share → offers}/offer-capacity.ts +0 -0
  394. /package/src/{share/onboarding-yaml/index.ts → onboarding/yaml.ts} +0 -0
  395. /package/src/{share → ontology}/tests/ontology-role-by-cosmic-name.test.ts +0 -0
  396. /package/src/{share/routes → routes}/tests/template-filter.test.ts +0 -0
  397. /package/src/{share/schemas → schemas}/claim-records.ts +0 -0
  398. /package/src/{share/schemas → schemas}/horizontal-align.ts +0 -0
  399. /package/src/{share/schemas → schemas}/icon-color.ts +0 -0
  400. /package/src/{share/schemas → schemas}/live-photo.ts +0 -0
  401. /package/src/{share/schemas → schemas}/material-credit.ts +0 -0
  402. /package/src/{share/schemas → schemas}/media.ts +0 -0
  403. /package/src/{share/schemas → schemas}/participant.ts +0 -0
  404. /package/src/{share/schemas → schemas}/print.ts +0 -0
  405. /package/src/{share/schemas → schemas}/section-background.ts +0 -0
  406. /package/src/{share/schemas → schemas}/section-body.ts +0 -0
  407. /package/src/{share/schemas → schemas}/section-cards.ts +0 -0
  408. /package/src/{share/schemas → schemas}/section-cta.ts +0 -0
  409. /package/src/{share/schemas → schemas}/section-header.ts +0 -0
  410. /package/src/{share/schemas → schemas}/section-image.ts +0 -0
  411. /package/src/{share/schemas → schemas}/section-motion.ts +0 -0
  412. /package/src/{share/schemas → schemas}/section-shell.ts +0 -0
  413. /package/src/{share/schemas → schemas}/section-stats.ts +0 -0
  414. /package/src/{share/schemas → schemas}/site-background.ts +0 -0
  415. /package/src/{share/semantic → semantic}/ai.ts +0 -0
  416. /package/src/{share/semantic → semantic}/block-extraction.ts +0 -0
  417. /package/src/{share/semantic → semantic}/breadcrumbs.ts +0 -0
  418. /package/src/{share/semantic → semantic}/build-page.ts +0 -0
  419. /package/src/{share/semantic → semantic}/feed.ts +0 -0
  420. /package/src/{share/semantic → semantic}/image-sitemap.ts +0 -0
  421. /package/src/{share/semantic → semantic}/jsonld/article.ts +0 -0
  422. /package/src/{share/semantic → semantic}/jsonld/collection-list.ts +0 -0
  423. /package/src/{share/semantic → semantic}/jsonld/video.ts +0 -0
  424. /package/src/{share/semantic → semantic}/llms-policy.ts +0 -0
  425. /package/src/{share/semantic → semantic}/markdown-hygiene.ts +0 -0
  426. /package/src/{share/semantic → semantic}/output-projection.ts +0 -0
  427. /package/src/{share/semantic → semantic}/page-markdown.ts +0 -0
  428. /package/src/{share/semantic → semantic}/price-marker-resolver.ts +0 -0
  429. /package/src/{share/semantic → semantic}/robots.ts +0 -0
  430. /package/src/{share/semantic → semantic}/update-stamp.ts +0 -0
  431. /package/src/{share/slug → slug}/heading-slugger.ts +0 -0
  432. /package/src/{share/slug → slug}/index.ts +0 -0
  433. /package/src/{share/slug → slug}/slug-id.ts +0 -0
  434. /package/src/{share/slug → slug}/strategies.ts +0 -0
  435. /package/src/{share/slug → slug}/tests/slug.test.ts +0 -0
  436. /package/src/{share → text}/tests/text-normalize.pbt.test.ts +0 -0
  437. /package/src/{share → text}/text-position.ts +0 -0
@@ -0,0 +1,12 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Barrel export for @warpgogol/werkstatt-shared/fingerprint sub-path. Re-exports canonical JSON and hashing primitives sunk from @warpgogol/werkstatt-engine per RFC-1104.</purpose>
4
+ <non-goals>Does not re-export engine fingerprint modules that stay in engine (fingerprint.ts, path-matcher.ts, normalizers).</non-goals>
5
+ </MODULE_CONTRACT>
6
+ <CHANGE_SUMMARY>
7
+ <item>RFC-1104: initial barrel — canonical-json + primitives sunk from werkstatt-engine.</item>
8
+ </CHANGE_SUMMARY>
9
+ */
10
+
11
+ export * from "./canonical-json.ts";
12
+ export * from "./primitives.ts";
@@ -0,0 +1,72 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>RFC-0364, RFC-0849: Lightweight hashing primitives — byte hashing, stable JSON hashing, and Sha256Digest opaque type. No parser dependencies.</purpose>
4
+ <non-goals>
5
+ <item>Do not implement file-type normalizers — those live in normalizers/.</item>
6
+ <item>Do not implement tree fingerprinting — that lives in fingerprint.ts.</item>
7
+ <item>Do not implement canonical JSON — that lives in canonical-json.ts.</item>
8
+ </non-goals>
9
+ </MODULE_CONTRACT>
10
+ <CHANGE_SUMMARY>
11
+ <item>RFC-0849: add Sha256Digest branded type, isSha256Digest guard, and narrower byteHash/byteHashFile returns. Existing string consumers remain compatible.</item>
12
+ <item>RFC-1097: step 6 — compass.migrate codemod run
13
+
14
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
15
+ <item>RFC-1097: sweep — werkstatt-engine clean
16
+
17
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
18
+ </CHANGE_SUMMARY>
19
+ */
20
+
21
+ import { createReadStream } from "node:fs";
22
+ import { createHash } from "node:crypto";
23
+
24
+ declare const sha256DigestBrand: unique symbol;
25
+
26
+ export type Sha256Digest = `sha256:${string}` & {
27
+ readonly [sha256DigestBrand]: true;
28
+ };
29
+
30
+ const SHA256_DIGEST_RE = /^sha256:[0-9a-f]{64}$/;
31
+
32
+ export function isSha256Digest(value: unknown): value is Sha256Digest {
33
+ return typeof value === "string" && SHA256_DIGEST_RE.test(value);
34
+ }
35
+
36
+ export function byteHash(bytes: Uint8Array | string): Sha256Digest {
37
+ const input = typeof bytes === "string" ? Buffer.from(bytes, "utf8") : bytes;
38
+ return `sha256:${createHash("sha256").update(input).digest("hex")}` as Sha256Digest;
39
+ }
40
+
41
+ export async function byteHashFile(absPath: string): Promise<Sha256Digest> {
42
+ return new Promise((resolve, reject) => {
43
+ const stream = createReadStream(absPath);
44
+ const chunks: Buffer[] = [];
45
+ stream.on("data", (chunk) => chunks.push(chunk as Buffer));
46
+ stream.on("error", reject);
47
+ stream.on("end", () => {
48
+ const buf = Buffer.concat(chunks);
49
+ resolve(byteHash(buf));
50
+ });
51
+ });
52
+ }
53
+
54
+ function sortForJson(value: unknown): unknown {
55
+ if (Array.isArray(value)) return value.map(sortForJson);
56
+ if (value && typeof value === "object") {
57
+ return Object.fromEntries(
58
+ Object.entries(value as Record<string, unknown>)
59
+ .sort(([a], [b]) => a.localeCompare(b))
60
+ .map(([key, nested]) => [key, sortForJson(nested)]),
61
+ );
62
+ }
63
+ return value;
64
+ }
65
+
66
+ export function stableStringify(value: unknown): string {
67
+ return JSON.stringify(sortForJson(value));
68
+ }
69
+
70
+ export function stableJsonHash(value: unknown): string {
71
+ return byteHash(stableStringify(value));
72
+ }
@@ -12,8 +12,12 @@ provides the reusable logic without hard-coding any language list.
12
12
  </non-goals>
13
13
  </MODULE_CONTRACT>
14
14
  <CHANGE_SUMMARY>
15
- <item>Initial extraction from app utils/localization into packages/share.</item>
16
- <item>Refactored to factory pattern so LANGUAGE_MAPPING stays in each app and the shared logic is truly app-agnostic.</item>
15
+ <item>RFC-1097: step 6 — compass.migrate codemod run
16
+
17
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
18
+ <item>RFC-1097: sweep — werkstatt-engine clean
19
+
20
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
17
21
  </CHANGE_SUMMARY>
18
22
  */
19
23
 
@@ -1,9 +1,10 @@
1
1
  /*
2
2
  <MODULE_CONTRACT>
3
3
  <purpose>RFC-0168/0181: reference Integration Port adapters. Channel adapters (Telegram, WhatsApp
4
- Cloud API) and a CRM adapter (Pipedrive). Each is fetch-based, secret-driven, and self-disables when
4
+ Cloud API). Each is fetch-based, secret-driven, and self-disables when
5
5
  its required secrets are absent. Email is NOT a fetch adapter — it is sent via Cloudflare Email
6
- Routing (send_email binding) in the delivery callback (RFC-0181).</purpose>
6
+ Routing (send_email binding) in the delivery callback (RFC-0181). CRM is handled by the Lagebild
7
+ destination adapter in lagebild-destination-adapter.ts.</purpose>
7
8
  <non-goals>
8
9
  <item>Do not import vendor SDKs or astro:env — fetch + injected secrets only.</item>
9
10
  <item>Do not log or echo secrets.</item>
@@ -11,19 +12,16 @@ Routing (send_email binding) in the delivery callback (RFC-0181).</purpose>
11
12
  </MODULE_CONTRACT>
12
13
  <CHANGE_SUMMARY>
13
14
  <item>RFC-0168: initial implementation.</item>
15
+ <item>RFC-1097: step 6 — compass.migrate codemod run
16
+
17
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
18
+ <item>RFC-1097: sweep — werkstatt-engine clean
19
+
20
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
14
21
  </CHANGE_SUMMARY>
15
22
  */
16
23
 
17
- import type {
18
- CrmAdapter,
19
- DestinationAdapter,
20
- IntegrationChannelAdapter,
21
- IntegrationEvent,
22
- IntegrationSecrets,
23
- Lead,
24
- LeadMessage,
25
- } from "./port.ts";
26
- import { eventToLead } from "./port.ts";
24
+ import type { IntegrationChannelAdapter, IntegrationSecrets, LeadMessage } from "./port.ts";
27
25
 
28
26
  function formatMessageText(message: LeadMessage): string {
29
27
  return [
@@ -82,62 +80,3 @@ export const whatsappChannelAdapter: IntegrationChannelAdapter = {
82
80
  if (!res.ok) throw new Error(`whatsapp: Cloud API ${res.status}`);
83
81
  },
84
82
  };
85
-
86
- export const pipedriveCrmAdapter: CrmAdapter = {
87
- id: "pipedrive",
88
- requiredSecrets: ["INTEGRATION_PIPEDRIVE_API_TOKEN", "INTEGRATION_PIPEDRIVE_DOMAIN"],
89
- async upsertLead(lead: Lead, secrets: IntegrationSecrets): Promise<{ id: string } | null> {
90
- const token = secrets.INTEGRATION_PIPEDRIVE_API_TOKEN;
91
- const domain = secrets.INTEGRATION_PIPEDRIVE_DOMAIN;
92
- if (!token || !domain) throw new Error("pipedrive: missing credentials");
93
- // Create a person first (leads require a linked person/organization in Pipedrive).
94
- const personRes = await fetch(
95
- `https://${domain}.pipedrive.com/api/v1/persons?api_token=${encodeURIComponent(token)}`,
96
- {
97
- method: "POST",
98
- headers: { "Content-Type": "application/json" },
99
- body: JSON.stringify({
100
- name: lead.name ?? lead.email ?? lead.phone ?? "Website lead",
101
- ...(lead.email ? { email: [lead.email] } : {}),
102
- ...(lead.phone ? { phone: [lead.phone] } : {}),
103
- }),
104
- },
105
- );
106
- if (!personRes.ok) throw new Error(`pipedrive: persons API ${personRes.status}`);
107
- const personJson = (await personRes.json()) as { data?: { id?: number } };
108
- const personId = personJson.data?.id;
109
- if (!personId) return null;
110
-
111
- const leadRes = await fetch(
112
- `https://${domain}.pipedrive.com/api/v1/leads?api_token=${encodeURIComponent(token)}`,
113
- {
114
- method: "POST",
115
- headers: { "Content-Type": "application/json" },
116
- body: JSON.stringify({
117
- title: `${lead.source}: ${lead.name ?? "lead"}`,
118
- person_id: personId,
119
- }),
120
- },
121
- );
122
- if (!leadRes.ok) throw new Error(`pipedrive: leads API ${leadRes.status}`);
123
- const leadJson = (await leadRes.json()) as { data?: { id?: string } };
124
- return leadJson.data?.id ? { id: String(leadJson.data.id) } : null;
125
- },
126
- };
127
-
128
- /**
129
- * RFC-0176: Pipedrive as a destination-hub adapter (kind `crm`, mode `gogol-adapter`).
130
- * Runs on the client's site with the client's token. Reuses the RFC-0168
131
- * pipedriveCrmAdapter by mapping the normalized IntegrationEvent → Lead.
132
- */
133
- export const pipedriveDestinationAdapter: DestinationAdapter = {
134
- kind: "crm",
135
- vendor: "pipedrive",
136
- requiredSecrets: pipedriveCrmAdapter.requiredSecrets,
137
- async route(
138
- event: IntegrationEvent,
139
- secrets: IntegrationSecrets,
140
- ): Promise<{ id: string } | null> {
141
- return pipedriveCrmAdapter.upsertLead(eventToLead(event), secrets);
142
- },
143
- };
@@ -52,7 +52,7 @@ export async function executeDispatch(
52
52
  /**
53
53
  * Minimal structural type for a Workers-for-Platforms dynamic-dispatch binding.
54
54
  * `get(siteId)` returns the tenant Worker's fetcher; we never import the platform
55
- * types (keeps @warpgogol/werkstatt-shared/share runtime-agnostic, mirroring QueueBinding/KvDedupStore).
55
+ * types (keeps @warpgogol/werkstatt-shared runtime-agnostic, mirroring QueueBinding/KvDedupStore).
56
56
  */
57
57
  export interface DispatchNamespaceBinding {
58
58
  get(siteId: string): { fetch(request: Request): Promise<Response> };
@@ -14,7 +14,12 @@ types + constants + pure helpers — no I/O, no astro:env, no vendor SDK.</purpo
14
14
  <CHANGE_SUMMARY>
15
15
  <item>RFC-0188 Phase 2 (contract): initial funnel stage/event/transition contracts.</item>
16
16
  <item>RFC-0219: add FUNNEL_SYSTEM_TRIGGERS, FunnelTransitionTrigger, FUNNEL_TRANSITION_TRIGGERS — trigger overlay for the state-chart generator.</item>
17
- <item>Cleanup: move BUFFER_DEAL_STAGES, FUNNEL_STAGE_TO_BUFFER_STAGE, bridgeFunnelStage, SYNC_OUTBOX_STATUSES, SYNC_OUTBOX_OPS from deleted crm-buffer.ts into this module.</item>
17
+ <item>RFC-1097: step 6 — compass.migrate codemod run
18
+
19
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
20
+ <item>RFC-1097: sweep — werkstatt-engine clean
21
+
22
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
18
23
  </CHANGE_SUMMARY>
19
24
  */
20
25
 
@@ -4,7 +4,7 @@
4
4
  RFC-0168: Integration Port barrel. Re-exports types from port.ts,
5
5
  funnel.ts, lifecycle.ts, sharding.ts, dispatch.ts, qstash.ts, and runtime
6
6
  orchestration (registries + fan-out) from orchestration.ts. Type-only consumers
7
- import from `./port-barrel.ts` (`@warpgogol/werkstatt-shared/share/integration/port`)
7
+ import from `./port-barrel.ts` (`@warpgogol/werkstatt-shared/integration/port`)
8
8
  to avoid transitively pulling in adapter implementations; consumers needing
9
9
  runtime logic import from here — the orchestration module is re-exported transparently.
10
10
  </purpose>
@@ -15,12 +15,106 @@
15
15
  </MODULE_CONTRACT>
16
16
  <CHANGE_SUMMARY>
17
17
  <item>RFC-0168: initial implementation.</item>
18
- <item>Deepening: split orchestration (registries + fan-out) into orchestration.ts; index.ts is now a pure barrel.</item>
18
+ <item>RFC-1097: step 6 — compass.migrate codemod run
19
+
20
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
21
+ <item>RFC-1097: sweep — werkstatt-engine clean
22
+
23
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
24
+ <item>RFC-1106: step 6 — delete integration port-barrel
25
+
26
+ port-barrel.ts deleted; its explicit contract re-exports absorbed into integration/index.ts. The site domain/integration barrel rewires to explicit names from the shared barrel. ./integration/port-barrel export entry removed; ./integration/port (→ port.ts) stays — engine agent-gate consumers unaffected.</item>
19
27
  </CHANGE_SUMMARY>
20
28
  */
21
29
 
22
- // Port-barrel re-exports all type/contract modules explicitly.
23
- export * from "./port-barrel.ts";
30
+ // RFC-1106: port-barrel.ts is deleted — its explicit contract re-exports live here.
31
+ export type { IntegrationSecrets } from "./port.ts";
32
+ export type { LeadMessage, Lead, IntegrationChannelAdapter, CrmAdapter } from "./port.ts";
33
+ export type { IntegrationEvent, DestinationAdapter } from "./port.ts";
34
+ export { DESTINATION_KINDS, EXECUTION_MODES, eventToLeadMessage, eventToLead } from "./port.ts";
35
+ export type { DestinationKind, ExecutionMode } from "./port.ts";
36
+
37
+ export type {
38
+ VisitorFunnelEventPayload,
39
+ FunnelSystemTrigger,
40
+ FunnelTransitionTrigger,
41
+ } from "./funnel.ts";
42
+ export {
43
+ FUNNEL_VERSION,
44
+ VISITOR_FUNNEL_STAGES,
45
+ FUNNEL_ENTRY_STAGE,
46
+ FUNNEL_TERMINAL_STAGES,
47
+ VISITOR_FUNNEL_EVENT_KINDS,
48
+ VISITOR_FUNNEL_INTENTS,
49
+ VISITOR_FUNNEL_SOURCES,
50
+ VISITOR_BUYER_TYPES,
51
+ FUNNEL_TRANSITIONS,
52
+ isValidFunnelStage,
53
+ BUFFER_DEAL_STAGES,
54
+ FUNNEL_STAGE_TO_BUFFER_STAGE,
55
+ bridgeFunnelStage,
56
+ SYNC_OUTBOX_STATUSES,
57
+ SYNC_OUTBOX_OPS,
58
+ canTransition,
59
+ nextStages,
60
+ reachableStages,
61
+ FUNNEL_SYSTEM_TRIGGERS,
62
+ FUNNEL_TRANSITION_TRIGGERS,
63
+ LEGACY_FUNNEL_STAGES,
64
+ scanForMakeComReferences,
65
+ } from "./funnel.ts";
66
+ export type {
67
+ VisitorFunnelStage,
68
+ VisitorFunnelEventKind,
69
+ VisitorFunnelIntent,
70
+ VisitorFunnelSource,
71
+ VisitorBuyerType,
72
+ BufferDealStage,
73
+ SyncOutboxStatus,
74
+ SyncOutboxOp,
75
+ } from "./funnel.ts";
76
+
77
+ export type { LifecycleEventPayload } from "./lifecycle.ts";
78
+ export {
79
+ LIFECYCLE_EVENT_KINDS,
80
+ SUBSCRIPTION_STATUSES,
81
+ INVOICE_KINDS,
82
+ INVOICE_STATUSES,
83
+ SUBSCRIPTION_PLANS,
84
+ LifecycleEventPayloadSchema,
85
+ isLifecycleEventKind,
86
+ SUBSCRIPTION_TRANSITIONS,
87
+ SUBSCRIPTION_TRANSITION_TRIGGERS,
88
+ } from "./lifecycle.ts";
89
+ export type {
90
+ LifecycleEventKind,
91
+ SubscriptionStatus,
92
+ InvoiceKind,
93
+ InvoiceStatus,
94
+ SubscriptionPlan,
95
+ } from "./lifecycle.ts";
96
+
97
+ export type { ShardAssignment, ResolveShardOptions } from "./sharding.ts";
98
+ export { DELIVERY_REGIONS, DELIVERY_TIERS, fnv1a, resolveShard } from "./sharding.ts";
99
+ export type { DeliveryRegion, DeliveryTier } from "./sharding.ts";
100
+
101
+ export type {
102
+ DispatchExecuteRequest,
103
+ DispatchExecuteResult,
104
+ DispatchNamespaceBinding,
105
+ DispatchOutcome,
106
+ } from "./dispatch.ts";
107
+ export { DISPATCH_ROUTE, executeDispatch, dispatchToTenant } from "./dispatch.ts";
108
+
109
+ export type { QstashPublishConfig, IdempotencyLedger, RestRedisConfig } from "./qstash.ts";
110
+ export {
111
+ QSTASH_EU_BASE,
112
+ UPSTASH_QSTASH_SECRETS,
113
+ UPSTASH_REDIS_SECRETS,
114
+ UPSTASH_DELIVERY_SECRETS,
115
+ buildQstashPublish,
116
+ restRedisLedger,
117
+ } from "./qstash.ts";
24
118
 
25
119
  // Runtime modules — explicit re-exports to keep the public API surface clear.
26
120
  export type {
@@ -71,3 +165,6 @@ export {
71
165
  type ExplicitPolicyAssertion,
72
166
  type PolicyAssertionKind,
73
167
  } from "./lagebild-ingress.ts";
168
+
169
+ // Lagebild destination adapter (RFC-0176: wraps submitIngress as a DestinationAdapter)
170
+ export { lagebildDestinationAdapter } from "./lagebild-destination-adapter.ts";
@@ -0,0 +1,108 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ RFC-0176: Lagebild as a destination-hub adapter (kind `crm`, vendor `lagebild`).
5
+ Wraps the Lagebild ingress client (submitIngress) in the DestinationAdapter
6
+ contract so the delivery callback can route IntegrationEvents to Lagebild via
7
+ the standard extraAdapters injection — with QStash retries, DLQ, and Redis
8
+ idempotency preserved end-to-end.
9
+ </purpose>
10
+ <non-goals>
11
+ <item>Do not import astro:env — secrets are injected by the caller.</item>
12
+ <item>Do not log or echo secrets.</item>
13
+ <item>Do not modify the WebsiteIngress v1 contract — this adapter only maps
14
+ IntegrationEvent → IngressSubmitInput.</item>
15
+ </non-goals>
16
+ </MODULE_CONTRACT>
17
+ <CHANGE_SUMMARY>
18
+ <item>RFC-1097: step 6 — compass.migrate codemod run
19
+
20
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
21
+ <item>RFC-1097: sweep — werkstatt-engine clean
22
+
23
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
24
+ </CHANGE_SUMMARY>
25
+ */
26
+
27
+ import type { DestinationAdapter, IntegrationEvent, IntegrationSecrets } from "./port.ts";
28
+ import {
29
+ submitIngress,
30
+ buildIdempotencyKey,
31
+ type IdentityClaim,
32
+ type IngressOrigin,
33
+ } from "./lagebild-ingress.ts";
34
+
35
+ /**
36
+ * Lagebild destination adapter (RFC-0176). Self-enables by secret presence:
37
+ * skips silently when LAGEBILD_* secrets are absent. Throws on transport
38
+ * failure or non-acceptance so the delivery callback returns 502 and QStash
39
+ * retries (bounded → DLQ).
40
+ */
41
+ export const lagebildDestinationAdapter: DestinationAdapter = {
42
+ kind: "crm",
43
+ vendor: "lagebild",
44
+ requiredSecrets: [
45
+ "LAGEBILD_API_URL",
46
+ "LAGEBILD_API_KEY",
47
+ "LAGEBILD_TENANT_ID",
48
+ "LAGEBILD_SOURCE_SYSTEM_ID",
49
+ ],
50
+
51
+ async route(
52
+ event: IntegrationEvent,
53
+ secrets: IntegrationSecrets,
54
+ ): Promise<{ id: string } | null> {
55
+ const apiUrl = secrets.LAGEBILD_API_URL;
56
+ const apiKey = secrets.LAGEBILD_API_KEY;
57
+ const tenantId = secrets.LAGEBILD_TENANT_ID;
58
+ const sourceSystemId = secrets.LAGEBILD_SOURCE_SYSTEM_ID;
59
+ if (!apiUrl || !apiKey || !tenantId || !sourceSystemId) {
60
+ throw new Error("lagebild: missing credentials");
61
+ }
62
+
63
+ const submissionId = "sub_" + event.eventId.replace(/-/g, "").slice(0, 24);
64
+
65
+ const claims: IdentityClaim[] = [];
66
+ if (event.contact?.email) {
67
+ claims.push({ claim_type: "email", value: event.contact.email });
68
+ }
69
+ if (event.contact?.phone) {
70
+ claims.push({ claim_type: "phone", value: event.contact.phone });
71
+ }
72
+
73
+ const referrer =
74
+ typeof event.payload.referrer === "string" ? event.payload.referrer : undefined;
75
+ const origin: IngressOrigin = {
76
+ locale: event.locale,
77
+ ...(referrer ? { referrer_uri: referrer } : {}),
78
+ };
79
+
80
+ const message = typeof event.payload.message === "string" ? event.payload.message : null;
81
+
82
+ const result = await submitIngress(
83
+ { apiUrl, apiKey, tenantId, sourceSystemId },
84
+ {
85
+ submissionId,
86
+ idempotencyKey: buildIdempotencyKey(tenantId, submissionId),
87
+ interactionKind: "contact_message",
88
+ identityClaims: claims,
89
+ message,
90
+ origin,
91
+ explicitPolicyAssertions: [
92
+ {
93
+ kind: "consent",
94
+ purpose: "crm_projection",
95
+ value: true,
96
+ statement_ref: "contact_form_consent",
97
+ },
98
+ ],
99
+ },
100
+ );
101
+
102
+ if (!result.accepted) {
103
+ throw new Error(`lagebild: ingress rejected (${result.rejection_class ?? "unknown"})`);
104
+ }
105
+
106
+ return result.submission_id ? { id: result.submission_id } : null;
107
+ },
108
+ };
@@ -11,25 +11,20 @@ built-in via a stable idempotency_key (derived from submission_id + tenant).</pu
11
11
  <item>Do not retry on non-2xx — the caller decides retry strategy.</item>
12
12
  </non-goals>
13
13
  </MODULE_CONTRACT>
14
+ <CHANGE_SUMMARY>
15
+ <item>RFC-1097: sweep — tail packages clean
16
+
17
+ Sweep batch 3: rewrote ~95 purposes across werkstatt-knowledge, werkstatt-shared, godot-game, phaser-game, lifecycle-core, projektarchiv-*, portal-*, billing-*, typescript (CONTRACT-02/PURPOSE-02). Real KEY_DECISIONS on 5 godot utils, non-goals on 5 CONTRACT-03 files, headers on 4 headerless files, CS-07 history literal fix on 2 files. Policy: vitest.config.ts + test-fixtures testPatterns, worker-configuration.d.ts excludedPath. All non-site/engine packages now 0 diagnostics.</item>
18
+ </CHANGE_SUMMARY>
14
19
  */
15
20
 
16
21
  export const LAGEBILD_INGRESS_CONTRACT_VERSION = 1 as const;
17
22
 
18
23
  export type IngressInteractionKind =
19
- | "inquiry"
20
- | "contact_message"
21
- | "callback_request"
22
- | "appointment_request"
23
- | "other";
24
+ "inquiry" | "contact_message" | "callback_request" | "appointment_request" | "other";
24
25
 
25
26
  export type IdentityClaimType =
26
- | "person_name"
27
- | "organization_name"
28
- | "email"
29
- | "phone"
30
- | "website"
31
- | "postal_address"
32
- | "other";
27
+ "person_name" | "organization_name" | "email" | "phone" | "website" | "postal_address" | "other";
33
28
 
34
29
  export interface IdentityClaim {
35
30
  readonly claim_type: IdentityClaimType;
@@ -12,16 +12,17 @@
12
12
  </non-goals>
13
13
  </MODULE_CONTRACT>
14
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>
15
+ <item>RFC-1097: step 6 — compass.migrate codemod run
16
+
17
+ Mechanical v1 to v2 header migration across the workspace: 942 files rewritten — CHANGE_SUMMARY windows collapsed into history, forbidden v1 blocks stripped, KEY_DECISIONS seeded from @ai-invariant comments (5 files) or TODO placeholders (103 files), blocks reordered to canonical order.</item>
18
+ <item>RFC-1097: sweep — werkstatt-engine clean
19
+
20
+ Sweep batch 4: 73 Compass headers on headerless engine files (certification, component-runtime, isolation, evolution, testing), real KEY_DECISIONS on 75 files (kernel, cache, dht, swim, gitmesh, runtime), ~80 purpose expansions (CONTRACT-02/PURPOSE-02), non-goals on 13 CONTRACT-03 files, CS-07 history literal fix repo-wide (253 files). Policy: .template.ts/.template.astro excludedPaths. werkstatt-engine now 0 diagnostics.</item>
16
21
  </CHANGE_SUMMARY>
17
22
  */
18
23
 
19
- import {
20
- pipedriveCrmAdapter,
21
- pipedriveDestinationAdapter,
22
- telegramChannelAdapter,
23
- whatsappChannelAdapter,
24
- } from "./adapters.ts";
24
+ import { telegramChannelAdapter, whatsappChannelAdapter } from "./adapters.ts";
25
+ import { lagebildDestinationAdapter } from "./lagebild-destination-adapter.ts";
25
26
  import type {
26
27
  CrmAdapter,
27
28
  DestinationAdapter,
@@ -50,8 +51,8 @@ export const CHANNEL_ADAPTERS: readonly IntegrationChannelAdapter[] = [
50
51
  whatsappChannelAdapter,
51
52
  ];
52
53
 
53
- /** Closed CRM adapter registry (RFC-0168). */
54
- export const CRM_ADAPTERS: readonly CrmAdapter[] = [pipedriveCrmAdapter];
54
+ /** Closed CRM adapter registry (RFC-0168). Empty — Lagebild is the sole CRM via DESTINATION_ADAPTERS. */
55
+ export const CRM_ADAPTERS: readonly CrmAdapter[] = [];
55
56
 
56
57
  /**
57
58
  * Closed catalog of configurable channel adapter ids (RFC-0168). `"null"` is the
@@ -162,7 +163,7 @@ export function auditIntegrationReadiness(
162
163
  // integration.config.validate reports "multiple-active-executors".
163
164
 
164
165
  /** Closed registry of gogol-adapter destination implementations (RFC-0176). */
165
- export const DESTINATION_ADAPTERS: readonly DestinationAdapter[] = [pipedriveDestinationAdapter];
166
+ export const DESTINATION_ADAPTERS: readonly DestinationAdapter[] = [lagebildDestinationAdapter];
166
167
 
167
168
  /**
168
169
  * Externally-implemented destination vendors whose adapters live in separate packages
@@ -43,7 +43,7 @@ test("deliverEvent with no secrets skips every sink (no failures, no retry)", as
43
43
  expect(result.channels.skipped.includes("whatsapp")).toBeTruthy();
44
44
  expect(result.destinations.routed.length).toBe(0);
45
45
  expect(result.destinations.failed.length).toBe(0);
46
- expect(result.destinations.skipped.includes("crm:pipedrive")).toBeTruthy();
46
+ expect(result.destinations.skipped.includes("crm:lagebild")).toBeTruthy();
47
47
  });
48
48
 
49
49
  test("email is no longer a fetch channel adapter (Cloudflare Email Routing handles it)", async () => {
@@ -35,7 +35,7 @@ const EVENT: IntegrationEvent = {
35
35
  test("executeDispatch skips destinations when the tenant holds no secrets", async () => {
36
36
  const result = await executeDispatch({ siteId: "warpgogol-com", event: EVENT }, {});
37
37
  expect(result.routed.length).toBe(0);
38
- expect(result.skipped.includes("crm:pipedrive")).toBeTruthy();
38
+ expect(result.skipped.includes("crm:lagebild")).toBeTruthy();
39
39
  });
40
40
 
41
41
  function stubDispatcher(
@@ -59,7 +59,7 @@ function stubDispatcher(
59
59
  test("dispatchToTenant acks on a routed reply and forwards only the inbound secret", async () => {
60
60
  let seen: Request | undefined;
61
61
  const dispatcher = stubDispatcher(
62
- { routed: ["crm:pipedrive"], failed: [], skipped: [] },
62
+ { routed: ["crm:lagebild"], failed: [], skipped: [] },
63
63
  200,
64
64
  (r) => (seen = r),
65
65
  );
@@ -71,11 +71,11 @@ test("dispatchToTenant acks on a routed reply and forwards only the inbound secr
71
71
  expect(outcome.ok).toBe(true);
72
72
  expect(seen?.headers.get("x-integration-secret")).toBe("inbound-secret");
73
73
  const body = await seen!.text();
74
- expect(!body.includes("PIPEDRIVE")).toBeTruthy();
74
+ expect(!body.includes("LAGEBILD")).toBeTruthy();
75
75
  });
76
76
 
77
77
  test("dispatchToTenant retries when nothing routed but something failed", async () => {
78
- const dispatcher = stubDispatcher({ routed: [], failed: ["crm:pipedrive"], skipped: [] });
78
+ const dispatcher = stubDispatcher({ routed: [], failed: ["crm:lagebild"], skipped: [] });
79
79
  const outcome = await dispatchToTenant(dispatcher, { siteId: "x", event: EVENT }, "s");
80
80
  expect(outcome.ok).toBe(false);
81
81
  });