@warpgogol/werkstatt-shared 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/package.json +352 -0
  2. package/src/checks/index.ts +24 -0
  3. package/src/checks/lib/astro-site-url.ts +30 -0
  4. package/src/checks/lib/i18n.ts +30 -0
  5. package/src/checks/result-helpers.ts +102 -0
  6. package/src/checks/suppressions-config.ts +195 -0
  7. package/src/index.ts +14 -0
  8. package/src/integration/README.md +38 -0
  9. package/src/integration/adapters.ts +143 -0
  10. package/src/integration/crm-buffer.ts +491 -0
  11. package/src/integration/dispatch.ts +106 -0
  12. package/src/integration/funnel.ts +379 -0
  13. package/src/integration/index.ts +56 -0
  14. package/src/integration/lifecycle.ts +155 -0
  15. package/src/integration/orchestration.ts +439 -0
  16. package/src/integration/port-barrel.ts +124 -0
  17. package/src/integration/port.ts +143 -0
  18. package/src/integration/qstash.ts +134 -0
  19. package/src/integration/sharding.ts +133 -0
  20. package/src/integration/tests/deliver-event.test.ts +52 -0
  21. package/src/integration/tests/dispatch.test.ts +88 -0
  22. package/src/integration/tests/funnel-bridge.test.ts +46 -0
  23. package/src/integration/tests/hub-runtime.test.ts +128 -0
  24. package/src/integration/tests/lifecycle.test.ts +69 -0
  25. package/src/integration/tests/qstash.test.ts +83 -0
  26. package/src/integration/tests/sharding.test.ts +64 -0
  27. package/src/integration/vitest.config.ts +8 -0
  28. package/src/integration-adapter-supabase-crm/adapter.ts +437 -0
  29. package/src/integration-adapter-supabase-crm/client.ts +605 -0
  30. package/src/integration-adapter-supabase-crm/index.ts +28 -0
  31. package/src/integration-adapter-supabase-crm/pipedrive-sync-target.ts +482 -0
  32. package/src/integration-adapter-supabase-crm/supabase-rest.ts +89 -0
  33. package/src/integration-adapter-supabase-crm/tenant-registry.ts +334 -0
  34. package/src/integration-adapter-supabase-crm/tests/change-balance.pbt.test.ts +83 -0
  35. package/src/integration-adapter-supabase-crm/tests/funnel-persistence.test.ts +409 -0
  36. package/src/integration-adapter-supabase-crm/tests/lifecycle-sync.test.ts +288 -0
  37. package/src/integration-adapter-supabase-crm/tests/stage-map.test.ts +80 -0
  38. package/src/integration-adapter-supabase-crm/vitest.config.ts +8 -0
  39. package/src/integration-adapter-supabase-crm/worker.ts +223 -0
  40. package/src/observability/conventions.ts +93 -0
  41. package/src/observability/env-resolver.ts +57 -0
  42. package/src/observability/index.ts +57 -0
  43. package/src/observability/metric-registry.ts +184 -0
  44. package/src/observability/otlp-converter.ts +125 -0
  45. package/src/observability/otlp-json.ts +135 -0
  46. package/src/observability/otlp-transport.ts +68 -0
  47. package/src/observability/pusher.ts +142 -0
  48. package/src/observability/redact.ts +27 -0
  49. package/src/observability/tests/conventions.test.ts +100 -0
  50. package/src/observability/tests/metric-registry.test.ts +117 -0
  51. package/src/observability/tests/otlp-converter.pbt.test.ts +77 -0
  52. package/src/observability/tests/otlp-converter.test.ts +157 -0
  53. package/src/observability/tests/otlp-json.test.ts +120 -0
  54. package/src/observability/tests/pusher.test.ts +75 -0
  55. package/src/observability/tests/redact.pbt.test.ts +71 -0
  56. package/src/observability/tests/redact.test.ts +37 -0
  57. package/src/observability/typed-refs.ts +137 -0
  58. package/src/observability/vitest.config.ts +8 -0
  59. package/src/ontology/analytics/matomo-binding.yaml +172 -0
  60. package/src/ontology/analytics/matomo-fleet.registry.yaml +26 -0
  61. package/src/ontology/analytics/messkanon.yaml +151 -0
  62. package/src/ontology/archetype-registry.ts +61 -0
  63. package/src/ontology/archetypes/components/brand-label.yaml +19 -0
  64. package/src/ontology/archetypes/components/copyright.yaml +19 -0
  65. package/src/ontology/archetypes/components/currency-aware-price-display.yaml +19 -0
  66. package/src/ontology/archetypes/components/currency-selector.yaml +19 -0
  67. package/src/ontology/archetypes/components/footer-promo.yaml +19 -0
  68. package/src/ontology/archetypes/components/lang-switcher.yaml +19 -0
  69. package/src/ontology/archetypes/components/layout.yaml +19 -0
  70. package/src/ontology/archetypes/components/live-photo.yaml +20 -0
  71. package/src/ontology/archetypes/components/material-credit.yaml +20 -0
  72. package/src/ontology/archetypes/components/media.yaml +21 -0
  73. package/src/ontology/archetypes/components/nachweis-card.yaml +34 -0
  74. package/src/ontology/archetypes/components/nachweis-detail.yaml +43 -0
  75. package/src/ontology/archetypes/components/nachweis-list.yaml +37 -0
  76. package/src/ontology/archetypes/components/nachweis-verify.yaml +31 -0
  77. package/src/ontology/archetypes/components/not-found.yaml +22 -0
  78. package/src/ontology/archetypes/components/offer-capacity.yaml +21 -0
  79. package/src/ontology/archetypes/components/passport-header.yaml +19 -0
  80. package/src/ontology/archetypes/components/passport-provenance.yaml +20 -0
  81. package/src/ontology/archetypes/components/passport-score-grid.yaml +20 -0
  82. package/src/ontology/archetypes/components/passport-star-map.yaml +20 -0
  83. package/src/ontology/archetypes/components/person-profile.yaml +20 -0
  84. package/src/ontology/archetypes/components/pulsar.yaml +20 -0
  85. package/src/ontology/archetypes/components/responsive-image.yaml +19 -0
  86. package/src/ontology/archetypes/components/scroll-to-top.yaml +22 -0
  87. package/src/ontology/archetypes/components/social-meta.yaml +20 -0
  88. package/src/ontology/archetypes/components/structured-data.yaml +19 -0
  89. package/src/ontology/archetypes/index.json +1003 -0
  90. package/src/ontology/archetypes/index.yaml +821 -0
  91. package/src/ontology/archetypes/sections/approach.yaml +23 -0
  92. package/src/ontology/archetypes/sections/article-list.yaml +30 -0
  93. package/src/ontology/archetypes/sections/audience-cards.yaml +30 -0
  94. package/src/ontology/archetypes/sections/breadcrumbs.yaml +21 -0
  95. package/src/ontology/archetypes/sections/chat-widget.yaml +37 -0
  96. package/src/ontology/archetypes/sections/comparison-cards.yaml +31 -0
  97. package/src/ontology/archetypes/sections/controlled-responsibility-block.yaml +34 -0
  98. package/src/ontology/archetypes/sections/credits.yaml +29 -0
  99. package/src/ontology/archetypes/sections/donation-card.yaml +53 -0
  100. package/src/ontology/archetypes/sections/donation-use.yaml +23 -0
  101. package/src/ontology/archetypes/sections/dynamic-status-block.yaml +35 -0
  102. package/src/ontology/archetypes/sections/faq-list.yaml +26 -0
  103. package/src/ontology/archetypes/sections/final-cta.yaml +53 -0
  104. package/src/ontology/archetypes/sections/hero-decision-card.yaml +65 -0
  105. package/src/ontology/archetypes/sections/hero.yaml +50 -0
  106. package/src/ontology/archetypes/sections/impact.yaml +23 -0
  107. package/src/ontology/archetypes/sections/markdown.yaml +43 -0
  108. package/src/ontology/archetypes/sections/mountain-journey.yaml +43 -0
  109. package/src/ontology/archetypes/sections/navigation.yaml +20 -0
  110. package/src/ontology/archetypes/sections/notausgang-block.yaml +41 -0
  111. package/src/ontology/archetypes/sections/open-source-registry.yaml +26 -0
  112. package/src/ontology/archetypes/sections/ownership-block.yaml +57 -0
  113. package/src/ontology/archetypes/sections/people.yaml +48 -0
  114. package/src/ontology/archetypes/sections/price-card.yaml +50 -0
  115. package/src/ontology/archetypes/sections/problem.yaml +23 -0
  116. package/src/ontology/archetypes/sections/send-message.yaml +63 -0
  117. package/src/ontology/archetypes/sections/service-metadata-block.yaml +40 -0
  118. package/src/ontology/archetypes/sections/social-proof.yaml +27 -0
  119. package/src/ontology/archetypes/sections/transparency.yaml +32 -0
  120. package/src/ontology/archetypes/sections/trust-strip.yaml +42 -0
  121. package/src/ontology/archetypes/sections/video-section.yaml +27 -0
  122. package/src/ontology/archetypes/sections/women.yaml +29 -0
  123. package/src/ontology/biome-token-projection.ts +229 -0
  124. package/src/ontology/biomes/check-concrete-blueprint.yaml +118 -0
  125. package/src/ontology/biomes/handwerk-material-warm.yaml +135 -0
  126. package/src/ontology/biomes/nonprofit-trust.yaml +123 -0
  127. package/src/ontology/blueprints/offer.yaml +39 -0
  128. package/src/ontology/blueprints/prompts/local-market-signal.md +13 -0
  129. package/src/ontology/blueprints/prompts/website-local-narrative.md +24 -0
  130. package/src/ontology/blueprints/ratgeber.yaml +62 -0
  131. package/src/ontology/blueprints/website-local.yaml +309 -0
  132. package/src/ontology/blueprints/website-service.yaml +84 -0
  133. package/src/ontology/capabilities/lead.submit.yaml +44 -0
  134. package/src/ontology/cosmic/index.ts +48 -0
  135. package/src/ontology/cosmic/moon-catalog.ts +173 -0
  136. package/src/ontology/cosmic/planet-catalog.ts +82 -0
  137. package/src/ontology/cosmic/star-catalog.ts +337 -0
  138. package/src/ontology/enums.ts +159 -0
  139. package/src/ontology/external-surfaces/index.ts +158 -0
  140. package/src/ontology/external-surfaces/jsonld-types.yaml +135 -0
  141. package/src/ontology/external-surfaces/sitemap-shape.yaml +6 -0
  142. package/src/ontology/external-surfaces/url-schema.yaml +95 -0
  143. package/src/ontology/growth/events/contact-email-click.yaml +21 -0
  144. package/src/ontology/growth/events/contact-form-submit.yaml +25 -0
  145. package/src/ontology/growth/events/contact-phone-click.yaml +21 -0
  146. package/src/ontology/growth/events/contact-route-click.yaml +21 -0
  147. package/src/ontology/growth/events/contact-submit.yaml +28 -0
  148. package/src/ontology/growth/events/contact-whatsapp-click.yaml +21 -0
  149. package/src/ontology/growth/events/cta-click.yaml +30 -0
  150. package/src/ontology/growth/events/donation-confirmed.yaml +32 -0
  151. package/src/ontology/growth/events/donation-form-start.yaml +21 -0
  152. package/src/ontology/growth/events/donation-form-submit.yaml +29 -0
  153. package/src/ontology/growth/events/donation-intent.yaml +29 -0
  154. package/src/ontology/growth/events/form-error.yaml +27 -0
  155. package/src/ontology/growth/events/form-start.yaml +21 -0
  156. package/src/ontology/growth/events/form-submit.yaml +21 -0
  157. package/src/ontology/growth/events/outbound-click.yaml +25 -0
  158. package/src/ontology/growth/events/page-view.yaml +24 -0
  159. package/src/ontology/growth/events/passport-view.yaml +28 -0
  160. package/src/ontology/growth/events/star-map-navigate.yaml +30 -0
  161. package/src/ontology/index.ts +165 -0
  162. package/src/ontology/manifest.ts +344 -0
  163. package/src/ontology/operations/index.ts +1 -0
  164. package/src/ontology/schemas/biome.ts +303 -0
  165. package/src/ontology/schemas/capability.ts +104 -0
  166. package/src/ontology/schemas/constellation.ts +114 -0
  167. package/src/ontology/schemas/dns-records.ts +53 -0
  168. package/src/ontology/schemas/index.ts +95 -0
  169. package/src/ontology/schemas/manifest-resolver.ts +123 -0
  170. package/src/ontology/schemas/page-entry.ts +213 -0
  171. package/src/ontology/schemas/section-archetype.ts +109 -0
  172. package/src/ontology/schemas/site-family.ts +98 -0
  173. package/src/ontology/schemas/system/growth.ts +80 -0
  174. package/src/ontology/schemas/system/integrations.ts +143 -0
  175. package/src/ontology/schemas/system/manifest.ts +492 -0
  176. package/src/ontology/schemas/system/page-output.ts +99 -0
  177. package/src/ontology/schemas/system/release.ts +58 -0
  178. package/src/ontology/schemas/system/text.ts +58 -0
  179. package/src/ontology/schemas/system.ts +53 -0
  180. package/src/ontology/shared-section-props/body-fragments.ts +182 -0
  181. package/src/ontology/shared-section-props/catalog.ts +195 -0
  182. package/src/ontology/shared-section-props/common.ts +178 -0
  183. package/src/ontology/shared-section-props/index.ts +34 -0
  184. package/src/ontology/shared-section-props/visual-header.ts +163 -0
  185. package/src/ontology/site-families/charity-donation-trust/cultural-rules.yaml +6 -0
  186. package/src/ontology/site-families/charity-donation-trust/family.yaml +44 -0
  187. package/src/ontology/site-families/charity-donation-trust/linguistic-rules.yaml +6 -0
  188. package/src/ontology/site-families/check-quality-operator/cultural-rules.yaml +6 -0
  189. package/src/ontology/site-families/check-quality-operator/family.yaml +40 -0
  190. package/src/ontology/site-families/check-quality-operator/linguistic-rules.yaml +6 -0
  191. package/src/ontology/site-families/handwerk-trust-engineering/cultural-rules.yaml +6 -0
  192. package/src/ontology/site-families/handwerk-trust-engineering/family.yaml +53 -0
  193. package/src/ontology/site-families/handwerk-trust-engineering/linguistic-rules.yaml +6 -0
  194. package/src/ontology/tests/catalogs.pbt.test.ts +89 -0
  195. package/src/ontology/tests/enums.test.ts +203 -0
  196. package/src/ontology/tests/sternsystem-owner.test.ts +63 -0
  197. package/src/ontology/vitest.config.ts +8 -0
  198. package/src/passport/dht-sign.test.ts +99 -0
  199. package/src/passport/dht-sign.ts +73 -0
  200. package/src/passport/identity-sign.test.ts +134 -0
  201. package/src/passport/identity-sign.ts +85 -0
  202. package/src/passport/index.ts +53 -0
  203. package/src/passport/key-rotate.ts +133 -0
  204. package/src/passport/schema.ts +198 -0
  205. package/src/passport/sign.ts +225 -0
  206. package/src/passport/tests/schema.pbt.test.ts +93 -0
  207. package/src/passport/tests/schema.test.ts +222 -0
  208. package/src/passport/vitest.config.ts +8 -0
  209. package/src/share/agent/api-catalog.ts +77 -0
  210. package/src/share/agent/capability.ts +68 -0
  211. package/src/share/agent/dns-aid.test.ts +74 -0
  212. package/src/share/agent/dns-aid.ts +53 -0
  213. package/src/share/agent/fleet-catalog.ts +149 -0
  214. package/src/share/agent/index.ts +29 -0
  215. package/src/share/agent/knowledge.ts +96 -0
  216. package/src/share/agent/manifest.ts +126 -0
  217. package/src/share/agent/mcp-card.ts +63 -0
  218. package/src/share/agent/omit-empty.ts +77 -0
  219. package/src/share/agent/openapi.ts +157 -0
  220. package/src/share/agent/proof.ts +61 -0
  221. package/src/share/attribution-display.ts +86 -0
  222. package/src/share/check-hints.ts +38 -0
  223. package/src/share/content/entity-id.ts +65 -0
  224. package/src/share/content/index.ts +16 -0
  225. package/src/share/content/merge.ts +86 -0
  226. package/src/share/content/resolve-field-path.ts +39 -0
  227. package/src/share/content/substitute-deep.ts +47 -0
  228. package/src/share/content-discipline/index.ts +14 -0
  229. package/src/share/content-discipline/parsers.ts +66 -0
  230. package/src/share/content-discipline/types.ts +118 -0
  231. package/src/share/content-reference.ts +333 -0
  232. package/src/share/counter-utils.ts +75 -0
  233. package/src/share/css-value-normalize.ts +48 -0
  234. package/src/share/dev-props-validator.ts +131 -0
  235. package/src/share/entitlement.ts +172 -0
  236. package/src/share/env.d.ts +73 -0
  237. package/src/share/feature-policy.ts +367 -0
  238. package/src/share/formula-eval.ts +364 -0
  239. package/src/share/fs/index.ts +96 -0
  240. package/src/share/i18n/localization.ts +57 -0
  241. package/src/share/image-provider.ts +314 -0
  242. package/src/share/index.ts +86 -0
  243. package/src/share/knowledge/claim.ts +129 -0
  244. package/src/share/knowledge/derivation.ts +55 -0
  245. package/src/share/knowledge/freshness.ts +127 -0
  246. package/src/share/knowledge/index.ts +23 -0
  247. package/src/share/knowledge/ledger.ts +222 -0
  248. package/src/share/knowledge/plan.ts +122 -0
  249. package/src/share/knowledge/source.ts +170 -0
  250. package/src/share/legal/translation-policy.ts +133 -0
  251. package/src/share/material-credits.ts +181 -0
  252. package/src/share/middleware/language-redirect.ts +49 -0
  253. package/src/share/offer-capacity.ts +149 -0
  254. package/src/share/onboarding-yaml/index.ts +162 -0
  255. package/src/share/page.ts +351 -0
  256. package/src/share/redirects.test.ts +62 -0
  257. package/src/share/redirects.ts +54 -0
  258. package/src/share/rfc0042-utils.ts +95 -0
  259. package/src/share/runtime-context.ts +70 -0
  260. package/src/share/schemas/claim-records.ts +69 -0
  261. package/src/share/schemas/claims.ts +150 -0
  262. package/src/share/schemas/effects.ts +212 -0
  263. package/src/share/schemas/features.ts +147 -0
  264. package/src/share/schemas/horizontal-align.ts +22 -0
  265. package/src/share/schemas/icon-color.ts +27 -0
  266. package/src/share/schemas/index.ts +43 -0
  267. package/src/share/schemas/live-photo.ts +53 -0
  268. package/src/share/schemas/material-credit.ts +292 -0
  269. package/src/share/schemas/media.ts +220 -0
  270. package/src/share/schemas/navigation.ts +74 -0
  271. package/src/share/schemas/page-base.ts +33 -0
  272. package/src/share/schemas/participant.ts +247 -0
  273. package/src/share/schemas/person.ts +24 -0
  274. package/src/share/schemas/print.ts +93 -0
  275. package/src/share/schemas/section-background.ts +106 -0
  276. package/src/share/schemas/section-body.ts +138 -0
  277. package/src/share/schemas/section-cards.ts +37 -0
  278. package/src/share/schemas/section-cta.ts +74 -0
  279. package/src/share/schemas/section-header.ts +77 -0
  280. package/src/share/schemas/section-image.ts +77 -0
  281. package/src/share/schemas/section-motion.ts +52 -0
  282. package/src/share/schemas/section-shell.ts +63 -0
  283. package/src/share/schemas/section-stats.ts +37 -0
  284. package/src/share/schemas/site-background.ts +78 -0
  285. package/src/share/schemas/standard-list-item.ts +38 -0
  286. package/src/share/scripts/external-links.ts +45 -0
  287. package/src/share/scripts/gsap-counter.ts +168 -0
  288. package/src/share/scripts/gsap-mountain-journey.ts +236 -0
  289. package/src/share/scripts/gsap-parallax.ts +50 -0
  290. package/src/share/scripts/gsap-reveal.ts +65 -0
  291. package/src/share/scripts/gsap-stagger.ts +54 -0
  292. package/src/share/scripts/index.ts +25 -0
  293. package/src/share/scripts/inline-number-animation.ts +120 -0
  294. package/src/share/scripts/lenis.ts +109 -0
  295. package/src/share/scripts/live-photos.ts +250 -0
  296. package/src/share/scripts/lordicon.ts +94 -0
  297. package/src/share/scripts/orchestrator.ts +138 -0
  298. package/src/share/scripts/scheduler.ts +53 -0
  299. package/src/share/scripts/video-player.ts +116 -0
  300. package/src/share/semantic/ai.ts +140 -0
  301. package/src/share/semantic/block-extraction.ts +52 -0
  302. package/src/share/semantic/block-extractors/index.ts +502 -0
  303. package/src/share/semantic/breadcrumbs.ts +120 -0
  304. package/src/share/semantic/build-page.ts +309 -0
  305. package/src/share/semantic/business-projection.ts +278 -0
  306. package/src/share/semantic/derived-prices-loader.ts +36 -0
  307. package/src/share/semantic/extract.ts +118 -0
  308. package/src/share/semantic/feed.ts +124 -0
  309. package/src/share/semantic/ids.ts +76 -0
  310. package/src/share/semantic/image-sitemap.ts +153 -0
  311. package/src/share/semantic/index.ts +36 -0
  312. package/src/share/semantic/jsonld/article.ts +47 -0
  313. package/src/share/semantic/jsonld/breadcrumb.ts +47 -0
  314. package/src/share/semantic/jsonld/collection-list.ts +30 -0
  315. package/src/share/semantic/jsonld/context.ts +46 -0
  316. package/src/share/semantic/jsonld/faq.ts +49 -0
  317. package/src/share/semantic/jsonld/initiative.ts +53 -0
  318. package/src/share/semantic/jsonld/organization.ts +101 -0
  319. package/src/share/semantic/jsonld/person.ts +71 -0
  320. package/src/share/semantic/jsonld/service.ts +80 -0
  321. package/src/share/semantic/jsonld/shared.ts +31 -0
  322. package/src/share/semantic/jsonld/types.ts +18 -0
  323. package/src/share/semantic/jsonld/webpage.ts +98 -0
  324. package/src/share/semantic/jsonld/website.ts +27 -0
  325. package/src/share/semantic/jsonld.ts +75 -0
  326. package/src/share/semantic/llms-policy.ts +74 -0
  327. package/src/share/semantic/llms.ts +394 -0
  328. package/src/share/semantic/markdown-hygiene.ts +68 -0
  329. package/src/share/semantic/markdown-twin-provenance.ts +242 -0
  330. package/src/share/semantic/models.ts +402 -0
  331. package/src/share/semantic/organization-profile.ts +160 -0
  332. package/src/share/semantic/output-projection.ts +131 -0
  333. package/src/share/semantic/page-builders/markdown-page.ts +84 -0
  334. package/src/share/semantic/page-markdown.ts +234 -0
  335. package/src/share/semantic/page-utils.ts +125 -0
  336. package/src/share/semantic/price-marker-resolver.ts +92 -0
  337. package/src/share/semantic/robots.ts +127 -0
  338. package/src/share/semantic/update-stamp.ts +136 -0
  339. package/src/share/shared-context.ts +177 -0
  340. package/src/share/string-utils.ts +19 -0
  341. package/src/share/tests/api-catalog.test.ts +97 -0
  342. package/src/share/tests/breadcrumbs.test.ts +126 -0
  343. package/src/share/tests/build-page-price-markers.test.ts +160 -0
  344. package/src/share/tests/capability.test.ts +107 -0
  345. package/src/share/tests/claim.test.ts +90 -0
  346. package/src/share/tests/content-ref-index.test.ts +328 -0
  347. package/src/share/tests/create-dev-props-validator.test.ts +38 -0
  348. package/src/share/tests/derivation.test.ts +39 -0
  349. package/src/share/tests/dev-props-validator.test.ts +88 -0
  350. package/src/share/tests/fleet-catalog.test.ts +134 -0
  351. package/src/share/tests/formula-eval.test.ts +619 -0
  352. package/src/share/tests/freshness.test.ts +60 -0
  353. package/src/share/tests/hero-section-numbering-parity.test.ts +51 -0
  354. package/src/share/tests/image-sitemap.test.ts +101 -0
  355. package/src/share/tests/jsonld-service.test.ts +282 -0
  356. package/src/share/tests/knowledge.test.ts +86 -0
  357. package/src/share/tests/ledger.test.ts +125 -0
  358. package/src/share/tests/llms-0789.test.ts +63 -0
  359. package/src/share/tests/manifest.test.ts +100 -0
  360. package/src/share/tests/markdown-twin-provenance.test.ts +108 -0
  361. package/src/share/tests/mcp-card.test.ts +57 -0
  362. package/src/share/tests/onboarding-yaml.test.ts +111 -0
  363. package/src/share/tests/ontology-role-by-cosmic-name.test.ts +28 -0
  364. package/src/share/tests/openapi.test.ts +116 -0
  365. package/src/share/tests/organization-jsonld.test.ts +74 -0
  366. package/src/share/tests/output-projection.test.ts +61 -0
  367. package/src/share/tests/plan.test.ts +97 -0
  368. package/src/share/tests/price-marker-resolver.test.ts +141 -0
  369. package/src/share/tests/proof.test.ts +72 -0
  370. package/src/share/tests/resolve-field-path.test.ts +52 -0
  371. package/src/share/tests/source.test.ts +81 -0
  372. package/src/share/tests/substitute-deep.test.ts +65 -0
  373. package/src/share/tests/text-normalize.pbt.test.ts +143 -0
  374. package/src/share/tests/text-normalize.test.ts +285 -0
  375. package/src/share/tests/twin-path.test.ts +43 -0
  376. package/src/share/text-normalize.ts +548 -0
  377. package/src/share/text-position.ts +19 -0
  378. package/src/share/types/hls-js-light.d.ts +16 -0
  379. package/src/share/visibility.ts +167 -0
  380. package/src/share/vitest.config.ts +8 -0
  381. package/src/share/wrap-inline-numbers.ts +139 -0
  382. package/src/surface/blueprint-schema.ts +314 -0
  383. package/src/surface/blueprint-types.ts +256 -0
  384. package/src/surface/blueprint.ts +300 -0
  385. package/src/surface/breaker.ts +57 -0
  386. package/src/surface/decision-composer.ts +156 -0
  387. package/src/surface/eligibility.ts +372 -0
  388. package/src/surface/evidence-records.ts +97 -0
  389. package/src/surface/fleet.ts +60 -0
  390. package/src/surface/geo.ts +170 -0
  391. package/src/surface/governance.ts +146 -0
  392. package/src/surface/index.ts +216 -0
  393. package/src/surface/io/index.ts +18 -0
  394. package/src/surface/io/surface-module-context-io.ts +60 -0
  395. package/src/surface/io/visibility-outcomes-io.ts +46 -0
  396. package/src/surface/module-context.ts +120 -0
  397. package/src/surface/substance.ts +161 -0
  398. package/src/surface/tests/eligibility.pbt.test.ts +137 -0
  399. package/src/surface/tests/eligibility.test.ts +302 -0
  400. package/src/surface/types.ts +289 -0
  401. package/src/surface/visibility.ts +57 -0
  402. package/src/surface/vitest.config.ts +8 -0
  403. package/tsconfig.json +17 -0
@@ -0,0 +1,80 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Unit tests for resolvePipedriveStageUpdate: verifies every BUFFER_DEAL_STAGES entry
4
+ produces the correct Pipedrive payload fragment, and that won/lost use the `status` field
5
+ rather than a stage_id. Acts as regression guard against catalog/STAGE_MAP desync.</purpose>
6
+ <responsibilities>
7
+ <item>Every active stage maps to { stage_id: number }.</item>
8
+ <item>won maps to { status: "won" } — no stage_id.</item>
9
+ <item>lost maps to { status: "lost" } — no stage_id.</item>
10
+ <item>No stage falls back to { stage_id: 1 } (new) silently.</item>
11
+ </responsibilities>
12
+ <non-goals><item>No network — pure function tests.</item></non-goals>
13
+ </MODULE_CONTRACT>
14
+ <CHANGE_SUMMARY><item>Initial regression guard for won/lost Pipedrive stage mapping fix.</item></CHANGE_SUMMARY>
15
+ */
16
+
17
+ import { test, expect } from "vitest";
18
+ import { BUFFER_DEAL_STAGES } from "@warpgogol/werkstatt-shared/integration/crm-buffer";
19
+ import type { BufferDealStage } from "@warpgogol/werkstatt-shared/integration/crm-buffer";
20
+ import { STAGE_MAP, resolvePipedriveStageUpdate } from "../pipedrive-sync-target.ts";
21
+
22
+ // ---------------------------------------------------------------------------
23
+ // Exhaustiveness: every BUFFER_DEAL_STAGES entry must be a key of STAGE_MAP
24
+ // ---------------------------------------------------------------------------
25
+
26
+ test("STAGE_MAP covers every BUFFER_DEAL_STAGES entry (exhaustiveness guard)", () => {
27
+ for (const stage of BUFFER_DEAL_STAGES) {
28
+ expect(Object.prototype.hasOwnProperty.call(STAGE_MAP, stage)).toBeTruthy();
29
+ }
30
+ });
31
+
32
+ // ---------------------------------------------------------------------------
33
+ // won / lost must use Pipedrive status, never stage_id
34
+ // ---------------------------------------------------------------------------
35
+
36
+ test("won resolves to { status: 'won' } (not a stage_id)", () => {
37
+ const result = resolvePipedriveStageUpdate("won");
38
+ expect(!("stage_id" in result)).toBeTruthy();
39
+ expect(result).toEqual({ status: "won" });
40
+ });
41
+
42
+ test("lost resolves to { status: 'lost' } (not a stage_id)", () => {
43
+ const result = resolvePipedriveStageUpdate("lost");
44
+ expect(!("stage_id" in result)).toBeTruthy();
45
+ expect(result).toEqual({ status: "lost" });
46
+ });
47
+
48
+ // ---------------------------------------------------------------------------
49
+ // Active stages must produce stage_id, not status, and never fall back to 1
50
+ // ---------------------------------------------------------------------------
51
+
52
+ const ACTIVE_STAGES: Array<{ stage: BufferDealStage; expectedId: number }> = [
53
+ { stage: "new", expectedId: 1 },
54
+ { stage: "contacted", expectedId: 2 },
55
+ { stage: "qualified", expectedId: 3 },
56
+ { stage: "proposal", expectedId: 4 },
57
+ { stage: "negotiation", expectedId: 5 },
58
+ ];
59
+
60
+ for (const { stage, expectedId } of ACTIVE_STAGES) {
61
+ test(`"${stage}" resolves to { stage_id: ${expectedId} }`, () => {
62
+ const result = resolvePipedriveStageUpdate(stage);
63
+ expect("stage_id" in result).toBeTruthy();
64
+ expect(result).toEqual({ stage_id: expectedId });
65
+ });
66
+ }
67
+
68
+ // ---------------------------------------------------------------------------
69
+ // Old typo spellings must NOT silently succeed with stage_id 1
70
+ // ---------------------------------------------------------------------------
71
+
72
+ test("closed_won (old typo) does not map to stage_id 1 (new)", () => {
73
+ const result = resolvePipedriveStageUpdate("closed_won");
74
+ // Falls back to STAGE_MAP.new = 1 since it's not in catalog.
75
+ // This test documents the fallback behavior and ensures "won" (correct) is used instead.
76
+ // The real bug was using "closed_won" as the key — this test guards the fix.
77
+ if ("stage_id" in result) {
78
+ expect(result.stage_id).toBe(1);
79
+ }
80
+ });
@@ -0,0 +1,8 @@
1
+ import { defineConfig } from "vitest/config";
2
+
3
+ export default defineConfig({
4
+ test: {
5
+ environment: "node",
6
+ include: ["src/**/*.test.ts"],
7
+ },
8
+ });
@@ -0,0 +1,223 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>RFC-0186: Shared Lagebild sync worker (multi-tenant). Reads enabled tenants from
4
+ sync_tenants registry, resolves their secret references from Worker env, and processes each
5
+ tenant's pending sync_outbox rows with isolation: per-tenant batch size, concurrency, and circuit
6
+ breaker. One Worker serves all clients; tenant lifecycle is data-driven.</purpose>
7
+ <non-goals>
8
+ <item>Do not store or transmit secret values other than to destination APIs.</item>
9
+ <item>Do not process tenants with missing secret references.</item>
10
+ <item>Do not mix tenant data (strict RLS via tenant_id).</item>
11
+ </non-goals>
12
+ </MODULE_CONTRACT>
13
+ <CHANGE_SUMMARY>
14
+ <item>RFC-0186: Refactored from single-tenant factory to multi-tenant shared worker.</item>
15
+ <item>Extracted Pipedrive sync logic behind CrmSyncTarget port — worker is now a thin orchestrator.</item>
16
+ <item>RFC-0386: Added upsert_subscription / upsert_invoice dispatch and P3/P4 stage-map pass-through.</item>
17
+ </CHANGE_SUMMARY>
18
+ */
19
+
20
+ import type { ScheduledEvent, ExecutionContext } from "@cloudflare/workers-types";
21
+ import { createSupabaseCrmBufferClient } from "./client.ts";
22
+ import type {
23
+ CrmBufferReader,
24
+ SyncOutboxRow,
25
+ } from "@warpgogol/werkstatt-shared/integration/crm-buffer";
26
+ import { createSyncTarget, type CrmSyncTarget } from "./pipedrive-sync-target.ts";
27
+ import {
28
+ type SyncTenant,
29
+ type TenantWithSecrets,
30
+ resolveTenantSecrets,
31
+ getEnabledTenants,
32
+ updateTenantHealth,
33
+ type RegistryClient,
34
+ } from "./tenant-registry.ts";
35
+ import { createMetricsPusher } from "@warpgogol/werkstatt-shared/observability";
36
+
37
+ /** RFC-0186: Shared Worker env bindings. Includes registry connection + tenant secrets namespace. */
38
+ export interface LagebildSharedWorkerEnv {
39
+ // Registry (same Supabase project as buffer)
40
+ LAGEBILD_REGISTRY_URL: string;
41
+ LAGEBILD_REGISTRY_API_KEY: string;
42
+ // Optional: override default cron group
43
+ LAGEBILD_CRON_GROUP?: string;
44
+ // RFC-0807: OTLP metrics push
45
+ WARPGOGOL_OTLP_ENDPOINT: string;
46
+ WARPGOGOL_OTLP_TOKEN: string;
47
+ // Tenant secrets are resolved dynamically via sync_tenants.secret_ref fields
48
+ // Pattern: TENANT_{SITE_NAME}_{KIND} injected by wrangler secret put
49
+ [key: string]: string | undefined;
50
+ }
51
+
52
+ /** RFC-0186: Factory returning the shared multi-tenant scheduled handler. */
53
+ export function createLagebildSharedSyncWorker() {
54
+ return {
55
+ async scheduled(
56
+ _event: ScheduledEvent,
57
+ env: LagebildSharedWorkerEnv,
58
+ _ctx: ExecutionContext,
59
+ ): Promise<void> {
60
+ const pusher = createMetricsPusher(
61
+ { serviceName: "lagebild-sync", layer: "back", environment: "production" },
62
+ { endpoint: env.WARPGOGOL_OTLP_ENDPOINT, token: env.WARPGOGOL_OTLP_TOKEN },
63
+ );
64
+
65
+ const registry: RegistryClient = {
66
+ url: env.LAGEBILD_REGISTRY_URL,
67
+ apiKey: env.LAGEBILD_REGISTRY_API_KEY,
68
+ };
69
+
70
+ const cronGroup = env.LAGEBILD_CRON_GROUP ?? "default";
71
+ let tenants: SyncTenant[];
72
+ try {
73
+ tenants = await getEnabledTenants(registry, cronGroup);
74
+ } catch (err) {
75
+ console.error("[lagebild] failed to load tenants:", (err as Error).message);
76
+ if (pusher) {
77
+ pusher.gaugeSet("warpgogol_back_up", 0, { service: "lagebild-sync" });
78
+ pusher.counterAdd("warpgogol_back_last_run_total", 1, {
79
+ service: "lagebild-sync",
80
+ status: "failure",
81
+ });
82
+ pusher.counterAdd("warpgogol_back_last_error_total", 1, { service: "lagebild-sync" });
83
+ await pusher.flush();
84
+ }
85
+ return;
86
+ }
87
+
88
+ if (tenants.length === 0) {
89
+ console.log("[lagebild] no enabled tenants");
90
+ if (pusher) {
91
+ pusher.gaugeSet("warpgogol_back_up", 1, { service: "lagebild-sync" });
92
+ pusher.counterAdd("warpgogol_back_last_run_total", 1, {
93
+ service: "lagebild-sync",
94
+ status: "success",
95
+ });
96
+ await pusher.flush();
97
+ }
98
+ return;
99
+ }
100
+
101
+ console.log(`[lagebild] processing ${tenants.length} tenants`);
102
+
103
+ let hadError = false;
104
+
105
+ for (const tenant of tenants) {
106
+ const resolved = resolveTenantSecrets(tenant, env);
107
+ if (resolved.secrets === null) {
108
+ const msg = `missing secrets: ${resolved.missing.join(", ")}`;
109
+ console.warn(`[lagebild][${tenant.site_name}] ${msg}`);
110
+ await updateTenantHealth(registry, tenant.tenant_id, {
111
+ last_seen_at: new Date().toISOString(),
112
+ last_error_at: new Date().toISOString(),
113
+ last_error: msg,
114
+ });
115
+ continue;
116
+ }
117
+
118
+ try {
119
+ await processTenant(tenant, resolved, registry);
120
+ await updateTenantHealth(registry, tenant.tenant_id, {
121
+ last_seen_at: new Date().toISOString(),
122
+ last_success_at: new Date().toISOString(),
123
+ last_error: null,
124
+ });
125
+ } catch (err) {
126
+ hadError = true;
127
+ const msg = (err as Error).message;
128
+ console.error(`[lagebild][${tenant.site_name}] tenant failed:`, msg);
129
+ await updateTenantHealth(registry, tenant.tenant_id, {
130
+ last_seen_at: new Date().toISOString(),
131
+ last_error_at: new Date().toISOString(),
132
+ last_error: msg,
133
+ });
134
+ }
135
+ }
136
+
137
+ if (pusher) {
138
+ pusher.gaugeSet("warpgogol_back_up", hadError ? 0 : 1, { service: "lagebild-sync" });
139
+ pusher.counterAdd("warpgogol_back_last_run_total", 1, {
140
+ service: "lagebild-sync",
141
+ status: hadError ? "failure" : "success",
142
+ });
143
+ if (hadError) {
144
+ pusher.counterAdd("warpgogol_back_last_error_total", 1, { service: "lagebild-sync" });
145
+ }
146
+ await pusher.flush();
147
+ }
148
+ },
149
+ };
150
+ }
151
+
152
+ /** RFC-0186: Process one tenant's outbox with per-tenant limits. */
153
+ async function processTenant(
154
+ tenant: SyncTenant,
155
+ resolved: TenantWithSecrets,
156
+ _registry: RegistryClient,
157
+ ): Promise<void> {
158
+ const secrets = resolved.secrets!; // null checked by caller
159
+
160
+ const client = createSupabaseCrmBufferClient({
161
+ url: secrets.supabase_url,
162
+ serviceKey: secrets.supabase_service_key,
163
+ tenantId: tenant.tenant_id,
164
+ });
165
+
166
+ const target = createSyncTarget(tenant.destination_vendor, {
167
+ destination_token: secrets.destination_token,
168
+ destination_domain: secrets.destination_domain,
169
+ p3StageMap: secrets.p3StageMap,
170
+ p4StageMap: secrets.p4StageMap,
171
+ });
172
+
173
+ const tasks = await client.readPendingOutbox(tenant.tenant_id, tenant.batch_size);
174
+ if (tasks.length === 0) return;
175
+
176
+ console.log(`[lagebild][${tenant.site_name}] ${tasks.length} tasks`);
177
+
178
+ let consecutiveErrors = 0;
179
+ const threshold = tenant.circuit_breaker_threshold;
180
+
181
+ // Simple semaphore for max_concurrency (1 = sequential)
182
+ for (const task of tasks) {
183
+ if (consecutiveErrors >= threshold) {
184
+ console.warn(`[lagebild][${tenant.site_name}] circuit open`);
185
+ break;
186
+ }
187
+
188
+ try {
189
+ await processTask(task, client, target);
190
+ consecutiveErrors = 0;
191
+ await client.updateOutboxStatus(task.id, "done");
192
+ } catch (err) {
193
+ consecutiveErrors++;
194
+ const msg = (err as Error).message;
195
+ console.error(`[lagebild][${tenant.site_name}] task ${task.id} failed:`, msg);
196
+ await client.updateOutboxStatus(task.id, "failed");
197
+ }
198
+ }
199
+ }
200
+
201
+ /** Route task to the sync target by operation. */
202
+ async function processTask(
203
+ task: SyncOutboxRow,
204
+ buffer: CrmBufferReader,
205
+ target: CrmSyncTarget,
206
+ ): Promise<void> {
207
+ switch (task.op) {
208
+ case "upsert_contact":
209
+ return target.syncContact(task, buffer);
210
+ case "upsert_organization":
211
+ return target.syncOrganization(task, buffer);
212
+ case "upsert_deal":
213
+ return target.syncDeal(task, buffer);
214
+ case "update_deal_stage":
215
+ return target.syncDealStage(task, buffer);
216
+ case "upsert_subscription":
217
+ return target.syncSubscription(task, buffer);
218
+ case "upsert_invoice":
219
+ return target.syncInvoice(task, buffer);
220
+ default:
221
+ throw new Error(`unknown op: ${(task as { op: string }).op}`);
222
+ }
223
+ }
@@ -0,0 +1,93 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Closed telemetry vocabularies and OTLP resource-attribute builder for the Warpgogol observability port (RFC-0337).</purpose>
4
+ <non-goals>
5
+ <item>Do not import node: modules — must be Workers-compatible.</item>
6
+ <item>Do not define metric specs — those live in metric-registry.ts.</item>
7
+ </non-goals>
8
+ </MODULE_CONTRACT>
9
+ <CHANGE_SUMMARY>
10
+ <item>RFC-0337: initial implementation.</item>
11
+ </CHANGE_SUMMARY>
12
+ */
13
+
14
+ export type WarpgogolLayer = "site" | "back" | "factory" | "probe" | "delivery";
15
+ export type WarpgogolEnvironment = "production" | "preview" | "development" | "ci";
16
+
17
+ export const WARPGOGOL_LAYERS: readonly WarpgogolLayer[] = [
18
+ "site",
19
+ "back",
20
+ "factory",
21
+ "probe",
22
+ "delivery",
23
+ ];
24
+
25
+ export const WARPGOGOL_ENVIRONMENTS: readonly WarpgogolEnvironment[] = [
26
+ "production",
27
+ "preview",
28
+ "development",
29
+ "ci",
30
+ ];
31
+
32
+ export interface WarpgogolResourceInput {
33
+ serviceName: string;
34
+ layer: WarpgogolLayer;
35
+ environment?: WarpgogolEnvironment;
36
+ siteId?: string;
37
+ serviceVersion?: string;
38
+ }
39
+
40
+ export const OTLP_ENDPOINT_ENV = "WARPGOGOL_OTLP_ENDPOINT";
41
+ export const OTLP_TOKEN_ENV = "WARPGOGOL_OTLP_TOKEN";
42
+
43
+ export interface OtlpKeyValue {
44
+ key: string;
45
+ value: { stringValue: string };
46
+ }
47
+
48
+ const LAYERS_REQUIRING_SITE_ID: ReadonlySet<WarpgogolLayer> = new Set([
49
+ "site",
50
+ "probe",
51
+ "delivery",
52
+ ]);
53
+
54
+ export function buildResourceAttributes(input: WarpgogolResourceInput): OtlpKeyValue[] {
55
+ if (!input.serviceName) {
56
+ throw new Error("[observability] serviceName is required");
57
+ }
58
+ if (!WARPGOGOL_LAYERS.includes(input.layer)) {
59
+ throw new Error(
60
+ `[observability] layer "${input.layer}" is not in the closed vocabulary ${WARPGOGOL_LAYERS.join(" | ")}`,
61
+ );
62
+ }
63
+ const env = input.environment;
64
+ if (env !== undefined && !WARPGOGOL_ENVIRONMENTS.includes(env)) {
65
+ throw new Error(
66
+ `[observability] environment "${env}" is not in the closed vocabulary ${WARPGOGOL_ENVIRONMENTS.join(" | ")}`,
67
+ );
68
+ }
69
+ if (input.siteId === undefined && LAYERS_REQUIRING_SITE_ID.has(input.layer)) {
70
+ throw new Error(`[observability] siteId is required for layer "${input.layer}"`);
71
+ }
72
+
73
+ const attrs: OtlpKeyValue[] = [
74
+ { key: "service.name", value: { stringValue: input.serviceName } },
75
+ {
76
+ key: "deployment.environment",
77
+ value: { stringValue: input.environment ?? "development" },
78
+ },
79
+ { key: "warpgogol.layer", value: { stringValue: input.layer } },
80
+ ];
81
+
82
+ if (input.siteId !== undefined) {
83
+ attrs.push({ key: "warpgogol.site_id", value: { stringValue: input.siteId } });
84
+ }
85
+ if (input.serviceVersion !== undefined) {
86
+ attrs.push({
87
+ key: "service.version",
88
+ value: { stringValue: input.serviceVersion },
89
+ });
90
+ }
91
+
92
+ return attrs;
93
+ }
@@ -0,0 +1,57 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>
4
+ Environment resolver for observability — extracts OTLP endpoint/token
5
+ and deployment environment from a MetricsPusherEnv or global process.env.
6
+ Extracted from pusher.ts for testability and reuse.
7
+ </purpose>
8
+ <non-goals>
9
+ <item>Do not import node: modules — must be Workers-compatible.</item>
10
+ </non-goals>
11
+ </MODULE_CONTRACT>
12
+ <CHANGE_SUMMARY>
13
+ <item>Architecture review 2026-07-14: extract env resolution from pusher.ts.</item>
14
+ </CHANGE_SUMMARY>
15
+ */
16
+
17
+ import type { WarpgogolEnvironment } from "./conventions.ts";
18
+
19
+ export interface MetricsPusherEnv {
20
+ endpoint?: string;
21
+ token?: string;
22
+ }
23
+
24
+ interface ProcessEnvLike {
25
+ env?: Record<string, string | undefined>;
26
+ }
27
+
28
+ function getGlobalProcess(): ProcessEnvLike | undefined {
29
+ if (typeof globalThis === "undefined") return undefined;
30
+ const g = globalThis as Record<string, unknown>;
31
+ return typeof g["process"] === "object" && g["process"] !== null
32
+ ? (g["process"] as ProcessEnvLike)
33
+ : undefined;
34
+ }
35
+
36
+ export function resolvePusherEnv(env?: MetricsPusherEnv): { endpoint?: string; token?: string } {
37
+ if (env) return env;
38
+ const proc = getGlobalProcess();
39
+ if (proc?.env) {
40
+ return {
41
+ endpoint: proc.env["WARPGOGOL_OTLP_ENDPOINT"],
42
+ token: proc.env["WARPGOGOL_OTLP_TOKEN"],
43
+ };
44
+ }
45
+ return {};
46
+ }
47
+
48
+ export function detectEnvironment(): WarpgogolEnvironment {
49
+ const proc = getGlobalProcess();
50
+ const raw = proc?.env
51
+ ? (proc.env["WARPGOGOL_DEPLOYMENT_ENV"] ?? proc.env["NODE_ENV"])
52
+ : undefined;
53
+ if (raw === "production") return "production";
54
+ if (raw === "preview") return "preview";
55
+ if (raw === "ci") return "ci";
56
+ return "development";
57
+ }
@@ -0,0 +1,57 @@
1
+ /*
2
+ <MODULE_CONTRACT>
3
+ <purpose>Barrel export for @warpgogol/werkstatt-shared/observability — the observability port package (RFC-0337).</purpose>
4
+ <non-goals>
5
+ <item>Do not introduce app-specific runtime composition or deployment behavior into this reusable package source file.</item>
6
+ </non-goals>
7
+ </MODULE_CONTRACT>
8
+ <CHANGE_SUMMARY>
9
+ <item>RFC-0337: initial implementation.</item>
10
+ <item>Deepening: extract convertAccumulatedToOtlp pure function, add METRIC_REFS typed references, remove speculative exports.</item>
11
+ </CHANGE_SUMMARY>
12
+ */
13
+
14
+ export {
15
+ buildResourceAttributes,
16
+ OTLP_ENDPOINT_ENV,
17
+ OTLP_TOKEN_ENV,
18
+ WARPGOGOL_ENVIRONMENTS,
19
+ WARPGOGOL_LAYERS,
20
+ type OtlpKeyValue,
21
+ type WarpgogolEnvironment,
22
+ type WarpgogolLayer,
23
+ type WarpgogolResourceInput,
24
+ } from "./conventions.ts";
25
+
26
+ export {
27
+ findMetricSpec,
28
+ isLabelKeyForbidden,
29
+ isMetricNameValid,
30
+ FORBIDDEN_LABEL_KEYS,
31
+ METRIC_NAME_PATTERN,
32
+ WARPGOGOL_METRIC_REGISTRY,
33
+ type WarpgogolMetricKind,
34
+ type WarpgogolMetricSpec,
35
+ } from "./metric-registry.ts";
36
+
37
+ export {
38
+ encodeOtlpMetrics,
39
+ nowUnixNano,
40
+ type OtlpGaugePoint,
41
+ type OtlpHistogramPoint,
42
+ type OtlpMetricPoint,
43
+ type OtlpMetricsEnvelope,
44
+ type OtlpSumPoint,
45
+ type UnixNanoString,
46
+ } from "./otlp-json.ts";
47
+
48
+ export { createMetricsPusher, type MetricsPusher, type MetricsPusherEnv } from "./pusher.ts";
49
+
50
+ export { redactUrl } from "./redact.ts";
51
+
52
+ export {
53
+ METRIC_REFS,
54
+ type TypedCounter,
55
+ type TypedGauge,
56
+ type TypedHistogram,
57
+ } from "./typed-refs.ts";