@lssm/lib.contracts 0.0.0-canary-20251217080011 → 0.0.0-canary-20251219202229

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 (835) hide show
  1. package/LICENSE +21 -0
  2. package/dist/app-config/app-config.feature.d.ts +2 -1
  3. package/dist/app-config/app-config.feature.d.ts.map +1 -0
  4. package/dist/app-config/app-config.feature.js +2 -1
  5. package/dist/app-config/app-config.feature.js.map +1 -0
  6. package/dist/app-config/branding.d.ts +2 -1
  7. package/dist/app-config/branding.d.ts.map +1 -0
  8. package/dist/app-config/contracts.d.ts +52 -51
  9. package/dist/app-config/contracts.d.ts.map +1 -0
  10. package/dist/app-config/contracts.js +56 -57
  11. package/dist/app-config/contracts.js.map +1 -0
  12. package/dist/app-config/docs/app-config.docblock.d.ts +2 -1
  13. package/dist/app-config/docs/app-config.docblock.d.ts.map +1 -0
  14. package/dist/app-config/docs/app-config.docblock.js +2 -1
  15. package/dist/app-config/docs/app-config.docblock.js.map +1 -0
  16. package/dist/app-config/events.d.ts +29 -28
  17. package/dist/app-config/events.d.ts.map +1 -0
  18. package/dist/app-config/events.js +33 -34
  19. package/dist/app-config/events.js.map +1 -0
  20. package/dist/app-config/lifecycle-contracts.d.ts +82 -81
  21. package/dist/app-config/lifecycle-contracts.d.ts.map +1 -0
  22. package/dist/app-config/lifecycle-contracts.js +68 -69
  23. package/dist/app-config/lifecycle-contracts.js.map +1 -0
  24. package/dist/app-config/lifecycle.d.ts +2 -1
  25. package/dist/app-config/lifecycle.d.ts.map +1 -0
  26. package/dist/app-config/runtime.d.ts +2 -1
  27. package/dist/app-config/runtime.d.ts.map +1 -0
  28. package/dist/app-config/runtime.js +2 -1
  29. package/dist/app-config/runtime.js.map +1 -0
  30. package/dist/app-config/spec.d.ts +2 -1
  31. package/dist/app-config/spec.d.ts.map +1 -0
  32. package/dist/app-config/spec.js +2 -1
  33. package/dist/app-config/spec.js.map +1 -0
  34. package/dist/app-config/validation.d.ts +2 -1
  35. package/dist/app-config/validation.d.ts.map +1 -0
  36. package/dist/app-config/validation.js +2 -1
  37. package/dist/app-config/validation.js.map +1 -0
  38. package/dist/capabilities/docs/capabilities.docblock.d.ts +2 -1
  39. package/dist/capabilities/docs/capabilities.docblock.d.ts.map +1 -0
  40. package/dist/capabilities/docs/capabilities.docblock.js +2 -1
  41. package/dist/capabilities/docs/capabilities.docblock.js.map +1 -0
  42. package/dist/capabilities/openbanking.d.ts +2 -1
  43. package/dist/capabilities/openbanking.d.ts.map +1 -0
  44. package/dist/capabilities/openbanking.js +2 -1
  45. package/dist/capabilities/openbanking.js.map +1 -0
  46. package/dist/capabilities.d.ts +2 -1
  47. package/dist/capabilities.d.ts.map +1 -0
  48. package/dist/capabilities.js +2 -1
  49. package/dist/capabilities.js.map +1 -0
  50. package/dist/client/react/drivers/rn-reusables.d.ts +2 -1
  51. package/dist/client/react/drivers/rn-reusables.d.ts.map +1 -0
  52. package/dist/client/react/drivers/rn-reusables.js +2 -1
  53. package/dist/client/react/drivers/rn-reusables.js.map +1 -0
  54. package/dist/client/react/drivers/shadcn.d.ts +2 -1
  55. package/dist/client/react/drivers/shadcn.d.ts.map +1 -0
  56. package/dist/client/react/drivers/shadcn.js +2 -1
  57. package/dist/client/react/drivers/shadcn.js.map +1 -0
  58. package/dist/client/react/feature-render.d.ts +2 -1
  59. package/dist/client/react/feature-render.d.ts.map +1 -0
  60. package/dist/client/react/feature-render.js +2 -1
  61. package/dist/client/react/feature-render.js.map +1 -0
  62. package/dist/client/react/form-render.d.ts +8 -7
  63. package/dist/client/react/form-render.d.ts.map +1 -0
  64. package/dist/client/react/form-render.js +17 -16
  65. package/dist/client/react/form-render.js.map +1 -0
  66. package/dist/contract-registry/schemas.d.ts +2 -1
  67. package/dist/contract-registry/schemas.d.ts.map +1 -0
  68. package/dist/contract-registry/schemas.js +2 -1
  69. package/dist/contract-registry/schemas.js.map +1 -0
  70. package/dist/contract-registry/types.d.ts +2 -1
  71. package/dist/contract-registry/types.d.ts.map +1 -0
  72. package/dist/contracts-adapter-hydration.d.ts +2 -1
  73. package/dist/contracts-adapter-hydration.d.ts.map +1 -0
  74. package/dist/contracts-adapter-hydration.js +2 -1
  75. package/dist/contracts-adapter-hydration.js.map +1 -0
  76. package/dist/contracts-adapter-input.d.ts +2 -1
  77. package/dist/contracts-adapter-input.d.ts.map +1 -0
  78. package/dist/contracts-adapter-input.js +2 -1
  79. package/dist/contracts-adapter-input.js.map +1 -0
  80. package/dist/data-views/docs/data-views.docblock.d.ts +2 -1
  81. package/dist/data-views/docs/data-views.docblock.d.ts.map +1 -0
  82. package/dist/data-views/docs/data-views.docblock.js +2 -1
  83. package/dist/data-views/docs/data-views.docblock.js.map +1 -0
  84. package/dist/data-views/query-generator.d.ts +2 -1
  85. package/dist/data-views/query-generator.d.ts.map +1 -0
  86. package/dist/data-views/query-generator.js +2 -1
  87. package/dist/data-views/query-generator.js.map +1 -0
  88. package/dist/data-views/runtime.d.ts +2 -1
  89. package/dist/data-views/runtime.d.ts.map +1 -0
  90. package/dist/data-views/runtime.js +2 -1
  91. package/dist/data-views/runtime.js.map +1 -0
  92. package/dist/data-views.d.ts +2 -1
  93. package/dist/data-views.d.ts.map +1 -0
  94. package/dist/data-views.js +2 -1
  95. package/dist/data-views.js.map +1 -0
  96. package/dist/docs/accessibility_wcag_compliance_specs.docblock.d.ts +2 -1
  97. package/dist/docs/accessibility_wcag_compliance_specs.docblock.d.ts.map +1 -0
  98. package/dist/docs/accessibility_wcag_compliance_specs.docblock.js +2 -1
  99. package/dist/docs/accessibility_wcag_compliance_specs.docblock.js.map +1 -0
  100. package/dist/docs/index.js +0 -6
  101. package/dist/docs/meta.docs.d.ts +2 -1
  102. package/dist/docs/meta.docs.d.ts.map +1 -0
  103. package/dist/docs/meta.docs.js +5 -1
  104. package/dist/docs/meta.docs.js.map +1 -0
  105. package/dist/docs/presentations.d.ts +2 -1
  106. package/dist/docs/presentations.d.ts.map +1 -0
  107. package/dist/docs/presentations.js +2 -1
  108. package/dist/docs/presentations.js.map +1 -0
  109. package/dist/docs/registry.d.ts +2 -1
  110. package/dist/docs/registry.d.ts.map +1 -0
  111. package/dist/docs/registry.js +2 -1
  112. package/dist/docs/registry.js.map +1 -0
  113. package/dist/docs/tech/auth/better-auth-nextjs.docblock.d.ts +2 -1
  114. package/dist/docs/tech/auth/better-auth-nextjs.docblock.d.ts.map +1 -0
  115. package/dist/docs/tech/auth/better-auth-nextjs.docblock.js +2 -1
  116. package/dist/docs/tech/auth/better-auth-nextjs.docblock.js.map +1 -0
  117. package/dist/docs/tech/contracts/README.docblock.d.ts +2 -1
  118. package/dist/docs/tech/contracts/README.docblock.d.ts.map +1 -0
  119. package/dist/docs/tech/contracts/README.docblock.js +2 -1
  120. package/dist/docs/tech/contracts/README.docblock.js.map +1 -0
  121. package/dist/docs/tech/contracts/create-subscription.docblock.d.ts +2 -1
  122. package/dist/docs/tech/contracts/create-subscription.docblock.d.ts.map +1 -0
  123. package/dist/docs/tech/contracts/create-subscription.docblock.js +2 -1
  124. package/dist/docs/tech/contracts/create-subscription.docblock.js.map +1 -0
  125. package/dist/docs/tech/contracts/graphql-typed-outputs.docblock.d.ts +2 -1
  126. package/dist/docs/tech/contracts/graphql-typed-outputs.docblock.d.ts.map +1 -0
  127. package/dist/docs/tech/contracts/graphql-typed-outputs.docblock.js +2 -1
  128. package/dist/docs/tech/contracts/graphql-typed-outputs.docblock.js.map +1 -0
  129. package/dist/docs/tech/contracts/migrations.docblock.d.ts +2 -1
  130. package/dist/docs/tech/contracts/migrations.docblock.d.ts.map +1 -0
  131. package/dist/docs/tech/contracts/migrations.docblock.js +2 -1
  132. package/dist/docs/tech/contracts/migrations.docblock.js.map +1 -0
  133. package/dist/docs/tech/contracts/openapi-export.docblock.d.ts +2 -1
  134. package/dist/docs/tech/contracts/openapi-export.docblock.d.ts.map +1 -0
  135. package/dist/docs/tech/contracts/openapi-export.docblock.js +2 -1
  136. package/dist/docs/tech/contracts/openapi-export.docblock.js.map +1 -0
  137. package/dist/docs/tech/contracts/ops-to-presentation-linking.docblock.d.ts +2 -1
  138. package/dist/docs/tech/contracts/ops-to-presentation-linking.docblock.d.ts.map +1 -0
  139. package/dist/docs/tech/contracts/ops-to-presentation-linking.docblock.js +2 -1
  140. package/dist/docs/tech/contracts/ops-to-presentation-linking.docblock.js.map +1 -0
  141. package/dist/docs/tech/contracts/overlays.docblock.d.ts +2 -1
  142. package/dist/docs/tech/contracts/overlays.docblock.d.ts.map +1 -0
  143. package/dist/docs/tech/contracts/overlays.docblock.js +2 -1
  144. package/dist/docs/tech/contracts/overlays.docblock.js.map +1 -0
  145. package/dist/docs/tech/contracts/tests.docblock.d.ts +2 -1
  146. package/dist/docs/tech/contracts/tests.docblock.d.ts.map +1 -0
  147. package/dist/docs/tech/contracts/tests.docblock.js +2 -1
  148. package/dist/docs/tech/contracts/tests.docblock.js.map +1 -0
  149. package/dist/docs/tech/contracts/themes.docblock.d.ts +2 -1
  150. package/dist/docs/tech/contracts/themes.docblock.d.ts.map +1 -0
  151. package/dist/docs/tech/contracts/themes.docblock.js +2 -1
  152. package/dist/docs/tech/contracts/themes.docblock.js.map +1 -0
  153. package/dist/docs/tech/contracts/vertical-pocket-family-office.docblock.d.ts +2 -1
  154. package/dist/docs/tech/contracts/vertical-pocket-family-office.docblock.d.ts.map +1 -0
  155. package/dist/docs/tech/contracts/vertical-pocket-family-office.docblock.js +2 -1
  156. package/dist/docs/tech/contracts/vertical-pocket-family-office.docblock.js.map +1 -0
  157. package/dist/docs/tech/lifecycle-stage-system.docblock.d.ts +2 -1
  158. package/dist/docs/tech/lifecycle-stage-system.docblock.d.ts.map +1 -0
  159. package/dist/docs/tech/lifecycle-stage-system.docblock.js +2 -1
  160. package/dist/docs/tech/lifecycle-stage-system.docblock.js.map +1 -0
  161. package/dist/docs/tech/llm/llm-integration.docblock.d.ts +2 -1
  162. package/dist/docs/tech/llm/llm-integration.docblock.d.ts.map +1 -0
  163. package/dist/docs/tech/llm/llm-integration.docblock.js +2 -1
  164. package/dist/docs/tech/llm/llm-integration.docblock.js.map +1 -0
  165. package/dist/docs/tech/mcp-endpoints.docblock.d.ts +2 -1
  166. package/dist/docs/tech/mcp-endpoints.docblock.d.ts.map +1 -0
  167. package/dist/docs/tech/mcp-endpoints.docblock.js +2 -1
  168. package/dist/docs/tech/mcp-endpoints.docblock.js.map +1 -0
  169. package/dist/docs/tech/presentation-runtime.docblock.d.ts +2 -1
  170. package/dist/docs/tech/presentation-runtime.docblock.d.ts.map +1 -0
  171. package/dist/docs/tech/presentation-runtime.docblock.js +2 -1
  172. package/dist/docs/tech/presentation-runtime.docblock.js.map +1 -0
  173. package/dist/docs/tech/schema/README.docblock.d.ts +2 -1
  174. package/dist/docs/tech/schema/README.docblock.d.ts.map +1 -0
  175. package/dist/docs/tech/schema/README.docblock.js +2 -1
  176. package/dist/docs/tech/schema/README.docblock.js.map +1 -0
  177. package/dist/docs/tech/studio/learning-events.docblock.d.ts +2 -1
  178. package/dist/docs/tech/studio/learning-events.docblock.d.ts.map +1 -0
  179. package/dist/docs/tech/studio/learning-events.docblock.js +2 -1
  180. package/dist/docs/tech/studio/learning-events.docblock.js.map +1 -0
  181. package/dist/docs/tech/studio/learning-journeys.docblock.d.ts +2 -1
  182. package/dist/docs/tech/studio/learning-journeys.docblock.d.ts.map +1 -0
  183. package/dist/docs/tech/studio/learning-journeys.docblock.js +2 -1
  184. package/dist/docs/tech/studio/learning-journeys.docblock.js.map +1 -0
  185. package/dist/docs/tech/studio/platform-admin-panel.docblock.d.ts +2 -1
  186. package/dist/docs/tech/studio/platform-admin-panel.docblock.d.ts.map +1 -0
  187. package/dist/docs/tech/studio/platform-admin-panel.docblock.js +2 -1
  188. package/dist/docs/tech/studio/platform-admin-panel.docblock.js.map +1 -0
  189. package/dist/docs/tech/studio/project-access-teams.docblock.d.ts +2 -1
  190. package/dist/docs/tech/studio/project-access-teams.docblock.d.ts.map +1 -0
  191. package/dist/docs/tech/studio/project-access-teams.docblock.js +2 -1
  192. package/dist/docs/tech/studio/project-access-teams.docblock.js.map +1 -0
  193. package/dist/docs/tech/studio/project-routing.docblock.d.ts +2 -1
  194. package/dist/docs/tech/studio/project-routing.docblock.d.ts.map +1 -0
  195. package/dist/docs/tech/studio/project-routing.docblock.js +2 -1
  196. package/dist/docs/tech/studio/project-routing.docblock.js.map +1 -0
  197. package/dist/docs/tech/studio/sandbox-unlogged.docblock.d.ts +2 -1
  198. package/dist/docs/tech/studio/sandbox-unlogged.docblock.d.ts.map +1 -0
  199. package/dist/docs/tech/studio/sandbox-unlogged.docblock.js +2 -1
  200. package/dist/docs/tech/studio/sandbox-unlogged.docblock.js.map +1 -0
  201. package/dist/docs/tech/studio/team-invitations.docblock.d.ts +2 -1
  202. package/dist/docs/tech/studio/team-invitations.docblock.d.ts.map +1 -0
  203. package/dist/docs/tech/studio/team-invitations.docblock.js +2 -1
  204. package/dist/docs/tech/studio/team-invitations.docblock.js.map +1 -0
  205. package/dist/docs/tech/studio/workspace-ops.docblock.d.ts +2 -1
  206. package/dist/docs/tech/studio/workspace-ops.docblock.d.ts.map +1 -0
  207. package/dist/docs/tech/studio/workspace-ops.docblock.js +2 -1
  208. package/dist/docs/tech/studio/workspace-ops.docblock.js.map +1 -0
  209. package/dist/docs/tech/studio/workspaces.docblock.d.ts +2 -1
  210. package/dist/docs/tech/studio/workspaces.docblock.d.ts.map +1 -0
  211. package/dist/docs/tech/studio/workspaces.docblock.js +2 -1
  212. package/dist/docs/tech/studio/workspaces.docblock.js.map +1 -0
  213. package/dist/docs/tech/telemetry-ingest.docblock.d.ts +2 -1
  214. package/dist/docs/tech/telemetry-ingest.docblock.d.ts.map +1 -0
  215. package/dist/docs/tech/telemetry-ingest.docblock.js +2 -1
  216. package/dist/docs/tech/telemetry-ingest.docblock.js.map +1 -0
  217. package/dist/docs/tech/templates/runtime.docblock.d.ts +2 -1
  218. package/dist/docs/tech/templates/runtime.docblock.d.ts.map +1 -0
  219. package/dist/docs/tech/templates/runtime.docblock.js +2 -1
  220. package/dist/docs/tech/templates/runtime.docblock.js.map +1 -0
  221. package/dist/docs/tech/vscode-extension.docblock.d.ts +2 -1
  222. package/dist/docs/tech/vscode-extension.docblock.d.ts.map +1 -0
  223. package/dist/docs/tech/vscode-extension.docblock.js +2 -1
  224. package/dist/docs/tech/vscode-extension.docblock.js.map +1 -0
  225. package/dist/docs/tech/workflows/overview.docblock.d.ts +2 -1
  226. package/dist/docs/tech/workflows/overview.docblock.d.ts.map +1 -0
  227. package/dist/docs/tech/workflows/overview.docblock.js +2 -1
  228. package/dist/docs/tech/workflows/overview.docblock.js.map +1 -0
  229. package/dist/docs/tech-contracts.docs.d.ts +2 -1
  230. package/dist/docs/tech-contracts.docs.d.ts.map +1 -0
  231. package/dist/docs/tech-contracts.docs.js +5 -1
  232. package/dist/docs/tech-contracts.docs.js.map +1 -0
  233. package/dist/docs/types.d.ts +2 -1
  234. package/dist/docs/types.d.ts.map +1 -0
  235. package/dist/events.d.ts +2 -1
  236. package/dist/events.d.ts.map +1 -0
  237. package/dist/events.js +2 -1
  238. package/dist/events.js.map +1 -0
  239. package/dist/experiments/docs/experiments.docblock.d.ts +2 -1
  240. package/dist/experiments/docs/experiments.docblock.d.ts.map +1 -0
  241. package/dist/experiments/docs/experiments.docblock.js +2 -1
  242. package/dist/experiments/docs/experiments.docblock.js.map +1 -0
  243. package/dist/experiments/evaluator.d.ts +2 -1
  244. package/dist/experiments/evaluator.d.ts.map +1 -0
  245. package/dist/experiments/evaluator.js +2 -1
  246. package/dist/experiments/evaluator.js.map +1 -0
  247. package/dist/experiments/spec-resolver.d.ts +2 -1
  248. package/dist/experiments/spec-resolver.d.ts.map +1 -0
  249. package/dist/experiments/spec.d.ts +2 -1
  250. package/dist/experiments/spec.d.ts.map +1 -0
  251. package/dist/experiments/spec.js +2 -1
  252. package/dist/experiments/spec.js.map +1 -0
  253. package/dist/features.d.ts +2 -1
  254. package/dist/features.d.ts.map +1 -0
  255. package/dist/features.js +2 -1
  256. package/dist/features.js.map +1 -0
  257. package/dist/forms/docs/forms.docblock.d.ts +2 -1
  258. package/dist/forms/docs/forms.docblock.d.ts.map +1 -0
  259. package/dist/forms/docs/forms.docblock.js +2 -1
  260. package/dist/forms/docs/forms.docblock.js.map +1 -0
  261. package/dist/forms.d.ts +2 -1
  262. package/dist/forms.d.ts.map +1 -0
  263. package/dist/forms.js +2 -1
  264. package/dist/forms.js.map +1 -0
  265. package/dist/index.js +2 -3
  266. package/dist/install.d.ts +2 -1
  267. package/dist/install.d.ts.map +1 -0
  268. package/dist/install.js +2 -1
  269. package/dist/install.js.map +1 -0
  270. package/dist/integrations/binding.d.ts +2 -1
  271. package/dist/integrations/binding.d.ts.map +1 -0
  272. package/dist/integrations/connection.d.ts +2 -1
  273. package/dist/integrations/connection.d.ts.map +1 -0
  274. package/dist/integrations/contracts.d.ts +104 -103
  275. package/dist/integrations/contracts.d.ts.map +1 -0
  276. package/dist/integrations/contracts.js +65 -66
  277. package/dist/integrations/contracts.js.map +1 -0
  278. package/dist/integrations/docs/integrations.docblock.d.ts +2 -1
  279. package/dist/integrations/docs/integrations.docblock.d.ts.map +1 -0
  280. package/dist/integrations/docs/integrations.docblock.js +2 -1
  281. package/dist/integrations/docs/integrations.docblock.js.map +1 -0
  282. package/dist/integrations/health.d.ts +2 -1
  283. package/dist/integrations/health.d.ts.map +1 -0
  284. package/dist/integrations/health.js +2 -1
  285. package/dist/integrations/health.js.map +1 -0
  286. package/dist/integrations/openbanking/contracts/accounts.d.ts +68 -67
  287. package/dist/integrations/openbanking/contracts/accounts.d.ts.map +1 -0
  288. package/dist/integrations/openbanking/contracts/accounts.js +31 -32
  289. package/dist/integrations/openbanking/contracts/accounts.js.map +1 -0
  290. package/dist/integrations/openbanking/contracts/balances.d.ts +2 -1
  291. package/dist/integrations/openbanking/contracts/balances.d.ts.map +1 -0
  292. package/dist/integrations/openbanking/contracts/balances.js +18 -19
  293. package/dist/integrations/openbanking/contracts/balances.js.map +1 -0
  294. package/dist/integrations/openbanking/contracts/index.d.ts +2 -1
  295. package/dist/integrations/openbanking/contracts/index.d.ts.map +1 -0
  296. package/dist/integrations/openbanking/contracts/index.js +2 -1
  297. package/dist/integrations/openbanking/contracts/index.js.map +1 -0
  298. package/dist/integrations/openbanking/contracts/transactions.d.ts +50 -49
  299. package/dist/integrations/openbanking/contracts/transactions.d.ts.map +1 -0
  300. package/dist/integrations/openbanking/contracts/transactions.js +32 -33
  301. package/dist/integrations/openbanking/contracts/transactions.js.map +1 -0
  302. package/dist/integrations/openbanking/guards.d.ts +2 -1
  303. package/dist/integrations/openbanking/guards.d.ts.map +1 -0
  304. package/dist/integrations/openbanking/guards.js +2 -1
  305. package/dist/integrations/openbanking/guards.js.map +1 -0
  306. package/dist/integrations/openbanking/models.d.ts +2 -1
  307. package/dist/integrations/openbanking/models.d.ts.map +1 -0
  308. package/dist/integrations/openbanking/models.js +60 -61
  309. package/dist/integrations/openbanking/models.js.map +1 -0
  310. package/dist/integrations/openbanking/openbanking.feature.d.ts +2 -1
  311. package/dist/integrations/openbanking/openbanking.feature.d.ts.map +1 -0
  312. package/dist/integrations/openbanking/openbanking.feature.js +2 -1
  313. package/dist/integrations/openbanking/openbanking.feature.js.map +1 -0
  314. package/dist/integrations/openbanking/telemetry.d.ts +2 -1
  315. package/dist/integrations/openbanking/telemetry.d.ts.map +1 -0
  316. package/dist/integrations/openbanking/telemetry.js +2 -1
  317. package/dist/integrations/openbanking/telemetry.js.map +1 -0
  318. package/dist/integrations/providers/calendar.d.ts +2 -1
  319. package/dist/integrations/providers/calendar.d.ts.map +1 -0
  320. package/dist/integrations/providers/elevenlabs.d.ts +2 -1
  321. package/dist/integrations/providers/elevenlabs.d.ts.map +1 -0
  322. package/dist/integrations/providers/elevenlabs.js +2 -1
  323. package/dist/integrations/providers/elevenlabs.js.map +1 -0
  324. package/dist/integrations/providers/email.d.ts +2 -1
  325. package/dist/integrations/providers/email.d.ts.map +1 -0
  326. package/dist/integrations/providers/embedding.d.ts +2 -1
  327. package/dist/integrations/providers/embedding.d.ts.map +1 -0
  328. package/dist/integrations/providers/gcs-storage.d.ts +2 -1
  329. package/dist/integrations/providers/gcs-storage.d.ts.map +1 -0
  330. package/dist/integrations/providers/gcs-storage.js +2 -1
  331. package/dist/integrations/providers/gcs-storage.js.map +1 -0
  332. package/dist/integrations/providers/gmail.d.ts +2 -1
  333. package/dist/integrations/providers/gmail.d.ts.map +1 -0
  334. package/dist/integrations/providers/gmail.js +2 -1
  335. package/dist/integrations/providers/gmail.js.map +1 -0
  336. package/dist/integrations/providers/google-calendar.d.ts +2 -1
  337. package/dist/integrations/providers/google-calendar.d.ts.map +1 -0
  338. package/dist/integrations/providers/google-calendar.js +2 -1
  339. package/dist/integrations/providers/google-calendar.js.map +1 -0
  340. package/dist/integrations/providers/impls/elevenlabs-voice.d.ts +2 -1
  341. package/dist/integrations/providers/impls/elevenlabs-voice.d.ts.map +1 -0
  342. package/dist/integrations/providers/impls/elevenlabs-voice.js +2 -1
  343. package/dist/integrations/providers/impls/elevenlabs-voice.js.map +1 -0
  344. package/dist/integrations/providers/impls/gcs-storage.d.ts +2 -1
  345. package/dist/integrations/providers/impls/gcs-storage.d.ts.map +1 -0
  346. package/dist/integrations/providers/impls/gcs-storage.js +2 -1
  347. package/dist/integrations/providers/impls/gcs-storage.js.map +1 -0
  348. package/dist/integrations/providers/impls/gmail-inbound.d.ts +2 -1
  349. package/dist/integrations/providers/impls/gmail-inbound.d.ts.map +1 -0
  350. package/dist/integrations/providers/impls/gmail-inbound.js +2 -1
  351. package/dist/integrations/providers/impls/gmail-inbound.js.map +1 -0
  352. package/dist/integrations/providers/impls/gmail-outbound.d.ts +2 -1
  353. package/dist/integrations/providers/impls/gmail-outbound.d.ts.map +1 -0
  354. package/dist/integrations/providers/impls/gmail-outbound.js +2 -1
  355. package/dist/integrations/providers/impls/gmail-outbound.js.map +1 -0
  356. package/dist/integrations/providers/impls/google-calendar.d.ts +2 -1
  357. package/dist/integrations/providers/impls/google-calendar.d.ts.map +1 -0
  358. package/dist/integrations/providers/impls/google-calendar.js +2 -1
  359. package/dist/integrations/providers/impls/google-calendar.js.map +1 -0
  360. package/dist/integrations/providers/impls/mistral-embedding.d.ts +2 -1
  361. package/dist/integrations/providers/impls/mistral-embedding.d.ts.map +1 -0
  362. package/dist/integrations/providers/impls/mistral-embedding.js +2 -1
  363. package/dist/integrations/providers/impls/mistral-embedding.js.map +1 -0
  364. package/dist/integrations/providers/impls/mistral-llm.d.ts +2 -1
  365. package/dist/integrations/providers/impls/mistral-llm.d.ts.map +1 -0
  366. package/dist/integrations/providers/impls/mistral-llm.js +2 -1
  367. package/dist/integrations/providers/impls/mistral-llm.js.map +1 -0
  368. package/dist/integrations/providers/impls/postmark-email.d.ts +2 -1
  369. package/dist/integrations/providers/impls/postmark-email.d.ts.map +1 -0
  370. package/dist/integrations/providers/impls/postmark-email.js +2 -1
  371. package/dist/integrations/providers/impls/postmark-email.js.map +1 -0
  372. package/dist/integrations/providers/impls/powens-client.d.ts +2 -1
  373. package/dist/integrations/providers/impls/powens-client.d.ts.map +1 -0
  374. package/dist/integrations/providers/impls/powens-client.js +2 -1
  375. package/dist/integrations/providers/impls/powens-client.js.map +1 -0
  376. package/dist/integrations/providers/impls/powens-openbanking.d.ts +2 -1
  377. package/dist/integrations/providers/impls/powens-openbanking.d.ts.map +1 -0
  378. package/dist/integrations/providers/impls/powens-openbanking.js +2 -1
  379. package/dist/integrations/providers/impls/powens-openbanking.js.map +1 -0
  380. package/dist/integrations/providers/impls/provider-factory.d.ts +2 -1
  381. package/dist/integrations/providers/impls/provider-factory.d.ts.map +1 -0
  382. package/dist/integrations/providers/impls/provider-factory.js +2 -1
  383. package/dist/integrations/providers/impls/provider-factory.js.map +1 -0
  384. package/dist/integrations/providers/impls/qdrant-vector.d.ts +2 -1
  385. package/dist/integrations/providers/impls/qdrant-vector.d.ts.map +1 -0
  386. package/dist/integrations/providers/impls/qdrant-vector.js +2 -1
  387. package/dist/integrations/providers/impls/qdrant-vector.js.map +1 -0
  388. package/dist/integrations/providers/impls/stripe-payments.d.ts +2 -1
  389. package/dist/integrations/providers/impls/stripe-payments.d.ts.map +1 -0
  390. package/dist/integrations/providers/impls/stripe-payments.js +2 -1
  391. package/dist/integrations/providers/impls/stripe-payments.js.map +1 -0
  392. package/dist/integrations/providers/impls/twilio-sms.d.ts +2 -1
  393. package/dist/integrations/providers/impls/twilio-sms.d.ts.map +1 -0
  394. package/dist/integrations/providers/impls/twilio-sms.js +2 -1
  395. package/dist/integrations/providers/impls/twilio-sms.js.map +1 -0
  396. package/dist/integrations/providers/llm.d.ts +2 -1
  397. package/dist/integrations/providers/llm.d.ts.map +1 -0
  398. package/dist/integrations/providers/mistral.d.ts +2 -1
  399. package/dist/integrations/providers/mistral.d.ts.map +1 -0
  400. package/dist/integrations/providers/mistral.js +2 -1
  401. package/dist/integrations/providers/mistral.js.map +1 -0
  402. package/dist/integrations/providers/openbanking.d.ts +2 -1
  403. package/dist/integrations/providers/openbanking.d.ts.map +1 -0
  404. package/dist/integrations/providers/payments.d.ts +2 -1
  405. package/dist/integrations/providers/payments.d.ts.map +1 -0
  406. package/dist/integrations/providers/postmark.d.ts +2 -1
  407. package/dist/integrations/providers/postmark.d.ts.map +1 -0
  408. package/dist/integrations/providers/postmark.js +2 -1
  409. package/dist/integrations/providers/postmark.js.map +1 -0
  410. package/dist/integrations/providers/powens.d.ts +2 -1
  411. package/dist/integrations/providers/powens.d.ts.map +1 -0
  412. package/dist/integrations/providers/powens.js +2 -1
  413. package/dist/integrations/providers/powens.js.map +1 -0
  414. package/dist/integrations/providers/qdrant.d.ts +2 -1
  415. package/dist/integrations/providers/qdrant.d.ts.map +1 -0
  416. package/dist/integrations/providers/qdrant.js +2 -1
  417. package/dist/integrations/providers/qdrant.js.map +1 -0
  418. package/dist/integrations/providers/registry.d.ts +2 -1
  419. package/dist/integrations/providers/registry.d.ts.map +1 -0
  420. package/dist/integrations/providers/registry.js +2 -1
  421. package/dist/integrations/providers/registry.js.map +1 -0
  422. package/dist/integrations/providers/sms.d.ts +2 -1
  423. package/dist/integrations/providers/sms.d.ts.map +1 -0
  424. package/dist/integrations/providers/storage.d.ts +2 -1
  425. package/dist/integrations/providers/storage.d.ts.map +1 -0
  426. package/dist/integrations/providers/stripe.d.ts +2 -1
  427. package/dist/integrations/providers/stripe.d.ts.map +1 -0
  428. package/dist/integrations/providers/stripe.js +2 -1
  429. package/dist/integrations/providers/stripe.js.map +1 -0
  430. package/dist/integrations/providers/twilio-sms.d.ts +2 -1
  431. package/dist/integrations/providers/twilio-sms.d.ts.map +1 -0
  432. package/dist/integrations/providers/twilio-sms.js +2 -1
  433. package/dist/integrations/providers/twilio-sms.js.map +1 -0
  434. package/dist/integrations/providers/vector-store.d.ts +2 -1
  435. package/dist/integrations/providers/vector-store.d.ts.map +1 -0
  436. package/dist/integrations/providers/voice.d.ts +2 -1
  437. package/dist/integrations/providers/voice.d.ts.map +1 -0
  438. package/dist/integrations/runtime.d.ts +2 -1
  439. package/dist/integrations/runtime.d.ts.map +1 -0
  440. package/dist/integrations/runtime.js +2 -1
  441. package/dist/integrations/runtime.js.map +1 -0
  442. package/dist/integrations/secrets/aws-secret-manager.d.ts +2 -1
  443. package/dist/integrations/secrets/aws-secret-manager.d.ts.map +1 -0
  444. package/dist/integrations/secrets/aws-secret-manager.js +2 -1
  445. package/dist/integrations/secrets/aws-secret-manager.js.map +1 -0
  446. package/dist/integrations/secrets/env-secret-provider.d.ts +2 -1
  447. package/dist/integrations/secrets/env-secret-provider.d.ts.map +1 -0
  448. package/dist/integrations/secrets/env-secret-provider.js +2 -1
  449. package/dist/integrations/secrets/env-secret-provider.js.map +1 -0
  450. package/dist/integrations/secrets/gcp-secret-manager.d.ts +2 -1
  451. package/dist/integrations/secrets/gcp-secret-manager.d.ts.map +1 -0
  452. package/dist/integrations/secrets/gcp-secret-manager.js +2 -1
  453. package/dist/integrations/secrets/gcp-secret-manager.js.map +1 -0
  454. package/dist/integrations/secrets/manager.d.ts +2 -1
  455. package/dist/integrations/secrets/manager.d.ts.map +1 -0
  456. package/dist/integrations/secrets/manager.js +2 -1
  457. package/dist/integrations/secrets/manager.js.map +1 -0
  458. package/dist/integrations/secrets/provider.d.ts +2 -1
  459. package/dist/integrations/secrets/provider.d.ts.map +1 -0
  460. package/dist/integrations/secrets/provider.js +2 -1
  461. package/dist/integrations/secrets/provider.js.map +1 -0
  462. package/dist/integrations/secrets/scaleway-secret-manager.d.ts +2 -1
  463. package/dist/integrations/secrets/scaleway-secret-manager.d.ts.map +1 -0
  464. package/dist/integrations/secrets/scaleway-secret-manager.js +2 -1
  465. package/dist/integrations/secrets/scaleway-secret-manager.js.map +1 -0
  466. package/dist/integrations/spec.d.ts +2 -1
  467. package/dist/integrations/spec.d.ts.map +1 -0
  468. package/dist/integrations/spec.js +2 -1
  469. package/dist/integrations/spec.js.map +1 -0
  470. package/dist/jobs/define-job.d.ts +2 -1
  471. package/dist/jobs/define-job.d.ts.map +1 -0
  472. package/dist/jobs/define-job.js +2 -1
  473. package/dist/jobs/define-job.js.map +1 -0
  474. package/dist/jobs/gcp-cloud-tasks.d.ts +2 -1
  475. package/dist/jobs/gcp-cloud-tasks.d.ts.map +1 -0
  476. package/dist/jobs/gcp-cloud-tasks.js +2 -1
  477. package/dist/jobs/gcp-cloud-tasks.js.map +1 -0
  478. package/dist/jobs/gcp-pubsub.d.ts +2 -1
  479. package/dist/jobs/gcp-pubsub.d.ts.map +1 -0
  480. package/dist/jobs/gcp-pubsub.js +2 -1
  481. package/dist/jobs/gcp-pubsub.js.map +1 -0
  482. package/dist/jobs/handlers/gmail-sync-handler.d.ts +2 -1
  483. package/dist/jobs/handlers/gmail-sync-handler.d.ts.map +1 -0
  484. package/dist/jobs/handlers/gmail-sync-handler.js +2 -1
  485. package/dist/jobs/handlers/gmail-sync-handler.js.map +1 -0
  486. package/dist/jobs/handlers/index.d.ts +2 -1
  487. package/dist/jobs/handlers/index.d.ts.map +1 -0
  488. package/dist/jobs/handlers/index.js +2 -1
  489. package/dist/jobs/handlers/index.js.map +1 -0
  490. package/dist/jobs/handlers/ping-handler.d.ts +2 -1
  491. package/dist/jobs/handlers/ping-handler.d.ts.map +1 -0
  492. package/dist/jobs/handlers/ping-handler.js +2 -1
  493. package/dist/jobs/handlers/ping-handler.js.map +1 -0
  494. package/dist/jobs/handlers/storage-document-handler.d.ts +2 -1
  495. package/dist/jobs/handlers/storage-document-handler.d.ts.map +1 -0
  496. package/dist/jobs/handlers/storage-document-handler.js +2 -1
  497. package/dist/jobs/handlers/storage-document-handler.js.map +1 -0
  498. package/dist/jobs/memory-queue.d.ts +2 -1
  499. package/dist/jobs/memory-queue.d.ts.map +1 -0
  500. package/dist/jobs/memory-queue.js +2 -1
  501. package/dist/jobs/memory-queue.js.map +1 -0
  502. package/dist/jobs/queue.d.ts +2 -1
  503. package/dist/jobs/queue.d.ts.map +1 -0
  504. package/dist/jobs/queue.js +2 -1
  505. package/dist/jobs/queue.js.map +1 -0
  506. package/dist/jobs/scaleway-sqs-queue.d.ts +2 -1
  507. package/dist/jobs/scaleway-sqs-queue.d.ts.map +1 -0
  508. package/dist/jobs/scaleway-sqs-queue.js +2 -1
  509. package/dist/jobs/scaleway-sqs-queue.js.map +1 -0
  510. package/dist/jsonschema.d.ts +5 -4
  511. package/dist/jsonschema.d.ts.map +1 -0
  512. package/dist/jsonschema.js +2 -1
  513. package/dist/jsonschema.js.map +1 -0
  514. package/dist/knowledge/binding.d.ts +2 -1
  515. package/dist/knowledge/binding.d.ts.map +1 -0
  516. package/dist/knowledge/contracts.d.ts +68 -67
  517. package/dist/knowledge/contracts.d.ts.map +1 -0
  518. package/dist/knowledge/contracts.js +44 -45
  519. package/dist/knowledge/contracts.js.map +1 -0
  520. package/dist/knowledge/docs/knowledge.docblock.d.ts +2 -1
  521. package/dist/knowledge/docs/knowledge.docblock.d.ts.map +1 -0
  522. package/dist/knowledge/docs/knowledge.docblock.js +2 -1
  523. package/dist/knowledge/docs/knowledge.docblock.js.map +1 -0
  524. package/dist/knowledge/ingestion/document-processor.d.ts +2 -1
  525. package/dist/knowledge/ingestion/document-processor.d.ts.map +1 -0
  526. package/dist/knowledge/ingestion/document-processor.js +2 -1
  527. package/dist/knowledge/ingestion/document-processor.js.map +1 -0
  528. package/dist/knowledge/ingestion/embedding-service.d.ts +2 -1
  529. package/dist/knowledge/ingestion/embedding-service.d.ts.map +1 -0
  530. package/dist/knowledge/ingestion/embedding-service.js +2 -1
  531. package/dist/knowledge/ingestion/embedding-service.js.map +1 -0
  532. package/dist/knowledge/ingestion/gmail-adapter.d.ts +2 -1
  533. package/dist/knowledge/ingestion/gmail-adapter.d.ts.map +1 -0
  534. package/dist/knowledge/ingestion/gmail-adapter.js +2 -1
  535. package/dist/knowledge/ingestion/gmail-adapter.js.map +1 -0
  536. package/dist/knowledge/ingestion/storage-adapter.d.ts +2 -1
  537. package/dist/knowledge/ingestion/storage-adapter.d.ts.map +1 -0
  538. package/dist/knowledge/ingestion/storage-adapter.js +2 -1
  539. package/dist/knowledge/ingestion/storage-adapter.js.map +1 -0
  540. package/dist/knowledge/ingestion/vector-indexer.d.ts +2 -1
  541. package/dist/knowledge/ingestion/vector-indexer.d.ts.map +1 -0
  542. package/dist/knowledge/ingestion/vector-indexer.js +2 -1
  543. package/dist/knowledge/ingestion/vector-indexer.js.map +1 -0
  544. package/dist/knowledge/query/service.d.ts +2 -1
  545. package/dist/knowledge/query/service.d.ts.map +1 -0
  546. package/dist/knowledge/query/service.js +2 -1
  547. package/dist/knowledge/query/service.js.map +1 -0
  548. package/dist/knowledge/runtime.d.ts +2 -1
  549. package/dist/knowledge/runtime.d.ts.map +1 -0
  550. package/dist/knowledge/runtime.js +2 -1
  551. package/dist/knowledge/runtime.js.map +1 -0
  552. package/dist/knowledge/source.d.ts +2 -1
  553. package/dist/knowledge/source.d.ts.map +1 -0
  554. package/dist/knowledge/spaces/email-threads.d.ts +2 -1
  555. package/dist/knowledge/spaces/email-threads.d.ts.map +1 -0
  556. package/dist/knowledge/spaces/email-threads.js +2 -1
  557. package/dist/knowledge/spaces/email-threads.js.map +1 -0
  558. package/dist/knowledge/spaces/financial-docs.d.ts +2 -1
  559. package/dist/knowledge/spaces/financial-docs.d.ts.map +1 -0
  560. package/dist/knowledge/spaces/financial-docs.js +2 -1
  561. package/dist/knowledge/spaces/financial-docs.js.map +1 -0
  562. package/dist/knowledge/spaces/financial-overview.d.ts +2 -1
  563. package/dist/knowledge/spaces/financial-overview.d.ts.map +1 -0
  564. package/dist/knowledge/spaces/financial-overview.js +2 -1
  565. package/dist/knowledge/spaces/financial-overview.js.map +1 -0
  566. package/dist/knowledge/spaces/product-canon.d.ts +2 -1
  567. package/dist/knowledge/spaces/product-canon.d.ts.map +1 -0
  568. package/dist/knowledge/spaces/product-canon.js +2 -1
  569. package/dist/knowledge/spaces/product-canon.js.map +1 -0
  570. package/dist/knowledge/spaces/support-faq.d.ts +2 -1
  571. package/dist/knowledge/spaces/support-faq.d.ts.map +1 -0
  572. package/dist/knowledge/spaces/support-faq.js +2 -1
  573. package/dist/knowledge/spaces/support-faq.js.map +1 -0
  574. package/dist/knowledge/spaces/uploaded-docs.d.ts +2 -1
  575. package/dist/knowledge/spaces/uploaded-docs.d.ts.map +1 -0
  576. package/dist/knowledge/spaces/uploaded-docs.js +2 -1
  577. package/dist/knowledge/spaces/uploaded-docs.js.map +1 -0
  578. package/dist/knowledge/spec.d.ts +2 -1
  579. package/dist/knowledge/spec.d.ts.map +1 -0
  580. package/dist/knowledge/spec.js +2 -1
  581. package/dist/knowledge/spec.js.map +1 -0
  582. package/dist/llm/exporters.d.ts +2 -1
  583. package/dist/llm/exporters.d.ts.map +1 -0
  584. package/dist/llm/exporters.js +2 -1
  585. package/dist/llm/exporters.js.map +1 -0
  586. package/dist/llm/prompts.d.ts +2 -1
  587. package/dist/llm/prompts.d.ts.map +1 -0
  588. package/dist/llm/prompts.js +2 -1
  589. package/dist/llm/prompts.js.map +1 -0
  590. package/dist/llm/types.d.ts +2 -1
  591. package/dist/llm/types.d.ts.map +1 -0
  592. package/dist/markdown.d.ts +2 -1
  593. package/dist/markdown.d.ts.map +1 -0
  594. package/dist/markdown.js +2 -1
  595. package/dist/markdown.js.map +1 -0
  596. package/dist/migrations.d.ts +2 -1
  597. package/dist/migrations.d.ts.map +1 -0
  598. package/dist/migrations.js +2 -1
  599. package/dist/migrations.js.map +1 -0
  600. package/dist/onboarding-base.d.ts +31 -30
  601. package/dist/onboarding-base.d.ts.map +1 -0
  602. package/dist/onboarding-base.js +22 -23
  603. package/dist/onboarding-base.js.map +1 -0
  604. package/dist/openapi.d.ts +2 -1
  605. package/dist/openapi.d.ts.map +1 -0
  606. package/dist/openapi.js +2 -1
  607. package/dist/openapi.js.map +1 -0
  608. package/dist/openbanking/docs/openbanking.docblock.d.ts +2 -1
  609. package/dist/openbanking/docs/openbanking.docblock.d.ts.map +1 -0
  610. package/dist/openbanking/docs/openbanking.docblock.js +2 -1
  611. package/dist/openbanking/docs/openbanking.docblock.js.map +1 -0
  612. package/dist/ownership.d.ts +6 -7
  613. package/dist/ownership.d.ts.map +1 -0
  614. package/dist/ownership.js +6 -6
  615. package/dist/ownership.js.map +1 -0
  616. package/dist/policy/docs/policy.docblock.d.ts +2 -1
  617. package/dist/policy/docs/policy.docblock.d.ts.map +1 -0
  618. package/dist/policy/docs/policy.docblock.js +2 -1
  619. package/dist/policy/docs/policy.docblock.js.map +1 -0
  620. package/dist/policy/engine.d.ts +2 -1
  621. package/dist/policy/engine.d.ts.map +1 -0
  622. package/dist/policy/engine.js +2 -1
  623. package/dist/policy/engine.js.map +1 -0
  624. package/dist/policy/opa-adapter.d.ts +2 -1
  625. package/dist/policy/opa-adapter.d.ts.map +1 -0
  626. package/dist/policy/opa-adapter.js +2 -1
  627. package/dist/policy/opa-adapter.js.map +1 -0
  628. package/dist/policy/spec.d.ts +2 -1
  629. package/dist/policy/spec.d.ts.map +1 -0
  630. package/dist/policy/spec.js +2 -1
  631. package/dist/policy/spec.js.map +1 -0
  632. package/dist/presentations/docs/presentations-conventions.docblock.d.ts +2 -1
  633. package/dist/presentations/docs/presentations-conventions.docblock.d.ts.map +1 -0
  634. package/dist/presentations/docs/presentations-conventions.docblock.js +2 -1
  635. package/dist/presentations/docs/presentations-conventions.docblock.js.map +1 -0
  636. package/dist/presentations.backcompat.d.ts +2 -1
  637. package/dist/presentations.backcompat.d.ts.map +1 -0
  638. package/dist/presentations.backcompat.js +2 -1
  639. package/dist/presentations.backcompat.js.map +1 -0
  640. package/dist/presentations.d.ts +5 -4
  641. package/dist/presentations.d.ts.map +1 -0
  642. package/dist/presentations.js +2 -1
  643. package/dist/presentations.js.map +1 -0
  644. package/dist/presentations.v2.d.ts +2 -1
  645. package/dist/presentations.v2.d.ts.map +1 -0
  646. package/dist/presentations.v2.js +2 -1
  647. package/dist/presentations.v2.js.map +1 -0
  648. package/dist/prompt.d.ts +2 -1
  649. package/dist/prompt.d.ts.map +1 -0
  650. package/dist/prompt.js +2 -1
  651. package/dist/prompt.js.map +1 -0
  652. package/dist/promptRegistry.d.ts +2 -1
  653. package/dist/promptRegistry.d.ts.map +1 -0
  654. package/dist/promptRegistry.js +2 -1
  655. package/dist/promptRegistry.js.map +1 -0
  656. package/dist/regenerator/adapters.d.ts +2 -1
  657. package/dist/regenerator/adapters.d.ts.map +1 -0
  658. package/dist/regenerator/docs/regenerator.docblock.d.ts +2 -1
  659. package/dist/regenerator/docs/regenerator.docblock.d.ts.map +1 -0
  660. package/dist/regenerator/docs/regenerator.docblock.js +2 -1
  661. package/dist/regenerator/docs/regenerator.docblock.js.map +1 -0
  662. package/dist/regenerator/executor.d.ts +2 -1
  663. package/dist/regenerator/executor.d.ts.map +1 -0
  664. package/dist/regenerator/executor.js +2 -1
  665. package/dist/regenerator/executor.js.map +1 -0
  666. package/dist/regenerator/service.d.ts +2 -1
  667. package/dist/regenerator/service.d.ts.map +1 -0
  668. package/dist/regenerator/service.js +2 -1
  669. package/dist/regenerator/service.js.map +1 -0
  670. package/dist/regenerator/sinks.d.ts +2 -1
  671. package/dist/regenerator/sinks.d.ts.map +1 -0
  672. package/dist/regenerator/sinks.js +2 -1
  673. package/dist/regenerator/sinks.js.map +1 -0
  674. package/dist/regenerator/types.d.ts +2 -1
  675. package/dist/regenerator/types.d.ts.map +1 -0
  676. package/dist/regenerator/utils.d.ts +2 -1
  677. package/dist/regenerator/utils.d.ts.map +1 -0
  678. package/dist/regenerator/utils.js +2 -1
  679. package/dist/regenerator/utils.js.map +1 -0
  680. package/dist/registry.d.ts +2 -1
  681. package/dist/registry.d.ts.map +1 -0
  682. package/dist/registry.js +2 -1
  683. package/dist/registry.js.map +1 -0
  684. package/dist/resources.d.ts +2 -1
  685. package/dist/resources.d.ts.map +1 -0
  686. package/dist/resources.js +2 -1
  687. package/dist/resources.js.map +1 -0
  688. package/dist/schema/dist/index.js +4684 -6
  689. package/dist/schema/dist/index.js.map +1 -0
  690. package/dist/schema-to-markdown.d.ts +2 -1
  691. package/dist/schema-to-markdown.d.ts.map +1 -0
  692. package/dist/schema-to-markdown.js +2 -1
  693. package/dist/schema-to-markdown.js.map +1 -0
  694. package/dist/server/graphql-pothos.d.ts +2 -1
  695. package/dist/server/graphql-pothos.d.ts.map +1 -0
  696. package/dist/server/graphql-pothos.js +2 -1
  697. package/dist/server/graphql-pothos.js.map +1 -0
  698. package/dist/server/mcp/createMcpServer.d.ts +2 -1
  699. package/dist/server/mcp/createMcpServer.d.ts.map +1 -0
  700. package/dist/server/mcp/createMcpServer.js +2 -1
  701. package/dist/server/mcp/createMcpServer.js.map +1 -0
  702. package/dist/server/mcp/mcpTypes.d.ts +2 -1
  703. package/dist/server/mcp/mcpTypes.d.ts.map +1 -0
  704. package/dist/server/mcp/registerPresentations.d.ts +2 -1
  705. package/dist/server/mcp/registerPresentations.d.ts.map +1 -0
  706. package/dist/server/mcp/registerPresentations.js +2 -1
  707. package/dist/server/mcp/registerPresentations.js.map +1 -0
  708. package/dist/server/mcp/registerPrompts.d.ts +2 -1
  709. package/dist/server/mcp/registerPrompts.d.ts.map +1 -0
  710. package/dist/server/mcp/registerPrompts.js +2 -1
  711. package/dist/server/mcp/registerPrompts.js.map +1 -0
  712. package/dist/server/mcp/registerResources.d.ts +2 -1
  713. package/dist/server/mcp/registerResources.d.ts.map +1 -0
  714. package/dist/server/mcp/registerResources.js +2 -1
  715. package/dist/server/mcp/registerResources.js.map +1 -0
  716. package/dist/server/mcp/registerTools.d.ts +2 -1
  717. package/dist/server/mcp/registerTools.d.ts.map +1 -0
  718. package/dist/server/mcp/registerTools.js +2 -1
  719. package/dist/server/mcp/registerTools.js.map +1 -0
  720. package/dist/server/rest-elysia.d.ts +2 -1
  721. package/dist/server/rest-elysia.d.ts.map +1 -0
  722. package/dist/server/rest-elysia.js +2 -1
  723. package/dist/server/rest-elysia.js.map +1 -0
  724. package/dist/server/rest-express.d.ts +2 -1
  725. package/dist/server/rest-express.d.ts.map +1 -0
  726. package/dist/server/rest-express.js +2 -1
  727. package/dist/server/rest-express.js.map +1 -0
  728. package/dist/server/rest-generic.d.ts +2 -1
  729. package/dist/server/rest-generic.d.ts.map +1 -0
  730. package/dist/server/rest-generic.js +2 -1
  731. package/dist/server/rest-generic.js.map +1 -0
  732. package/dist/server/rest-next-app.d.ts +2 -1
  733. package/dist/server/rest-next-app.d.ts.map +1 -0
  734. package/dist/server/rest-next-app.js +2 -1
  735. package/dist/server/rest-next-app.js.map +1 -0
  736. package/dist/server/rest-next-mcp.d.ts +2 -1
  737. package/dist/server/rest-next-mcp.d.ts.map +1 -0
  738. package/dist/server/rest-next-mcp.js +2 -1
  739. package/dist/server/rest-next-mcp.js.map +1 -0
  740. package/dist/server/rest-next-pages.d.ts +2 -1
  741. package/dist/server/rest-next-pages.d.ts.map +1 -0
  742. package/dist/server/rest-next-pages.js +2 -1
  743. package/dist/server/rest-next-pages.js.map +1 -0
  744. package/dist/spec.d.ts +2 -1
  745. package/dist/spec.d.ts.map +1 -0
  746. package/dist/spec.js +2 -1
  747. package/dist/spec.js.map +1 -0
  748. package/dist/telemetry/anomaly.d.ts +2 -1
  749. package/dist/telemetry/anomaly.d.ts.map +1 -0
  750. package/dist/telemetry/anomaly.js +2 -1
  751. package/dist/telemetry/anomaly.js.map +1 -0
  752. package/dist/telemetry/docs/telemetry.docblock.d.ts +2 -1
  753. package/dist/telemetry/docs/telemetry.docblock.d.ts.map +1 -0
  754. package/dist/telemetry/docs/telemetry.docblock.js +2 -1
  755. package/dist/telemetry/docs/telemetry.docblock.js.map +1 -0
  756. package/dist/telemetry/spec.d.ts +2 -1
  757. package/dist/telemetry/spec.d.ts.map +1 -0
  758. package/dist/telemetry/spec.js +2 -1
  759. package/dist/telemetry/spec.js.map +1 -0
  760. package/dist/telemetry/tracker.d.ts +2 -1
  761. package/dist/telemetry/tracker.d.ts.map +1 -0
  762. package/dist/telemetry/tracker.js +2 -1
  763. package/dist/telemetry/tracker.js.map +1 -0
  764. package/dist/tests/runner.d.ts +2 -1
  765. package/dist/tests/runner.d.ts.map +1 -0
  766. package/dist/tests/runner.js +2 -1
  767. package/dist/tests/runner.js.map +1 -0
  768. package/dist/tests/spec.d.ts +2 -1
  769. package/dist/tests/spec.d.ts.map +1 -0
  770. package/dist/tests/spec.js +2 -1
  771. package/dist/tests/spec.js.map +1 -0
  772. package/dist/themes.d.ts +2 -1
  773. package/dist/themes.d.ts.map +1 -0
  774. package/dist/themes.js +2 -1
  775. package/dist/themes.js.map +1 -0
  776. package/dist/translations/catalog.d.ts +2 -1
  777. package/dist/translations/catalog.d.ts.map +1 -0
  778. package/dist/translations/tenant.d.ts +2 -1
  779. package/dist/translations/tenant.d.ts.map +1 -0
  780. package/dist/types.d.ts +2 -1
  781. package/dist/types.d.ts.map +1 -0
  782. package/dist/workflow/adapters/db-adapter.d.ts +21 -8
  783. package/dist/workflow/adapters/db-adapter.d.ts.map +1 -0
  784. package/dist/workflow/adapters/db-adapter.js +5 -4
  785. package/dist/workflow/adapters/db-adapter.js.map +1 -0
  786. package/dist/workflow/adapters/file-adapter.d.ts +2 -1
  787. package/dist/workflow/adapters/file-adapter.d.ts.map +1 -0
  788. package/dist/workflow/adapters/file-adapter.js +2 -1
  789. package/dist/workflow/adapters/file-adapter.js.map +1 -0
  790. package/dist/workflow/adapters/memory-store.d.ts +2 -1
  791. package/dist/workflow/adapters/memory-store.d.ts.map +1 -0
  792. package/dist/workflow/adapters/memory-store.js +2 -1
  793. package/dist/workflow/adapters/memory-store.js.map +1 -0
  794. package/dist/workflow/expression.d.ts +2 -1
  795. package/dist/workflow/expression.d.ts.map +1 -0
  796. package/dist/workflow/expression.js +2 -1
  797. package/dist/workflow/expression.js.map +1 -0
  798. package/dist/workflow/runner.d.ts +2 -1
  799. package/dist/workflow/runner.d.ts.map +1 -0
  800. package/dist/workflow/runner.js +2 -1
  801. package/dist/workflow/runner.js.map +1 -0
  802. package/dist/workflow/sla-monitor.d.ts +2 -1
  803. package/dist/workflow/sla-monitor.d.ts.map +1 -0
  804. package/dist/workflow/sla-monitor.js +2 -1
  805. package/dist/workflow/sla-monitor.js.map +1 -0
  806. package/dist/workflow/spec.d.ts +2 -1
  807. package/dist/workflow/spec.d.ts.map +1 -0
  808. package/dist/workflow/spec.js +2 -1
  809. package/dist/workflow/spec.js.map +1 -0
  810. package/dist/workflow/state.d.ts +2 -1
  811. package/dist/workflow/state.d.ts.map +1 -0
  812. package/dist/workflow/validation.d.ts +2 -1
  813. package/dist/workflow/validation.d.ts.map +1 -0
  814. package/dist/workflow/validation.js +2 -1
  815. package/dist/workflow/validation.js.map +1 -0
  816. package/package.json +12 -17
  817. package/dist/docs/PUBLISHING.docblock.d.ts +0 -6
  818. package/dist/docs/PUBLISHING.docblock.js +0 -17
  819. package/dist/docs/tech/PHASE_1_QUICKSTART.docblock.d.ts +0 -6
  820. package/dist/docs/tech/PHASE_1_QUICKSTART.docblock.js +0 -17
  821. package/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.d.ts +0 -6
  822. package/dist/docs/tech/PHASE_2_AI_NATIVE_OPERATIONS.docblock.js +0 -17
  823. package/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.d.ts +0 -6
  824. package/dist/docs/tech/PHASE_3_AUTO_EVOLUTION.docblock.js +0 -17
  825. package/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.d.ts +0 -6
  826. package/dist/docs/tech/PHASE_4_PERSONALIZATION_ENGINE.docblock.js +0 -17
  827. package/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.d.ts +0 -6
  828. package/dist/docs/tech/PHASE_5_ZERO_TOUCH_OPERATIONS.docblock.js +0 -17
  829. package/dist/schema/dist/EnumType.js +0 -2
  830. package/dist/schema/dist/FieldType.js +0 -49
  831. package/dist/schema/dist/ScalarTypeEnum.js +0 -236
  832. package/dist/schema/dist/SchemaModel.js +0 -39
  833. package/dist/schema/dist/entity/defineEntity.js +0 -1
  834. package/dist/schema/dist/entity/index.js +0 -2
  835. package/dist/schema/dist/entity/types.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ownership.js","names":[],"sources":["../src/ownership.ts"],"sourcesContent":["// Canonical ownership/stability/tags enums and shared meta\n\nexport const StabilityEnum = {\n Idea: 'idea',\n InCreation: 'in_creation',\n Experimental: 'experimental',\n Beta: 'beta',\n Stable: 'stable',\n Deprecated: 'deprecated',\n} as const;\nexport type Stability = (typeof StabilityEnum)[keyof typeof StabilityEnum];\n\n// Provide curated owner identifiers (business/product oriented), allow extension by string\nexport const OwnersEnum = {\n ProductColiving: 'product.coliving',\n ProductStrit: 'product.strit',\n ProductArtisanos: 'product.artisanos',\n PlatformSigil: 'platform.sigil',\n PlatformMarketplace: 'platform.marketplace',\n PlatformContent: 'platform.content',\n PlatformFeatureFlags: 'platform.featureflags',\n PlatformFinance: 'platform.finance',\n} as const;\nexport type Owner =\n | (typeof OwnersEnum)[keyof typeof OwnersEnum]\n | (string & {});\n// Back-compat alias\nexport const Owners = OwnersEnum;\n\n// Provide common tags, allow extension by string\nexport const TagsEnum = {\n Spots: 'spots',\n Collectivity: 'collectivity',\n Marketplace: 'marketplace',\n Sellers: 'sellers',\n Auth: 'auth',\n Login: 'login',\n Signup: 'signup',\n Guide: 'guide',\n Docs: 'docs',\n I18n: 'i18n',\n Incident: 'incident',\n Automation: 'automation',\n Hygiene: 'hygiene',\n} as const;\nexport type Tag = (typeof TagsEnum)[keyof typeof TagsEnum] | (string & {});\n// Back-compat alias\nexport const Tags = TagsEnum;\n\nexport interface OwnerShipMeta {\n version?: number;\n title: string;\n description: string;\n domain: string;\n owners: Owner[];\n tags: Tag[];\n stability: Stability;\n}\n"],"mappings":";AAEA,MAAa,gBAAgB;CAC3B,MAAM;CACN,YAAY;CACZ,cAAc;CACd,MAAM;CACN,QAAQ;CACR,YAAY;CACb;AAID,MAAa,aAAa;CACxB,iBAAiB;CACjB,cAAc;CACd,kBAAkB;CAClB,eAAe;CACf,qBAAqB;CACrB,iBAAiB;CACjB,sBAAsB;CACtB,iBAAiB;CAClB;AAKD,MAAa,SAAS;AAGtB,MAAa,WAAW;CACtB,OAAO;CACP,cAAc;CACd,aAAa;CACb,SAAS;CACT,MAAM;CACN,OAAO;CACP,QAAQ;CACR,OAAO;CACP,MAAM;CACN,MAAM;CACN,UAAU;CACV,YAAY;CACZ,SAAS;CACV;AAGD,MAAa,OAAO"}
@@ -3,4 +3,5 @@ import { DocBlock } from "@lssm/lib.contracts/docs";
3
3
  //#region src/policy/docs/policy.docblock.d.ts
4
4
  declare const tech_contracts_policy_DocBlocks: DocBlock[];
5
5
  //#endregion
6
- export { tech_contracts_policy_DocBlocks };
6
+ export { tech_contracts_policy_DocBlocks };
7
+ //# sourceMappingURL=policy.docblock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.docblock.d.ts","names":[],"sources":["../../../src/policy/docs/policy.docblock.ts"],"sourcesContent":[],"mappings":";;;cAGa,iCAAiC"}
@@ -19,4 +19,5 @@ const tech_contracts_policy_DocBlocks = [{
19
19
  registerDocBlocks(tech_contracts_policy_DocBlocks);
20
20
 
21
21
  //#endregion
22
- export { tech_contracts_policy_DocBlocks };
22
+ export { tech_contracts_policy_DocBlocks };
23
+ //# sourceMappingURL=policy.docblock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.docblock.js","names":["tech_contracts_policy_DocBlocks: DocBlock[]"],"sources":["../../../src/policy/docs/policy.docblock.ts"],"sourcesContent":["import type { DocBlock } from '@lssm/lib.contracts/docs';\nimport { registerDocBlocks } from '../../registry';\n\nexport const tech_contracts_policy_DocBlocks: DocBlock[] = [\n {\n id: 'docs.tech.contracts.policy',\n title: 'PolicySpec & PolicyEngine',\n summary:\n '`PolicySpec` gives a declarative, typed home for access-control logic covering:',\n kind: 'reference',\n visibility: 'public',\n route: '/docs/tech/contracts/policy',\n tags: ['tech', 'contracts', 'policy'],\n body: \"# PolicySpec & PolicyEngine\\n\\n## Purpose\\n\\n`PolicySpec` gives a declarative, typed home for access-control logic covering:\\n- **Who** can perform an action (ABAC/ReBAC style rules)\\n- **What** they can access (resources + optional field-level overrides)\\n- **When** special conditions apply (contextual expressions)\\n- **How** PII should be handled (consent/retention hints)\\n\\n`PolicyEngine` evaluates one or more policies and returns an `allow`/`deny` decision, field-level outcomes, and PII metadata suitable for downstream enforcement (`SpecRegistry` \\u2192 `ctx.decide`).\\n\\n## Location\\n\\n- Types & registry: `packages/libs/contracts/src/policy/spec.ts`\\n- Runtime evaluation: `packages/libs/contracts/src/policy/engine.ts`\\n- Tests: `packages/.../policy/engine.test.ts`\\n\\n## `PolicySpec`\\n\\n```ts\\nexport interface PolicySpec {\\n meta: PolicyMeta; // ownership metadata + { name, version, scope? }\\n rules: PolicyRule[]; // allow/deny rules for actions\\n fieldPolicies?: FieldPolicyRule[];\\n pii?: { fields: string[]; consentRequired?: boolean; retentionDays?: number };\\n relationships?: RelationshipDefinition[];\\n consents?: ConsentDefinition[];\\n rateLimits?: RateLimitDefinition[];\\n opa?: { package: string; decision?: string };\\n}\\n```\\n\\n- `PolicyRule`\\n - `effect`: `'allow' | 'deny'`\\n - `actions`: e.g., `['read', 'write', 'delete']` (string namespace is flexible)\\n - `subject`: `{ roles?: string[]; attributes?: { attr: matcher } }`\\n - `resource`: `{ type: string; fields?: string[]; attributes?: {...} }`\\n - `relationships`: `{ relation, objectId?, objectType? }[]` \\u2192 ReBAC checks (use `objectId: '$resource'` to target the current resource)\\n - `requiresConsent`: `['consent_id']` \\u2192 references spec-level consent definitions\\n - `flags`: feature flags that must be enabled (`DecisionContext.flags`)\\n - `rateLimit`: string reference to `rateLimits` entry or inline object `{ rpm, key?, windowSeconds?, burst? }`\\n - `escalate`: `'human_review' | null` to indicate manual approval\\n - `conditions`: optional expression snippets evaluated against `{ subject, resource, context }`\\n- `FieldPolicyRule`\\n - `field`: dot-path string (e.g., `contact.email`)\\n - `actions`: subset of `['read', 'write']`\\n - Same `subject` / `resource` / `conditions` shape\\n - Useful for redacting specific fields, even when the global action is allowed\\n- `RelationshipDefinition`\\n - Canonical tuples for relationship graph (`subjectType`, `relation`, `objectType`, `transitive?`)\\n- `ConsentDefinition`\\n - `{ id, scope, purpose, lawfulBasis?, expiresInDays?, required? }`\\n- `RateLimitDefinition`\\n - `{ id, rpm, key?, windowSeconds?, burst? }`\\n- `PolicyRef`\\n - `{ name: string; version: number }` \\u2192 attach to contract specs / workflows\\n\\n## Registry\\n\\n```ts\\nconst registry = new PolicyRegistry();\\nregistry.register(CorePolicySpec);\\nconst spec = registry.get('core.default', 1);\\n```\\n\\nGuarantees uniqueness per `(name, version)` and exposes helpers to resolve highest versions.\\n\\n## Engine\\n\\n```ts\\nconst engine = new PolicyEngine(policyRegistry);\\n\\nconst decision = engine.decide({\\n action: 'read',\\n subject: { roles: ['admin'] },\\n resource: { type: 'resident', fields: ['contact.email'] },\\n policies: [{ name: 'core.default', version: 1 }],\\n});\\n/*\\n{\\n effect: 'allow',\\n reason: 'core.default',\\n fieldDecisions: [{ field: 'contact.email', effect: 'allow' }],\\n pii: { fields: ['contact.email'], consentRequired: true }\\n}\\n*/\\n```\\n\\n- First matching **deny** wins; otherwise the first **allow** is returned.\\n- Field policies are aggregated across referenced policies:\\n - Later denies override earlier allows for a given field.\\n - Returned as `fieldDecisions` to simplify downstream masking.\\n- PII metadata is surfaced when defined to help adapt logging/telemetry.\\n\\n### Expression Support\\n\\nConditions accept small JS snippets (e.g., `subject.attributes.orgId === context.orgId`). The engine runs them in a constrained scope (`subject`, `resource`, `context`) without access to global state.\\n\\n### ReBAC & Relationships\\n\\n- Provide relationship tuples via `PolicySpec.relationships` for documentation/validation.\\n- Reference them inside rules with `relationships: [{ relation: 'manager_of', objectType: 'resident', objectId: '$resource' }]`.\\n- The execution context must populate `subject.relationships` (`[{ relation, object, objectType }]`) for the engine to evaluate ReBAC guards.\\n\\n### Consent & Rate Limits\\n\\n- Declare reusable consent definitions under `consents`. Rules list the IDs they require; if a user session lacks the consent (`DecisionContext.consents`), the engine returns `effect: 'deny'` with `reason: 'consent_required'` and enumerates missing consents.\\n- Attach rate limits either inline or via `rateLimits` references. When a rule matches, the engine surfaces `{ rpm, key, windowSeconds?, burst? }` so callers can feed it to shared limiters.\\n\\n### OPA Adapter\\n\\n- `OPAPolicyAdapter` bridges engine decisions to Open Policy Agent (OPA). It forwards the evaluation context + policies to OPA and merges any override result (`effect`, `reason`, `fieldDecisions`, `requiredConsents`).\\n- Use when migrating to OPA policies or running defense-in-depth: call `engine.decide()`, then pass the preliminary decision to `adapter.evaluate(...)`. The adapter marks merged decisions with `evaluatedBy: 'opa'`.\\n- OPA inputs include meta, rules, relationships, rate limits, and consent catalogs to simplify policy authoring on the OPA side.\\n\\n## Contract Integration\\n\\n`ContractSpec.policy` now supports:\\n\\n```ts\\npolicy: {\\n auth: 'anonymous' | 'user' | 'admin';\\n ...\\n policies?: PolicyRef[]; // policies evaluated before execution\\n fieldPolicies?: { // field hints (read/write) per policy\\n field: string;\\n actions: ('read' | 'write')[];\\n policy?: PolicyRef;\\n }[];\\n}\\n```\\n\\nAdapters can resolve refs through a shared `PolicyEngine` and populate `ctx.decide` so `SpecRegistry.execute` benefits from centralized enforcement.\\n\\n## Authoring Guidelines\\n\\n1. Prefer **allow-by-default** policies but explicitly deny sensitive flows (defense-in-depth).\\n2. Keep rule scopes narrow (per feature/operation) and compose multiple `PolicyRef`s when necessary.\\n3. Store PII field lists here to avoid duplication across logs/telemetry.\\n4. Use explicit rule reasons for auditability and better developer feedback.\\n5. Treat versioning seriously; bump `meta.version` whenever behavior changes.\\n\\n## Future Enhancements\\n\\n- Richer expression language (composable predicates, time-based conditions).\\n- Multi-tenant relationship graph services (store/resolve relationships at scale).\\n- Tooling that auto-generates docs/tests for policies referenced in specs.\\n\\n\",\n },\n];\nregisterDocBlocks(tech_contracts_policy_DocBlocks);\n"],"mappings":";;;;AAGA,MAAaA,kCAA8C,CACzD;CACE,IAAI;CACJ,OAAO;CACP,SACE;CACF,MAAM;CACN,YAAY;CACZ,OAAO;CACP,MAAM;EAAC;EAAQ;EAAa;EAAS;CACrC,MAAM;CACP,CACF;AACD,kBAAkB,gCAAgC"}
@@ -36,4 +36,5 @@ declare class PolicyEngine {
36
36
  private evaluateFields;
37
37
  }
38
38
  //#endregion
39
- export { DecisionContext, PolicyEngine, ResourceContext, SubjectContext, SubjectRelationship };
39
+ export { DecisionContext, PolicyEngine, ResourceContext, SubjectContext, SubjectRelationship };
40
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","names":[],"sources":["../../src/policy/engine.ts"],"sourcesContent":[],"mappings":";;;;UAaiB,mBAAA;;EAAA,MAAA,EAAA,MAAA;EAMA,UAAA,CAAA,EAAA,MAAc;AAM/B;AAOiB,UAbA,cAAA,CAae;EACrB,KAAA,CAAA,EAAA,MAAA,EAAA;EACC,UAAA,CAAA,EAbG,MAaH,CAAA,MAAA,EAAA,OAAA,CAAA;EACA,aAAA,CAAA,EAbM,mBAaN,EAAA;;AAES,UAZJ,eAAA,CAYI;EAWR,IAAA,EAAA,MAAA;EAC4B,EAAA,CAAA,EAAA,MAAA;EAEzB,MAAA,CAAA,EAAA,MAAA,EAAA;EAAkB,UAAA,CAAA,EAtBnB,MAsBmB,CAAA,MAAA,EAAA,OAAA,CAAA;;UAnBjB,eAAA;WACN;YACC;YACA;;YAEA;;;;cAWC,YAAA;;wBAC4B;gBAEzB,kBAAkB"}
@@ -220,4 +220,5 @@ function getResourceId(resource) {
220
220
  }
221
221
 
222
222
  //#endregion
223
- export { PolicyEngine };
223
+ export { PolicyEngine };
224
+ //# sourceMappingURL=engine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.js","names":["registry: PolicyRegistry","allowReason: string | undefined","appliedRateLimit: PolicyDecision['rateLimit']","escalate: 'human_review' | null | undefined","specs: PolicySpec[]","allowMatch: RuleEvaluation | undefined","evaluation: RuleEvaluation","definition: RateLimitDefinition | undefined"],"sources":["../../src/policy/engine.ts"],"sourcesContent":["import {\n PolicyRegistry,\n type PolicyRef,\n type PolicySpec,\n type PolicyRule,\n type FieldPolicyRule,\n type PolicyCondition,\n type ConsentDefinition,\n type RateLimitDefinition,\n type RelationshipMatcher,\n} from './spec';\nimport type { PolicyDecision, FieldLevelDecision } from '../types';\n\nexport interface SubjectRelationship {\n relation: string;\n object: string;\n objectType?: string;\n}\n\nexport interface SubjectContext {\n roles?: string[];\n attributes?: Record<string, unknown>;\n relationships?: SubjectRelationship[];\n}\n\nexport interface ResourceContext {\n type: string;\n id?: string;\n fields?: string[];\n attributes?: Record<string, unknown>;\n}\n\nexport interface DecisionContext {\n subject: SubjectContext;\n resource: ResourceContext;\n context?: Record<string, unknown>;\n action: string;\n policies: PolicyRef[];\n consents?: string[];\n flags?: string[];\n}\n\ninterface RuleEvaluation {\n rule: PolicyRule;\n missingConsents: ConsentDefinition[];\n rateLimit?: PolicyDecision['rateLimit'];\n}\n\nexport class PolicyEngine {\n constructor(private readonly registry: PolicyRegistry) {}\n\n decide(input: DecisionContext): PolicyDecision {\n const policies = this.resolvePolicies(input.policies);\n let allowReason: string | undefined;\n let appliedRateLimit: PolicyDecision['rateLimit'];\n let escalate: 'human_review' | null | undefined;\n\n for (const policy of policies) {\n const match = this.matchRuleSet(policy, input);\n if (!match) continue;\n if (match.rule.effect === 'deny') {\n return {\n effect: 'deny',\n reason: match.rule.reason ?? policy.meta.name,\n requiredConsents: match.missingConsents.length\n ? match.missingConsents\n : undefined,\n evaluatedBy: 'engine',\n };\n }\n if (match.rule.effect === 'allow') {\n if (match.missingConsents.length) {\n return {\n effect: 'deny',\n reason: 'consent_required',\n requiredConsents: match.missingConsents,\n evaluatedBy: 'engine',\n };\n }\n if (!allowReason) {\n allowReason = match.rule.reason ?? policy.meta.name;\n }\n if (!appliedRateLimit && match.rateLimit) {\n appliedRateLimit = match.rateLimit;\n }\n if (!escalate && match.rule.escalate) {\n escalate = match.rule.escalate;\n }\n }\n }\n\n const fieldDecisions = this.evaluateFields(policies, input);\n const pii = policies.find((p) => p.pii)?.pii;\n const escalateValue =\n typeof escalate === 'undefined' ? undefined : escalate;\n\n return {\n effect: allowReason ? 'allow' : 'deny',\n reason: allowReason,\n rateLimit: appliedRateLimit,\n escalate: escalateValue,\n fieldDecisions: fieldDecisions.length ? fieldDecisions : undefined,\n pii,\n evaluatedBy: 'engine',\n };\n }\n\n private resolvePolicies(refs: PolicyRef[]): PolicySpec[] {\n const specs: PolicySpec[] = [];\n for (const ref of refs) {\n const spec = this.registry.get(ref.name, ref.version);\n if (!spec)\n throw new Error(\n `PolicyEngine: policy not found ${ref.name}.v${ref.version}`\n );\n specs.push(spec);\n }\n return specs;\n }\n\n private matchRuleSet(\n policy: PolicySpec,\n input: DecisionContext\n ): RuleEvaluation | undefined {\n let allowMatch: RuleEvaluation | undefined;\n for (const rule of policy.rules) {\n if (!rule.actions.includes(input.action)) continue;\n if (!matchesSubject(rule, input.subject)) continue;\n if (!matchesResource(rule, input.resource)) continue;\n if (!matchesFlags(rule, input)) continue;\n if (!matchesRelationships(rule.relationships, input)) continue;\n if (!matchesConditions(rule, input)) continue;\n const missingConsents = collectMissingConsents(rule, policy, input);\n const rateLimit = resolveRateLimit(rule, policy, input);\n const evaluation: RuleEvaluation = {\n rule,\n missingConsents,\n rateLimit,\n };\n if (rule.effect === 'deny') return evaluation;\n if (rule.effect === 'allow' && !allowMatch) allowMatch = evaluation;\n }\n return allowMatch;\n }\n\n private evaluateFields(\n policies: PolicySpec[],\n input: DecisionContext\n ): FieldLevelDecision[] {\n const out = new Map<string, FieldLevelDecision>();\n for (const policy of policies) {\n if (!policy.fieldPolicies) continue;\n for (const rule of policy.fieldPolicies) {\n if (!rule.actions.includes(mapActionToFieldAction(input.action)))\n continue;\n if (!matchesSubject(rule, input.subject)) continue;\n if (!matchesResource(rule, input.resource)) continue;\n if (!matchesConditions(rule, input)) continue;\n const existing = out.get(rule.field);\n if (rule.effect === 'deny') {\n out.set(rule.field, {\n field: rule.field,\n effect: 'deny',\n reason: rule.reason ?? policy.meta.name,\n });\n } else if (!existing) {\n out.set(rule.field, {\n field: rule.field,\n effect: 'allow',\n reason: rule.reason ?? policy.meta.name,\n });\n }\n }\n }\n return [...out.values()];\n }\n}\n\nfunction mapActionToFieldAction(action: string): 'read' | 'write' {\n if (action.startsWith('write')) return 'write';\n return 'read';\n}\n\nfunction matchesSubject(\n rule: { subject?: PolicyRule['subject'] | FieldPolicyRule['subject'] },\n subject: SubjectContext\n): boolean {\n const matcher = rule.subject;\n if (!matcher) return true;\n if (matcher.roles?.length) {\n const roles = subject.roles ?? [];\n const hasRole = matcher.roles.some((role) => roles.includes(role));\n if (!hasRole) return false;\n }\n if (matcher.attributes) {\n const attributes = subject.attributes ?? {};\n if (!matchAttributes(matcher.attributes, attributes)) return false;\n }\n return true;\n}\n\nfunction matchesResource(\n rule: { resource?: PolicyRule['resource'] | FieldPolicyRule['resource'] },\n resource: ResourceContext\n): boolean {\n const matcher = rule.resource;\n if (!matcher) return true;\n if (matcher.type && matcher.type !== resource.type) return false;\n if (matcher.fields?.length) {\n const targetFields = resource.fields ?? [];\n if (!matcher.fields.some((field) => targetFields.includes(field)))\n return false;\n }\n if (matcher.attributes) {\n const attributes = resource.attributes ?? {};\n if (!matchAttributes(matcher.attributes, attributes)) return false;\n }\n return true;\n}\n\nfunction matchesFlags(rule: PolicyRule, input: DecisionContext): boolean {\n if (!rule.flags?.length) return true;\n const available = new Set<string>();\n if (input.flags) {\n for (const flag of input.flags) available.add(flag);\n }\n const attributeFlags = input.subject.attributes?.featureFlags;\n if (Array.isArray(attributeFlags)) {\n for (const flag of attributeFlags) available.add(flag);\n }\n return rule.flags.every((flag) => available.has(flag));\n}\n\nfunction matchesRelationships(\n matchers: RelationshipMatcher[] | undefined,\n input: DecisionContext\n): boolean {\n if (!matchers || matchers.length === 0) return true;\n const relationships = input.subject.relationships ?? [];\n const resourceId = getResourceId(input.resource);\n const resourceType = input.resource.type;\n\n return matchers.every((matcher) =>\n relationships.some((relation) => {\n if (relation.relation !== matcher.relation) return false;\n\n const typeMatches =\n !matcher.objectType ||\n relation.objectType === matcher.objectType ||\n matcher.objectType === resourceType;\n\n if (!typeMatches) return false;\n\n if (!matcher.objectId) return true;\n\n if (matcher.objectId === '$resource') {\n if (resourceId) {\n return relation.object === resourceId;\n }\n return (\n relation.object === resourceType ||\n relation.objectType === resourceType\n );\n }\n\n return relation.object === matcher.objectId;\n })\n );\n}\n\nfunction matchesConditions(\n rule: { conditions?: PolicyCondition[] },\n input: DecisionContext\n): boolean {\n if (!rule.conditions || rule.conditions.length === 0) return true;\n return rule.conditions.every((condition) =>\n evaluateCondition(condition.expression, input)\n );\n}\n\nfunction matchAttributes(\n matcher: Record<string, import('./spec').AttributeMatcher>,\n actual: Record<string, unknown>\n): boolean {\n for (const [key, attrMatcher] of Object.entries(matcher)) {\n const value = actual[key];\n if (attrMatcher.exists && typeof value === 'undefined') return false;\n if (typeof attrMatcher.equals !== 'undefined') {\n if (value !== attrMatcher.equals) return false;\n }\n if (attrMatcher.oneOf && !attrMatcher.oneOf.includes(value)) return false;\n }\n return true;\n}\n\nfunction collectMissingConsents(\n rule: PolicyRule,\n policy: PolicySpec,\n input: DecisionContext\n): ConsentDefinition[] {\n if (!rule.requiresConsent?.length) return [];\n const granted = new Set(input.consents ?? []);\n const missingIds = rule.requiresConsent.filter((id) => !granted.has(id));\n if (missingIds.length === 0) return [];\n return resolveConsentDefinitions(policy, missingIds);\n}\n\nfunction resolveConsentDefinitions(\n policy: PolicySpec,\n ids: string[]\n): ConsentDefinition[] {\n const catalog = policy.consents ?? [];\n return ids.map((id) => {\n const found = catalog.find((consent) => consent.id === id);\n return (\n found ?? {\n id,\n scope: 'unspecified',\n purpose: 'unspecified',\n description: `Consent \"${id}\" required by ${policy.meta.name}`,\n required: true,\n }\n );\n });\n}\n\nfunction resolveRateLimit(\n rule: PolicyRule,\n policy: PolicySpec,\n input: DecisionContext\n): PolicyDecision['rateLimit'] | undefined {\n if (!rule.rateLimit) return undefined;\n const definition: RateLimitDefinition | undefined =\n typeof rule.rateLimit === 'string'\n ? (policy.rateLimits ?? []).find((item) => item.id === rule.rateLimit)\n : rule.rateLimit;\n\n if (!definition) {\n throw new Error(\n `PolicyEngine: rate limit \"${String(\n rule.rateLimit\n )}\" not declared in ${policy.meta.name}`\n );\n }\n\n return {\n rpm: definition.rpm,\n key: definition.key ?? input.resource.type,\n windowSeconds: definition.windowSeconds,\n burst: definition.burst,\n };\n}\n\nfunction evaluateCondition(\n expression: string,\n input: DecisionContext\n): boolean {\n const trimmed = expression.trim();\n if (!trimmed) return true;\n\n const context = {\n subject: input.subject,\n resource: input.resource,\n context: input.context ?? {},\n };\n\n try {\n // very small whitelist of expressions\n // Supports subject/resource/context dot paths, comparisons, and logical operators.\n const fn = new Function(\n 'subject',\n 'resource',\n 'context',\n `return (${transformExpression(trimmed)});`\n );\n const result = fn(context.subject, context.resource, context.context);\n return Boolean(result);\n } catch (_error) {\n return false;\n }\n}\n\nfunction transformExpression(expression: string): string {\n return expression.replace(/&&/g, '&&').replace(/\\|\\|/g, '||');\n}\n\nfunction getResourceId(resource: ResourceContext): string | undefined {\n if (resource.id) return resource.id;\n const candidate = resource.attributes?.id;\n if (typeof candidate === 'string') return candidate;\n if (typeof candidate === 'number') return String(candidate);\n return undefined;\n}\n"],"mappings":"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"}
@@ -42,4 +42,5 @@ declare function buildOPAInput(context: DecisionContext, policies: PolicySpec[],
42
42
  }[];
43
43
  };
44
44
  //#endregion
45
- export { OPAAdapterOptions, OPAClient, OPAEvaluationResult, OPAPolicyAdapter, buildOPAInput };
45
+ export { OPAAdapterOptions, OPAClient, OPAEvaluationResult, OPAPolicyAdapter, buildOPAInput };
46
+ //# sourceMappingURL=opa-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opa-adapter.d.ts","names":[],"sources":["../../src/policy/opa-adapter.ts"],"sourcesContent":[],"mappings":";;;;;UAIiB,SAAA;qDACoC,QAAQ;AAD7D;AAIiB,UAAA,mBAAA,CAAmB;EAOnB,MAAA,CAAA,EAAA,OAAA,GAAA,MAAiB;EAWrB,MAAA,CAAA,EAAA,MAAA;EAA0B,cAAA,CAAA,EAfpB,cAeoB,CAAA,gBAAA,CAAA;EAEV,gBAAA,CAAA,EAAA,MAAA,EAAA;;AACC,UAdb,iBAca,CAAA,SAdc,mBAcd,GAAA,IAAA,CAAA,CAAA;EAIjB;;;EAGA,YAAA,EAAA,MAAA;EAAR;;AAqCL;EACW,SAAA,CAAA,EAAA,CAAA,KAAA,EAAA,OAAA,EAAA,GAnDuB,MAmDvB;;AAEO,cAlDL,gBAkDK,CAAA,SAlDqB,mBAkDrB,GAAA,IAAA,CAAA,CAAA;;;sBAhDW,oBACC,kBAAkB;oBAInC,2BACC,8BACM,iBACf,QAAQ;;iBAqCG,aAAA,UACL,2BACC,8BACM"}
@@ -68,4 +68,5 @@ function resolveConsentAcrossPolicies(policies, id) {
68
68
  }
69
69
 
70
70
  //#endregion
71
- export { OPAPolicyAdapter, buildOPAInput };
71
+ export { OPAPolicyAdapter, buildOPAInput };
72
+ //# sourceMappingURL=opa-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opa-adapter.js","names":["client: OPAClient","options: OPAAdapterOptions<Result>"],"sources":["../../src/policy/opa-adapter.ts"],"sourcesContent":["import type { PolicyDecision } from '../types';\nimport type { PolicySpec, ConsentDefinition } from './spec';\nimport type { DecisionContext } from './engine';\n\nexport interface OPAClient {\n evaluate<T>(decisionPath: string, input: unknown): Promise<T>;\n}\n\nexport interface OPAEvaluationResult {\n effect?: 'allow' | 'deny';\n reason?: string;\n fieldDecisions?: PolicyDecision['fieldDecisions'];\n requiredConsents?: string[];\n}\n\nexport interface OPAAdapterOptions<Result = OPAEvaluationResult | null> {\n /**\n * Path fed to the OPA client (e.g., \"sigil/authz/allow\").\n */\n decisionPath: string;\n /**\n * Optional mapper when the OPA client returns a non-standard payload.\n */\n mapResult?: (value: unknown) => Result;\n}\n\nexport class OPAPolicyAdapter<Result = OPAEvaluationResult | null> {\n constructor(\n private readonly client: OPAClient,\n private readonly options: OPAAdapterOptions<Result>\n ) {}\n\n async evaluate(\n context: DecisionContext,\n policies: PolicySpec[],\n engineDecision: PolicyDecision\n ): Promise<PolicyDecision> {\n const input = buildOPAInput(context, policies, engineDecision);\n const raw = await this.client.evaluate<unknown>(\n this.options.decisionPath,\n input\n );\n const resolved = this.options.mapResult\n ? this.options.mapResult(raw)\n : (raw as OPAEvaluationResult | null);\n\n if (!resolved) {\n return {\n ...engineDecision,\n evaluatedBy: engineDecision.evaluatedBy ?? 'engine',\n };\n }\n\n const opaResult = resolved as OPAEvaluationResult;\n const mergedRequiredConsents = mergeRequiredConsents(\n policies,\n engineDecision.requiredConsents ?? [],\n opaResult.requiredConsents ?? []\n );\n\n return {\n ...engineDecision,\n effect: opaResult.effect ?? engineDecision.effect,\n reason: opaResult.reason ?? engineDecision.reason,\n fieldDecisions: opaResult.fieldDecisions ?? engineDecision.fieldDecisions,\n requiredConsents: mergedRequiredConsents.length\n ? mergedRequiredConsents\n : undefined,\n evaluatedBy: 'opa',\n };\n }\n}\n\nexport function buildOPAInput(\n context: DecisionContext,\n policies: PolicySpec[],\n engineDecision: PolicyDecision\n) {\n return {\n context,\n decision: engineDecision,\n policies: policies.map((policy) => ({\n meta: policy.meta,\n rules: policy.rules,\n fieldPolicies: policy.fieldPolicies,\n pii: policy.pii,\n relationships: policy.relationships,\n consents: policy.consents,\n rateLimits: policy.rateLimits,\n })),\n };\n}\n\nfunction mergeRequiredConsents(\n policies: PolicySpec[],\n existing: ConsentDefinition[],\n incomingIds: string[]\n): ConsentDefinition[] {\n if (incomingIds.length === 0) return existing;\n const existingIds = new Set(existing.map((consent) => consent.id));\n const merged = [...existing];\n\n for (const id of incomingIds) {\n if (existingIds.has(id)) continue;\n const resolved = resolveConsentAcrossPolicies(policies, id);\n if (resolved) {\n merged.push(resolved);\n existingIds.add(resolved.id);\n }\n }\n\n return merged;\n}\n\nfunction resolveConsentAcrossPolicies(\n policies: PolicySpec[],\n id: string\n): ConsentDefinition | null {\n for (const policy of policies) {\n const match = policy.consents?.find((consent) => consent.id === id);\n if (match) return match;\n }\n\n return {\n id,\n scope: 'unspecified',\n purpose: 'unspecified',\n description: `Consent \"${id}\" returned by OPA`,\n required: true,\n };\n}\n"],"mappings":";AA0BA,IAAa,mBAAb,MAAmE;CACjE,YACE,AAAiBA,QACjB,AAAiBC,SACjB;EAFiB;EACA;;CAGnB,MAAM,SACJ,SACA,UACA,gBACyB;EACzB,MAAM,QAAQ,cAAc,SAAS,UAAU,eAAe;EAC9D,MAAM,MAAM,MAAM,KAAK,OAAO,SAC5B,KAAK,QAAQ,cACb,MACD;EACD,MAAM,WAAW,KAAK,QAAQ,YAC1B,KAAK,QAAQ,UAAU,IAAI,GAC1B;AAEL,MAAI,CAAC,SACH,QAAO;GACL,GAAG;GACH,aAAa,eAAe,eAAe;GAC5C;EAGH,MAAM,YAAY;EAClB,MAAM,yBAAyB,sBAC7B,UACA,eAAe,oBAAoB,EAAE,EACrC,UAAU,oBAAoB,EAAE,CACjC;AAED,SAAO;GACL,GAAG;GACH,QAAQ,UAAU,UAAU,eAAe;GAC3C,QAAQ,UAAU,UAAU,eAAe;GAC3C,gBAAgB,UAAU,kBAAkB,eAAe;GAC3D,kBAAkB,uBAAuB,SACrC,yBACA;GACJ,aAAa;GACd;;;AAIL,SAAgB,cACd,SACA,UACA,gBACA;AACA,QAAO;EACL;EACA,UAAU;EACV,UAAU,SAAS,KAAK,YAAY;GAClC,MAAM,OAAO;GACb,OAAO,OAAO;GACd,eAAe,OAAO;GACtB,KAAK,OAAO;GACZ,eAAe,OAAO;GACtB,UAAU,OAAO;GACjB,YAAY,OAAO;GACpB,EAAE;EACJ;;AAGH,SAAS,sBACP,UACA,UACA,aACqB;AACrB,KAAI,YAAY,WAAW,EAAG,QAAO;CACrC,MAAM,cAAc,IAAI,IAAI,SAAS,KAAK,YAAY,QAAQ,GAAG,CAAC;CAClE,MAAM,SAAS,CAAC,GAAG,SAAS;AAE5B,MAAK,MAAM,MAAM,aAAa;AAC5B,MAAI,YAAY,IAAI,GAAG,CAAE;EACzB,MAAM,WAAW,6BAA6B,UAAU,GAAG;AAC3D,MAAI,UAAU;AACZ,UAAO,KAAK,SAAS;AACrB,eAAY,IAAI,SAAS,GAAG;;;AAIhC,QAAO;;AAGT,SAAS,6BACP,UACA,IAC0B;AAC1B,MAAK,MAAM,UAAU,UAAU;EAC7B,MAAM,QAAQ,OAAO,UAAU,MAAM,YAAY,QAAQ,OAAO,GAAG;AACnE,MAAI,MAAO,QAAO;;AAGpB,QAAO;EACL;EACA,OAAO;EACP,SAAS;EACT,aAAa,YAAY,GAAG;EAC5B,UAAU;EACX"}
@@ -111,4 +111,5 @@ declare class PolicyRegistry {
111
111
  }
112
112
  declare function makePolicyKey(ref: PolicyRef): string;
113
113
  //#endregion
114
- export { AttributeMatcher, ConsentDefinition, FieldPolicyRule, PIIPolicy, PolicyCondition, PolicyEffect, PolicyMeta, PolicyOPAConfig, PolicyRef, PolicyRegistry, PolicyRule, PolicySpec, RateLimitDefinition, RelationshipDefinition, RelationshipMatcher, ResourceMatcher, SubjectMatcher, makePolicyKey };
114
+ export { AttributeMatcher, ConsentDefinition, FieldPolicyRule, PIIPolicy, PolicyCondition, PolicyEffect, PolicyMeta, PolicyOPAConfig, PolicyRef, PolicyRegistry, PolicyRule, PolicySpec, RateLimitDefinition, RelationshipDefinition, RelationshipMatcher, ResourceMatcher, SubjectMatcher, makePolicyKey };
115
+ //# sourceMappingURL=spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.d.ts","names":[],"sources":["../../src/policy/spec.ts"],"sourcesContent":[],"mappings":";;;KAEY,YAAA;UAEK,sBAAA;EAFL,WAAA,EAAA,MAAY;EAEP,QAAA,EAAA,MAAA;EAQA,UAAA,EAAA,MAAA;EAMA,WAAA,CAAA,EAAA,MAAiB;EAcjB,UAAA,CAAA,EAAA,OAAA;AAQjB;AAOiB,UAnCA,mBAAA,CAmCmB;EASnB,QAAA,EAAA,MAAA;EAMA,UAAA,CAAA,EAAA,MAAc;EAKd,QAAA,CAAA,EAAA,MAAA;AAMjB;AAKiB,UA5DA,iBAAA,CA4DU;EACjB,EAAA,EAAA,MAAA;EAEE,KAAA,EAAA,MAAA;EACC,OAAA,EAAA,MAAA;EACK,WAAA,CAAA,EAAA,MAAA;EAGK,WAAA,CAAA,EAAA,SAAA,GAAA,UAAA,GAAA,kBAAA,GAAA,qBAAA;EAER,aAAA,CAAA,EAAA,MAAA;EAAe,QAAA,CAAA,EAAA,OAAA;AAI9B;AACU,UA7DO,mBAAA,CA6DP;EAGE,EAAA,EAAA,MAAA;EACC,GAAA,EAAA,MAAA;EACE,GAAA,CAAA,EAAA,MAAA;EAAe,aAAA,CAAA,EAAA,MAAA;EAIb,KAAA,CAAA,EAAA,MAAS;AAM1B;AACQ,UArES,eAAA,CAqET;EACC;EACS,OAAA,EAAA,MAAA;EACV;EACU,QAAA,CAAA,EAAA,MAAA;;AAEH,UApEE,UAAA,SAAmB,aAoErB,CAAA;EACP;EAAe,IAAA,EAAA,MAAA;EAGN;EAOJ,OAAA,EAAA,MAAA;EAGI;EAOP,KAAA,CAAA,EAAA,QAAA,GAAA,SAAA,GAAA,WAAA;;AAIuC,UApFhC,gBAAA,CAoFgC;EAejC,MAAA,CAAA,EAAA,OAAa;;;;UA7FZ,cAAA;;eAEF,eAAe;;UAGb,eAAA;;;eAGF,eAAe;;UAGb,eAAA;;;;UAKA,UAAA;UACP;;YAEE;aACC;kBACK;;;uBAGK;;eAER;;;UAIE,eAAA;UACP;;;YAGE;aACC;eACE;;;UAIE,SAAA;;;;;UAMA,UAAA;QACT;SACC;kBACS;QACV;kBACU;aACL;eACE;QACP;;UAGS,SAAA;;;;cAOJ,cAAA;;iBAGI;UAOP;uCAI6B;;iBAevB,aAAA,MAAmB"}
@@ -30,4 +30,5 @@ function makePolicyKey(ref) {
30
30
  }
31
31
 
32
32
  //#endregion
33
- export { PolicyRegistry, makePolicyKey };
33
+ export { PolicyRegistry, makePolicyKey };
34
+ //# sourceMappingURL=spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec.js","names":["candidate: PolicySpec | undefined"],"sources":["../../src/policy/spec.ts"],"sourcesContent":["import type { OwnerShipMeta } from '../ownership';\n\nexport type PolicyEffect = 'allow' | 'deny';\n\nexport interface RelationshipDefinition {\n subjectType: string;\n relation: string;\n objectType: string;\n description?: string;\n transitive?: boolean;\n}\n\nexport interface RelationshipMatcher {\n relation: string;\n objectType?: string;\n objectId?: string;\n}\n\nexport interface ConsentDefinition {\n id: string;\n scope: string;\n purpose: string;\n description?: string;\n lawfulBasis?:\n | 'consent'\n | 'contract'\n | 'legal_obligation'\n | 'legitimate_interest';\n expiresInDays?: number;\n required?: boolean;\n}\n\nexport interface RateLimitDefinition {\n id: string;\n rpm: number;\n key?: string;\n windowSeconds?: number;\n burst?: number;\n}\n\nexport interface PolicyOPAConfig {\n /** Fully-qualified package, e.g. \"sigil.authz\" */\n package: string;\n /** Optional rule within package (defaults to \"allow\") */\n decision?: string;\n}\n\nexport interface PolicyMeta extends OwnerShipMeta {\n /** Fully-qualified policy name (e.g., \"sigil.core.default\"). */\n name: string;\n /** Version of the policy; bump on breaking changes. */\n version: number;\n /** Optional scope hint used for discovery. */\n scope?: 'global' | 'feature' | 'operation';\n}\n\nexport interface AttributeMatcher {\n equals?: unknown;\n oneOf?: unknown[];\n exists?: boolean;\n}\n\nexport interface SubjectMatcher {\n roles?: string[];\n attributes?: Record<string, AttributeMatcher>;\n}\n\nexport interface ResourceMatcher {\n type: string;\n fields?: string[];\n attributes?: Record<string, AttributeMatcher>;\n}\n\nexport interface PolicyCondition {\n /** Simple expression evaluated against { subject, resource, context }. */\n expression: string;\n}\n\nexport interface PolicyRule {\n effect: PolicyEffect;\n actions: string[];\n subject?: SubjectMatcher;\n resource?: ResourceMatcher;\n relationships?: RelationshipMatcher[];\n requiresConsent?: string[];\n flags?: string[];\n rateLimit?: string | RateLimitDefinition;\n escalate?: 'human_review' | null;\n conditions?: PolicyCondition[];\n reason?: string;\n}\n\nexport interface FieldPolicyRule {\n effect: PolicyEffect;\n field: string;\n actions: ('read' | 'write')[];\n subject?: SubjectMatcher;\n resource?: ResourceMatcher;\n conditions?: PolicyCondition[];\n reason?: string;\n}\n\nexport interface PIIPolicy {\n fields: string[];\n consentRequired?: boolean;\n retentionDays?: number;\n}\n\nexport interface PolicySpec {\n meta: PolicyMeta;\n rules: PolicyRule[];\n fieldPolicies?: FieldPolicyRule[];\n pii?: PIIPolicy;\n relationships?: RelationshipDefinition[];\n consents?: ConsentDefinition[];\n rateLimits?: RateLimitDefinition[];\n opa?: PolicyOPAConfig;\n}\n\nexport interface PolicyRef {\n name: string;\n version: number;\n}\n\nconst policyKey = (name: string, version: number) => `${name}.v${version}`;\n\nexport class PolicyRegistry {\n private readonly items = new Map<string, PolicySpec>();\n\n register(spec: PolicySpec): this {\n const key = policyKey(spec.meta.name, spec.meta.version);\n if (this.items.has(key)) throw new Error(`Duplicate policy ${key}`);\n this.items.set(key, spec);\n return this;\n }\n\n list(): PolicySpec[] {\n return [...this.items.values()];\n }\n\n get(name: string, version?: number): PolicySpec | undefined {\n if (version != null) return this.items.get(policyKey(name, version));\n let candidate: PolicySpec | 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 makePolicyKey(ref: PolicyRef) {\n return policyKey(ref.name, ref.version);\n}\n"],"mappings":";AA4HA,MAAM,aAAa,MAAc,YAAoB,GAAG,KAAK,IAAI;AAEjE,IAAa,iBAAb,MAA4B;CAC1B,AAAiB,wBAAQ,IAAI,KAAyB;CAEtD,SAAS,MAAwB;EAC/B,MAAM,MAAM,UAAU,KAAK,KAAK,MAAM,KAAK,KAAK,QAAQ;AACxD,MAAI,KAAK,MAAM,IAAI,IAAI,CAAE,OAAM,IAAI,MAAM,oBAAoB,MAAM;AACnE,OAAK,MAAM,IAAI,KAAK,KAAK;AACzB,SAAO;;CAGT,OAAqB;AACnB,SAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC;;CAGjC,IAAI,MAAc,SAA0C;AAC1D,MAAI,WAAW,KAAM,QAAO,KAAK,MAAM,IAAI,UAAU,MAAM,QAAQ,CAAC;EACpE,IAAIA;EACJ,IAAI,MAAM;AACV,OAAK,MAAM,QAAQ,KAAK,MAAM,QAAQ,EAAE;AACtC,OAAI,KAAK,KAAK,SAAS,KAAM;AAC7B,OAAI,KAAK,KAAK,UAAU,KAAK;AAC3B,UAAM,KAAK,KAAK;AAChB,gBAAY;;;AAGhB,SAAO;;;AAIX,SAAgB,cAAc,KAAgB;AAC5C,QAAO,UAAU,IAAI,MAAM,IAAI,QAAQ"}
@@ -3,4 +3,5 @@ import { DocBlock } from "@lssm/lib.contracts/docs";
3
3
  //#region src/presentations/docs/presentations-conventions.docblock.d.ts
4
4
  declare const tech_contracts_presentations_conventions_DocBlocks: DocBlock[];
5
5
  //#endregion
6
- export { tech_contracts_presentations_conventions_DocBlocks };
6
+ export { tech_contracts_presentations_conventions_DocBlocks };
7
+ //# sourceMappingURL=presentations-conventions.docblock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentations-conventions.docblock.d.ts","names":[],"sources":["../../../src/presentations/docs/presentations-conventions.docblock.ts"],"sourcesContent":[],"mappings":";;;cAGa,oDAAoD"}
@@ -19,4 +19,5 @@ const tech_contracts_presentations_conventions_DocBlocks = [{
19
19
  registerDocBlocks(tech_contracts_presentations_conventions_DocBlocks);
20
20
 
21
21
  //#endregion
22
- export { tech_contracts_presentations_conventions_DocBlocks };
22
+ export { tech_contracts_presentations_conventions_DocBlocks };
23
+ //# sourceMappingURL=presentations-conventions.docblock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentations-conventions.docblock.js","names":["tech_contracts_presentations_conventions_DocBlocks: DocBlock[]"],"sources":["../../../src/presentations/docs/presentations-conventions.docblock.ts"],"sourcesContent":["import type { DocBlock } from '@lssm/lib.contracts/docs';\nimport { registerDocBlocks } from '../../registry';\n\nexport const tech_contracts_presentations_conventions_DocBlocks: DocBlock[] = [\n {\n id: 'docs.tech.contracts.presentations-conventions',\n title: 'Presentations Conventions (A11y & i18n)',\n summary:\n '- Always provide `meta.description` (\\u2265 3 chars) \\u2014 used by a11y/docs/agents.',\n kind: 'reference',\n visibility: 'public',\n route: '/docs/tech/contracts/presentations-conventions',\n tags: ['tech', 'contracts', 'presentations-conventions'],\n body: '## Presentations Conventions (A11y & i18n)\\n\\n- Always provide `meta.description` (\\u2265 3 chars) \\u2014 used by a11y/docs/agents.\\n- Prefer source = BlockNote for rich guides; use component key for interactive flows.\\n- i18n strings belong in host apps; descriptors carry keys/defaults only.\\n- Target selection: include only what you intend to support to avoid drift.\\n- PII: declare JSON-like paths under `policy.pii`; engine redacts in outputs.\\n',\n },\n];\nregisterDocBlocks(tech_contracts_presentations_conventions_DocBlocks);\n"],"mappings":";;;;AAGA,MAAaA,qDAAiE,CAC5E;CACE,IAAI;CACJ,OAAO;CACP,SACE;CACF,MAAM;CACN,YAAY;CACZ,OAAO;CACP,MAAM;EAAC;EAAQ;EAAa;EAA4B;CACxD,MAAM;CACP,CACF;AACD,kBAAkB,mDAAmD"}
@@ -4,4 +4,5 @@ import { PresentationSpec } from "./presentations.js";
4
4
  //#region src/presentations.backcompat.d.ts
5
5
  declare function toV2FromV1(v1: PresentationSpec): PresentationDescriptorV2;
6
6
  //#endregion
7
- export { toV2FromV1 };
7
+ export { toV2FromV1 };
8
+ //# sourceMappingURL=presentations.backcompat.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentations.backcompat.d.ts","names":[],"sources":["../src/presentations.backcompat.ts"],"sourcesContent":[],"mappings":";;;;iBAGgB,UAAA,KAAe,mBAAmB"}
@@ -44,4 +44,5 @@ function toV2FromV1(v1) {
44
44
  }
45
45
 
46
46
  //#endregion
47
- export { toV2FromV1 };
47
+ export { toV2FromV1 };
48
+ //# sourceMappingURL=presentations.backcompat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentations.backcompat.js","names":[],"sources":["../src/presentations.backcompat.ts"],"sourcesContent":["import type { PresentationSpec } from './presentations';\nimport type { PresentationDescriptorV2 } from './presentations.v2';\n\nexport function toV2FromV1(v1: PresentationSpec): PresentationDescriptorV2 {\n if (v1.content.kind === 'web_component') {\n return {\n meta: { ...v1.meta },\n policy: v1.policy,\n source: {\n type: 'component',\n framework: v1.content.framework,\n componentKey: v1.content.componentKey,\n props: v1.content.props,\n },\n targets: ['react', 'application/json', 'application/xml'],\n };\n }\n if (v1.content.kind === 'markdown') {\n return {\n meta: { ...v1.meta },\n policy: v1.policy,\n source: {\n type: 'blocknotejs',\n docJson: v1.content.content ?? v1.content.resourceUri ?? '',\n },\n targets: ['markdown', 'application/json', 'application/xml'],\n };\n }\n return {\n meta: { ...v1.meta },\n policy: v1.policy,\n source: {\n type: 'blocknotejs',\n docJson: { kind: 'data', mimeType: v1.content.mimeType, model: 'schema' },\n },\n targets: ['application/json', 'application/xml'],\n };\n}\n"],"mappings":";AAGA,SAAgB,WAAW,IAAgD;AACzE,KAAI,GAAG,QAAQ,SAAS,gBACtB,QAAO;EACL,MAAM,EAAE,GAAG,GAAG,MAAM;EACpB,QAAQ,GAAG;EACX,QAAQ;GACN,MAAM;GACN,WAAW,GAAG,QAAQ;GACtB,cAAc,GAAG,QAAQ;GACzB,OAAO,GAAG,QAAQ;GACnB;EACD,SAAS;GAAC;GAAS;GAAoB;GAAkB;EAC1D;AAEH,KAAI,GAAG,QAAQ,SAAS,WACtB,QAAO;EACL,MAAM,EAAE,GAAG,GAAG,MAAM;EACpB,QAAQ,GAAG;EACX,QAAQ;GACN,MAAM;GACN,SAAS,GAAG,QAAQ,WAAW,GAAG,QAAQ,eAAe;GAC1D;EACD,SAAS;GAAC;GAAY;GAAoB;GAAkB;EAC7D;AAEH,QAAO;EACL,MAAM,EAAE,GAAG,GAAG,MAAM;EACpB,QAAQ,GAAG;EACX,QAAQ;GACN,MAAM;GACN,SAAS;IAAE,MAAM;IAAQ,UAAU,GAAG,QAAQ;IAAU,OAAO;IAAU;GAC1E;EACD,SAAS,CAAC,oBAAoB,kBAAkB;EACjD"}
@@ -1,6 +1,6 @@
1
1
  import { Stability } from "./ownership.js";
2
2
  import z from "zod";
3
- import * as _lssm_lib_schema282 from "@lssm/lib.schema";
3
+ import * as _lssm_lib_schema35 from "@lssm/lib.schema";
4
4
  import { AnySchemaModel } from "@lssm/lib.schema";
5
5
 
6
6
  //#region src/presentations.d.ts
@@ -62,7 +62,7 @@ declare class PresentationRegistry {
62
62
  declare function jsonSchemaForPresentation(p: PresentationSpec): {
63
63
  framework: "react";
64
64
  componentKey: string;
65
- props: z.core.ZodStandardJSONSchemaPayload<_lssm_lib_schema282.TopLevelZodFromModel<_lssm_lib_schema282.SchemaModelFieldsAnyConfig<AnySchemaModel | _lssm_lib_schema282.AnyFieldType | _lssm_lib_schema282.AnyEnumType>>>;
65
+ props: z.core.ZodStandardJSONSchemaPayload<_lssm_lib_schema35.TopLevelZodFromModel<_lssm_lib_schema35.SchemaModelFieldsAnyConfig<AnySchemaModel | _lssm_lib_schema35.AnyFieldType | _lssm_lib_schema35.AnyEnumType>>>;
66
66
  meta: {
67
67
  readonly name: string;
68
68
  readonly version: number;
@@ -84,7 +84,7 @@ declare function jsonSchemaForPresentation(p: PresentationSpec): {
84
84
  kind: PresentationKind;
85
85
  } | {
86
86
  mimeType: string;
87
- model: z.core.ZodStandardJSONSchemaPayload<_lssm_lib_schema282.TopLevelZodFromModel<_lssm_lib_schema282.SchemaModelFieldsAnyConfig<AnySchemaModel | _lssm_lib_schema282.AnyFieldType | _lssm_lib_schema282.AnyEnumType>>>;
87
+ model: z.core.ZodStandardJSONSchemaPayload<_lssm_lib_schema35.TopLevelZodFromModel<_lssm_lib_schema35.SchemaModelFieldsAnyConfig<AnySchemaModel | _lssm_lib_schema35.AnyFieldType | _lssm_lib_schema35.AnyEnumType>>>;
88
88
  meta: {
89
89
  readonly name: string;
90
90
  readonly version: number;
@@ -95,4 +95,5 @@ declare function jsonSchemaForPresentation(p: PresentationSpec): {
95
95
  kind: PresentationKind;
96
96
  };
97
97
  //#endregion
98
- export { DataPresentation, MarkdownPresentation, PresentationContent, PresentationKind, PresentationMeta, PresentationPolicy, PresentationRegistry, PresentationSpec, WebComponentPresentation, jsonSchemaForPresentation };
98
+ export { DataPresentation, MarkdownPresentation, PresentationContent, PresentationKind, PresentationMeta, PresentationPolicy, PresentationRegistry, PresentationSpec, WebComponentPresentation, jsonSchemaForPresentation };
99
+ //# sourceMappingURL=presentations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentations.d.ts","names":[],"sources":["../src/presentations.ts"],"sourcesContent":[],"mappings":";;;;;;;KAKY,gBAAA;;AAAA,UAGK,gBAAA,CAHW;EAGX,IAAA,EAAA,MAAA;EAUA,OAAA,EAAA,MAAA;EAMA,SAAA,CAAA,EAbH,SAaG;EAWA,MAAA,CAAA,EAAA,MAAA,EAAA;EASA,IAAA,CAAA,EAAA,MAAA,EAAA;EAOL,WAAA,CAAA,EAAA,MAAA;;;AAGR,UApCa,kBAAA,CAoCb;EAAgB,KAAA,CAAA,EAAA,MAAA,EAAA;EAEH,GAAA,CAAA,EAAA,MAAA,EAAA;;;AAGN,UAnCM,wBAAA,CAmCN;EAAmB,IAAA,EAAA,eAAA;EAQjB,SAAA,EAAA,OAAA;EAGS;EAMR,YAAA,EAAA,MAAA;EAOJ;EAI6B,KAAA,EAzD9B,cAyD8B;EAAgB,SAAA,CAAA,EAAA,MAAA,EAAA;AAevD;;UAnEiB,oBAAA;;;;;;;;UASA,gBAAA;EAmEW,IAAA,EAAA,MAAA;;;SA/DnB;;KAGG,mBAAA,GACR,2BACA,uBACA;UAEa,gBAAA;QACT;EAsDoB,MAAA,CAAA,EArDjB,kBAqDiB;EAAgB,OAAA,EApDjC,mBAoDiC;;;cA5C/B,oBAAA;;sBAGS;cAMR;UAOJ;uCAI6B;;iBAevB,yBAAA,IAA6B;;;;;;;;;;;QASjB;;;;;;;;;;;QAAA;;;;;;;;;;;QAAA"}
@@ -63,4 +63,5 @@ function jsonSchemaForPresentation(p) {
63
63
  }
64
64
 
65
65
  //#endregion
66
- export { PresentationRegistry, jsonSchemaForPresentation };
66
+ export { PresentationRegistry, jsonSchemaForPresentation };
67
+ //# sourceMappingURL=presentations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentations.js","names":["candidate: PresentationSpec | undefined"],"sources":["../src/presentations.ts"],"sourcesContent":["import type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { Stability } from './ownership';\nimport z from 'zod';\n\n/** V1 presentation kinds (back-compat). Prefer V2 descriptors for new work. */\nexport type PresentationKind = 'web_component' | 'markdown' | 'data';\n\n/** Minimal metadata for presentations (V1). */\nexport interface PresentationMeta {\n name: string;\n version: number;\n stability?: Stability;\n owners?: string[];\n tags?: string[];\n description?: string;\n}\n\n/** Policy for presentations (flags, pii). */\nexport interface PresentationPolicy {\n flags?: string[];\n pii?: string[];\n}\n\n/** Web component presentation (V1). */\nexport interface WebComponentPresentation {\n kind: 'web_component';\n framework: 'react'; // future: 'vue' | 'angular'\n /** Symbolic key resolved by host via component map */\n componentKey: string;\n /** Props schema (validated at runtime) */\n props: AnySchemaModel;\n analytics?: string[];\n}\n\n/** Markdown presentation (V1). */\nexport interface MarkdownPresentation {\n kind: 'markdown';\n /** Inline markdown/MDX content */\n content?: string;\n /** Or a resolvable resource URI handled by ResourceRegistry */\n resourceUri?: string;\n}\n\n/** Data presentation (V1): structured export description. */\nexport interface DataPresentation {\n kind: 'data';\n mimeType: string; // e.g., application/json, application/xml\n /** Structured data schema */\n model: AnySchemaModel;\n}\n\nexport type PresentationContent =\n | WebComponentPresentation\n | MarkdownPresentation\n | DataPresentation;\n\nexport interface PresentationSpec {\n meta: PresentationMeta;\n policy?: PresentationPolicy;\n content: PresentationContent;\n}\n\nfunction keyOf(p: PresentationSpec) {\n return `${p.meta.name}.v${p.meta.version}`;\n}\n\n/** In-memory registry for V1 PresentationSpec. */\nexport class PresentationRegistry {\n private items = new Map<string, PresentationSpec>();\n\n constructor(items?: PresentationSpec[]) {\n if (items) {\n items.forEach((p) => this.register(p));\n }\n }\n\n register(p: PresentationSpec): this {\n const key = keyOf(p);\n if (this.items.has(key)) throw new Error(`Duplicate presentation ${key}`);\n this.items.set(key, p);\n return this;\n }\n\n list(): PresentationSpec[] {\n return [...this.items.values()];\n }\n\n get(name: string, version?: number): PresentationSpec | undefined {\n if (version != null) return this.items.get(`${name}.v${version}`);\n let candidate: PresentationSpec | undefined;\n let max = -Infinity;\n for (const [k, p] of this.items.entries()) {\n if (!k.startsWith(`${name}.v`)) continue;\n if (p.meta.version > max) {\n max = p.meta.version;\n candidate = p;\n }\n }\n return candidate;\n }\n}\n\nexport function jsonSchemaForPresentation(p: PresentationSpec) {\n const base = {\n meta: {\n name: p.meta.name,\n version: p.meta.version,\n stability: p.meta.stability ?? 'stable',\n tags: p.meta.tags ?? [],\n description: p.meta.description ?? '',\n },\n kind: p.content.kind as PresentationKind,\n } as const;\n\n if (p.content.kind === 'web_component') {\n return {\n ...base,\n framework: p.content.framework,\n componentKey: p.content.componentKey,\n props: z.toJSONSchema(p.content.props.getZod()),\n };\n }\n if (p.content.kind === 'markdown') {\n return {\n ...base,\n content: p.content.content,\n resourceUri: p.content.resourceUri,\n };\n }\n return {\n ...base,\n mimeType: p.content.mimeType,\n model: z.toJSONSchema(p.content.model.getZod()),\n };\n}\n"],"mappings":";;;AA8DA,SAAS,MAAM,GAAqB;AAClC,QAAO,GAAG,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK;;;AAInC,IAAa,uBAAb,MAAkC;CAChC,AAAQ,wBAAQ,IAAI,KAA+B;CAEnD,YAAY,OAA4B;AACtC,MAAI,MACF,OAAM,SAAS,MAAM,KAAK,SAAS,EAAE,CAAC;;CAI1C,SAAS,GAA2B;EAClC,MAAM,MAAM,MAAM,EAAE;AACpB,MAAI,KAAK,MAAM,IAAI,IAAI,CAAE,OAAM,IAAI,MAAM,0BAA0B,MAAM;AACzE,OAAK,MAAM,IAAI,KAAK,EAAE;AACtB,SAAO;;CAGT,OAA2B;AACzB,SAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC;;CAGjC,IAAI,MAAc,SAAgD;AAChE,MAAI,WAAW,KAAM,QAAO,KAAK,MAAM,IAAI,GAAG,KAAK,IAAI,UAAU;EACjE,IAAIA;EACJ,IAAI,MAAM;AACV,OAAK,MAAM,CAAC,GAAG,MAAM,KAAK,MAAM,SAAS,EAAE;AACzC,OAAI,CAAC,EAAE,WAAW,GAAG,KAAK,IAAI,CAAE;AAChC,OAAI,EAAE,KAAK,UAAU,KAAK;AACxB,UAAM,EAAE,KAAK;AACb,gBAAY;;;AAGhB,SAAO;;;AAIX,SAAgB,0BAA0B,GAAqB;CAC7D,MAAM,OAAO;EACX,MAAM;GACJ,MAAM,EAAE,KAAK;GACb,SAAS,EAAE,KAAK;GAChB,WAAW,EAAE,KAAK,aAAa;GAC/B,MAAM,EAAE,KAAK,QAAQ,EAAE;GACvB,aAAa,EAAE,KAAK,eAAe;GACpC;EACD,MAAM,EAAE,QAAQ;EACjB;AAED,KAAI,EAAE,QAAQ,SAAS,gBACrB,QAAO;EACL,GAAG;EACH,WAAW,EAAE,QAAQ;EACrB,cAAc,EAAE,QAAQ;EACxB,OAAO,EAAE,aAAa,EAAE,QAAQ,MAAM,QAAQ,CAAC;EAChD;AAEH,KAAI,EAAE,QAAQ,SAAS,WACrB,QAAO;EACL,GAAG;EACH,SAAS,EAAE,QAAQ;EACnB,aAAa,EAAE,QAAQ;EACxB;AAEH,QAAO;EACL,GAAG;EACH,UAAU,EAAE,QAAQ;EACpB,OAAO,EAAE,aAAa,EAAE,QAAQ,MAAM,QAAQ,CAAC;EAChD"}
@@ -111,4 +111,5 @@ type ComponentMap = Record<string, React.ComponentType<any>>;
111
111
  */
112
112
  declare function registerReactToMarkdownRenderer(engine: TransformEngine, componentMap: ComponentMap): TransformEngine;
113
113
  //#endregion
114
- export { ComponentMap, PresentationDescriptorV2, PresentationRenderer, PresentationSource, PresentationSourceBlocknotejs, PresentationSourceComponentReact, PresentationTarget, PresentationV2Meta, PresentationValidator, ReactRenderDescriptor, RenderContext, TransformEngine, createDefaultTransformEngine, registerBasicValidation, registerDefaultReactRenderer, registerReactToMarkdownRenderer };
114
+ export { ComponentMap, PresentationDescriptorV2, PresentationRenderer, PresentationSource, PresentationSourceBlocknotejs, PresentationSourceComponentReact, PresentationTarget, PresentationV2Meta, PresentationValidator, ReactRenderDescriptor, RenderContext, TransformEngine, createDefaultTransformEngine, registerBasicValidation, registerDefaultReactRenderer, registerReactToMarkdownRenderer };
115
+ //# sourceMappingURL=presentations.v2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentations.v2.d.ts","names":[],"sources":["../src/presentations.v2.ts"],"sourcesContent":[],"mappings":";;;;;;;;KASY,kBAAA;AAAA,UAMK,kBAAA,SAA2B,OANd,CAMsB,aANtB,CAAA,CAAA;EAMb;EAAmC,IAAA,EAAA,MAAA;EAQ1C;EARkC,OAAA,EAAA,MAAA;EAAO;EAYlC,WAAA,CAAA,EAAA,MAAA;EAYA;EASL,KAAA,CAAA,EAzBF,KAyBE;AAQZ;;AAGU,UAhCO,gCAAA,CAgCP;EACC;EAAkB,IAAA,EAAA,WAAA;EAGZ;EAaA,SAAA,EAAA,OAAA;EACP;EAEA,YAAA,EAAA,MAAA;EACA;EACK,KAAA,CAAA,EA9CL,cA8CK;;;AAGE,UA7CA,6BAAA,CA6CqB;EAE5B;EACE,IAAA,EAAA,aAAA;EACF;EACH,OAAA,EAAA,OAAA;EAAO;EAmID,WAAA,CAAA,EA/KG,WA+KY;;AAOD,KAnLf,kBAAA,GACR,gCAkLuB,GAjLvB,6BAiLuB;;;;;AAyBjB,UApMO,wBAAA,CAoMP;EACA,IAAA,EApMF,kBAoME;EACG,MAAA,CAAA,EAAA;IAAR,KAAA,CAAA,EAAA,MAAA,EAAA;IAAO,GAAA,CAAA,EAAA,MAAA,EAAA;EAsBI,CAAA;EAiJJ,MAAA,EA1WF,kBA0WuB;EASjB,OAAA,EAlXL,kBAkXK,EAAA;AA8BhB;AAgBY,UA7ZK,aAAA,CA6ZO;EAOR;EACN,MAAA,CAAA,EAAA,MAAA;EACM;EACb,YAAA,CAAA,EAAA,MAAA,EAAA;EAAe;;;;;oBA7ZE;;UAGH;UACP;iBAEA,gCACA,kBACH,QAAQ;;UAGE,qBAAA;mBAEP,kCACE,0BACF,kBACH;;cAmIM,eAAA;;;2BAOc,qBAAqB;;;;;kCAWd,qBAAqB;kBAOrC;iCAMN,0BACF,gCACA,gBACL,QAAQ;;;iBAsBG,4BAAA,CAAA,GAA4B;;KAiJhC,qBAAA;;;UAIE;;;;gBAE6C;;;iBAG3C,4BAAA,SAAqC,kBAAe;;;;iBA8BpD,uBAAA,SAAgC,kBAAe;;;;KAgBnD,YAAA,GAAe,eAAe,KAAA,CAAM;;;;;;iBAOhC,+BAAA,SACN,+BACM,eACb"}
@@ -276,4 +276,5 @@ function registerReactToMarkdownRenderer(engine, componentMap) {
276
276
  }
277
277
 
278
278
  //#endregion
279
- export { TransformEngine, createDefaultTransformEngine, registerBasicValidation, registerDefaultReactRenderer, registerReactToMarkdownRenderer };
279
+ export { TransformEngine, createDefaultTransformEngine, registerBasicValidation, registerDefaultReactRenderer, registerReactToMarkdownRenderer };
280
+ //# sourceMappingURL=presentations.v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"presentations.v2.js","names":["html: string","markdown: string"],"sources":["../src/presentations.v2.ts"],"sourcesContent":["import type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { OwnerShipMeta } from './ownership';\nimport type { BlockConfig } from '@blocknote/core';\nimport type { DocId } from './docs/registry';\nimport { schemaToMarkdown } from './schema-to-markdown';\nimport React from 'react';\nimport TurndownService from 'turndown';\n\n/** Supported render targets for the transform engine and descriptors. */\nexport type PresentationTarget =\n | 'react'\n | 'markdown'\n | 'application/json'\n | 'application/xml';\n\nexport interface PresentationV2Meta extends Partial<OwnerShipMeta> {\n /** Fully-qualified presentation name (e.g., \"sigil.auth.webauth_tabs_v2\"). */\n name: string;\n /** Version of this descriptor. Increment on breaking changes. */\n version: number;\n /** Human-readable description for docs/a11y. Required by validators. */\n description?: string;\n /** Optional doc block id for this presentation. */\n docId?: DocId;\n}\n\n/** React component presentation source. */\nexport interface PresentationSourceComponentReact {\n /** Source marker for React component presentations. */\n type: 'component';\n /** Framework for the component source (currently only 'react'). */\n framework: 'react';\n /** Component key resolved by host `componentMap`. */\n componentKey: string;\n /** Optional props schema to validate against. */\n props?: AnySchemaModel;\n}\n\n/** BlockNoteJS document presentation source. */\nexport interface PresentationSourceBlocknotejs {\n /** Source marker for BlockNoteJS document presentations. */\n type: 'blocknotejs';\n /** BlockNoteJS JSON document. */\n docJson: unknown;\n /** Optional BlockNote config to guide rendering. */\n blockConfig?: BlockConfig;\n}\n\nexport type PresentationSource =\n | PresentationSourceComponentReact\n | PresentationSourceBlocknotejs;\n\n/**\n * Normalized presentation descriptor decoupled from framework/adapters.\n * Renderers and validators are provided via TransformEngine.\n */\nexport interface PresentationDescriptorV2 {\n meta: PresentationV2Meta;\n policy?: { flags?: string[]; pii?: string[] };\n source: PresentationSource;\n targets: PresentationTarget[]; // which outputs are supported by transforms\n}\n\nexport interface RenderContext {\n /** Optional locale hint (i18n). */\n locale?: string;\n /** Enabled feature flags to drive conditional rendering. */\n featureFlags?: string[];\n /** Redaction hook for custom PII handling. */\n redact?: (path: string, value: unknown) => unknown;\n /** Optional data for schema-driven rendering (arrays or objects). */\n data?: unknown;\n /** Optional async data fetcher for renderers that need to load data on demand. */\n fetchData?: () => Promise<unknown>;\n}\n\nexport interface PresentationRenderer<TOut> {\n target: PresentationTarget;\n render: (\n desc: PresentationDescriptorV2,\n ctx?: RenderContext\n ) => Promise<TOut>;\n}\n\nexport interface PresentationValidator {\n validate: (\n desc: PresentationDescriptorV2,\n target: PresentationTarget,\n ctx?: RenderContext\n ) => Promise<void> | void;\n}\n\n/**\n * Pluggable transform engine that renders descriptors to various targets\n * and runs validators (e.g., basic metadata checks, PII redaction policies).\n */\nconst turndown = new TurndownService();\n\ninterface BlockNoteNode {\n type?: string;\n content?: BlockNoteNode[];\n text?: string;\n marks?: { type?: string; attrs?: Record<string, any> }[];\n attrs?: Record<string, any>;\n}\n\nfunction renderTextNode(node: BlockNoteNode): string {\n const text = node.text ?? '';\n if (!node.marks || node.marks.length === 0) return text;\n\n return node.marks.reduce((acc, mark) => {\n switch (mark.type) {\n case 'bold':\n return `**${acc}**`;\n case 'italic':\n return `*${acc}*`;\n case 'underline':\n return `__${acc}__`;\n case 'strike':\n return `~~${acc}~~`;\n case 'code':\n return `\\`${acc}\\``;\n case 'link': {\n const href = mark.attrs?.href ?? '';\n return href ? `[${acc}](${href})` : acc;\n }\n default:\n return acc;\n }\n }, text);\n}\n\nfunction renderInline(nodes: BlockNoteNode[] | undefined): string {\n if (!nodes?.length) return '';\n return nodes.map((child) => renderNode(child)).join('');\n}\n\nfunction renderList(\n nodes: BlockNoteNode[] | undefined,\n ordered = false\n): string {\n if (!nodes?.length) return '';\n let counter = 1;\n return nodes\n .map((item) => {\n const body = renderInline(item.content ?? []);\n if (!body) return '';\n const prefix = ordered ? `${counter++}. ` : '- ';\n return `${prefix}${body}`;\n })\n .filter(Boolean)\n .join('\\n');\n}\n\nfunction renderNode(node: BlockNoteNode): string {\n switch (node.type) {\n case 'doc':\n return renderInline(node.content);\n case 'paragraph': {\n const text = renderInline(node.content);\n return text.trim().length ? text : '';\n }\n case 'heading': {\n const level = Math.min(Math.max(node.attrs?.level ?? 1, 1), 6);\n return `${'#'.repeat(level)} ${renderInline(node.content)}`.trim();\n }\n case 'bullet_list':\n return renderList(node.content, false);\n case 'ordered_list':\n return renderList(node.content, true);\n case 'list_item':\n return renderInline(node.content);\n case 'blockquote': {\n const body = renderInline(node.content);\n return body\n .split('\\n')\n .map((line) => `> ${line}`)\n .join('\\n');\n }\n case 'code_block': {\n const body = renderInline(node.content);\n return body ? `\\`\\`\\`\\n${body}\\n\\`\\`\\`` : '';\n }\n case 'horizontal_rule':\n return '---';\n case 'hard_break':\n return '\\n';\n case 'text':\n return renderTextNode(node);\n default:\n if (node.text) return renderTextNode(node);\n return '';\n }\n}\n\nfunction blockNoteToMarkdown(docJson: unknown): string {\n // If already markdown string, return as-is\n if (typeof docJson === 'string') return docJson;\n\n // If HTML string, convert via Turndown\n if (docJson && typeof docJson === 'object' && 'html' in (docJson as any)) {\n const html = String((docJson as any).html);\n return turndown.turndown(html);\n }\n\n const root = docJson as BlockNoteNode;\n if (root?.type === 'doc' || root?.content) {\n const blocks = (root.content ?? [])\n .map((n) => renderNode(n))\n .filter(Boolean);\n return blocks.join('\\n\\n').trim();\n }\n\n try {\n return JSON.stringify(docJson, null, 2);\n } catch {\n return String(docJson);\n }\n}\n\nexport class TransformEngine {\n private renderers = new Map<\n PresentationTarget,\n PresentationRenderer<any>[]\n >();\n private validators: PresentationValidator[] = [];\n\n register<TOut>(renderer: PresentationRenderer<TOut>): this {\n const arr = this.renderers.get(renderer.target) ?? [];\n arr.push(renderer);\n this.renderers.set(renderer.target, arr);\n return this;\n }\n\n /**\n * Register a renderer that will be tried BEFORE existing renderers for the same target.\n * Useful for custom renderers that should take priority over default ones.\n */\n prependRegister<TOut>(renderer: PresentationRenderer<TOut>): this {\n const arr = this.renderers.get(renderer.target) ?? [];\n arr.unshift(renderer);\n this.renderers.set(renderer.target, arr);\n return this;\n }\n\n addValidator(v: PresentationValidator): this {\n this.validators.push(v);\n return this;\n }\n\n async render<TOut = unknown>(\n target: PresentationTarget,\n desc: PresentationDescriptorV2,\n ctx?: RenderContext\n ): Promise<TOut> {\n if (!desc.targets.includes(target))\n throw new Error(\n `Target ${target} not declared for ${desc.meta.name}.v${desc.meta.version}`\n );\n for (const v of this.validators) await v.validate(desc, target, ctx);\n const arr = this.renderers.get(target) ?? [];\n for (const r of arr) {\n try {\n const out = await r.render(desc, ctx);\n // first successful renderer wins\n return out as TOut;\n } catch (_e) {\n // try next\n }\n }\n throw new Error(`No renderer available for ${target}`);\n }\n}\n\n// Minimal built-ins (stubs). Host apps can register concrete adapters.\n/** Create a TransformEngine instance with default markdown/json/xml renderers. */\nexport function createDefaultTransformEngine() {\n const engine = new TransformEngine();\n\n const applyPii = (desc: PresentationDescriptorV2, obj: any) => {\n const clone = JSON.parse(JSON.stringify(obj));\n const paths = desc.policy?.pii ?? [];\n const setAtPath = (root: any, path: string) => {\n const segs = path\n .replace(/^\\//, '')\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n let cur = root;\n for (let i = 0; i < segs.length - 1; i++) {\n const k = segs[i]!;\n if (cur && typeof cur === 'object' && k in cur) cur = cur[k];\n else return;\n }\n const last = segs[segs.length - 1];\n if (cur && typeof cur === 'object' && last && last in cur)\n cur[last] = '[REDACTED]';\n };\n for (const p of paths) setAtPath(clone, p);\n return clone;\n };\n\n // markdown output for both blocknote and component\n // Supports schema-driven rendering when ctx.data is provided\n // NOTE: This is a fallback renderer - custom template renderers should be registered\n // AFTER this one and will take priority for presentations they handle\n engine.register<{ mimeType: 'text/markdown'; body: string }>({\n target: 'markdown',\n async render(desc, ctx) {\n // Try to get data from context or fetch it\n let data = ctx?.data;\n if (!data && ctx?.fetchData) {\n data = await ctx.fetchData();\n }\n\n // Schema-driven rendering when data and schema are available\n // Only use schema-driven rendering for SIMPLE data structures:\n // - Arrays of items (for table rendering)\n // - Simple objects matching schema fields (for detail rendering)\n // Complex composite objects (with nested arrays) should be handled by custom renderers\n if (\n desc.source.type === 'component' &&\n desc.source.props &&\n data !== undefined\n ) {\n // Check if data is compatible with schema-driven rendering\n const isArray = Array.isArray(data);\n const isSimpleObject =\n !isArray &&\n typeof data === 'object' &&\n data !== null &&\n !Object.values(data).some(\n (v) => Array.isArray(v) || (typeof v === 'object' && v !== null)\n );\n\n // Only use schema-driven rendering for simple structures\n if (isArray || isSimpleObject) {\n const body = schemaToMarkdown(desc.source.props, data, {\n title: desc.meta.description ?? desc.meta.name,\n description: `${desc.meta.name} v${desc.meta.version}`,\n });\n return { mimeType: 'text/markdown', body };\n }\n\n // Complex data structure - throw to let custom renderers handle\n throw new Error(\n `Complex data structure for ${desc.meta.name} - expecting custom renderer`\n );\n }\n\n // BlockNote rendering\n if (desc.source.type === 'blocknotejs') {\n const markdown = blockNoteToMarkdown(desc.source.docJson);\n const redacted = applyPii(desc, { text: markdown });\n return { mimeType: 'text/markdown', body: String(redacted.text) };\n }\n\n // When data is provided but no schema is available, throw to allow\n // custom renderers in the chain to handle it (they may have their own\n // data fetching and formatting logic)\n if (desc.source.type === 'component' && data !== undefined) {\n throw new Error(\n `No schema (source.props) available for ${desc.meta.name} - expecting custom renderer`\n );\n }\n\n // Metadata-only fallback: only use when no data is expected\n // (e.g., for documentation/introspection purposes)\n if (desc.source.type === 'component') {\n const header = `# ${desc.meta.name} v${desc.meta.version}`;\n const about = desc.meta.description\n ? `\\n\\n${desc.meta.description}`\n : '';\n const tags =\n desc.meta.tags && desc.meta.tags.length\n ? `\\n\\nTags: ${desc.meta.tags.join(', ')}`\n : '';\n const owners =\n desc.meta.owners && desc.meta.owners.length\n ? `\\n\\nOwners: ${desc.meta.owners.join(', ')}`\n : '';\n const comp = `\\n\\nComponent: \\`${desc.source.componentKey}\\``;\n const policy = desc.policy?.pii?.length\n ? `\\n\\nRedacted paths: ${desc.policy.pii.map((p) => `\\`${p}\\``).join(', ')}`\n : '';\n const body = `${header}${about}${tags}${owners}${comp}${policy}`;\n return { mimeType: 'text/markdown', body };\n }\n throw new Error('unsupported');\n },\n });\n\n // json snapshot of source\n engine.register<{ mimeType: 'application/json'; body: string }>({\n target: 'application/json',\n async render(desc) {\n const payload = applyPii(desc, { meta: desc.meta, source: desc.source });\n return {\n mimeType: 'application/json',\n body: JSON.stringify(payload, null, 2),\n };\n },\n });\n\n // xml (simple wrapper around json for now)\n engine.register<{ mimeType: 'application/xml'; body: string }>({\n target: 'application/xml',\n async render(desc) {\n const json = applyPii(desc, { meta: desc.meta, source: desc.source });\n const body = `<presentation name=\"${desc.meta.name}\" version=\"${desc.meta.version}\"><json>${encodeURIComponent(\n JSON.stringify(json)\n )}</json></presentation>`;\n return { mimeType: 'application/xml', body };\n },\n });\n\n return engine;\n}\n\n// React target returns a serializable descriptor the host can render.\n/** Serializable render descriptor for React hosts. */\nexport type ReactRenderDescriptor =\n | {\n kind: 'react_component';\n componentKey: string;\n props?: Record<string, unknown>;\n }\n | { kind: 'blocknotejs'; docJson: unknown; blockConfig?: BlockConfig };\n\n/** Register a default React target renderer that returns a serializable descriptor. */\nexport function registerDefaultReactRenderer(engine: TransformEngine) {\n engine.register<ReactRenderDescriptor>({\n target: 'react',\n async render(desc) {\n if (desc.source.type === 'component') {\n const props = desc.source.props\n ? desc.source.props.getZod().safeParse({}).success\n ? {}\n : undefined\n : undefined;\n return {\n kind: 'react_component',\n componentKey: desc.source.componentKey,\n props,\n } as ReactRenderDescriptor;\n }\n // blocknote\n return {\n kind: 'blocknotejs',\n docJson: desc.source.docJson,\n blockConfig: desc.source.blockConfig,\n } as ReactRenderDescriptor;\n },\n });\n return engine;\n}\n\n/**\n * Add basic validators (e.g., meta.description presence) to the engine.\n */\nexport function registerBasicValidation(engine: TransformEngine) {\n // Ensure description is provided for a11y/i18n/docs\n engine.addValidator({\n validate(desc) {\n if (!desc.meta.description || desc.meta.description.length < 3)\n throw new Error(\n `Presentation ${desc.meta.name}.v${desc.meta.version} missing meta.description`\n );\n },\n });\n return engine;\n}\n\n/**\n * Component map type for React rendering.\n */\nexport type ComponentMap = Record<string, React.ComponentType<any>>;\n\n/**\n * Register a React-to-markdown renderer that renders React components to HTML\n * and converts them to markdown using turndown.\n * This renderer takes priority over the default metadata-only renderer.\n */\nexport function registerReactToMarkdownRenderer(\n engine: TransformEngine,\n componentMap: ComponentMap\n): TransformEngine {\n const turndownService = new TurndownService({\n headingStyle: 'atx',\n codeBlockStyle: 'fenced',\n bulletListMarker: '-',\n });\n\n // Configure turndown to handle links properly\n turndownService.addRule('link', {\n filter: 'a',\n replacement: (content, node) => {\n const href = (node as HTMLAnchorElement).href;\n if (href && content) {\n return `[${content}](${href})`;\n }\n return content || '';\n },\n });\n\n engine.prependRegister<{ mimeType: 'text/markdown'; body: string }>({\n target: 'markdown',\n async render(desc, ctx) {\n // Only handle React component presentations\n if (desc.source.type !== 'component') {\n throw new Error(\n 'React-to-markdown renderer only handles component presentations'\n );\n }\n\n const { renderToStaticMarkup } = await import('react-dom/server');\n\n // Get component from map\n const Component = componentMap[desc.source.componentKey];\n if (!Component) {\n throw new Error(\n `Component ${desc.source.componentKey} not found in componentMap`\n );\n }\n\n // Render component to HTML\n let html: string;\n try {\n const element = React.createElement(\n Component,\n desc.source.props ? {} : undefined\n );\n html = renderToStaticMarkup(element);\n } catch (error) {\n throw new Error(\n `Failed to render component ${desc.source.componentKey}: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n\n // Convert HTML to markdown\n let markdown: string;\n try {\n markdown = turndownService.turndown(html);\n } catch (error) {\n throw new Error(\n `Failed to convert HTML to markdown: ${\n error instanceof Error ? error.message : 'Unknown error'\n }`\n );\n }\n\n // Apply PII redaction if needed\n if (desc.policy?.pii && desc.policy.pii.length > 0) {\n // Simple PII redaction - replace text content at paths\n // This is a basic implementation; more sophisticated redaction\n // would require parsing the markdown AST\n const redacted = markdown.replace(/\\[REDACTED\\]/g, '[REDACTED]');\n return { mimeType: 'text/markdown', body: redacted };\n }\n\n return { mimeType: 'text/markdown', body: markdown };\n },\n });\n\n return engine;\n}\n"],"mappings":"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"}
package/dist/prompt.d.ts CHANGED
@@ -57,4 +57,5 @@ interface PromptSpec<I extends z$1.ZodType> {
57
57
  /** Identity helper that preserves generic inference when declaring prompts. */
58
58
  declare function definePrompt<I extends z$1.ZodType>(spec: PromptSpec<I>): PromptSpec<I>;
59
59
  //#endregion
60
- export { PromptArg, PromptContentPart, PromptMeta, PromptPolicy, PromptSpec, PromptStability, definePrompt };
60
+ export { PromptArg, PromptContentPart, PromptMeta, PromptPolicy, PromptSpec, PromptStability, definePrompt };
61
+ //# sourceMappingURL=prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.d.ts","names":[],"sources":["../src/prompt.ts"],"sourcesContent":[],"mappings":";;;KAEY,eAAA;;AAAA,UAGK,SAAA,CAHU;EAGV,IAAA,EAAA,MAAS;EAWd,WAAA,CAAA,EAAA,MAAiB;EAKZ,QAAA,CAAA,EAAA,OAAU;EAWV,MAAA,EAvBP,GAAA,CAAE,OAuBiB;EAOZ,YAAA,CAAU,EAAA,MAAA;;;;;AAIhB,KA3BC,iBAAA,GA2BD;EAIO,IAAA,EAAA,MAAA;EAAR,IAAE,EAAA,MAAA;CAKyB,GAAA;EAEtB,IAAA,EAAA,UAAA;EAAR,GAAA,EAAA,MAAA;EAAO,KAAA,CAAA,EAAA,MAAA;AAId,CAAA;;AACmB,UAtCF,UAAA,CAsCE;EAAX,IAAA,EAAA,MAAA;EACM,OAAA,EAAA,MAAA;EAAX,KAAA,EAAA,MAAA;EAAU,WAAA,EAAA,MAAA;;cAjCC;;;;UAKG,YAAA;;;;;;;;;UAOA,qBAAqB,GAAA,CAAE;QAChC;QACA;SACC;WACE;;iBAID,GAAA,CAAE,MAAM;;;;mCAKmB;QAE9B,QAAQ;;;iBAIC,uBAAuB,GAAA,CAAE,eACjC,WAAW,KAChB,WAAW"}
package/dist/prompt.js CHANGED
@@ -7,4 +7,5 @@ function definePrompt(spec) {
7
7
  }
8
8
 
9
9
  //#endregion
10
- export { definePrompt };
10
+ export { definePrompt };
11
+ //# sourceMappingURL=prompt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt.js","names":[],"sources":["../src/prompt.ts"],"sourcesContent":["import * as z from 'zod';\n\nexport type PromptStability = 'experimental' | 'beta' | 'stable' | 'deprecated';\n\n/** Parameter definition for a prompt argument. */\nexport interface PromptArg {\n name: string;\n description?: string;\n required?: boolean;\n schema: z.ZodType; // zod schema for this argument\n completeWith?: string; // optional completion source name\n}\n\n/**\n * Rendered content part for a prompt. Clients (MCP) can fetch referenced resources.\n */\nexport type PromptContentPart =\n | { type: 'text'; text: string }\n | { type: 'resource'; uri: string; title?: string };\n\n/** Prompt metadata for discoverability and governance. */\nexport interface PromptMeta {\n name: string; // e.g. \"sigil.signup-help\"\n version: number; // bump on breaking change\n title: string;\n description: string;\n tags?: string[];\n stability?: PromptStability;\n owners?: string[];\n}\n\n/** Policy constraints for prompts (flags, PII paths, rate limits). */\nexport interface PromptPolicy {\n flags?: string[];\n pii?: string[]; // JSON-like paths within args to redact in logs/prompts\n rateLimit?: { rpm: number; key: 'user' | 'org' | 'global' };\n}\n\n/** Full prompt specification including args schema and render function. */\nexport interface PromptSpec<I extends z.ZodType> {\n meta: PromptMeta;\n args: PromptArg[];\n input: I; // full args object schema (zod)\n policy?: PromptPolicy;\n\n /** Render MCP-friendly content parts. DO NOT perform side effects here. */\n render: (\n args: z.infer<I>,\n ctx: {\n userId?: string | null;\n orgId?: string | null;\n locale?: string;\n link: (template: string, vars: Record<string, string | number>) => string;\n }\n ) => Promise<PromptContentPart[]>;\n}\n\n/** Identity helper that preserves generic inference when declaring prompts. */\nexport function definePrompt<I extends z.ZodType>(\n spec: PromptSpec<I>\n): PromptSpec<I> {\n return spec;\n}\n"],"mappings":";;;;AA0DA,SAAgB,aACd,MACe;AACf,QAAO"}
@@ -12,4 +12,5 @@ declare class PromptRegistry {
12
12
  get(name: string, version?: number): PromptSpec<any> | undefined;
13
13
  }
14
14
  //#endregion
15
- export { PromptRegistry };
15
+ export { PromptRegistry };
16
+ //# sourceMappingURL=promptRegistry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptRegistry.d.ts","names":[],"sources":["../src/promptRegistry.ts"],"sourcesContent":[],"mappings":";;;;cAGa,cAAA;;EAAA;EAIQ,QAAE,CAAA,UAAF,GAAA,CAAE,OAAA,CAAA,CAAA,CAAA,EAAY,UAAZ,CAAuB,CAAvB,CAAA,CAAA,EAAA,IAAA;EAAuB;EAAX,IAAA,CAAA,CAAA,EAQ7B,UAR6B,CAAA,GAAA,CAAA,EAAA;EAQ7B;EAK8B,GAAA,CAAA,IAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,MAAA,CAAA,EAAA,UAAA,CAAA,GAAA,CAAA,GAAA,SAAA"}
@@ -31,4 +31,5 @@ var PromptRegistry = class {
31
31
  };
32
32
 
33
33
  //#endregion
34
- export { PromptRegistry };
34
+ export { PromptRegistry };
35
+ //# sourceMappingURL=promptRegistry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promptRegistry.js","names":["candidate: PromptSpec<any> | undefined"],"sources":["../src/promptRegistry.ts"],"sourcesContent":["import type { PromptSpec } from './prompt';\nimport * as z from 'zod';\n\nexport class PromptRegistry {\n private prompts = new Map<string, PromptSpec<any>>(); // key = name.vX\n\n /** Register a prompt. Throws on duplicate name+version. */\n register<I extends z.ZodType>(p: PromptSpec<I>): this {\n const key = `${p.meta.name}.v${p.meta.version}`;\n if (this.prompts.has(key)) throw new Error(`Duplicate prompt ${key}`);\n this.prompts.set(key, p);\n return this;\n }\n\n /** List all registered prompts. */\n list() {\n return [...this.prompts.values()];\n }\n\n /** Get prompt by name; when version omitted, returns highest version. */\n get(name: string, version?: number) {\n if (version != null) return this.prompts.get(`${name}.v${version}`);\n // latest by highest version\n let candidate: PromptSpec<any> | undefined;\n let max = -Infinity;\n for (const [k, p] of this.prompts.entries()) {\n if (!k.startsWith(`${name}.v`)) continue;\n if (p.meta.version > max) {\n max = p.meta.version;\n candidate = p;\n }\n }\n return candidate;\n }\n}\n"],"mappings":";;;AAGA,IAAa,iBAAb,MAA4B;CAC1B,AAAQ,0BAAU,IAAI,KAA8B;;CAGpD,SAA8B,GAAwB;EACpD,MAAM,MAAM,GAAG,EAAE,KAAK,KAAK,IAAI,EAAE,KAAK;AACtC,MAAI,KAAK,QAAQ,IAAI,IAAI,CAAE,OAAM,IAAI,MAAM,oBAAoB,MAAM;AACrE,OAAK,QAAQ,IAAI,KAAK,EAAE;AACxB,SAAO;;;CAIT,OAAO;AACL,SAAO,CAAC,GAAG,KAAK,QAAQ,QAAQ,CAAC;;;CAInC,IAAI,MAAc,SAAkB;AAClC,MAAI,WAAW,KAAM,QAAO,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,UAAU;EAEnE,IAAIA;EACJ,IAAI,MAAM;AACV,OAAK,MAAM,CAAC,GAAG,MAAM,KAAK,QAAQ,SAAS,EAAE;AAC3C,OAAI,CAAC,EAAE,WAAW,GAAG,KAAK,IAAI,CAAE;AAChC,OAAI,EAAE,KAAK,UAAU,KAAK;AACxB,UAAM,EAAE,KAAK;AACb,gBAAY;;;AAGhB,SAAO"}
@@ -16,4 +16,5 @@ interface SignalAdapters {
16
16
  behavior?: BehaviorSignalProvider;
17
17
  }
18
18
  //#endregion
19
- export { BehaviorSignalProvider, ErrorSignalProvider, SignalAdapters, TelemetrySignalProvider };
19
+ export { BehaviorSignalProvider, ErrorSignalProvider, SignalAdapters, TelemetrySignalProvider };
20
+ //# sourceMappingURL=adapters.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapters.d.ts","names":[],"sources":["../../src/regenerator/adapters.ts"],"sourcesContent":[],"mappings":";;;UAOiB,uBAAA;yBAEJ,4BACF,aACA,OACN,QAAQ;AALb;AAEa,UAMI,mBAAA,CANJ;EACF,UAAA,CAAA,OAAA,EAOE,mBAPF,EAAA,KAAA,EAQA,IARA,EAAA,KAAA,EASA,IATA,CAAA,EAUN,OAVM,CAUE,WAVF,EAAA,CAAA;;AAEE,UAWI,sBAAA,CAXJ;EAAR,YAAA,CAAA,OAAA,EAaQ,mBAbR,EAAA,KAAA,EAcM,IAdN,EAAA,KAAA,EAeM,IAfN,CAAA,EAgBA,OAhBA,CAgBQ,cAhBR,EAAA,CAAA;;AAGY,UAgBA,cAAA,CAhBmB;EAEvB,SAAA,CAAA,EAeC,uBAfD;EACF,MAAA,CAAA,EAeA,mBAfA;EACA,QAAA,CAAA,EAeE,sBAfF"}
@@ -3,4 +3,5 @@ import { DocBlock } from "@lssm/lib.contracts/docs";
3
3
  //#region src/regenerator/docs/regenerator.docblock.d.ts
4
4
  declare const tech_contracts_regenerator_DocBlocks: DocBlock[];
5
5
  //#endregion
6
- export { tech_contracts_regenerator_DocBlocks };
6
+ export { tech_contracts_regenerator_DocBlocks };
7
+ //# sourceMappingURL=regenerator.docblock.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regenerator.docblock.d.ts","names":[],"sources":["../../../src/regenerator/docs/regenerator.docblock.ts"],"sourcesContent":[],"mappings":";;;cAGa,sCAAsC"}
@@ -19,4 +19,5 @@ const tech_contracts_regenerator_DocBlocks = [{
19
19
  registerDocBlocks(tech_contracts_regenerator_DocBlocks);
20
20
 
21
21
  //#endregion
22
- export { tech_contracts_regenerator_DocBlocks };
22
+ export { tech_contracts_regenerator_DocBlocks };
23
+ //# sourceMappingURL=regenerator.docblock.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regenerator.docblock.js","names":["tech_contracts_regenerator_DocBlocks: DocBlock[]"],"sources":["../../../src/regenerator/docs/regenerator.docblock.ts"],"sourcesContent":["import type { DocBlock } from '@lssm/lib.contracts/docs';\nimport { registerDocBlocks } from '../../registry';\n\nexport const tech_contracts_regenerator_DocBlocks: DocBlock[] = [\n {\n id: 'docs.tech.contracts.regenerator',\n title: 'Regenerator Service',\n summary:\n 'The Regenerator daemon observes telemetry, error, and behavior streams, then suggests spec-level changes (not code patches) that can be reviewed and applied through the App Studio.',\n kind: 'reference',\n visibility: 'public',\n route: '/docs/tech/contracts/regenerator',\n tags: ['tech', 'contracts', 'regenerator'],\n body: \"## Regenerator Service\\n\\nThe Regenerator daemon observes telemetry, error, and behavior streams, then suggests spec-level changes (not code patches) that can be reviewed and applied through the App Studio.\\n\\n- Runtime entrypoint: `packages/libs/contracts/src/regenerator/service.ts`\\n- Types/interfaces: `packages/libs/contracts/src/regenerator/types.ts`\\n- Signal adapters: `packages/libs/contracts/src/regenerator/adapters.ts`\\n\\n### Architecture\\n\\n```text\\nSignal Adapters \\u2500\\u2500\\u25ba RegeneratorService \\u2500\\u2500\\u25ba Rules \\u2500\\u2500\\u25ba ProposalSink\\n \\u25b2 \\u2502\\n \\u2502 \\u25bc\\n Telemetry / Errors / Behavior Spec change proposals\\n```\\n\\n1. **Signal adapters** pull batches of telemetry, error logs, or behavior metrics for each `RegenerationContext`.\\n2. `RegeneratorService` schedules polling (`resolveAppConfig` + `composeAppConfig` provide context).\\n3. **Rules** implement domain heuristics and emit `SpecChangeProposal` objects.\\n4. **Proposal sinks** persist or forward proposals for human review.\\n\\n### Key types\\n\\n```ts\\nexport interface RegenerationContext {\\n id: string;\\n blueprint: AppBlueprintSpec;\\n tenantConfig: TenantAppConfig;\\n resolved: ResolvedAppConfig;\\n}\\n\\nexport interface RegeneratorRule {\\n id: string;\\n description: string;\\n evaluate(\\n context: RegenerationContext,\\n signals: RegeneratorSignal[]\\n ): Promise<SpecChangeProposal[]>;\\n}\\n\\nexport interface SpecChangeProposal {\\n id: string;\\n title: string;\\n summary: string;\\n confidence: 'low' | 'medium' | 'high';\\n target: ProposalTarget;\\n actions: ProposalAction[];\\n blockers?: ProposalBlocker[];\\n signalIds: string[];\\n createdAt: Date;\\n}\\n```\\n\\n- Signals are normalized envelopes: telemetry (`count`, anomaly score), errors, and behavior trends.\\n- Proposals reference blueprint or tenant specs via `ProposalTarget`.\\n- Actions encode what the automation should perform (update blueprint, run tests/migrations, trigger regeneration).\\n\\n### Providing signals\\n\\nImplement `TelemetrySignalProvider`, `ErrorSignalProvider`, or `BehaviorSignalProvider`:\\n\\n```ts\\nconst service = new RegeneratorService({\\n contexts,\\n adapters: {\\n telemetry: new PosthogTelemetryAdapter(),\\n errors: new SentryErrorAdapter(),\\n },\\n rules: [new WorkflowFailureRule(), new DataViewUsageRule()],\\n sink: new ProposalQueueSink(),\\n pollIntervalMs: 60_000,\\n});\\n```\\n\\nAdapters receive the full `RegenerationContext`, making it easy to scope queries per tenant/app.\\n\\n### Authoring rules\\n\\nRules focus on signals \\u2192 proposals:\\n\\n```ts\\nclass WorkflowFailureRule implements RegeneratorRule {\\n id = 'workflow-failure';\\n description = 'Suggest splitting workflows that exceed failure thresholds';\\n\\n async evaluate(context, signals) {\\n const failures = signals.filter(\\n (signal) =>\\n signal.type === 'telemetry' &&\\n signal.signal.eventName === 'workflow.failure' &&\\n signal.signal.count >= 10\\n );\\n\\n if (failures.length === 0) return [];\\n\\n return [\\n {\\n id: `${this.id}-${context.id}`,\\n title: 'Split onboarding workflow',\\n summary: 'Step 3 fails consistently; propose dedicated remediation branch.',\\n confidence: 'medium',\\n rationale: ['Failure count \\u2265 10 within last window'],\\n target: {\\n specType: 'workflow',\\n reference: { name: 'onboarding.workflow', version: 1 },\\n tenantScoped: true,\\n },\\n actions: [\\n { kind: 'update_tenant_config', summary: 'Add alternate fallback path' },\\n { kind: 'run_tests', tests: ['workflows/onboarding.spec.ts'] },\\n ],\\n signalIds: failures.map((f) => f.signal.eventName),\\n createdAt: new Date(),\\n },\\n ];\\n }\\n}\\n```\\n\\n### Reviewing proposals\\n\\nProposals flow to a `ProposalSink` (queue, DB, messaging bus). The Studio will surface:\\n\\n1. Signal evidence (telemetry counts, error metadata)\\n2. Proposed spec diffs and required actions (tests/migrations)\\n3. Approval workflow (approve \\u2192 write spec diff \\u2192 run automation)\\n\\n### CLI driver\\n\\nRun the regenerator daemon from the CLI:\\n\\n```bash\\nbunx contracts regenerator ./app.blueprint.ts ./tenant.config.ts ./regenerator.rules.ts auto \\\\\\n --executor ./regenerator.executor.ts \\\\\\n --poll-interval 60000 \\\\\\n --batch-duration 300000 \\\\\\n --dry-run\\n```\\n\\n- Expects modules exporting default `AppBlueprintSpec`, `TenantAppConfig`, and one or more `RegenerationRule`s.\\n- Pass a sink module path, or use the special `auto` value with `--executor <module>` to instantiate an `ExecutorProposalSink`.\\n- Executor modules can export a `ProposalExecutor` instance, a factory, or a plain dependency object for the executor constructor. Optional exports: `sinkOptions`, `logger`, `onResult`, `dryRun`.\\n- Optionally provide `--contexts ./contexts.ts` to load custom context arrays (advanced multi-tenant scenarios).\\n- Use `--dry-run` to preview actions without mutating specs/configs, and `--once` for CI smoke tests.\\n\\n### Proposal executor\\n\\n`ProposalExecutor` + `ExecutorProposalSink` orchestrate follow-up actions once a proposal is approved:\\n\\n- Interfaces for applying blueprint or tenant-config updates (`BlueprintUpdater`, `TenantConfigUpdater`).\\n- Hooks for running contract tests and migrations (`TestExecutor`, `MigrationExecutor`).\\n- Optional trigger to recompose the runtime (`RegenerationTrigger`).\\n- Built-in `dryRun` mode to preview outcomes.\\n- Pluggable result logging/forwarding via `ExecutorSinkOptions`.\\n\\n```ts\\nimport {\\n ProposalExecutor,\\n ExecutorProposalSink,\\n} from '@lssm/lib.contracts/regenerator';\\n\\nconst executor = new ProposalExecutor({\\n tenantConfigUpdater,\\n testExecutor,\\n migrationExecutor,\\n regenerationTrigger,\\n});\\n\\nconst sink = new ExecutorProposalSink(executor, {\\n dryRun: false,\\n onResult: ({ result }) => console.log(result.status),\\n});\\n```\\n\\nExecution results include per-action status (`success`, `skipped`, `failed`) plus aggregated proposal status (`success`, `partial`, `failed`). Missing dependencies mark actions as `skipped`, making it easy to plug into partial automation flows today and extend later.\\n\\n### Next steps\\n\\n- Build adapters for existing telemetry/error providers.\\n- Encode canonical rules (workflow failure, feature under-use, high latency).\\n- Integrate with App Studio proposal inbox and automate acceptance (write spec diff, run tests, queue migrations).\\n\\n\",\n },\n];\nregisterDocBlocks(tech_contracts_regenerator_DocBlocks);\n"],"mappings":";;;;AAGA,MAAaA,uCAAmD,CAC9D;CACE,IAAI;CACJ,OAAO;CACP,SACE;CACF,MAAM;CACN,YAAY;CACZ,OAAO;CACP,MAAM;EAAC;EAAQ;EAAa;EAAc;CAC1C,MAAM;CACP,CACF;AACD,kBAAkB,qCAAqC"}
@@ -67,4 +67,5 @@ declare class ProposalExecutor {
67
67
  private executeAction;
68
68
  }
69
69
  //#endregion
70
- export { ActionExecutionResult, BlueprintUpdater, ExecutionStatus, MigrationExecutor, ProposalExecutionResult, ProposalExecutor, ProposalExecutorDeps, ProposalExecutorOptions, RegenerationTrigger, RunMigrationsAction, RunTestsAction, TenantConfigUpdater, TestExecutor, TriggerRegenerationAction, UpdateBlueprintAction, UpdateTenantConfigAction };
70
+ export { ActionExecutionResult, BlueprintUpdater, ExecutionStatus, MigrationExecutor, ProposalExecutionResult, ProposalExecutor, ProposalExecutorDeps, ProposalExecutorOptions, RegenerationTrigger, RunMigrationsAction, RunTestsAction, TenantConfigUpdater, TestExecutor, TriggerRegenerationAction, UpdateBlueprintAction, UpdateTenantConfigAction };
71
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","names":[],"sources":["../../src/regenerator/executor.ts"],"sourcesContent":[],"mappings":";;;KAMY,eAAA;UAEK,qBAAA;EAFL,KAAA,EAAA,MAAA;EAEK,MAAA,EAEP,cAFO;EAEP,MAAA,EACA,eADA;EACA,SAAA,EACG,IADH;EACG,UAAA,EACC,IADD;EACC,MAAA,CAAA,EAAA,MAAA;EAEJ,KAAA,CAAA,EAAA,KAAA;EAAK,MAAA,CAAA,EAAA,OAAA;AAIf;AAGa,UAHI,uBAAA,CAGJ;EACC,UAAA,EAAA,MAAA;EAEH,SAAA,EAAA,MAAA;EAAqB,SAAA,EAHnB,IAGmB;EAGpB,UAAA,EALE,IAKF;EAIA,MAAA,EAAA,SAAA,GAAA,SAAwB,GAAA,QAClC;EAGU,OAAA,EAXD,qBAW0B,EAAA;AACrC;AAIY,KAbA,qBAAA,GAAwB,OAaC,CAZnC,cAaA,EAAA;EAIe,IAAA,EAAA,kBAAgB;CAEpB,CAAA;AACC,KAjBF,wBAAA,GAA2B,OAiBzB,CAhBZ,cAgBY,EAAA;EACF,IAAA,EAAA,sBAAA;CACP,CAAA;AAAO,KAfA,cAAA,GAAiB,OAejB,CAfyB,cAezB,EAAA;EAGK,IAAA,EAAA,WAAA;CAEJ,CAAA;AACC,KApBF,mBAAA,GAAsB,OAoBpB,CAnBZ,cAmBY,EAAA;EACF,IAAA,EAAA,gBAAA;CACP,CAAA;AAAO,KAlBA,yBAAA,GAA4B,OAkB5B,CAjBV,cAiBU,EAAA;EAGK,IAAA,EAAA,sBAAY;CAEhB,CAAA;AACC,UAnBG,gBAAA,CAmBH;EACF,oBAAA,CAAA,OAAA,EAlBC,mBAkBD,EAAA,QAAA,EAjBE,kBAiBF,EAAA,MAAA,EAhBA,qBAgBA,CAAA,EAfP,OAeO,CAAA,OAAA,CAAA;;AACA,UAbK,mBAAA,CAaL;EAGK,uBAAiB,CAAA,OAAA,EAdrB,mBAcqB,EAAA,QAAA,EAbpB,kBAaoB,EAAA,MAAA,EAZtB,wBAYsB,CAAA,EAX7B,OAW6B,CAAA,OAAA,CAAA;;AAGpB,UAXG,YAAA,CAWH;EACF,QAAA,CAAA,OAAA,EAVC,mBAUD,EAAA,QAAA,EATE,kBASF,EAAA,MAAA,EARA,cAQA,CAAA,EAPP,OAOO,CAAA,OAAA,CAAA;;AACA,UALK,iBAAA,CAKL;EAGK,aAAA,CAAA,OAAA,EANJ,mBAMuB,EAAA,QAAA,EALtB,kBAKsB,EAAA,MAAA,EAJxB,mBAIwB,CAAA,EAH/B,OAG+B,CAAA,OAAA,CAAA;;AAGtB,UAHG,mBAAA,CAGH;EACF,mBAAA,CAAA,OAAA,EAFC,mBAED,EAAA,QAAA,EADE,kBACF,EAAA,MAAA,EAAA,yBAAA,CAAA,EACP,OADO,CAAA,OAAA,CAAA;;AACA,UAGK,uBAAA,CAHL;EAGK,MAAA,CAAA,EAAA,OAAA;AAIjB;AACqB,UADJ,oBAAA,CACI;EACG,gBAAA,CAAA,EADH,gBACG;EACP,mBAAA,CAAA,EADO,mBACP;EACK,YAAA,CAAA,EADL,YACK;EACE,iBAAA,CAAA,EADF,iBACE;EAAmB,mBAAA,CAAA,EAAnB,mBAAmB;AAG3C;AACqC,cADxB,gBAAA,CACwB;EAGxB,iBAAA,IAAA;EACC,WAAA,CAAA,IAAA,CAAA,EAJuB,oBAIvB;EACD,OAAA,CAAA,OAAA,EAFA,mBAEA,EAAA,QAAA,EADC,kBACD,EAAA,OAAA,CAAA,EAAA,uBAAA,CAAA,EACR,OADQ,CACA,uBADA,CAAA;EACA,QAAA,aAAA"}
@@ -83,4 +83,5 @@ function summarizeStatus(actionResults) {
83
83
  }
84
84
 
85
85
  //#endregion
86
- export { ProposalExecutor };
86
+ export { ProposalExecutor };
87
+ //# sourceMappingURL=executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.js","names":["deps: ProposalExecutorDeps","actionResults: ActionExecutionResult[]"],"sources":["../../src/regenerator/executor.ts"],"sourcesContent":["import type {\n SpecChangeProposal,\n ProposalAction,\n RegenerationContext,\n} from './types';\n\nexport type ExecutionStatus = 'success' | 'skipped' | 'failed';\n\nexport interface ActionExecutionResult {\n index: number;\n action: ProposalAction;\n status: ExecutionStatus;\n startedAt: Date;\n finishedAt: Date;\n reason?: string;\n error?: Error;\n output?: unknown;\n}\n\nexport interface ProposalExecutionResult {\n proposalId: string;\n contextId: string;\n startedAt: Date;\n finishedAt: Date;\n status: 'success' | 'partial' | 'failed';\n actions: ActionExecutionResult[];\n}\n\nexport type UpdateBlueprintAction = Extract<\n ProposalAction,\n { kind: 'update_blueprint' }\n>;\nexport type UpdateTenantConfigAction = Extract<\n ProposalAction,\n { kind: 'update_tenant_config' }\n>;\nexport type RunTestsAction = Extract<ProposalAction, { kind: 'run_tests' }>;\nexport type RunMigrationsAction = Extract<\n ProposalAction,\n { kind: 'run_migrations' }\n>;\nexport type TriggerRegenerationAction = Extract<\n ProposalAction,\n { kind: 'trigger_regeneration' }\n>;\n\nexport interface BlueprintUpdater {\n applyBlueprintUpdate(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n action: UpdateBlueprintAction\n ): Promise<unknown>;\n}\n\nexport interface TenantConfigUpdater {\n applyTenantConfigUpdate(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n action: UpdateTenantConfigAction\n ): Promise<unknown>;\n}\n\nexport interface TestExecutor {\n runTests(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n action: RunTestsAction\n ): Promise<unknown>;\n}\n\nexport interface MigrationExecutor {\n runMigrations(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n action: RunMigrationsAction\n ): Promise<unknown>;\n}\n\nexport interface RegenerationTrigger {\n triggerRegeneration(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n action: TriggerRegenerationAction\n ): Promise<unknown>;\n}\n\nexport interface ProposalExecutorOptions {\n dryRun?: boolean;\n}\n\nexport interface ProposalExecutorDeps {\n blueprintUpdater?: BlueprintUpdater;\n tenantConfigUpdater?: TenantConfigUpdater;\n testExecutor?: TestExecutor;\n migrationExecutor?: MigrationExecutor;\n regenerationTrigger?: RegenerationTrigger;\n}\n\nexport class ProposalExecutor {\n constructor(private readonly deps: ProposalExecutorDeps = {}) {}\n\n async execute(\n context: RegenerationContext,\n proposal: SpecChangeProposal,\n options: ProposalExecutorOptions = {}\n ): Promise<ProposalExecutionResult> {\n const startedAt = new Date();\n const actionResults: ActionExecutionResult[] = [];\n\n for (const [index, action] of proposal.actions.entries()) {\n const result = await this.executeAction({\n index,\n action,\n context,\n proposal,\n options,\n });\n actionResults.push(result);\n }\n\n const finishedAt = new Date();\n const summaryStatus = summarizeStatus(actionResults);\n\n return {\n proposalId: proposal.id,\n contextId: context.id,\n startedAt,\n finishedAt,\n status: summaryStatus,\n actions: actionResults,\n };\n }\n\n private async executeAction({\n index,\n action,\n context,\n proposal,\n options,\n }: {\n index: number;\n action: ProposalAction;\n context: RegenerationContext;\n proposal: SpecChangeProposal;\n options: ProposalExecutorOptions;\n }): Promise<ActionExecutionResult> {\n const startedAt = new Date();\n const dryRun = options.dryRun ?? false;\n\n const complete = (\n status: ExecutionStatus,\n params: {\n reason?: string;\n output?: unknown;\n error?: Error;\n } = {}\n ): ActionExecutionResult => ({\n index,\n action,\n status,\n startedAt,\n finishedAt: new Date(),\n reason: params.reason,\n output: params.output,\n error: params.error,\n });\n\n if (dryRun) {\n return complete('skipped', { reason: 'dry_run' });\n }\n\n try {\n switch (action.kind) {\n case 'update_blueprint': {\n const updater = this.deps.blueprintUpdater;\n if (!updater) {\n return complete('skipped', { reason: 'missing_blueprint_updater' });\n }\n const output = await updater.applyBlueprintUpdate(\n context,\n proposal,\n action\n );\n return complete('success', { output });\n }\n case 'update_tenant_config': {\n const updater = this.deps.tenantConfigUpdater;\n if (!updater) {\n return complete('skipped', {\n reason: 'missing_tenant_config_updater',\n });\n }\n const output = await updater.applyTenantConfigUpdate(\n context,\n proposal,\n action\n );\n return complete('success', { output });\n }\n case 'run_tests': {\n const executor = this.deps.testExecutor;\n if (!executor) {\n return complete('skipped', { reason: 'missing_test_executor' });\n }\n const output = await executor.runTests(context, proposal, action);\n return complete('success', { output });\n }\n case 'run_migrations': {\n const executor = this.deps.migrationExecutor;\n if (!executor) {\n return complete('skipped', {\n reason: 'missing_migration_executor',\n });\n }\n const output = await executor.runMigrations(\n context,\n proposal,\n action\n );\n return complete('success', { output });\n }\n case 'trigger_regeneration': {\n const trigger = this.deps.regenerationTrigger;\n if (!trigger) {\n return complete('skipped', {\n reason: 'missing_regeneration_trigger',\n });\n }\n const output = await trigger.triggerRegeneration(\n context,\n proposal,\n action\n );\n return complete('success', { output });\n }\n default: {\n return complete('skipped', { reason: 'unknown_action' });\n }\n }\n } catch (error) {\n return complete('failed', {\n error: error instanceof Error ? error : new Error(String(error)),\n });\n }\n }\n}\n\nfunction summarizeStatus(\n actionResults: ActionExecutionResult[]\n): ProposalExecutionResult['status'] {\n if (actionResults.some((result) => result.status === 'failed')) {\n return 'failed';\n }\n if (\n actionResults.some((result) => result.status === 'success') &&\n actionResults.some((result) => result.status === 'skipped')\n ) {\n return 'partial';\n }\n if (actionResults.every((result) => result.status === 'skipped')) {\n return 'partial';\n }\n return 'success';\n}\n"],"mappings":";AAkGA,IAAa,mBAAb,MAA8B;CAC5B,YAAY,AAAiBA,OAA6B,EAAE,EAAE;EAAjC;;CAE7B,MAAM,QACJ,SACA,UACA,UAAmC,EAAE,EACH;EAClC,MAAM,4BAAY,IAAI,MAAM;EAC5B,MAAMC,gBAAyC,EAAE;AAEjD,OAAK,MAAM,CAAC,OAAO,WAAW,SAAS,QAAQ,SAAS,EAAE;GACxD,MAAM,SAAS,MAAM,KAAK,cAAc;IACtC;IACA;IACA;IACA;IACA;IACD,CAAC;AACF,iBAAc,KAAK,OAAO;;EAG5B,MAAM,6BAAa,IAAI,MAAM;EAC7B,MAAM,gBAAgB,gBAAgB,cAAc;AAEpD,SAAO;GACL,YAAY,SAAS;GACrB,WAAW,QAAQ;GACnB;GACA;GACA,QAAQ;GACR,SAAS;GACV;;CAGH,MAAc,cAAc,EAC1B,OACA,QACA,SACA,UACA,WAOiC;EACjC,MAAM,4BAAY,IAAI,MAAM;EAC5B,MAAM,SAAS,QAAQ,UAAU;EAEjC,MAAM,YACJ,QACA,SAII,EAAE,MACqB;GAC3B;GACA;GACA;GACA;GACA,4BAAY,IAAI,MAAM;GACtB,QAAQ,OAAO;GACf,QAAQ,OAAO;GACf,OAAO,OAAO;GACf;AAED,MAAI,OACF,QAAO,SAAS,WAAW,EAAE,QAAQ,WAAW,CAAC;AAGnD,MAAI;AACF,WAAQ,OAAO,MAAf;IACE,KAAK,oBAAoB;KACvB,MAAM,UAAU,KAAK,KAAK;AAC1B,SAAI,CAAC,QACH,QAAO,SAAS,WAAW,EAAE,QAAQ,6BAA6B,CAAC;AAOrE,YAAO,SAAS,WAAW,EAAE,QALd,MAAM,QAAQ,qBAC3B,SACA,UACA,OACD,EACoC,CAAC;;IAExC,KAAK,wBAAwB;KAC3B,MAAM,UAAU,KAAK,KAAK;AAC1B,SAAI,CAAC,QACH,QAAO,SAAS,WAAW,EACzB,QAAQ,iCACT,CAAC;AAOJ,YAAO,SAAS,WAAW,EAAE,QALd,MAAM,QAAQ,wBAC3B,SACA,UACA,OACD,EACoC,CAAC;;IAExC,KAAK,aAAa;KAChB,MAAM,WAAW,KAAK,KAAK;AAC3B,SAAI,CAAC,SACH,QAAO,SAAS,WAAW,EAAE,QAAQ,yBAAyB,CAAC;AAGjE,YAAO,SAAS,WAAW,EAAE,QADd,MAAM,SAAS,SAAS,SAAS,UAAU,OAAO,EAC5B,CAAC;;IAExC,KAAK,kBAAkB;KACrB,MAAM,WAAW,KAAK,KAAK;AAC3B,SAAI,CAAC,SACH,QAAO,SAAS,WAAW,EACzB,QAAQ,8BACT,CAAC;AAOJ,YAAO,SAAS,WAAW,EAAE,QALd,MAAM,SAAS,cAC5B,SACA,UACA,OACD,EACoC,CAAC;;IAExC,KAAK,wBAAwB;KAC3B,MAAM,UAAU,KAAK,KAAK;AAC1B,SAAI,CAAC,QACH,QAAO,SAAS,WAAW,EACzB,QAAQ,gCACT,CAAC;AAOJ,YAAO,SAAS,WAAW,EAAE,QALd,MAAM,QAAQ,oBAC3B,SACA,UACA,OACD,EACoC,CAAC;;IAExC,QACE,QAAO,SAAS,WAAW,EAAE,QAAQ,kBAAkB,CAAC;;WAGrD,OAAO;AACd,UAAO,SAAS,UAAU,EACxB,OAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC,EACjE,CAAC;;;;AAKR,SAAS,gBACP,eACmC;AACnC,KAAI,cAAc,MAAM,WAAW,OAAO,WAAW,SAAS,CAC5D,QAAO;AAET,KACE,cAAc,MAAM,WAAW,OAAO,WAAW,UAAU,IAC3D,cAAc,MAAM,WAAW,OAAO,WAAW,UAAU,CAE3D,QAAO;AAET,KAAI,cAAc,OAAO,WAAW,OAAO,WAAW,UAAU,CAC9D,QAAO;AAET,QAAO"}
@@ -30,4 +30,5 @@ declare class RegeneratorService {
30
30
  private flushProposals;
31
31
  }
32
32
  //#endregion
33
- export { RegeneratorOptions, RegeneratorService };
33
+ export { RegeneratorOptions, RegeneratorService };
34
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","names":[],"sources":["../../src/regenerator/service.ts"],"sourcesContent":[],"mappings":";;;;UAeiB,kBAAA;YACL;EADK,QAAA,EAEL,cAFuB;EACvB,KAAA,EAEH,gBAFG,EAAA;EACA,IAAA,EAEJ,YAFI;EACH,cAAA,CAAA,EAAA,MAAA;EACD,eAAA,CAAA,EAAA,MAAA;EAGQ,KAAA,CAAA,EAAA,GAAA,GAAA,IAAA;;AAMH,cAAA,kBAAA,CAS2B;;;;;;;;;uBAAA;;;aA4BrB"}
@@ -89,4 +89,5 @@ var RegeneratorService = class {
89
89
  };
90
90
 
91
91
  //#endregion
92
- export { RegeneratorService };
92
+ export { RegeneratorService };
93
+ //# sourceMappingURL=service.js.map