@lssm/lib.contracts 0.0.0-canary-20251120170226 → 0.0.0-canary-20251206160926

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 (569) hide show
  1. package/README.md +3 -1
  2. package/dist/app-config/branding.d.ts +1 -2
  3. package/dist/app-config/contracts.d.ts +51 -52
  4. package/dist/app-config/contracts.js +1 -2
  5. package/dist/app-config/events.d.ts +28 -29
  6. package/dist/app-config/events.js +1 -2
  7. package/dist/app-config/lifecycle-contracts.d.ts +81 -82
  8. package/dist/app-config/lifecycle-contracts.js +1 -2
  9. package/dist/app-config/lifecycle.d.ts +1 -2
  10. package/dist/app-config/runtime.d.ts +1 -2
  11. package/dist/app-config/runtime.js +1 -2
  12. package/dist/app-config/spec.d.ts +3 -4
  13. package/dist/app-config/spec.js +1 -2
  14. package/dist/app-config/validation.d.ts +1 -2
  15. package/dist/app-config/validation.js +1 -2
  16. package/dist/capabilities/openbanking.d.ts +1 -2
  17. package/dist/capabilities/openbanking.js +1 -2
  18. package/dist/capabilities.d.ts +2 -2
  19. package/dist/capabilities.js +1 -2
  20. package/dist/client/index.d.ts +2 -2
  21. package/dist/client/react/drivers/rn-reusables.d.ts +1 -2
  22. package/dist/client/react/drivers/rn-reusables.js +1 -2
  23. package/dist/client/react/drivers/shadcn.d.ts +1 -2
  24. package/dist/client/react/drivers/shadcn.js +1 -2
  25. package/dist/client/react/feature-render.d.ts +2 -4
  26. package/dist/client/react/feature-render.js +1 -2
  27. package/dist/client/react/form-render.d.ts +1 -2
  28. package/dist/client/react/form-render.js +1 -2
  29. package/dist/client/react/index.d.ts +2 -2
  30. package/dist/contracts-adapter-hydration.d.ts +1 -2
  31. package/dist/contracts-adapter-hydration.js +1 -2
  32. package/dist/contracts-adapter-input.d.ts +1 -2
  33. package/dist/contracts-adapter-input.js +1 -2
  34. package/dist/data-views/query-generator.d.ts +1 -2
  35. package/dist/data-views/query-generator.js +1 -2
  36. package/dist/data-views/runtime.d.ts +1 -2
  37. package/dist/data-views/runtime.js +1 -2
  38. package/dist/data-views.d.ts +1 -2
  39. package/dist/data-views.js +1 -2
  40. package/dist/events.d.ts +1 -2
  41. package/dist/events.js +1 -2
  42. package/dist/experiments/evaluator.d.ts +1 -2
  43. package/dist/experiments/evaluator.js +1 -2
  44. package/dist/experiments/spec-resolver.d.ts +16 -0
  45. package/dist/experiments/spec-resolver.js +0 -0
  46. package/dist/experiments/spec.d.ts +1 -2
  47. package/dist/experiments/spec.js +1 -2
  48. package/dist/features.d.ts +1 -2
  49. package/dist/features.js +1 -2
  50. package/dist/forms.d.ts +1 -2
  51. package/dist/forms.js +1 -2
  52. package/dist/graphql-federation/dist/index.js +1 -2
  53. package/dist/index.d.ts +7 -4
  54. package/dist/index.js +1 -1
  55. package/dist/install.d.ts +1 -2
  56. package/dist/install.js +1 -2
  57. package/dist/integrations/binding.d.ts +1 -2
  58. package/dist/integrations/connection.d.ts +1 -2
  59. package/dist/integrations/contracts.d.ts +103 -104
  60. package/dist/integrations/contracts.js +1 -2
  61. package/dist/integrations/health.d.ts +1 -2
  62. package/dist/integrations/health.js +1 -2
  63. package/dist/integrations/openbanking/contracts/accounts.d.ts +67 -68
  64. package/dist/integrations/openbanking/contracts/accounts.js +1 -2
  65. package/dist/integrations/openbanking/contracts/balances.d.ts +35 -36
  66. package/dist/integrations/openbanking/contracts/balances.js +1 -2
  67. package/dist/integrations/openbanking/contracts/index.d.ts +1 -2
  68. package/dist/integrations/openbanking/contracts/index.js +1 -2
  69. package/dist/integrations/openbanking/contracts/transactions.d.ts +49 -50
  70. package/dist/integrations/openbanking/contracts/transactions.js +1 -2
  71. package/dist/integrations/openbanking/guards.d.ts +1 -2
  72. package/dist/integrations/openbanking/guards.js +1 -2
  73. package/dist/integrations/openbanking/models.d.ts +56 -57
  74. package/dist/integrations/openbanking/models.js +1 -2
  75. package/dist/integrations/openbanking/telemetry.d.ts +1 -2
  76. package/dist/integrations/openbanking/telemetry.js +1 -2
  77. package/dist/integrations/providers/calendar.d.ts +1 -2
  78. package/dist/integrations/providers/elevenlabs.d.ts +1 -2
  79. package/dist/integrations/providers/elevenlabs.js +1 -2
  80. package/dist/integrations/providers/email.d.ts +1 -2
  81. package/dist/integrations/providers/embedding.d.ts +1 -2
  82. package/dist/integrations/providers/gcs-storage.d.ts +1 -2
  83. package/dist/integrations/providers/gcs-storage.js +1 -2
  84. package/dist/integrations/providers/gmail.d.ts +1 -2
  85. package/dist/integrations/providers/gmail.js +1 -2
  86. package/dist/integrations/providers/google-calendar.d.ts +1 -2
  87. package/dist/integrations/providers/google-calendar.js +1 -2
  88. package/dist/integrations/providers/impls/elevenlabs-voice.d.ts +1 -2
  89. package/dist/integrations/providers/impls/elevenlabs-voice.js +1 -2
  90. package/dist/integrations/providers/impls/gcs-storage.d.ts +1 -2
  91. package/dist/integrations/providers/impls/gcs-storage.js +1 -2
  92. package/dist/integrations/providers/impls/gmail-inbound.d.ts +1 -2
  93. package/dist/integrations/providers/impls/gmail-inbound.js +1 -2
  94. package/dist/integrations/providers/impls/gmail-outbound.d.ts +1 -2
  95. package/dist/integrations/providers/impls/gmail-outbound.js +1 -2
  96. package/dist/integrations/providers/impls/google-calendar.d.ts +1 -2
  97. package/dist/integrations/providers/impls/google-calendar.js +1 -2
  98. package/dist/integrations/providers/impls/mistral-embedding.d.ts +1 -2
  99. package/dist/integrations/providers/impls/mistral-embedding.js +1 -2
  100. package/dist/integrations/providers/impls/mistral-llm.d.ts +1 -2
  101. package/dist/integrations/providers/impls/mistral-llm.js +1 -2
  102. package/dist/integrations/providers/impls/postmark-email.d.ts +1 -2
  103. package/dist/integrations/providers/impls/postmark-email.js +1 -2
  104. package/dist/integrations/providers/impls/powens-client.d.ts +1 -2
  105. package/dist/integrations/providers/impls/powens-client.js +1 -2
  106. package/dist/integrations/providers/impls/powens-openbanking.d.ts +1 -2
  107. package/dist/integrations/providers/impls/powens-openbanking.js +1 -2
  108. package/dist/integrations/providers/impls/provider-factory.d.ts +1 -2
  109. package/dist/integrations/providers/impls/provider-factory.js +1 -2
  110. package/dist/integrations/providers/impls/qdrant-vector.d.ts +1 -2
  111. package/dist/integrations/providers/impls/qdrant-vector.js +1 -2
  112. package/dist/integrations/providers/impls/stripe-payments.d.ts +1 -2
  113. package/dist/integrations/providers/impls/stripe-payments.js +1 -2
  114. package/dist/integrations/providers/impls/twilio-sms.d.ts +1 -2
  115. package/dist/integrations/providers/impls/twilio-sms.js +1 -2
  116. package/dist/integrations/providers/llm.d.ts +1 -2
  117. package/dist/integrations/providers/mistral.d.ts +1 -2
  118. package/dist/integrations/providers/mistral.js +1 -2
  119. package/dist/integrations/providers/openbanking.d.ts +1 -2
  120. package/dist/integrations/providers/payments.d.ts +1 -2
  121. package/dist/integrations/providers/postmark.d.ts +1 -2
  122. package/dist/integrations/providers/postmark.js +1 -2
  123. package/dist/integrations/providers/powens.d.ts +1 -2
  124. package/dist/integrations/providers/powens.js +1 -2
  125. package/dist/integrations/providers/qdrant.d.ts +1 -2
  126. package/dist/integrations/providers/qdrant.js +1 -2
  127. package/dist/integrations/providers/sms.d.ts +1 -2
  128. package/dist/integrations/providers/storage.d.ts +1 -2
  129. package/dist/integrations/providers/stripe.d.ts +1 -2
  130. package/dist/integrations/providers/stripe.js +1 -2
  131. package/dist/integrations/providers/twilio-sms.d.ts +1 -2
  132. package/dist/integrations/providers/twilio-sms.js +1 -2
  133. package/dist/integrations/providers/vector-store.d.ts +1 -2
  134. package/dist/integrations/providers/voice.d.ts +1 -2
  135. package/dist/integrations/runtime.d.ts +1 -2
  136. package/dist/integrations/runtime.js +1 -2
  137. package/dist/integrations/secrets/env-secret-provider.d.ts +1 -2
  138. package/dist/integrations/secrets/env-secret-provider.js +1 -2
  139. package/dist/integrations/secrets/gcp-secret-manager.d.ts +1 -2
  140. package/dist/integrations/secrets/gcp-secret-manager.js +1 -2
  141. package/dist/integrations/secrets/manager.d.ts +3 -4
  142. package/dist/integrations/secrets/manager.js +1 -2
  143. package/dist/integrations/secrets/provider.d.ts +1 -2
  144. package/dist/integrations/secrets/provider.js +1 -2
  145. package/dist/integrations/spec.d.ts +1 -2
  146. package/dist/integrations/spec.js +1 -2
  147. package/dist/jobs/gcp-cloud-tasks.d.ts +1 -2
  148. package/dist/jobs/gcp-cloud-tasks.js +1 -2
  149. package/dist/jobs/gcp-pubsub.d.ts +1 -2
  150. package/dist/jobs/gcp-pubsub.js +1 -2
  151. package/dist/jobs/handlers/gmail-sync-handler.d.ts +1 -2
  152. package/dist/jobs/handlers/gmail-sync-handler.js +1 -2
  153. package/dist/jobs/handlers/storage-document-handler.d.ts +1 -2
  154. package/dist/jobs/handlers/storage-document-handler.js +1 -2
  155. package/dist/jobs/memory-queue.d.ts +1 -2
  156. package/dist/jobs/memory-queue.js +1 -2
  157. package/dist/jobs/queue.d.ts +1 -2
  158. package/dist/jsonschema.d.ts +1 -2
  159. package/dist/jsonschema.js +1 -2
  160. package/dist/knowledge/binding.d.ts +1 -2
  161. package/dist/knowledge/contracts.d.ts +67 -68
  162. package/dist/knowledge/contracts.js +1 -2
  163. package/dist/knowledge/ingestion/document-processor.d.ts +1 -2
  164. package/dist/knowledge/ingestion/document-processor.js +1 -2
  165. package/dist/knowledge/ingestion/embedding-service.d.ts +1 -2
  166. package/dist/knowledge/ingestion/embedding-service.js +1 -2
  167. package/dist/knowledge/ingestion/gmail-adapter.d.ts +1 -2
  168. package/dist/knowledge/ingestion/gmail-adapter.js +1 -2
  169. package/dist/knowledge/ingestion/storage-adapter.d.ts +1 -2
  170. package/dist/knowledge/ingestion/storage-adapter.js +1 -2
  171. package/dist/knowledge/ingestion/vector-indexer.d.ts +1 -2
  172. package/dist/knowledge/ingestion/vector-indexer.js +1 -2
  173. package/dist/knowledge/query/service.d.ts +3 -4
  174. package/dist/knowledge/query/service.js +1 -2
  175. package/dist/knowledge/runtime.d.ts +1 -2
  176. package/dist/knowledge/runtime.js +1 -2
  177. package/dist/knowledge/source.d.ts +1 -2
  178. package/dist/knowledge/spaces/email-threads.d.ts +1 -2
  179. package/dist/knowledge/spaces/email-threads.js +1 -2
  180. package/dist/knowledge/spaces/financial-docs.d.ts +1 -2
  181. package/dist/knowledge/spaces/financial-docs.js +1 -2
  182. package/dist/knowledge/spaces/financial-overview.d.ts +1 -2
  183. package/dist/knowledge/spaces/financial-overview.js +1 -2
  184. package/dist/knowledge/spaces/product-canon.d.ts +1 -2
  185. package/dist/knowledge/spaces/product-canon.js +1 -2
  186. package/dist/knowledge/spaces/support-faq.d.ts +1 -2
  187. package/dist/knowledge/spaces/support-faq.js +1 -2
  188. package/dist/knowledge/spaces/uploaded-docs.d.ts +1 -2
  189. package/dist/knowledge/spaces/uploaded-docs.js +1 -2
  190. package/dist/knowledge/spec.d.ts +1 -2
  191. package/dist/knowledge/spec.js +1 -2
  192. package/dist/markdown.d.ts +1 -2
  193. package/dist/markdown.js +1 -2
  194. package/dist/migrations.d.ts +1 -2
  195. package/dist/migrations.js +1 -2
  196. package/dist/onboarding-base.d.ts +30 -31
  197. package/dist/onboarding-base.js +1 -2
  198. package/dist/ownership.d.ts +1 -2
  199. package/dist/ownership.js +1 -2
  200. package/dist/policy/engine.d.ts +1 -2
  201. package/dist/policy/engine.js +1 -2
  202. package/dist/policy/opa-adapter.d.ts +1 -2
  203. package/dist/policy/opa-adapter.js +1 -2
  204. package/dist/policy/spec.d.ts +1 -2
  205. package/dist/policy/spec.js +1 -2
  206. package/dist/presentations.backcompat.d.ts +1 -2
  207. package/dist/presentations.backcompat.js +1 -2
  208. package/dist/presentations.d.ts +1 -2
  209. package/dist/presentations.js +1 -2
  210. package/dist/presentations.v2.d.ts +21 -2
  211. package/dist/presentations.v2.js +1 -2
  212. package/dist/prompt.d.ts +1 -2
  213. package/dist/prompt.js +1 -2
  214. package/dist/promptRegistry.d.ts +1 -2
  215. package/dist/promptRegistry.js +1 -2
  216. package/dist/regenerator/adapters.d.ts +1 -2
  217. package/dist/regenerator/executor.d.ts +1 -2
  218. package/dist/regenerator/executor.js +1 -2
  219. package/dist/regenerator/service.d.ts +1 -2
  220. package/dist/regenerator/service.js +1 -2
  221. package/dist/regenerator/sinks.d.ts +1 -2
  222. package/dist/regenerator/sinks.js +1 -2
  223. package/dist/regenerator/types.d.ts +1 -2
  224. package/dist/regenerator/utils.d.ts +1 -2
  225. package/dist/regenerator/utils.js +1 -2
  226. package/dist/registry.d.ts +1 -2
  227. package/dist/registry.js +1 -2
  228. package/dist/resources.d.ts +1 -2
  229. package/dist/resources.js +1 -2
  230. package/dist/schema/dist/FieldType.js +1 -2
  231. package/dist/schema/dist/ScalarTypeEnum.js +1 -2
  232. package/dist/schema/dist/SchemaModel.js +1 -2
  233. package/dist/schema/dist/entity/defineEntity.js +1 -0
  234. package/dist/schema/dist/entity/index.js +1 -0
  235. package/dist/schema/dist/entity/types.js +1 -0
  236. package/dist/schema/dist/index.js +1 -1
  237. package/dist/schema-to-markdown.d.ts +54 -0
  238. package/dist/schema-to-markdown.js +10 -0
  239. package/dist/server/graphql-pothos.d.ts +1 -2
  240. package/dist/server/graphql-pothos.js +1 -2
  241. package/dist/server/graphql-schema-export.d.ts +1 -2
  242. package/dist/server/graphql-schema-export.js +1 -2
  243. package/dist/server/provider-mcp.d.ts +1 -2
  244. package/dist/server/provider-mcp.js +1 -2
  245. package/dist/server/rest-elysia.d.ts +1 -2
  246. package/dist/server/rest-elysia.js +1 -2
  247. package/dist/server/rest-express.d.ts +1 -2
  248. package/dist/server/rest-express.js +1 -2
  249. package/dist/server/rest-generic.d.ts +1 -2
  250. package/dist/server/rest-generic.js +1 -2
  251. package/dist/server/rest-next-app.d.ts +1 -2
  252. package/dist/server/rest-next-app.js +1 -2
  253. package/dist/server/rest-next-mcp.d.ts +1 -2
  254. package/dist/server/rest-next-mcp.js +1 -2
  255. package/dist/server/rest-next-pages.d.ts +1 -2
  256. package/dist/server/rest-next-pages.js +1 -2
  257. package/dist/spec.d.ts +1 -2
  258. package/dist/spec.js +1 -2
  259. package/dist/telemetry/anomaly.d.ts +1 -2
  260. package/dist/telemetry/anomaly.js +1 -2
  261. package/dist/telemetry/spec.d.ts +1 -2
  262. package/dist/telemetry/spec.js +1 -2
  263. package/dist/telemetry/tracker.d.ts +1 -2
  264. package/dist/telemetry/tracker.js +1 -2
  265. package/dist/tests/runner.d.ts +1 -2
  266. package/dist/tests/runner.js +1 -2
  267. package/dist/tests/spec.d.ts +1 -2
  268. package/dist/tests/spec.js +1 -2
  269. package/dist/themes.d.ts +1 -2
  270. package/dist/themes.js +1 -2
  271. package/dist/translations/catalog.d.ts +1 -2
  272. package/dist/translations/tenant.d.ts +1 -2
  273. package/dist/types/all.d.ts +3 -3
  274. package/dist/types.d.ts +4 -2
  275. package/dist/workflow/adapters/db-adapter.d.ts +1 -2
  276. package/dist/workflow/adapters/db-adapter.js +1 -2
  277. package/dist/workflow/adapters/file-adapter.d.ts +1 -2
  278. package/dist/workflow/adapters/file-adapter.js +1 -2
  279. package/dist/workflow/adapters/memory-store.d.ts +1 -2
  280. package/dist/workflow/adapters/memory-store.js +1 -2
  281. package/dist/workflow/expression.d.ts +1 -2
  282. package/dist/workflow/expression.js +1 -2
  283. package/dist/workflow/runner.d.ts +1 -2
  284. package/dist/workflow/runner.js +1 -2
  285. package/dist/workflow/sla-monitor.d.ts +1 -2
  286. package/dist/workflow/sla-monitor.js +1 -2
  287. package/dist/workflow/spec.d.ts +1 -2
  288. package/dist/workflow/spec.js +1 -2
  289. package/dist/workflow/state.d.ts +1 -2
  290. package/dist/workflow/validation.d.ts +1 -2
  291. package/dist/workflow/validation.js +1 -2
  292. package/package.json +31 -25
  293. package/dist/app-config/branding.d.ts.map +0 -1
  294. package/dist/app-config/contracts.d.ts.map +0 -1
  295. package/dist/app-config/contracts.js.map +0 -1
  296. package/dist/app-config/events.d.ts.map +0 -1
  297. package/dist/app-config/events.js.map +0 -1
  298. package/dist/app-config/lifecycle-contracts.d.ts.map +0 -1
  299. package/dist/app-config/lifecycle-contracts.js.map +0 -1
  300. package/dist/app-config/lifecycle.d.ts.map +0 -1
  301. package/dist/app-config/runtime.d.ts.map +0 -1
  302. package/dist/app-config/runtime.js.map +0 -1
  303. package/dist/app-config/spec.d.ts.map +0 -1
  304. package/dist/app-config/spec.js.map +0 -1
  305. package/dist/app-config/validation.d.ts.map +0 -1
  306. package/dist/app-config/validation.js.map +0 -1
  307. package/dist/capabilities/openbanking.d.ts.map +0 -1
  308. package/dist/capabilities/openbanking.js.map +0 -1
  309. package/dist/capabilities.d.ts.map +0 -1
  310. package/dist/capabilities.js.map +0 -1
  311. package/dist/client/react/drivers/rn-reusables.d.ts.map +0 -1
  312. package/dist/client/react/drivers/rn-reusables.js.map +0 -1
  313. package/dist/client/react/drivers/shadcn.d.ts.map +0 -1
  314. package/dist/client/react/drivers/shadcn.js.map +0 -1
  315. package/dist/client/react/feature-render.d.ts.map +0 -1
  316. package/dist/client/react/feature-render.js.map +0 -1
  317. package/dist/client/react/form-render.d.ts.map +0 -1
  318. package/dist/client/react/form-render.js.map +0 -1
  319. package/dist/contracts-adapter-hydration.d.ts.map +0 -1
  320. package/dist/contracts-adapter-hydration.js.map +0 -1
  321. package/dist/contracts-adapter-input.d.ts.map +0 -1
  322. package/dist/contracts-adapter-input.js.map +0 -1
  323. package/dist/data-views/query-generator.d.ts.map +0 -1
  324. package/dist/data-views/query-generator.js.map +0 -1
  325. package/dist/data-views/runtime.d.ts.map +0 -1
  326. package/dist/data-views/runtime.js.map +0 -1
  327. package/dist/data-views.d.ts.map +0 -1
  328. package/dist/data-views.js.map +0 -1
  329. package/dist/events.d.ts.map +0 -1
  330. package/dist/events.js.map +0 -1
  331. package/dist/experiments/evaluator.d.ts.map +0 -1
  332. package/dist/experiments/evaluator.js.map +0 -1
  333. package/dist/experiments/spec.d.ts.map +0 -1
  334. package/dist/experiments/spec.js.map +0 -1
  335. package/dist/features.d.ts.map +0 -1
  336. package/dist/features.js.map +0 -1
  337. package/dist/forms.d.ts.map +0 -1
  338. package/dist/forms.js.map +0 -1
  339. package/dist/graphql-federation/dist/index.js.map +0 -1
  340. package/dist/install.d.ts.map +0 -1
  341. package/dist/install.js.map +0 -1
  342. package/dist/integrations/binding.d.ts.map +0 -1
  343. package/dist/integrations/connection.d.ts.map +0 -1
  344. package/dist/integrations/contracts.d.ts.map +0 -1
  345. package/dist/integrations/contracts.js.map +0 -1
  346. package/dist/integrations/health.d.ts.map +0 -1
  347. package/dist/integrations/health.js.map +0 -1
  348. package/dist/integrations/openbanking/contracts/accounts.d.ts.map +0 -1
  349. package/dist/integrations/openbanking/contracts/accounts.js.map +0 -1
  350. package/dist/integrations/openbanking/contracts/balances.d.ts.map +0 -1
  351. package/dist/integrations/openbanking/contracts/balances.js.map +0 -1
  352. package/dist/integrations/openbanking/contracts/index.d.ts.map +0 -1
  353. package/dist/integrations/openbanking/contracts/index.js.map +0 -1
  354. package/dist/integrations/openbanking/contracts/transactions.d.ts.map +0 -1
  355. package/dist/integrations/openbanking/contracts/transactions.js.map +0 -1
  356. package/dist/integrations/openbanking/guards.d.ts.map +0 -1
  357. package/dist/integrations/openbanking/guards.js.map +0 -1
  358. package/dist/integrations/openbanking/models.d.ts.map +0 -1
  359. package/dist/integrations/openbanking/models.js.map +0 -1
  360. package/dist/integrations/openbanking/telemetry.d.ts.map +0 -1
  361. package/dist/integrations/openbanking/telemetry.js.map +0 -1
  362. package/dist/integrations/providers/calendar.d.ts.map +0 -1
  363. package/dist/integrations/providers/elevenlabs.d.ts.map +0 -1
  364. package/dist/integrations/providers/elevenlabs.js.map +0 -1
  365. package/dist/integrations/providers/email.d.ts.map +0 -1
  366. package/dist/integrations/providers/embedding.d.ts.map +0 -1
  367. package/dist/integrations/providers/gcs-storage.d.ts.map +0 -1
  368. package/dist/integrations/providers/gcs-storage.js.map +0 -1
  369. package/dist/integrations/providers/gmail.d.ts.map +0 -1
  370. package/dist/integrations/providers/gmail.js.map +0 -1
  371. package/dist/integrations/providers/google-calendar.d.ts.map +0 -1
  372. package/dist/integrations/providers/google-calendar.js.map +0 -1
  373. package/dist/integrations/providers/impls/elevenlabs-voice.d.ts.map +0 -1
  374. package/dist/integrations/providers/impls/elevenlabs-voice.js.map +0 -1
  375. package/dist/integrations/providers/impls/gcs-storage.d.ts.map +0 -1
  376. package/dist/integrations/providers/impls/gcs-storage.js.map +0 -1
  377. package/dist/integrations/providers/impls/gmail-inbound.d.ts.map +0 -1
  378. package/dist/integrations/providers/impls/gmail-inbound.js.map +0 -1
  379. package/dist/integrations/providers/impls/gmail-outbound.d.ts.map +0 -1
  380. package/dist/integrations/providers/impls/gmail-outbound.js.map +0 -1
  381. package/dist/integrations/providers/impls/google-calendar.d.ts.map +0 -1
  382. package/dist/integrations/providers/impls/google-calendar.js.map +0 -1
  383. package/dist/integrations/providers/impls/mistral-embedding.d.ts.map +0 -1
  384. package/dist/integrations/providers/impls/mistral-embedding.js.map +0 -1
  385. package/dist/integrations/providers/impls/mistral-llm.d.ts.map +0 -1
  386. package/dist/integrations/providers/impls/mistral-llm.js.map +0 -1
  387. package/dist/integrations/providers/impls/postmark-email.d.ts.map +0 -1
  388. package/dist/integrations/providers/impls/postmark-email.js.map +0 -1
  389. package/dist/integrations/providers/impls/powens-client.d.ts.map +0 -1
  390. package/dist/integrations/providers/impls/powens-client.js.map +0 -1
  391. package/dist/integrations/providers/impls/powens-openbanking.d.ts.map +0 -1
  392. package/dist/integrations/providers/impls/powens-openbanking.js.map +0 -1
  393. package/dist/integrations/providers/impls/provider-factory.d.ts.map +0 -1
  394. package/dist/integrations/providers/impls/provider-factory.js.map +0 -1
  395. package/dist/integrations/providers/impls/qdrant-vector.d.ts.map +0 -1
  396. package/dist/integrations/providers/impls/qdrant-vector.js.map +0 -1
  397. package/dist/integrations/providers/impls/stripe-payments.d.ts.map +0 -1
  398. package/dist/integrations/providers/impls/stripe-payments.js.map +0 -1
  399. package/dist/integrations/providers/impls/twilio-sms.d.ts.map +0 -1
  400. package/dist/integrations/providers/impls/twilio-sms.js.map +0 -1
  401. package/dist/integrations/providers/llm.d.ts.map +0 -1
  402. package/dist/integrations/providers/mistral.d.ts.map +0 -1
  403. package/dist/integrations/providers/mistral.js.map +0 -1
  404. package/dist/integrations/providers/openbanking.d.ts.map +0 -1
  405. package/dist/integrations/providers/payments.d.ts.map +0 -1
  406. package/dist/integrations/providers/postmark.d.ts.map +0 -1
  407. package/dist/integrations/providers/postmark.js.map +0 -1
  408. package/dist/integrations/providers/powens.d.ts.map +0 -1
  409. package/dist/integrations/providers/powens.js.map +0 -1
  410. package/dist/integrations/providers/qdrant.d.ts.map +0 -1
  411. package/dist/integrations/providers/qdrant.js.map +0 -1
  412. package/dist/integrations/providers/sms.d.ts.map +0 -1
  413. package/dist/integrations/providers/storage.d.ts.map +0 -1
  414. package/dist/integrations/providers/stripe.d.ts.map +0 -1
  415. package/dist/integrations/providers/stripe.js.map +0 -1
  416. package/dist/integrations/providers/twilio-sms.d.ts.map +0 -1
  417. package/dist/integrations/providers/twilio-sms.js.map +0 -1
  418. package/dist/integrations/providers/vector-store.d.ts.map +0 -1
  419. package/dist/integrations/providers/voice.d.ts.map +0 -1
  420. package/dist/integrations/runtime.d.ts.map +0 -1
  421. package/dist/integrations/runtime.js.map +0 -1
  422. package/dist/integrations/secrets/env-secret-provider.d.ts.map +0 -1
  423. package/dist/integrations/secrets/env-secret-provider.js.map +0 -1
  424. package/dist/integrations/secrets/gcp-secret-manager.d.ts.map +0 -1
  425. package/dist/integrations/secrets/gcp-secret-manager.js.map +0 -1
  426. package/dist/integrations/secrets/manager.d.ts.map +0 -1
  427. package/dist/integrations/secrets/manager.js.map +0 -1
  428. package/dist/integrations/secrets/provider.d.ts.map +0 -1
  429. package/dist/integrations/secrets/provider.js.map +0 -1
  430. package/dist/integrations/spec.d.ts.map +0 -1
  431. package/dist/integrations/spec.js.map +0 -1
  432. package/dist/jobs/gcp-cloud-tasks.d.ts.map +0 -1
  433. package/dist/jobs/gcp-cloud-tasks.js.map +0 -1
  434. package/dist/jobs/gcp-pubsub.d.ts.map +0 -1
  435. package/dist/jobs/gcp-pubsub.js.map +0 -1
  436. package/dist/jobs/handlers/gmail-sync-handler.d.ts.map +0 -1
  437. package/dist/jobs/handlers/gmail-sync-handler.js.map +0 -1
  438. package/dist/jobs/handlers/storage-document-handler.d.ts.map +0 -1
  439. package/dist/jobs/handlers/storage-document-handler.js.map +0 -1
  440. package/dist/jobs/memory-queue.d.ts.map +0 -1
  441. package/dist/jobs/memory-queue.js.map +0 -1
  442. package/dist/jobs/queue.d.ts.map +0 -1
  443. package/dist/jsonschema.d.ts.map +0 -1
  444. package/dist/jsonschema.js.map +0 -1
  445. package/dist/knowledge/binding.d.ts.map +0 -1
  446. package/dist/knowledge/contracts.d.ts.map +0 -1
  447. package/dist/knowledge/contracts.js.map +0 -1
  448. package/dist/knowledge/ingestion/document-processor.d.ts.map +0 -1
  449. package/dist/knowledge/ingestion/document-processor.js.map +0 -1
  450. package/dist/knowledge/ingestion/embedding-service.d.ts.map +0 -1
  451. package/dist/knowledge/ingestion/embedding-service.js.map +0 -1
  452. package/dist/knowledge/ingestion/gmail-adapter.d.ts.map +0 -1
  453. package/dist/knowledge/ingestion/gmail-adapter.js.map +0 -1
  454. package/dist/knowledge/ingestion/storage-adapter.d.ts.map +0 -1
  455. package/dist/knowledge/ingestion/storage-adapter.js.map +0 -1
  456. package/dist/knowledge/ingestion/vector-indexer.d.ts.map +0 -1
  457. package/dist/knowledge/ingestion/vector-indexer.js.map +0 -1
  458. package/dist/knowledge/query/service.d.ts.map +0 -1
  459. package/dist/knowledge/query/service.js.map +0 -1
  460. package/dist/knowledge/runtime.d.ts.map +0 -1
  461. package/dist/knowledge/runtime.js.map +0 -1
  462. package/dist/knowledge/source.d.ts.map +0 -1
  463. package/dist/knowledge/spaces/email-threads.d.ts.map +0 -1
  464. package/dist/knowledge/spaces/email-threads.js.map +0 -1
  465. package/dist/knowledge/spaces/financial-docs.d.ts.map +0 -1
  466. package/dist/knowledge/spaces/financial-docs.js.map +0 -1
  467. package/dist/knowledge/spaces/financial-overview.d.ts.map +0 -1
  468. package/dist/knowledge/spaces/financial-overview.js.map +0 -1
  469. package/dist/knowledge/spaces/product-canon.d.ts.map +0 -1
  470. package/dist/knowledge/spaces/product-canon.js.map +0 -1
  471. package/dist/knowledge/spaces/support-faq.d.ts.map +0 -1
  472. package/dist/knowledge/spaces/support-faq.js.map +0 -1
  473. package/dist/knowledge/spaces/uploaded-docs.d.ts.map +0 -1
  474. package/dist/knowledge/spaces/uploaded-docs.js.map +0 -1
  475. package/dist/knowledge/spec.d.ts.map +0 -1
  476. package/dist/knowledge/spec.js.map +0 -1
  477. package/dist/markdown.d.ts.map +0 -1
  478. package/dist/markdown.js.map +0 -1
  479. package/dist/migrations.d.ts.map +0 -1
  480. package/dist/migrations.js.map +0 -1
  481. package/dist/onboarding-base.d.ts.map +0 -1
  482. package/dist/onboarding-base.js.map +0 -1
  483. package/dist/ownership.d.ts.map +0 -1
  484. package/dist/ownership.js.map +0 -1
  485. package/dist/policy/engine.d.ts.map +0 -1
  486. package/dist/policy/engine.js.map +0 -1
  487. package/dist/policy/opa-adapter.d.ts.map +0 -1
  488. package/dist/policy/opa-adapter.js.map +0 -1
  489. package/dist/policy/spec.d.ts.map +0 -1
  490. package/dist/policy/spec.js.map +0 -1
  491. package/dist/presentations.backcompat.d.ts.map +0 -1
  492. package/dist/presentations.backcompat.js.map +0 -1
  493. package/dist/presentations.d.ts.map +0 -1
  494. package/dist/presentations.js.map +0 -1
  495. package/dist/presentations.v2.d.ts.map +0 -1
  496. package/dist/presentations.v2.js.map +0 -1
  497. package/dist/prompt.d.ts.map +0 -1
  498. package/dist/prompt.js.map +0 -1
  499. package/dist/promptRegistry.d.ts.map +0 -1
  500. package/dist/promptRegistry.js.map +0 -1
  501. package/dist/regenerator/adapters.d.ts.map +0 -1
  502. package/dist/regenerator/executor.d.ts.map +0 -1
  503. package/dist/regenerator/executor.js.map +0 -1
  504. package/dist/regenerator/service.d.ts.map +0 -1
  505. package/dist/regenerator/service.js.map +0 -1
  506. package/dist/regenerator/sinks.d.ts.map +0 -1
  507. package/dist/regenerator/sinks.js.map +0 -1
  508. package/dist/regenerator/types.d.ts.map +0 -1
  509. package/dist/regenerator/utils.d.ts.map +0 -1
  510. package/dist/regenerator/utils.js.map +0 -1
  511. package/dist/registry.d.ts.map +0 -1
  512. package/dist/registry.js.map +0 -1
  513. package/dist/resources.d.ts.map +0 -1
  514. package/dist/resources.js.map +0 -1
  515. package/dist/schema/dist/FieldType.js.map +0 -1
  516. package/dist/schema/dist/ScalarTypeEnum.js.map +0 -1
  517. package/dist/schema/dist/SchemaModel.js.map +0 -1
  518. package/dist/server/graphql-pothos.d.ts.map +0 -1
  519. package/dist/server/graphql-pothos.js.map +0 -1
  520. package/dist/server/graphql-schema-export.d.ts.map +0 -1
  521. package/dist/server/graphql-schema-export.js.map +0 -1
  522. package/dist/server/provider-mcp.d.ts.map +0 -1
  523. package/dist/server/provider-mcp.js.map +0 -1
  524. package/dist/server/rest-elysia.d.ts.map +0 -1
  525. package/dist/server/rest-elysia.js.map +0 -1
  526. package/dist/server/rest-express.d.ts.map +0 -1
  527. package/dist/server/rest-express.js.map +0 -1
  528. package/dist/server/rest-generic.d.ts.map +0 -1
  529. package/dist/server/rest-generic.js.map +0 -1
  530. package/dist/server/rest-next-app.d.ts.map +0 -1
  531. package/dist/server/rest-next-app.js.map +0 -1
  532. package/dist/server/rest-next-mcp.d.ts.map +0 -1
  533. package/dist/server/rest-next-mcp.js.map +0 -1
  534. package/dist/server/rest-next-pages.d.ts.map +0 -1
  535. package/dist/server/rest-next-pages.js.map +0 -1
  536. package/dist/spec.d.ts.map +0 -1
  537. package/dist/spec.js.map +0 -1
  538. package/dist/telemetry/anomaly.d.ts.map +0 -1
  539. package/dist/telemetry/anomaly.js.map +0 -1
  540. package/dist/telemetry/spec.d.ts.map +0 -1
  541. package/dist/telemetry/spec.js.map +0 -1
  542. package/dist/telemetry/tracker.d.ts.map +0 -1
  543. package/dist/telemetry/tracker.js.map +0 -1
  544. package/dist/tests/runner.d.ts.map +0 -1
  545. package/dist/tests/runner.js.map +0 -1
  546. package/dist/tests/spec.d.ts.map +0 -1
  547. package/dist/tests/spec.js.map +0 -1
  548. package/dist/themes.d.ts.map +0 -1
  549. package/dist/themes.js.map +0 -1
  550. package/dist/translations/catalog.d.ts.map +0 -1
  551. package/dist/translations/tenant.d.ts.map +0 -1
  552. package/dist/types.d.ts.map +0 -1
  553. package/dist/workflow/adapters/db-adapter.d.ts.map +0 -1
  554. package/dist/workflow/adapters/db-adapter.js.map +0 -1
  555. package/dist/workflow/adapters/file-adapter.d.ts.map +0 -1
  556. package/dist/workflow/adapters/file-adapter.js.map +0 -1
  557. package/dist/workflow/adapters/memory-store.d.ts.map +0 -1
  558. package/dist/workflow/adapters/memory-store.js.map +0 -1
  559. package/dist/workflow/expression.d.ts.map +0 -1
  560. package/dist/workflow/expression.js.map +0 -1
  561. package/dist/workflow/runner.d.ts.map +0 -1
  562. package/dist/workflow/runner.js.map +0 -1
  563. package/dist/workflow/sla-monitor.d.ts.map +0 -1
  564. package/dist/workflow/sla-monitor.js.map +0 -1
  565. package/dist/workflow/spec.d.ts.map +0 -1
  566. package/dist/workflow/spec.js.map +0 -1
  567. package/dist/workflow/state.d.ts.map +0 -1
  568. package/dist/workflow/validation.d.ts.map +0 -1
  569. package/dist/workflow/validation.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","names":["key: OperationKey","found: AnySpec | undefined","out: { spec: AnySpec; handler: AnyHandler }[]","key","result: unknown"],"sources":["../src/registry.ts"],"sourcesContent":["/**\n * SpecRegistry:\n * - Registers ContractSpecs (unique by name+version)\n * - Binds runtime handlers to specs\n * - Provides lookup, iteration, and a safe execute() with validation/policy/enforcement\n *\n * Includes a minimal OpRegistry shim for backward-compat (deprecated).\n */\nimport {\n type ContractSpec,\n type TelemetryTrigger,\n isEmitDeclRef,\n} from './spec';\nimport type { ResourceRefDescriptor } from './resources';\nimport type { HandlerCtx } from './types';\nimport { eventKey } from './events';\nimport type { AnySchemaModel, ZodSchemaModel } from '@lssm/lib.schema';\nimport type { HandlerFor } from './install';\n\nexport type OperationKey = `${string}.v${number}`;\n\nexport function opKey(name: string, version: number): OperationKey {\n return `${name}.v${version}`;\n}\n\ntype AnySpec = ContractSpec<\n AnySchemaModel,\n AnySchemaModel | ResourceRefDescriptor<boolean>\n>;\ntype AnyHandler = (args: any, ctx: HandlerCtx) => Promise<unknown>;\n\n/**\n * In-memory registry for ContractSpecs and their bound handlers.\n * Provides validation, policy enforcement, and guarded event emission at execute time.\n */\nexport class SpecRegistry {\n private specs = new Map<OperationKey, AnySpec>();\n private handlers = new Map<OperationKey, AnyHandler>();\n\n /**\n * Registers a ContractSpec definition.\n *\n * @param spec - The contract specification to register.\n * @returns The registry instance for chaining.\n * @throws If a spec with the same name and version is already registered.\n */\n register<\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n >(spec: ContractSpec<I, O>): this {\n const key = opKey(spec.meta.name, spec.meta.version);\n if (this.specs.has(key)) throw new Error(`Duplicate spec ${key}`);\n this.specs.set(key, spec as AnySpec);\n return this;\n }\n\n /**\n * Binds a runtime handler implementation to a previously registered spec.\n *\n * @param spec - The spec to bind to.\n * @param handler - The async function implementing the business logic.\n * @returns The registry instance for chaining.\n * @throws If the spec is not found or a handler is already bound.\n */\n bind<\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n >(spec: ContractSpec<I, O>, handler: HandlerFor<ContractSpec<I, O>>): this {\n const key: OperationKey = opKey(spec.meta.name, spec.meta.version);\n\n if (!this.specs.has(key))\n throw new Error(`Cannot bind; spec not found: ${key}`);\n if (this.handlers.has(key))\n throw new Error(`Handler already bound for ${key}`);\n this.handlers.set(key, handler);\n return this;\n }\n\n /**\n * Retrieves a registered spec by name and version.\n * If version is omitted, returns the highest version found.\n *\n * @param name - Operation name.\n * @param version - (Optional) Specific version.\n */\n getSpec(name: string, version?: number): AnySpec | undefined {\n if (version != null) return this.specs.get(opKey(name, version));\n // find highest version by scanning keys of the same name\n let found: AnySpec | undefined;\n let maxV = -Infinity;\n for (const [k, s] of this.specs.entries()) {\n if (!k.startsWith(`${name}.v`)) continue;\n if (s.meta.version > maxV) {\n maxV = s.meta.version;\n found = s;\n }\n }\n return found;\n }\n\n /**\n * Retrieves the bound handler for a spec.\n */\n getHandler(name: string, version?: number): AnyHandler | undefined {\n const spec = this.getSpec(name, version);\n if (!spec) return undefined;\n return this.handlers.get(opKey(spec.meta.name, spec.meta.version));\n }\n\n /** Iterate all registered specs. */\n listSpecs(): AnySpec[] {\n return [...this.specs.values()];\n }\n\n /** Iterate all bound operations (spec+handler). */\n listBound(): { spec: AnySpec; handler: AnyHandler }[] {\n const out: { spec: AnySpec; handler: AnyHandler }[] = [];\n for (const [k, spec] of this.specs.entries()) {\n const h = this.handlers.get(k);\n if (h) out.push({ spec, handler: h });\n }\n return out;\n }\n\n /**\n * Execute an operation by name/version with full runtime protections:\n * 1. Validates input against Zod schema.\n * 2. Enforces policy (Auth, RBAC, Rate Limits) via PDP.\n * 3. Guards event emission to ensure only declared events are sent.\n * 4. Validates output against Zod schema (if applicable).\n * 5. Tracks telemetry (success/failure).\n *\n * @param name - Operation name.\n * @param version - Operation version (optional, defaults to latest).\n * @param rawInput - The raw input payload (e.g. from JSON body).\n * @param ctx - The runtime context (actor, tenant, etc.).\n */\n async execute(\n name: string,\n version: number | undefined,\n rawInput: unknown,\n ctx: HandlerCtx\n ): Promise<unknown> {\n const spec = this.getSpec(name, version);\n if (!spec)\n throw new Error(\n `Spec not found for ${name}${version ? `.v${version}` : ''}`\n );\n\n const key = opKey(spec.meta.name, spec.meta.version);\n const handler = this.handlers.get(key);\n if (!handler) throw new Error(`No handler bound for ${key}`);\n\n // 1) Validate input\n const parsedInput = spec.io.input?.getZod().parse(rawInput);\n\n // 2) Policy enforcement\n if (ctx.decide) {\n const [service, command] = spec.meta.name.split('.');\n const decision = await ctx.decide({\n service: service!,\n command: command!,\n version: spec.meta.version,\n actor: ctx.actor ?? 'anonymous',\n channel: ctx.channel,\n roles: ctx.roles,\n organizationId: ctx.organizationId,\n userId: ctx.userId,\n flags: [], // adapter may fill flags from request\n });\n if (decision.effect === 'deny') {\n throw new Error(\n `PolicyDenied: ${spec.meta.name}.v${spec.meta.version}`\n );\n }\n if (decision.rateLimit && ctx.rateLimit) {\n const key = decision.rateLimit.key ?? 'default';\n const rpm = decision.rateLimit.rpm ?? 60;\n await ctx.rateLimit(key, 1, rpm);\n }\n // escalations are advisory; adapter may short-circuit if needed\n }\n\n // 3) Event emission guard\n const allowedEvents = new Map<string, AnySchemaModel>();\n if (spec.sideEffects?.emits) {\n for (const e of spec.sideEffects.emits) {\n if (isEmitDeclRef(e)) {\n allowedEvents.set(`${e.ref.name}.v${e.ref.version}`, e.ref.payload);\n } else {\n allowedEvents.set(`${e.name}.v${e.version}`, e.payload);\n }\n }\n }\n\n const emitGuard = async (\n eventName: string,\n eventVersion: number,\n payload: unknown\n ) => {\n const key2 = eventKey(eventName, eventVersion);\n const schema = allowedEvents.get(key2);\n if (!schema)\n throw new Error(\n `UndeclaredEvent: ${key2} not allowed by ${opKey(spec.meta.name, spec.meta.version)}`\n );\n const parsed = schema.getZod().parse(payload);\n // Delegate to service publisher if present\n await ctx.eventPublisher?.({\n name: eventName,\n version: eventVersion,\n payload: parsed,\n traceId: ctx.traceId,\n });\n };\n\n // 4) Execute handler with guarded ctx\n if (ctx.appConfig) {\n if (!ctx.branding) {\n ctx.branding = ctx.appConfig.branding;\n }\n if (!ctx.translation) {\n ctx.translation = { config: ctx.appConfig.translation };\n } else if (!ctx.translation.config) {\n ctx.translation = {\n ...ctx.translation,\n config: ctx.appConfig.translation,\n };\n }\n }\n const telemetryContext = ctx.telemetry;\n const trackTelemetry = async (\n trigger: TelemetryTrigger | undefined,\n details: { input: unknown; output?: unknown; error?: unknown }\n ) => {\n if (!telemetryContext || !trigger?.event) return;\n try {\n const props = trigger.properties?.(details) ?? {};\n await telemetryContext.track(\n trigger.event.name,\n trigger.event.version ?? 1,\n props,\n {\n tenantId: ctx.organizationId ?? undefined,\n organizationId: ctx.organizationId,\n userId: ctx.userId,\n actor: ctx.actor,\n channel: ctx.channel,\n metadata: ctx.traceId ? { traceId: ctx.traceId } : undefined,\n }\n );\n } catch (_error) {\n // Best-effort telemetry: swallow errors to avoid breaking the handler.\n }\n };\n\n let result: unknown;\n try {\n result = await handler(parsedInput, {\n ...ctx,\n __emitGuard__: emitGuard,\n });\n } catch (error) {\n if (spec.telemetry?.failure) {\n await trackTelemetry(spec.telemetry.failure, {\n input: parsedInput ?? rawInput,\n error,\n });\n }\n throw error;\n }\n\n if (spec.telemetry?.success) {\n await trackTelemetry(spec.telemetry.success, {\n input: parsedInput ?? rawInput,\n output: result,\n });\n }\n\n // 5) Validate output when the spec declares a SchemaModel output.\n const outputModel = spec.io.output as\n | AnySchemaModel\n | ResourceRefDescriptor<boolean>;\n if ((outputModel as AnySchemaModel)?.getZod) {\n const parsedOutput = (outputModel as AnySchemaModel)\n .getZod()\n .parse(result);\n return parsedOutput;\n }\n // ResourceRefDescriptor path: adapter may hydrate entity; leave as-is\n return result;\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resources.d.ts","names":[],"sources":["../src/resources.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,YAAA;;EAAA,WAAA,EAAA,MAAY;EAaZ;EAAiC,KAAA,EAAA,MAAA;EAC1C;EAEC,WAAA,CAAA,EAAA,MAAA;EAMS;EAAN,QAAA,EAAA,MAAA;EAE2C;EAAhD,IAAA,CAAA,EAdE,GAcF,EAAA;;AAGS,UAdC,oBAcqB,CAAA,UAdU,CAAA,CAAE,OAcZ,CAAA,CAAA;EAAa,IAAA,EAb3C,YAa2C;EACtB;EAArB,KAAA,EAZC,CAYD;EACgB;;;AAIxB;EAGuB,OAAA,EAAA,CAAA,IAAA,EAdb,CAAA,CAAE,KAcW,CAdL,CAcK,CAAA,EAAA,GAAA,EAAA;IAAoC,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAArB,KAAA,CAAA,EAAA,MAAA,GAAA,IAAA;IAKvB,MAAA,CAAA,EAAA,MAAA;EASD,CAAA,EAAA,GA1BP,OA0BO,CAAA;IAAmC,GAAA,EAAA,MAAA;IAAM,QAAA,CAAA,EAAA,MAAA;IAoBtC,IAAA,EA9CsC,UA8CtC,GAAA,MAAqB;EAYtB,CAAA,CAAA;;AAGS,iBA1DT,sBA0DS,CAAA,UA1DwB,CAAA,CAAE,OA0D1B,CAAA,CAAA,IAAA,EAzDjB,oBAyDiB,CAzDI,CAyDJ,CAAA,CAAA,EAxDtB,oBAwDsB,CAxDD,CAwDC,CAAA;AAAtB,cApDU,gBAAA,CAoDV;EAAqB,QAAA,SAAA;EAUR,QAAA,CAAA,UA3DK,CAAA,CAAE,OA2DM,CAAmB,CAAA,IAAA,EA3DV,oBA2D+B,CA3DV,CA2DU,CAAA,CAAA,EAAA,IAAA;mBAtDtD;;;UASD;YAAmC;;;UAoBhC;;;;;;;;;QAST;;iBAGQ;;;QAEuC;IACpD,sBAAsB;iBAUT,aAAA,mBAAgC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"resources.js","names":["params: Record<string, string>"],"sources":["../src/resources.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { Tag } from './ownership';\n\nexport interface ResourceMeta {\n /** URI scheme, e.g. \"content://doc/{id}\" or \"marketplace://offers/{city}/{tag}\" */\n uriTemplate: string;\n /** Human title for discovery */\n title: string;\n /** Short description */\n description?: string;\n /** MIME type for resource body */\n mimeType: string; // e.g., \"application/json\" | \"text/markdown\"\n /** Tags for filtering/grouping */\n tags?: Tag[];\n}\n\nexport interface ResourceTemplateSpec<I extends z.ZodType> {\n meta: ResourceMeta;\n /** Arguments to materialize the URI (zod validates input) */\n input: I;\n /**\n * Resolve returns the resource body and a resolved URI.\n * It MUST be read-only (no side effects).\n */\n resolve: (\n args: z.infer<I>,\n ctx: { userId?: string | null; orgId?: string | null; locale?: string }\n ) => Promise<{ uri: string; mimeType?: string; data: Uint8Array | string }>;\n}\n\nexport function defineResourceTemplate<I extends z.ZodType>(\n spec: ResourceTemplateSpec<I>\n): ResourceTemplateSpec<I> {\n return spec;\n}\n\nexport class ResourceRegistry {\n private templates: ResourceTemplateSpec<any>[] = [];\n\n register<I extends z.ZodType>(tmpl: ResourceTemplateSpec<I>): this {\n this.templates.push(tmpl);\n return this;\n }\n\n listTemplates() {\n return [...this.templates];\n }\n\n /** Try to match a concrete URI to a template by naive pattern substitution */\n // MVP: simple matcher; replace {param} with (.+) and capture\n match(\n uri: string\n ):\n | { tmpl: ResourceTemplateSpec<any>; params: Record<string, string> }\n | undefined {\n for (const tmpl of this.templates) {\n const re = new RegExp(\n '^' + tmpl.meta.uriTemplate.replace(/\\{[^}]+\\}/g, '([^/]+)') + '$'\n );\n const m = uri.match(re);\n if (!m) continue;\n const names = [...tmpl.meta.uriTemplate.matchAll(/\\{([^}]+)\\}/g)].map(\n (x) => x[1]\n );\n const params: Record<string, string> = {};\n names.forEach((n, i) => (params[n!] = decodeURIComponent(m[i + 1]!)));\n return { tmpl, params };\n }\n return undefined;\n }\n}\n\n// ResourceRef (output descriptor for ContractSpecs)\nexport interface ResourceRefDescriptor<Many extends boolean> {\n kind: 'resource_ref';\n /** URI template, e.g. 'strit://spot/{id}' */\n uriTemplate: string;\n /** Variable name inside result payload to substitute into template; defaults to 'id' */\n varName?: string;\n /** Optional GraphQL type name to use when exposing over GraphQL (e.g., 'Spot') */\n graphQLType: string;\n /** Cardinality: when present and true, the handler returns an array of resources */\n many: Many;\n}\n\nexport function resourceRef<Many extends boolean>(\n uriTemplate: string,\n opts: { varName?: string; graphQLType: string; many: Many }\n): ResourceRefDescriptor<Many> {\n return {\n kind: 'resource_ref',\n uriTemplate,\n varName: opts.varName ?? 'id',\n graphQLType: opts.graphQLType,\n many: opts.many,\n };\n}\n\nexport function isResourceRef(x: unknown): x is ResourceRefDescriptor<boolean> {\n const o = x as any;\n return !!o && o.kind === 'resource_ref' && typeof o.uriTemplate === 'string';\n}\n"],"mappings":"wBA8BA,SAAgB,EACd,EACyB,CACzB,OAAO,EAGT,IAAa,EAAb,KAA8B,CAC5B,UAAiD,EAAE,CAEnD,SAA8B,EAAqC,CAEjE,OADA,KAAK,UAAU,KAAK,EAAK,CAClB,KAGT,eAAgB,CACd,MAAO,CAAC,GAAG,KAAK,UAAU,CAK5B,MACE,EAGY,CACZ,IAAK,IAAM,KAAQ,KAAK,UAAW,CACjC,IAAM,EAAS,OACb,IAAM,EAAK,KAAK,YAAY,QAAQ,aAAc,UAAU,CAAG,IAChE,CACK,EAAI,EAAI,MAAM,EAAG,CACvB,GAAI,CAAC,EAAG,SACR,IAAM,EAAQ,CAAC,GAAG,EAAK,KAAK,YAAY,SAAS,eAAe,CAAC,CAAC,IAC/D,GAAM,EAAE,GACV,CACKA,EAAiC,EAAE,CAEzC,OADA,EAAM,SAAS,EAAG,IAAO,EAAO,GAAM,mBAAmB,EAAE,EAAI,GAAI,CAAE,CAC9D,CAAE,OAAM,SAAQ,IAmB7B,SAAgB,EACd,EACA,EAC6B,CAC7B,MAAO,CACL,KAAM,eACN,cACA,QAAS,EAAK,SAAW,KACzB,YAAa,EAAK,YAClB,KAAM,EAAK,KACZ,CAGH,SAAgB,EAAc,EAAiD,CAC7E,IAAM,EAAI,EACV,MAAO,CAAC,CAAC,GAAK,EAAE,OAAS,gBAAkB,OAAO,EAAE,aAAgB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"FieldType.js","names":["t","r"],"sources":["../../../../schema/dist/FieldType.js"],"sourcesContent":["import{z as e}from\"zod\";import{GraphQLScalarType as t,Kind as n}from\"graphql\";var r=class extends t{zodSchema;jsonSchemaDef;constructor(e){super(e),this.zodSchema=e.zod,this.jsonSchemaDef=e.jsonSchema}getZod(){return this.zodSchema}getPothos(){return this}getJson(){return typeof this.jsonSchemaDef==`function`?this.jsonSchemaDef():this.jsonSchemaDef}getJsonSchemaDef(){return this.jsonSchemaDef}getJsonSchema(){let e=t=>{let n=typeof t==`function`?t():t;if(Array.isArray(n))return n.map(t=>e(t));if(n&&typeof n==`object`){let t={};for(let[r,i]of Object.entries(n))t[r]=e(i);return t}return n};return e(this.getJson())}};export{r as FieldType};\n//# sourceMappingURL=FieldType.js.map"],"mappings":"8EAA8E,IAAI,EAAE,cAAcA,CAAC,CAAC,UAAU,cAAc,YAAY,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,UAAU,EAAE,IAAI,KAAK,cAAc,EAAE,WAAW,QAAQ,CAAC,OAAO,KAAK,UAAU,WAAW,CAAC,OAAO,KAAK,SAAS,CAAC,OAAO,OAAO,KAAK,eAAe,WAAW,KAAK,eAAe,CAAC,KAAK,cAAc,kBAAkB,CAAC,OAAO,KAAK,cAAc,eAAe,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,CAAC,EAAE,GAAG,MAAM,QAAQ,EAAE,CAAC,OAAO,EAAE,IAAI,GAAG,EAAEA,EAAE,CAAC,CAAC,GAAG,GAAG,OAAO,GAAG,SAAS,CAAC,IAAIA,EAAE,EAAE,CAAC,IAAI,GAAG,CAACC,EAAE,KAAK,OAAO,QAAQ,EAAE,CAAC,EAAEA,GAAG,EAAE,EAAE,CAAC,OAAOD,EAAE,OAAO,GAAG,OAAO,EAAE,KAAK,SAAS,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"ScalarTypeEnum.js","names":["r","e","t","n"],"sources":["../../../../schema/dist/ScalarTypeEnum.js"],"sourcesContent":["import{FieldType as e}from\"./FieldType.js\";import{z as t}from\"zod\";import{Kind as n}from\"graphql\";const r=/^[A-Za-z]{2}(?:-[A-Za-z0-9]{2,8})*$/,i=/^(?:UTC|[A-Za-z_]+\\/[A-Za-z_]+)$/,a=/^[+]?\\d[\\d\\s().-]{3,}$/,o=/^[A-Z]{3}$/,s=/^[A-Z]{2}$/,c=-180,l={String_unsecure:()=>new e({name:`String_unsecure`,description:`Unvalidated string scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),Int_unsecure:()=>new e({name:`Int_unsecure`,description:`Unvalidated integer scalar`,zod:t.number().int(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().int().parse(n)},serialize:e=>Math.trunc(typeof e==`number`?e:Number(e)),parseLiteral:e=>{if(e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`integer`}}),Float_unsecure:()=>new e({name:`Float_unsecure`,description:`Unvalidated float scalar`,zod:t.number(),parseValue:e=>{let n=typeof e==`number`?e:Number(e);return t.number().parse(n)},serialize:e=>Number(e),parseLiteral:e=>{if(e.kind!==n.FLOAT&&e.kind!==n.INT)throw TypeError(`Invalid literal`);return Number(e.value)},jsonSchema:{type:`number`}}),Boolean:()=>new e({name:`Boolean`,description:`Unvalidated boolean scalar`,zod:t.boolean(),parseValue:e=>t.coerce.boolean().parse(e),serialize:e=>!!e,parseLiteral:e=>{if(e.kind!==n.BOOLEAN)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`boolean`}}),ID:()=>new e({name:`ID`,description:`Unvalidated id scalar`,zod:t.string(),parseValue:e=>t.string().parse(e),serialize:e=>String(e),parseLiteral:e=>{if(e.kind!==n.STRING)throw TypeError(`Invalid literal`);return e.value},jsonSchema:{type:`string`}}),JSON:()=>new e({name:`JSON`,zod:t.any(),parseValue:e=>e,serialize:e=>e,jsonSchema:{}}),JSONObject:()=>new e({name:`JSONObject`,zod:t.record(t.string(),t.any()),parseValue:e=>t.record(t.string(),t.any()).parse(e),serialize:e=>e??{},jsonSchema:{type:`object`}}),Date:()=>new e({name:`Date`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString().split(`T`)[0]:String(e),jsonSchema:{type:`string`,format:`date`}}),DateTime:()=>new e({name:`DateTime`,zod:t.date(),parseValue:e=>e instanceof Date?e:new Date(String(e)),serialize:e=>e instanceof Date?e.toISOString():String(e),jsonSchema:{type:`string`,format:`date-time`}}),Time:()=>new e({name:`Time`,zod:t.string().regex(/^\\d{2}:\\d{2}(:\\d{2})?$/),parseValue:e=>t.string().regex(/^\\d{2}:\\d{2}(:\\d{2})?$/).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:`^\\\\d{2}:\\\\d{2}(:\\\\d{2})?$`}}),EmailAddress:()=>new e({name:`EmailAddress`,zod:t.string().email(),parseValue:e=>t.string().email().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`email`}}),URL:()=>new e({name:`URL`,zod:t.string().url(),parseValue:e=>t.string().url().parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,format:`uri`}}),PhoneNumber:()=>new e({name:`PhoneNumber`,zod:t.string().regex(a),parseValue:e=>t.string().regex(a).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:a.source}}),NonEmptyString:()=>new e({name:`NonEmptyString`,zod:t.string().min(1),parseValue:e=>t.string().min(1).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,minLength:1}}),Locale:()=>new e({name:`Locale`,zod:t.string().regex(r),parseValue:e=>t.string().regex(r).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:r.source}}),TimeZone:()=>new e({name:`TimeZone`,zod:t.string().regex(i),parseValue:e=>t.string().regex(i).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:i.source}}),Latitude:()=>new e({name:`Latitude`,zod:t.number().min(-90).max(90),parseValue:e=>t.coerce.number().min(-90).max(90).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:-90,maximum:90}}),Longitude:()=>new e({name:`Longitude`,zod:t.number().min(c).max(180),parseValue:e=>t.coerce.number().min(c).max(180).parse(e),serialize:e=>Number(e),jsonSchema:{type:`number`,minimum:c,maximum:180}}),Currency:()=>new e({name:`Currency`,zod:t.string().regex(o),parseValue:e=>t.string().regex(o).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:o.source}}),CountryCode:()=>new e({name:`CountryCode`,zod:t.string().regex(s),parseValue:e=>t.string().regex(s).parse(e),serialize:e=>String(e),jsonSchema:{type:`string`,pattern:s.source}})};export{l as ScalarTypeEnum};\n//# sourceMappingURL=ScalarTypeEnum.js.map"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"SchemaModel.js","names":["t","e"],"sources":["../../../../schema/dist/SchemaModel.js"],"sourcesContent":["import\"./EnumType.js\";import\"./FieldType.js\";import{z as e}from\"zod\";var t=class{constructor(e){this.config=e}getZod(){let t=Object.entries(this.config.fields).reduce((t,[n,r])=>{let i=r.type.getZod(),a=r.isArray?e.array(i):i;return t[n]=r.isOptional?a.optional():a,t},{});return e.object(t)}getPothosInput(){return this.config.name}};export{t as SchemaModel};\n//# sourceMappingURL=SchemaModel.js.map"],"mappings":"qEAAqE,IAAI,EAAE,KAAK,CAAC,YAAY,EAAE,CAAC,KAAK,OAAO,EAAE,QAAQ,CAAC,IAAIA,EAAE,OAAO,QAAQ,KAAK,OAAO,OAAO,CAAC,QAAQ,EAAE,CAAC,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE,QAAQC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAO,GAAE,GAAG,EAAE,WAAW,EAAE,UAAU,CAAC,EAAED,GAAG,EAAE,CAAC,CAAC,OAAOC,EAAE,OAAOD,EAAE,CAAC,gBAAgB,CAAC,OAAO,KAAK,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"graphql-pothos.d.ts","names":[],"sources":["../../src/server/graphql-pothos.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;;AAuCA;;;;;;;;;;;;;;;iBAAgB,qCAAqC,sBAC1C,iBAAA,CAAkB,cAAc,SACpC,0BACO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"graphql-pothos.js","names":["acc: Record<string, any>","handlerCtx: HandlerCtx","result: unknown","fieldSettingsFn: QueryFieldThunk<T> | MutationFieldThunk<T>"],"sources":["../../src/server/graphql-pothos.ts"],"sourcesContent":["import type {\n MutationFieldThunk,\n QueryFieldThunk,\n SchemaTypes,\n} from '@pothos/core';\nimport type { HandlerCtx } from '../types';\nimport { defaultGqlField } from '../jsonschema';\nimport type { SpecRegistry } from '../registry';\nimport '@pothos/plugin-prisma';\nimport '@pothos/plugin-complexity';\nimport '@pothos/plugin-relay';\nimport '@pothos/plugin-dataloader';\nimport '@pothos/plugin-tracing';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { ResourceRefDescriptor, ResourceRegistry } from '../resources';\nimport { createInputTypeBuilder } from '../contracts-adapter-input';\nimport type { AnyContractSpec } from '../spec';\nimport {\n hydrateResourceIfNeeded,\n parseReturns,\n} from '../contracts-adapter-hydration';\n\n/**\n * Registers all ContractSpecs from a SpecRegistry onto a Pothos SchemaBuilder.\n *\n * This adapter:\n * 1. Discovers output types from specs and registers them as Pothos object types.\n * 2. Maps `ContractSpec` inputs to Pothos input types.\n * 3. Mounts `query` specs as `Query` fields and `command` specs as `Mutation` fields.\n * 4. Wraps the resolver to:\n * - Enforce auth policies (basic check).\n * - Build a `HandlerCtx`.\n * - Execute via `SpecRegistry`.\n * - Hydrate resource references if applicable.\n *\n * @param builder - The Pothos SchemaBuilder instance.\n * @param reg - The SpecRegistry containing operations.\n * @param resources - (Optional) ResourceRegistry for hydrating resource references.\n */\nexport function registerContractsOnBuilder<T extends SchemaTypes>(\n builder: PothosSchemaTypes.SchemaBuilder<T>,\n reg: SpecRegistry,\n resources?: ResourceRegistry\n) {\n const { buildInputFieldArgs } = createInputTypeBuilder(builder);\n\n // Build a map of output types we need to register\n const outputTypeCache = new Map<string, AnySchemaModel>();\n for (const spec of reg.listSpecs()) {\n const out = spec.io.output as\n | AnySchemaModel\n | ResourceRefDescriptor<boolean>;\n if (out && 'getZod' in out && typeof out.getZod === 'function') {\n const model = out as AnySchemaModel;\n const typeName = model.config?.name ?? 'UnknownOutput';\n if (!outputTypeCache.has(typeName)) {\n outputTypeCache.set(typeName, model);\n }\n }\n }\n\n // Register all output types as GraphQL object types\n for (const [typeName, model] of outputTypeCache.entries()) {\n builder.objectType(typeName as any, {\n fields: (t) => {\n const entries = Object.entries(model.config.fields) as [\n string,\n {\n type: any;\n isOptional: boolean;\n isArray?: boolean;\n },\n ][];\n const acc: Record<string, any> = {};\n for (const [key, field] of entries) {\n const fieldType = field.type;\n let gqlType = 'JSON';\n\n // Check if it's a known scalar type\n if (fieldType && typeof fieldType.getPothos === 'function') {\n const pothosInfo = fieldType.getPothos();\n gqlType = pothosInfo.name || 'JSON';\n // Map unsecure types to their secure equivalents\n if (gqlType === 'String_unsecure') gqlType = 'String';\n if (gqlType === 'Int_unsecure') gqlType = 'Int';\n if (gqlType === 'Float_unsecure') gqlType = 'Float';\n if (gqlType === 'Boolean_unsecure') gqlType = 'Boolean';\n if (gqlType === 'ID_unsecure') gqlType = 'ID';\n }\n\n const typeRef = field.isArray\n ? ([gqlType] as never)\n : (gqlType as never);\n acc[key] = t.field({\n type: typeRef,\n nullable: field.isOptional,\n resolve: (parent: any) => parent[key],\n });\n }\n return acc as never;\n },\n });\n }\n\n // For outputs, prefer an explicit GraphQL type name; otherwise use SchemaModel name or resource ref\n function resolveGraphQLTypeName(contractSpec: AnyContractSpec): string {\n const returnsName = contractSpec.transport?.gql?.returns;\n if (returnsName) return returnsName;\n\n const out = contractSpec.io.output ?? {};\n\n // Check if it's a resource ref\n if (\n out &&\n 'kind' in out &&\n out.kind === 'resource_ref' &&\n 'graphQLType' in out &&\n out.graphQLType\n )\n return String(out.graphQLType);\n\n // Check if it's a SchemaModel with a name\n if (out && 'getZod' in out && typeof out.getZod === 'function') {\n const model = out as AnySchemaModel;\n const typeName = model.config?.name;\n if (typeName && outputTypeCache.has(typeName)) {\n return typeName;\n }\n }\n\n return 'JSON';\n }\n\n // parseReturns moved to hydration util\n\n for (const spec of reg.listSpecs()) {\n const fieldName =\n spec.transport?.gql?.field ??\n defaultGqlField(spec.meta.name, spec.meta.version);\n const returnsName = spec.transport?.gql?.returns;\n const byIdField =\n (spec.transport as unknown as { gql?: { byIdField?: string } })?.gql\n ?.byIdField ?? 'id';\n const returnsResource = (\n spec.transport as unknown as { gql?: { resource?: string } }\n )?.gql?.resource;\n const isQuery = spec.meta.kind === 'query';\n\n const graphQLTypeName = resolveGraphQLTypeName(spec);\n const returnsDecl = (\n spec.transport as unknown as { gql?: { returns?: string } }\n )?.gql?.returns;\n const parsed = parseReturns(returnsDecl ?? graphQLTypeName);\n\n const resolveFieldFn = async (_root: any, args: any, ctx: any) => {\n if (spec.policy.auth !== 'anonymous' && !ctx.user)\n throw new Error('Unauthorized');\n const handlerCtx: HandlerCtx = {\n traceId: ctx.logger?.getTraceId?.() ?? undefined,\n userId: ctx.user?.id ?? null,\n organizationId: ctx.session?.activeOrganizationId ?? null,\n actor: ctx.user ? 'user' : 'anonymous',\n channel: 'web',\n eventPublisher: ctx.eventPublisher,\n };\n const parsedInput = spec.io.input?.getZod().parse(args.input ?? {});\n const result: unknown = await reg.execute(\n spec.meta.name,\n spec.meta.version,\n parsedInput,\n handlerCtx\n );\n const out = spec.io.output as unknown;\n if (\n resources &&\n (returnsResource || (out as { kind?: string })?.kind === 'resource_ref')\n ) {\n const varName =\n byIdField ?? (out as { varName?: string })?.varName ?? 'id';\n const template =\n returnsResource ?? (out as { uriTemplate?: string })?.uriTemplate;\n const hydrated = await hydrateResourceIfNeeded(resources, result, {\n template,\n varName,\n returns: parsed,\n });\n if (hydrated !== result) return hydrated as never;\n }\n if (graphQLTypeName) {\n if (parsed.inner === 'Boolean' && !parsed.isList)\n return Boolean((result as { ok?: boolean })?.ok ?? result) as never;\n // fallback to direct\n return result as unknown as never;\n }\n const parsedOut: unknown = (spec.io.output as AnySchemaModel)\n .getZod()\n .parse(result);\n return parsedOut as never;\n };\n\n const fieldSettingsFn: QueryFieldThunk<T> | MutationFieldThunk<T> = (\n t: PothosSchemaTypes.MutationFieldBuilder<T, T['Root']>\n ) => {\n const inputType = buildInputFieldArgs(spec.io.input);\n return t.field({\n type: (parsed.isList ? [parsed.inner] : parsed.inner) as any,\n complexity: () => 10,\n resolve: resolveFieldFn as any,\n args: inputType\n ? {\n input: t.arg({\n type: inputType,\n required: true,\n }),\n }\n : undefined,\n });\n };\n\n if (isQuery) {\n builder.queryField(\n fieldName,\n fieldSettingsFn as never as QueryFieldThunk<T>\n );\n } else {\n builder.mutationField(\n fieldName,\n fieldSettingsFn as MutationFieldThunk<T>\n );\n }\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"graphql-schema-export.d.ts","names":[],"sources":["../../src/server/graphql-schema-export.ts"],"sourcesContent":[],"mappings":";;;cAKa,yCACH,yCACa"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"graphql-schema-export.js","names":["toSubgraphSDL"],"sources":["../../src/server/graphql-schema-export.ts"],"sourcesContent":["'use server';\n\nimport { GraphQLSchema, printSchema } from 'graphql';\nimport { toSubgraphSDL } from '@lssm/lib.graphql-federation';\n\nexport const exportContractsToGraphQLSchema = async (\n schema: GraphQLSchema,\n outputPathDir: string\n) => {\n const fs = await import('fs');\n const path = await import('path');\n\n const schemaString = printSchema(schema);\n const subgraphString = toSubgraphSDL(schema);\n const outputPath = path.join(outputPathDir, '../schema.graphql');\n const subgraphPath = path.join(outputPathDir, '../schema.subgraph.graphql');\n\n fs.writeFileSync(outputPath, schemaString);\n console.log(`Schema exported to ${outputPath}`);\n fs.writeFileSync(subgraphPath, subgraphString);\n console.log(`Subgraph exported to ${subgraphPath}`);\n};\n"],"mappings":"8HAKA,MAAa,EAAiC,MAC5C,EACA,IACG,CACH,IAAM,EAAK,MAAM,OAAO,MAClB,EAAO,MAAM,OAAO,QAEpB,EAAe,EAAY,EAAO,CAClC,EAAiBA,EAAc,EAAO,CACtC,EAAa,EAAK,KAAK,EAAe,oBAAoB,CAC1D,EAAe,EAAK,KAAK,EAAe,6BAA6B,CAE3E,EAAG,cAAc,EAAY,EAAa,CAC1C,QAAQ,IAAI,sBAAsB,IAAa,CAC/C,EAAG,cAAc,EAAc,EAAe,CAC9C,QAAQ,IAAI,wBAAwB,IAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider-mcp.d.ts","names":[],"sources":["../../src/server/provider-mcp.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;;AA6CA;;;;;;;;;;;;;;;;;iBAAgB,eAAA,SACN,gBACH,yBACM,2BACF;;iBAGQ;;;;;;;;;;;;;;kBAcC;;oBAEE;IACnB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"provider-mcp.js","names":["z"],"sources":["../../src/server/provider-mcp.ts"],"sourcesContent":["import {\n McpServer,\n ResourceTemplate,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport type { SpecRegistry } from '../registry';\nimport type { ResourceRegistry } from '../resources';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { ContractSpec } from '../spec';\nimport type { PresentationRegistry } from '../presentations';\nimport { jsonSchemaForPresentation } from '../presentations';\nimport {\n createDefaultTransformEngine,\n type PresentationDescriptorV2,\n registerBasicValidation,\n registerDefaultReactRenderer,\n} from '../presentations.v2';\nimport type { PromptRegistry } from '../promptRegistry';\nimport type { HandlerCtx } from '../types';\nimport { defaultMcpTool, jsonSchemaForSpec } from '../jsonschema';\nimport type {\n CallToolResult,\n GetPromptResult,\n} from '@modelcontextprotocol/sdk/types.js';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport z from 'zod';\n\n/**\n * Creates a unified Model Context Protocol (MCP) server exposing operations, resources, and prompts.\n *\n * This function takes registries for operations, resources, and prompts, and exposes them as\n * MCP Tools, Resources, and Prompts respectively. It enables AI agents to discover and interact\n * with the application's capabilities.\n *\n * Features:\n * - **Tools**: Exposes `command` operations as executable tools.\n * - **Resources**: Exposes `ResourceRegistry` entries and `PresentationSpec`s (Markdown/JSON) as read-only resources.\n * - **Prompts**: Exposes `PromptRegistry` entries as templated prompts.\n *\n * @param server - The `McpServer` instance to populate.\n * @param ops - Registry containing operations (tools).\n * @param resources - Registry containing data resources.\n * @param prompts - Registry containing prompt templates.\n * @param ctxFactories - Factories to create context for tools, resources, and prompts execution.\n * @returns The populated `McpServer` instance.\n */\nexport function createMcpServer(\n server: McpServer,\n ops: SpecRegistry,\n resources: ResourceRegistry,\n prompts: PromptRegistry,\n ctxFactories: {\n /** Factory for tool execution context (e.g., system actor) */\n toolCtx: () => HandlerCtx;\n /** Factory for prompt rendering context */\n promptCtx: () => {\n userId?: string | null;\n orgId?: string | null;\n locale?: string;\n };\n /** Factory for resource resolution context */\n resourceCtx: () => {\n userId?: string | null;\n orgId?: string | null;\n locale?: string;\n };\n /** Optional registry for V1 presentations */\n presentations?: PresentationRegistry;\n /** Optional list of V2 presentation descriptors */\n presentationsV2?: PresentationDescriptorV2[];\n }\n) {\n /* ---------- Tools (commands) ---------- */\n for (const spec of ops.listSpecs()) {\n if (spec.meta.kind !== 'command') continue; // expose only commands as tools\n const { input } = jsonSchemaForSpec(\n spec as unknown as ContractSpec<AnySchemaModel, AnySchemaModel>\n );\n const toolName =\n spec.transport?.mcp?.toolName ??\n defaultMcpTool(spec.meta.name, spec.meta.version);\n\n server.registerTool(\n toolName,\n {\n // name: toolName,\n description: spec.meta.description,\n inputSchema: input as any,\n },\n async (args: any, _req: any): Promise<CallToolResult> => {\n const result = await ops.execute(\n spec.meta.name,\n spec.meta.version,\n args ?? {},\n ctxFactories.toolCtx()\n );\n // return { content: [{ type: 'json', json: result }] };\n return {\n content: [{ type: 'text', text: JSON.stringify(result, null, 4) }],\n };\n }\n );\n }\n\n /* ---------- Resources (queries/views) ---------- */\n for (const resource of resources.listTemplates()) {\n // server.registerPrompt(\n // 'review-code',\n // {\n // title: 'Code Review',\n // description: 'Review code for best practices and potential issues',\n // argsSchema: { code: z.string() as any },\n // },\n // ({ code }: { code?: string }) => ({\n // messages: [\n // {\n // role: 'user',\n // content: {\n // type: 'text',\n // text: `Please review this code:\\n\\n${code}`,\n // },\n // },\n // ],\n // })\n // );\n\n (server as any).registerResource(\n resource.meta.uriTemplate.split(':')[0]!,\n new ResourceTemplate(resource.meta.uriTemplate, {} as any),\n {\n // name: resource.meta.title,\n description: resource.meta.description,\n inputSchema: zodToJsonSchema(resource.input, {\n // metadata: `${op.meta.name}.input.v${op.meta.version}`,\n }),\n },\n async (_uri: any, args: any, _req: any) => {\n const ctx = ctxFactories.resourceCtx();\n const out = await resource.resolve(args, ctx);\n if (typeof out.data === 'string') {\n return {\n contents: [\n {\n uri: out.uri,\n mimeType: out.mimeType ?? resource.meta.mimeType,\n text: out.data,\n },\n ],\n };\n }\n return {\n contents: [\n {\n uri: out.uri,\n mimeType: out.mimeType ?? resource.meta.mimeType,\n blob: out.data.toString(),\n },\n ],\n };\n }\n );\n }\n\n /* ---------- Presentations as resources (markdown/data) with content negotiation ---------- */\n const __presentations = ctxFactories.presentations;\n const __presentationsV2 = ctxFactories.presentationsV2;\n if (__presentations) {\n const engine = registerBasicValidation(\n registerDefaultReactRenderer(createDefaultTransformEngine())\n );\n for (const p of __presentations.list()) {\n const baseKey = `presentation.${p.meta.name.replace(/\\./g, '_')}.v${p.meta.version}`;\n const baseUri = `presentation://${p.meta.name}/v${p.meta.version}`;\n\n // Generic metadata\n (server as any).registerResource(\n baseKey,\n new ResourceTemplate(baseUri, {} as any),\n {\n description: p.meta.description ?? 'Presentation',\n inputSchema: z.toJSONSchema(z.object({})),\n },\n async (_uri: any, _args: any, _req: any) => {\n if (p.content.kind === 'markdown') {\n const text = p.content.content\n ? p.content.content\n : `See resource: ${p.content.resourceUri ?? ''}`;\n return {\n contents: [\n {\n uri: baseUri,\n mimeType: 'text/markdown',\n text,\n },\n ],\n };\n }\n if (p.content.kind === 'data') {\n const schema = jsonSchemaForPresentation(p);\n return {\n contents: [\n {\n uri: baseUri,\n mimeType: 'application/json',\n text: JSON.stringify(schema, null, 2),\n },\n ],\n };\n }\n // web_component: metadata only for now\n const metaOnly = {\n name: p.meta.name,\n version: p.meta.version,\n kind: p.content.kind,\n description: p.meta.description ?? '',\n };\n return {\n contents: [\n {\n uri: baseUri,\n mimeType: 'application/json',\n text: JSON.stringify(metaOnly, null, 2),\n },\n ],\n };\n }\n );\n\n // Negotiated variants\n const variants: {\n ext: string;\n target: 'markdown' | 'application/json' | 'application/xml';\n }[] = [\n { ext: '.md', target: 'markdown' },\n { ext: '.json', target: 'application/json' },\n { ext: '.xml', target: 'application/xml' },\n ];\n for (const v of variants) {\n const key = `${baseKey}${v.ext}`;\n const uri = `${baseUri}${v.ext}`;\n (server as any).registerResource(\n key,\n new ResourceTemplate(uri, {} as any),\n {\n description: `${p.meta.description ?? 'Presentation'} (${v.ext})`,\n inputSchema: z.toJSONSchema(z.object({})),\n },\n async () => {\n // Use V2 engine to render a normalized JSON snapshot; if p is V1, fallback to jsonSchemaForPresentation\n if (p.content.kind === 'markdown' && v.target === 'markdown') {\n const text =\n p.content.content ??\n `See resource: ${p.content.resourceUri ?? ''}`;\n return { contents: [{ uri, mimeType: 'text/markdown', text }] };\n }\n if (p.content.kind === 'data' && v.target === 'application/json') {\n return {\n contents: [\n {\n uri,\n mimeType: 'application/json',\n text: JSON.stringify(jsonSchemaForPresentation(p), null, 2),\n },\n ],\n };\n }\n // Default: represent as JSON snapshot\n const jsonText = JSON.stringify(\n { meta: p.meta, content: p.content },\n null,\n 2\n );\n if (v.target === 'application/json') {\n return {\n contents: [\n { uri, mimeType: 'application/json', text: jsonText },\n ],\n };\n }\n if (v.target === 'application/xml') {\n const xml = `<presentation name=\"${p.meta.name}\" version=\"${p.meta.version}\"><json>${encodeURIComponent(jsonText)}</json></presentation>`;\n return {\n contents: [{ uri, mimeType: 'application/xml', text: xml }],\n };\n }\n // markdown fallback\n return {\n contents: [\n {\n uri,\n mimeType: 'text/markdown',\n text: 'Unsupported presentation for markdown',\n },\n ],\n };\n }\n );\n }\n }\n }\n\n // V2: register descriptors using transform engine (same scheme/negotiation)\n if (__presentationsV2 && __presentationsV2.length) {\n const engine = registerBasicValidation(\n registerDefaultReactRenderer(createDefaultTransformEngine())\n );\n for (const d of __presentationsV2) {\n const baseKey = `presentation.${d.meta.name.replace(/\\./g, '_')}.v${d.meta.version}`;\n const baseUri = `presentation://${d.meta.name}/v${d.meta.version}`;\n\n (server as any).registerResource(\n baseKey,\n new ResourceTemplate(baseUri, {} as any),\n {\n description: d.meta.description ?? 'Presentation',\n inputSchema: z.toJSONSchema(z.object({})),\n },\n async () => {\n const jsonText = JSON.stringify(\n { meta: d.meta, source: d.source, targets: d.targets },\n null,\n 2\n );\n return {\n contents: [\n { uri: baseUri, mimeType: 'application/json', text: jsonText },\n ],\n };\n }\n );\n\n const variants: {\n ext: string;\n target: 'markdown' | 'application/json' | 'application/xml';\n }[] = [\n { ext: '.md', target: 'markdown' },\n { ext: '.json', target: 'application/json' },\n { ext: '.xml', target: 'application/xml' },\n ];\n for (const v of variants) {\n const key = `${baseKey}${v.ext}`;\n const uri = `${baseUri}${v.ext}`;\n (server as any).registerResource(\n key,\n new ResourceTemplate(uri, {} as any),\n {\n description: `${d.meta.description ?? 'Presentation'} (${v.ext})`,\n inputSchema: z.toJSONSchema(z.object({})),\n },\n async () => {\n const out = await engine.render(v.target, d);\n return {\n contents: [\n {\n uri,\n mimeType:\n (out as any).mimeType ??\n (v.target === 'markdown' ? 'text/markdown' : v.target),\n text: (out as any).body ?? String(out),\n },\n ],\n };\n }\n );\n }\n }\n }\n\n /* ---------- Prompts ---------- */\n // for (const prompt of prompts.list()) {\n for (const prompt of prompts.list()) {\n server.registerPrompt(\n prompt.meta.name,\n {\n title: prompt.meta.title,\n description: prompt.meta.title,\n argsSchema: zodToJsonSchema(prompt.input) as any,\n },\n async (args: any, _extra: any): Promise<GetPromptResult> => {\n const link = (tpl: string, vars: Record<string, string | number>) => {\n let out = tpl;\n for (const [k, v] of Object.entries(vars))\n out = out.replace(\n new RegExp(`\\\\{${k}\\\\}`, 'g'),\n encodeURIComponent(String(v))\n );\n return out;\n };\n\n const parts = await prompt.render(prompt.input.parse(args), {\n ...ctxFactories.promptCtx(),\n link,\n });\n\n // MCP prompt shape: messages[{role, content[]}]; we return a single \"system\" text chunk + referenced resources\n const contents: GetPromptResult['messages'][number]['content'][] =\n parts.map(\n (p) =>\n p.type === 'text'\n ? { type: 'text', text: p.text }\n : {\n type: 'text',\n text: `See resource: ${p.title ?? p.uri}\\nURI: ${p.uri}`,\n } // simple way to reference; clients may fetch resources directly\n );\n\n return {\n messages: [{ role: 'assistant', content: contents[0]! }],\n description: prompt.meta.description,\n };\n }\n );\n }\n\n return server;\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-elysia.d.ts","names":[],"sources":["../../src/server/rest-elysia.ts"],"sourcesContent":[],"mappings":";;;;;;;iBAMgB,YAAA,MACT,aACA;EAFS,OAAA,EAGa,OAHD;EACrB,KAAA,EAAA,GAAA;CACA,EAAA,GACgD,UADhD,EAAA,OAAA,CAAA,EAEK,WAFL,CAAA,EAEgB,MAFhB,CAAA,EAAA,EAAA;EACsB,SAAA,EAAA,CAAA,CAAA;EAA0B,KAAA,EAAA,CAAA,CAAA;EAC3C,MAAA,EAAA,CAAA,CAAA;EAAW,OAAA,EAAA,CAAA,CAAA;CAAA,EAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-elysia.js","names":[],"sources":["../../src/server/rest-elysia.ts"],"sourcesContent":["import type { Elysia } from 'elysia';\nimport { createFetchHandler, type RestOptions } from './rest-generic';\nimport type { SpecRegistry } from '../registry';\nimport type { HandlerCtx } from '../types';\n\n/** Mount routes on an Elysia instance */\nexport function elysiaPlugin(\n app: Elysia,\n reg: SpecRegistry,\n ctxFactory: (c: { request: Request; store: any }) => HandlerCtx,\n options?: RestOptions\n) {\n const handler = createFetchHandler(\n reg,\n (req) => ctxFactory({ request: req, store: (app as any).store }),\n options\n );\n\n for (const spec of reg.listSpecs()) {\n const method =\n spec.transport?.rest?.method ??\n (spec.meta.kind === 'query' ? 'GET' : 'POST');\n const path =\n (options?.basePath ?? '') +\n (spec.transport?.rest?.path ??\n `/${spec.meta.name.replace(/\\./g, '/')}/v${spec.meta.version}`);\n app[method.toLowerCase() as 'get' | 'post'](path, ({ request }: any) =>\n handler(request)\n );\n }\n\n if (options?.cors) {\n app.options('*', ({ request }: any) => handler(request));\n }\n\n return app;\n}\n"],"mappings":"uDAMA,SAAgB,EACd,EACA,EACA,EACA,EACA,CACA,IAAM,EAAU,EACd,EACC,GAAQ,EAAW,CAAE,QAAS,EAAK,MAAQ,EAAY,MAAO,CAAC,CAChE,EACD,CAED,IAAK,IAAM,KAAQ,EAAI,WAAW,CAAE,CAClC,IAAM,EACJ,EAAK,WAAW,MAAM,SACrB,EAAK,KAAK,OAAS,QAAU,MAAQ,QAClC,GACH,GAAS,UAAY,KACrB,EAAK,WAAW,MAAM,MACrB,IAAI,EAAK,KAAK,KAAK,QAAQ,MAAO,IAAI,CAAC,IAAI,EAAK,KAAK,WACzD,EAAI,EAAO,aAAa,EAAoB,GAAO,CAAE,aACnD,EAAQ,EAAQ,CACjB,CAOH,OAJI,GAAS,MACX,EAAI,QAAQ,KAAM,CAAE,aAAmB,EAAQ,EAAQ,CAAC,CAGnD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-express.d.ts","names":[],"sources":["../../src/server/rest-express.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAaA;;AAEO,iBAFS,aAAA,CAET,OAAA,EAAA;EACa,MAAA,EAAA,GAAA,GAFO,MAEP;CAAe,EAAA,GAAA,EAD5B,YAC4B,EAAA,UAAA,EAAA,CAAA,GAAA,EAAf,OAAe,EAAA,GAAA,UAAA,EAAA,OAAA,CAAA,EACvB,WADuB,CAAA,EAEhC,MAFgC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-express.js","names":[],"sources":["../../src/server/rest-express.ts"],"sourcesContent":["import type {\n Request as ExpressReq,\n Response as ExpressRes,\n Router,\n} from 'express';\nimport { createFetchHandler, type RestOptions } from './rest-generic';\nimport type { SpecRegistry } from '../registry';\nimport type { HandlerCtx } from '../types';\n\n/**\n * Build an Express Router that proxies to the Fetch-style handler.\n * You can mount it at any base path; pass the same basePath in options.\n */\nexport function expressRouter(\n express: { Router: () => Router },\n reg: SpecRegistry,\n ctxFactory: (req: ExpressReq) => HandlerCtx,\n options?: RestOptions\n): Router {\n const router = express.Router();\n const fetchHandler = createFetchHandler(\n reg,\n (_r) => {\n // Convert Fetch Request headers -> Express req is provided below\n // We pass the Express req directly via closure\n throw new Error('ctxFactory must be called from route'); // placeholder\n },\n options\n );\n\n // For each spec, create a concrete route so Express can match quickly\n for (const spec of reg.listSpecs()) {\n const method =\n spec.transport?.rest?.method ??\n (spec.meta.kind === 'query' ? 'GET' : 'POST');\n const path =\n (options?.basePath ?? '') +\n (spec.transport?.rest?.path ??\n `/${spec.meta.name.replace(/\\./g, '/')}/v${spec.meta.version}`);\n\n router[method.toLowerCase() as 'get' | 'post'](\n path,\n async (req: ExpressReq, res: ExpressRes) => {\n const url = new URL(\n `${req.protocol}://${req.get('host')}${req.originalUrl}`\n );\n const request = new Request(url.toString(), {\n method,\n headers: Object.fromEntries(\n Object.entries(req.headers).map(([k, v]) => [k, String(v)])\n ),\n body: method === 'POST' ? JSON.stringify(req.body ?? {}) : undefined,\n });\n\n const handler = createFetchHandler(reg, () => ctxFactory(req), options);\n const response = await handler(request);\n\n res.status(response.status);\n response.headers.forEach((v, k) => res.setHeader(k, v));\n const text = await response.text();\n res.send(text);\n }\n );\n }\n\n // Generic OPTIONS for CORS (if enabled)\n if (options?.cors) {\n router.options('*', (_req, res) => {\n const h = new Headers();\n const resp = new Response(null, { status: 204 });\n resp.headers.forEach((v, k) => h.set(k, v));\n res.status(204).send();\n });\n }\n\n return router;\n}\n"],"mappings":"uDAaA,SAAgB,EACd,EACA,EACA,EACA,EACQ,CACR,IAAM,EAAS,EAAQ,QAAQ,CACV,EACnB,EACC,GAAO,CAGN,MAAU,MAAM,uCAAuC,EAEzD,EACD,CAGD,IAAK,IAAM,KAAQ,EAAI,WAAW,CAAE,CAClC,IAAM,EACJ,EAAK,WAAW,MAAM,SACrB,EAAK,KAAK,OAAS,QAAU,MAAQ,QAClC,GACH,GAAS,UAAY,KACrB,EAAK,WAAW,MAAM,MACrB,IAAI,EAAK,KAAK,KAAK,QAAQ,MAAO,IAAI,CAAC,IAAI,EAAK,KAAK,WAEzD,EAAO,EAAO,aAAa,EACzB,EACA,MAAO,EAAiB,IAAoB,CAC1C,IAAM,EAAM,IAAI,IACd,GAAG,EAAI,SAAS,KAAK,EAAI,IAAI,OAAO,GAAG,EAAI,cAC5C,CACK,EAAU,IAAI,QAAQ,EAAI,UAAU,CAAE,CAC1C,SACA,QAAS,OAAO,YACd,OAAO,QAAQ,EAAI,QAAQ,CAAC,KAAK,CAAC,EAAG,KAAO,CAAC,EAAG,OAAO,EAAE,CAAC,CAAC,CAC5D,CACD,KAAM,IAAW,OAAS,KAAK,UAAU,EAAI,MAAQ,EAAE,CAAC,CAAG,IAAA,GAC5D,CAAC,CAGI,EAAW,MADD,EAAmB,MAAW,EAAW,EAAI,CAAE,EAAQ,CACxC,EAAQ,CAEvC,EAAI,OAAO,EAAS,OAAO,CAC3B,EAAS,QAAQ,SAAS,EAAG,IAAM,EAAI,UAAU,EAAG,EAAE,CAAC,CACvD,IAAM,EAAO,MAAM,EAAS,MAAM,CAClC,EAAI,KAAK,EAAK,EAEjB,CAaH,OATI,GAAS,MACX,EAAO,QAAQ,KAAM,EAAM,IAAQ,CACjC,IAAM,EAAI,IAAI,QACD,IAAI,SAAS,KAAM,CAAE,OAAQ,IAAK,CAAC,CAC3C,QAAQ,SAAS,EAAG,IAAM,EAAE,IAAI,EAAG,EAAE,CAAC,CAC3C,EAAI,OAAO,IAAI,CAAC,MAAM,EACtB,CAGG"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-generic.d.ts","names":[],"sources":["../../src/server/rest-generic.ts"],"sourcesContent":[],"mappings":";;;;UAIiB,WAAA;;EAAA,QAAA,CAAA,EAAA,MAAW;EAsDZ;EACT,IAAA,CAAA,EAAA,OAAA,GAAA;IACa,MAAA,CAAA,EAAA,MAAA,GAAA,GAAA;IAAY,OAAA,CAAA,EAAA,MAAA,EAAA;IACpB,OAAA,CAAA,EAAA,MAAA,EAAA;IAiDwB,WAAA,CAAA,EAAA,OAAA;IAAkB,MAAA,CAAA,EAAA,MAAA;EAAR,CAAA;EAAO;;;;;;;;;;;;;;iBApDrC,kBAAA,MACT,gCACa,YAAY,sBACpB,oBAiDwB,YAAU,QAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-generic.js","names":["h: Record<string, string>","opts: Required<Omit<RestOptions, 'onError'>> &\n Pick<RestOptions, 'onError'>","routes: Route[]","base: HeadersInit","headers: HeadersInit","input: any","obj: Record<string, any>","err: any","headers"],"sources":["../../src/server/rest-generic.ts"],"sourcesContent":["import { defaultRestPath } from '../jsonschema';\nimport type { SpecRegistry } from '../registry';\nimport type { HandlerCtx } from '../types';\n\nexport interface RestOptions {\n /** Prefix all routes, e.g. \"/api\" */\n basePath?: string;\n /** If true, handle OPTIONS and set CORS headers */\n cors?:\n | boolean\n | {\n origin?: string | '*';\n methods?: string[];\n headers?: string[];\n credentials?: boolean;\n maxAge?: number;\n };\n /** JSON spacing in responses (dev only ideally) */\n prettyJson?: number | false;\n /** Map thrown errors to {status, body} */\n onError?: (err: unknown) => { status: number; body: any };\n}\n\n/** Minimal WHATWG Response polyfill util for Node < 18 (if needed) */\n// export const toResponse = (status: number, data: any, headers?: HeadersInit) =>\n// new Response(JSON.stringify(data), { status, headers: { \"content-type\": \"application/json; charset=utf-8\", ...(headers || {}) } });\n\nfunction corsHeaders(opt: NonNullable<RestOptions['cors']>) {\n const h: Record<string, string> = {};\n const origin = typeof opt === 'object' ? (opt.origin ?? '*') : '*';\n h['access-control-allow-origin'] = origin as string;\n h['vary'] = 'Origin';\n if (typeof opt === 'object') {\n if (opt.methods) h['access-control-allow-methods'] = opt.methods.join(', ');\n if (opt.headers) h['access-control-allow-headers'] = opt.headers.join(', ');\n if (opt.credentials) h['access-control-allow-credentials'] = 'true';\n if (typeof opt.maxAge === 'number')\n h['access-control-max-age'] = String(opt.maxAge);\n } else {\n h['access-control-allow-methods'] = 'GET,POST,OPTIONS';\n h['access-control-allow-headers'] =\n 'content-type,x-idempotency-key,x-trace-id';\n }\n return h;\n}\n\nfunction joinPath(a: string | undefined, b: string) {\n const left = (a ?? '').replace(/\\/+$/g, '');\n const right = b.replace(/^\\/+/g, '');\n return `${left}/${right}`.replace(/\\/{2,}/g, '/');\n}\n\n/**\n * Build a single Fetch-style handler: (req) => Response\n * - Discovers routes from SpecRegistry\n * - Validates with zod via registry.execute()\n * - Handles CORS (optional)\n */\nexport function createFetchHandler(\n reg: SpecRegistry,\n ctxFactory: (req: Request) => HandlerCtx,\n options?: RestOptions\n) {\n const opts: Required<Omit<RestOptions, 'onError'>> &\n Pick<RestOptions, 'onError'> = {\n basePath: options?.basePath ?? '',\n cors: options?.cors ?? false,\n prettyJson: options?.prettyJson ?? false,\n onError: options?.onError,\n };\n\n interface Route {\n method: 'GET' | 'POST';\n path: string; // absolute path including basePath\n name: string;\n version: number;\n }\n\n const routes: Route[] = reg.listSpecs().map((spec) => ({\n method: (spec.transport?.rest?.method ??\n (spec.meta.kind === 'query' ? 'GET' : 'POST')) as 'GET' | 'POST',\n path: joinPath(\n opts.basePath,\n spec.transport?.rest?.path ??\n defaultRestPath(spec.meta.name, spec.meta.version)\n ),\n name: spec.meta.name,\n version: spec.meta.version,\n }));\n\n const routeTable = new Map<string, Route>(); // KEY: METHOD + \" \" + PATH\n for (const r of routes) routeTable.set(`${r.method} ${r.path}`, r);\n\n const allowHeader = Array.from(new Set(routes.map((r) => r.method))).join(\n ', '\n );\n\n const makeJson = (status: number, data: any, extraHeaders?: HeadersInit) => {\n const body = opts.prettyJson\n ? JSON.stringify(data, null, opts.prettyJson)\n : JSON.stringify(data);\n const base: HeadersInit = {\n 'content-type': 'application/json; charset=utf-8',\n };\n return new Response(body, {\n status,\n headers: extraHeaders ? { ...base, ...extraHeaders } : base,\n });\n };\n\n return async function handle(req: Request): Promise<Response> {\n const url = new URL(req.url);\n const key = `${req.method.toUpperCase()} ${url.pathname}`;\n\n // CORS preflight\n if (opts.cors && req.method.toUpperCase() === 'OPTIONS') {\n const h = corsHeaders(opts.cors === true ? {} : opts.cors);\n return new Response(null, {\n status: 204,\n headers: { ...h, 'content-length': '0' },\n });\n }\n\n const route = routeTable.get(key);\n if (!route) {\n const headers: HeadersInit = {};\n if (opts.cors)\n Object.assign(\n headers,\n corsHeaders(opts.cors === true ? {} : opts.cors)\n );\n return makeJson(404, { error: 'NotFound', path: url.pathname }, headers);\n }\n\n try {\n let input: any = {};\n if (route.method === 'GET') {\n // Support either flattened query (?a=1&b=x) or ?input=<json>\n if (url.searchParams.has('input')) {\n const raw = url.searchParams.get('input')!;\n input = raw ? JSON.parse(raw) : {};\n } else {\n const obj: Record<string, any> = {};\n for (const [k, v] of url.searchParams.entries()) obj[k] = v;\n input = obj;\n }\n } else {\n const contentType = req.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n input = await req.json();\n } else if (contentType.includes('application/x-www-form-urlencoded')) {\n const form = (await req.formData()) as never as FormData;\n input = Object.fromEntries(form.entries());\n } else if (!contentType) {\n input = {};\n } else {\n return makeJson(415, { error: 'UnsupportedMediaType', contentType });\n }\n }\n\n const ctx = ctxFactory(req);\n const result = await reg.execute(route.name, route.version, input, ctx);\n\n const headers: HeadersInit = {};\n if (opts.cors)\n Object.assign(\n headers,\n corsHeaders(opts.cors === true ? {} : opts.cors)\n );\n return makeJson(200, result, headers);\n } catch (err: any) {\n if (opts.onError) {\n const mapped = opts.onError(err);\n const headers: HeadersInit = {};\n if (opts.cors)\n Object.assign(\n headers,\n corsHeaders(opts.cors === true ? {} : opts.cors)\n );\n return makeJson(mapped.status, mapped.body, headers);\n }\n const headers: HeadersInit = {};\n if (opts.cors)\n Object.assign(\n headers,\n corsHeaders(opts.cors === true ? {} : opts.cors)\n );\n // Basic zod hint\n if (err?.issues)\n return makeJson(\n 400,\n { error: 'ValidationError', issues: err.issues },\n headers\n );\n if (\n typeof err?.message === 'string' &&\n err.message.startsWith('PolicyDenied')\n ) {\n return makeJson(403, { error: 'PolicyDenied' }, headers);\n }\n return makeJson(500, { error: 'InternalError' }, headers);\n }\n };\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-next-app.d.ts","names":[],"sources":["../../src/server/rest-next-app.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA8BA;;;;;;;;;;;;;;;;;;;;;;;;iBAAgB,kBAAA,MACT,gCACa,YAAY,sBACpB,oBAGgC,YAAO,QAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-next-app.js","names":[],"sources":["../../src/server/rest-next-app.ts"],"sourcesContent":["import { createFetchHandler, type RestOptions } from './rest-generic';\nimport type { SpecRegistry } from '../registry';\nimport type { HandlerCtx } from '../types';\n\n/**\n * Creates a Next.js App Router route handler for ContractSpec operations.\n *\n * This function returns a handler suitable for `export const { GET, POST }` in a `route.ts` file.\n * It handles:\n * - Path parsing to determine the operation name and version.\n * - Body parsing (JSON).\n * - Context creation via `ctxFactory`.\n * - Execution via `SpecRegistry`.\n * - Response formatting (JSON success/error).\n *\n * @param reg - The SpecRegistry containing the operations.\n * @param ctxFactory - A factory function to build the `HandlerCtx` (e.g., auth, tenant) from the request.\n * @param options - Optional configuration for the REST handler.\n * @returns A function `(req: Request) => Promise<Response>`.\n *\n * @example\n * ```ts\n * // app/api/[...route]/route.ts\n * import { makeNextAppHandler } from '@lssm/lib.contracts/server/rest-next-app';\n * import { registry } from '@/lib/registry';\n *\n * const handler = makeNextAppHandler(registry, (req) => ({ actor: 'anonymous' }));\n * export { handler as GET, handler as POST };\n * ```\n */\nexport function makeNextAppHandler(\n reg: SpecRegistry,\n ctxFactory: (req: Request) => HandlerCtx,\n options?: RestOptions\n) {\n const handler = createFetchHandler(reg, ctxFactory, options);\n return async function requestHandler(req: Request) {\n return handler(req);\n };\n}\n"],"mappings":"uDA8BA,SAAgB,EACd,EACA,EACA,EACA,CACA,IAAM,EAAU,EAAmB,EAAK,EAAY,EAAQ,CAC5D,OAAO,eAA8B,EAAc,CACjD,OAAO,EAAQ,EAAI"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-next-mcp.d.ts","names":[],"sources":["../../src/server/rest-next-mcp.ts"],"sourcesContent":[],"mappings":";;;;iBAYgB,6BAAA,MACT,gCACa;;EAFJ,IAAA,EAAA,CAAA,OAAA,SAAA,EAAA,UAA6B,SAAA,CAAA;EACtC,MAAA,EAAA,CAAA,OAAA,SAAA,EAAA,UAAA,SAAA,CAAA;CACa"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-next-mcp.js","names":[],"sources":["../../src/server/rest-next-mcp.ts"],"sourcesContent":["import type { SpecRegistry } from '../registry';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { ContractSpec } from '../spec';\nimport type { HandlerCtx } from '../types';\nimport { createMcpHandler } from 'mcp-handler';\nimport type {\n ReadResourceTemplateCallback,\n ToolCallback,\n} from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { defaultMcpTool, jsonSchemaForSpec } from '../jsonschema';\n\nexport function makeNextMcpServerFromRegistry(\n reg: SpecRegistry,\n ctxFactory: () => HandlerCtx\n) {\n const handler = createMcpHandler(\n (server) => {\n for (const spec of reg.listSpecs()) {\n const { input, output, meta } = jsonSchemaForSpec(\n spec as unknown as ContractSpec<AnySchemaModel, AnySchemaModel>\n );\n\n if (meta.kind === 'query') {\n const resourceName =\n spec.transport?.mcp?.toolName ??\n defaultMcpTool(spec.meta.name, spec.meta.version);\n\n (server as any).registerResource(\n resourceName,\n new ResourceTemplate('users://{userId}/profile', {\n list: undefined,\n }),\n {\n // name: resourceName,\n description: spec.meta.description,\n inputSchema: input,\n },\n (async (uri: URL, args, _req) => {\n const result = await reg.execute(\n spec.meta.name,\n spec.meta.version,\n args ?? {},\n ctxFactory()\n );\n // return { content: [{ type: 'json', json: result }] };\n return { contents: [{ uri: uri.href, text: String(result) }] };\n }) as ReadResourceTemplateCallback\n );\n } else if (meta.kind === 'command') {\n const toolName =\n spec.transport?.mcp?.toolName ??\n defaultMcpTool(spec.meta.name, spec.meta.version);\n\n server.registerTool(\n toolName,\n {\n // name: toolName,\n description: spec.meta.description,\n inputSchema: input as any,\n },\n (async (args: any, _req: any) => {\n const result = await reg.execute(\n spec.meta.name,\n spec.meta.version,\n args ?? {},\n ctxFactory()\n );\n // return { content: [{ type: 'json', json: result }] };\n return { content: [{ type: 'text', text: String(result) }] };\n }) as ToolCallback\n );\n } else {\n throw new Error(`Unsupported kind: ${meta.kind}`);\n }\n }\n },\n {},\n { basePath: '/api' }\n );\n\n return { GET: handler, POST: handler, DELETE: handler };\n}\n"],"mappings":"mMAYA,SAAgB,EACd,EACA,EACA,CACA,IAAM,EAAU,EACb,GAAW,CACV,IAAK,IAAM,KAAQ,EAAI,WAAW,CAAE,CAClC,GAAM,CAAE,QAAO,SAAQ,QAAS,EAC9B,EACD,CAED,GAAI,EAAK,OAAS,QAAS,CACzB,IAAM,EACJ,EAAK,WAAW,KAAK,UACrB,EAAe,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CAElD,EAAe,iBACd,EACA,IAAI,EAAiB,2BAA4B,CAC/C,KAAM,IAAA,GACP,CAAC,CACF,CAEE,YAAa,EAAK,KAAK,YACvB,YAAa,EACd,EACA,MAAO,EAAU,EAAM,IAAS,CAC/B,IAAM,EAAS,MAAM,EAAI,QACvB,EAAK,KAAK,KACV,EAAK,KAAK,QACV,GAAQ,EAAE,CACV,GAAY,CACb,CAED,MAAO,CAAE,SAAU,CAAC,CAAE,IAAK,EAAI,KAAM,KAAM,OAAO,EAAO,CAAE,CAAC,CAAE,GAEjE,SACQ,EAAK,OAAS,UAAW,CAClC,IAAM,EACJ,EAAK,WAAW,KAAK,UACrB,EAAe,EAAK,KAAK,KAAM,EAAK,KAAK,QAAQ,CAEnD,EAAO,aACL,EACA,CAEE,YAAa,EAAK,KAAK,YACvB,YAAa,EACd,EACA,MAAO,EAAW,IAAc,CAC/B,IAAM,EAAS,MAAM,EAAI,QACvB,EAAK,KAAK,KACV,EAAK,KAAK,QACV,GAAQ,EAAE,CACV,GAAY,CACb,CAED,MAAO,CAAE,QAAS,CAAC,CAAE,KAAM,OAAQ,KAAM,OAAO,EAAO,CAAE,CAAC,CAAE,GAE/D,MAED,MAAU,MAAM,qBAAqB,EAAK,OAAO,GAIvD,EAAE,CACF,CAAE,SAAU,OAAQ,CACrB,CAED,MAAO,CAAE,IAAK,EAAS,KAAM,EAAS,OAAQ,EAAS"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-next-pages.d.ts","names":[],"sources":["../../src/server/rest-next-pages.ts"],"sourcesContent":[],"mappings":";;;;;;iBAKgB,oBAAA,MACT,gCACa,mBAAmB,sBAC3B,oBAUyB,qBAAqB,oBAAe"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"rest-next-pages.js","names":[],"sources":["../../src/server/rest-next-pages.ts"],"sourcesContent":["import type { NextApiRequest, NextApiResponse } from 'next';\nimport { createFetchHandler, type RestOptions } from './rest-generic';\nimport type { SpecRegistry } from '../registry';\nimport type { HandlerCtx } from '../types';\n\nexport function makeNextPagesHandler(\n reg: SpecRegistry,\n ctxFactory: (req: NextApiRequest) => HandlerCtx,\n options?: RestOptions\n) {\n const fetchHandler = createFetchHandler(\n reg,\n (_req: Request) => {\n throw new Error('Use per-request wrapper'); // we wrap below\n },\n options\n );\n\n return async function handler(req: NextApiRequest, res: NextApiResponse) {\n const url = `${req.headers['x-forwarded-proto'] ?? 'http'}://${req.headers.host}${req.url}`;\n const method = req.method?.toUpperCase() || 'GET';\n\n const request = new Request(url, {\n method,\n headers: Object.fromEntries(\n Object.entries(req.headers).map(([k, v]) => [k, String(v)])\n ),\n body: method === 'POST' ? JSON.stringify(req.body ?? {}) : undefined,\n });\n\n const perReqHandler = createFetchHandler(\n reg,\n () => ctxFactory(req),\n options\n );\n const response = await perReqHandler(request);\n\n res.status(response.status);\n response.headers.forEach((v, k) => res.setHeader(k, v));\n const text = await response.text();\n res.send(text);\n };\n}\n"],"mappings":"uDAKA,SAAgB,EACd,EACA,EACA,EACA,CASA,OARqB,EACnB,EACC,GAAkB,CACjB,MAAU,MAAM,0BAA0B,EAE5C,EACD,CAEM,eAAuB,EAAqB,EAAsB,CACvE,IAAM,EAAM,GAAG,EAAI,QAAQ,sBAAwB,OAAO,KAAK,EAAI,QAAQ,OAAO,EAAI,MAChF,EAAS,EAAI,QAAQ,aAAa,EAAI,MAEtC,EAAU,IAAI,QAAQ,EAAK,CAC/B,SACA,QAAS,OAAO,YACd,OAAO,QAAQ,EAAI,QAAQ,CAAC,KAAK,CAAC,EAAG,KAAO,CAAC,EAAG,OAAO,EAAE,CAAC,CAAC,CAC5D,CACD,KAAM,IAAW,OAAS,KAAK,UAAU,EAAI,MAAQ,EAAE,CAAC,CAAG,IAAA,GAC5D,CAAC,CAOI,EAAW,MALK,EACpB,MACM,EAAW,EAAI,CACrB,EACD,CACoC,EAAQ,CAE7C,EAAI,OAAO,EAAS,OAAO,CAC3B,EAAS,QAAQ,SAAS,EAAG,IAAM,EAAI,UAAU,EAAG,EAAE,CAAC,CACvD,IAAM,EAAO,MAAM,EAAS,MAAM,CAClC,EAAI,KAAK,EAAK"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec.d.ts","names":[],"sources":["../src/spec.ts"],"sourcesContent":[],"mappings":";;;;;;;;;AAsBA;AAUA;AACA;AAEiB,KArBL,MAAA,GAqBK,SAAgB,GAAA,OAMzB;AAUS,UAlCA,WAAA,CAkCY;EACb,GAAA,EAlCT,SAkCS,CAlCC,cAkCD,CAAA;EACC,IAAA,EAAA,MAAA;;AACS,UAhCT,cAAA,CAgCS;EACX,IAAA,EAAA,MAAA;EASL,OAAA,EAAA,MAAA;EAEK,IAAA,EAAA,MAAA;EAEH,OAAA,EA1CD,cA0CC;;;;;;AA+CG,KAnFH,QAAA,GAAW,WAmFR,GAnFsB,cAmFtB;AAMH,cAxFC,aAwFD,EAAA,CAAA,CAAA,EAxFqB,QAwFrB,EAAA,GAAA,CAAA,IAxFqC,WAwFrC;AAQE,UA9FG,gBAAA,CA8FH;EACA,KAAA,EAAA;IAGJ,IAAA,EAAA,MAAA;IAAW,OAAA,CAAA,EAAA,MAAA;EAmCT,CAAA;EACV,UAAA,CAAA,EAAA,CAAA,IAAA,EAAA;IACA,KAAA,EAAA,OAAA;IAAiB,MAAA,CAAA,EAAA,OAAA;IAFW,KAAA,CAAA,EAAA,OAAA;EAAY,CAAA,EAAA,GA/HlC,MA+HkC,CAAA,MAAA,EAAA,OAAA,CAAA;AAS1C;;;;;;;;AAKa,UAnII,YAmIJ,CAAA,cAlIG,cAkIH,EAAA,eAjII,cAiIJ,GAjIqB,qBAiIrB,CAAA,OAAA,CAAA,EAAA,eAAA,SAhIa,QAgIb,EAAA,GAAA,SAAA,GAAA,SA/HE,QA+HF,EAAA,GAAA,SAAA,CAAA,CAAA;EAAL,IAAA,EAAA;IACoB;IAAG,IAAA,EAAA,MAAA;IAAG;IAAnB,OAAA,EAAA,MAAA;IAAL;IACoB,IAAA,EAxHpB,MAwHoB;IAAG;IAAG,SAAA,EAtHrB,SAsHqB;IAAnB;IAAL,MAAA,EApHA,KAoHA,EAAA;IAEI;IAAG,IAAA,EApHT,GAoHS,EAAA;IAAG;IAAnB,WAAA,EAAA,MAAA;IAAY;IAeF,IAAA,EAAA,MAaX;IAZU;IACA,OAAA,EAAA,MAAA;EAAiB,CAAA;EACR,EAAA,EAAA;IAEK;IAAG,KAAA,EA7HlB,KA6HkB,GAAA,IAAA;IAAG;IAAnB,MAAA,EA3HD,MA2HC;IAAL;IACoB,MAAA,CAAA,EA1Hf,MA0He,CAAA,MAAA,EAAA;MAAG,WAAA,EAAA,MAAA;MAAG,IAAA,CAAA,EAAA,MAAA;MAAnB,OAAA,CAAA,EAAA,MAAA;MAAL,IAAA,EAAA,MAAA;IACoB,CAAA,CAAA;EAAG,CAAA;EAAG,MAAA,EAAA;IAAnB;IAAL,IAAA,EAAA,WAAA,GAAA,MAAA,GAAA,OAAA;IAEI;IAAG,UAAA,CAAA,EAAA,OAAA;IAAG;IAAnB,SAAA,CAAA,EAAA;MAAY,GAAA,EAAA,MAAA;;;;;;;;;;eApGA;;;;;eAKA;;;;;YAMH;;;;;;;cAQE;cACA;;UAGJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAmCE,eAAA,GAAkB,aAC5B,gBACA,iBAAiB;;;;;cAON,0BACD,0BACA,iBAAiB,mDACR,0CAEb,KAAK,aAAa,GAAG,GAAG;QACtB,KAAK,aAAa,GAAG,GAAG;UACtB,KAAK,aAAa,GAAG,GAAG;MAEjC,aAAa,GAAG,GAAG;;;;;cAeT,wBACD,0BACA,iBAAiB,mDACR,0CAEb,KAAK,aAAa,GAAG,GAAG;QACtB,KAAK,aAAa,GAAG,GAAG;UACtB,KAAK,aAAa,GAAG,GAAG;MAEjC,aAAa,GAAG,GAAG"}
package/dist/spec.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec.js","names":[],"sources":["../src/spec.ts"],"sourcesContent":["/**\n * ContractSpec: a single source of truth describing one operation (command/query).\n * It carries narrative context for humans/agents AND machine-typed input/output/policy.\n */\nimport type { EventSpec } from './events';\nimport type { AnySchemaModel } from '@lssm/lib.schema';\nimport type { ResourceRefDescriptor } from './resources';\nimport type { Owner, Stability, Tag } from './ownership';\nimport type { PolicyRef } from './policy/spec';\nimport type { TestSpecRef } from './tests/spec';\n\n/**\n * Distinguishes between state-changing operations (command) and read-only operations (query).\n */\nexport type OpKind = 'command' | 'query';\n\n// preferred: reference a declared event\nexport interface EmitDeclRef {\n ref: EventSpec<AnySchemaModel>;\n when: string;\n}\n// inline (fallback)\nexport interface EmitDeclInline {\n name: string;\n version: number;\n when: string;\n payload: AnySchemaModel;\n}\n/**\n * Declaration of an event that an operation may emit.\n * Can be a reference to an `EventSpec` or an inline definition.\n */\nexport type EmitDecl = EmitDeclRef | EmitDeclInline;\nexport const isEmitDeclRef = (e: EmitDecl): e is EmitDeclRef => 'ref' in e;\n\nexport interface TelemetryTrigger {\n event: { name: string; version?: number };\n properties?: (args: {\n input: unknown;\n output?: unknown;\n error?: unknown;\n }) => Record<string, unknown>;\n}\n\n/**\n * The core specification interface for any operation (Command or Query).\n *\n * @template Input - The Zod-backed schema model for the input payload.\n * @template Output - The Zod-backed schema model for the output payload, or a resource reference.\n * @template Events - Tuple of events that this operation may emit.\n */\nexport interface ContractSpec<\n Input extends AnySchemaModel,\n Output extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n Events extends readonly EmitDecl[] | undefined =\n | readonly EmitDecl[]\n | undefined,\n> {\n meta: {\n /** Fully-qualified op name (e.g., \"sigil.beginSignup\") */\n name: string;\n /** Breaking changes => bump version */\n version: number;\n /** \"command\" changes state; \"query\" is read-only/idempotent */\n kind: OpKind;\n /** Lifecycle marker for comms & tooling */\n stability: Stability;\n /** Owners for CODEOWNERS / on-call / approvals */\n owners: Owner[];\n /** Search tags, grouping, docs navigation */\n tags: Tag[];\n /** Short human-friendly summary */\n description: string;\n /** Business goal: why this exists */\n goal: string;\n /** Background, constraints, scope edges (feeds docs & LLM context) */\n context: string;\n };\n\n io: {\n /** Zod schema for input payload */\n input: Input | null;\n /** Zod schema for output payload */\n output: Output;\n /** Named, typed errors this op may throw (optional) */\n errors?: Record<\n string,\n {\n description: string;\n http?: number; // suggested HTTP status if surfaced over REST\n gqlCode?: string; // suggested GraphQL error code\n when: string; // human-readable condition\n }\n >;\n };\n\n policy: {\n /** Minimal auth category allowed to call this op */\n auth: 'anonymous' | 'user' | 'admin';\n /** Idempotency hint. Queries default true; commands default false. */\n idempotent?: boolean;\n /** Soft rate limit suggestion; adapter enforces via limiter */\n rateLimit?: { rpm: number; key: 'user' | 'org' | 'global' };\n /** Feature flags that must be ON for this op to run */\n flags?: string[];\n /** Whether a human must approve before action (e.g., risky commands) */\n escalate?: 'human_review' | null;\n /** JSONPath-like pointers to redact from logs/prompts */\n pii?: string[];\n /** Referenced policy specs governing access */\n policies?: PolicyRef[];\n /** Field-level overrides referencing policy specs */\n fieldPolicies?: {\n field: string;\n actions: ('read' | 'write')[];\n policy?: PolicyRef;\n }[];\n };\n\n sideEffects?: {\n /** Declared events this op may emit; runtime will guard against others */\n emits?: Events;\n /** Analytics intents (names); the service decides the sink */\n analytics?: string[];\n /** Audit intents (labels); the service decides storage */\n audit?: string[];\n };\n\n telemetry?: {\n success?: TelemetryTrigger;\n failure?: TelemetryTrigger;\n };\n\n tests?: TestSpecRef[];\n\n transport?: {\n rest?: {\n /** Override HTTP method (default: POST for commands, GET for queries) */\n method?: 'GET' | 'POST';\n /** Override path (default derived from meta.name/version) */\n path?: string;\n };\n gql?: {\n /** Override field name (default: dots→underscores + _vN) */\n field?: string;\n returns?: string;\n // byIdField?: string;\n // resource?: string;\n };\n mcp?: {\n /** Override tool identifier (default: \"<name>.v<version>\") */\n toolName?: string;\n };\n };\n\n acceptance?: {\n /** Gherkin-lite scenarios for docs & auto tests */\n scenarios?: {\n name: string;\n given: string[];\n when: string[];\n then: string[];\n }[];\n /** Request/response examples (used for docs & snapshot tests) */\n examples?: { name: string; input: unknown; output: unknown }[];\n };\n}\n\nexport type AnyContractSpec = ContractSpec<\n AnySchemaModel,\n AnySchemaModel | ResourceRefDescriptor<boolean>\n>;\n\n/**\n * Helper to define a Command (write operation).\n * Sets `kind: 'command'` and defaults `idempotent: false`.\n */\nexport const defineCommand = <\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n E extends readonly EmitDecl[] | undefined = undefined,\n>(\n spec: Omit<ContractSpec<I, O, E>, 'meta' | 'policy'> & {\n meta: Omit<ContractSpec<I, O, E>['meta'], 'kind'>;\n policy: Omit<ContractSpec<I, O, E>['policy'], 'idempotent'>;\n }\n): ContractSpec<I, O, E> => ({\n ...spec,\n meta: { ...spec.meta, kind: 'command' as const },\n policy: {\n ...spec.policy,\n idempotent:\n (spec.policy as never as ContractSpec<never, never, never>)?.['policy']\n ?.idempotent ?? false,\n },\n});\n\n/**\n * Helper to define a Query (read-only operation).\n * Sets `kind: 'query'` and forces `idempotent: true`.\n */\nexport const defineQuery = <\n I extends AnySchemaModel,\n O extends AnySchemaModel | ResourceRefDescriptor<boolean>,\n E extends readonly EmitDecl[] | undefined = undefined,\n>(\n spec: Omit<ContractSpec<I, O, E>, 'meta' | 'policy'> & {\n meta: Omit<ContractSpec<I, O, E>['meta'], 'kind'>;\n policy: Omit<ContractSpec<I, O, E>['policy'], 'idempotent'>;\n }\n): ContractSpec<I, O, E> => ({\n ...spec,\n meta: { ...spec.meta, kind: 'query' as const },\n policy: { ...spec.policy, idempotent: true },\n});\n"],"mappings":"AAiCA,MAAa,EAAiB,GAAkC,QAAS,EAgJ5D,EAKX,IAI2B,CAC3B,GAAG,EACH,KAAM,CAAE,GAAG,EAAK,KAAM,KAAM,UAAoB,CAChD,OAAQ,CACN,GAAG,EAAK,OACR,WACG,EAAK,QAAwD,QAC1D,YAAc,GACrB,CACF,EAMY,EAKX,IAI2B,CAC3B,GAAG,EACH,KAAM,CAAE,GAAG,EAAK,KAAM,KAAM,QAAkB,CAC9C,OAAQ,CAAE,GAAG,EAAK,OAAQ,WAAY,GAAM,CAC7C"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"anomaly.d.ts","names":[],"sources":["../../src/telemetry/anomaly.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,qBAAA;YACL;EADK,SAAA,EAEJ,+BADD;EAOK,MAAA,EAAA,MAAA;EAKJ,KAAA,EAAA,MAAA,GAAA,SAAA;;;UALI,8BAAA;sBACK;cACR;;cAGD,uBAAA;;;;wBAKU;oBAKH"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"anomaly.js","names":[],"sources":["../../src/telemetry/anomaly.ts"],"sourcesContent":["import type { TelemetryDispatch } from './tracker';\nimport type { TelemetryAnomalyDetectionConfig } from './spec';\n\nexport interface TelemetryAnomalyEvent {\n dispatch: TelemetryDispatch;\n threshold: TelemetryAnomalyDetectionConfig;\n metric: string;\n value: number | undefined;\n type: 'min' | 'max';\n}\n\nexport interface TelemetryAnomalyMonitorOptions {\n onAnomaly?: (event: TelemetryAnomalyEvent) => void;\n now?: () => Date;\n}\n\nexport class TelemetryAnomalyMonitor {\n private readonly onAnomaly?: (event: TelemetryAnomalyEvent) => void;\n private readonly now: () => Date;\n private readonly samples = new Map<string, number>();\n\n constructor(options: TelemetryAnomalyMonitorOptions = {}) {\n this.onAnomaly = options.onAnomaly;\n this.now = options.now ?? (() => new Date());\n }\n\n observe(dispatch: TelemetryDispatch) {\n const anomalyConfig = dispatch.definition.anomalyDetection;\n if (!anomalyConfig?.enabled) return;\n if (!anomalyConfig.thresholds?.length) return;\n\n const eventKey = `${dispatch.name}.v${dispatch.version}`;\n const count = this.samples.get(eventKey) ?? 0;\n const newCount = count + 1;\n this.samples.set(eventKey, newCount);\n\n if (\n typeof anomalyConfig.minimumSample === 'number' &&\n newCount < anomalyConfig.minimumSample\n ) {\n return;\n }\n\n for (const threshold of anomalyConfig.thresholds) {\n const value = this.extractMetric(dispatch, threshold.metric);\n if (typeof value !== 'number') continue;\n if (typeof threshold.min === 'number' && value < threshold.min) {\n this.emit(dispatch, anomalyConfig, threshold.metric, value, 'min');\n }\n if (typeof threshold.max === 'number' && value > threshold.max) {\n this.emit(dispatch, anomalyConfig, threshold.metric, value, 'max');\n }\n }\n }\n\n private extractMetric(dispatch: TelemetryDispatch, metric: string) {\n const value = dispatch.properties[metric];\n if (typeof value === 'number') return value;\n if (typeof value === 'object' && value !== null && 'value' in value) {\n const maybeNumber = (value as Record<string, unknown>).value;\n return typeof maybeNumber === 'number' ? maybeNumber : undefined;\n }\n return undefined;\n }\n\n private emit(\n dispatch: TelemetryDispatch,\n threshold: TelemetryAnomalyDetectionConfig,\n metric: string,\n value: number,\n type: 'min' | 'max'\n ) {\n this.onAnomaly?.({\n dispatch,\n threshold,\n metric,\n value,\n type,\n });\n }\n\n reset() {\n this.samples.clear();\n }\n}\n\n"],"mappings":"AAgBA,IAAa,EAAb,KAAqC,CACnC,UACA,IACA,QAA2B,IAAI,IAE/B,YAAY,EAA0C,EAAE,CAAE,CACxD,KAAK,UAAY,EAAQ,UACzB,KAAK,IAAM,EAAQ,UAAc,IAAI,MAGvC,QAAQ,EAA6B,CACnC,IAAM,EAAgB,EAAS,WAAW,iBAE1C,GADI,CAAC,GAAe,SAChB,CAAC,EAAc,YAAY,OAAQ,OAEvC,IAAM,EAAW,GAAG,EAAS,KAAK,IAAI,EAAS,UAEzC,GADQ,KAAK,QAAQ,IAAI,EAAS,EAAI,GACnB,EACzB,QAAK,QAAQ,IAAI,EAAU,EAAS,CAGlC,SAAO,EAAc,eAAkB,UACvC,EAAW,EAAc,eAK3B,IAAK,IAAM,KAAa,EAAc,WAAY,CAChD,IAAM,EAAQ,KAAK,cAAc,EAAU,EAAU,OAAO,CACxD,OAAO,GAAU,WACjB,OAAO,EAAU,KAAQ,UAAY,EAAQ,EAAU,KACzD,KAAK,KAAK,EAAU,EAAe,EAAU,OAAQ,EAAO,MAAM,CAEhE,OAAO,EAAU,KAAQ,UAAY,EAAQ,EAAU,KACzD,KAAK,KAAK,EAAU,EAAe,EAAU,OAAQ,EAAO,MAAM,GAKxE,cAAsB,EAA6B,EAAgB,CACjE,IAAM,EAAQ,EAAS,WAAW,GAClC,GAAI,OAAO,GAAU,SAAU,OAAO,EACtC,GAAI,OAAO,GAAU,UAAY,GAAkB,UAAW,EAAO,CACnE,IAAM,EAAe,EAAkC,MACvD,OAAO,OAAO,GAAgB,SAAW,EAAc,IAAA,IAK3D,KACE,EACA,EACA,EACA,EACA,EACA,CACA,KAAK,YAAY,CACf,WACA,YACA,SACA,QACA,OACD,CAAC,CAGJ,OAAQ,CACN,KAAK,QAAQ,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec.d.ts","names":[],"sources":["../../src/telemetry/spec.ts"],"sourcesContent":[],"mappings":";;;KAGY,qBAAA;UAMK,aAAA,SAAsB;EAN3B;EAMK,IAAA,EAAA,MAAA;EASA;EAQA,OAAA,EAAA,MAAA;EAML;EAKK,MAAA,EAAA,MAAA;AAWjB;AAKiB,UAnCA,oBAAA,CAmCwB;EAKxB,IAAA,EAAA,QAAA,GAAA,QAAiB,GAAA,SAAA,GAAA,WAAA,GAAA,MAAA;EAYL,QAAA,CAAA,EAAA,OAAA;EAAf,GAAA,CAAA,EAAA,OAAA;EAEH,MAAA,CAAA,EAAA,OAAA;EAEG,WAAA,CAAA,EAAA,MAAA;;AAIO,UApDJ,yBAAA,CAoDI;EAA+B,MAAA,EAAA,MAAA;EAKnC,GAAA,CAAA,EAAA,MAAA;EAKA,GAAA,CAAA,EAAA,MAAA;AAUjB;AACQ,KAnEI,sBAAA,GAmEJ,OAAA,GAAA,KAAA,GAAA,eAAA;AACE,UA/DO,+BAAA,CA+DP;EACC,OAAA,EAAA,OAAA;EAAe,UAAA,CAAA,EA9DX,yBA8DW,EAAA;EAKb,OAAA,CAAA,EAlED,sBAkEkB,EAAA;EAKb;;;;EAsDZ,aAAA,CAAA,EAAA,MAAA;;AAmBW,UAxIC,uBAAA,CAwIsB;;;;UAnItB,wBAAA;;;;UAKA,iBAAA;;;;;;;;;;;;cAYH,eAAe;;WAElB;;cAEG;;aAED;;qBAEQ;;;;UAKJ,uBAAA;;UAEP;;UAGO,eAAA;;;cAGH;;;;;;UAOG,aAAA;QACT;UACE;WACC;;cAKE,iBAAA;;;;iBAKI;UAaP;uCAI6B;gDAgBS;mDAqB3C;;iBAmBW,gBAAA,OAAuB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec.js","names":["latest: TelemetrySpec | undefined","latest: TelemetryEventDef | undefined"],"sources":["../../src/telemetry/spec.ts"],"sourcesContent":["import type { OwnerShipMeta } from '../ownership';\nimport type { EventKey } from '../events';\n\nexport type TelemetryPrivacyLevel =\n | 'public'\n | 'internal'\n | 'pii'\n | 'sensitive';\n\nexport interface TelemetryMeta extends OwnerShipMeta {\n /** Fully-qualified telemetry spec name (e.g., \"sigil.core\"). */\n name: string;\n /** Incremented when telemetry definitions change in a breaking way. */\n version: number;\n /** Optional domain or bounded-context hint (e.g., \"onboarding\"). */\n domain: string;\n}\n\nexport interface TelemetryPropertyDef {\n type: 'string' | 'number' | 'boolean' | 'timestamp' | 'json';\n required?: boolean;\n pii?: boolean;\n redact?: boolean;\n description?: string;\n}\n\nexport interface TelemetryAnomalyThreshold {\n metric: string;\n min?: number;\n max?: number;\n}\n\nexport type TelemetryAnomalyAction =\n | 'alert'\n | 'log'\n | 'trigger_regen';\n\nexport interface TelemetryAnomalyDetectionConfig {\n enabled: boolean;\n thresholds?: TelemetryAnomalyThreshold[];\n actions?: TelemetryAnomalyAction[];\n /**\n * Minimum sample size before evaluating thresholds.\n * Helps avoid false positives on small sample sizes.\n */\n minimumSample?: number;\n}\n\nexport interface TelemetrySamplingConfig {\n rate: number;\n conditions?: string[];\n}\n\nexport interface TelemetryRetentionConfig {\n days: number;\n policy?: 'archive' | 'delete';\n}\n\nexport interface TelemetryEventDef {\n /** Name of the event (should match EventSpec.name for cross-reference). */\n name: string;\n /** Version of the underlying event. */\n version: number;\n /** High-level semantics for docs/analyzers. */\n semantics: {\n who?: string;\n what: string;\n why?: string;\n };\n /** Detailed property metadata keyed by property name. */\n properties: Record<string, TelemetryPropertyDef>;\n /** Privacy level for the entire event. */\n privacy: TelemetryPrivacyLevel;\n /** Retention policy overrides. */\n retention?: TelemetryRetentionConfig;\n /** Sampling rules, defaulting to spec.config defaults. */\n sampling?: TelemetrySamplingConfig;\n /** Anomaly detection overrides. */\n anomalyDetection?: TelemetryAnomalyDetectionConfig;\n /** Optional tags for analytics/AI hints. */\n tags?: string[];\n}\n\nexport interface TelemetryProviderConfig {\n type: 'posthog' | 'segment' | 'opentelemetry' | 'internal';\n config: Record<string, unknown>;\n}\n\nexport interface TelemetryConfig {\n defaultRetentionDays?: number;\n defaultSamplingRate?: number;\n providers?: TelemetryProviderConfig[];\n anomalyDetection?: {\n enabled: boolean;\n checkIntervalMs?: number;\n };\n}\n\nexport interface TelemetrySpec {\n meta: TelemetryMeta;\n events: TelemetryEventDef[];\n config?: TelemetryConfig;\n}\n\nconst telemetryKey = (meta: TelemetryMeta) => `${meta.name}.v${meta.version}`;\n\nexport class TelemetryRegistry {\n private readonly items = new Map<string, TelemetrySpec>();\n private readonly eventsByKey = new Map<EventKey, TelemetryEventDef>();\n private readonly specByEventKey = new Map<EventKey, TelemetrySpec>();\n\n register(spec: TelemetrySpec): this {\n const key = telemetryKey(spec.meta);\n if (this.items.has(key)) {\n throw new Error(`Duplicate TelemetrySpec registration for ${key}`);\n }\n this.items.set(key, spec);\n for (const event of spec.events) {\n this.eventsByKey.set(`${event.name}.v${event.version}`, event);\n this.specByEventKey.set(`${event.name}.v${event.version}`, spec);\n }\n return this;\n }\n\n list(): TelemetrySpec[] {\n return [...this.items.values()];\n }\n\n get(name: string, version?: number): TelemetrySpec | undefined {\n if (version != null) {\n return this.items.get(`${name}.v${version}`);\n }\n let latest: TelemetrySpec | undefined;\n let maxVersion = -Infinity;\n for (const item of this.items.values()) {\n if (item.meta.name !== name) continue;\n if (item.meta.version > maxVersion) {\n maxVersion = item.meta.version;\n latest = item;\n }\n }\n return latest;\n }\n\n findEventDef(name: string, version?: number): TelemetryEventDef | undefined {\n if (version != null) {\n return this.eventsByKey.get(`${name}.v${version}`);\n }\n let latest: TelemetryEventDef | undefined;\n let maxVersion = -Infinity;\n for (const [key, event] of this.eventsByKey.entries()) {\n const [eventName, versionPart] = key.split('.v');\n if (eventName !== name) continue;\n const ver = Number(versionPart);\n if (Number.isFinite(ver) && ver > maxVersion) {\n maxVersion = ver;\n latest = event;\n }\n }\n return latest;\n }\n\n getSpecForEvent(\n name: string,\n version?: number\n ): TelemetrySpec | undefined {\n if (version != null) {\n return this.specByEventKey.get(`${name}.v${version}`);\n }\n let latest: TelemetrySpec | undefined;\n let maxVersion = -Infinity;\n for (const [key, spec] of this.specByEventKey.entries()) {\n const [eventName, versionPart] = key.split('.v');\n if (eventName !== name) continue;\n const ver = Number(versionPart);\n if (Number.isFinite(ver) && ver > maxVersion) {\n maxVersion = ver;\n latest = spec;\n }\n }\n return latest;\n }\n}\n\nexport function makeTelemetryKey(meta: TelemetryMeta) {\n return telemetryKey(meta);\n}\n\n"],"mappings":"AAwGA,MAAM,EAAgB,GAAwB,GAAG,EAAK,KAAK,IAAI,EAAK,UAEpE,IAAa,EAAb,KAA+B,CAC7B,MAAyB,IAAI,IAC7B,YAA+B,IAAI,IACnC,eAAkC,IAAI,IAEtC,SAAS,EAA2B,CAClC,IAAM,EAAM,EAAa,EAAK,KAAK,CACnC,GAAI,KAAK,MAAM,IAAI,EAAI,CACrB,MAAU,MAAM,4CAA4C,IAAM,CAEpE,KAAK,MAAM,IAAI,EAAK,EAAK,CACzB,IAAK,IAAM,KAAS,EAAK,OACvB,KAAK,YAAY,IAAI,GAAG,EAAM,KAAK,IAAI,EAAM,UAAW,EAAM,CAC7D,KAAK,eAAe,IAAI,GAAG,EAAM,KAAK,IAAI,EAAM,UAAW,EAAK,CAEnE,OAAO,KAGT,MAAwB,CACtB,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAGjC,IAAI,EAAc,EAA6C,CAC7D,GAAI,GAAW,KACb,OAAO,KAAK,MAAM,IAAI,GAAG,EAAK,IAAI,IAAU,CAE9C,IAAIA,EACA,EAAa,KACjB,IAAK,IAAM,KAAQ,KAAK,MAAM,QAAQ,CAChC,EAAK,KAAK,OAAS,GACnB,EAAK,KAAK,QAAU,IACtB,EAAa,EAAK,KAAK,QACvB,EAAS,GAGb,OAAO,EAGT,aAAa,EAAc,EAAiD,CAC1E,GAAI,GAAW,KACb,OAAO,KAAK,YAAY,IAAI,GAAG,EAAK,IAAI,IAAU,CAEpD,IAAIC,EACA,EAAa,KACjB,IAAK,GAAM,CAAC,EAAK,KAAU,KAAK,YAAY,SAAS,CAAE,CACrD,GAAM,CAAC,EAAW,GAAe,EAAI,MAAM,KAAK,CAChD,GAAI,IAAc,EAAM,SACxB,IAAM,EAAM,OAAO,EAAY,CAC3B,OAAO,SAAS,EAAI,EAAI,EAAM,IAChC,EAAa,EACb,EAAS,GAGb,OAAO,EAGT,gBACE,EACA,EAC2B,CAC3B,GAAI,GAAW,KACb,OAAO,KAAK,eAAe,IAAI,GAAG,EAAK,IAAI,IAAU,CAEvD,IAAID,EACA,EAAa,KACjB,IAAK,GAAM,CAAC,EAAK,KAAS,KAAK,eAAe,SAAS,CAAE,CACvD,GAAM,CAAC,EAAW,GAAe,EAAI,MAAM,KAAK,CAChD,GAAI,IAAc,EAAM,SACxB,IAAM,EAAM,OAAO,EAAY,CAC3B,OAAO,SAAS,EAAI,EAAI,EAAM,IAChC,EAAa,EACb,EAAS,GAGb,OAAO,IAIX,SAAgB,EAAiB,EAAqB,CACpD,OAAO,EAAa,EAAK"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tracker.d.ts","names":[],"sources":["../../src/telemetry/tracker.ts"],"sourcesContent":[],"mappings":";;;;UASiB,qBAAA;;EAAA,cAAA,CAAA,EAAA,MAAA,GAAqB,IAAA;EAUrB,MAAA,CAAA,EAAA,MAAA,GAAA,IAAiB;EAKpB,SAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EACH,KAAA,CAAA,EAAA,WAAA,GAAA,MAAA,GAAA,OAAA;EACA,OAAA,CAAA,EAAA,KAAA,GAAA,QAAA,GAAA,KAAA,GAAA,OAAA;EAEH,QAAA,CAAA,EAZK,MAYL,CAAA,MAAA,EAAA,OAAA,CAAA;;AACuB,UAVd,iBAAA,CAUc;EAGd,EAAA,EAAA,MAAA;EAKA,IAAA,EAAA,MAAA;EACL,OAAA,EAAA,MAAA;EACE,UAAA,EAAA,MAAA;EACK,UAAA,EAhBL,MAgBK,CAAA,MAAA,EAAA,OAAA,CAAA;EAEH,OAAA,EAjBL,iBAiBK,CAAA,SAAA,CAAA;EAAI,OAAA,EAhBT,qBAgBS;EAiBP,IAAA,CAAA,EAAA,MAAA,EAAA;EAOU,IAAA,EAtCf,aAsCe;EAWM,UAAA,EAhDf,iBAgDe;;AAYhB,UAzDI,wBAAA,CAyDJ;EACR,EAAA,EAAA,MAAA;EAAO,IAAA,CAAA,KAAA,EAxDE,iBAwDF,CAAA,EAxDsB,OAwDtB,CAAA,IAAA,CAAA;;UArDK,uBAAA;YACL;cACE;mBACK;;gBAEH;;cAiBH,gBAAA;;;;;;uBAOU;6BAWM;;mDAWb,mCACH,wBACR"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tracker.js","names":["dispatch: TelemetryDispatch","result: Record<string, unknown>"],"sources":["../../src/telemetry/tracker.ts"],"sourcesContent":["import { randomUUID } from 'crypto';\nimport type { TelemetryAnomalyMonitor } from './anomaly';\nimport type {\n TelemetryEventDef,\n TelemetryRegistry,\n TelemetrySamplingConfig,\n TelemetrySpec,\n} from './spec';\n\nexport interface TelemetryEventContext {\n tenantId?: string;\n organizationId?: string | null;\n userId?: string | null;\n sessionId?: string | null;\n actor?: 'anonymous' | 'user' | 'admin';\n channel?: 'web' | 'mobile' | 'job' | 'agent';\n metadata?: Record<string, unknown>;\n}\n\nexport interface TelemetryDispatch {\n id: string;\n name: string;\n version: number;\n occurredAt: string;\n properties: Record<string, unknown>;\n privacy: TelemetryEventDef['privacy'];\n context: TelemetryEventContext;\n tags?: string[];\n spec: TelemetrySpec;\n definition: TelemetryEventDef;\n}\n\nexport interface RuntimeTelemetryProvider {\n id: string;\n send(event: TelemetryDispatch): Promise<void>;\n}\n\nexport interface TelemetryTrackerOptions {\n registry: TelemetryRegistry;\n providers?: RuntimeTelemetryProvider[];\n anomalyMonitor?: TelemetryAnomalyMonitor;\n random?: () => number;\n clock?: () => Date;\n}\n\nconst maskValue = (value: unknown) => {\n if (value == null) return value;\n if (typeof value === 'string') return 'REDACTED';\n if (typeof value === 'number') return 0;\n if (typeof value === 'boolean') return false;\n if (Array.isArray(value)) return value.map(() => 'REDACTED');\n if (typeof value === 'object') {\n return Object.fromEntries(\n Object.keys(value as Record<string, unknown>).map((key) => [key, 'REDACTED'])\n );\n }\n return 'REDACTED';\n};\n\nexport class TelemetryTracker {\n private readonly providers = new Map<string, RuntimeTelemetryProvider>();\n private readonly registry: TelemetryRegistry;\n private readonly anomalyMonitor?: TelemetryAnomalyMonitor;\n private readonly random: () => number;\n private readonly clock: () => Date;\n\n constructor(options: TelemetryTrackerOptions) {\n this.registry = options.registry;\n this.anomalyMonitor = options.anomalyMonitor;\n this.random = options.random ?? Math.random;\n this.clock = options.clock ?? (() => new Date());\n\n for (const provider of options.providers ?? []) {\n this.providers.set(provider.id, provider);\n }\n }\n\n registerProvider(provider: RuntimeTelemetryProvider) {\n this.providers.set(provider.id, provider);\n }\n\n unregisterProvider(providerId: string) {\n this.providers.delete(providerId);\n }\n\n async track(\n name: string,\n version: number,\n properties: Record<string, unknown>,\n context: TelemetryEventContext = {}\n ): Promise<boolean> {\n const definition = this.registry.findEventDef(name, version);\n if (!definition) return false;\n\n const spec = this.registry.getSpecForEvent(definition.name, definition.version);\n if (!spec) return false;\n\n if (!this.shouldSample(definition.sampling ?? spec.config?.defaultSamplingRate)) {\n return false;\n }\n\n const redactedProperties = this.redactProperties(definition, properties);\n const dispatch: TelemetryDispatch = {\n id: randomUUID(),\n name: definition.name,\n version: definition.version,\n occurredAt: this.clock().toISOString(),\n properties: redactedProperties,\n privacy: definition.privacy,\n context,\n tags: definition.tags,\n spec,\n definition,\n };\n\n await Promise.all(\n [...this.providers.values()].map((provider) => provider.send(dispatch))\n );\n\n this.anomalyMonitor?.observe(dispatch);\n return true;\n }\n\n private shouldSample(\n sampling: TelemetrySamplingConfig | number | undefined\n ): boolean {\n if (typeof sampling === 'number') {\n return this.random() < sampling;\n }\n if (!sampling) return true;\n return this.random() < sampling.rate;\n }\n\n private redactProperties(\n definition: TelemetryEventDef,\n properties: Record<string, unknown>\n ): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(properties)) {\n const def = definition.properties[key];\n if (!def) {\n result[key] = value;\n continue;\n }\n if (def.redact || def.pii || definition.privacy === 'sensitive') {\n result[key] = maskValue(value);\n } else {\n result[key] = value;\n }\n }\n return result;\n }\n}\n\n"],"mappings":"oCA6CA,MAAM,EAAa,GACb,GAAS,KAAa,EACtB,OAAO,GAAU,SAAiB,WAClC,OAAO,GAAU,SAAiB,EAClC,OAAO,GAAU,UAAkB,GACnC,MAAM,QAAQ,EAAM,CAAS,EAAM,QAAU,WAAW,CACxD,OAAO,GAAU,SACZ,OAAO,YACZ,OAAO,KAAK,EAAiC,CAAC,IAAK,GAAQ,CAAC,EAAK,WAAW,CAAC,CAC9E,CAEI,WAGT,IAAa,EAAb,KAA8B,CAC5B,UAA6B,IAAI,IACjC,SACA,eACA,OACA,MAEA,YAAY,EAAkC,CAC5C,KAAK,SAAW,EAAQ,SACxB,KAAK,eAAiB,EAAQ,eAC9B,KAAK,OAAS,EAAQ,QAAU,KAAK,OACrC,KAAK,MAAQ,EAAQ,YAAgB,IAAI,MAEzC,IAAK,IAAM,KAAY,EAAQ,WAAa,EAAE,CAC5C,KAAK,UAAU,IAAI,EAAS,GAAI,EAAS,CAI7C,iBAAiB,EAAoC,CACnD,KAAK,UAAU,IAAI,EAAS,GAAI,EAAS,CAG3C,mBAAmB,EAAoB,CACrC,KAAK,UAAU,OAAO,EAAW,CAGnC,MAAM,MACJ,EACA,EACA,EACA,EAAiC,EAAE,CACjB,CAClB,IAAM,EAAa,KAAK,SAAS,aAAa,EAAM,EAAQ,CAC5D,GAAI,CAAC,EAAY,MAAO,GAExB,IAAM,EAAO,KAAK,SAAS,gBAAgB,EAAW,KAAM,EAAW,QAAQ,CAG/E,GAFI,CAAC,GAED,CAAC,KAAK,aAAa,EAAW,UAAY,EAAK,QAAQ,oBAAoB,CAC7E,MAAO,GAGT,IAAM,EAAqB,KAAK,iBAAiB,EAAY,EAAW,CAClEA,EAA8B,CAClC,GAAI,GAAY,CAChB,KAAM,EAAW,KACjB,QAAS,EAAW,QACpB,WAAY,KAAK,OAAO,CAAC,aAAa,CACtC,WAAY,EACZ,QAAS,EAAW,QACpB,UACA,KAAM,EAAW,KACjB,OACA,aACD,CAOD,OALA,MAAM,QAAQ,IACZ,CAAC,GAAG,KAAK,UAAU,QAAQ,CAAC,CAAC,IAAK,GAAa,EAAS,KAAK,EAAS,CAAC,CACxE,CAED,KAAK,gBAAgB,QAAQ,EAAS,CAC/B,GAGT,aACE,EACS,CAKT,OAJI,OAAO,GAAa,SACf,KAAK,QAAQ,CAAG,EAEpB,EACE,KAAK,QAAQ,CAAG,EAAS,KADV,GAIxB,iBACE,EACA,EACyB,CACzB,IAAMC,EAAkC,EAAE,CAC1C,IAAK,GAAM,CAAC,EAAK,KAAU,OAAO,QAAQ,EAAW,CAAE,CACrD,IAAM,EAAM,EAAW,WAAW,GAClC,GAAI,CAAC,EAAK,CACR,EAAO,GAAO,EACd,SAEE,EAAI,QAAU,EAAI,KAAO,EAAW,UAAY,YAClD,EAAO,GAAO,EAAU,EAAM,CAE9B,EAAO,GAAO,EAGlB,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.d.ts","names":[],"sources":["../../src/tests/runner.ts"],"sourcesContent":[],"mappings":";;;;;;UAciB,iBAAA;YACL;;EADK,KAAA,CAAA,EAGP,KAHO;EACL,gBAAA,EAGQ,eAHR,EAAA;;AAGQ,UAGH,eAAA,CAHG;EAAe,SAAA,EAItB,SAJsB;EAGlB,MAAA,EAAA,QAAA,GAAe,QAAA;EAMf,OAAA,CAAA,EAAA,MAAa;AAO9B;AACY,UARK,aAAA,CAQL;EACY,IAAA,EARhB,QAQgB;EAAqB,SAAA,EAPhC,iBAOgC,EAAA;EAAR,MAAA,EAAA,MAAA;EACX,MAAA,EAAA,MAAA;;AAEZ,UALG,gBAAA,CAKH;EACF,QAAA,EALA,YAKA;EACE,aAAA,CAAA,EAAA,GAAA,GALU,UAKV,GALuB,OAKvB,CAL+B,UAK/B,CAAA;EAAO,UAAA,CAAA,EAAA,CAAA,QAAA,EAJK,YAIL,EAAA,GAAA,IAAA,GAJ6B,OAI7B,CAAA,IAAA,CAAA;EAeR,SAAA,CAAA,EAAA,CAAU,QAAA,EAjBT,YAiBS,EAAA,MAAA,EAhBX,iBAgBW,EAAA,GAAA,IAAA,GAfT,OAeS,CAAA,IAAA,CAAA;;AAGL,cAHL,UAAA,CAGK;EAAmB,iBAAA,MAAA;EAAR,WAAA,CAAA,MAAA,EAFU,gBAEV;EAAO,GAAA,CAAA,IAAA,EAAlB,QAAkB,CAAA,EAAP,OAAO,CAAC,aAAD,CAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.js","names":["config: TestRunnerConfig","scenarios: ScenarioRunResult[]","assertionResults: AssertionResult[]","events: RecordedEvent[]","ctx: HandlerCtx","failures: string[]"],"sources":["../../src/tests/runner.ts"],"sourcesContent":["import { deepStrictEqual } from 'node:assert';\nimport { SpecRegistry } from '../index';\nimport type { HandlerCtx } from '../types';\nimport type {\n Action,\n Assertion,\n ExpectErrorAssertion,\n ExpectEventsAssertion,\n ExpectOutputAssertion,\n Fixture,\n TestScenario,\n TestSpec,\n} from './spec';\n\nexport interface ScenarioRunResult {\n scenario: TestScenario;\n status: 'passed' | 'failed';\n error?: Error;\n assertionResults: AssertionResult[];\n}\n\nexport interface AssertionResult {\n assertion: Assertion;\n status: 'passed' | 'failed';\n message?: string;\n}\n\nexport interface TestRunResult {\n spec: TestSpec;\n scenarios: ScenarioRunResult[];\n passed: number;\n failed: number;\n}\n\nexport interface TestRunnerConfig {\n registry: SpecRegistry;\n createContext?: () => HandlerCtx | Promise<HandlerCtx>;\n beforeEach?: (scenario: TestScenario) => void | Promise<void>;\n afterEach?: (\n scenario: TestScenario,\n result: ScenarioRunResult\n ) => void | Promise<void>;\n}\n\ninterface OperationResult {\n output?: unknown;\n error?: Error;\n events: RecordedEvent[];\n}\n\ninterface RecordedEvent {\n name: string;\n version: number;\n payload: unknown;\n}\n\nexport class TestRunner {\n constructor(private readonly config: TestRunnerConfig) {}\n\n async run(spec: TestSpec): Promise<TestRunResult> {\n const scenarios: ScenarioRunResult[] = [];\n let passed = 0;\n let failed = 0;\n\n for (const scenario of spec.scenarios) {\n await this.config.beforeEach?.(scenario);\n\n const result = await this.runScenario(spec, scenario);\n scenarios.push(result);\n if (result.status === 'passed') passed += 1;\n else failed += 1;\n\n await this.config.afterEach?.(scenario, result);\n }\n\n return {\n spec,\n scenarios,\n passed,\n failed,\n };\n }\n\n private async runScenario(\n spec: TestSpec,\n scenario: TestScenario\n ): Promise<ScenarioRunResult> {\n const assertionResults: AssertionResult[] = [];\n\n try {\n const context = await this.createContext();\n const fixtures = [...(spec.fixtures ?? []), ...(scenario.given ?? [])];\n const events: RecordedEvent[] = [];\n\n for (const fixture of fixtures) {\n await this.executeOperation(fixture, context, events);\n }\n\n const actionResult = await this.executeOperation(\n scenario.when,\n context,\n events\n );\n\n const assertions = scenario.then ?? [];\n for (const assertion of assertions) {\n const assertionResult = this.evaluateAssertion(\n assertion,\n actionResult,\n events\n );\n assertionResults.push(assertionResult);\n }\n\n const hasFailure = assertionResults.some(\n (assertion) => assertion.status === 'failed'\n );\n return {\n scenario,\n status: hasFailure ? 'failed' : 'passed',\n assertionResults,\n };\n } catch (error) {\n return {\n scenario,\n status: 'failed',\n error: error as Error,\n assertionResults,\n };\n }\n }\n\n private async createContext(): Promise<HandlerCtx> {\n const baseCtx = (await this.config.createContext?.()) ?? {};\n return { ...baseCtx };\n }\n\n private async executeOperation(\n action: Action | Fixture,\n baseCtx: HandlerCtx,\n recordedEvents: RecordedEvent[]\n ): Promise<OperationResult> {\n const ctx: HandlerCtx = {\n ...baseCtx,\n eventPublisher: async (event) => {\n recordedEvents.push({\n name: event.name,\n version: event.version,\n payload: event.payload,\n });\n await baseCtx.eventPublisher?.(event);\n },\n };\n\n try {\n const output = await this.config.registry.execute(\n action.operation.name,\n action.operation.version,\n action.input ?? null,\n ctx\n );\n return { output, events: recordedEvents };\n } catch (error) {\n return { error: error as Error, events: recordedEvents };\n }\n }\n\n private evaluateAssertion(\n assertion: Assertion,\n result: OperationResult,\n events: RecordedEvent[]\n ): AssertionResult {\n switch (assertion.type) {\n case 'expectOutput':\n return this.evaluateOutputAssertion(assertion, result);\n case 'expectError':\n return this.evaluateErrorAssertion(assertion, result);\n case 'expectEvents':\n return this.evaluateEventsAssertion(assertion, events);\n default:\n return {\n assertion,\n status: 'failed',\n message: `Unknown assertion type ${(assertion as Assertion).type}`,\n };\n }\n }\n\n private evaluateOutputAssertion(\n assertion: ExpectOutputAssertion,\n result: OperationResult\n ): AssertionResult {\n if (result.error) {\n return {\n assertion,\n status: 'failed',\n message: `Expected output but operation threw error: ${result.error.message}`,\n };\n }\n try {\n deepStrictEqual(result.output, assertion.match);\n return { assertion, status: 'passed' };\n } catch (error) {\n return {\n assertion,\n status: 'failed',\n message:\n error instanceof Error ? error.message : 'Output assertion failed',\n };\n }\n }\n\n private evaluateErrorAssertion(\n assertion: ExpectErrorAssertion,\n result: OperationResult\n ): AssertionResult {\n if (!result.error) {\n return {\n assertion,\n status: 'failed',\n message: 'Expected an error but operation completed successfully',\n };\n }\n if (\n assertion.messageIncludes &&\n !result.error.message.includes(assertion.messageIncludes)\n ) {\n return {\n assertion,\n status: 'failed',\n message: `Error message \"${result.error.message}\" did not include expected substring \"${assertion.messageIncludes}\"`,\n };\n }\n return { assertion, status: 'passed' };\n }\n\n private evaluateEventsAssertion(\n assertion: ExpectEventsAssertion,\n events: RecordedEvent[]\n ): AssertionResult {\n const failures: string[] = [];\n\n for (const expected of assertion.events) {\n const matches = events.filter(\n (event) =>\n event.name === expected.name && event.version === expected.version\n );\n const count = matches.length;\n if (\n (typeof expected.min === 'number' && count < expected.min) ||\n (typeof expected.max === 'number' && count > expected.max)\n ) {\n failures.push(\n `Event ${expected.name}.v${expected.version} occurred ${count} times (expected ${expected.min ?? 0} - ${expected.max ?? '∞'})`\n );\n } else if (\n typeof expected.min === 'undefined' &&\n typeof expected.max === 'undefined' &&\n count === 0\n ) {\n failures.push(\n `Event ${expected.name}.v${expected.version} did not occur`\n );\n }\n }\n\n if (failures.length > 0) {\n return {\n assertion,\n status: 'failed',\n message: failures.join('; '),\n };\n }\n return { assertion, status: 'passed' };\n }\n}\n\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec.d.ts","names":[],"sources":["../../src/tests/spec.ts"],"sourcesContent":[],"mappings":";;;UAEiB,kBAAA;;EAAA,OAAA,CAAA,EAAA,MAAA;AAKjB;AAKY,UALK,iBAAA,CAMkB;EAGlB,IAAA,EAAA,MAAO;EAMP,OAAA,CAAA,EAAM,MAAA;AAKvB;AAKiB,KApBL,UAAA,GAoBK;EAKA,IAAA,EAAA,UAAa;EAOb,SAAA,EA/BkB,kBA+BG;AAKtC,CAAA,GAAY;EACR,IAAA,EAAA,UAAA;EACA,QAAA,EArC8B,iBAqC9B;CACA;AAAqB,UApCR,OAAA,CAoCQ;EAER,WAAA,CAAA,EAAA,MAAY;EAGnB,SAAA,EAvCG,kBAuCH;EACF,KAAA,CAAA,EAAA,OAAA;;AACU,UArCD,MAAA,CAqCC;EAGD,SAAA,EAvCJ,kBAuCuB;EAQnB,KAAA,CAAA,EAAA,OAAY;;AAMrB,UAjDS,qBAAA,CAiDT;EACK,IAAA,EAAA,cAAA;EAAS,KAAA,EAAA,OAAA;AAGtB;AACQ,UAjDS,oBAAA,CAiDT;EACE,IAAA,EAAA,aAAA;EACG,eAAA,CAAA,EAAA,MAAA;;AAEA,UAhDI,aAAA,CAgDJ;EAAmB,IAAA,EAAA,MAAA;EAGf,OAAA,EAAA,MAAW;EAOf,GAAA,CAAA,EAAA,MAAA;EAGI,GAAA,CAAA,EAAA,MAAA;;AAasB,UAnEtB,qBAAA,CAmEsB;EAAQ,IAAA,EAAA,cAAA;EAiB/B,MAAA,EAlFN,aAkFiB,EAAA;;KA/Ef,SAAA,GACR,wBACA,uBACA;UAEa,YAAA;;;UAGP;QACF;SACC;;UAGQ,mBAAA;;;;;;;UAQA,YAAA;;;;;UAKP;QACF;aACK;;UAGI,QAAA;QACT;UACE;aACG;aACA;aACA;;UAGI,WAAA;;;;cAOJ,YAAA;;iBAGI;UASP;uCAI6B;;iBAiBvB,WAAA,OAAkB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"spec.js","names":["latest: TestSpec | undefined"],"sources":["../../src/tests/spec.ts"],"sourcesContent":["import type { Owner, Stability, Tag } from '../ownership';\n\nexport interface OperationTargetRef {\n name: string;\n version?: number;\n}\n\nexport interface WorkflowTargetRef {\n name: string;\n version?: number;\n}\n\nexport type TestTarget =\n | { type: 'contract'; operation: OperationTargetRef }\n | { type: 'workflow'; workflow: WorkflowTargetRef };\n\nexport interface Fixture {\n description?: string;\n operation: OperationTargetRef;\n input?: unknown;\n}\n\nexport interface Action {\n operation: OperationTargetRef;\n input?: unknown;\n}\n\nexport interface ExpectOutputAssertion {\n type: 'expectOutput';\n match: unknown;\n}\n\nexport interface ExpectErrorAssertion {\n type: 'expectError';\n messageIncludes?: string;\n}\n\nexport interface ExpectedEvent {\n name: string;\n version: number;\n min?: number;\n max?: number;\n}\n\nexport interface ExpectEventsAssertion {\n type: 'expectEvents';\n events: ExpectedEvent[];\n}\n\nexport type Assertion =\n | ExpectOutputAssertion\n | ExpectErrorAssertion\n | ExpectEventsAssertion;\n\nexport interface TestScenario {\n name: string;\n description?: string;\n given?: Fixture[];\n when: Action;\n then?: Assertion[];\n}\n\nexport interface CoverageRequirement {\n statements?: number;\n branches?: number;\n functions?: number;\n lines?: number;\n mutations?: number;\n}\n\nexport interface TestSpecMeta {\n name: string;\n version: number;\n title: string;\n description?: string;\n owners: Owner[];\n tags: Tag[];\n stability: Stability;\n}\n\nexport interface TestSpec {\n meta: TestSpecMeta;\n target: TestTarget;\n fixtures?: Fixture[];\n scenarios: TestScenario[];\n coverage?: CoverageRequirement;\n}\n\nexport interface TestSpecRef {\n name: string;\n version?: number;\n}\n\nconst testKey = (meta: TestSpecMeta) => `${meta.name}.v${meta.version}`;\n\nexport class TestRegistry {\n private readonly items = new Map<string, TestSpec>();\n\n register(spec: TestSpec): this {\n const key = testKey(spec.meta);\n if (this.items.has(key)) {\n throw new Error(`Duplicate TestSpec registration for ${key}`);\n }\n this.items.set(key, spec);\n return this;\n }\n\n list(): TestSpec[] {\n return [...this.items.values()];\n }\n\n get(name: string, version?: number): TestSpec | undefined {\n if (version != null) {\n return this.items.get(`${name}.v${version}`);\n }\n let latest: TestSpec | undefined;\n let maxVersion = -Infinity;\n for (const spec of this.items.values()) {\n if (spec.meta.name !== name) continue;\n if (spec.meta.version > maxVersion) {\n maxVersion = spec.meta.version;\n latest = spec;\n }\n }\n return latest;\n }\n}\n\nexport function makeTestKey(meta: TestSpecMeta) {\n return testKey(meta);\n}\n\n"],"mappings":"AA6FA,MAAM,EAAW,GAAuB,GAAG,EAAK,KAAK,IAAI,EAAK,UAE9D,IAAa,EAAb,KAA0B,CACxB,MAAyB,IAAI,IAE7B,SAAS,EAAsB,CAC7B,IAAM,EAAM,EAAQ,EAAK,KAAK,CAC9B,GAAI,KAAK,MAAM,IAAI,EAAI,CACrB,MAAU,MAAM,uCAAuC,IAAM,CAG/D,OADA,KAAK,MAAM,IAAI,EAAK,EAAK,CAClB,KAGT,MAAmB,CACjB,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAGjC,IAAI,EAAc,EAAwC,CACxD,GAAI,GAAW,KACb,OAAO,KAAK,MAAM,IAAI,GAAG,EAAK,IAAI,IAAU,CAE9C,IAAIA,EACA,EAAa,KACjB,IAAK,IAAM,KAAQ,KAAK,MAAM,QAAQ,CAChC,EAAK,KAAK,OAAS,GACnB,EAAK,KAAK,QAAU,IACtB,EAAa,EAAK,KAAK,QACvB,EAAS,GAGb,OAAO,IAIX,SAAgB,EAAY,EAAoB,CAC9C,OAAO,EAAQ,EAAK"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"themes.d.ts","names":[],"sources":["../src/themes.ts"],"sourcesContent":[],"mappings":";;;KAEY,UAAA;UAEK;EAFL,KAAA,EAGH,CAHG;EAEK,WAAA,CAAA,EAAU,MAAA;AAK3B;AAC0B,UADT,WAAA,CACS;EAAf,MAAA,CAAA,EAAA,MAAA,CAAA,MAAA,EAAe,UAAf,CAAA,MAAA,CAAA,CAAA;EACc,KAAA,CAAA,EAAf,MAAe,CAAA,MAAA,EAAA,UAAA,CAAA,MAAA,CAAA,CAAA;EAAf,KAAA,CAAA,EACA,MADA,CAAA,MAAA,EACe,UADf,CAAA,MAAA,CAAA,CAAA;EACe,UAAA,CAAA,EACV,MADU,CAAA,MAAA,EACK,UADL,CAAA,MAAA,CAAA,CAAA;EAAf,OAAA,CAAA,EAEE,MAFF,CAAA,MAAA,EAEiB,UAFjB,CAAA,MAAA,CAAA,CAAA;EACoB,MAAA,CAAA,EAEnB,MAFmB,CAAA,MAAA,EAEJ,UAFI,CAAA,MAAA,CAAA,CAAA;;AACH,UAIV,0BAAA,CAJU;EAAf,KAAA,CAAA,EAKF,MALE,CAAA,MAAA,EAAA,OAAA,CAAA;EACc,MAAA,CAAA,EAKf,WALe;;AAAT,UAQA,oBAAA,CARA;EAGA,SAAA,EAAA,MAAA;EAKA,QAAA,EAEL,MAFK,CAAA,MAAoB,EAEV,0BAAA,CAAA;AAG3B;AACS,UADQ,aAAA,CACR;EAEE,KAAA,EAFF,UAEE;EACI,MAAA,EAAA,MAAA;EAAoB,MAAA,CAAA,EADxB,WACwB;EAGlB,UAAA,CAAA,EAHF,oBAGY,EAAA;;AAIhB,UAJM,SAAA,SAAkB,aAIxB,CAAA;EAJwB,IAAA,EAAA,MAAA;EAAa,OAAA,EAAA,MAAA;EAO/B,OAAA,CAAA,EAJL,QAIc;EAClB,MAAA,CAAA,EAJG,UAIH,EAAA;;AAEO,UAHE,SAAA,CAGF;EACD,IAAA,EAHN,SAGM;EAAa,MAAA,EAFjB,WAEiB;EAGV,UAAA,CAAQ,EAJV,oBAIU,EAAA;EAQZ,SAAA,CAAA,EAXC,aAWY,EAAA;;AAWhB,UAnBO,QAAA,CAmBP;EAI6B,IAAA,EAAA,MAAA;EAAS,OAAA,EAAA,MAAA;AAehD;cA9Ba,aAAA;;iBAGI;UAQP;uCAI6B;;iBAevB,YAAA,OAAmB,YAAY"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"themes.js","names":["candidate: ThemeSpec | undefined"],"sources":["../src/themes.ts"],"sourcesContent":["import type { OwnerShipMeta } from './ownership';\n\nexport type ThemeScope = 'global' | 'tenant' | 'user';\n\nexport interface ThemeToken<T> {\n value: T;\n description?: string;\n}\n\nexport interface ThemeTokens {\n colors?: Record<string, ThemeToken<string>>;\n radii?: Record<string, ThemeToken<number>>;\n space?: Record<string, ThemeToken<number>>;\n typography?: Record<string, ThemeToken<number>>;\n shadows?: Record<string, ThemeToken<string>>;\n motion?: Record<string, ThemeToken<string>>;\n}\n\nexport interface ComponentVariantDefinition {\n props?: Record<string, unknown>;\n tokens?: ThemeTokens;\n}\n\nexport interface ComponentVariantSpec {\n component: string;\n variants: Record<string, ComponentVariantDefinition>;\n}\n\nexport interface ThemeOverride {\n scope: ThemeScope;\n target: string;\n tokens?: ThemeTokens;\n components?: ComponentVariantSpec[];\n}\n\nexport interface ThemeMeta extends OwnerShipMeta {\n name: string;\n version: number;\n extends?: ThemeRef;\n scopes?: ThemeScope[];\n}\n\nexport interface ThemeSpec {\n meta: ThemeMeta;\n tokens: ThemeTokens;\n components?: ComponentVariantSpec[];\n overrides?: ThemeOverride[];\n}\n\nexport interface ThemeRef {\n name: string;\n version: number;\n}\n\nconst themeKey = (ref: ThemeRef | ThemeMeta) =>\n `${ref.name}.v${ref.version}`;\n\nexport class ThemeRegistry {\n private readonly items = new Map<string, ThemeSpec>();\n\n register(spec: ThemeSpec): this {\n const key = themeKey(spec.meta);\n if (this.items.has(key))\n throw new Error(`Duplicate theme ${key}`);\n this.items.set(key, spec);\n return this;\n }\n\n list(): ThemeSpec[] {\n return [...this.items.values()];\n }\n\n get(name: string, version?: number): ThemeSpec | undefined {\n if (version != null) return this.items.get(themeKey({ name, version }));\n let candidate: ThemeSpec | 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 makeThemeRef(spec: ThemeSpec): ThemeRef {\n return { name: spec.meta.name, version: spec.meta.version };\n}\n\n"],"mappings":"AAsDA,MAAM,EAAY,GAChB,GAAG,EAAI,KAAK,IAAI,EAAI,UAEtB,IAAa,EAAb,KAA2B,CACzB,MAAyB,IAAI,IAE7B,SAAS,EAAuB,CAC9B,IAAM,EAAM,EAAS,EAAK,KAAK,CAC/B,GAAI,KAAK,MAAM,IAAI,EAAI,CACrB,MAAU,MAAM,mBAAmB,IAAM,CAE3C,OADA,KAAK,MAAM,IAAI,EAAK,EAAK,CAClB,KAGT,MAAoB,CAClB,MAAO,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAGjC,IAAI,EAAc,EAAyC,CACzD,GAAI,GAAW,KAAM,OAAO,KAAK,MAAM,IAAI,EAAS,CAAE,OAAM,UAAS,CAAC,CAAC,CACvE,IAAIA,EACA,EAAM,KACV,IAAK,IAAM,KAAQ,KAAK,MAAM,QAAQ,CAChC,EAAK,KAAK,OAAS,GACnB,EAAK,KAAK,QAAU,IACtB,EAAM,EAAK,KAAK,QAChB,EAAY,GAGhB,OAAO,IAIX,SAAgB,EAAa,EAA2B,CACtD,MAAO,CAAE,KAAM,EAAK,KAAK,KAAM,QAAS,EAAK,KAAK,QAAS"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"catalog.d.ts","names":[],"sources":["../../src/translations/catalog.ts"],"sourcesContent":[],"mappings":";KAAY,MAAA;AAAA,KACA,UAAA,GADM,MAAA;AACN,UAEK,gBAAA,CAFK;EAEL,GAAA,EACV,UADU;EAOA,MAAA,EALP,MAKO;EAMA,KAAA,EAAA,MAAA;EACT,OAAA,CAAA,EAAA,MAAA;;AAEY,UATH,sBAAA,CASG;EACT,IAAA,EAAA,MAAA;EAAgB,OAAA,EAAA,MAAA;EAGV,WAAA,CAAA,EAAA,MAAA;;AAEA,UATA,0BAAA,CASA;EACG,IAAA,EATZ,sBASY;EACT,aAAA,EATM,MASN;EAAgB,gBAAA,EARP,MAQO,EAAA;WAPhB;;UAGM,2BAAA;QACT;iBACS;oBACG;WACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"tenant.d.ts","names":[],"sources":["../../src/translations/tenant.ts"],"sourcesContent":[],"mappings":";;;UAEiB,yBAAA;;EAAA,KAAA,EAAA,MAAA;EAKN,aAAA,EAAA,MAAA;EACO,gBAAA,EAAA,MAAA;EACC,OAAA,EAFR,gBAEQ,EAAA;EAAM,aAAA,CAAA,EADP,MACO;mBAAN"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","names":[],"sources":["../src/types.ts"],"sourcesContent":[],"mappings":";;;;;;;;;;;KAGY,KAAA;KACA,OAAA;AAwBK,UANA,kBAAA,CAMc;EAGZ,KAAA,EAAA,MAAA;EAAL,MAAA,EAAA,OAAA,GAAA,MAAA;EAEK,MAAA,CAAA,EAAA,MAAA;;AAEE,UAPJ,cAAA,CAOI;EAAiB,MAAA,EAAA,OAAA,GAAA,MAAA;EAIrB,MAAA,CAAA,EAAA,MAAA;EAYL,SAAA,CAAA,EApBE,IAoBW,CApBN,mBAoBM,EAAA,KAAA,GAAA,KAAA,GAAA,eAAA,GAAA,OAAA,CAAA;EAChB,QAAA,CAAA,EAAA,cAAA,GAAA,IAAA;EACI,cAAA,CAAA,EApBM,kBAoBN,EAAA;EAAR,GAAA,CAAA,EAnBG,UAmBH,CAAA,KAAA,CAAA;EAAO,gBAAA,CAAA,EAlBS,iBAkBT,EAAA;EAEA,WAAA,CAAA,EAAW,QAAA,GAAA,KAIlB;AAEL;AACO,UAvBU,kBAAA,CAuBV;EACI,OAAA,EAAA,MAAA;EACN,OAAA,EAAA,MAAA;EAAO,OAAA,EAAA,MAAA;EAGA,KAAA,EAxBH,KAwBG;EAOK,OAAA,CAAA,EA9BL,OA8Be;EAKjB,KAAA,CAAA,EAAA,MAAA,EAAA;EACE,cAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAID,MAAA,CAAA,EAAA,MAAA,GAAA,IAAA;EAEG,KAAA,CAAA,EAAA,MAAA,EAAA;;AAIK,KAvCP,aAAA,GAuCO,CAAA,KAAA,EAtCV,kBAsCU,EAAA,GArCd,OAqCc,CArCN,cAqCM,CAAA;AAEA,KArCP,WAAA,GAqCO,CAAA,GAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,EAAA,GAAA,EAAA,MAAA,EAAA,GAjCd,OAiCc,CAAA,IAAA,CAAA;AAOZ,KAtCK,mBAAA,GAsCL,CAAA,GAAA,EArCA,UAqCA,EAAA,MAAA,CAAA,EApCI,MAoCJ,EAAA,GAnCF,OAmCE,CAAA,MAAA,GAAA,IAAA,CAAA,GAAA,MAAA,GAAA,IAAA;;AAIU,KApCL,cAAA,GAoCK,CAAA,QAAA,EAAA;EAEH,IAAA,EAAA,MAAA;EAED,OAAA,EAAA,MAAA;EAGD,OAAA,EAAA,OAAA;EACE,OAAA,CAAA,EAAA,MAAA;CAAmB,EAAA,GAvC3B,OAuC2B,CAAA,IAAA,CAAA;UArChB,UAAA;;;;;UAKP;YACE;;;WAID;;cAEG;;cAEA;;mBAEK;;mBAEA;;uEAOZ;;cAEO;;iBAEG;;cAEH;;aAED;;;YAGD;cACE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"db-adapter.d.ts","names":[],"sources":["../../../src/workflow/adapters/db-adapter.ts"],"sourcesContent":[],"mappings":";;;UAGU,gBAAA;;IAAA,MAAA,EAAA,CAAA,IAAA,EAAgB;MAEW,IAAA,EAAA,GAAA;IACgB,CAAA,EAAA,GADhB,OACgB,CAAA,GAAA,CAAA;IACO,UAAA,EAAA,CAAA,IAAA,EAAA;MACnB,KAAA,EAAA;QAAO,EAAA,EAAA,MAAA;MAInC,CAAA;IAC0B,CAAA,EAAA,GAPc,OAOd,CAAA,GAAA,CAAA;IAEjB,MAAA,EAAA,CAAA,IAAA,EAAA;MAAgB,KAAA,EAAA;QAiBG,EAAA,EAAA,MAAA;MAAR,CAAA;MAuBV,IAAA,EAAA,GAAA;IAAkB,CAAA,EAAA,GAhDmB,OAgDnB,CAAA,GAAA,CAAA;IAC5B,QAAA,EAAA,CAAA,IAAA,EAAA;MAAR,KAAA,CAAA,EAAA,GAAA;IAkCkB,CAAA,EAAA,GAlFkB,OAkFlB,CAAA,GAAA,EAAA,CAAA;EAA+B,CAAA;;AA9Eb,cAA5B,gBAAA,YAA4B,UAAA,CAAA;EAAU,iBAAA,MAAA;sBACZ;gBAEjB,gBAAgB;2BAiBL,QAAQ;gDAuBlB,kBAAkB,gBACpC,QAAQ;iBAkCU,uBAAuB,QAAQ"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"db-adapter.js","names":["prisma: PrismaClientLike","where: any"],"sources":["../../../src/workflow/adapters/db-adapter.ts"],"sourcesContent":["import type { StateStore, WorkflowState, WorkflowStateFilters } from '../state';\n\n// Generic interface for Prisma Client to avoid hard dependency on generated client\ninterface PrismaClientLike {\n workflowState: {\n create: (args: { data: any }) => Promise<any>;\n findUnique: (args: { where: { id: string } }) => Promise<any>;\n update: (args: { where: { id: string }; data: any }) => Promise<any>;\n findMany: (args: { where?: any }) => Promise<any[]>;\n };\n}\n\nexport class PrismaStateStore implements StateStore {\n constructor(private readonly prisma: PrismaClientLike) {}\n\n async create(state: WorkflowState): Promise<void> {\n await this.prisma.workflowState.create({\n data: {\n id: state.workflowId,\n name: state.workflowName,\n version: state.workflowVersion,\n status: state.status,\n currentStep: state.currentStep,\n data: state.data, // Assumes Prisma handles JSON\n history: state.history, // Assumes Prisma handles JSON\n retryCounts: state.retryCounts ?? {},\n createdAt: state.createdAt,\n updatedAt: state.updatedAt,\n },\n });\n }\n\n async get(workflowId: string): Promise<WorkflowState | undefined> {\n const record = await this.prisma.workflowState.findUnique({\n where: { id: workflowId },\n });\n\n if (!record) return undefined;\n\n return {\n workflowId: record.id,\n workflowName: record.name,\n workflowVersion: record.version,\n currentStep: record.currentStep,\n data: record.data as Record<string, unknown>,\n history: record.history as any[],\n retryCounts: record.retryCounts as Record<string, number>,\n status: record.status as any,\n createdAt: record.createdAt,\n updatedAt: record.updatedAt,\n };\n }\n\n async update(\n workflowId: string,\n updater: (current: WorkflowState) => WorkflowState\n ): Promise<WorkflowState> {\n const current = await this.get(workflowId);\n if (!current) {\n throw new Error(`Workflow ${workflowId} not found`);\n }\n\n const next = updater(current);\n\n const updated = await this.prisma.workflowState.update({\n where: { id: workflowId },\n data: {\n status: next.status,\n currentStep: next.currentStep,\n data: next.data,\n history: next.history,\n retryCounts: next.retryCounts,\n updatedAt: next.updatedAt,\n },\n });\n\n return {\n workflowId: updated.id,\n workflowName: updated.name,\n workflowVersion: updated.version,\n currentStep: updated.currentStep,\n data: updated.data as Record<string, unknown>,\n history: updated.history as any[],\n retryCounts: updated.retryCounts as Record<string, number>,\n status: updated.status as any,\n createdAt: updated.createdAt,\n updatedAt: updated.updatedAt,\n };\n }\n\n async list(filters?: WorkflowStateFilters): Promise<WorkflowState[]> {\n const where: any = {};\n if (filters?.status) {\n where.status = filters.status;\n }\n\n const records = await this.prisma.workflowState.findMany({\n where,\n });\n\n return records.map((record) => ({\n workflowId: record.id,\n workflowName: record.name,\n workflowVersion: record.version,\n currentStep: record.currentStep,\n data: record.data as Record<string, unknown>,\n history: record.history as any[],\n retryCounts: record.retryCounts as Record<string, number>,\n status: record.status as any,\n createdAt: record.createdAt,\n updatedAt: record.updatedAt,\n }));\n }\n}\n"],"mappings":"AAYA,IAAa,EAAb,KAAoD,CAClD,YAAY,EAA2C,CAA1B,KAAA,OAAA,EAE7B,MAAM,OAAO,EAAqC,CAChD,MAAM,KAAK,OAAO,cAAc,OAAO,CACrC,KAAM,CACJ,GAAI,EAAM,WACV,KAAM,EAAM,aACZ,QAAS,EAAM,gBACf,OAAQ,EAAM,OACd,YAAa,EAAM,YACnB,KAAM,EAAM,KACZ,QAAS,EAAM,QACf,YAAa,EAAM,aAAe,EAAE,CACpC,UAAW,EAAM,UACjB,UAAW,EAAM,UAClB,CACF,CAAC,CAGJ,MAAM,IAAI,EAAwD,CAChE,IAAM,EAAS,MAAM,KAAK,OAAO,cAAc,WAAW,CACxD,MAAO,CAAE,GAAI,EAAY,CAC1B,CAAC,CAEG,KAEL,MAAO,CACL,WAAY,EAAO,GACnB,aAAc,EAAO,KACrB,gBAAiB,EAAO,QACxB,YAAa,EAAO,YACpB,KAAM,EAAO,KACb,QAAS,EAAO,QAChB,YAAa,EAAO,YACpB,OAAQ,EAAO,OACf,UAAW,EAAO,UAClB,UAAW,EAAO,UACnB,CAGH,MAAM,OACJ,EACA,EACwB,CACxB,IAAM,EAAU,MAAM,KAAK,IAAI,EAAW,CAC1C,GAAI,CAAC,EACH,MAAU,MAAM,YAAY,EAAW,YAAY,CAGrD,IAAM,EAAO,EAAQ,EAAQ,CAEvB,EAAU,MAAM,KAAK,OAAO,cAAc,OAAO,CACrD,MAAO,CAAE,GAAI,EAAY,CACzB,KAAM,CACJ,OAAQ,EAAK,OACb,YAAa,EAAK,YAClB,KAAM,EAAK,KACX,QAAS,EAAK,QACd,YAAa,EAAK,YAClB,UAAW,EAAK,UACjB,CACF,CAAC,CAEF,MAAO,CACL,WAAY,EAAQ,GACpB,aAAc,EAAQ,KACtB,gBAAiB,EAAQ,QACzB,YAAa,EAAQ,YACrB,KAAM,EAAQ,KACd,QAAS,EAAQ,QACjB,YAAa,EAAQ,YACrB,OAAQ,EAAQ,OAChB,UAAW,EAAQ,UACnB,UAAW,EAAQ,UACpB,CAGH,MAAM,KAAK,EAA0D,CACnE,IAAMC,EAAa,EAAE,CASrB,OARI,GAAS,SACX,EAAM,OAAS,EAAQ,SAGT,MAAM,KAAK,OAAO,cAAc,SAAS,CACvD,QACD,CAAC,EAEa,IAAK,IAAY,CAC9B,WAAY,EAAO,GACnB,aAAc,EAAO,KACrB,gBAAiB,EAAO,QACxB,YAAa,EAAO,YACpB,KAAM,EAAO,KACb,QAAS,EAAO,QAChB,YAAa,EAAO,YACpB,OAAQ,EAAO,OACf,UAAW,EAAO,UAClB,UAAW,EAAO,UACnB,EAAE"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-adapter.d.ts","names":[],"sources":["../../../src/workflow/adapters/file-adapter.ts"],"sourcesContent":[],"mappings":";;;UAEiB,qBAAA;;EAAA,QAAA,EAAA,MAAA;AASjB;;;;;iBAAgB,oBAAA,WACJ,wBACT"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"file-adapter.js","names":[],"sources":["../../../src/workflow/adapters/file-adapter.ts"],"sourcesContent":["import type { StateStore } from '../state';\n\nexport interface FileStateStoreOptions {\n /** Absolute or relative path to the persistence file. */\n filePath: string;\n}\n\n/**\n * Placeholder for a file-backed state store adapter.\n * Implementations should manage locking/concurrency and JSON serialization.\n */\nexport function createFileStateStore(\n _options: FileStateStoreOptions\n): StateStore {\n throw new Error(\n 'File-backed state store adapter not implemented. Provide a custom adapter that satisfies StateStore.'\n );\n}\n\n"],"mappings":"AAWA,SAAgB,EACd,EACY,CACZ,MAAU,MACR,uGACD"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-store.d.ts","names":[],"sources":["../../../src/workflow/adapters/memory-store.ts"],"sourcesContent":[],"mappings":";;;;;;AA4BA;;AAGsC,cAHzB,kBAAA,YAA8B,UAGL,CAAA;EAMG,iBAAA,KAAA;EAAR,MAAA,CAAA,KAAA,EANX,aAMW,CAAA,EANK,OAML,CAAA,IAAA,CAAA;EAOV,GAAA,CAAA,UAAA,EAAA,MAAA,CAAA,EAPU,OAOV,CAPkB,aAOlB,GAAA,SAAA,CAAA;EAAkB,MAAA,CAAA,UAAA,EAAA,MAAA,EAAA,OAAA,EAAA,CAAA,OAAA,EAAlB,aAAkB,EAAA,GAAA,aAAA,CAAA,EACpC,OADoC,CAC5B,aAD4B,CAAA;EAC5B,IAAA,CAAA,OAAA,CAAA,EASU,oBATV,CAAA,EASiC,OATjC,CASyC,aATzC,EAAA,CAAA;EAAR,KAAA,CAAA,CAAA,EAAA,IAAA"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"memory-store.js","names":["result: Record<string, unknown>"],"sources":["../../../src/workflow/adapters/memory-store.ts"],"sourcesContent":["import type {\n StateStore,\n WorkflowState,\n WorkflowStateFilters,\n} from '../state';\n\nfunction cloneState(state: WorkflowState): WorkflowState {\n return {\n ...state,\n data: deepCopy(state.data),\n history: state.history.map((execution) => ({\n ...execution,\n input: deepCopy(execution.input),\n output: deepCopy(execution.output),\n startedAt: new Date(execution.startedAt),\n completedAt: execution.completedAt\n ? new Date(execution.completedAt)\n : undefined,\n })),\n createdAt: new Date(state.createdAt),\n updatedAt: new Date(state.updatedAt),\n };\n}\n\n/**\n * Naive in-memory state store. Suitable for tests and single-node development\n * environments. Swap with a database-backed adapter in production.\n */\nexport class InMemoryStateStore implements StateStore {\n private readonly items = new Map<string, WorkflowState>();\n\n async create(state: WorkflowState): Promise<void> {\n if (this.items.has(state.workflowId))\n throw new Error(`Workflow state already exists: ${state.workflowId}`);\n this.items.set(state.workflowId, cloneState(state));\n }\n\n async get(workflowId: string): Promise<WorkflowState | undefined> {\n const state = this.items.get(workflowId);\n return state ? cloneState(state) : undefined;\n }\n\n async update(\n workflowId: string,\n updater: (current: WorkflowState) => WorkflowState\n ): Promise<WorkflowState> {\n const current = this.items.get(workflowId);\n if (!current)\n throw new Error(`Workflow state not found for ${workflowId}`);\n const next = cloneState(updater(cloneState(current)));\n this.items.set(workflowId, next);\n return cloneState(next);\n }\n\n async list(filters?: WorkflowStateFilters): Promise<WorkflowState[]> {\n const all = [...this.items.values()];\n const filtered = filters?.status\n ? all.filter((state) => state.status === filters.status)\n : all;\n return filtered.map(cloneState);\n }\n\n clear() {\n this.items.clear();\n }\n}\n\nfunction deepCopy<T>(value: T): T {\n if (value instanceof Date) return new Date(value.getTime()) as T;\n if (Array.isArray(value)) return value.map((item) => deepCopy(item)) as T;\n if (value && typeof value === 'object') {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(value as Record<string, unknown>)) {\n result[key] = deepCopy(val);\n }\n return result as T;\n }\n return value;\n}\n\n"],"mappings":"AAMA,SAAS,EAAW,EAAqC,CACvD,MAAO,CACL,GAAG,EACH,KAAM,EAAS,EAAM,KAAK,CAC1B,QAAS,EAAM,QAAQ,IAAK,IAAe,CACzC,GAAG,EACH,MAAO,EAAS,EAAU,MAAM,CAChC,OAAQ,EAAS,EAAU,OAAO,CAClC,UAAW,IAAI,KAAK,EAAU,UAAU,CACxC,YAAa,EAAU,YACnB,IAAI,KAAK,EAAU,YAAY,CAC/B,IAAA,GACL,EAAE,CACH,UAAW,IAAI,KAAK,EAAM,UAAU,CACpC,UAAW,IAAI,KAAK,EAAM,UAAU,CACrC,CAOH,IAAa,EAAb,KAAsD,CACpD,MAAyB,IAAI,IAE7B,MAAM,OAAO,EAAqC,CAChD,GAAI,KAAK,MAAM,IAAI,EAAM,WAAW,CAClC,MAAU,MAAM,kCAAkC,EAAM,aAAa,CACvE,KAAK,MAAM,IAAI,EAAM,WAAY,EAAW,EAAM,CAAC,CAGrD,MAAM,IAAI,EAAwD,CAChE,IAAM,EAAQ,KAAK,MAAM,IAAI,EAAW,CACxC,OAAO,EAAQ,EAAW,EAAM,CAAG,IAAA,GAGrC,MAAM,OACJ,EACA,EACwB,CACxB,IAAM,EAAU,KAAK,MAAM,IAAI,EAAW,CAC1C,GAAI,CAAC,EACH,MAAU,MAAM,gCAAgC,IAAa,CAC/D,IAAM,EAAO,EAAW,EAAQ,EAAW,EAAQ,CAAC,CAAC,CAErD,OADA,KAAK,MAAM,IAAI,EAAY,EAAK,CACzB,EAAW,EAAK,CAGzB,MAAM,KAAK,EAA0D,CACnE,IAAM,EAAM,CAAC,GAAG,KAAK,MAAM,QAAQ,CAAC,CAIpC,OAHiB,GAAS,OACtB,EAAI,OAAQ,GAAU,EAAM,SAAW,EAAQ,OAAO,CACtD,GACY,IAAI,EAAW,CAGjC,OAAQ,CACN,KAAK,MAAM,OAAO,GAItB,SAAS,EAAY,EAAa,CAChC,GAAI,aAAiB,KAAM,OAAO,IAAI,KAAK,EAAM,SAAS,CAAC,CAC3D,GAAI,MAAM,QAAQ,EAAM,CAAE,OAAO,EAAM,IAAK,GAAS,EAAS,EAAK,CAAC,CACpE,GAAI,GAAS,OAAO,GAAU,SAAU,CACtC,IAAMA,EAAkC,EAAE,CAC1C,IAAK,GAAM,CAAC,EAAK,KAAQ,OAAO,QAAQ,EAAiC,CACvE,EAAO,GAAO,EAAS,EAAI,CAE7B,OAAO,EAET,OAAO"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"expression.d.ts","names":[],"sources":["../../src/workflow/expression.ts"],"sourcesContent":[],"mappings":";UAAiB,iBAAA;EAAA,IAAA,EACT,MADS,CAAA,MAAA,EAAiB,OAAA,CAAA;EAMlB,KAAA,CAAA,EAAA,OAAA;;;iBAAA,kBAAA,sCAET"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"expression.js","names":["current: any","parts: string[]"],"sources":["../../src/workflow/expression.ts"],"sourcesContent":["export interface ExpressionContext {\n data: Record<string, unknown>;\n input?: unknown;\n output?: unknown;\n}\n\nexport function evaluateExpression(\n expression: string | undefined,\n ctx: ExpressionContext\n): boolean {\n if (!expression) return true;\n const trimmed = expression.trim();\n if (!trimmed) return true;\n\n const orParts = splitByOperator(trimmed, '||');\n if (orParts.length > 1) return orParts.some((part) => evaluateExpression(part, ctx));\n\n const andParts = splitByOperator(trimmed, '&&');\n if (andParts.length > 1) return andParts.every((part) => evaluateExpression(part, ctx));\n\n return evaluateSingle(trimmed, ctx);\n}\n\nfunction evaluateSingle(expr: string, ctx: ExpressionContext): boolean {\n const trimmed = expr.trim();\n if (!trimmed) return true;\n if (trimmed.startsWith('!')) return !evaluateSingle(trimmed.slice(1), ctx);\n\n const comparisonMatch = trimmed.match(\n /^(data|input|output)\\.([A-Za-z0-9_.\\[\\]]+)\\s*(===|==|!==|!=|>=|<=|>|<)\\s*(.+)$/\n );\n if (comparisonMatch) {\n const [, root, path, operator, rawRight] = comparisonMatch as [\n string,\n string,\n string,\n ComparisonOperator,\n string\n ];\n const left = resolveRoot(root, ctx, path);\n const right = parseLiteral(rawRight);\n return compare(left, right, operator);\n }\n\n const truthyMatch = trimmed.match(/^(data|input|output)\\.([A-Za-z0-9_.\\[\\]]+)$/);\n if (truthyMatch) {\n const [, root, path] = truthyMatch as [string, string, string];\n const value = resolveRoot(root, ctx, path);\n return Boolean(value);\n }\n\n const literal = parseLiteral(trimmed);\n return Boolean(literal);\n}\n\ntype ComparisonOperator = '===' | '==' | '!==' | '!=' | '>=' | '<=' | '>' | '<';\n\nfunction compare(\n left: unknown,\n right: unknown,\n operator: ComparisonOperator\n): boolean {\n switch (operator) {\n case '===':\n case '==':\n return left === right;\n case '!==':\n case '!=':\n return left !== right;\n case '>':\n return Number(left) > Number(right);\n case '>=':\n return Number(left) >= Number(right);\n case '<':\n return Number(left) < Number(right);\n case '<=':\n return Number(left) <= Number(right);\n default:\n return false;\n }\n}\n\nfunction parseLiteral(value: string): unknown {\n const trimmed = (value ?? '').trim();\n if (\n (trimmed.startsWith('\"') && trimmed.endsWith('\"')) ||\n (trimmed.startsWith(\"'\") && trimmed.endsWith(\"'\"))\n )\n return trimmed.slice(1, -1);\n if (/^-?\\d+(\\.\\d+)?$/.test(trimmed)) return Number(trimmed);\n if (/^true$/i.test(trimmed)) return true;\n if (/^false$/i.test(trimmed)) return false;\n if (/^null$/i.test(trimmed)) return null;\n if (/^undefined$/i.test(trimmed)) return undefined;\n return trimmed;\n}\n\nfunction resolveRoot(\n root: string,\n ctx: ExpressionContext,\n path: string\n): unknown {\n const source =\n root === 'data'\n ? ctx.data\n : root === 'input'\n ? ctx.input\n : ctx.output;\n return resolvePath(source, path);\n}\n\nfunction resolvePath(source: unknown, path: string): unknown {\n if (source == null) return undefined;\n if (!path) return source;\n const segments = path\n .replace(/\\[(\\d+)\\]/g, '.$1')\n .split('.')\n .filter(Boolean);\n\n let current: any = source;\n for (const segment of segments) {\n if (current == null) return undefined;\n current = current[segment as keyof typeof current];\n }\n return current;\n}\n\nfunction splitByOperator(expr: string, operator: '&&' | '||'): string[] {\n const parts: string[] = [];\n let buffer = '';\n let inSingleQuote = false;\n let inDoubleQuote = false;\n\n for (let i = 0; i < expr.length; i++) {\n const char = expr[i]!;\n const next = expr.slice(i, i + operator.length);\n\n if (char === \"'\" && !inDoubleQuote) {\n inSingleQuote = !inSingleQuote;\n buffer += char;\n continue;\n }\n if (char === '\"' && !inSingleQuote) {\n inDoubleQuote = !inDoubleQuote;\n buffer += char;\n continue;\n }\n\n if (!inSingleQuote && !inDoubleQuote && next === operator) {\n parts.push(buffer.trim());\n buffer = '';\n i += operator.length - 1;\n continue;\n }\n\n buffer += char;\n }\n\n if (buffer.trim().length) parts.push(buffer.trim());\n return parts;\n}\n\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"runner.d.ts","names":[],"sources":["../../src/workflow/runner.ts"],"sourcesContent":[],"mappings":";;;;;;;;;UAqBiB,wBAAA;YACL;EADK,IAAA,EAET,IAFS;EACL,iBAAA,CAAA,EAEU,iBAFV;EACJ,YAAA,CAAA,EAES,mBAFT,EAAA;EACc,SAAA,CAAA,EAER,iBAFQ,EAAA;EACL,QAAA,CAAA,EAEJ,gBAFI;EACH,WAAA,CAAA,EAEE,mBAFF;EACD,mBAAA,CAAA,EAEW,mBAFX;EACG,cAAA,CAAA,EAEG,cAFH;;AAEG,KAGP,iBAAA,GAHO,CAAA,EAAA,EAIb,KAJa,EAAA,KAAA,EAAA,OAAA,EAAA,OAAA,EAMR,wBANQ,EAAA,GAOd,OAPc,CAAA,OAAA,CAAA;AAAc,KASrB,0BAAA,GATqB,aAAA,GAAA,YAAA;AAGrB,KAQA,8BAAA,GARiB,OAAA,GAAA,SAAA;AACvB,UASW,sBAAA,CATX;EAEK,MAAA,EAAA,MAAA;EACN,IAAA,EAQG,0BARH;EAAO,UAAA,EAAA,MAAA;EAEA,QAAA,EAQA,8BAR0B;EAE1B,MAAA,EAAA,MAAA;AAEZ;AAQiB,UAAA,uBAAA,CAAuB;EAKvB,QAAA,EAAA,OAAY;EAMjB,MAAA,EATF,sBASgB,EAAA;;AAEf,UARM,YAAA,CAQN;EACN,QAAA,EARO,aAQP;EAAO,IAAA,EAPJ,IAOI;EAEK,KAAA,CAAA,EAAA,OAAA;;AAEH,KAPF,cAAA,GAOE,CAAA,KAAA,EANL,cAMK,EAAA,OAAA,EALH,YAKG,EAAA,GAJT,OAIS,CAAA,OAAA,CAAA,GAAA,OAAA;AACA,UAHG,oBAAA,CAGH;EACK,QAAA,EAHP,gBAGO;EACuB,UAAA,EAH5B,UAG4B;EAE/B,UAAA,EAJG,iBAIH;EACJ,cAAA,CAAA,EAJY,cAIZ;EAAwC,YAAA,CAAA,EAAA,CAAA,KAAA,EAAA,MAAA,EAAA,OAAA,EAHL,MAGK,CAAA,MAAA,EAAA,OAAA,CAAA,EAAA,GAAA,IAAA;EAAR,iBAAA,CAAA,EAAA,CAAA,KAAA,EAD5B,aAC4B,EAAA,GAAhC,iBAAgC,GAAA,SAAA,GAAA,OAAA,CAAQ,iBAAR,GAAA,SAAA,CAAA;EAExB,mBAAA,CAAA,EAAA,CAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EACF,wBADE,EAAA,GAAA,IAAA,GAED,OAFC,CAAA,IAAA,CAAA;EACF,cAAA,CAAA,EAEM,cAFN;EACC,mBAAA,CAAA,EAEU,mBAFV;;AAEU,cAGX,cAAA,CAHW;EAAmB,iBAAA,MAAA;EAG9B,WAAA,CAAA,MAAc,EACY,oBADZ;EACY,cAAA,CAAA,YAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,MAAA,EAAA,cAAA,CAAA,EAKlB,iBALkB,CAAA,EAMlC,OANkC,CAM1B,uBAN0B,CAAA;EAKlB,KAAA,CAAA,YAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,MAAA,EAAA,WAAA,CAAA,EASH,MATG,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA,EAUhB,OAVgB,CAAA,MAAA,CAAA;EACR,WAAA,CAAA,UAAA,EAAA,MAAA,EAAA,KAAA,CAAA,EAAA,OAAA,CAAA,EAkD6C,OAlD7C,CAAA,IAAA,CAAA;EAAR,QAAA,CAAA,UAAA,EAAA,MAAA,CAAA,EAkLiC,OAlLjC,CAAA,IAAA,CAAA;EAQa,QAAA,CAAA,UAAA,EAAA,MAAA,CAAA,EAwPoB,OAxPpB,CAwP4B,aAxP5B,CAAA;EACb,MAAA,CAAA,UAAA,EAAA,MAAA,CAAA,EA2P+B,OA3P/B,CAAA,IAAA,CAAA;EAyCqD,QAAA,gBAAA;EAgIpB,QAAA,aAAA;EA8EQ,QAAA,aAAA;EAAR,QAAA,cAAA;EAIF,QAAA,OAAA;EAAO,QAAA,eAAA;EAmO9B,QAAA,IAAA;;AACyB,cADzB,sBAAA,SAA+B,KAAA,CACN;EADM,SAAA,MAAA,EACN,sBADM,EAAA;EAAK,WAAA,CAAA,MAAA,EACX,sBADW,EAAA"}