@contractspec/lib.contracts 1.44.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 (528) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/dist/_virtual/rolldown_runtime.js +37 -0
  4. package/dist/app-config/app-config.feature.d.ts +12 -0
  5. package/dist/app-config/app-config.feature.js +54 -0
  6. package/dist/app-config/branding.d.ts +55 -0
  7. package/dist/app-config/branding.js +0 -0
  8. package/dist/app-config/contracts.d.ts +245 -0
  9. package/dist/app-config/contracts.js +395 -0
  10. package/dist/app-config/docs/app-config.docblock.d.ts +6 -0
  11. package/dist/app-config/docs/app-config.docblock.js +21 -0
  12. package/dist/app-config/events.d.ts +122 -0
  13. package/dist/app-config/events.js +174 -0
  14. package/dist/app-config/index.d.ts +9 -0
  15. package/dist/app-config/index.js +8 -0
  16. package/dist/app-config/lifecycle-contracts.d.ts +273 -0
  17. package/dist/app-config/lifecycle-contracts.js +440 -0
  18. package/dist/app-config/lifecycle.d.ts +27 -0
  19. package/dist/app-config/lifecycle.js +0 -0
  20. package/dist/app-config/runtime.d.ts +120 -0
  21. package/dist/app-config/runtime.js +617 -0
  22. package/dist/app-config/spec.d.ts +173 -0
  23. package/dist/app-config/spec.js +36 -0
  24. package/dist/app-config/validation.d.ts +49 -0
  25. package/dist/app-config/validation.js +538 -0
  26. package/dist/capabilities/capabilities.d.ts +48 -0
  27. package/dist/capabilities/capabilities.js +50 -0
  28. package/dist/capabilities/docs/capabilities.docblock.d.ts +6 -0
  29. package/dist/capabilities/docs/capabilities.docblock.js +21 -0
  30. package/dist/capabilities/index.d.ts +3 -0
  31. package/dist/capabilities/index.js +4 -0
  32. package/dist/capabilities/openbanking.d.ts +10 -0
  33. package/dist/capabilities/openbanking.js +92 -0
  34. package/dist/client/index.d.ts +6 -0
  35. package/dist/client/index.js +9 -0
  36. package/dist/client/react/drivers/rn-reusables.d.ts +22 -0
  37. package/dist/client/react/drivers/rn-reusables.js +21 -0
  38. package/dist/client/react/drivers/shadcn.d.ts +12 -0
  39. package/dist/client/react/drivers/shadcn.js +11 -0
  40. package/dist/client/react/feature-render.d.ts +23 -0
  41. package/dist/client/react/feature-render.js +44 -0
  42. package/dist/client/react/form-render.d.ts +92 -0
  43. package/dist/client/react/form-render.js +298 -0
  44. package/dist/client/react/index.d.ts +5 -0
  45. package/dist/client/react/index.js +8 -0
  46. package/dist/contract-registry/index.d.ts +3 -0
  47. package/dist/contract-registry/index.js +3 -0
  48. package/dist/contract-registry/schemas.d.ts +124 -0
  49. package/dist/contract-registry/schemas.js +61 -0
  50. package/dist/contract-registry/types.d.ts +46 -0
  51. package/dist/contract-registry/types.js +0 -0
  52. package/dist/data-views/data-views.d.ts +5 -0
  53. package/dist/data-views/data-views.js +4 -0
  54. package/dist/data-views/docs/data-views.docblock.d.ts +6 -0
  55. package/dist/data-views/docs/data-views.docblock.js +21 -0
  56. package/dist/data-views/index.d.ts +4 -0
  57. package/dist/data-views/index.js +4 -0
  58. package/dist/data-views/query-generator.d.ts +40 -0
  59. package/dist/data-views/query-generator.js +48 -0
  60. package/dist/data-views/registry.d.ts +51 -0
  61. package/dist/data-views/registry.js +82 -0
  62. package/dist/data-views/runtime.d.ts +28 -0
  63. package/dist/data-views/runtime.js +39 -0
  64. package/dist/data-views/spec.d.ts +32 -0
  65. package/dist/data-views/spec.js +10 -0
  66. package/dist/data-views/types.d.ts +157 -0
  67. package/dist/data-views/types.js +0 -0
  68. package/dist/docs/accessibility_wcag_compliance_specs.docblock.d.ts +6 -0
  69. package/dist/docs/accessibility_wcag_compliance_specs.docblock.js +17 -0
  70. package/dist/docs/index.d.ts +6 -0
  71. package/dist/docs/index.js +29 -0
  72. package/dist/docs/meta.docs.d.ts +6 -0
  73. package/dist/docs/meta.docs.js +29 -0
  74. package/dist/docs/presentations.d.ts +33 -0
  75. package/dist/docs/presentations.js +64 -0
  76. package/dist/docs/registry.d.ts +23 -0
  77. package/dist/docs/registry.js +51 -0
  78. package/dist/docs/tech/auth/better-auth-nextjs.docblock.d.ts +6 -0
  79. package/dist/docs/tech/auth/better-auth-nextjs.docblock.js +81 -0
  80. package/dist/docs/tech/contracts/README.docblock.d.ts +6 -0
  81. package/dist/docs/tech/contracts/README.docblock.js +21 -0
  82. package/dist/docs/tech/contracts/create-subscription.docblock.d.ts +6 -0
  83. package/dist/docs/tech/contracts/create-subscription.docblock.js +21 -0
  84. package/dist/docs/tech/contracts/graphql-typed-outputs.docblock.d.ts +6 -0
  85. package/dist/docs/tech/contracts/graphql-typed-outputs.docblock.js +21 -0
  86. package/dist/docs/tech/contracts/migrations.docblock.d.ts +6 -0
  87. package/dist/docs/tech/contracts/migrations.docblock.js +21 -0
  88. package/dist/docs/tech/contracts/openapi-export.docblock.d.ts +6 -0
  89. package/dist/docs/tech/contracts/openapi-export.docblock.js +58 -0
  90. package/dist/docs/tech/contracts/openapi-import.docblock.d.ts +6 -0
  91. package/dist/docs/tech/contracts/openapi-import.docblock.js +65 -0
  92. package/dist/docs/tech/contracts/ops-to-presentation-linking.docblock.d.ts +6 -0
  93. package/dist/docs/tech/contracts/ops-to-presentation-linking.docblock.js +21 -0
  94. package/dist/docs/tech/contracts/overlays.docblock.d.ts +6 -0
  95. package/dist/docs/tech/contracts/overlays.docblock.js +21 -0
  96. package/dist/docs/tech/contracts/tests.docblock.d.ts +6 -0
  97. package/dist/docs/tech/contracts/tests.docblock.js +21 -0
  98. package/dist/docs/tech/contracts/themes.docblock.d.ts +6 -0
  99. package/dist/docs/tech/contracts/themes.docblock.js +21 -0
  100. package/dist/docs/tech/contracts/vertical-pocket-family-office.docblock.d.ts +6 -0
  101. package/dist/docs/tech/contracts/vertical-pocket-family-office.docblock.js +21 -0
  102. package/dist/docs/tech/lifecycle-stage-system.docblock.d.ts +6 -0
  103. package/dist/docs/tech/lifecycle-stage-system.docblock.js +17 -0
  104. package/dist/docs/tech/llm/llm-integration.docblock.d.ts +7 -0
  105. package/dist/docs/tech/llm/llm-integration.docblock.js +358 -0
  106. package/dist/docs/tech/mcp-endpoints.docblock.d.ts +6 -0
  107. package/dist/docs/tech/mcp-endpoints.docblock.js +38 -0
  108. package/dist/docs/tech/presentation-runtime.docblock.d.ts +6 -0
  109. package/dist/docs/tech/presentation-runtime.docblock.js +17 -0
  110. package/dist/docs/tech/schema/README.docblock.d.ts +6 -0
  111. package/dist/docs/tech/schema/README.docblock.js +21 -0
  112. package/dist/docs/tech/studio/learning-events.docblock.d.ts +6 -0
  113. package/dist/docs/tech/studio/learning-events.docblock.js +49 -0
  114. package/dist/docs/tech/studio/learning-journeys.docblock.d.ts +6 -0
  115. package/dist/docs/tech/studio/learning-journeys.docblock.js +80 -0
  116. package/dist/docs/tech/studio/platform-admin-panel.docblock.d.ts +6 -0
  117. package/dist/docs/tech/studio/platform-admin-panel.docblock.js +85 -0
  118. package/dist/docs/tech/studio/project-access-teams.docblock.d.ts +6 -0
  119. package/dist/docs/tech/studio/project-access-teams.docblock.js +46 -0
  120. package/dist/docs/tech/studio/project-routing.docblock.d.ts +6 -0
  121. package/dist/docs/tech/studio/project-routing.docblock.js +68 -0
  122. package/dist/docs/tech/studio/sandbox-unlogged.docblock.d.ts +6 -0
  123. package/dist/docs/tech/studio/sandbox-unlogged.docblock.js +41 -0
  124. package/dist/docs/tech/studio/team-invitations.docblock.d.ts +6 -0
  125. package/dist/docs/tech/studio/team-invitations.docblock.js +70 -0
  126. package/dist/docs/tech/studio/workspace-ops.docblock.d.ts +6 -0
  127. package/dist/docs/tech/studio/workspace-ops.docblock.js +48 -0
  128. package/dist/docs/tech/studio/workspaces.docblock.d.ts +6 -0
  129. package/dist/docs/tech/studio/workspaces.docblock.js +63 -0
  130. package/dist/docs/tech/telemetry-ingest.docblock.d.ts +6 -0
  131. package/dist/docs/tech/telemetry-ingest.docblock.js +156 -0
  132. package/dist/docs/tech/templates/runtime.docblock.d.ts +6 -0
  133. package/dist/docs/tech/templates/runtime.docblock.js +21 -0
  134. package/dist/docs/tech/vscode-extension.docblock.d.ts +6 -0
  135. package/dist/docs/tech/vscode-extension.docblock.js +102 -0
  136. package/dist/docs/tech-contracts.docs.d.ts +6 -0
  137. package/dist/docs/tech-contracts.docs.js +96 -0
  138. package/dist/docs/types.d.ts +41 -0
  139. package/dist/docs/types.js +0 -0
  140. package/dist/events.d.ts +47 -0
  141. package/dist/events.js +19 -0
  142. package/dist/experiments/docs/experiments.docblock.d.ts +6 -0
  143. package/dist/experiments/docs/experiments.docblock.js +21 -0
  144. package/dist/experiments/evaluator.d.ts +37 -0
  145. package/dist/experiments/evaluator.js +101 -0
  146. package/dist/experiments/spec-resolver.d.ts +17 -0
  147. package/dist/experiments/spec-resolver.js +0 -0
  148. package/dist/experiments/spec.d.ts +82 -0
  149. package/dist/experiments/spec.js +33 -0
  150. package/dist/features/index.d.ts +5 -0
  151. package/dist/features/index.js +5 -0
  152. package/dist/features/install.d.ts +22 -0
  153. package/dist/features/install.js +36 -0
  154. package/dist/features/registry.d.ts +26 -0
  155. package/dist/features/registry.js +49 -0
  156. package/dist/features/types.d.ts +88 -0
  157. package/dist/features/types.js +0 -0
  158. package/dist/features/validation.d.ts +8 -0
  159. package/dist/features/validation.js +14 -0
  160. package/dist/forms/docs/forms.docblock.d.ts +6 -0
  161. package/dist/forms/docs/forms.docblock.js +21 -0
  162. package/dist/forms/forms.d.ts +266 -0
  163. package/dist/forms/forms.js +146 -0
  164. package/dist/forms/index.d.ts +2 -0
  165. package/dist/forms/index.js +3 -0
  166. package/dist/index.d.ts +147 -0
  167. package/dist/index.js +121 -0
  168. package/dist/install.d.ts +77 -0
  169. package/dist/install.js +40 -0
  170. package/dist/integrations/binding.d.ts +17 -0
  171. package/dist/integrations/binding.js +0 -0
  172. package/dist/integrations/connection.d.ts +51 -0
  173. package/dist/integrations/connection.js +0 -0
  174. package/dist/integrations/docs/integrations.docblock.d.ts +6 -0
  175. package/dist/integrations/docs/integrations.docblock.js +94 -0
  176. package/dist/integrations/health.d.ts +21 -0
  177. package/dist/integrations/health.js +69 -0
  178. package/dist/integrations/index.d.ts +34 -0
  179. package/dist/integrations/index.js +23 -0
  180. package/dist/integrations/integrations.feature.d.ts +12 -0
  181. package/dist/integrations/integrations.feature.js +60 -0
  182. package/dist/integrations/openbanking/contracts/accounts.d.ts +289 -0
  183. package/dist/integrations/openbanking/contracts/accounts.js +236 -0
  184. package/dist/integrations/openbanking/contracts/balances.d.ts +165 -0
  185. package/dist/integrations/openbanking/contracts/balances.js +166 -0
  186. package/dist/integrations/openbanking/contracts/index.d.ts +10 -0
  187. package/dist/integrations/openbanking/contracts/index.js +12 -0
  188. package/dist/integrations/openbanking/contracts/transactions.d.ts +213 -0
  189. package/dist/integrations/openbanking/contracts/transactions.js +217 -0
  190. package/dist/integrations/openbanking/guards.d.ts +12 -0
  191. package/dist/integrations/openbanking/guards.js +33 -0
  192. package/dist/integrations/openbanking/models.d.ts +228 -0
  193. package/dist/integrations/openbanking/models.js +240 -0
  194. package/dist/integrations/openbanking/openbanking.feature.d.ts +12 -0
  195. package/dist/integrations/openbanking/openbanking.feature.js +69 -0
  196. package/dist/integrations/openbanking/telemetry.d.ts +15 -0
  197. package/dist/integrations/openbanking/telemetry.js +39 -0
  198. package/dist/integrations/operations.d.ts +437 -0
  199. package/dist/integrations/operations.js +392 -0
  200. package/dist/integrations/providers/calendar.d.ts +78 -0
  201. package/dist/integrations/providers/calendar.js +0 -0
  202. package/dist/integrations/providers/elevenlabs.d.ts +7 -0
  203. package/dist/integrations/providers/elevenlabs.js +55 -0
  204. package/dist/integrations/providers/email.d.ts +86 -0
  205. package/dist/integrations/providers/email.js +0 -0
  206. package/dist/integrations/providers/embedding.d.ts +24 -0
  207. package/dist/integrations/providers/embedding.js +0 -0
  208. package/dist/integrations/providers/gcs-storage.d.ts +7 -0
  209. package/dist/integrations/providers/gcs-storage.js +78 -0
  210. package/dist/integrations/providers/gmail.d.ts +7 -0
  211. package/dist/integrations/providers/gmail.js +90 -0
  212. package/dist/integrations/providers/google-calendar.d.ts +7 -0
  213. package/dist/integrations/providers/google-calendar.js +69 -0
  214. package/dist/integrations/providers/impls/elevenlabs-voice.d.ts +20 -0
  215. package/dist/integrations/providers/impls/elevenlabs-voice.js +95 -0
  216. package/dist/integrations/providers/impls/gcs-storage.d.ts +24 -0
  217. package/dist/integrations/providers/impls/gcs-storage.js +88 -0
  218. package/dist/integrations/providers/impls/gmail-inbound.d.ts +26 -0
  219. package/dist/integrations/providers/impls/gmail-inbound.js +200 -0
  220. package/dist/integrations/providers/impls/gmail-outbound.d.ts +18 -0
  221. package/dist/integrations/providers/impls/gmail-outbound.js +105 -0
  222. package/dist/integrations/providers/impls/google-calendar.d.ts +23 -0
  223. package/dist/integrations/providers/impls/google-calendar.js +154 -0
  224. package/dist/integrations/providers/impls/index.d.ts +15 -0
  225. package/dist/integrations/providers/impls/index.js +16 -0
  226. package/dist/integrations/providers/impls/mistral-embedding.d.ts +23 -0
  227. package/dist/integrations/providers/impls/mistral-embedding.js +41 -0
  228. package/dist/integrations/providers/impls/mistral-llm.d.ts +31 -0
  229. package/dist/integrations/providers/impls/mistral-llm.js +247 -0
  230. package/dist/integrations/providers/impls/postmark-email.d.ts +19 -0
  231. package/dist/integrations/providers/impls/postmark-email.js +55 -0
  232. package/dist/integrations/providers/impls/powens-client.d.ts +124 -0
  233. package/dist/integrations/providers/impls/powens-client.js +171 -0
  234. package/dist/integrations/providers/impls/powens-openbanking.d.ts +27 -0
  235. package/dist/integrations/providers/impls/powens-openbanking.js +218 -0
  236. package/dist/integrations/providers/impls/provider-factory.d.ts +26 -0
  237. package/dist/integrations/providers/impls/provider-factory.js +145 -0
  238. package/dist/integrations/providers/impls/qdrant-vector.d.ts +24 -0
  239. package/dist/integrations/providers/impls/qdrant-vector.js +69 -0
  240. package/dist/integrations/providers/impls/stripe-payments.d.ts +28 -0
  241. package/dist/integrations/providers/impls/stripe-payments.js +202 -0
  242. package/dist/integrations/providers/impls/twilio-sms.d.ts +20 -0
  243. package/dist/integrations/providers/impls/twilio-sms.js +58 -0
  244. package/dist/integrations/providers/index.d.ts +22 -0
  245. package/dist/integrations/providers/index.js +13 -0
  246. package/dist/integrations/providers/llm.d.ts +82 -0
  247. package/dist/integrations/providers/llm.js +0 -0
  248. package/dist/integrations/providers/mistral.d.ts +7 -0
  249. package/dist/integrations/providers/mistral.js +71 -0
  250. package/dist/integrations/providers/openbanking.d.ts +128 -0
  251. package/dist/integrations/providers/openbanking.js +0 -0
  252. package/dist/integrations/providers/payments.d.ts +109 -0
  253. package/dist/integrations/providers/payments.js +0 -0
  254. package/dist/integrations/providers/postmark.d.ts +7 -0
  255. package/dist/integrations/providers/postmark.js +71 -0
  256. package/dist/integrations/providers/powens.d.ts +7 -0
  257. package/dist/integrations/providers/powens.js +119 -0
  258. package/dist/integrations/providers/qdrant.d.ts +7 -0
  259. package/dist/integrations/providers/qdrant.js +76 -0
  260. package/dist/integrations/providers/registry.d.ts +11 -0
  261. package/dist/integrations/providers/registry.js +34 -0
  262. package/dist/integrations/providers/sms.d.ts +34 -0
  263. package/dist/integrations/providers/sms.js +0 -0
  264. package/dist/integrations/providers/storage.d.ts +60 -0
  265. package/dist/integrations/providers/storage.js +0 -0
  266. package/dist/integrations/providers/stripe.d.ts +7 -0
  267. package/dist/integrations/providers/stripe.js +86 -0
  268. package/dist/integrations/providers/twilio-sms.d.ts +7 -0
  269. package/dist/integrations/providers/twilio-sms.js +64 -0
  270. package/dist/integrations/providers/vector-store.d.ts +43 -0
  271. package/dist/integrations/providers/vector-store.js +0 -0
  272. package/dist/integrations/providers/voice.d.ts +34 -0
  273. package/dist/integrations/providers/voice.js +0 -0
  274. package/dist/integrations/runtime.d.ts +99 -0
  275. package/dist/integrations/runtime.js +186 -0
  276. package/dist/integrations/secrets/aws-secret-manager.d.ts +31 -0
  277. package/dist/integrations/secrets/aws-secret-manager.js +231 -0
  278. package/dist/integrations/secrets/env-secret-provider.d.ts +31 -0
  279. package/dist/integrations/secrets/env-secret-provider.js +81 -0
  280. package/dist/integrations/secrets/gcp-secret-manager.d.ts +32 -0
  281. package/dist/integrations/secrets/gcp-secret-manager.js +229 -0
  282. package/dist/integrations/secrets/index.d.ts +7 -0
  283. package/dist/integrations/secrets/index.js +8 -0
  284. package/dist/integrations/secrets/manager.d.ts +47 -0
  285. package/dist/integrations/secrets/manager.js +103 -0
  286. package/dist/integrations/secrets/provider.d.ts +52 -0
  287. package/dist/integrations/secrets/provider.js +58 -0
  288. package/dist/integrations/secrets/scaleway-secret-manager.d.ts +38 -0
  289. package/dist/integrations/secrets/scaleway-secret-manager.js +247 -0
  290. package/dist/integrations/secrets-types.d.ts +17 -0
  291. package/dist/integrations/secrets-types.js +0 -0
  292. package/dist/integrations/spec.d.ts +75 -0
  293. package/dist/integrations/spec.js +39 -0
  294. package/dist/jobs/define-job.d.ts +18 -0
  295. package/dist/jobs/define-job.js +16 -0
  296. package/dist/jobs/gcp-cloud-tasks.d.ts +41 -0
  297. package/dist/jobs/gcp-cloud-tasks.js +53 -0
  298. package/dist/jobs/gcp-pubsub.d.ts +25 -0
  299. package/dist/jobs/gcp-pubsub.js +39 -0
  300. package/dist/jobs/handlers/gmail-sync-handler.d.ts +9 -0
  301. package/dist/jobs/handlers/gmail-sync-handler.js +9 -0
  302. package/dist/jobs/handlers/index.d.ts +9 -0
  303. package/dist/jobs/handlers/index.js +12 -0
  304. package/dist/jobs/handlers/ping-handler.d.ts +10 -0
  305. package/dist/jobs/handlers/ping-handler.js +15 -0
  306. package/dist/jobs/handlers/storage-document-handler.d.ts +12 -0
  307. package/dist/jobs/handlers/storage-document-handler.js +14 -0
  308. package/dist/jobs/index.d.ts +3 -0
  309. package/dist/jobs/index.js +4 -0
  310. package/dist/jobs/memory-queue.d.ts +18 -0
  311. package/dist/jobs/memory-queue.js +71 -0
  312. package/dist/jobs/queue.d.ts +131 -0
  313. package/dist/jobs/queue.js +33 -0
  314. package/dist/jobs/scaleway-sqs-queue.d.ts +30 -0
  315. package/dist/jobs/scaleway-sqs-queue.js +153 -0
  316. package/dist/jsonschema.d.ts +27 -0
  317. package/dist/jsonschema.js +32 -0
  318. package/dist/knowledge/binding.d.ts +25 -0
  319. package/dist/knowledge/binding.js +0 -0
  320. package/dist/knowledge/docs/knowledge.docblock.d.ts +6 -0
  321. package/dist/knowledge/docs/knowledge.docblock.js +21 -0
  322. package/dist/knowledge/index.d.ts +11 -0
  323. package/dist/knowledge/index.js +10 -0
  324. package/dist/knowledge/ingestion/document-processor.d.ts +24 -0
  325. package/dist/knowledge/ingestion/document-processor.js +54 -0
  326. package/dist/knowledge/ingestion/embedding-service.d.ts +12 -0
  327. package/dist/knowledge/ingestion/embedding-service.js +25 -0
  328. package/dist/knowledge/ingestion/gmail-adapter.d.ts +18 -0
  329. package/dist/knowledge/ingestion/gmail-adapter.js +51 -0
  330. package/dist/knowledge/ingestion/index.d.ts +6 -0
  331. package/dist/knowledge/ingestion/index.js +7 -0
  332. package/dist/knowledge/ingestion/storage-adapter.d.ts +15 -0
  333. package/dist/knowledge/ingestion/storage-adapter.js +26 -0
  334. package/dist/knowledge/ingestion/vector-indexer.d.ts +18 -0
  335. package/dist/knowledge/ingestion/vector-indexer.js +32 -0
  336. package/dist/knowledge/knowledge.feature.d.ts +12 -0
  337. package/dist/knowledge/knowledge.feature.js +61 -0
  338. package/dist/knowledge/operations.d.ts +318 -0
  339. package/dist/knowledge/operations.js +321 -0
  340. package/dist/knowledge/query/index.d.ts +2 -0
  341. package/dist/knowledge/query/index.js +3 -0
  342. package/dist/knowledge/query/service.d.ts +29 -0
  343. package/dist/knowledge/query/service.js +65 -0
  344. package/dist/knowledge/runtime.d.ts +32 -0
  345. package/dist/knowledge/runtime.js +49 -0
  346. package/dist/knowledge/source.d.ts +32 -0
  347. package/dist/knowledge/source.js +0 -0
  348. package/dist/knowledge/spaces/email-threads.d.ts +7 -0
  349. package/dist/knowledge/spaces/email-threads.js +37 -0
  350. package/dist/knowledge/spaces/financial-docs.d.ts +7 -0
  351. package/dist/knowledge/spaces/financial-docs.js +37 -0
  352. package/dist/knowledge/spaces/financial-overview.d.ts +7 -0
  353. package/dist/knowledge/spaces/financial-overview.js +41 -0
  354. package/dist/knowledge/spaces/index.d.ts +7 -0
  355. package/dist/knowledge/spaces/index.js +8 -0
  356. package/dist/knowledge/spaces/product-canon.d.ts +7 -0
  357. package/dist/knowledge/spaces/product-canon.js +37 -0
  358. package/dist/knowledge/spaces/support-faq.d.ts +7 -0
  359. package/dist/knowledge/spaces/support-faq.js +40 -0
  360. package/dist/knowledge/spaces/uploaded-docs.d.ts +7 -0
  361. package/dist/knowledge/spaces/uploaded-docs.js +37 -0
  362. package/dist/knowledge/spec.d.ts +48 -0
  363. package/dist/knowledge/spec.js +39 -0
  364. package/dist/llm/exporters.d.ts +70 -0
  365. package/dist/llm/exporters.js +542 -0
  366. package/dist/llm/index.d.ts +4 -0
  367. package/dist/llm/index.js +4 -0
  368. package/dist/llm/prompts.d.ts +52 -0
  369. package/dist/llm/prompts.js +410 -0
  370. package/dist/llm/types.d.ts +215 -0
  371. package/dist/llm/types.js +0 -0
  372. package/dist/markdown.d.ts +22 -0
  373. package/dist/markdown.js +119 -0
  374. package/dist/migrations.d.ts +52 -0
  375. package/dist/migrations.js +33 -0
  376. package/dist/model-registry.d.ts +13 -0
  377. package/dist/model-registry.js +33 -0
  378. package/dist/onboarding-base.d.ts +138 -0
  379. package/dist/onboarding-base.js +195 -0
  380. package/dist/openapi.d.ts +31 -0
  381. package/dist/openapi.js +75 -0
  382. package/dist/operations/index.d.ts +3 -0
  383. package/dist/operations/index.js +4 -0
  384. package/dist/operations/operation.d.ts +186 -0
  385. package/dist/operations/operation.js +35 -0
  386. package/dist/operations/registry.d.ts +103 -0
  387. package/dist/operations/registry.js +252 -0
  388. package/dist/ownership.d.ts +84 -0
  389. package/dist/ownership.js +38 -0
  390. package/dist/policy/docs/policy.docblock.d.ts +6 -0
  391. package/dist/policy/docs/policy.docblock.js +21 -0
  392. package/dist/policy/engine.d.ts +40 -0
  393. package/dist/policy/engine.js +223 -0
  394. package/dist/policy/index.d.ts +5 -0
  395. package/dist/policy/index.js +5 -0
  396. package/dist/policy/opa-adapter.d.ts +45 -0
  397. package/dist/policy/opa-adapter.js +71 -0
  398. package/dist/policy/registry.d.ts +9 -0
  399. package/dist/policy/registry.js +11 -0
  400. package/dist/policy/spec.d.ts +103 -0
  401. package/dist/policy/spec.js +0 -0
  402. package/dist/presentations/docs/presentations-conventions.docblock.d.ts +6 -0
  403. package/dist/presentations/docs/presentations-conventions.docblock.js +21 -0
  404. package/dist/presentations/index.d.ts +4 -0
  405. package/dist/presentations/index.js +5 -0
  406. package/dist/presentations/presentations.d.ts +50 -0
  407. package/dist/presentations/presentations.js +7 -0
  408. package/dist/presentations/registry.d.ts +10 -0
  409. package/dist/presentations/registry.js +12 -0
  410. package/dist/presentations/transform-engine.d.ts +66 -0
  411. package/dist/presentations/transform-engine.js +282 -0
  412. package/dist/prompt.d.ts +60 -0
  413. package/dist/prompt.js +10 -0
  414. package/dist/promptRegistry.d.ts +15 -0
  415. package/dist/promptRegistry.js +34 -0
  416. package/dist/regenerator/adapters.d.ts +19 -0
  417. package/dist/regenerator/adapters.js +0 -0
  418. package/dist/regenerator/docs/regenerator.docblock.d.ts +6 -0
  419. package/dist/regenerator/docs/regenerator.docblock.js +21 -0
  420. package/dist/regenerator/executor.d.ts +70 -0
  421. package/dist/regenerator/executor.js +86 -0
  422. package/dist/regenerator/index.d.ts +7 -0
  423. package/dist/regenerator/index.js +6 -0
  424. package/dist/regenerator/service.d.ts +33 -0
  425. package/dist/regenerator/service.js +93 -0
  426. package/dist/regenerator/sinks.d.ts +26 -0
  427. package/dist/regenerator/sinks.js +32 -0
  428. package/dist/regenerator/types.d.ts +107 -0
  429. package/dist/regenerator/types.js +0 -0
  430. package/dist/regenerator/utils.d.ts +9 -0
  431. package/dist/regenerator/utils.js +51 -0
  432. package/dist/registry-utils.d.ts +106 -0
  433. package/dist/registry-utils.js +122 -0
  434. package/dist/registry.d.ts +31 -0
  435. package/dist/registry.js +61 -0
  436. package/dist/resources.d.ts +64 -0
  437. package/dist/resources.js +50 -0
  438. package/dist/schema-to-markdown.d.ts +54 -0
  439. package/dist/schema-to-markdown.js +217 -0
  440. package/dist/server/contracts-adapter-hydration.d.ts +15 -0
  441. package/dist/server/contracts-adapter-hydration.js +41 -0
  442. package/dist/server/contracts-adapter-input.d.ts +9 -0
  443. package/dist/server/contracts-adapter-input.js +83 -0
  444. package/dist/server/graphql-pothos.d.ts +31 -0
  445. package/dist/server/graphql-pothos.js +134 -0
  446. package/dist/server/index.d.ts +9 -0
  447. package/dist/server/index.js +10 -0
  448. package/dist/server/mcp/createMcpServer.d.ts +15 -0
  449. package/dist/server/mcp/createMcpServer.js +27 -0
  450. package/dist/server/mcp/mcpTypes.d.ts +27 -0
  451. package/dist/server/mcp/mcpTypes.js +0 -0
  452. package/dist/server/mcp/registerPresentations.d.ts +7 -0
  453. package/dist/server/mcp/registerPresentations.js +63 -0
  454. package/dist/server/mcp/registerPrompts.d.ts +8 -0
  455. package/dist/server/mcp/registerPrompts.js +37 -0
  456. package/dist/server/mcp/registerResources.d.ts +8 -0
  457. package/dist/server/mcp/registerResources.js +35 -0
  458. package/dist/server/mcp/registerTools.d.ts +8 -0
  459. package/dist/server/mcp/registerTools.js +22 -0
  460. package/dist/server/provider-mcp.d.ts +2 -0
  461. package/dist/server/provider-mcp.js +3 -0
  462. package/dist/server/rest-elysia.d.ts +40 -0
  463. package/dist/server/rest-elysia.js +20 -0
  464. package/dist/server/rest-express.d.ts +16 -0
  465. package/dist/server/rest-express.js +36 -0
  466. package/dist/server/rest-generic.d.ts +32 -0
  467. package/dist/server/rest-generic.js +124 -0
  468. package/dist/server/rest-next-app.d.ts +35 -0
  469. package/dist/server/rest-next-app.js +38 -0
  470. package/dist/server/rest-next-mcp.d.ts +11 -0
  471. package/dist/server/rest-next-mcp.js +45 -0
  472. package/dist/server/rest-next-pages.d.ts +9 -0
  473. package/dist/server/rest-next-pages.js +22 -0
  474. package/dist/telemetry/anomaly.d.ts +27 -0
  475. package/dist/telemetry/anomaly.js +48 -0
  476. package/dist/telemetry/docs/telemetry.docblock.d.ts +6 -0
  477. package/dist/telemetry/docs/telemetry.docblock.js +21 -0
  478. package/dist/telemetry/index.d.ts +4 -0
  479. package/dist/telemetry/index.js +5 -0
  480. package/dist/telemetry/spec.d.ts +91 -0
  481. package/dist/telemetry/spec.js +69 -0
  482. package/dist/telemetry/tracker.d.ts +51 -0
  483. package/dist/telemetry/tracker.js +76 -0
  484. package/dist/tests/index.d.ts +3 -0
  485. package/dist/tests/index.js +4 -0
  486. package/dist/tests/runner.d.ts +43 -0
  487. package/dist/tests/runner.js +150 -0
  488. package/dist/tests/spec.d.ts +81 -0
  489. package/dist/tests/spec.js +33 -0
  490. package/dist/themes.d.ts +53 -0
  491. package/dist/themes.js +39 -0
  492. package/dist/translations/catalog.d.ts +28 -0
  493. package/dist/translations/catalog.js +0 -0
  494. package/dist/translations/tenant.d.ts +15 -0
  495. package/dist/translations/tenant.js +0 -0
  496. package/dist/types.d.ts +92 -0
  497. package/dist/types.js +0 -0
  498. package/dist/workflow/adapters/db-adapter.d.ts +46 -0
  499. package/dist/workflow/adapters/db-adapter.js +83 -0
  500. package/dist/workflow/adapters/file-adapter.d.ts +14 -0
  501. package/dist/workflow/adapters/file-adapter.js +11 -0
  502. package/dist/workflow/adapters/index.d.ts +4 -0
  503. package/dist/workflow/adapters/index.js +5 -0
  504. package/dist/workflow/adapters/memory-store.d.ts +18 -0
  505. package/dist/workflow/adapters/memory-store.js +58 -0
  506. package/dist/workflow/expression.d.ts +9 -0
  507. package/dist/workflow/expression.js +99 -0
  508. package/dist/workflow/index.d.ts +10 -0
  509. package/dist/workflow/index.js +9 -0
  510. package/dist/workflow/overview.docblock.d.ts +6 -0
  511. package/dist/workflow/overview.docblock.js +21 -0
  512. package/dist/workflow/runner.d.ts +75 -0
  513. package/dist/workflow/runner.js +337 -0
  514. package/dist/workflow/sla-monitor.d.ts +20 -0
  515. package/dist/workflow/sla-monitor.js +47 -0
  516. package/dist/workflow/spec.d.ts +106 -0
  517. package/dist/workflow/spec.js +55 -0
  518. package/dist/workflow/state.d.ts +35 -0
  519. package/dist/workflow/state.js +0 -0
  520. package/dist/workflow/validation.d.ts +29 -0
  521. package/dist/workflow/validation.js +176 -0
  522. package/dist/workspace-config/contractsrc-schema.d.ts +862 -0
  523. package/dist/workspace-config/contractsrc-schema.js +281 -0
  524. package/dist/workspace-config/index.d.ts +2 -0
  525. package/dist/workspace-config/index.js +3 -0
  526. package/dist/workspace-config/workspace-config.docblock.d.ts +6 -0
  527. package/dist/workspace-config/workspace-config.docblock.js +45 -0
  528. package/package.json +598 -0
@@ -0,0 +1,6 @@
1
+ import { DocBlock } from "@contractspec/lib.contracts/docs";
2
+
3
+ //#region src/docs/tech/vscode-extension.docblock.d.ts
4
+ declare const tech_vscode_extension_DocBlocks: DocBlock[];
5
+ //#endregion
6
+ export { tech_vscode_extension_DocBlocks };
@@ -0,0 +1,102 @@
1
+ import { registerDocBlocks } from "../registry.js";
2
+
3
+ //#region src/docs/tech/vscode-extension.docblock.ts
4
+ const tech_vscode_extension_DocBlocks = [{
5
+ id: "docs.tech.vscode.extension",
6
+ title: "ContractSpec VS Code Extension",
7
+ summary: "VS Code extension for spec-first development with validation, scaffolding, and MCP integration.",
8
+ kind: "reference",
9
+ visibility: "public",
10
+ route: "/docs/tech/vscode/extension",
11
+ tags: [
12
+ "vscode",
13
+ "extension",
14
+ "tooling",
15
+ "dx"
16
+ ],
17
+ body: `# ContractSpec VS Code Extension
18
+
19
+ The ContractSpec VS Code extension provides spec-first development tooling directly in your editor.
20
+
21
+ ## Features
22
+
23
+ - **Real-time Validation**: Get instant feedback on spec errors and warnings as you save files
24
+ - **Build/Scaffold**: Generate handler and component skeletons from specs (no AI required)
25
+ - **Spec Explorer**: List and navigate all specs in your workspace
26
+ - **Dependency Analysis**: Visualize spec dependencies and detect cycles
27
+ - **MCP Integration**: Search ContractSpec documentation via Model Context Protocol
28
+ - **Snippets**: Code snippets for common ContractSpec patterns
29
+
30
+ ## Commands
31
+
32
+ | Command | Description |
33
+ |---------|-------------|
34
+ | \`ContractSpec: Validate Current Spec\` | Validate the currently open spec file |
35
+ | \`ContractSpec: Validate All Specs\` | Validate all spec files in the workspace |
36
+ | \`ContractSpec: Build/Scaffold\` | Generate handler/component from the current spec |
37
+ | \`ContractSpec: List All Specs\` | Show all specs in the workspace |
38
+ | \`ContractSpec: Analyze Dependencies\` | Analyze and visualize spec dependencies |
39
+ | \`ContractSpec: Search Docs (MCP)\` | Search documentation via MCP |
40
+
41
+ ## Configuration
42
+
43
+ | Setting | Description | Default |
44
+ |---------|-------------|---------|
45
+ | \`contractspec.api.baseUrl\` | Base URL for ContractSpec API (enables MCP + remote telemetry) | \`""\` |
46
+ | \`contractspec.telemetry.posthogHost\` | PostHog host URL for direct telemetry | \`"https://eu.posthog.com"\` |
47
+ | \`contractspec.telemetry.posthogProjectKey\` | PostHog project key for direct telemetry | \`""\` |
48
+ | \`contractspec.validation.onSave\` | Run validation on save | \`true\` |
49
+ | \`contractspec.validation.onOpen\` | Run validation on open | \`true\` |
50
+
51
+ ## Architecture
52
+
53
+ The extension uses:
54
+ - \`@contractspec/module.workspace\` for pure analysis + templates
55
+ - \`@contractspec/bundle.workspace\` for workspace services + adapters
56
+
57
+ This allows the extension to work without requiring the CLI to be installed.
58
+
59
+ ## Telemetry
60
+
61
+ The extension uses a hybrid telemetry approach:
62
+ 1. If \`contractspec.api.baseUrl\` is configured → send to API \`/api/telemetry/ingest\`
63
+ 2. Otherwise → send directly to PostHog (if project key configured)
64
+
65
+ Telemetry respects VS Code's telemetry settings. No file paths, source code, or PII is collected.
66
+ `
67
+ }, {
68
+ id: "docs.tech.vscode.snippets",
69
+ title: "ContractSpec Snippets",
70
+ summary: "Code snippets for common ContractSpec patterns in VS Code.",
71
+ kind: "reference",
72
+ visibility: "public",
73
+ route: "/docs/tech/vscode/snippets",
74
+ tags: [
75
+ "vscode",
76
+ "snippets",
77
+ "dx"
78
+ ],
79
+ body: `# ContractSpec Snippets
80
+
81
+ The VS Code extension includes snippets for common ContractSpec patterns.
82
+
83
+ ## Available Snippets
84
+
85
+ | Prefix | Description |
86
+ |--------|-------------|
87
+ | \`contractspec-command\` | Create a new command (write operation) |
88
+ | \`contractspec-query\` | Create a new query (read-only operation) |
89
+ | \`contractspec-event\` | Create a new event |
90
+ | \`contractspec-docblock\` | Create a new DocBlock |
91
+ | \`contractspec-telemetry\` | Create a new TelemetrySpec |
92
+ | \`contractspec-presentation\` | Create a new Presentation |
93
+
94
+ ## Usage
95
+
96
+ Type the prefix in a TypeScript file and press Tab to expand the snippet. Tab through the placeholders to fill in your values.
97
+ `
98
+ }];
99
+ registerDocBlocks(tech_vscode_extension_DocBlocks);
100
+
101
+ //#endregion
102
+ export { tech_vscode_extension_DocBlocks };
@@ -0,0 +1,6 @@
1
+ import { DocBlock } from "./types.js";
2
+
3
+ //#region src/docs/tech-contracts.docs.d.ts
4
+ declare const techContractsDocs: DocBlock[];
5
+ //#endregion
6
+ export { techContractsDocs };
@@ -0,0 +1,96 @@
1
+ import { registerDocBlocks } from "./registry.js";
2
+
3
+ //#region src/docs/tech-contracts.docs.ts
4
+ const techContractsDocs = [{
5
+ id: "docs.tech.contracts.presentations-v2",
6
+ title: "Presentations V2 — Unified Descriptor & Transform Engine",
7
+ summary: "How PresentationSpec and TransformEngine keep docs/renderers consistent.",
8
+ visibility: "public",
9
+ route: "/docs/tech/contracts/presentations-v2",
10
+ kind: "reference",
11
+ tags: [
12
+ "presentations",
13
+ "docs",
14
+ "mcp"
15
+ ],
16
+ body: `## Presentations V2 — Unified Descriptor & Transform Engine
17
+
18
+ ### Purpose
19
+
20
+ Unify presentations into one descriptor (\`PresentationSpec\`) that declares a single source (React component key or BlockNote doc) and a list of output targets (react, markdown, application/json, application/xml). A pluggable \`TransformEngine\` renders any target and applies PII redaction.
21
+
22
+ ### Types
23
+
24
+ \`\`\`ts
25
+ type PresentationTarget =
26
+ | 'react'
27
+ | 'markdown'
28
+ | 'application/json'
29
+ | 'application/xml';
30
+
31
+ type PresentationSource =
32
+ | {
33
+ type: 'component';
34
+ framework: 'react';
35
+ componentKey: string;
36
+ props?: AnySchemaModel;
37
+ }
38
+ | { type: 'blocknotejs'; docJson: unknown; blockConfig?: unknown };
39
+
40
+ interface PresentationSpec {
41
+ meta: PresentationMeta; // includes partial OwnerShipMeta + description
42
+ policy?: { flags?: string[]; pii?: string[] };
43
+ source: PresentationSource;
44
+ targets: PresentationTarget[];
45
+ }
46
+
47
+ // Shared ownership schema (source of truth in @contractspec/lib.contracts/src/ownership.ts)
48
+ interface OwnerShipMeta {
49
+ title: string;
50
+ description: string;
51
+ domain: string;
52
+ owners: Owner[];
53
+ tags: Tag[];
54
+ stability: Stability;
55
+ }
56
+
57
+ type Stability = 'experimental' | 'beta' | 'stable' | 'deprecated';
58
+ type Owner = string; // curated list available in code (e.g., '@sigil-team', 'team-strit')
59
+ type Tag = string; // curated list available in code (e.g., 'auth', 'spots')
60
+
61
+ // For presentations, meta is a Partial<OwnerShipMeta> plus description, name, version
62
+ interface PresentationMeta extends Partial<OwnerShipMeta> {
63
+ name: string;
64
+ version: number;
65
+ description?: string;
66
+ }
67
+ \`\`\`
68
+
69
+ ### Engine
70
+
71
+ Use \`createDefaultTransformEngine()\` and register custom renderers as needed (e.g., high-fidelity BlockNote → Markdown). The default engine supports markdown/json/xml; a React renderer returns a serializable descriptor the host app renders via a \`componentMap\` or a BlockNote renderer. The canonical source type string is \`blocknotejs\` (not \`blocknote\`).
72
+
73
+ PII paths (JSON-like) are redacted from rendered outputs.
74
+
75
+ ### MCP Integration
76
+
77
+ \`createMcpServer\` accepts \`presentationsV2\`. Each descriptor is exposed under \`presentation://<name>/v<version>\` and negotiated variants (\`.md/.json/.xml\`) are rendered by the engine.
78
+
79
+ ### Migration
80
+
81
+ - V1 \`PresentationSpec\` remains supported; a back-compat helper converts V1 → V2 when convenient.
82
+ - Prefer V2 for new work.
83
+
84
+ ### Examples (Sigil)
85
+
86
+ - \`sigil.auth.webauth_tabs_v2\`: component source (\`componentKey: 'sigil.webauth.tabs'\`), targets \`react/json/xml\`.
87
+ - \`sigil.signup.guide_v2\`: BlockNote doc source, targets \`react/markdown/json/xml\`.
88
+
89
+ ### React Rendering
90
+
91
+ Host apps use a \`componentMap\` (e.g., \`'sigil.webauth.tabs' → WebAuthTabs\`) and a BlockNote renderer to turn the React render descriptor into elements.`
92
+ }];
93
+ registerDocBlocks(techContractsDocs);
94
+
95
+ //#endregion
96
+ export { techContractsDocs };
@@ -0,0 +1,41 @@
1
+ import { Stability } from "../ownership.js";
2
+
3
+ //#region src/docs/types.d.ts
4
+ type DocVisibility = 'public' | 'internal' | 'mixed';
5
+ interface DocBlockLink {
6
+ label: string;
7
+ href: string;
8
+ }
9
+ type DocKind = 'goal' | 'how' | 'usage' | 'reference' | 'faq';
10
+ interface DocBlock {
11
+ /** Globally unique identifier (prefer dotted paths like docs.ops.runbook). */
12
+ id: string;
13
+ /** Short, human-readable title. */
14
+ title: string;
15
+ /** Markdown body (LLM- and human-readable). */
16
+ body: string;
17
+ /** Optional one-line summary used for meta.description. */
18
+ summary?: string;
19
+ /** Explicit route (e.g., /docs/ops/anomaly-detection). Falls back to id-derived route. */
20
+ route?: string;
21
+ /** Optional semantic grouping for filtering. */
22
+ kind?: DocKind;
23
+ /** Visibility gate. Defaults to public. */
24
+ visibility?: DocVisibility;
25
+ /** Optional version to allow evolutions without breaking links. Defaults to 1. */
26
+ version?: number;
27
+ /** Tags to aid discovery and filtering. */
28
+ tags?: string[];
29
+ /** Owning teams or individuals. */
30
+ owners?: string[];
31
+ /** Related contract/presentation identifiers. */
32
+ relatedSpecs?: string[];
33
+ /** External references or supporting links. */
34
+ links?: DocBlockLink[];
35
+ /** Domain or bounded context marker. */
36
+ domain?: string;
37
+ /** Stability marker to mirror presentation ownership semantics. */
38
+ stability?: Stability;
39
+ }
40
+ //#endregion
41
+ export { DocBlock, DocBlockLink, DocKind, DocVisibility };
File without changes
@@ -0,0 +1,47 @@
1
+ import { DocId } from "./docs/registry.js";
2
+ import { OwnerShipMeta } from "./ownership.js";
3
+ import { SpecContractRegistry } from "./registry.js";
4
+ import { AnySchemaModel } from "@contractspec/lib.schema";
5
+
6
+ //#region src/events.d.ts
7
+ interface EventSpecMeta extends Omit<OwnerShipMeta, 'docId'> {
8
+ /** Doc block(s) for this operation. */
9
+ docId?: DocId[];
10
+ }
11
+ /**
12
+ * Typed event specification. Declare once, validate payloads at publish time,
13
+ * and guard emissions via the contracts runtime.
14
+ */
15
+ interface EventSpec<T extends AnySchemaModel> {
16
+ meta: EventSpecMeta;
17
+ /** JSON-like paths to redact from logs/exports. */
18
+ pii?: string[];
19
+ /** Event payload schema from @contractspec/lib.schema. */
20
+ payload: T;
21
+ }
22
+ type AnyEventSpec<T extends AnySchemaModel = AnySchemaModel> = EventSpec<T>;
23
+ /** Identity function to keep type inference when declaring events. */
24
+ declare function defineEvent<T extends AnySchemaModel>(e: EventSpec<T>): EventSpec<T>;
25
+ interface EventEnvelope<T> {
26
+ /** Unique identifier for the published event (UUID recommended). */
27
+ id: string;
28
+ /** ISO timestamp when the event occurred. */
29
+ occurredAt: string;
30
+ /** Optional trace identifier for correlating across services. */
31
+ traceId?: string;
32
+ /** Event name as published (should match spec.name). */
33
+ key: string;
34
+ /** Event version as published (should match spec.version). */
35
+ version: number;
36
+ /** Validated payload. */
37
+ payload: T;
38
+ }
39
+ type EventKey = `${string}.v${number}`;
40
+ /** Build a stable string key for an event name/version pair. */
41
+ declare const eventKey: (key: string, version: number) => EventKey;
42
+ /** In-memory registry for EventSpec. */
43
+ declare class EventRegistry extends SpecContractRegistry<'event', AnyEventSpec> {
44
+ constructor(items?: AnyEventSpec[]);
45
+ }
46
+ //#endregion
47
+ export { AnyEventSpec, EventEnvelope, EventKey, EventRegistry, EventSpec, EventSpecMeta, defineEvent, eventKey };
package/dist/events.js ADDED
@@ -0,0 +1,19 @@
1
+ import { SpecContractRegistry } from "./registry.js";
2
+ import "@contractspec/lib.schema";
3
+
4
+ //#region src/events.ts
5
+ /** Identity function to keep type inference when declaring events. */
6
+ function defineEvent(e) {
7
+ return e;
8
+ }
9
+ /** Build a stable string key for an event name/version pair. */
10
+ const eventKey = (key, version) => `${key}.v${version}`;
11
+ /** In-memory registry for EventSpec. */
12
+ var EventRegistry = class extends SpecContractRegistry {
13
+ constructor(items) {
14
+ super("event", items);
15
+ }
16
+ };
17
+
18
+ //#endregion
19
+ export { EventRegistry, defineEvent, eventKey };
@@ -0,0 +1,6 @@
1
+ import { DocBlock } from "@contractspec/lib.contracts/docs";
2
+
3
+ //#region src/experiments/docs/experiments.docblock.d.ts
4
+ declare const tech_contracts_experiments_DocBlocks: DocBlock[];
5
+ //#endregion
6
+ export { tech_contracts_experiments_DocBlocks };
@@ -0,0 +1,21 @@
1
+ import { registerDocBlocks } from "../../docs/registry.js";
2
+
3
+ //#region src/experiments/docs/experiments.docblock.ts
4
+ const tech_contracts_experiments_DocBlocks = [{
5
+ id: "docs.tech.contracts.experiments",
6
+ title: "ExperimentSpec & ExperimentEvaluator",
7
+ summary: "Use experiments to test alternative workflows, data views, or themes with controlled allocations and measurable outcomes.",
8
+ kind: "reference",
9
+ visibility: "public",
10
+ route: "/docs/tech/contracts/experiments",
11
+ tags: [
12
+ "tech",
13
+ "contracts",
14
+ "experiments"
15
+ ],
16
+ body: "# ExperimentSpec & ExperimentEvaluator\n\nUse experiments to test alternative workflows, data views, or themes with controlled allocations and measurable outcomes.\n\n- Types & registry: `packages/libs/contracts/src/experiments/spec.ts`\n- Runtime evaluator: `packages/libs/contracts/src/experiments/evaluator.ts`\n- CLI wizard/template: `contractspec create experiment`\n\n## Structure\n\n```ts\nexport interface ExperimentSpec {\n meta: ExperimentMeta;\n controlVariant: string;\n variants: ExperimentVariant[];\n allocation: AllocationStrategy;\n successMetrics?: SuccessMetric[];\n}\n```\n\n- `variants`: define UI/behavior overrides (data views, workflows, themes, policies)\n- `allocation`:\n - `random`: 50/50 or weighted via `weight`\n - `sticky`: deterministic hash on user/organization/session\n - `targeted`: rule-based (policy + expression + optional percentage)\n- `successMetrics`: telemetry events + aggregation (count/avg/p95) to track outcomes\n\n### Example\n\n```ts\nexport const OnboardingSplitFormExperiment: ExperimentSpec = {\n meta: {\n name: 'sigil.onboarding.split_form',\n version: 1,\n title: 'Split onboarding form',\n description: 'Compare single vs multi-step onboarding',\n domain: 'onboarding',\n owners: ['@team.onboarding'],\n tags: ['experiment'],\n stability: StabilityEnum.Experimental,\n },\n controlVariant: 'control',\n variants: [\n { id: 'control', name: 'Single-step form' },\n {\n id: 'multi_step',\n name: 'Multi-step form',\n overrides: [\n { type: 'workflow', target: 'sigil.onboarding.workflow.multi_step' },\n ],\n },\n ],\n allocation: {\n type: 'targeted',\n rules: [\n {\n variantId: 'multi_step',\n expression: \"context.attributes?.segment === 'vip'\",\n },\n ],\n fallback: 'random',\n },\n successMetrics: [\n {\n name: 'Completion rate',\n telemetryEvent: { name: 'sigil.telemetry.onboarding_completed', version: 1 },\n aggregation: 'count',\n },\n ],\n};\n```\n\n## Variant evaluation\n\n```ts\nconst evaluator = new ExperimentEvaluator({\n registry: experimentRegistry,\n policyChecker: (policyRef, context) =>\n policyEngine.decide({\n action: 'experiment_targeting',\n subject: { roles: context.flags },\n resource: { type: 'experiment', attributes: { name: context.experiment } },\n policies: [policyRef],\n }).effect === 'allow',\n});\n\nconst assignment = await evaluator.chooseVariant({\n experiment: 'sigil.onboarding.split_form',\n userId: ctx.userId,\n organizationId: ctx.organizationId,\n attributes: ctx.attributes,\n});\n\nif (assignment) {\n // Apply overrides for the chosen variant\n applyExperimentOverrides(assignment.variant);\n}\n```\n\n- `random` uses deterministic hashing (`salt` optional) for stable splits\n- `sticky` hashes a specified attribute (userId/orgId/sessionId)\n- `targeted` evaluates rules in order; each rule can reference a PolicySpec and simple JS expressions (`context` input)\n\n## Integrations\n\n- **Feature modules**: `FeatureModuleSpec.experiments` references experiments owned by a module\n- **DataViewSpec / WorkflowSpec**: `experiments?: ExperimentRef[]` indicate which experiments modify the spec\n- **Telemetry**: success metrics reference `TelemetrySpec` events to ensure compliant tracking\n- **Policy**: targeting rules call into `PolicyEngine` via the evaluator callback to respect privacy/security\n\n## CLI workflow\n\n```\ncontractspec create experiment\n```\n\n- Prompts for control/variants, allocation strategy, targeting rules, success metrics\n- Outputs a typed `ExperimentSpec` file alongside your contracts\n\n## Best practices\n\n1. Keep experiments short-lived; increment `meta.version` when changing allocation or variants.\n2. Always declare a control variant and ensure overrides are reversible.\n3. Tie success metrics to privacy-reviewed telemetry events.\n4. Use targeting rules sparingly; combine with PolicySpec to avoid exposing experiments to unauthorized users.\n5. When an experiment wins, promote the variant to the canonical spec and retire the experiment.\n\n"
17
+ }];
18
+ registerDocBlocks(tech_contracts_experiments_DocBlocks);
19
+
20
+ //#endregion
21
+ export { tech_contracts_experiments_DocBlocks };
@@ -0,0 +1,37 @@
1
+ import { PolicyRef } from "../policy/spec.js";
2
+ import { ExperimentRegistry, ExperimentVariant } from "./spec.js";
3
+
4
+ //#region src/experiments/evaluator.d.ts
5
+ interface ExperimentContext {
6
+ experiment: string;
7
+ version?: number;
8
+ userId?: string | null;
9
+ organizationId?: string | null;
10
+ sessionId?: string | null;
11
+ attributes?: Record<string, unknown>;
12
+ flags?: string[];
13
+ }
14
+ interface ExperimentEvaluation {
15
+ variant: ExperimentVariant;
16
+ reason: 'control' | 'random' | 'sticky' | 'targeted';
17
+ }
18
+ interface ExperimentEvaluatorConfig {
19
+ registry: ExperimentRegistry;
20
+ policyChecker?: (policy: PolicyRef, context: ExperimentContext) => Promise<boolean> | boolean;
21
+ expressionEvaluator?: (expression: string, context: ExperimentContext) => boolean;
22
+ }
23
+ declare class ExperimentEvaluator {
24
+ private readonly registry;
25
+ private readonly policyChecker?;
26
+ private readonly expressionEvaluator?;
27
+ constructor(config: ExperimentEvaluatorConfig);
28
+ chooseVariant(context: ExperimentContext): Promise<ExperimentEvaluation | null>;
29
+ private pickByWeight;
30
+ private randomSeed;
31
+ private stickySeed;
32
+ private hashToUnitInterval;
33
+ private evaluateTargeting;
34
+ private matchesRule;
35
+ }
36
+ //#endregion
37
+ export { ExperimentContext, ExperimentEvaluation, ExperimentEvaluator, ExperimentEvaluatorConfig };
@@ -0,0 +1,101 @@
1
+ import { createHash } from "node:crypto";
2
+
3
+ //#region src/experiments/evaluator.ts
4
+ var ExperimentEvaluator = class {
5
+ registry;
6
+ policyChecker;
7
+ expressionEvaluator;
8
+ constructor(config) {
9
+ this.registry = config.registry;
10
+ this.policyChecker = config.policyChecker;
11
+ this.expressionEvaluator = config.expressionEvaluator;
12
+ }
13
+ async chooseVariant(context) {
14
+ const experiment = this.registry.get(context.experiment, context.version);
15
+ if (!experiment) return null;
16
+ const control = experiment.variants.find((variant) => variant.id === experiment.controlVariant);
17
+ if (!control) throw new Error(`Experiment ${experiment.meta.key} missing control variant ${experiment.controlVariant}`);
18
+ switch (experiment.allocation.type) {
19
+ case "random": return {
20
+ variant: this.pickByWeight(experiment, this.randomSeed(context, experiment.allocation.salt)),
21
+ reason: "random"
22
+ };
23
+ case "sticky": return {
24
+ variant: this.pickByWeight(experiment, this.stickySeed(context, experiment.allocation.attribute, experiment.allocation.salt)),
25
+ reason: "sticky"
26
+ };
27
+ case "targeted": {
28
+ const targeted = await this.evaluateTargeting(experiment, context, experiment.allocation.rules);
29
+ if (targeted) return {
30
+ variant: targeted,
31
+ reason: "targeted"
32
+ };
33
+ if (experiment.allocation.fallback === "random") return {
34
+ variant: this.pickByWeight(experiment, this.randomSeed(context)),
35
+ reason: "random"
36
+ };
37
+ return {
38
+ variant: control,
39
+ reason: "control"
40
+ };
41
+ }
42
+ default: return {
43
+ variant: control,
44
+ reason: "control"
45
+ };
46
+ }
47
+ }
48
+ pickByWeight(experiment, seed) {
49
+ const variants = experiment.variants;
50
+ const target = seed * variants.reduce((sum, variant) => sum + (variant.weight ?? 1), 0);
51
+ let cumulative = 0;
52
+ for (const variant of variants) {
53
+ cumulative += variant.weight ?? 1;
54
+ if (target <= cumulative) return variant;
55
+ }
56
+ return variants[variants.length - 1];
57
+ }
58
+ randomSeed(context, salt = "") {
59
+ const base = context.sessionId ?? context.userId ?? context.organizationId ?? `${Date.now()}-${Math.random()}`;
60
+ return this.hashToUnitInterval(base + salt);
61
+ }
62
+ stickySeed(context, attribute, salt = "") {
63
+ const value = context[attribute];
64
+ if (!value) return this.randomSeed(context, salt);
65
+ return this.hashToUnitInterval(`${value}-${salt}`);
66
+ }
67
+ hashToUnitInterval(value) {
68
+ const hash = createHash("sha256").update(value).digest("hex").slice(0, 15);
69
+ return parseInt(hash, 16) % 1e6 / 1e6;
70
+ }
71
+ async evaluateTargeting(experiment, context, rules) {
72
+ for (const rule of rules) {
73
+ if (!await this.matchesRule(rule, context)) continue;
74
+ const variant = experiment.variants.find((v) => v.id === rule.variantId);
75
+ if (!variant) continue;
76
+ if (typeof rule.percentage === "number") {
77
+ if (this.randomSeed(context, `rule-${rule.variantId}`) > rule.percentage) continue;
78
+ }
79
+ return variant;
80
+ }
81
+ return null;
82
+ }
83
+ async matchesRule(rule, context) {
84
+ if (rule.policy && this.policyChecker) {
85
+ if (!await this.policyChecker(rule.policy, context)) return false;
86
+ }
87
+ if (rule.expression) {
88
+ if (this.expressionEvaluator) return Boolean(this.expressionEvaluator(rule.expression, context));
89
+ try {
90
+ const fn = new Function("context", `return (${rule.expression});`);
91
+ return Boolean(fn(context));
92
+ } catch (_error) {
93
+ return false;
94
+ }
95
+ }
96
+ return true;
97
+ }
98
+ };
99
+
100
+ //#endregion
101
+ export { ExperimentEvaluator };
@@ -0,0 +1,17 @@
1
+ import { ResourceRefDescriptor } from "../resources.js";
2
+ import { HandlerCtx } from "../types.js";
3
+ import { OpKind, OperationSpec } from "../operations/operation.js";
4
+ import "../operations/index.js";
5
+ import { AnySchemaModel } from "@contractspec/lib.schema";
6
+
7
+ //#region src/experiments/spec-resolver.d.ts
8
+ type RuntimeContract = OperationSpec<AnySchemaModel, AnySchemaModel | ResourceRefDescriptor<boolean>>;
9
+ interface SpecVariantResolver {
10
+ resolve(operation: {
11
+ name: string;
12
+ version: number;
13
+ kind: OpKind;
14
+ }, ctx: HandlerCtx): Promise<RuntimeContract | undefined> | RuntimeContract | undefined;
15
+ }
16
+ //#endregion
17
+ export { RuntimeContract, SpecVariantResolver };
File without changes
@@ -0,0 +1,82 @@
1
+ import { OwnerShipMeta } from "../ownership.js";
2
+ import { PolicyRef } from "../policy/spec.js";
3
+ import { TelemetryEventDef } from "../telemetry/spec.js";
4
+
5
+ //#region src/experiments/spec.d.ts
6
+ type ExperimentMeta = OwnerShipMeta;
7
+ interface ExperimentRef {
8
+ key: string;
9
+ version?: number;
10
+ }
11
+ type ExperimentOverrideType = 'dataView' | 'workflow' | 'theme' | 'policy' | 'presentation';
12
+ interface ExperimentOverride {
13
+ type: ExperimentOverrideType;
14
+ /** Target spec meta name (e.g., DataViewspec.meta.key). */
15
+ target: string;
16
+ /** Target version. Optional; evaluator may choose latest when omitted. */
17
+ version?: number;
18
+ /** Optional configuration applied when this variant is active. */
19
+ config?: Record<string, unknown>;
20
+ }
21
+ interface ExperimentVariant {
22
+ id: string;
23
+ key: string;
24
+ description?: string;
25
+ /** Relative weight for random allocation (defaults to 1). */
26
+ weight?: number;
27
+ overrides?: ExperimentOverride[];
28
+ /** Optional metadata for downstream analytics/UI. */
29
+ metadata?: Record<string, unknown>;
30
+ }
31
+ interface TargetingRule {
32
+ /** Variant to assign when rule matches. */
33
+ variantId: string;
34
+ /** Optional percentage of matching traffic (0-1). If omitted, 100%. */
35
+ percentage?: number;
36
+ /** Policies that must allow the assignment. */
37
+ policy?: PolicyRef;
38
+ /** Expression evaluated against context (see evaluator for details). */
39
+ expression?: string;
40
+ }
41
+ type AllocationStrategy = {
42
+ type: 'random';
43
+ /** Optional salt for deterministic hashing. */
44
+ salt?: string;
45
+ } | {
46
+ type: 'sticky';
47
+ /** Which attribute to hash for sticky assignment. */
48
+ attribute: 'userId' | 'organizationId' | 'sessionId';
49
+ salt?: string;
50
+ } | {
51
+ type: 'targeted';
52
+ rules: TargetingRule[];
53
+ fallback?: 'control' | 'random';
54
+ };
55
+ type MetricAggregation = 'count' | 'avg' | 'p75' | 'p90' | 'p95' | 'p99';
56
+ interface SuccessMetric {
57
+ key: string;
58
+ telemetryEvent: {
59
+ key: TelemetryEventDef['key'];
60
+ version: number;
61
+ };
62
+ aggregation: MetricAggregation;
63
+ target?: number;
64
+ }
65
+ interface ExperimentSpec {
66
+ meta: ExperimentMeta;
67
+ /** Identifier of the control variant (must exist in variants array). */
68
+ controlVariant: string;
69
+ variants: ExperimentVariant[];
70
+ allocation: AllocationStrategy;
71
+ successMetrics?: SuccessMetric[];
72
+ tags?: string[];
73
+ }
74
+ declare class ExperimentRegistry {
75
+ private readonly items;
76
+ register(spec: ExperimentSpec): this;
77
+ list(): ExperimentSpec[];
78
+ get(name: string, version?: number): ExperimentSpec | undefined;
79
+ }
80
+ declare function makeExperimentKey(meta: ExperimentMeta): string;
81
+ //#endregion
82
+ export { AllocationStrategy, ExperimentMeta, ExperimentOverride, ExperimentOverrideType, ExperimentRef, ExperimentRegistry, ExperimentSpec, ExperimentVariant, MetricAggregation, SuccessMetric, TargetingRule, makeExperimentKey };
@@ -0,0 +1,33 @@
1
+ //#region src/experiments/spec.ts
2
+ const experimentKey = (meta) => `${meta.key}.v${meta.version}`;
3
+ var ExperimentRegistry = class {
4
+ items = /* @__PURE__ */ new Map();
5
+ register(spec) {
6
+ const key = experimentKey(spec.meta);
7
+ if (this.items.has(key)) throw new Error(`Duplicate experiment ${key}`);
8
+ this.items.set(key, spec);
9
+ return this;
10
+ }
11
+ list() {
12
+ return [...this.items.values()];
13
+ }
14
+ get(name, version) {
15
+ if (version != null) return this.items.get(`${name}.v${version}`);
16
+ let latest;
17
+ let maxVersion = -Infinity;
18
+ for (const spec of this.items.values()) {
19
+ if (spec.meta.key !== name) continue;
20
+ if (spec.meta.version > maxVersion) {
21
+ maxVersion = spec.meta.version;
22
+ latest = spec;
23
+ }
24
+ }
25
+ return latest;
26
+ }
27
+ };
28
+ function makeExperimentKey(meta) {
29
+ return experimentKey(meta);
30
+ }
31
+
32
+ //#endregion
33
+ export { ExperimentRegistry, makeExperimentKey };
@@ -0,0 +1,5 @@
1
+ import { EventRef, FeatureModuleMeta, FeatureModuleSpec, FeatureRef, OpRef, PresentationRef } from "./types.js";
2
+ import { FeatureRegistry } from "./registry.js";
3
+ import { InstallFeatureDeps, installFeature } from "./install.js";
4
+ import { validateFeatureTargetsV2 } from "./validation.js";
5
+ export { type EventRef, type FeatureModuleMeta, type FeatureModuleSpec, type FeatureRef, FeatureRegistry, type InstallFeatureDeps, type OpRef, type PresentationRef, installFeature, validateFeatureTargetsV2 };
@@ -0,0 +1,5 @@
1
+ import { FeatureRegistry } from "./registry.js";
2
+ import { installFeature } from "./install.js";
3
+ import { validateFeatureTargetsV2 } from "./validation.js";
4
+
5
+ export { FeatureRegistry, installFeature, validateFeatureTargetsV2 };