@lssm/lib.contracts 0.0.0-canary-20251120170226

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 (623) hide show
  1. package/README.md +98 -0
  2. package/dist/app-config/branding.d.ts +56 -0
  3. package/dist/app-config/branding.d.ts.map +1 -0
  4. package/dist/app-config/branding.js +0 -0
  5. package/dist/app-config/contracts.d.ts +245 -0
  6. package/dist/app-config/contracts.d.ts.map +1 -0
  7. package/dist/app-config/contracts.js +2 -0
  8. package/dist/app-config/contracts.js.map +1 -0
  9. package/dist/app-config/events.d.ts +123 -0
  10. package/dist/app-config/events.d.ts.map +1 -0
  11. package/dist/app-config/events.js +2 -0
  12. package/dist/app-config/events.js.map +1 -0
  13. package/dist/app-config/index.d.ts +8 -0
  14. package/dist/app-config/index.js +1 -0
  15. package/dist/app-config/lifecycle-contracts.d.ts +383 -0
  16. package/dist/app-config/lifecycle-contracts.d.ts.map +1 -0
  17. package/dist/app-config/lifecycle-contracts.js +2 -0
  18. package/dist/app-config/lifecycle-contracts.js.map +1 -0
  19. package/dist/app-config/lifecycle.d.ts +28 -0
  20. package/dist/app-config/lifecycle.d.ts.map +1 -0
  21. package/dist/app-config/lifecycle.js +0 -0
  22. package/dist/app-config/runtime.d.ts +115 -0
  23. package/dist/app-config/runtime.d.ts.map +1 -0
  24. package/dist/app-config/runtime.js +2 -0
  25. package/dist/app-config/runtime.js.map +1 -0
  26. package/dist/app-config/spec.d.ts +176 -0
  27. package/dist/app-config/spec.d.ts.map +1 -0
  28. package/dist/app-config/spec.js +2 -0
  29. package/dist/app-config/spec.js.map +1 -0
  30. package/dist/app-config/validation.d.ts +48 -0
  31. package/dist/app-config/validation.d.ts.map +1 -0
  32. package/dist/app-config/validation.js +2 -0
  33. package/dist/app-config/validation.js.map +1 -0
  34. package/dist/capabilities/openbanking.d.ts +10 -0
  35. package/dist/capabilities/openbanking.d.ts.map +1 -0
  36. package/dist/capabilities/openbanking.js +2 -0
  37. package/dist/capabilities/openbanking.js.map +1 -0
  38. package/dist/capabilities.d.ts +45 -0
  39. package/dist/capabilities.d.ts.map +1 -0
  40. package/dist/capabilities.js +2 -0
  41. package/dist/capabilities.js.map +1 -0
  42. package/dist/client/index.d.ts +6 -0
  43. package/dist/client/index.js +1 -0
  44. package/dist/client/react/drivers/rn-reusables.d.ts +23 -0
  45. package/dist/client/react/drivers/rn-reusables.d.ts.map +1 -0
  46. package/dist/client/react/drivers/rn-reusables.js +2 -0
  47. package/dist/client/react/drivers/rn-reusables.js.map +1 -0
  48. package/dist/client/react/drivers/shadcn.d.ts +13 -0
  49. package/dist/client/react/drivers/shadcn.d.ts.map +1 -0
  50. package/dist/client/react/drivers/shadcn.js +2 -0
  51. package/dist/client/react/drivers/shadcn.js.map +1 -0
  52. package/dist/client/react/feature-render.d.ts +21 -0
  53. package/dist/client/react/feature-render.d.ts.map +1 -0
  54. package/dist/client/react/feature-render.js +2 -0
  55. package/dist/client/react/feature-render.js.map +1 -0
  56. package/dist/client/react/form-render.d.ts +92 -0
  57. package/dist/client/react/form-render.d.ts.map +1 -0
  58. package/dist/client/react/form-render.js +2 -0
  59. package/dist/client/react/form-render.js.map +1 -0
  60. package/dist/client/react/index.d.ts +5 -0
  61. package/dist/client/react/index.js +1 -0
  62. package/dist/contracts-adapter-hydration.d.ts +16 -0
  63. package/dist/contracts-adapter-hydration.d.ts.map +1 -0
  64. package/dist/contracts-adapter-hydration.js +2 -0
  65. package/dist/contracts-adapter-hydration.js.map +1 -0
  66. package/dist/contracts-adapter-input.d.ts +11 -0
  67. package/dist/contracts-adapter-input.d.ts.map +1 -0
  68. package/dist/contracts-adapter-input.js +2 -0
  69. package/dist/contracts-adapter-input.js.map +1 -0
  70. package/dist/data-views/query-generator.d.ts +40 -0
  71. package/dist/data-views/query-generator.d.ts.map +1 -0
  72. package/dist/data-views/query-generator.js +2 -0
  73. package/dist/data-views/query-generator.js.map +1 -0
  74. package/dist/data-views/runtime.d.ts +27 -0
  75. package/dist/data-views/runtime.d.ts.map +1 -0
  76. package/dist/data-views/runtime.js +2 -0
  77. package/dist/data-views/runtime.js.map +1 -0
  78. package/dist/data-views.d.ts +132 -0
  79. package/dist/data-views.d.ts.map +1 -0
  80. package/dist/data-views.js +2 -0
  81. package/dist/data-views.js.map +1 -0
  82. package/dist/events.d.ts +45 -0
  83. package/dist/events.d.ts.map +1 -0
  84. package/dist/events.js +2 -0
  85. package/dist/events.js.map +1 -0
  86. package/dist/experiments/evaluator.d.ts +38 -0
  87. package/dist/experiments/evaluator.d.ts.map +1 -0
  88. package/dist/experiments/evaluator.js +2 -0
  89. package/dist/experiments/evaluator.js.map +1 -0
  90. package/dist/experiments/spec.d.ts +90 -0
  91. package/dist/experiments/spec.d.ts.map +1 -0
  92. package/dist/experiments/spec.js +2 -0
  93. package/dist/experiments/spec.js.map +1 -0
  94. package/dist/features.d.ts +88 -0
  95. package/dist/features.d.ts.map +1 -0
  96. package/dist/features.js +2 -0
  97. package/dist/features.js.map +1 -0
  98. package/dist/forms.d.ts +259 -0
  99. package/dist/forms.d.ts.map +1 -0
  100. package/dist/forms.js +2 -0
  101. package/dist/forms.js.map +1 -0
  102. package/dist/graphql-federation/dist/index.js +2 -0
  103. package/dist/graphql-federation/dist/index.js.map +1 -0
  104. package/dist/index.d.ts +129 -0
  105. package/dist/index.js +1 -0
  106. package/dist/install.d.ts +77 -0
  107. package/dist/install.d.ts.map +1 -0
  108. package/dist/install.js +2 -0
  109. package/dist/install.js.map +1 -0
  110. package/dist/integrations/binding.d.ts +18 -0
  111. package/dist/integrations/binding.d.ts.map +1 -0
  112. package/dist/integrations/binding.js +0 -0
  113. package/dist/integrations/connection.d.ts +52 -0
  114. package/dist/integrations/connection.d.ts.map +1 -0
  115. package/dist/integrations/connection.js +0 -0
  116. package/dist/integrations/contracts.d.ts +436 -0
  117. package/dist/integrations/contracts.d.ts.map +1 -0
  118. package/dist/integrations/contracts.js +2 -0
  119. package/dist/integrations/contracts.js.map +1 -0
  120. package/dist/integrations/health.d.ts +22 -0
  121. package/dist/integrations/health.d.ts.map +1 -0
  122. package/dist/integrations/health.js +2 -0
  123. package/dist/integrations/health.js.map +1 -0
  124. package/dist/integrations/index.d.ts +53 -0
  125. package/dist/integrations/index.js +1 -0
  126. package/dist/integrations/openbanking/contracts/accounts.d.ts +288 -0
  127. package/dist/integrations/openbanking/contracts/accounts.d.ts.map +1 -0
  128. package/dist/integrations/openbanking/contracts/accounts.js +2 -0
  129. package/dist/integrations/openbanking/contracts/accounts.js.map +1 -0
  130. package/dist/integrations/openbanking/contracts/balances.d.ts +164 -0
  131. package/dist/integrations/openbanking/contracts/balances.d.ts.map +1 -0
  132. package/dist/integrations/openbanking/contracts/balances.js +2 -0
  133. package/dist/integrations/openbanking/contracts/balances.js.map +1 -0
  134. package/dist/integrations/openbanking/contracts/index.d.ts +10 -0
  135. package/dist/integrations/openbanking/contracts/index.d.ts.map +1 -0
  136. package/dist/integrations/openbanking/contracts/index.js +2 -0
  137. package/dist/integrations/openbanking/contracts/index.js.map +1 -0
  138. package/dist/integrations/openbanking/contracts/transactions.d.ts +212 -0
  139. package/dist/integrations/openbanking/contracts/transactions.d.ts.map +1 -0
  140. package/dist/integrations/openbanking/contracts/transactions.js +2 -0
  141. package/dist/integrations/openbanking/contracts/transactions.js.map +1 -0
  142. package/dist/integrations/openbanking/guards.d.ts +13 -0
  143. package/dist/integrations/openbanking/guards.d.ts.map +1 -0
  144. package/dist/integrations/openbanking/guards.js +2 -0
  145. package/dist/integrations/openbanking/guards.js.map +1 -0
  146. package/dist/integrations/openbanking/models.d.ts +229 -0
  147. package/dist/integrations/openbanking/models.d.ts.map +1 -0
  148. package/dist/integrations/openbanking/models.js +2 -0
  149. package/dist/integrations/openbanking/models.js.map +1 -0
  150. package/dist/integrations/openbanking/telemetry.d.ts +16 -0
  151. package/dist/integrations/openbanking/telemetry.d.ts.map +1 -0
  152. package/dist/integrations/openbanking/telemetry.js +2 -0
  153. package/dist/integrations/openbanking/telemetry.js.map +1 -0
  154. package/dist/integrations/providers/calendar.d.ts +79 -0
  155. package/dist/integrations/providers/calendar.d.ts.map +1 -0
  156. package/dist/integrations/providers/calendar.js +0 -0
  157. package/dist/integrations/providers/elevenlabs.d.ts +8 -0
  158. package/dist/integrations/providers/elevenlabs.d.ts.map +1 -0
  159. package/dist/integrations/providers/elevenlabs.js +2 -0
  160. package/dist/integrations/providers/elevenlabs.js.map +1 -0
  161. package/dist/integrations/providers/email.d.ts +87 -0
  162. package/dist/integrations/providers/email.d.ts.map +1 -0
  163. package/dist/integrations/providers/email.js +0 -0
  164. package/dist/integrations/providers/embedding.d.ts +25 -0
  165. package/dist/integrations/providers/embedding.d.ts.map +1 -0
  166. package/dist/integrations/providers/embedding.js +0 -0
  167. package/dist/integrations/providers/gcs-storage.d.ts +8 -0
  168. package/dist/integrations/providers/gcs-storage.d.ts.map +1 -0
  169. package/dist/integrations/providers/gcs-storage.js +2 -0
  170. package/dist/integrations/providers/gcs-storage.js.map +1 -0
  171. package/dist/integrations/providers/gmail.d.ts +8 -0
  172. package/dist/integrations/providers/gmail.d.ts.map +1 -0
  173. package/dist/integrations/providers/gmail.js +2 -0
  174. package/dist/integrations/providers/gmail.js.map +1 -0
  175. package/dist/integrations/providers/google-calendar.d.ts +8 -0
  176. package/dist/integrations/providers/google-calendar.d.ts.map +1 -0
  177. package/dist/integrations/providers/google-calendar.js +2 -0
  178. package/dist/integrations/providers/google-calendar.js.map +1 -0
  179. package/dist/integrations/providers/impls/elevenlabs-voice.d.ts +21 -0
  180. package/dist/integrations/providers/impls/elevenlabs-voice.d.ts.map +1 -0
  181. package/dist/integrations/providers/impls/elevenlabs-voice.js +2 -0
  182. package/dist/integrations/providers/impls/elevenlabs-voice.js.map +1 -0
  183. package/dist/integrations/providers/impls/gcs-storage.d.ts +25 -0
  184. package/dist/integrations/providers/impls/gcs-storage.d.ts.map +1 -0
  185. package/dist/integrations/providers/impls/gcs-storage.js +2 -0
  186. package/dist/integrations/providers/impls/gcs-storage.js.map +1 -0
  187. package/dist/integrations/providers/impls/gmail-inbound.d.ts +27 -0
  188. package/dist/integrations/providers/impls/gmail-inbound.d.ts.map +1 -0
  189. package/dist/integrations/providers/impls/gmail-inbound.js +2 -0
  190. package/dist/integrations/providers/impls/gmail-inbound.js.map +1 -0
  191. package/dist/integrations/providers/impls/gmail-outbound.d.ts +19 -0
  192. package/dist/integrations/providers/impls/gmail-outbound.d.ts.map +1 -0
  193. package/dist/integrations/providers/impls/gmail-outbound.js +7 -0
  194. package/dist/integrations/providers/impls/gmail-outbound.js.map +1 -0
  195. package/dist/integrations/providers/impls/google-calendar.d.ts +24 -0
  196. package/dist/integrations/providers/impls/google-calendar.d.ts.map +1 -0
  197. package/dist/integrations/providers/impls/google-calendar.js +2 -0
  198. package/dist/integrations/providers/impls/google-calendar.js.map +1 -0
  199. package/dist/integrations/providers/impls/index.d.ts +15 -0
  200. package/dist/integrations/providers/impls/index.js +1 -0
  201. package/dist/integrations/providers/impls/mistral-embedding.d.ts +24 -0
  202. package/dist/integrations/providers/impls/mistral-embedding.d.ts.map +1 -0
  203. package/dist/integrations/providers/impls/mistral-embedding.js +2 -0
  204. package/dist/integrations/providers/impls/mistral-embedding.js.map +1 -0
  205. package/dist/integrations/providers/impls/mistral-llm.d.ts +32 -0
  206. package/dist/integrations/providers/impls/mistral-llm.d.ts.map +1 -0
  207. package/dist/integrations/providers/impls/mistral-llm.js +2 -0
  208. package/dist/integrations/providers/impls/mistral-llm.js.map +1 -0
  209. package/dist/integrations/providers/impls/postmark-email.d.ts +20 -0
  210. package/dist/integrations/providers/impls/postmark-email.d.ts.map +1 -0
  211. package/dist/integrations/providers/impls/postmark-email.js +2 -0
  212. package/dist/integrations/providers/impls/postmark-email.js.map +1 -0
  213. package/dist/integrations/providers/impls/powens-client.d.ts +125 -0
  214. package/dist/integrations/providers/impls/powens-client.d.ts.map +1 -0
  215. package/dist/integrations/providers/impls/powens-client.js +2 -0
  216. package/dist/integrations/providers/impls/powens-client.js.map +1 -0
  217. package/dist/integrations/providers/impls/powens-openbanking.d.ts +28 -0
  218. package/dist/integrations/providers/impls/powens-openbanking.d.ts.map +1 -0
  219. package/dist/integrations/providers/impls/powens-openbanking.js +2 -0
  220. package/dist/integrations/providers/impls/powens-openbanking.js.map +1 -0
  221. package/dist/integrations/providers/impls/provider-factory.d.ts +27 -0
  222. package/dist/integrations/providers/impls/provider-factory.d.ts.map +1 -0
  223. package/dist/integrations/providers/impls/provider-factory.js +2 -0
  224. package/dist/integrations/providers/impls/provider-factory.js.map +1 -0
  225. package/dist/integrations/providers/impls/qdrant-vector.d.ts +25 -0
  226. package/dist/integrations/providers/impls/qdrant-vector.d.ts.map +1 -0
  227. package/dist/integrations/providers/impls/qdrant-vector.js +2 -0
  228. package/dist/integrations/providers/impls/qdrant-vector.js.map +1 -0
  229. package/dist/integrations/providers/impls/stripe-payments.d.ts +29 -0
  230. package/dist/integrations/providers/impls/stripe-payments.d.ts.map +1 -0
  231. package/dist/integrations/providers/impls/stripe-payments.js +2 -0
  232. package/dist/integrations/providers/impls/stripe-payments.js.map +1 -0
  233. package/dist/integrations/providers/impls/twilio-sms.d.ts +21 -0
  234. package/dist/integrations/providers/impls/twilio-sms.d.ts.map +1 -0
  235. package/dist/integrations/providers/impls/twilio-sms.js +2 -0
  236. package/dist/integrations/providers/impls/twilio-sms.js.map +1 -0
  237. package/dist/integrations/providers/index.d.ts +36 -0
  238. package/dist/integrations/providers/index.js +1 -0
  239. package/dist/integrations/providers/llm.d.ts +83 -0
  240. package/dist/integrations/providers/llm.d.ts.map +1 -0
  241. package/dist/integrations/providers/llm.js +0 -0
  242. package/dist/integrations/providers/mistral.d.ts +8 -0
  243. package/dist/integrations/providers/mistral.d.ts.map +1 -0
  244. package/dist/integrations/providers/mistral.js +2 -0
  245. package/dist/integrations/providers/mistral.js.map +1 -0
  246. package/dist/integrations/providers/openbanking.d.ts +129 -0
  247. package/dist/integrations/providers/openbanking.d.ts.map +1 -0
  248. package/dist/integrations/providers/openbanking.js +0 -0
  249. package/dist/integrations/providers/payments.d.ts +110 -0
  250. package/dist/integrations/providers/payments.d.ts.map +1 -0
  251. package/dist/integrations/providers/payments.js +0 -0
  252. package/dist/integrations/providers/postmark.d.ts +8 -0
  253. package/dist/integrations/providers/postmark.d.ts.map +1 -0
  254. package/dist/integrations/providers/postmark.js +2 -0
  255. package/dist/integrations/providers/postmark.js.map +1 -0
  256. package/dist/integrations/providers/powens.d.ts +8 -0
  257. package/dist/integrations/providers/powens.d.ts.map +1 -0
  258. package/dist/integrations/providers/powens.js +2 -0
  259. package/dist/integrations/providers/powens.js.map +1 -0
  260. package/dist/integrations/providers/qdrant.d.ts +8 -0
  261. package/dist/integrations/providers/qdrant.d.ts.map +1 -0
  262. package/dist/integrations/providers/qdrant.js +2 -0
  263. package/dist/integrations/providers/qdrant.js.map +1 -0
  264. package/dist/integrations/providers/sms.d.ts +35 -0
  265. package/dist/integrations/providers/sms.d.ts.map +1 -0
  266. package/dist/integrations/providers/sms.js +0 -0
  267. package/dist/integrations/providers/storage.d.ts +61 -0
  268. package/dist/integrations/providers/storage.d.ts.map +1 -0
  269. package/dist/integrations/providers/storage.js +0 -0
  270. package/dist/integrations/providers/stripe.d.ts +8 -0
  271. package/dist/integrations/providers/stripe.d.ts.map +1 -0
  272. package/dist/integrations/providers/stripe.js +2 -0
  273. package/dist/integrations/providers/stripe.js.map +1 -0
  274. package/dist/integrations/providers/twilio-sms.d.ts +8 -0
  275. package/dist/integrations/providers/twilio-sms.d.ts.map +1 -0
  276. package/dist/integrations/providers/twilio-sms.js +2 -0
  277. package/dist/integrations/providers/twilio-sms.js.map +1 -0
  278. package/dist/integrations/providers/vector-store.d.ts +44 -0
  279. package/dist/integrations/providers/vector-store.d.ts.map +1 -0
  280. package/dist/integrations/providers/vector-store.js +0 -0
  281. package/dist/integrations/providers/voice.d.ts +35 -0
  282. package/dist/integrations/providers/voice.d.ts.map +1 -0
  283. package/dist/integrations/providers/voice.js +0 -0
  284. package/dist/integrations/runtime.d.ts +100 -0
  285. package/dist/integrations/runtime.d.ts.map +1 -0
  286. package/dist/integrations/runtime.js +2 -0
  287. package/dist/integrations/runtime.js.map +1 -0
  288. package/dist/integrations/secrets/env-secret-provider.d.ts +32 -0
  289. package/dist/integrations/secrets/env-secret-provider.d.ts.map +1 -0
  290. package/dist/integrations/secrets/env-secret-provider.js +2 -0
  291. package/dist/integrations/secrets/env-secret-provider.js.map +1 -0
  292. package/dist/integrations/secrets/gcp-secret-manager.d.ts +33 -0
  293. package/dist/integrations/secrets/gcp-secret-manager.d.ts.map +1 -0
  294. package/dist/integrations/secrets/gcp-secret-manager.js +2 -0
  295. package/dist/integrations/secrets/gcp-secret-manager.js.map +1 -0
  296. package/dist/integrations/secrets/index.d.ts +5 -0
  297. package/dist/integrations/secrets/index.js +1 -0
  298. package/dist/integrations/secrets/manager.d.ts +48 -0
  299. package/dist/integrations/secrets/manager.d.ts.map +1 -0
  300. package/dist/integrations/secrets/manager.js +2 -0
  301. package/dist/integrations/secrets/manager.js.map +1 -0
  302. package/dist/integrations/secrets/provider.d.ts +53 -0
  303. package/dist/integrations/secrets/provider.d.ts.map +1 -0
  304. package/dist/integrations/secrets/provider.js +2 -0
  305. package/dist/integrations/secrets/provider.js.map +1 -0
  306. package/dist/integrations/spec.d.ts +80 -0
  307. package/dist/integrations/spec.d.ts.map +1 -0
  308. package/dist/integrations/spec.js +2 -0
  309. package/dist/integrations/spec.js.map +1 -0
  310. package/dist/jobs/gcp-cloud-tasks.d.ts +42 -0
  311. package/dist/jobs/gcp-cloud-tasks.d.ts.map +1 -0
  312. package/dist/jobs/gcp-cloud-tasks.js +2 -0
  313. package/dist/jobs/gcp-cloud-tasks.js.map +1 -0
  314. package/dist/jobs/gcp-pubsub.d.ts +26 -0
  315. package/dist/jobs/gcp-pubsub.d.ts.map +1 -0
  316. package/dist/jobs/gcp-pubsub.js +2 -0
  317. package/dist/jobs/gcp-pubsub.js.map +1 -0
  318. package/dist/jobs/handlers/gmail-sync-handler.d.ts +10 -0
  319. package/dist/jobs/handlers/gmail-sync-handler.d.ts.map +1 -0
  320. package/dist/jobs/handlers/gmail-sync-handler.js +2 -0
  321. package/dist/jobs/handlers/gmail-sync-handler.js.map +1 -0
  322. package/dist/jobs/handlers/index.d.ts +3 -0
  323. package/dist/jobs/handlers/index.js +1 -0
  324. package/dist/jobs/handlers/storage-document-handler.d.ts +13 -0
  325. package/dist/jobs/handlers/storage-document-handler.d.ts.map +1 -0
  326. package/dist/jobs/handlers/storage-document-handler.js +2 -0
  327. package/dist/jobs/handlers/storage-document-handler.js.map +1 -0
  328. package/dist/jobs/index.d.ts +7 -0
  329. package/dist/jobs/index.js +1 -0
  330. package/dist/jobs/memory-queue.d.ts +19 -0
  331. package/dist/jobs/memory-queue.d.ts.map +1 -0
  332. package/dist/jobs/memory-queue.js +2 -0
  333. package/dist/jobs/memory-queue.js.map +1 -0
  334. package/dist/jobs/queue.d.ts +27 -0
  335. package/dist/jobs/queue.d.ts.map +1 -0
  336. package/dist/jobs/queue.js +0 -0
  337. package/dist/jsonschema.d.ts +27 -0
  338. package/dist/jsonschema.d.ts.map +1 -0
  339. package/dist/jsonschema.js +2 -0
  340. package/dist/jsonschema.js.map +1 -0
  341. package/dist/knowledge/binding.d.ts +26 -0
  342. package/dist/knowledge/binding.d.ts.map +1 -0
  343. package/dist/knowledge/binding.js +0 -0
  344. package/dist/knowledge/contracts.d.ts +317 -0
  345. package/dist/knowledge/contracts.d.ts.map +1 -0
  346. package/dist/knowledge/contracts.js +2 -0
  347. package/dist/knowledge/contracts.js.map +1 -0
  348. package/dist/knowledge/index.d.ts +10 -0
  349. package/dist/knowledge/index.js +1 -0
  350. package/dist/knowledge/ingestion/document-processor.d.ts +25 -0
  351. package/dist/knowledge/ingestion/document-processor.d.ts.map +1 -0
  352. package/dist/knowledge/ingestion/document-processor.js +2 -0
  353. package/dist/knowledge/ingestion/document-processor.js.map +1 -0
  354. package/dist/knowledge/ingestion/embedding-service.d.ts +13 -0
  355. package/dist/knowledge/ingestion/embedding-service.d.ts.map +1 -0
  356. package/dist/knowledge/ingestion/embedding-service.js +2 -0
  357. package/dist/knowledge/ingestion/embedding-service.js.map +1 -0
  358. package/dist/knowledge/ingestion/gmail-adapter.d.ts +19 -0
  359. package/dist/knowledge/ingestion/gmail-adapter.d.ts.map +1 -0
  360. package/dist/knowledge/ingestion/gmail-adapter.js +7 -0
  361. package/dist/knowledge/ingestion/gmail-adapter.js.map +1 -0
  362. package/dist/knowledge/ingestion/index.d.ts +6 -0
  363. package/dist/knowledge/ingestion/index.js +1 -0
  364. package/dist/knowledge/ingestion/storage-adapter.d.ts +16 -0
  365. package/dist/knowledge/ingestion/storage-adapter.d.ts.map +1 -0
  366. package/dist/knowledge/ingestion/storage-adapter.js +2 -0
  367. package/dist/knowledge/ingestion/storage-adapter.js.map +1 -0
  368. package/dist/knowledge/ingestion/vector-indexer.d.ts +19 -0
  369. package/dist/knowledge/ingestion/vector-indexer.d.ts.map +1 -0
  370. package/dist/knowledge/ingestion/vector-indexer.js +2 -0
  371. package/dist/knowledge/ingestion/vector-indexer.js.map +1 -0
  372. package/dist/knowledge/query/index.d.ts +2 -0
  373. package/dist/knowledge/query/index.js +1 -0
  374. package/dist/knowledge/query/service.d.ts +30 -0
  375. package/dist/knowledge/query/service.d.ts.map +1 -0
  376. package/dist/knowledge/query/service.js +4 -0
  377. package/dist/knowledge/query/service.js.map +1 -0
  378. package/dist/knowledge/runtime.d.ts +33 -0
  379. package/dist/knowledge/runtime.d.ts.map +1 -0
  380. package/dist/knowledge/runtime.js +2 -0
  381. package/dist/knowledge/runtime.js.map +1 -0
  382. package/dist/knowledge/source.d.ts +33 -0
  383. package/dist/knowledge/source.d.ts.map +1 -0
  384. package/dist/knowledge/source.js +0 -0
  385. package/dist/knowledge/spaces/email-threads.d.ts +8 -0
  386. package/dist/knowledge/spaces/email-threads.d.ts.map +1 -0
  387. package/dist/knowledge/spaces/email-threads.js +2 -0
  388. package/dist/knowledge/spaces/email-threads.js.map +1 -0
  389. package/dist/knowledge/spaces/financial-docs.d.ts +8 -0
  390. package/dist/knowledge/spaces/financial-docs.d.ts.map +1 -0
  391. package/dist/knowledge/spaces/financial-docs.js +2 -0
  392. package/dist/knowledge/spaces/financial-docs.js.map +1 -0
  393. package/dist/knowledge/spaces/financial-overview.d.ts +8 -0
  394. package/dist/knowledge/spaces/financial-overview.d.ts.map +1 -0
  395. package/dist/knowledge/spaces/financial-overview.js +2 -0
  396. package/dist/knowledge/spaces/financial-overview.js.map +1 -0
  397. package/dist/knowledge/spaces/index.d.ts +7 -0
  398. package/dist/knowledge/spaces/index.js +1 -0
  399. package/dist/knowledge/spaces/product-canon.d.ts +8 -0
  400. package/dist/knowledge/spaces/product-canon.d.ts.map +1 -0
  401. package/dist/knowledge/spaces/product-canon.js +2 -0
  402. package/dist/knowledge/spaces/product-canon.js.map +1 -0
  403. package/dist/knowledge/spaces/support-faq.d.ts +8 -0
  404. package/dist/knowledge/spaces/support-faq.d.ts.map +1 -0
  405. package/dist/knowledge/spaces/support-faq.js +2 -0
  406. package/dist/knowledge/spaces/support-faq.js.map +1 -0
  407. package/dist/knowledge/spaces/uploaded-docs.d.ts +8 -0
  408. package/dist/knowledge/spaces/uploaded-docs.d.ts.map +1 -0
  409. package/dist/knowledge/spaces/uploaded-docs.js +2 -0
  410. package/dist/knowledge/spaces/uploaded-docs.js.map +1 -0
  411. package/dist/knowledge/spec.d.ts +53 -0
  412. package/dist/knowledge/spec.d.ts.map +1 -0
  413. package/dist/knowledge/spec.js +2 -0
  414. package/dist/knowledge/spec.js.map +1 -0
  415. package/dist/markdown.d.ts +22 -0
  416. package/dist/markdown.d.ts.map +1 -0
  417. package/dist/markdown.js +4 -0
  418. package/dist/markdown.js.map +1 -0
  419. package/dist/migrations.d.ts +53 -0
  420. package/dist/migrations.d.ts.map +1 -0
  421. package/dist/migrations.js +2 -0
  422. package/dist/migrations.js.map +1 -0
  423. package/dist/onboarding-base.d.ts +138 -0
  424. package/dist/onboarding-base.d.ts.map +1 -0
  425. package/dist/onboarding-base.js +2 -0
  426. package/dist/onboarding-base.js.map +1 -0
  427. package/dist/ownership.d.ts +76 -0
  428. package/dist/ownership.d.ts.map +1 -0
  429. package/dist/ownership.js +2 -0
  430. package/dist/ownership.js.map +1 -0
  431. package/dist/policy/engine.d.ts +40 -0
  432. package/dist/policy/engine.d.ts.map +1 -0
  433. package/dist/policy/engine.js +2 -0
  434. package/dist/policy/engine.js.map +1 -0
  435. package/dist/policy/opa-adapter.d.ts +46 -0
  436. package/dist/policy/opa-adapter.d.ts.map +1 -0
  437. package/dist/policy/opa-adapter.js +2 -0
  438. package/dist/policy/opa-adapter.js.map +1 -0
  439. package/dist/policy/spec.d.ts +115 -0
  440. package/dist/policy/spec.d.ts.map +1 -0
  441. package/dist/policy/spec.js +2 -0
  442. package/dist/policy/spec.js.map +1 -0
  443. package/dist/presentations.backcompat.d.ts +8 -0
  444. package/dist/presentations.backcompat.d.ts.map +1 -0
  445. package/dist/presentations.backcompat.js +2 -0
  446. package/dist/presentations.backcompat.js.map +1 -0
  447. package/dist/presentations.d.ts +97 -0
  448. package/dist/presentations.d.ts.map +1 -0
  449. package/dist/presentations.js +2 -0
  450. package/dist/presentations.js.map +1 -0
  451. package/dist/presentations.v2.d.ts +96 -0
  452. package/dist/presentations.v2.d.ts.map +1 -0
  453. package/dist/presentations.v2.js +2 -0
  454. package/dist/presentations.v2.js.map +1 -0
  455. package/dist/prompt.d.ts +61 -0
  456. package/dist/prompt.d.ts.map +1 -0
  457. package/dist/prompt.js +2 -0
  458. package/dist/prompt.js.map +1 -0
  459. package/dist/promptRegistry.d.ts +16 -0
  460. package/dist/promptRegistry.d.ts.map +1 -0
  461. package/dist/promptRegistry.js +2 -0
  462. package/dist/promptRegistry.js.map +1 -0
  463. package/dist/regenerator/adapters.d.ts +20 -0
  464. package/dist/regenerator/adapters.d.ts.map +1 -0
  465. package/dist/regenerator/adapters.js +0 -0
  466. package/dist/regenerator/executor.d.ts +71 -0
  467. package/dist/regenerator/executor.d.ts.map +1 -0
  468. package/dist/regenerator/executor.js +2 -0
  469. package/dist/regenerator/executor.js.map +1 -0
  470. package/dist/regenerator/index.d.ts +7 -0
  471. package/dist/regenerator/index.js +1 -0
  472. package/dist/regenerator/service.d.ts +34 -0
  473. package/dist/regenerator/service.d.ts.map +1 -0
  474. package/dist/regenerator/service.js +2 -0
  475. package/dist/regenerator/service.js.map +1 -0
  476. package/dist/regenerator/sinks.d.ts +27 -0
  477. package/dist/regenerator/sinks.d.ts.map +1 -0
  478. package/dist/regenerator/sinks.js +2 -0
  479. package/dist/regenerator/sinks.js.map +1 -0
  480. package/dist/regenerator/types.d.ts +108 -0
  481. package/dist/regenerator/types.d.ts.map +1 -0
  482. package/dist/regenerator/types.js +0 -0
  483. package/dist/regenerator/utils.d.ts +10 -0
  484. package/dist/regenerator/utils.d.ts.map +1 -0
  485. package/dist/regenerator/utils.js +2 -0
  486. package/dist/regenerator/utils.js.map +1 -0
  487. package/dist/registry.d.ts +73 -0
  488. package/dist/registry.d.ts.map +1 -0
  489. package/dist/registry.js +2 -0
  490. package/dist/registry.js.map +1 -0
  491. package/dist/resources.d.ts +65 -0
  492. package/dist/resources.d.ts.map +1 -0
  493. package/dist/resources.js +2 -0
  494. package/dist/resources.js.map +1 -0
  495. package/dist/schema/dist/EnumType.js +1 -0
  496. package/dist/schema/dist/FieldType.js +2 -0
  497. package/dist/schema/dist/FieldType.js.map +1 -0
  498. package/dist/schema/dist/ScalarTypeEnum.js +2 -0
  499. package/dist/schema/dist/ScalarTypeEnum.js.map +1 -0
  500. package/dist/schema/dist/SchemaModel.js +2 -0
  501. package/dist/schema/dist/SchemaModel.js.map +1 -0
  502. package/dist/schema/dist/index.js +1 -0
  503. package/dist/server/graphql-pothos.d.ts +32 -0
  504. package/dist/server/graphql-pothos.d.ts.map +1 -0
  505. package/dist/server/graphql-pothos.js +2 -0
  506. package/dist/server/graphql-pothos.js.map +1 -0
  507. package/dist/server/graphql-schema-export.d.ts +7 -0
  508. package/dist/server/graphql-schema-export.d.ts.map +1 -0
  509. package/dist/server/graphql-schema-export.js +2 -0
  510. package/dist/server/graphql-schema-export.js.map +1 -0
  511. package/dist/server/index.d.ts +9 -0
  512. package/dist/server/index.js +1 -0
  513. package/dist/server/provider-mcp.d.ts +52 -0
  514. package/dist/server/provider-mcp.d.ts.map +1 -0
  515. package/dist/server/provider-mcp.js +2 -0
  516. package/dist/server/provider-mcp.js.map +1 -0
  517. package/dist/server/rest-elysia.d.ts +41 -0
  518. package/dist/server/rest-elysia.d.ts.map +1 -0
  519. package/dist/server/rest-elysia.js +2 -0
  520. package/dist/server/rest-elysia.js.map +1 -0
  521. package/dist/server/rest-express.d.ts +17 -0
  522. package/dist/server/rest-express.d.ts.map +1 -0
  523. package/dist/server/rest-express.js +2 -0
  524. package/dist/server/rest-express.js.map +1 -0
  525. package/dist/server/rest-generic.d.ts +33 -0
  526. package/dist/server/rest-generic.d.ts.map +1 -0
  527. package/dist/server/rest-generic.js +2 -0
  528. package/dist/server/rest-generic.js.map +1 -0
  529. package/dist/server/rest-next-app.d.ts +36 -0
  530. package/dist/server/rest-next-app.d.ts.map +1 -0
  531. package/dist/server/rest-next-app.js +2 -0
  532. package/dist/server/rest-next-app.js.map +1 -0
  533. package/dist/server/rest-next-mcp.d.ts +12 -0
  534. package/dist/server/rest-next-mcp.d.ts.map +1 -0
  535. package/dist/server/rest-next-mcp.js +2 -0
  536. package/dist/server/rest-next-mcp.js.map +1 -0
  537. package/dist/server/rest-next-pages.d.ts +10 -0
  538. package/dist/server/rest-next-pages.d.ts.map +1 -0
  539. package/dist/server/rest-next-pages.js +2 -0
  540. package/dist/server/rest-next-pages.js.map +1 -0
  541. package/dist/spec.d.ts +172 -0
  542. package/dist/spec.d.ts.map +1 -0
  543. package/dist/spec.js +2 -0
  544. package/dist/spec.js.map +1 -0
  545. package/dist/telemetry/anomaly.d.ts +28 -0
  546. package/dist/telemetry/anomaly.d.ts.map +1 -0
  547. package/dist/telemetry/anomaly.js +2 -0
  548. package/dist/telemetry/anomaly.js.map +1 -0
  549. package/dist/telemetry/index.d.ts +4 -0
  550. package/dist/telemetry/index.js +1 -0
  551. package/dist/telemetry/spec.d.ts +99 -0
  552. package/dist/telemetry/spec.d.ts.map +1 -0
  553. package/dist/telemetry/spec.js +2 -0
  554. package/dist/telemetry/spec.js.map +1 -0
  555. package/dist/telemetry/tracker.d.ts +52 -0
  556. package/dist/telemetry/tracker.d.ts.map +1 -0
  557. package/dist/telemetry/tracker.js +2 -0
  558. package/dist/telemetry/tracker.js.map +1 -0
  559. package/dist/tests/index.d.ts +3 -0
  560. package/dist/tests/index.js +1 -0
  561. package/dist/tests/runner.d.ts +44 -0
  562. package/dist/tests/runner.d.ts.map +1 -0
  563. package/dist/tests/runner.js +2 -0
  564. package/dist/tests/runner.js.map +1 -0
  565. package/dist/tests/spec.d.ts +90 -0
  566. package/dist/tests/spec.d.ts.map +1 -0
  567. package/dist/tests/spec.js +2 -0
  568. package/dist/tests/spec.js.map +1 -0
  569. package/dist/themes.d.ts +56 -0
  570. package/dist/themes.d.ts.map +1 -0
  571. package/dist/themes.js +2 -0
  572. package/dist/themes.js.map +1 -0
  573. package/dist/translations/catalog.d.ts +29 -0
  574. package/dist/translations/catalog.d.ts.map +1 -0
  575. package/dist/translations/catalog.js +0 -0
  576. package/dist/translations/tenant.d.ts +16 -0
  577. package/dist/translations/tenant.d.ts.map +1 -0
  578. package/dist/translations/tenant.js +0 -0
  579. package/dist/types/all.d.ts +60 -0
  580. package/dist/types/all.js +0 -0
  581. package/dist/types.d.ts +86 -0
  582. package/dist/types.d.ts.map +1 -0
  583. package/dist/types.js +0 -0
  584. package/dist/workflow/adapters/db-adapter.d.ts +35 -0
  585. package/dist/workflow/adapters/db-adapter.d.ts.map +1 -0
  586. package/dist/workflow/adapters/db-adapter.js +2 -0
  587. package/dist/workflow/adapters/db-adapter.js.map +1 -0
  588. package/dist/workflow/adapters/file-adapter.d.ts +15 -0
  589. package/dist/workflow/adapters/file-adapter.d.ts.map +1 -0
  590. package/dist/workflow/adapters/file-adapter.js +2 -0
  591. package/dist/workflow/adapters/file-adapter.js.map +1 -0
  592. package/dist/workflow/adapters/index.d.ts +4 -0
  593. package/dist/workflow/adapters/index.js +1 -0
  594. package/dist/workflow/adapters/memory-store.d.ts +19 -0
  595. package/dist/workflow/adapters/memory-store.d.ts.map +1 -0
  596. package/dist/workflow/adapters/memory-store.js +2 -0
  597. package/dist/workflow/adapters/memory-store.js.map +1 -0
  598. package/dist/workflow/expression.d.ts +10 -0
  599. package/dist/workflow/expression.d.ts.map +1 -0
  600. package/dist/workflow/expression.js +2 -0
  601. package/dist/workflow/expression.js.map +1 -0
  602. package/dist/workflow/index.d.ts +10 -0
  603. package/dist/workflow/index.js +1 -0
  604. package/dist/workflow/runner.d.ts +75 -0
  605. package/dist/workflow/runner.d.ts.map +1 -0
  606. package/dist/workflow/runner.js +2 -0
  607. package/dist/workflow/runner.js.map +1 -0
  608. package/dist/workflow/sla-monitor.d.ts +21 -0
  609. package/dist/workflow/sla-monitor.d.ts.map +1 -0
  610. package/dist/workflow/sla-monitor.js +2 -0
  611. package/dist/workflow/sla-monitor.js.map +1 -0
  612. package/dist/workflow/spec.d.ts +100 -0
  613. package/dist/workflow/spec.d.ts.map +1 -0
  614. package/dist/workflow/spec.js +2 -0
  615. package/dist/workflow/spec.js.map +1 -0
  616. package/dist/workflow/state.d.ts +36 -0
  617. package/dist/workflow/state.d.ts.map +1 -0
  618. package/dist/workflow/state.js +0 -0
  619. package/dist/workflow/validation.d.ts +29 -0
  620. package/dist/workflow/validation.d.ts.map +1 -0
  621. package/dist/workflow/validation.js +2 -0
  622. package/dist/workflow/validation.js.map +1 -0
  623. package/package.json +403 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-views.js","names":["candidate: DataViewSpec | undefined"],"sources":["../src/data-views.ts"],"sourcesContent":["import type { OwnerShipMeta } from './ownership';\nimport type { OpRef, EventRef, PresentationRef } from './features';\nimport type { ExperimentRef } from './experiments/spec';\n\nexport type DataViewKind = 'list' | 'detail' | 'table' | 'grid';\n\nexport interface DataViewMeta extends OwnerShipMeta {\n /** Fully-qualified data view name (e.g., \"sigil.spaces.admin_list\"). */\n name: string;\n /** Version of this data view. Increment on breaking changes. */\n version: number;\n /** Canonical entity slug (e.g., \"space\", \"resident\"). */\n entity: string;\n}\n\nexport interface DataViewSource {\n /** Primary query used to fetch items for this view. */\n primary: OpRef;\n /** Optional operation used to fetch a single item (detail views). */\n item?: OpRef;\n /** Optional record mutation operations (used for inline editing or actions). */\n mutations?: {\n create?: OpRef;\n update?: OpRef;\n delete?: OpRef;\n };\n /** Events that should trigger refresh when emitted. */\n refreshEvents?: EventRef[];\n}\n\nexport type DataViewFieldFormat =\n | 'text'\n | 'number'\n | 'currency'\n | 'percentage'\n | 'date'\n | 'dateTime'\n | 'boolean'\n | 'badge';\n\nexport interface DataViewField {\n /** Unique identifier for the field within the view. */\n key: string;\n /** Human-friendly label for headers/tooltips. */\n label: string;\n /** Dot-path into the data item (e.g., \"address.city\"). */\n dataPath: string;\n /** Optional description surfaced in tooltips or docs. */\n description?: string;\n /** Optional formatting hint for renderers. */\n format?: DataViewFieldFormat;\n /** When true, the field can be used for sorting. */\n sortable?: boolean;\n /** When true, the field can be used for filtering. */\n filterable?: boolean;\n /** Optional width hint for table layouts. */\n width?: 'auto' | 'xs' | 'sm' | 'md' | 'lg';\n /** Optional presentation override (e.g., card component). */\n presentation?: PresentationRef;\n}\n\nexport interface DataViewFilter {\n key: string;\n label: string;\n field: string;\n type: 'search' | 'enum' | 'number' | 'date' | 'boolean';\n options?: { value: string; label: string }[];\n}\n\nexport interface DataViewAction {\n key: string;\n label: string;\n kind: 'navigation' | 'operation';\n /** Operation invoked when kind === 'operation'. */\n operation?: OpRef;\n /** Optional feature flag gating the action. */\n requiresFlag?: string;\n}\n\nexport interface DataViewSections {\n title?: string;\n description?: string;\n fields: string[];\n}\n\nexport interface DataViewBaseConfig {\n kind: DataViewKind;\n fields: DataViewField[];\n primaryField?: string;\n secondaryFields?: string[];\n filters?: DataViewFilter[];\n actions?: DataViewAction[];\n}\n\nexport interface DataViewListConfig extends DataViewBaseConfig {\n kind: 'list';\n layout?: 'card' | 'compact';\n}\n\nexport interface DataViewDetailConfig extends DataViewBaseConfig {\n kind: 'detail';\n sections?: DataViewSections[];\n}\n\nexport interface DataViewTableColumn {\n field: string;\n label?: string;\n width?: 'auto' | 'xs' | 'sm' | 'md' | 'lg';\n align?: 'left' | 'center' | 'right';\n}\n\nexport interface DataViewTableConfig extends DataViewBaseConfig {\n kind: 'table';\n columns?: DataViewTableColumn[];\n rowSelectable?: boolean;\n density?: 'comfortable' | 'compact';\n}\n\nexport interface DataViewGridConfig extends DataViewBaseConfig {\n kind: 'grid';\n columns?: number;\n}\n\nexport type DataViewConfig =\n | DataViewListConfig\n | DataViewDetailConfig\n | DataViewTableConfig\n | DataViewGridConfig;\n\nexport interface DataViewStates {\n empty?: PresentationRef;\n error?: PresentationRef;\n loading?: PresentationRef;\n}\n\nexport interface DataViewSpec {\n meta: DataViewMeta;\n source: DataViewSource;\n view: DataViewConfig;\n states?: DataViewStates;\n policy?: { flags?: string[]; pii?: string[] };\n experiments?: ExperimentRef[];\n}\n\nfunction keyOf(spec: DataViewSpec) {\n return `${spec.meta.name}.v${spec.meta.version}`;\n}\n\nexport class DataViewRegistry {\n private readonly items = new Map<string, DataViewSpec>();\n\n register(spec: DataViewSpec): this {\n const key = keyOf(spec);\n if (this.items.has(key)) throw new Error(`Duplicate data view ${key}`);\n this.items.set(key, spec);\n return this;\n }\n\n list(): DataViewSpec[] {\n return [...this.items.values()];\n }\n\n get(name: string, version?: number): DataViewSpec | undefined {\n if (version != null) return this.items.get(`${name}.v${version}`);\n let candidate: DataViewSpec | undefined;\n let max = -Infinity;\n for (const spec of this.items.values()) {\n if (spec.meta.name !== name) continue;\n if (spec.meta.version > max) {\n max = spec.meta.version;\n candidate = spec;\n }\n }\n return candidate;\n }\n}\n\nexport function dataViewKey(spec: DataViewSpec) {\n return keyOf(spec);\n}\n\n"],"mappings":"AAgJA,SAAS,EAAM,EAAoB,CACjC,MAAO,GAAG,EAAK,KAAK,KAAK,IAAI,EAAK,KAAK,UAGzC,IAAa,EAAb,KAA8B,CAC5B,MAAyB,IAAI,IAE7B,SAAS,EAA0B,CACjC,IAAM,EAAM,EAAM,EAAK,CACvB,GAAI,KAAK,MAAM,IAAI,EAAI,CAAE,MAAU,MAAM,uBAAuB,IAAM,CAEtE,OADA,KAAK,MAAM,IAAI,EAAK,EAAK,CAClB,KAGT,MAAuB,CACrB,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAGjC,IAAI,EAAc,EAA4C,CAC5D,GAAI,GAAW,KAAM,OAAO,KAAK,MAAM,IAAI,GAAG,EAAK,IAAI,IAAU,CACjE,IAAIA,EACA,EAAM,KACV,IAAK,IAAM,KAAQ,KAAK,MAAM,QAAQ,CAChC,EAAK,KAAK,OAAS,GACnB,EAAK,KAAK,QAAU,IACtB,EAAM,EAAK,KAAK,QAChB,EAAY,GAGhB,OAAO,IAIX,SAAgB,EAAY,EAAoB,CAC9C,OAAO,EAAM,EAAK"}
@@ -0,0 +1,45 @@
1
+ import { OwnerShipMeta } from "./ownership.js";
2
+ import { AnySchemaModel } from "@lssm/lib.schema";
3
+
4
+ //#region src/events.d.ts
5
+
6
+ /**
7
+ * Typed event specification. Declare once, validate payloads at publish time,
8
+ * and guard emissions via the contracts runtime.
9
+ */
10
+ interface EventSpec<T extends AnySchemaModel> {
11
+ /** Fully-qualified event name, e.g. "sigil.magic_link.created". */
12
+ name: string;
13
+ /** Event payload version. Bump on any breaking payload change. */
14
+ version: number;
15
+ /** Short human-friendly summary. */
16
+ description?: string;
17
+ /** JSON-like paths to redact from logs/exports. */
18
+ pii?: string[];
19
+ /** Event payload schema from @lssm/lib.schema. */
20
+ payload: T;
21
+ /** Optional ownership metadata for governance and docs. */
22
+ ownership?: OwnerShipMeta;
23
+ }
24
+ /** Identity function to keep type inference when declaring events. */
25
+ declare function defineEvent<T extends AnySchemaModel>(e: EventSpec<T>): EventSpec<T>;
26
+ interface EventEnvelope<T> {
27
+ /** Unique identifier for the published event (UUID recommended). */
28
+ id: string;
29
+ /** ISO timestamp when the event occurred. */
30
+ occurredAt: string;
31
+ /** Optional trace identifier for correlating across services. */
32
+ traceId?: string;
33
+ /** Event name as published (should match spec.name). */
34
+ name: string;
35
+ /** Event version as published (should match spec.version). */
36
+ version: number;
37
+ /** Validated payload. */
38
+ payload: T;
39
+ }
40
+ type EventKey = `${string}.v${number}`;
41
+ /** Build a stable string key for an event name/version pair. */
42
+ declare const eventKey: (name: string, version: number) => EventKey;
43
+ //#endregion
44
+ export { EventEnvelope, EventKey, EventSpec, defineEvent, eventKey };
45
+ //# sourceMappingURL=events.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.d.ts","names":[],"sources":["../src/events.ts"],"sourcesContent":[],"mappings":";;;;;;;AAOA;;AAUW,UAVM,SAUN,CAAA,UAV0B,cAU1B,CAAA,CAAA;EAEG;EAAa,IAAA,EAAA,MAAA;EAIX;EAAsB,OAAA,EAAA,MAAA;EACvB;EAAV,WAAA,CAAA,EAAA,MAAA;EACQ;EAAV,GAAA,CAAA,EAAA,MAAA,EAAA;EAAS;EAIK,OAAA,EAZN,CAYM;EAeL;EAEC,SAAA,CAAA,EA3BC,aA2B2C;;;iBAvBzC,sBAAsB,mBACjC,UAAU,KACZ,UAAU;UAII;;;;;;;;;;;;WAYN;;KAGC,QAAA;;cAEC,6CAA4C"}
package/dist/events.js ADDED
@@ -0,0 +1,2 @@
1
+ import"./schema/dist/index.js";function e(e){return e}const t=(e,t)=>`${e}.v${t}`;export{e as defineEvent,t as eventKey};
2
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","names":[],"sources":["../src/events.ts"],"sourcesContent":["import { type AnySchemaModel } from '@lssm/lib.schema';\nimport type { OwnerShipMeta } from './ownership';\n\n/**\n * Typed event specification. Declare once, validate payloads at publish time,\n * and guard emissions via the contracts runtime.\n */\nexport interface EventSpec<T extends AnySchemaModel> {\n /** Fully-qualified event name, e.g. \"sigil.magic_link.created\". */\n name: string;\n /** Event payload version. Bump on any breaking payload change. */\n version: number;\n /** Short human-friendly summary. */\n description?: string;\n /** JSON-like paths to redact from logs/exports. */\n pii?: string[];\n /** Event payload schema from @lssm/lib.schema. */\n payload: T;\n /** Optional ownership metadata for governance and docs. */\n ownership?: OwnerShipMeta;\n}\n\n/** Identity function to keep type inference when declaring events. */\nexport function defineEvent<T extends AnySchemaModel>(\n e: EventSpec<T>\n): EventSpec<T> {\n return e;\n}\n\nexport interface EventEnvelope<T> {\n /** Unique identifier for the published event (UUID recommended). */\n id: string;\n /** ISO timestamp when the event occurred. */\n occurredAt: string;\n /** Optional trace identifier for correlating across services. */\n traceId?: string;\n /** Event name as published (should match spec.name). */\n name: string;\n /** Event version as published (should match spec.version). */\n version: number;\n /** Validated payload. */\n payload: T;\n}\n\nexport type EventKey = `${string}.v${number}`;\n/** Build a stable string key for an event name/version pair. */\nexport const eventKey = (name: string, version: number): EventKey =>\n `${name}.v${version}`;\n"],"mappings":"+BAuBA,SAAgB,EACd,EACc,CACd,OAAO,EAoBT,MAAa,GAAY,EAAc,IACrC,GAAG,EAAK,IAAI"}
@@ -0,0 +1,38 @@
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 };
38
+ //# sourceMappingURL=evaluator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.d.ts","names":[],"sources":["../../src/experiments/evaluator.ts"],"sourcesContent":[],"mappings":";;;;UAIiB,iBAAA;;EAAA,OAAA,CAAA,EAAA,MAAA;EAUA,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAKA,cAAA,CAAA,EAAA,MAAA,GAAA,IAAyB;EAC9B,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACe,UAAA,CAAA,EAXZ,MAWY,CAAA,MAAA,EAAA,OAAA,CAAA;EAAoB,KAAA,CAAA,EAAA,MAAA,EAAA;;AACO,UARrC,oBAAA,CAQqC;EAAiB,OAAA,EAP5D,iBAO4D;EAG1D,MAAA,EAAA,SAAA,GAAA,QAAmB,GAAA,QAAA,GAAA,UAAA;;AAWD,UAjBd,yBAAA,CAiBc;EAA4B,QAAA,EAhB/C,kBAgB+C;EAAR,aAAA,CAAA,EAAA,CAAA,MAAA,EAfxB,SAewB,EAAA,OAAA,EAfJ,iBAeI,EAAA,GAfkB,OAelB,CAAA,OAAA,CAAA,GAAA,OAAA;EAAO,mBAAA,CAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAdJ,iBAcI,EAAA,GAAA,OAAA;;cAX7C,mBAAA;;;;sBAKS;yBAMS,oBAAoB,QAAQ"}
@@ -0,0 +1,2 @@
1
+ import{createHash as e}from"node:crypto";var t=class{registry;policyChecker;expressionEvaluator;constructor(e){this.registry=e.registry,this.policyChecker=e.policyChecker,this.expressionEvaluator=e.expressionEvaluator}async chooseVariant(e){let t=this.registry.get(e.experiment,e.version);if(!t)return null;let n=t.variants.find(e=>e.id===t.controlVariant);if(!n)throw Error(`Experiment ${t.meta.name} missing control variant ${t.controlVariant}`);switch(t.allocation.type){case`random`:return{variant:this.pickByWeight(t,this.randomSeed(e,t.allocation.salt)),reason:`random`};case`sticky`:return{variant:this.pickByWeight(t,this.stickySeed(e,t.allocation.attribute,t.allocation.salt)),reason:`sticky`};case`targeted`:{let r=await this.evaluateTargeting(t,e,t.allocation.rules);return r?{variant:r,reason:`targeted`}:t.allocation.fallback===`random`?{variant:this.pickByWeight(t,this.randomSeed(e)),reason:`random`}:{variant:n,reason:`control`}}default:return{variant:n,reason:`control`}}}pickByWeight(e,t){let n=e.variants,r=t*n.reduce((e,t)=>e+(t.weight??1),0),i=0;for(let e of n)if(i+=e.weight??1,r<=i)return e;return n[n.length-1]}randomSeed(e,t=``){let n=e.sessionId??e.userId??e.organizationId??`${Date.now()}-${Math.random()}`;return this.hashToUnitInterval(n+t)}stickySeed(e,t,n=``){let r=e[t];return r?this.hashToUnitInterval(`${r}-${n}`):this.randomSeed(e,n)}hashToUnitInterval(t){let n=e(`sha256`).update(t).digest(`hex`).slice(0,15);return parseInt(n,16)%1e6/1e6}async evaluateTargeting(e,t,n){for(let r of n){if(!await this.matchesRule(r,t))continue;let n=e.variants.find(e=>e.id===r.variantId);if(n&&!(typeof r.percentage==`number`&&this.randomSeed(t,`rule-${r.variantId}`)>r.percentage))return n}return null}async matchesRule(e,t){if(e.policy&&this.policyChecker&&!await this.policyChecker(e.policy,t))return!1;if(e.expression){if(this.expressionEvaluator)return!!this.expressionEvaluator(e.expression,t);try{return!!Function(`context`,`return (${e.expression});`)(t)}catch{return!1}}return!0}};export{t as ExperimentEvaluator};
2
+ //# sourceMappingURL=evaluator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluator.js","names":[],"sources":["../../src/experiments/evaluator.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport type { PolicyRef } from '../policy/spec';\nimport type { ExperimentRegistry, ExperimentSpec, ExperimentVariant, TargetingRule } from './spec';\n\nexport interface ExperimentContext {\n experiment: string;\n version?: number;\n userId?: string | null;\n organizationId?: string | null;\n sessionId?: string | null;\n attributes?: Record<string, unknown>;\n flags?: string[];\n}\n\nexport interface ExperimentEvaluation {\n variant: ExperimentVariant;\n reason: 'control' | 'random' | 'sticky' | 'targeted';\n}\n\nexport interface ExperimentEvaluatorConfig {\n registry: ExperimentRegistry;\n policyChecker?: (policy: PolicyRef, context: ExperimentContext) => Promise<boolean> | boolean;\n expressionEvaluator?: (expression: string, context: ExperimentContext) => boolean;\n}\n\nexport class ExperimentEvaluator {\n private readonly registry: ExperimentRegistry;\n private readonly policyChecker?: ExperimentEvaluatorConfig['policyChecker'];\n private readonly expressionEvaluator?: ExperimentEvaluatorConfig['expressionEvaluator'];\n\n constructor(config: ExperimentEvaluatorConfig) {\n this.registry = config.registry;\n this.policyChecker = config.policyChecker;\n this.expressionEvaluator = config.expressionEvaluator;\n }\n\n async chooseVariant(context: ExperimentContext): Promise<ExperimentEvaluation | null> {\n const experiment = this.registry.get(context.experiment, context.version);\n if (!experiment) return null;\n\n const control = experiment.variants.find((variant) => variant.id === experiment.controlVariant);\n if (!control) throw new Error(`Experiment ${experiment.meta.name} missing control variant ${experiment.controlVariant}`);\n\n switch (experiment.allocation.type) {\n case 'random':\n return {\n variant: this.pickByWeight(experiment, this.randomSeed(context, experiment.allocation.salt)),\n reason: 'random',\n };\n case 'sticky':\n return {\n variant: this.pickByWeight(\n experiment,\n this.stickySeed(context, experiment.allocation.attribute, experiment.allocation.salt)\n ),\n reason: 'sticky',\n };\n case 'targeted':\n {\n const targeted = await this.evaluateTargeting(experiment, context, experiment.allocation.rules);\n if (targeted) {\n return {\n variant: targeted,\n reason: 'targeted',\n };\n }\n if (experiment.allocation.fallback === 'random') {\n return {\n variant: this.pickByWeight(experiment, this.randomSeed(context)),\n reason: 'random',\n };\n }\n return {\n variant: control,\n reason: 'control',\n };\n }\n default:\n return {\n variant: control,\n reason: 'control',\n };\n }\n }\n\n private pickByWeight(experiment: ExperimentSpec, seed: number): ExperimentVariant {\n const variants = experiment.variants;\n const totalWeight = variants.reduce((sum, variant) => sum + (variant.weight ?? 1), 0);\n const target = seed * totalWeight;\n let cumulative = 0;\n for (const variant of variants) {\n cumulative += variant.weight ?? 1;\n if (target <= cumulative) {\n return variant;\n }\n }\n return variants[variants.length - 1]!;\n }\n\n private randomSeed(context: ExperimentContext, salt = ''): number {\n const base =\n context.sessionId ??\n context.userId ??\n context.organizationId ??\n `${Date.now()}-${Math.random()}`;\n return this.hashToUnitInterval(base + salt);\n }\n\n private stickySeed(context: ExperimentContext, attribute: 'userId' | 'organizationId' | 'sessionId', salt = ''): number {\n const value = context[attribute];\n if (!value) return this.randomSeed(context, salt);\n return this.hashToUnitInterval(`${value}-${salt}`);\n }\n\n private hashToUnitInterval(value: string): number {\n const hash = createHash('sha256').update(value).digest('hex').slice(0, 15);\n const intValue = parseInt(hash, 16);\n return (intValue % 1_000_000) / 1_000_000;\n }\n\n private async evaluateTargeting(\n experiment: ExperimentSpec,\n context: ExperimentContext,\n rules: TargetingRule[]\n ): Promise<ExperimentVariant | null> {\n for (const rule of rules) {\n if (!(await this.matchesRule(rule, context))) continue;\n const variant = experiment.variants.find((v) => v.id === rule.variantId);\n if (!variant) continue;\n if (typeof rule.percentage === 'number') {\n const seed = this.randomSeed(context, `rule-${rule.variantId}`);\n if (seed > rule.percentage) {\n continue;\n }\n }\n return variant;\n }\n return null;\n }\n\n private async matchesRule(rule: TargetingRule, context: ExperimentContext): Promise<boolean> {\n if (rule.policy && this.policyChecker) {\n const allowed = await this.policyChecker(rule.policy, context);\n if (!allowed) return false;\n }\n if (rule.expression) {\n if (this.expressionEvaluator) {\n return Boolean(this.expressionEvaluator(rule.expression, context));\n }\n try {\n const fn = new Function('context', `return (${rule.expression});`);\n return Boolean(fn(context));\n } catch (_error) {\n return false;\n }\n }\n return true;\n }\n}\n\n"],"mappings":"yCAyBA,IAAa,EAAb,KAAiC,CAC/B,SACA,cACA,oBAEA,YAAY,EAAmC,CAC7C,KAAK,SAAW,EAAO,SACvB,KAAK,cAAgB,EAAO,cAC5B,KAAK,oBAAsB,EAAO,oBAGpC,MAAM,cAAc,EAAkE,CACpF,IAAM,EAAa,KAAK,SAAS,IAAI,EAAQ,WAAY,EAAQ,QAAQ,CACzE,GAAI,CAAC,EAAY,OAAO,KAExB,IAAM,EAAU,EAAW,SAAS,KAAM,GAAY,EAAQ,KAAO,EAAW,eAAe,CAC/F,GAAI,CAAC,EAAS,MAAU,MAAM,cAAc,EAAW,KAAK,KAAK,2BAA2B,EAAW,iBAAiB,CAExH,OAAQ,EAAW,WAAW,KAA9B,CACE,IAAK,SACH,MAAO,CACL,QAAS,KAAK,aAAa,EAAY,KAAK,WAAW,EAAS,EAAW,WAAW,KAAK,CAAC,CAC5F,OAAQ,SACT,CACH,IAAK,SACH,MAAO,CACL,QAAS,KAAK,aACZ,EACA,KAAK,WAAW,EAAS,EAAW,WAAW,UAAW,EAAW,WAAW,KAAK,CACtF,CACD,OAAQ,SACT,CACH,IAAK,WACH,CACE,IAAM,EAAW,MAAM,KAAK,kBAAkB,EAAY,EAAS,EAAW,WAAW,MAAM,CAa/F,OAZI,EACK,CACL,QAAS,EACT,OAAQ,WACT,CAEC,EAAW,WAAW,WAAa,SAC9B,CACL,QAAS,KAAK,aAAa,EAAY,KAAK,WAAW,EAAQ,CAAC,CAChE,OAAQ,SACT,CAEI,CACL,QAAS,EACT,OAAQ,UACT,CAEL,QACE,MAAO,CACL,QAAS,EACT,OAAQ,UACT,EAIP,aAAqB,EAA4B,EAAiC,CAChF,IAAM,EAAW,EAAW,SAEtB,EAAS,EADK,EAAS,QAAQ,EAAK,IAAY,GAAO,EAAQ,QAAU,GAAI,EAAE,CAEjF,EAAa,EACjB,IAAK,IAAM,KAAW,EAEpB,GADA,GAAc,EAAQ,QAAU,EAC5B,GAAU,EACZ,OAAO,EAGX,OAAO,EAAS,EAAS,OAAS,GAGpC,WAAmB,EAA4B,EAAO,GAAY,CAChE,IAAM,EACJ,EAAQ,WACR,EAAQ,QACR,EAAQ,gBACR,GAAG,KAAK,KAAK,CAAC,GAAG,KAAK,QAAQ,GAChC,OAAO,KAAK,mBAAmB,EAAO,EAAK,CAG7C,WAAmB,EAA4B,EAAsD,EAAO,GAAY,CACtH,IAAM,EAAQ,EAAQ,GAEtB,OADK,EACE,KAAK,mBAAmB,GAAG,EAAM,GAAG,IAAO,CAD/B,KAAK,WAAW,EAAS,EAAK,CAInD,mBAA2B,EAAuB,CAChD,IAAM,EAAO,EAAW,SAAS,CAAC,OAAO,EAAM,CAAC,OAAO,MAAM,CAAC,MAAM,EAAG,GAAG,CAE1E,OADiB,SAAS,EAAM,GAAG,CAChB,IAAa,IAGlC,MAAc,kBACZ,EACA,EACA,EACmC,CACnC,IAAK,IAAM,KAAQ,EAAO,CACxB,GAAI,CAAE,MAAM,KAAK,YAAY,EAAM,EAAQ,CAAG,SAC9C,IAAM,EAAU,EAAW,SAAS,KAAM,GAAM,EAAE,KAAO,EAAK,UAAU,CACnE,QACD,OAAO,EAAK,YAAe,UAChB,KAAK,WAAW,EAAS,QAAQ,EAAK,YAAY,CACpD,EAAK,YAIlB,OAAO,EAET,OAAO,KAGT,MAAc,YAAY,EAAqB,EAA8C,CAC3F,GAAI,EAAK,QAAU,KAAK,eAElB,CADY,MAAM,KAAK,cAAc,EAAK,OAAQ,EAAQ,CAChD,MAAO,GAEvB,GAAI,EAAK,WAAY,CACnB,GAAI,KAAK,oBACP,MAAO,EAAQ,KAAK,oBAAoB,EAAK,WAAY,EAAQ,CAEnE,GAAI,CAEF,MAAO,EADQ,SAAS,UAAW,WAAW,EAAK,WAAW,IAAI,CAChD,EAAQ,MACX,CACf,MAAO,IAGX,MAAO"}
@@ -0,0 +1,90 @@
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
+ interface ExperimentMeta extends OwnerShipMeta {
7
+ /** Fully-qualified experiment name (e.g., "sigil.onboarding.variant"). */
8
+ name: string;
9
+ /** Version of the experiment; bump when allocation or variants change materially. */
10
+ version: number;
11
+ /** Domain/bounded context (e.g., "onboarding"). */
12
+ domain: string;
13
+ }
14
+ interface ExperimentRef {
15
+ name: string;
16
+ version?: number;
17
+ }
18
+ type ExperimentOverrideType = 'dataView' | 'workflow' | 'theme' | 'policy' | 'presentation';
19
+ interface ExperimentOverride {
20
+ type: ExperimentOverrideType;
21
+ /** Target spec meta name (e.g., DataViewSpec.meta.name). */
22
+ target: string;
23
+ /** Target version. Optional; evaluator may choose latest when omitted. */
24
+ version?: number;
25
+ /** Optional configuration applied when this variant is active. */
26
+ config?: Record<string, unknown>;
27
+ }
28
+ interface ExperimentVariant {
29
+ id: string;
30
+ name: string;
31
+ description?: string;
32
+ /** Relative weight for random allocation (defaults to 1). */
33
+ weight?: number;
34
+ overrides?: ExperimentOverride[];
35
+ /** Optional metadata for downstream analytics/UI. */
36
+ metadata?: Record<string, unknown>;
37
+ }
38
+ interface TargetingRule {
39
+ /** Variant to assign when rule matches. */
40
+ variantId: string;
41
+ /** Optional percentage of matching traffic (0-1). If omitted, 100%. */
42
+ percentage?: number;
43
+ /** Policies that must allow the assignment. */
44
+ policy?: PolicyRef;
45
+ /** Expression evaluated against context (see evaluator for details). */
46
+ expression?: string;
47
+ }
48
+ type AllocationStrategy = {
49
+ type: 'random';
50
+ /** Optional salt for deterministic hashing. */
51
+ salt?: string;
52
+ } | {
53
+ type: 'sticky';
54
+ /** Which attribute to hash for sticky assignment. */
55
+ attribute: 'userId' | 'organizationId' | 'sessionId';
56
+ salt?: string;
57
+ } | {
58
+ type: 'targeted';
59
+ rules: TargetingRule[];
60
+ fallback?: 'control' | 'random';
61
+ };
62
+ type MetricAggregation = 'count' | 'avg' | 'p75' | 'p90' | 'p95' | 'p99';
63
+ interface SuccessMetric {
64
+ name: string;
65
+ telemetryEvent: {
66
+ name: TelemetryEventDef['name'];
67
+ version: number;
68
+ };
69
+ aggregation: MetricAggregation;
70
+ target?: number;
71
+ }
72
+ interface ExperimentSpec {
73
+ meta: ExperimentMeta;
74
+ /** Identifier of the control variant (must exist in variants array). */
75
+ controlVariant: string;
76
+ variants: ExperimentVariant[];
77
+ allocation: AllocationStrategy;
78
+ successMetrics?: SuccessMetric[];
79
+ tags?: string[];
80
+ }
81
+ declare class ExperimentRegistry {
82
+ private readonly items;
83
+ register(spec: ExperimentSpec): this;
84
+ list(): ExperimentSpec[];
85
+ get(name: string, version?: number): ExperimentSpec | undefined;
86
+ }
87
+ declare function makeExperimentKey(meta: ExperimentMeta): string;
88
+ //#endregion
89
+ export { AllocationStrategy, ExperimentMeta, ExperimentOverride, ExperimentOverrideType, ExperimentRef, ExperimentRegistry, ExperimentSpec, ExperimentVariant, MetricAggregation, SuccessMetric, TargetingRule, makeExperimentKey };
90
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","names":[],"sources":["../../src/experiments/spec.ts"],"sourcesContent":[],"mappings":";;;;;UAIiB,cAAA,SAAuB;;EAAvB,IAAA,EAAA,MAAA;EASA;EAKL,OAAA,EAAA,MAAA;EAOK;EAUA,MAAA,EAAA,MAAA;AAWjB;AAWY,UA5CK,aAAA,CA4Ca;EAkBlB,IAAA,EAAA,MAAA;EAEK,OAAA,CAAA,EAAA,MAAa;AAO9B;AACQ,KAnEI,sBAAA,GAmEJ,UAAA,GAAA,UAAA,GAAA,OAAA,GAAA,QAAA,GAAA,cAAA;AAGI,UA/DK,kBAAA,CA+DL;EACE,IAAA,EA/DN,sBA+DM;EACK;EAAa,MAAA,EAAA,MAAA;EAMnB;EAGI,OAAA,CAAA,EAAA,MAAA;EASP;EAI6B,MAAA,CAAA,EAhF5B,MAgF4B,CAAA,MAAA,EAAA,OAAA,CAAA;;AAiBvB,UA9FC,iBAAA,CA8FgB;;;;;;cAxFnB;;aAED;;UAGI,aAAA;;;;;;WAMN;;;;KAKC,kBAAA;;;;;;;;;;;SAcC;;;KAID,iBAAA;UAEK,aAAA;;;UAES;;;eACX;;;UAIE,cAAA;QACT;;;YAGI;cACE;mBACK;;;cAMN,kBAAA;;iBAGI;UASP;uCAI6B;;iBAiBvB,iBAAA,OAAwB"}
@@ -0,0 +1,2 @@
1
+ const e=e=>`${e.name}.v${e.version}`;var t=class{items=new Map;register(t){let n=e(t.meta);if(this.items.has(n))throw Error(`Duplicate experiment ${n}`);return this.items.set(n,t),this}list(){return[...this.items.values()]}get(e,t){if(t!=null)return this.items.get(`${e}.v${t}`);let n,r=-1/0;for(let t of this.items.values())t.meta.name===e&&t.meta.version>r&&(r=t.meta.version,n=t);return n}};function n(t){return e(t)}export{t as ExperimentRegistry,n as makeExperimentKey};
2
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","names":["latest: ExperimentSpec | undefined"],"sources":["../../src/experiments/spec.ts"],"sourcesContent":["import type { OwnerShipMeta } from '../ownership';\nimport type { PolicyRef } from '../policy/spec';\nimport type { TelemetryEventDef } from '../telemetry/spec';\n\nexport interface ExperimentMeta extends OwnerShipMeta {\n /** Fully-qualified experiment name (e.g., \"sigil.onboarding.variant\"). */\n name: string;\n /** Version of the experiment; bump when allocation or variants change materially. */\n version: number;\n /** Domain/bounded context (e.g., \"onboarding\"). */\n domain: string;\n}\n\nexport interface ExperimentRef {\n name: string;\n version?: number;\n}\n\nexport type ExperimentOverrideType =\n | 'dataView'\n | 'workflow'\n | 'theme'\n | 'policy'\n | 'presentation';\n\nexport interface ExperimentOverride {\n type: ExperimentOverrideType;\n /** Target spec meta name (e.g., DataViewSpec.meta.name). */\n target: string;\n /** Target version. Optional; evaluator may choose latest when omitted. */\n version?: number;\n /** Optional configuration applied when this variant is active. */\n config?: Record<string, unknown>;\n}\n\nexport interface ExperimentVariant {\n id: string;\n name: string;\n description?: string;\n /** Relative weight for random allocation (defaults to 1). */\n weight?: number;\n overrides?: ExperimentOverride[];\n /** Optional metadata for downstream analytics/UI. */\n metadata?: Record<string, unknown>;\n}\n\nexport interface TargetingRule {\n /** Variant to assign when rule matches. */\n variantId: string;\n /** Optional percentage of matching traffic (0-1). If omitted, 100%. */\n percentage?: number;\n /** Policies that must allow the assignment. */\n policy?: PolicyRef;\n /** Expression evaluated against context (see evaluator for details). */\n expression?: string;\n}\n\nexport type AllocationStrategy =\n | {\n type: 'random';\n /** Optional salt for deterministic hashing. */\n salt?: string;\n }\n | {\n type: 'sticky';\n /** Which attribute to hash for sticky assignment. */\n attribute: 'userId' | 'organizationId' | 'sessionId';\n salt?: string;\n }\n | {\n type: 'targeted';\n rules: TargetingRule[];\n fallback?: 'control' | 'random';\n };\n\nexport type MetricAggregation = 'count' | 'avg' | 'p75' | 'p90' | 'p95' | 'p99';\n\nexport interface SuccessMetric {\n name: string;\n telemetryEvent: { name: TelemetryEventDef['name']; version: number };\n aggregation: MetricAggregation;\n target?: number;\n}\n\nexport interface ExperimentSpec {\n meta: ExperimentMeta;\n /** Identifier of the control variant (must exist in variants array). */\n controlVariant: string;\n variants: ExperimentVariant[];\n allocation: AllocationStrategy;\n successMetrics?: SuccessMetric[];\n tags?: string[];\n}\n\nconst experimentKey = (meta: ExperimentMeta) => `${meta.name}.v${meta.version}`;\n\nexport class ExperimentRegistry {\n private readonly items = new Map<string, ExperimentSpec>();\n\n register(spec: ExperimentSpec): this {\n const key = experimentKey(spec.meta);\n if (this.items.has(key)) {\n throw new Error(`Duplicate experiment ${key}`);\n }\n this.items.set(key, spec);\n return this;\n }\n\n list(): ExperimentSpec[] {\n return [...this.items.values()];\n }\n\n get(name: string, version?: number): ExperimentSpec | undefined {\n if (version != null) {\n return this.items.get(`${name}.v${version}`);\n }\n let latest: ExperimentSpec | undefined;\n let maxVersion = -Infinity;\n for (const spec of this.items.values()) {\n if (spec.meta.name !== name) continue;\n if (spec.meta.version > maxVersion) {\n maxVersion = spec.meta.version;\n latest = spec;\n }\n }\n return latest;\n }\n}\n\nexport function makeExperimentKey(meta: ExperimentMeta) {\n return experimentKey(meta);\n}\n\n"],"mappings":"AA8FA,MAAM,EAAiB,GAAyB,GAAG,EAAK,KAAK,IAAI,EAAK,UAEtE,IAAa,EAAb,KAAgC,CAC9B,MAAyB,IAAI,IAE7B,SAAS,EAA4B,CACnC,IAAM,EAAM,EAAc,EAAK,KAAK,CACpC,GAAI,KAAK,MAAM,IAAI,EAAI,CACrB,MAAU,MAAM,wBAAwB,IAAM,CAGhD,OADA,KAAK,MAAM,IAAI,EAAK,EAAK,CAClB,KAGT,MAAyB,CACvB,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAGjC,IAAI,EAAc,EAA8C,CAC9D,GAAI,GAAW,KACb,OAAO,KAAK,MAAM,IAAI,GAAG,EAAK,IAAI,IAAU,CAE9C,IAAIA,EACA,EAAa,KACjB,IAAK,IAAM,KAAQ,KAAK,MAAM,QAAQ,CAChC,EAAK,KAAK,OAAS,GACnB,EAAK,KAAK,QAAU,IACtB,EAAa,EAAK,KAAK,QACvB,EAAS,GAGb,OAAO,IAIX,SAAgB,EAAkB,EAAsB,CACtD,OAAO,EAAc,EAAK"}
@@ -0,0 +1,88 @@
1
+ import { OwnerShipMeta } from "./ownership.js";
2
+ import { CapabilityRef, CapabilityRegistry, CapabilityRequirement } from "./capabilities.js";
3
+ import { PresentationRegistry } from "./presentations.js";
4
+ import { PresentationDescriptorV2, PresentationTarget } from "./presentations.v2.js";
5
+ import { ExperimentRef } from "./experiments/spec.js";
6
+ import { SpecRegistry } from "./registry.js";
7
+
8
+ //#region src/features.d.ts
9
+ /** Minimal metadata to identify and categorize a feature module. */
10
+ interface FeatureModuleMeta extends OwnerShipMeta {
11
+ /** Stable slug key used to identify this feature (e.g., "weekly_pulse"). */
12
+ key: string;
13
+ }
14
+ interface OpRef {
15
+ /** Operation name (ContractSpec.meta.name). */
16
+ name: string;
17
+ /** Operation version (ContractSpec.meta.version). */
18
+ version: number;
19
+ }
20
+ interface EventRef {
21
+ /** Event name. */
22
+ name: string;
23
+ /** Event version. */
24
+ version: number;
25
+ }
26
+ interface PresentationRef {
27
+ /** Presentation name. */
28
+ name: string;
29
+ /** Presentation version. */
30
+ version: number;
31
+ }
32
+ /** Group operations/events/presentations into an installable feature. */
33
+ interface FeatureModuleSpec {
34
+ meta: FeatureModuleMeta;
35
+ /** Contract operations included in this feature. */
36
+ operations?: OpRef[];
37
+ /** Events declared/emitted by this feature. */
38
+ events?: EventRef[];
39
+ /** Presentations associated to this feature. */
40
+ presentations?: PresentationRef[];
41
+ /** Experiments related to this feature. */
42
+ experiments?: ExperimentRef[];
43
+ /** Capability bindings exposed/required by this feature. */
44
+ capabilities?: {
45
+ provides?: CapabilityRef[];
46
+ requires?: CapabilityRequirement[];
47
+ };
48
+ /** Optional: link ops to presentations for traceability (e.g., ui for op) */
49
+ opToPresentation?: {
50
+ op: OpRef;
51
+ pres: PresentationRef;
52
+ }[];
53
+ /** Optional: declare per-presentation target requirements (V2 descriptors) */
54
+ presentationsTargets?: {
55
+ /** Presentation name. */
56
+ name: string;
57
+ /** Presentation version. */
58
+ version: number;
59
+ /** Required targets that must be supported by the descriptor. */
60
+ targets: PresentationTarget[];
61
+ }[];
62
+ }
63
+ interface FeatureRef {
64
+ key: string;
65
+ }
66
+ /** In-memory registry for FeatureModuleSpec. */
67
+ declare class FeatureRegistry {
68
+ private items;
69
+ /** Register a feature module. Throws when the key already exists. */
70
+ register(f: FeatureModuleSpec): this;
71
+ /** List all registered feature modules. */
72
+ list(): FeatureModuleSpec[];
73
+ /** Get a feature by its key (slug). */
74
+ get(key: string): FeatureModuleSpec | undefined;
75
+ }
76
+ /** Validate and register a feature against optional registries/descriptors. */
77
+ declare function installFeature(feature: FeatureModuleSpec, deps: {
78
+ features: FeatureRegistry;
79
+ ops?: SpecRegistry;
80
+ presentations?: PresentationRegistry;
81
+ descriptorsV2?: PresentationDescriptorV2[];
82
+ capabilities?: CapabilityRegistry;
83
+ }): FeatureRegistry;
84
+ /** Ensure declared target requirements exist on the provided descriptors. */
85
+ declare function validateFeatureTargetsV2(feature: FeatureModuleSpec, descriptors: PresentationDescriptorV2[]): boolean;
86
+ //#endregion
87
+ export { EventRef, FeatureModuleMeta, FeatureModuleSpec, FeatureRef, FeatureRegistry, OpRef, PresentationRef, installFeature, validateFeatureTargetsV2 };
88
+ //# sourceMappingURL=features.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.d.ts","names":[],"sources":["../src/features.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UAaiB,iBAAA,SAA0B;;;AAA3C;AAKiB,UAAA,KAAA,CAAK;EAOL;EAOA,IAAA,EAAA,MAAA;EAQA;EACT,OAAA,EAAA,MAAA;;AAIG,UApBM,QAAA,CAoBN;EAEO;EAEF,IAAA,EAAA,MAAA;EAGD;EACA,OAAA,EAAA,MAAA;;AAGyB,UAxBvB,eAAA,CAwBuB;EAQ3B;EAAkB,IAAA,EAAA,MAAA;EAId;EASJ,OAAA,EAAA,MAAA;;;AAiBO,UAtDH,iBAAA,CAsDG;EAAiB,IAAA,EArD7B,iBAqD6B;EAMrB;EACL,UAAA,CAAA,EA1DI,KA0DJ,EAAA;EAEG;EAAe,MAAA,CAAA,EA1DlB,QA0DkB,EAAA;EACc;EAEvB,aAAA,CAAA,EA3DF,eA2DE,EAAA;EACD;EAChB,WAAA,CAAA,EA3Da,aA2Db,EAAA;EAAA;EAwFa,YAAA,CAAA,EAAA;eAhJD;eACA;;;;QAGY;UAAa;;;;;;;;;aAQ3B;;;UAII,UAAA;;;;cASJ,eAAA;;;cAIC;;UAQJ;;oBAKU;;;iBAMJ,cAAA,UACL;YAEG;QAAe;kBACc;kBAEvB;iBACD;IAChB;;iBAwFa,wBAAA,UACL,gCACI"}
@@ -0,0 +1,2 @@
1
+ function e(e){return e.meta.key}var t=class{items=new Map;register(t){let n=e(t);if(this.items.has(n))throw Error(`Duplicate feature ${n}`);return this.items.set(n,t),this}list(){return[...this.items.values()]}get(e){return this.items.get(e)}};function n(e,t){if(t.ops&&e.operations){for(let n of e.operations)if(!t.ops.getSpec(n.name,n.version))throw Error(`installFeature: operation not found ${n.name}.v${n.version}`)}if(t.presentations&&e.presentations){for(let n of e.presentations)if(!t.presentations.get(n.name,n.version))throw Error(`installFeature: presentation not found ${n.name}.v${n.version}`)}if(e.presentationsTargets&&t.descriptorsV2)for(let n of e.presentationsTargets){let e=t.descriptorsV2.find(e=>e.meta.name===n.name&&e.meta.version===n.version);if(!e)throw Error(`installFeature: V2 descriptor not found ${n.name}.v${n.version}`);for(let t of n.targets)if(!e.targets.includes(t))throw Error(`installFeature: descriptor ${n.name}.v${n.version} missing target ${t}`)}if(e.opToPresentation&&e.opToPresentation.length>0)for(let n of e.opToPresentation){if(t.ops&&!t.ops.getSpec(n.op.name,n.op.version))throw Error(`installFeature: linked op not found ${n.op.name}.v${n.op.version}`);if(t.presentations&&!t.presentations.get(n.pres.name,n.pres.version))throw Error(`installFeature: linked presentation not found ${n.pres.name}.v${n.pres.version}`)}if(t.capabilities&&e.capabilities?.provides){for(let n of e.capabilities.provides)if(!t.capabilities.get(n.key,n.version))throw Error(`installFeature: capability not registered ${n.key}.v${n.version}`)}if(e.capabilities?.requires?.length){if(!t.capabilities)throw Error(`installFeature: capability registry required to validate capability requirements for ${e.meta.key}`);let n=e.capabilities.provides??[];for(let r of e.capabilities.requires)if(!t.capabilities.satisfies(r,n))throw Error(`installFeature: capability requirement not satisfied ${r.key}${r.version?`.v${r.version}`:``}`)}return t.features.register(e),t.features}function r(e,t){if(!e.presentationsTargets||e.presentationsTargets.length===0)return!0;for(let n of e.presentationsTargets){let e=t.find(e=>e.meta.name===n.name&&e.meta.version===n.version);if(!e)throw Error(`V2 descriptor not found ${n.name}.v${n.version}`);for(let t of n.targets)if(!e.targets.includes(t))throw Error(`Descriptor ${n.name}.v${n.version} missing target ${t}`)}return!0}export{t as FeatureRegistry,n as installFeature,r as validateFeatureTargetsV2};
2
+ //# sourceMappingURL=features.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"features.js","names":[],"sources":["../src/features.ts"],"sourcesContent":["import type {\n PresentationTarget,\n PresentationDescriptorV2,\n} from './presentations.v2';\nimport type { OwnerShipMeta } from './ownership';\nimport type {\n CapabilityRef,\n CapabilityRequirement,\n CapabilityRegistry,\n} from './capabilities';\nimport type { ExperimentRef } from './experiments/spec';\n\n/** Minimal metadata to identify and categorize a feature module. */\nexport interface FeatureModuleMeta extends OwnerShipMeta {\n /** Stable slug key used to identify this feature (e.g., \"weekly_pulse\"). */\n key: string;\n}\n\nexport interface OpRef {\n /** Operation name (ContractSpec.meta.name). */\n name: string;\n /** Operation version (ContractSpec.meta.version). */\n version: number;\n}\n\nexport interface EventRef {\n /** Event name. */\n name: string;\n /** Event version. */\n version: number;\n}\n\nexport interface PresentationRef {\n /** Presentation name. */\n name: string;\n /** Presentation version. */\n version: number;\n}\n\n/** Group operations/events/presentations into an installable feature. */\nexport interface FeatureModuleSpec {\n meta: FeatureModuleMeta;\n /** Contract operations included in this feature. */\n operations?: OpRef[];\n /** Events declared/emitted by this feature. */\n events?: EventRef[];\n /** Presentations associated to this feature. */\n presentations?: PresentationRef[];\n /** Experiments related to this feature. */\n experiments?: ExperimentRef[];\n /** Capability bindings exposed/required by this feature. */\n capabilities?: {\n provides?: CapabilityRef[];\n requires?: CapabilityRequirement[];\n };\n /** Optional: link ops to presentations for traceability (e.g., ui for op) */\n opToPresentation?: { op: OpRef; pres: PresentationRef }[];\n /** Optional: declare per-presentation target requirements (V2 descriptors) */\n presentationsTargets?: {\n /** Presentation name. */\n name: string;\n /** Presentation version. */\n version: number;\n /** Required targets that must be supported by the descriptor. */\n targets: PresentationTarget[];\n }[];\n}\n\nexport interface FeatureRef {\n key: string;\n}\n\nfunction keyOf(f: FeatureModuleSpec) {\n return f.meta.key;\n}\n\n/** In-memory registry for FeatureModuleSpec. */\nexport class FeatureRegistry {\n private items = new Map<string, FeatureModuleSpec>();\n\n /** Register a feature module. Throws when the key already exists. */\n register(f: FeatureModuleSpec): this {\n const key = keyOf(f);\n if (this.items.has(key)) throw new Error(`Duplicate feature ${key}`);\n this.items.set(key, f);\n return this;\n }\n\n /** List all registered feature modules. */\n list(): FeatureModuleSpec[] {\n return [...this.items.values()];\n }\n\n /** Get a feature by its key (slug). */\n get(key: string): FeatureModuleSpec | undefined {\n return this.items.get(key);\n }\n}\n\n/** Validate and register a feature against optional registries/descriptors. */\nexport function installFeature(\n feature: FeatureModuleSpec,\n deps: {\n features: FeatureRegistry;\n ops?: import('./registry').SpecRegistry;\n presentations?: import('./presentations').PresentationRegistry;\n descriptorsV2?: PresentationDescriptorV2[];\n capabilities?: CapabilityRegistry;\n }\n) {\n // Validate referenced ops exist if registry provided\n if (deps.ops && feature.operations) {\n for (const o of feature.operations) {\n const s = deps.ops.getSpec(o.name, o.version);\n if (!s)\n throw new Error(\n `installFeature: operation not found ${o.name}.v${o.version}`\n );\n }\n }\n // Validate referenced presentations exist if registry provided\n if (deps.presentations && feature.presentations) {\n for (const p of feature.presentations) {\n const pres = deps.presentations.get(p.name, p.version);\n if (!pres)\n throw new Error(\n `installFeature: presentation not found ${p.name}.v${p.version}`\n );\n }\n }\n // Validate V2 target requirements if provided\n if (feature.presentationsTargets && deps.descriptorsV2) {\n for (const req of feature.presentationsTargets) {\n const d = deps.descriptorsV2.find(\n (x) => x.meta.name === req.name && x.meta.version === req.version\n );\n if (!d)\n throw new Error(\n `installFeature: V2 descriptor not found ${req.name}.v${req.version}`\n );\n for (const t of req.targets) {\n if (!d.targets.includes(t))\n throw new Error(\n `installFeature: descriptor ${req.name}.v${req.version} missing target ${t}`\n );\n }\n }\n }\n // Validate op→presentation links\n if (feature.opToPresentation && feature.opToPresentation.length > 0) {\n for (const link of feature.opToPresentation) {\n if (deps.ops) {\n const s = deps.ops.getSpec(link.op.name, link.op.version);\n if (!s)\n throw new Error(\n `installFeature: linked op not found ${link.op.name}.v${link.op.version}`\n );\n }\n if (deps.presentations) {\n const pres = deps.presentations.get(link.pres.name, link.pres.version);\n if (!pres)\n throw new Error(\n `installFeature: linked presentation not found ${link.pres.name}.v${link.pres.version}`\n );\n }\n }\n }\n // Validate capability bindings when registry provided\n if (deps.capabilities && feature.capabilities?.provides) {\n for (const cap of feature.capabilities.provides) {\n const spec = deps.capabilities.get(cap.key, cap.version);\n if (!spec)\n throw new Error(\n `installFeature: capability not registered ${cap.key}.v${cap.version}`\n );\n }\n }\n if (feature.capabilities?.requires?.length) {\n if (!deps.capabilities)\n throw new Error(\n `installFeature: capability registry required to validate capability requirements for ${feature.meta.key}`\n );\n const provided = feature.capabilities.provides ?? [];\n for (const req of feature.capabilities.requires) {\n const satisfied = deps.capabilities.satisfies(req, provided);\n if (!satisfied)\n throw new Error(\n `installFeature: capability requirement not satisfied ${req.key}${req.version ? `.v${req.version}` : ''}`\n );\n }\n }\n deps.features.register(feature);\n return deps.features;\n}\n\n/** Ensure declared target requirements exist on the provided descriptors. */\nexport function validateFeatureTargetsV2(\n feature: FeatureModuleSpec,\n descriptors: PresentationDescriptorV2[]\n) {\n if (\n !feature.presentationsTargets ||\n feature.presentationsTargets.length === 0\n )\n return true;\n for (const req of feature.presentationsTargets) {\n const d = descriptors.find(\n (x) => x.meta.name === req.name && x.meta.version === req.version\n );\n if (!d)\n throw new Error(`V2 descriptor not found ${req.name}.v${req.version}`);\n for (const t of req.targets)\n if (!d.targets.includes(t))\n throw new Error(\n `Descriptor ${req.name}.v${req.version} missing target ${t}`\n );\n }\n return true;\n}\n"],"mappings":"AAwEA,SAAS,EAAM,EAAsB,CACnC,OAAO,EAAE,KAAK,IAIhB,IAAa,EAAb,KAA6B,CAC3B,MAAgB,IAAI,IAGpB,SAAS,EAA4B,CACnC,IAAM,EAAM,EAAM,EAAE,CACpB,GAAI,KAAK,MAAM,IAAI,EAAI,CAAE,MAAU,MAAM,qBAAqB,IAAM,CAEpE,OADA,KAAK,MAAM,IAAI,EAAK,EAAE,CACf,KAIT,MAA4B,CAC1B,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAIjC,IAAI,EAA4C,CAC9C,OAAO,KAAK,MAAM,IAAI,EAAI,GAK9B,SAAgB,EACd,EACA,EAOA,CAEA,GAAI,EAAK,KAAO,EAAQ,gBACjB,IAAM,KAAK,EAAQ,WAEtB,GAAI,CADM,EAAK,IAAI,QAAQ,EAAE,KAAM,EAAE,QAAQ,CAE3C,MAAU,MACR,uCAAuC,EAAE,KAAK,IAAI,EAAE,UACrD,CAIP,GAAI,EAAK,eAAiB,EAAQ,mBAC3B,IAAM,KAAK,EAAQ,cAEtB,GAAI,CADS,EAAK,cAAc,IAAI,EAAE,KAAM,EAAE,QAAQ,CAEpD,MAAU,MACR,0CAA0C,EAAE,KAAK,IAAI,EAAE,UACxD,CAIP,GAAI,EAAQ,sBAAwB,EAAK,cACvC,IAAK,IAAM,KAAO,EAAQ,qBAAsB,CAC9C,IAAM,EAAI,EAAK,cAAc,KAC1B,GAAM,EAAE,KAAK,OAAS,EAAI,MAAQ,EAAE,KAAK,UAAY,EAAI,QAC3D,CACD,GAAI,CAAC,EACH,MAAU,MACR,2CAA2C,EAAI,KAAK,IAAI,EAAI,UAC7D,CACH,IAAK,IAAM,KAAK,EAAI,QAClB,GAAI,CAAC,EAAE,QAAQ,SAAS,EAAE,CACxB,MAAU,MACR,8BAA8B,EAAI,KAAK,IAAI,EAAI,QAAQ,kBAAkB,IAC1E,CAKT,GAAI,EAAQ,kBAAoB,EAAQ,iBAAiB,OAAS,EAChE,IAAK,IAAM,KAAQ,EAAQ,iBAAkB,CAC3C,GAAI,EAAK,KAEH,CADM,EAAK,IAAI,QAAQ,EAAK,GAAG,KAAM,EAAK,GAAG,QAAQ,CAEvD,MAAU,MACR,uCAAuC,EAAK,GAAG,KAAK,IAAI,EAAK,GAAG,UACjE,CAEL,GAAI,EAAK,eAEH,CADS,EAAK,cAAc,IAAI,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CAEpE,MAAU,MACR,iDAAiD,EAAK,KAAK,KAAK,IAAI,EAAK,KAAK,UAC/E,CAKT,GAAI,EAAK,cAAgB,EAAQ,cAAc,cACxC,IAAM,KAAO,EAAQ,aAAa,SAErC,GAAI,CADS,EAAK,aAAa,IAAI,EAAI,IAAK,EAAI,QAAQ,CAEtD,MAAU,MACR,6CAA6C,EAAI,IAAI,IAAI,EAAI,UAC9D,CAGP,GAAI,EAAQ,cAAc,UAAU,OAAQ,CAC1C,GAAI,CAAC,EAAK,aACR,MAAU,MACR,wFAAwF,EAAQ,KAAK,MACtG,CACH,IAAM,EAAW,EAAQ,aAAa,UAAY,EAAE,CACpD,IAAK,IAAM,KAAO,EAAQ,aAAa,SAErC,GAAI,CADc,EAAK,aAAa,UAAU,EAAK,EAAS,CAE1D,MAAU,MACR,wDAAwD,EAAI,MAAM,EAAI,QAAU,KAAK,EAAI,UAAY,KACtG,CAIP,OADA,EAAK,SAAS,SAAS,EAAQ,CACxB,EAAK,SAId,SAAgB,EACd,EACA,EACA,CACA,GACE,CAAC,EAAQ,sBACT,EAAQ,qBAAqB,SAAW,EAExC,MAAO,GACT,IAAK,IAAM,KAAO,EAAQ,qBAAsB,CAC9C,IAAM,EAAI,EAAY,KACnB,GAAM,EAAE,KAAK,OAAS,EAAI,MAAQ,EAAE,KAAK,UAAY,EAAI,QAC3D,CACD,GAAI,CAAC,EACH,MAAU,MAAM,2BAA2B,EAAI,KAAK,IAAI,EAAI,UAAU,CACxE,IAAK,IAAM,KAAK,EAAI,QAClB,GAAI,CAAC,EAAE,QAAQ,SAAS,EAAE,CACxB,MAAU,MACR,cAAc,EAAI,KAAK,IAAI,EAAI,QAAQ,kBAAkB,IAC1D,CAEP,MAAO"}
@@ -0,0 +1,259 @@
1
+ import { OwnerShipMeta } from "./ownership.js";
2
+ import { AnySchemaModel, ZodSchemaModel } from "@lssm/lib.schema";
3
+
4
+ //#region src/forms.d.ts
5
+ type PredicateOp = 'equals' | 'notEquals' | 'in' | 'notIn' | 'gt' | 'gte' | 'lt' | 'lte' | 'truthy' | 'empty' | 'lengthGt' | 'lengthGte' | 'lengthLt' | 'lengthLte';
6
+ interface WhenClause {
7
+ /** Dot path in form values; arrays may use `$index` within array context. */
8
+ path: string;
9
+ op?: PredicateOp;
10
+ value?: unknown;
11
+ }
12
+ interface Predicate {
13
+ when?: WhenClause;
14
+ all?: Predicate[];
15
+ any?: Predicate[];
16
+ not?: Predicate;
17
+ }
18
+ interface FormOption {
19
+ labelI18n: string;
20
+ value: string | number | boolean;
21
+ descriptionI18n?: string;
22
+ disabled?: boolean;
23
+ }
24
+ type OptionsSource = {
25
+ kind: 'static';
26
+ options: readonly FormOption[];
27
+ } | {
28
+ kind: 'resolver';
29
+ resolverKey: string;
30
+ /** Dot paths in form values to watch */
31
+ deps: string[];
32
+ args?: Record<string, unknown>;
33
+ };
34
+ interface BaseFieldSpec {
35
+ /** Field kind discriminator. */
36
+ kind: 'text' | 'textarea' | 'select' | 'checkbox' | 'radio' | 'switch' | 'group' | 'array';
37
+ /** Field name (dot path relative to the form root or parent context). */
38
+ name?: string;
39
+ labelI18n?: string;
40
+ descriptionI18n?: string;
41
+ placeholderI18n?: string;
42
+ required?: boolean;
43
+ /** Conditional UI behavior */
44
+ visibleWhen?: Predicate;
45
+ enabledWhen?: Predicate;
46
+ requiredWhen?: Predicate;
47
+ /** UI hints */
48
+ uiKey?: string;
49
+ uiProps?: Record<string, unknown>;
50
+ wrapper?: {
51
+ orientation?: 'horizontal' | 'vertical';
52
+ };
53
+ /** HTML/Native autofill token (supports custom tokens) */
54
+ autoComplete?: string;
55
+ /** Keyboard/adaptation hints (web/native). Shape mirrors design-system KeyboardOptions but stays decoupled. */
56
+ keyboard?: {
57
+ kind?: string;
58
+ autoCapitalize?: 'none' | 'sentences' | 'words' | 'characters';
59
+ autoComplete?: string;
60
+ autoCorrect?: boolean;
61
+ enterKeyHint?: 'enter' | 'done' | 'go' | 'next' | 'search' | 'send';
62
+ };
63
+ /** Optional computed value hook, provided by host computations map */
64
+ computeFrom?: {
65
+ computeKey: string;
66
+ deps: string[];
67
+ mode?: 'change' | 'blur-xs' | 'submit';
68
+ readOnly?: boolean;
69
+ };
70
+ }
71
+ interface TextFieldSpec extends BaseFieldSpec {
72
+ kind: 'text';
73
+ name: string;
74
+ inputMode?: 'text' | 'email' | 'tel' | 'url' | 'numeric' | 'decimal' | 'search';
75
+ autoComplete?: string;
76
+ maxLength?: number;
77
+ minLength?: number;
78
+ }
79
+ interface TextareaFieldSpec extends BaseFieldSpec {
80
+ kind: 'textarea';
81
+ name: string;
82
+ rows?: number;
83
+ maxLength?: number;
84
+ minLength?: number;
85
+ }
86
+ interface SelectFieldSpec extends BaseFieldSpec {
87
+ kind: 'select';
88
+ name: string;
89
+ options: OptionsSource | readonly FormOption[];
90
+ }
91
+ interface CheckboxFieldSpec extends BaseFieldSpec {
92
+ kind: 'checkbox';
93
+ name: string;
94
+ }
95
+ interface RadioFieldSpec extends BaseFieldSpec {
96
+ kind: 'radio';
97
+ name: string;
98
+ options: OptionsSource | readonly FormOption[];
99
+ }
100
+ interface SwitchFieldSpec extends BaseFieldSpec {
101
+ kind: 'switch';
102
+ name: string;
103
+ }
104
+ interface GroupFieldSpec extends BaseFieldSpec {
105
+ kind: 'group';
106
+ /** Optional legend/label at group level */
107
+ labelI18n?: string;
108
+ fields: FieldSpec[];
109
+ }
110
+ interface ArrayFieldSpec extends BaseFieldSpec {
111
+ kind: 'array';
112
+ /** Root-level field that is an array in the model (e.g., "emails") */
113
+ name: string;
114
+ /** Child field spec for each item (e.g., address inside emails[i].address). */
115
+ of: Exclude<FieldSpec, ArrayFieldSpec | GroupFieldSpec>;
116
+ min?: number;
117
+ max?: number;
118
+ }
119
+ type FieldSpec = TextFieldSpec | TextareaFieldSpec | SelectFieldSpec | CheckboxFieldSpec | RadioFieldSpec | SwitchFieldSpec | GroupFieldSpec | ArrayFieldSpec;
120
+ interface FormAction {
121
+ key: string;
122
+ labelI18n: string;
123
+ op?: {
124
+ name: string;
125
+ version: number;
126
+ };
127
+ success?: {
128
+ navigateTo?: string;
129
+ toastI18n?: string;
130
+ };
131
+ }
132
+ interface ConstraintDecl {
133
+ key: string;
134
+ messageI18n: string;
135
+ paths: string[];
136
+ args?: Record<string, unknown>;
137
+ }
138
+ type FormValuesFor<M extends AnySchemaModel> = ZodSchemaModel<M>;
139
+ interface FormSpec<M extends AnySchemaModel = AnySchemaModel> {
140
+ meta: OwnerShipMeta & {
141
+ key: string;
142
+ version: number;
143
+ };
144
+ /** Canonical form data shape */
145
+ model: M;
146
+ /** Flat list or tree using groups/arrays */
147
+ fields: FieldSpec[];
148
+ policy?: {
149
+ flags?: string[];
150
+ pii?: string[];
151
+ };
152
+ actions?: FormAction[];
153
+ renderHints?: {
154
+ ui: 'shadcn' | 'custom';
155
+ form: 'react-hook-form';
156
+ };
157
+ constraints?: ConstraintDecl[];
158
+ }
159
+ declare class FormRegistry {
160
+ private items;
161
+ register(spec: FormSpec): this;
162
+ list(): FormSpec[];
163
+ get(key: string, version?: number): FormSpec<AnySchemaModel> | undefined;
164
+ }
165
+ declare function evalPredicate(values: unknown, pred?: Predicate): boolean;
166
+ type ConstraintHandler = (values: Record<string, unknown>, paths: string[], args?: Record<string, unknown>) => {
167
+ ok: true;
168
+ } | {
169
+ ok: false;
170
+ message?: string;
171
+ path?: string;
172
+ };
173
+ /**
174
+ * Wrap the base zod schema with relation-driven refinements (requiredWhen, array min/max)
175
+ * and optional custom constraints. Call this when wiring RHF resolver.
176
+ */
177
+ declare function buildZodWithRelations(spec: FormSpec, handlers?: Record<string, ConstraintHandler>): any;
178
+ interface AnyFieldLike {
179
+ kind: string;
180
+ name?: string;
181
+ fields?: readonly AnyFieldLike[];
182
+ of?: AnyFieldLike;
183
+ }
184
+ type TopLevelNames<F extends readonly AnyFieldLike[]> = F[number] extends {
185
+ name: infer N extends string;
186
+ } ? N : never;
187
+ type ArrayChildren<F extends readonly AnyFieldLike[]> = F[number] extends {
188
+ kind: 'array';
189
+ name: infer N extends string;
190
+ of: infer C;
191
+ } ? C extends {
192
+ name: infer CN extends string;
193
+ } ? `${N}.$index.${CN}` : never : never;
194
+ type GroupTopLevelNames<F extends readonly AnyFieldLike[]> = F[number] extends {
195
+ kind: 'group';
196
+ fields: infer G extends readonly AnyFieldLike[];
197
+ } ? TopLevelNames<G> : never;
198
+ type GroupArrayChildren<F extends readonly AnyFieldLike[]> = F[number] extends {
199
+ kind: 'group';
200
+ fields: infer G extends readonly AnyFieldLike[];
201
+ } ? ArrayChildren<G> : never;
202
+ type PathOfFields<F extends readonly AnyFieldLike[]> = TopLevelNames<F> | ArrayChildren<F> | GroupTopLevelNames<F> | GroupArrayChildren<F>;
203
+ interface TypedWhenClause<P extends string> {
204
+ path: P;
205
+ op?: PredicateOp;
206
+ value?: unknown;
207
+ }
208
+ interface TypedPredicate<P extends string> {
209
+ when?: TypedWhenClause<P>;
210
+ all?: TypedPredicate<P>[];
211
+ any?: TypedPredicate<P>[];
212
+ not?: TypedPredicate<P>;
213
+ }
214
+ type TypedOptionsSource<P extends string> = {
215
+ kind: 'static';
216
+ options: readonly FormOption[];
217
+ } | {
218
+ kind: 'resolver';
219
+ resolverKey: string;
220
+ deps: P[];
221
+ args?: Record<string, unknown>;
222
+ };
223
+ type EnhanceFields<F extends readonly AnyFieldLike[], P extends string> = { [K in keyof F]: F[K] & {
224
+ visibleWhen?: TypedPredicate<P>;
225
+ enabledWhen?: TypedPredicate<P>;
226
+ requiredWhen?: TypedPredicate<P>;
227
+ } & (F[K] extends {
228
+ kind: 'select';
229
+ } ? {
230
+ options: TypedOptionsSource<P> | readonly FormOption[];
231
+ } : {}) & (F[K] extends {
232
+ kind: 'radio';
233
+ } ? {
234
+ options: TypedOptionsSource<P> | readonly FormOption[];
235
+ } : {}) & {
236
+ computeFrom?: {
237
+ computeKey: string;
238
+ deps: P[];
239
+ mode?: 'change' | 'blur-xs' | 'submit';
240
+ readOnly?: boolean;
241
+ };
242
+ } };
243
+ declare function defineFormSpec<M extends AnySchemaModel, F extends readonly AnyFieldLike[]>(spec: {
244
+ meta: FormSpec<M>['meta'];
245
+ model: M;
246
+ fields: EnhanceFields<F, PathOfFields<F>>;
247
+ policy?: FormSpec<M>['policy'];
248
+ actions?: FormSpec<M>['actions'];
249
+ renderHints?: FormSpec<M>['renderHints'];
250
+ constraints?: {
251
+ key: string;
252
+ messageI18n: string;
253
+ paths: PathOfFields<F>[];
254
+ args?: Record<string, unknown>;
255
+ }[];
256
+ }): FormSpec<M>;
257
+ //#endregion
258
+ export { ArrayFieldSpec, BaseFieldSpec, CheckboxFieldSpec, ConstraintDecl, ConstraintHandler, EnhanceFields, FieldSpec, FormAction, FormOption, FormRegistry, FormSpec, FormValuesFor, GroupFieldSpec, OptionsSource, Predicate, PredicateOp, RadioFieldSpec, SelectFieldSpec, SwitchFieldSpec, TextFieldSpec, TextareaFieldSpec, TypedOptionsSource, TypedPredicate, TypedWhenClause, WhenClause, buildZodWithRelations, defineFormSpec, evalPredicate };
259
+ //# sourceMappingURL=forms.d.ts.map