@warpgogol/werkstatt-shared 0.14.1 → 0.16.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 (451) hide show
  1. package/README.md +23 -15
  2. package/README.uk.md +1 -1
  3. package/package.json +534 -766
  4. package/src/{share/agent → agent}/api-catalog.ts +14 -1
  5. package/src/{share/agent → agent}/ard-catalog.ts +6 -1
  6. package/src/{share/agent → agent}/dns-aid.test.ts +2 -2
  7. package/src/agent/guidance.ts +52 -0
  8. package/src/agent/health.ts +68 -0
  9. package/src/{share/agent → agent}/index.ts +5 -1
  10. package/src/{share/agent → agent}/manifest.ts +83 -6
  11. package/src/{share/agent → agent}/openapi.ts +97 -4
  12. package/src/agent/receipt.ts +123 -0
  13. package/src/{share/agent → agent}/search.test.ts +3 -0
  14. package/src/{share/agent → agent}/search.ts +31 -5
  15. package/src/{share → agent}/tests/api-catalog.test.ts +8 -2
  16. package/src/{share → agent}/tests/ard-catalog.test.ts +11 -2
  17. package/src/{share → agent}/tests/capability.test.ts +1 -1
  18. package/src/{share → agent}/tests/fleet-catalog.test.ts +1 -1
  19. package/src/{share → agent}/tests/knowledge.test.ts +2 -2
  20. package/src/{share → agent}/tests/manifest.test.ts +72 -1
  21. package/src/{share → agent}/tests/mcp-card.test.ts +6 -2
  22. package/src/{share → agent}/tests/openapi.test.ts +119 -2
  23. package/src/{share → agent}/tests/proof.test.ts +1 -1
  24. package/src/{share → attribution}/material-credits.ts +4 -4
  25. package/src/{share → checks}/check-hints.ts +6 -1
  26. package/src/checks/index.ts +4 -1
  27. package/src/checks/lib/astro-site-url.ts +6 -1
  28. package/src/checks/lib/i18n.ts +14 -0
  29. package/src/checks/result-helpers.ts +2 -2
  30. package/src/checks/tests/remediation-auto-populate.test.ts +1 -1
  31. package/src/{share → client-scripts}/counter-utils.ts +6 -2
  32. package/src/{share/scripts → client-scripts}/external-link-qr.ts +11 -16
  33. package/src/{share/scripts → client-scripts}/external-links.ts +12 -1
  34. package/src/{share/scripts → client-scripts}/gsap-counter.ts +8 -3
  35. package/src/client-scripts/index.ts +35 -0
  36. package/src/{share/scripts → client-scripts}/inline-number-animation.ts +1 -1
  37. package/src/{share/scripts → client-scripts}/lenis.ts +6 -1
  38. package/src/{share/scripts → client-scripts}/lordicon.ts +6 -1
  39. package/src/{share/scripts → client-scripts}/orchestrator.ts +10 -1
  40. package/src/{share/scripts → client-scripts}/scheduler.ts +6 -1
  41. package/src/client-scripts/scroll-spy.ts +106 -0
  42. package/src/client-scripts/tests/orchestrator.test.ts +47 -0
  43. package/src/client-scripts/tests/scroll-spy.test.ts +204 -0
  44. package/src/{share/scripts → client-scripts/tests}/video-player.test.ts +51 -31
  45. package/src/component/contracts.ts +206 -0
  46. package/src/component/index.ts +13 -0
  47. package/src/{share → content}/content-reference.ts +3 -3
  48. package/src/{share/content → content}/entity-id.ts +6 -3
  49. package/src/content/index.ts +3 -0
  50. package/src/{share/content → content}/merge.ts +6 -1
  51. package/src/content/system-manifest.test.ts +107 -0
  52. package/src/content/system-manifest.ts +12 -94
  53. package/src/{share → content}/tests/resolve-field-path.test.ts +1 -1
  54. package/src/{share → content}/tests/substitute-deep.test.ts +1 -1
  55. package/src/content-discipline/index.ts +19 -0
  56. package/src/{share/content-discipline → content-discipline}/parsers.ts +2 -2
  57. package/src/{share/env.d.ts → env.d.ts} +6 -3
  58. package/src/fingerprint/canonical-json.ts +731 -0
  59. package/src/fingerprint/index.ts +14 -0
  60. package/src/fingerprint/primitives.ts +72 -0
  61. package/src/{share/i18n → i18n}/localization.ts +6 -2
  62. package/src/integration/adapters.ts +10 -71
  63. package/src/integration/dispatch.ts +1 -1
  64. package/src/integration/funnel.ts +6 -1
  65. package/src/integration/idempotency.ts +88 -0
  66. package/src/integration/index.ts +105 -4
  67. package/src/integration/lagebild-destination-adapter.ts +108 -0
  68. package/src/integration/lagebild-ingress.ts +7 -12
  69. package/src/integration/orchestration.ts +11 -10
  70. package/src/integration/tests/deliver-event.test.ts +1 -1
  71. package/src/integration/tests/dispatch.test.ts +4 -4
  72. package/src/integration/tests/hub-runtime.test.ts +22 -14
  73. package/src/integration/tests/idempotency.test.ts +81 -0
  74. package/src/integration/vitest.config.ts +1 -0
  75. package/src/kernel/desired-state.ts +227 -0
  76. package/src/kernel/diagnostic.ts +289 -0
  77. package/src/kernel/drift-guard.ts +166 -0
  78. package/src/kernel/fs-atomic.ts +131 -0
  79. package/src/kernel/index.ts +22 -0
  80. package/src/kernel/tests/drift-guard.test.ts +112 -0
  81. package/src/kernel/tests/fs-atomic.test.ts +150 -0
  82. package/src/kernel/tests/workpiece-env.test.ts +44 -0
  83. package/src/kernel/tests/workspace-io.test.ts +187 -0
  84. package/src/kernel/types.ts +518 -0
  85. package/src/kernel/workpiece-env.ts +48 -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 +11 -8
  95. package/src/{share/middleware → middleware}/language-redirect.ts +3 -0
  96. package/src/{share → node}/dev-props-validator.ts +6 -1
  97. package/src/{share → node}/import-scan.ts +23 -3
  98. package/src/{share → node}/semantic/derived-prices-loader.ts +4 -2
  99. package/src/{share → node}/semantic/markdown-twin-provenance.ts +1 -1
  100. package/src/{share/semantic → node}/tests/derived-prices-loader.test.ts +14 -1
  101. package/src/{share/semantic → node}/tests/markdown-twin-provenance.test.ts +1 -1
  102. package/src/observability/env-resolver.ts +6 -1
  103. package/src/observability/index.ts +14 -1
  104. package/src/observability/otlp-converter.ts +6 -1
  105. package/src/observability/otlp-transport.ts +6 -1
  106. package/src/observability/pipeline-log.ts +81 -0
  107. package/src/observability/pusher.ts +6 -1
  108. package/src/observability/redact.ts +6 -1
  109. package/src/observability/typed-refs.ts +6 -2
  110. package/src/observability/vitest.config.ts +1 -0
  111. package/src/{share → offers}/formula-eval.ts +3 -3
  112. package/src/{share → offers}/tests/formula-eval.test.ts +2 -2
  113. package/src/onboarding/index.ts +1 -0
  114. package/src/{share → onboarding}/tests/onboarding-yaml.test.ts +1 -1
  115. package/src/ontology/archetype-registry.ts +6 -1
  116. package/src/ontology/archetypes/index.json +33 -1
  117. package/src/ontology/archetypes/index.yaml +27 -1
  118. package/src/ontology/archetypes/sections/entity-grid.yaml +46 -0
  119. package/src/ontology/archetypes/sections/exit-diagram.yaml +43 -0
  120. package/src/ontology/biome-token-projection.ts +6 -1
  121. package/src/ontology/capabilities/lead.prepare.yaml +44 -0
  122. package/src/ontology/capabilities/lead.submit.yaml +20 -3
  123. package/src/ontology/cosmic/index.ts +6 -1
  124. package/src/ontology/cosmic/moon-catalog.ts +6 -1
  125. package/src/ontology/cosmic/planet-catalog.ts +6 -1
  126. package/src/ontology/cosmic/star-catalog.ts +6 -1
  127. package/src/ontology/enums.ts +6 -1
  128. package/src/ontology/external-surfaces/index.ts +1 -1
  129. package/src/ontology/index.ts +6 -2
  130. package/src/ontology/manifest.ts +7 -4
  131. package/src/ontology/operations/artifact-store.ts +45 -0
  132. package/src/ontology/operations/dht.ts +98 -0
  133. package/src/ontology/operations/handoff.ts +92 -0
  134. package/src/ontology/operations/index.ts +193 -1
  135. package/src/ontology/operations/leitstand.ts +99 -0
  136. package/src/ontology/operations/materialization.ts +90 -0
  137. package/src/ontology/operations/mission.ts +111 -0
  138. package/src/ontology/operations/naming-policy.ts +132 -0
  139. package/src/ontology/operations/notausgang.ts +108 -0
  140. package/src/ontology/operations/release.ts +121 -0
  141. package/src/ontology/operations/sternsystem.ts +192 -0
  142. package/src/ontology/operations/werkstatt.ts +48 -0
  143. package/src/ontology/schemas/biome.ts +7 -2
  144. package/src/ontology/schemas/capability.ts +56 -4
  145. package/src/ontology/schemas/constellation.ts +6 -1
  146. package/src/ontology/schemas/index.ts +6 -2
  147. package/src/ontology/schemas/manifest-resolver.ts +6 -1
  148. package/src/ontology/schemas/page-entry.ts +9 -5
  149. package/src/ontology/schemas/system/growth.ts +6 -1
  150. package/src/ontology/schemas/system/manifest.ts +40 -1
  151. package/src/ontology/schemas/system/page-output.ts +7 -6
  152. package/src/ontology/schemas/system/text.ts +15 -0
  153. package/src/ontology/schemas/system.ts +6 -2
  154. package/src/ontology/shared-section-props/body-fragments.ts +2 -0
  155. package/src/ontology/tests/sternsystem-owner.test.ts +1 -1
  156. package/src/ontology/vitest.config.ts +1 -0
  157. package/src/{share → page}/page.ts +13 -9
  158. package/src/{share → page}/tests/dev-props-validator.test.ts +1 -1
  159. package/src/{share → page}/tests/hero-section-numbering-parity.test.ts +1 -1
  160. package/src/passport/claim-sign.ts +120 -0
  161. package/src/passport/index.ts +9 -1
  162. package/src/passport/key-rotate.ts +10 -2
  163. package/src/passport/schema.ts +6 -1
  164. package/src/passport/sign.ts +8 -3
  165. package/src/passport/vitest.config.ts +1 -0
  166. package/src/pbt/index.test.ts +95 -0
  167. package/src/pbt/index.ts +251 -0
  168. package/src/plugin/plugin-contract.ts +2 -2
  169. package/src/{share → policy}/entitlement.ts +24 -4
  170. package/src/{share → policy}/feature-policy.ts +8 -3
  171. package/src/{share → policy}/visibility.ts +7 -2
  172. package/src/redirects/redirects.ts +117 -0
  173. package/src/{share → redirects/tests}/redirects.test.ts +1 -1
  174. package/src/remediation/remediation-catalog.ts +316 -0
  175. package/src/{share/routes → routes}/template-filter.ts +1 -1
  176. package/src/{share → runtime}/runtime-context.ts +7 -2
  177. package/src/{share → runtime}/shared-context.ts +1 -1
  178. package/src/{share/schemas → schemas}/claims.ts +2 -2
  179. package/src/{share/schemas → schemas}/effects.ts +6 -1
  180. package/src/{share/schemas → schemas}/features.ts +1 -1
  181. package/src/{share/schemas → schemas}/index.ts +3 -3
  182. package/src/{share/schemas → schemas}/navigation.ts +6 -1
  183. package/src/{share/schemas → schemas}/page-base.ts +6 -2
  184. package/src/{share/schemas → schemas}/person.ts +1 -1
  185. package/src/{share/schemas → schemas}/standard-list-item.ts +1 -1
  186. package/src/{share → sections}/rfc0042-utils.ts +1 -1
  187. package/src/{share/semantic → semantic}/block-extractors/index.ts +20 -1
  188. package/src/{share/semantic → semantic}/business-projection.ts +95 -1
  189. package/src/semantic/canonical-uri.ts +74 -0
  190. package/src/{share/semantic → semantic}/extract.ts +100 -1
  191. package/src/semantic/fact-extraction.test.ts +47 -0
  192. package/src/semantic/fact-extraction.ts +46 -0
  193. package/src/semantic/freshness.ts +67 -0
  194. package/src/{share/semantic → semantic}/ids.ts +6 -1
  195. package/src/{share/semantic → semantic}/index.ts +9 -2
  196. package/src/{share/semantic → semantic}/jsonld/breadcrumb.ts +6 -2
  197. package/src/{share/semantic → semantic}/jsonld/context.ts +6 -2
  198. package/src/{share/semantic → semantic}/jsonld/faq.ts +6 -2
  199. package/src/{share/semantic → semantic}/jsonld/initiative.ts +6 -1
  200. package/src/{share/semantic → semantic}/jsonld/organization.ts +6 -1
  201. package/src/{share/semantic → semantic}/jsonld/person.ts +6 -2
  202. package/src/{share/semantic → semantic}/jsonld/service.ts +6 -2
  203. package/src/semantic/jsonld/shared.ts +36 -0
  204. package/src/semantic/jsonld/types.ts +24 -0
  205. package/src/{share/semantic → semantic}/jsonld/webpage.ts +6 -1
  206. package/src/semantic/jsonld/website.ts +32 -0
  207. package/src/{share/semantic → semantic}/jsonld.ts +6 -1
  208. package/src/{share/semantic → semantic}/llms.ts +51 -5
  209. package/src/{share/semantic → semantic}/models.ts +26 -38
  210. package/src/{share/semantic → semantic}/organization-profile.ts +3 -0
  211. package/src/{share/semantic → semantic}/page-builders/markdown-page.ts +6 -3
  212. package/src/{share/semantic → semantic}/page-utils.ts +6 -3
  213. package/src/{share/tests/breadcrumbs.test.ts → semantic/tests/breadcrumbs-0229.test.ts} +1 -1
  214. package/src/{share → semantic}/tests/build-page-price-markers.test.ts +2 -2
  215. package/src/{share/semantic → semantic}/tests/business-projection.test.ts +179 -0
  216. package/src/semantic/tests/canonical-uri.test.ts +68 -0
  217. package/src/{share/semantic → semantic}/tests/extract.test.ts +83 -0
  218. package/src/semantic/tests/freshness.pbt.test.ts +108 -0
  219. package/src/{share/tests/image-sitemap.test.ts → semantic/tests/image-sitemap-0150.test.ts} +1 -1
  220. package/src/{share → semantic}/tests/jsonld-service.test.ts +2 -2
  221. package/src/{share → semantic}/tests/jsonld-video.test.ts +3 -3
  222. package/src/{share → semantic}/tests/jsonld-webpage.test.ts +3 -3
  223. package/src/{share → semantic}/tests/llms-0789.test.ts +2 -2
  224. package/src/{share/semantic → semantic}/tests/llms.test.ts +46 -0
  225. package/src/{share → semantic}/tests/organization-jsonld.test.ts +3 -3
  226. package/src/{share/tests/output-projection.test.ts → semantic/tests/output-projection-0143.test.ts} +1 -1
  227. package/src/{share/tests/price-marker-resolver.test.ts → semantic/tests/price-marker-resolver-0767.test.ts} +2 -2
  228. package/src/{share/semantic → semantic}/tests/price-marker-resolver.test.ts +4 -2
  229. package/src/semantic/tests/project-claims.pbt.test.ts +60 -0
  230. package/src/{share/semantic → semantic}/tests/split-sentences.test.ts +1 -1
  231. package/src/{share → semantic}/tests/twin-path.test.ts +1 -1
  232. package/src/signing/index.ts +15 -0
  233. package/src/signing/key.ts +139 -0
  234. package/src/signing/sign.ts +66 -0
  235. package/src/signing/types.ts +29 -0
  236. package/src/{share/slug → slug}/slug-url.ts +4 -1
  237. package/src/stack/run-tool.ts +106 -0
  238. package/src/stack/stack-checks.ts +124 -0
  239. package/src/stack/tests/run-tool.test.ts +138 -0
  240. package/src/stack/tests/stack-checks.test.ts +141 -0
  241. package/src/stack/tests/walk-files.test.ts +131 -0
  242. package/src/stack/walk-files.ts +114 -0
  243. package/src/surface/blueprint.ts +342 -66
  244. package/src/surface/decision-composer.ts +6 -1
  245. package/src/surface/geo.ts +6 -1
  246. package/src/surface/index.ts +11 -7
  247. package/src/surface/types.ts +2 -2
  248. package/src/surface/vitest.config.ts +1 -0
  249. package/src/tests/signing-core.test.ts +129 -0
  250. package/src/{share → text}/css-value-normalize.ts +6 -1
  251. package/src/text/string-utils.ts +24 -0
  252. package/src/{share → text}/tests/text-normalize.test.ts +5 -0
  253. package/src/{share → text}/text-normalize.ts +4 -3
  254. package/src/{share → text}/wrap-inline-numbers.ts +1 -1
  255. package/src/types/axiom-study.d.ts +36 -0
  256. package/src/types/hls-js-light.d.ts +21 -0
  257. package/src/types/qrcode-browser.d.ts +23 -0
  258. package/src/typography/fix.pbt.test.ts +208 -0
  259. package/src/typography/fix.ts +148 -0
  260. package/src/typography/index.ts +54 -0
  261. package/src/typography/locale-defaults.ts +97 -0
  262. package/src/typography/rules-tier1.test.ts +459 -0
  263. package/src/typography/rules-tier1.ts +925 -0
  264. package/src/typography/rules-tier2-locale.pbt.test.ts +190 -0
  265. package/src/typography/rules-tier2-locale.test.ts +286 -0
  266. package/src/typography/rules-tier2-locale.ts +399 -0
  267. package/src/typography/rules-tier2-structure.test.ts +330 -0
  268. package/src/typography/rules-tier2-structure.ts +378 -0
  269. package/src/typography/rules-tier3-advisory.test.ts +290 -0
  270. package/src/typography/rules-tier3-advisory.ts +239 -0
  271. package/src/typography/text-surface.test.ts +244 -0
  272. package/src/typography/text-surface.ts +448 -0
  273. package/src/index.ts +0 -14
  274. package/src/integration/port-barrel.ts +0 -105
  275. package/src/share/agent/tests/api-catalog.test.ts +0 -8
  276. package/src/share/agent/tests/ard-catalog.test.ts +0 -8
  277. package/src/share/agent/tests/capability.test.ts +0 -14
  278. package/src/share/agent/tests/fleet-catalog.test.ts +0 -15
  279. package/src/share/agent/tests/knowledge.test.ts +0 -20
  280. package/src/share/agent/tests/manifest.test.ts +0 -9
  281. package/src/share/agent/tests/mcp-card.test.ts +0 -8
  282. package/src/share/agent/tests/openapi.test.ts +0 -8
  283. package/src/share/agent/tests/proof.test.ts +0 -15
  284. package/src/share/content/index.ts +0 -16
  285. package/src/share/content-discipline/index.ts +0 -14
  286. package/src/share/index.ts +0 -86
  287. package/src/share/knowledge/tests/claim.test.ts +0 -11
  288. package/src/share/knowledge/tests/derivation.test.ts +0 -30
  289. package/src/share/knowledge/tests/freshness.test.ts +0 -18
  290. package/src/share/knowledge/tests/ledger.test.ts +0 -35
  291. package/src/share/knowledge/tests/plan.test.ts +0 -19
  292. package/src/share/knowledge/tests/source.test.ts +0 -19
  293. package/src/share/legal/index.ts +0 -1
  294. package/src/share/redirects.ts +0 -54
  295. package/src/share/remediation/remediation-catalog.ts +0 -196
  296. package/src/share/scripts/index.ts +0 -26
  297. package/src/share/scripts/tests/orchestrator.test.ts +0 -8
  298. package/src/share/semantic/jsonld/shared.ts +0 -31
  299. package/src/share/semantic/jsonld/types.ts +0 -19
  300. package/src/share/semantic/jsonld/website.ts +0 -27
  301. package/src/share/string-utils.ts +0 -19
  302. package/src/share/types/axiom-study.d.ts +0 -22
  303. package/src/share/types/hls-js-light.d.ts +0 -16
  304. package/src/share/types/qrcode-browser.d.ts +0 -18
  305. package/src/share/utility-registry.yaml +0 -50
  306. package/src/share/vitest.config.ts +0 -8
  307. package/src/surface/blueprint-schema.ts +0 -314
  308. package/src/surface/blueprint-types.ts +0 -256
  309. /package/src/{share/agent → agent}/capability.ts +0 -0
  310. /package/src/{share/agent → agent}/dns-aid.ts +0 -0
  311. /package/src/{share/agent → agent}/fleet-catalog.ts +0 -0
  312. /package/src/{share/agent → agent}/knowledge.ts +0 -0
  313. /package/src/{share/agent → agent}/mcp-card.ts +0 -0
  314. /package/src/{share/agent → agent}/omit-empty.ts +0 -0
  315. /package/src/{share/agent → agent}/proof.ts +0 -0
  316. /package/src/{share/agent → agent}/tests/omit-empty.test.ts +0 -0
  317. /package/src/{share → attribution}/attribution-display.ts +0 -0
  318. /package/src/{share/scripts → client-scripts}/gsap-mountain-journey.ts +0 -0
  319. /package/src/{share/scripts → client-scripts}/gsap-parallax.ts +0 -0
  320. /package/src/{share/scripts → client-scripts}/gsap-reveal.ts +0 -0
  321. /package/src/{share/scripts → client-scripts}/gsap-stagger.ts +0 -0
  322. /package/src/{share/scripts → client-scripts}/live-photos.ts +0 -0
  323. /package/src/{share/scripts → client-scripts}/tests/external-link-qr.test.ts +0 -0
  324. /package/src/{share/scripts → client-scripts}/tests/external-links.test.ts +0 -0
  325. /package/src/{share/scripts → client-scripts}/tests/gsap-counter.test.ts +0 -0
  326. /package/src/{share/scripts → client-scripts}/tests/gsap-mountain-journey.test.ts +0 -0
  327. /package/src/{share/scripts → client-scripts}/tests/gsap-parallax.test.ts +0 -0
  328. /package/src/{share/scripts → client-scripts}/tests/gsap-reveal.test.ts +0 -0
  329. /package/src/{share/scripts → client-scripts}/tests/gsap-stagger.test.ts +0 -0
  330. /package/src/{share/scripts → client-scripts}/tests/inline-number-animation.test.ts +0 -0
  331. /package/src/{share/scripts → client-scripts}/tests/lenis.test.ts +0 -0
  332. /package/src/{share/scripts → client-scripts}/tests/live-photos.test.ts +0 -0
  333. /package/src/{share/scripts → client-scripts}/tests/lordicon.test.ts +0 -0
  334. /package/src/{share/scripts → client-scripts}/tests/scheduler.test.ts +0 -0
  335. /package/src/{share/scripts → client-scripts}/video-player.ts +0 -0
  336. /package/src/{share/content → content}/resolve-field-path.ts +0 -0
  337. /package/src/{share/content → content}/substitute-deep.ts +0 -0
  338. /package/src/{share → content}/tests/content-ref-index.test.ts +0 -0
  339. /package/src/{share/content-discipline → content-discipline}/types.ts +0 -0
  340. /package/src/{share → image-provider}/image-provider.ts +0 -0
  341. /package/src/{share/knowledge → knowledge}/claim.ts +0 -0
  342. /package/src/{share/knowledge → knowledge}/derivation.ts +0 -0
  343. /package/src/{share/knowledge → knowledge}/freshness.ts +0 -0
  344. /package/src/{share/knowledge → knowledge}/index.ts +0 -0
  345. /package/src/{share/knowledge → knowledge}/ledger.ts +0 -0
  346. /package/src/{share/knowledge → knowledge}/plan.ts +0 -0
  347. /package/src/{share/knowledge → knowledge}/source.ts +0 -0
  348. /package/src/{share/legal → legal}/translation-policy.ts +0 -0
  349. /package/src/{share/middleware → middleware}/tests/access-protection.test.ts +0 -0
  350. /package/src/{share → node}/fs/index.ts +0 -0
  351. /package/src/{share/tests/markdown-twin-provenance.test.ts → node/tests/markdown-twin-provenance-0613.test.ts} +0 -0
  352. /package/src/{share → offers}/offer-capacity.ts +0 -0
  353. /package/src/{share/onboarding-yaml/index.ts → onboarding/yaml.ts} +0 -0
  354. /package/src/{share → ontology}/tests/ontology-role-by-cosmic-name.test.ts +0 -0
  355. /package/src/{share/routes → routes}/tests/template-filter.test.ts +0 -0
  356. /package/src/{share/schemas → schemas}/claim-records.ts +0 -0
  357. /package/src/{share/schemas → schemas}/horizontal-align.ts +0 -0
  358. /package/src/{share/schemas → schemas}/icon-color.ts +0 -0
  359. /package/src/{share/schemas → schemas}/live-photo.ts +0 -0
  360. /package/src/{share/schemas → schemas}/material-credit.ts +0 -0
  361. /package/src/{share/schemas → schemas}/media.ts +0 -0
  362. /package/src/{share/schemas → schemas}/participant.ts +0 -0
  363. /package/src/{share/schemas → schemas}/print.ts +0 -0
  364. /package/src/{share/schemas → schemas}/section-background.ts +0 -0
  365. /package/src/{share/schemas → schemas}/section-body.ts +0 -0
  366. /package/src/{share/schemas → schemas}/section-cards.ts +0 -0
  367. /package/src/{share/schemas → schemas}/section-cta.ts +0 -0
  368. /package/src/{share/schemas → schemas}/section-header.ts +0 -0
  369. /package/src/{share/schemas → schemas}/section-image.ts +0 -0
  370. /package/src/{share/schemas → schemas}/section-motion.ts +0 -0
  371. /package/src/{share/schemas → schemas}/section-shell.ts +0 -0
  372. /package/src/{share/schemas → schemas}/section-stats.ts +0 -0
  373. /package/src/{share/schemas → schemas}/site-background.ts +0 -0
  374. /package/src/{share/schemas → schemas}/tests/claim-records.test.ts +0 -0
  375. /package/src/{share/schemas → schemas}/tests/claims.test.ts +0 -0
  376. /package/src/{share/schemas → schemas}/tests/effects.test.ts +0 -0
  377. /package/src/{share/schemas → schemas}/tests/features.test.ts +0 -0
  378. /package/src/{share/schemas → schemas}/tests/horizontal-align.test.ts +0 -0
  379. /package/src/{share/schemas → schemas}/tests/icon-color.test.ts +0 -0
  380. /package/src/{share/schemas → schemas}/tests/live-photo.test.ts +0 -0
  381. /package/src/{share/schemas → schemas}/tests/material-credit.test.ts +0 -0
  382. /package/src/{share/schemas → schemas}/tests/media.test.ts +0 -0
  383. /package/src/{share/schemas → schemas}/tests/navigation.test.ts +0 -0
  384. /package/src/{share/schemas → schemas}/tests/page-base.test.ts +0 -0
  385. /package/src/{share/schemas → schemas}/tests/participant.test.ts +0 -0
  386. /package/src/{share/schemas → schemas}/tests/person.test.ts +0 -0
  387. /package/src/{share/schemas → schemas}/tests/print.test.ts +0 -0
  388. /package/src/{share/schemas → schemas}/tests/section-background.test.ts +0 -0
  389. /package/src/{share/schemas → schemas}/tests/section-body.test.ts +0 -0
  390. /package/src/{share/schemas → schemas}/tests/section-cards.test.ts +0 -0
  391. /package/src/{share/schemas → schemas}/tests/section-cta.test.ts +0 -0
  392. /package/src/{share/schemas → schemas}/tests/section-header.test.ts +0 -0
  393. /package/src/{share/schemas → schemas}/tests/section-image.test.ts +0 -0
  394. /package/src/{share/schemas → schemas}/tests/section-motion.test.ts +0 -0
  395. /package/src/{share/schemas → schemas}/tests/section-shell.test.ts +0 -0
  396. /package/src/{share/schemas → schemas}/tests/section-stats.test.ts +0 -0
  397. /package/src/{share/schemas → schemas}/tests/site-background.test.ts +0 -0
  398. /package/src/{share/schemas → schemas}/tests/standard-list-item.test.ts +0 -0
  399. /package/src/{share/semantic → semantic}/ai.ts +0 -0
  400. /package/src/{share/semantic → semantic}/block-extraction.ts +0 -0
  401. /package/src/{share/semantic → semantic}/breadcrumbs.ts +0 -0
  402. /package/src/{share/semantic → semantic}/build-page.ts +0 -0
  403. /package/src/{share/semantic → semantic}/feed.ts +0 -0
  404. /package/src/{share/semantic → semantic}/image-sitemap.ts +0 -0
  405. /package/src/{share/semantic → semantic}/jsonld/article.ts +0 -0
  406. /package/src/{share/semantic → semantic}/jsonld/collection-list.ts +0 -0
  407. /package/src/{share/semantic → semantic}/jsonld/tests/article.test.ts +0 -0
  408. /package/src/{share/semantic → semantic}/jsonld/tests/breadcrumb.test.ts +0 -0
  409. /package/src/{share/semantic → semantic}/jsonld/tests/collection-list.test.ts +0 -0
  410. /package/src/{share/semantic → semantic}/jsonld/tests/faq.test.ts +0 -0
  411. /package/src/{share/semantic → semantic}/jsonld/tests/initiative.test.ts +0 -0
  412. /package/src/{share/semantic → semantic}/jsonld/tests/organization.test.ts +0 -0
  413. /package/src/{share/semantic → semantic}/jsonld/tests/person.test.ts +0 -0
  414. /package/src/{share/semantic → semantic}/jsonld/tests/service.test.ts +0 -0
  415. /package/src/{share/semantic → semantic}/jsonld/tests/shared.test.ts +0 -0
  416. /package/src/{share/semantic → semantic}/jsonld/tests/video.test.ts +0 -0
  417. /package/src/{share/semantic → semantic}/jsonld/tests/webpage.test.ts +0 -0
  418. /package/src/{share/semantic → semantic}/jsonld/tests/website.test.ts +0 -0
  419. /package/src/{share/semantic → semantic}/jsonld/video.ts +0 -0
  420. /package/src/{share/semantic → semantic}/llms-policy.ts +0 -0
  421. /package/src/{share/semantic → semantic}/markdown-hygiene.ts +0 -0
  422. /package/src/{share/semantic → semantic}/output-projection.ts +0 -0
  423. /package/src/{share/semantic → semantic}/page-markdown.ts +0 -0
  424. /package/src/{share/semantic → semantic}/price-marker-resolver.ts +0 -0
  425. /package/src/{share/semantic → semantic}/robots.ts +0 -0
  426. /package/src/{share/semantic → semantic}/tests/ai.test.ts +0 -0
  427. /package/src/{share/semantic → semantic}/tests/block-extraction.test.ts +0 -0
  428. /package/src/{share/semantic → semantic}/tests/breadcrumbs.test.ts +0 -0
  429. /package/src/{share/semantic → semantic}/tests/build-page.test.ts +0 -0
  430. /package/src/{share/semantic → semantic}/tests/feed.test.ts +0 -0
  431. /package/src/{share/semantic → semantic}/tests/helpers.ts +0 -0
  432. /package/src/{share/semantic → semantic}/tests/ids.test.ts +0 -0
  433. /package/src/{share/semantic → semantic}/tests/image-sitemap.test.ts +0 -0
  434. /package/src/{share/semantic → semantic}/tests/jsonld.test.ts +0 -0
  435. /package/src/{share/semantic → semantic}/tests/llms-policy.test.ts +0 -0
  436. /package/src/{share/semantic → semantic}/tests/markdown-hygiene.test.ts +0 -0
  437. /package/src/{share/semantic → semantic}/tests/markdown-page.test.ts +0 -0
  438. /package/src/{share/semantic → semantic}/tests/organization-profile.test.ts +0 -0
  439. /package/src/{share/semantic → semantic}/tests/output-projection.test.ts +0 -0
  440. /package/src/{share/semantic → semantic}/tests/page-markdown.test.ts +0 -0
  441. /package/src/{share/semantic → semantic}/tests/page-utils.test.ts +0 -0
  442. /package/src/{share/semantic → semantic}/tests/robots.test.ts +0 -0
  443. /package/src/{share/semantic → semantic}/tests/update-stamp.test.ts +0 -0
  444. /package/src/{share/semantic → semantic}/update-stamp.ts +0 -0
  445. /package/src/{share/slug → slug}/heading-slugger.ts +0 -0
  446. /package/src/{share/slug → slug}/index.ts +0 -0
  447. /package/src/{share/slug → slug}/slug-id.ts +0 -0
  448. /package/src/{share/slug → slug}/strategies.ts +0 -0
  449. /package/src/{share/slug → slug}/tests/slug.test.ts +0 -0
  450. /package/src/{share → text}/tests/text-normalize.pbt.test.ts +0 -0
  451. /package/src/{share → text}/text-position.ts +0 -0
@@ -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
  });
@@ -1,10 +1,10 @@
1
1
  /*
2
2
  <MODULE_CONTRACT>
3
3
  <purpose>RFC-0176: verify the inbound/queue runtime — authenticateInbound, IntegrationEventSchema,
4
- routeEventToReady (self-enabling Pipedrive route), and consumeIntegrationBatch dedup via a KV-backed
4
+ routeEventToReady (self-enabling Lagebild route), and consumeIntegrationBatch dedup via a KV-backed
5
5
  seen-set. fetch + KV are stubbed so the full producer→consumer flow is exercised without Cloudflare.</purpose>
6
6
  <responsibilities>
7
- <item>Assert a valid event routes once to the pipedrive gogol-adapter destination.</item>
7
+ <item>Assert a valid event routes once to the lagebild gogol-adapter destination.</item>
8
8
  <item>Assert a queue redelivery is deduped (no double-write) via the KV seen-set.</item>
9
9
  <item>Assert inbound auth + event-shape validation are fail-closed.</item>
10
10
  </responsibilities>
@@ -14,6 +14,7 @@ seen-set. fetch + KV are stubbed so the full producer→consumer flow is exercis
14
14
  </MODULE_CONTRACT>
15
15
  <CHANGE_SUMMARY>
16
16
  <item>RFC-0176: initial queue/inbound runtime test.</item>
17
+ <item>Lagebild replaced Pipedrive as sole CRM destination — test updated accordingly.</item>
17
18
  </CHANGE_SUMMARY>
18
19
  */
19
20
 
@@ -30,8 +31,10 @@ import {
30
31
  } from "../index.ts";
31
32
 
32
33
  const SECRETS: IntegrationSecrets = {
33
- INTEGRATION_PIPEDRIVE_API_TOKEN: "tok",
34
- INTEGRATION_PIPEDRIVE_DOMAIN: "acme",
34
+ LAGEBILD_API_URL: "https://lagebild-api.example.workers.dev",
35
+ LAGEBILD_API_KEY: "lbk_test_key_0001",
36
+ LAGEBILD_TENANT_ID: "ten_warpgogol000001",
37
+ LAGEBILD_SOURCE_SYSTEM_ID: "site_warpgogol_com",
35
38
  };
36
39
 
37
40
  const EVENT: IntegrationEvent = {
@@ -63,13 +66,18 @@ const realFetch = globalThis.fetch;
63
66
 
64
67
  beforeEach(() => {
65
68
  fetchCalls = [];
66
- // Stub Pipedrive persons + leads endpoints — both return a usable id.
69
+ // Stub Lagebild ingress endpoint — returns accepted with a submission id.
67
70
  globalThis.fetch = (async (url: string | URL | Request) => {
68
71
  fetchCalls.push(String(url));
69
72
  return {
70
73
  ok: true,
71
74
  status: 200,
72
- json: async () => ({ data: { id: 1 } }),
75
+ json: async () => ({
76
+ submission_id: "sub_test123",
77
+ accepted: true,
78
+ is_replay: false,
79
+ correlation_id: null,
80
+ }),
73
81
  } as unknown as Response;
74
82
  }) as typeof fetch;
75
83
  });
@@ -78,17 +86,17 @@ afterEach(() => {
78
86
  globalThis.fetch = realFetch;
79
87
  });
80
88
 
81
- test("routeEventToReady routes a lead to the pipedrive gogol-adapter destination", async () => {
89
+ test("routeEventToReady routes a lead to the lagebild gogol-adapter destination", async () => {
82
90
  const result = await routeEventToReady(EVENT, SECRETS);
83
- expect(result.routed).toEqual(["crm:pipedrive"]);
91
+ expect(result.routed).toEqual(["crm:lagebild"]);
84
92
  expect(result.failed.length).toBe(0);
85
- // pipedrive adapter performs persons + leads calls.
86
- expect(fetchCalls.length).toBe(2);
93
+ // lagebild adapter performs a single POST to /v1/ingress.
94
+ expect(fetchCalls.length).toBe(1);
87
95
  });
88
96
 
89
97
  test("routeEventToReady skips when destination secrets are absent", async () => {
90
98
  const result = await routeEventToReady(EVENT, {});
91
- expect(result.skipped).toEqual(["crm:pipedrive"]);
99
+ expect(result.skipped).toEqual(["crm:lagebild"]);
92
100
  expect(result.routed.length).toBe(0);
93
101
  expect(fetchCalls.length).toBe(0);
94
102
  });
@@ -98,13 +106,13 @@ test("consumeIntegrationBatch dedups a queue redelivery via KV (no double-write)
98
106
  const dedup = kvDedup(kv);
99
107
 
100
108
  const first = await consumeIntegrationBatch([EVENT], SECRETS, dedup);
101
- expect(first[0].routed).toEqual(["crm:pipedrive"]);
109
+ expect(first[0].routed).toEqual(["crm:lagebild"]);
102
110
  const afterFirst = fetchCalls.length;
103
- expect(afterFirst).toBe(2);
111
+ expect(afterFirst).toBe(1);
104
112
 
105
113
  // Redeliver the SAME eventId — must be skipped by dedup, no new fetches.
106
114
  const second = await consumeIntegrationBatch([EVENT], SECRETS, dedup);
107
- expect(second[0].skipped).toEqual(["crm:pipedrive"]);
115
+ expect(second[0].skipped).toEqual(["crm:lagebild"]);
108
116
  expect(fetchCalls.length).toBe(afterFirst);
109
117
  expect(kv.size()).toBe(1);
110
118
  });
@@ -0,0 +1,81 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>RFC-1112: verify the Upstash Redis REST receipt store. get parses the stored
4
+ { receipt, bodyHash } record or returns null on a miss; put issues SET NX EX with the
5
+ receipt JSON and the configured key prefix. Both throw on transport errors so the
6
+ caller can decide fail-open semantics. fetch is stubbed — no network.</purpose>
7
+ <responsibilities>
8
+ <item>get → null on miss, parsed record on hit, correct key prefix.</item>
9
+ <item>put → SET key JSON NX EX ttl command shape.</item>
10
+ <item>transport errors propagate (throw).</item>
11
+ </responsibilities>
12
+ <non-goals><item>No network — fetch stubbed.</item></non-goals>
13
+ </MODULE_CONTRACT>
14
+ <CHANGE_SUMMARY><item>RFC-1112: initial receipt store test.</item></CHANGE_SUMMARY>
15
+ */
16
+
17
+ import { test, expect } from "vitest";
18
+ import { restRedisReceiptStore, type ReceiptStoreRecord } from "../idempotency.ts";
19
+ import type { ActionReceipt } from "@warpgogol/werkstatt-shared/agent";
20
+
21
+ const RECEIPT: ActionReceipt = {
22
+ receiptId: "11111111-1111-1111-1111-111111111111",
23
+ status: "accepted",
24
+ duplicate: false,
25
+ submittedAt: "2026-07-05T00:00:00.000Z",
26
+ };
27
+
28
+ const CONFIG = { url: "https://eu-redis.upstash.io", token: "redis-secret" };
29
+
30
+ function stubFetch(status: number, result: unknown) {
31
+ return async () => new Response(JSON.stringify({ result }), { status });
32
+ }
33
+
34
+ test("restRedisReceiptStore.get returns null on a miss", async () => {
35
+ const store = restRedisReceiptStore(CONFIG, stubFetch(200, null) as unknown as typeof fetch);
36
+ expect(await store.get("key-1")).toBeNull();
37
+ });
38
+
39
+ test("restRedisReceiptStore.get parses the stored record", async () => {
40
+ const record: ReceiptStoreRecord = { receipt: RECEIPT, bodyHash: "abc123" };
41
+ const store = restRedisReceiptStore(
42
+ CONFIG,
43
+ stubFetch(200, JSON.stringify(record)) as unknown as typeof fetch,
44
+ );
45
+ const got = await store.get("key-1");
46
+ expect(got).toEqual(record);
47
+ });
48
+
49
+ test("restRedisReceiptStore.get uses the configured key prefix", async () => {
50
+ let capturedBody = "";
51
+ const fetchSpy = (async (_url: unknown, init?: { body?: string }) => {
52
+ capturedBody = init?.body ?? "";
53
+ return new Response(JSON.stringify({ result: null }), { status: 200 });
54
+ }) as unknown as typeof fetch;
55
+ const store = restRedisReceiptStore({ ...CONFIG, prefix: "custom-prefix" }, fetchSpy);
56
+ await store.get("key-9");
57
+ expect(capturedBody).toBe(JSON.stringify(["GET", "custom-prefix:key-9"]));
58
+ });
59
+
60
+ test("restRedisReceiptStore.put issues SET key JSON NX EX ttl", async () => {
61
+ let capturedBody = "";
62
+ const fetchSpy = (async (_url: unknown, init?: { body?: string }) => {
63
+ capturedBody = init?.body ?? "";
64
+ return new Response(JSON.stringify({ result: "OK" }), { status: 200 });
65
+ }) as unknown as typeof fetch;
66
+ const store = restRedisReceiptStore(CONFIG, fetchSpy);
67
+ await store.put("key-1", "hash-1", RECEIPT, 86400);
68
+ const command = JSON.parse(capturedBody) as string[];
69
+ expect(command[0]).toBe("SET");
70
+ expect(command[1]).toBe("gogol-agent-idem:key-1");
71
+ const record = JSON.parse(command[2]!) as ReceiptStoreRecord;
72
+ expect(record.bodyHash).toBe("hash-1");
73
+ expect(record.receipt.receiptId).toBe(RECEIPT.receiptId);
74
+ expect(command.slice(3)).toEqual(["NX", "EX", "86400"]);
75
+ });
76
+
77
+ test("restRedisReceiptStore throws on transport errors", async () => {
78
+ const store = restRedisReceiptStore(CONFIG, stubFetch(500, null) as unknown as typeof fetch);
79
+ await expect(() => store.get("key-1")).rejects.toThrow();
80
+ await expect(() => store.put("key-1", "h", RECEIPT, 60)).rejects.toThrow();
81
+ });
@@ -3,6 +3,7 @@ import { defineConfig } from "vitest/config";
3
3
  export default defineConfig({
4
4
  test: {
5
5
  environment: "node",
6
+ testTimeout: 30_000,
6
7
  include: ["src/**/*.test.ts"],
7
8
  coverage: {
8
9
  provider: "v8",
@@ -0,0 +1,227 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ Desired-state composition types for RFC-1038. Defines the declarative target
5
+ (DesiredState), the runtime actual state (ActualState, replacing KernelRegistry),
6
+ component/command/pipeline declarations, and the module export shape that
7
+ replaces KernelModule.register().
8
+ </purpose>
9
+ <non-goals>
10
+ <item>Does not implement reconciliation logic — see reconciler.ts.</item>
11
+ <item>Does not implement overlay resolution — see overlay.ts.</item>
12
+ <item>Does not define Zod schemas — see component/schemas.ts.</item>
13
+ </non-goals>
14
+ </MODULE_CONTRACT>
15
+ <CHANGE_SUMMARY>
16
+ <item>RFC-1038: initial implementation — desired-state composition types replacing ComponentManifestV1, KernelModule, KernelRegistry.</item>
17
+ </CHANGE_SUMMARY>
18
+ */
19
+
20
+ import type { Sha256Digest } from "../fingerprint/primitives.ts";
21
+ import type { ComponentScope, ScopeContext, ComponentDeclaration } from "../component/contracts.ts";
22
+ import type {
23
+ KernelFlagSpec,
24
+ GeneratedArtifactSpec,
25
+ KernelPipelineStep,
26
+ KernelCommandMetadata,
27
+ KernelCommandInput,
28
+ KernelRuntimeContext,
29
+ KernelCommandResult,
30
+ ModuleFiberState,
31
+ } from "./types.ts";
32
+
33
+ /**
34
+ * Unified component type — replaces ComponentManifestV1.
35
+ * Re-exported from contracts.ts for convenience.
36
+ */
37
+ export type { ComponentDeclaration };
38
+
39
+ export interface DesiredState {
40
+ /** Stable component declarations keyed by componentId. Map for O(1) lookup. */
41
+ components: Map<string, ComponentDeclaration>;
42
+ /** Capability contracts that must be satisfied. */
43
+ requiredCapabilities: string[];
44
+ /** Available artifacts for resolution. */
45
+ availableArtifacts: ReadonlyMap<string, Sha256Digest>;
46
+ /** Admitted grants for resolution. */
47
+ admittedGrants: ReadonlyArray<{ scope: string; resource: string }>;
48
+ /** Profile ID for resolution. */
49
+ profileId: string;
50
+ }
51
+
52
+ export interface ReconciliationDelta {
53
+ /** Components to activate (present in desired, absent in actual). */
54
+ toActivate: ComponentDeclaration[];
55
+ /** Components to deactivate (absent in desired, present in actual). */
56
+ toDeactivate: string[];
57
+ /** Components to reconfigure (present in both, but config changed). */
58
+ toReconfigure: Array<{
59
+ id: string;
60
+ oldConfig: Record<string, unknown>;
61
+ newConfig: Record<string, unknown>;
62
+ }>;
63
+ /** Components unchanged (present in both, config identical). */
64
+ unchanged: string[];
65
+ /** Missing dependencies — required capabilities with no provider. */
66
+ missingDependencies: Array<{ capability: string; requiredBy: string }>;
67
+ }
68
+
69
+ export interface ReconciliationResult {
70
+ delta: ReconciliationDelta;
71
+ applied: boolean;
72
+ /** Components that failed to activate. */
73
+ failures: Array<{ id: string; reason: string }>;
74
+ /** Time taken to reconcile, in milliseconds. */
75
+ durationMs: number;
76
+ }
77
+
78
+ /**
79
+ * Command declaration — replaces KernelCommandDefinition for registration.
80
+ * Carries ALL metadata fields from KernelCommandDefinition plus the execute function.
81
+ * Type safety is preserved: execute receives typed KernelCommandInput and KernelRuntimeContext.
82
+ */
83
+ export interface CommandDeclaration extends KernelCommandMetadata {
84
+ /** Command name — e.g. "sternsystem.validate". */
85
+ name: string;
86
+ /** RFC-0260: declared flag schema. */
87
+ flags?: Record<string, KernelFlagSpec>;
88
+ /** RFC-0266: workspace-root-relative path globs this command reads. */
89
+ reads?: string[];
90
+ /** RFC-0266: workspace-root-relative path globs this command writes. */
91
+ writes?: string[];
92
+ /** RFC-0637: paths relative to module src/ for cache hashing. */
93
+ modulePaths?: string[];
94
+ /** RFC-0687: command names whose outputs this validator checks. */
95
+ validatesOutputs?: string[];
96
+ /** RFC-0960: repo-relative path to the implementing source file. */
97
+ modulePath?: string;
98
+ /** RFC-0960: declared generated artifacts. */
99
+ generates?: GeneratedArtifactSpec[];
100
+ /** RFC-0963: the single contract this validator enforces. */
101
+ contract?: string;
102
+ /** RFC-0963: the rule IDs this validator enforces. */
103
+ rules?: string[];
104
+ /** The execute function — typed, same signature as KernelCommandDefinition.execute. */
105
+ execute: (
106
+ input: KernelCommandInput,
107
+ context: KernelRuntimeContext,
108
+ ) => Promise<void | KernelCommandResult> | void | KernelCommandResult;
109
+ }
110
+
111
+ /**
112
+ * Pipeline declaration — replaces registerPipeline() calls.
113
+ * Carries the pipeline name and steps with all KernelPipelineStep fields.
114
+ */
115
+ export interface PipelineDeclaration {
116
+ /** Pipeline name — e.g. "packages.check". */
117
+ name: string;
118
+ /** Pipeline steps with command references, args, timeouts, and dependsOn (RFC-0686). */
119
+ steps: KernelPipelineStep[];
120
+ }
121
+
122
+ /**
123
+ * Module export — replaces KernelModule.
124
+ * Each *.module.ts file exports this object instead of calling register().
125
+ * The reconciler reads declarations, commands, and pipelines from this export.
126
+ */
127
+ export interface ModuleExport {
128
+ /** Module name — e.g. "sternsystem". */
129
+ name: string;
130
+ /** Module version. */
131
+ version: string;
132
+ /** Component declarations for desired-state composition. */
133
+ declarations: ComponentDeclaration[];
134
+ /**
135
+ * Command declarations — replaces registerCommand() calls.
136
+ * execute functions may lazy-load implementations via `await import()`
137
+ * inside the execute body, preserving the current lazy-loading pattern.
138
+ */
139
+ commands: CommandDeclaration[];
140
+ /** Pipeline declarations — replaces registerPipeline() calls. */
141
+ pipelines: PipelineDeclaration[];
142
+ /**
143
+ * Optional conditional declaration builder.
144
+ * Replaces conditional registration logic in register() bodies.
145
+ * Receives the runtime context (env vars, profile, etc.) and returns
146
+ * additional or modified declarations/commands/pipelines.
147
+ * This runs at startup before reconciliation, not at registration time.
148
+ */
149
+ conditionalBuilder?: (context: ModuleBuildContext) => {
150
+ declarations?: ComponentDeclaration[];
151
+ commands?: CommandDeclaration[];
152
+ pipelines?: PipelineDeclaration[];
153
+ };
154
+ }
155
+
156
+ /**
157
+ * Build context passed to conditionalBuilder.
158
+ * Provides environment and profile information for conditional declarations.
159
+ */
160
+ export interface ModuleBuildContext {
161
+ /** Environment variables (process.env snapshot). */
162
+ env: Record<string, string | undefined>;
163
+ /** Profile ID from kernel config. */
164
+ profileId: string;
165
+ /** Whether this is a long-running process (dev server, watch mode). */
166
+ longRunning: boolean;
167
+ }
168
+
169
+ /**
170
+ * Actual state — replaces KernelRegistry entirely.
171
+ * The desired state is the declarative target; the actual state is what's
172
+ * currently running. The reconciler updates actual state to match desired state.
173
+ * Command execution reads from actual state — no separate registry needed.
174
+ *
175
+ * Commands and pipelines are always available — they're the module's interface,
176
+ * not dynamically activated. They're populated once at startup from ModuleExport[]
177
+ * and never change. The reconciler only manages components (capabilities and effects).
178
+ * A command may check component state at execution time if it depends on a capability.
179
+ */
180
+ export interface ActualState {
181
+ /** Active components with their runtime fiber state, keyed by componentId. */
182
+ components: ReadonlyMap<string, { declaration: ComponentDeclaration; state: ModuleFiberState }>;
183
+ /**
184
+ * All declared commands from all ModuleExport[], keyed by command name.
185
+ * Populated once at startup, never changes.
186
+ */
187
+ commands: ReadonlyMap<string, CommandDeclaration>;
188
+ /**
189
+ * All declared pipelines from all ModuleExport[], keyed by pipeline name.
190
+ * Populated once at startup, never changes.
191
+ */
192
+ pipelines: ReadonlyMap<string, KernelPipelineStep[]>;
193
+ /**
194
+ * Map from command name to module name — used for command manifest generation.
195
+ * Populated once at startup alongside commands.
196
+ */
197
+ commandModules?: ReadonlyMap<string, string>;
198
+ }
199
+
200
+ /**
201
+ * Mutable version of ActualState — used by the reconciler for component mutations.
202
+ * Commands and pipelines are still readonly (populated once at startup).
203
+ */
204
+ export interface MutableActualState {
205
+ components: Map<string, { declaration: ComponentDeclaration; state: ModuleFiberState }>;
206
+ commands: ReadonlyMap<string, CommandDeclaration>;
207
+ pipelines: ReadonlyMap<string, KernelPipelineStep[]>;
208
+ }
209
+
210
+ /**
211
+ * Overlay — layered patch on the base desired state.
212
+ * Allows scope-specific modifications without rewriting the base.
213
+ */
214
+ export interface DesiredStateOverlay {
215
+ /** Overlay ID — stable and unique within the scope. */
216
+ id: string;
217
+ /** Scope this overlay applies to (RFC-1036). */
218
+ scope: ComponentScope;
219
+ /** Scope context (e.g., missionId for per-mission overlays). */
220
+ context: ScopeContext;
221
+ /** Components to add or replace in the base desired state. */
222
+ addOrReplace: Map<string, ComponentDeclaration>;
223
+ /** Component IDs to remove from the base desired state. */
224
+ remove: string[];
225
+ /** Priority — higher priority overlays override lower ones. */
226
+ priority: number;
227
+ }