@plures/praxis 0.2.1 → 1.0.1

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 (486) hide show
  1. package/README.md +191 -64
  2. package/core/codegen/docs-generator.ts +808 -0
  3. package/core/codegen/index.ts +27 -0
  4. package/core/codegen/ts-generator.ts +15 -0
  5. package/core/db-adapter/index.ts +52 -0
  6. package/core/db-adapter/sync-engine.ts +450 -0
  7. package/core/logic-engine/engine.ts +12 -0
  8. package/core/logic-engine/index.ts +16 -0
  9. package/core/logic-engine/protocol.ts +16 -0
  10. package/core/logic-engine/psf-adapter.ts +269 -0
  11. package/core/logic-engine/rules.ts +16 -0
  12. package/core/schema-engine/compiler.ts +431 -0
  13. package/core/schema-engine/generator.ts +635 -0
  14. package/core/schema-engine/index.ts +18 -0
  15. package/core/schema-engine/psf.ts +664 -0
  16. package/core/schema-engine/types.ts +63 -0
  17. package/core/schema-engine/validator.ts +541 -0
  18. package/dist/core/codegen/docs-generator.d.ts +123 -0
  19. package/dist/core/codegen/docs-generator.d.ts.map +1 -0
  20. package/dist/core/codegen/docs-generator.js +674 -0
  21. package/dist/core/codegen/docs-generator.js.map +1 -0
  22. package/dist/core/codegen/index.d.ts +11 -0
  23. package/dist/core/codegen/index.d.ts.map +1 -0
  24. package/dist/core/codegen/index.js +13 -0
  25. package/dist/core/codegen/index.js.map +1 -0
  26. package/dist/core/codegen/ts-generator.d.ts +8 -0
  27. package/dist/core/codegen/ts-generator.d.ts.map +1 -0
  28. package/dist/core/codegen/ts-generator.js +8 -0
  29. package/dist/core/codegen/ts-generator.js.map +1 -0
  30. package/dist/core/db-adapter/index.d.ts +18 -0
  31. package/dist/core/db-adapter/index.d.ts.map +1 -0
  32. package/dist/core/db-adapter/index.js +23 -0
  33. package/dist/core/db-adapter/index.js.map +1 -0
  34. package/dist/core/db-adapter/sync-engine.d.ts +180 -0
  35. package/dist/core/db-adapter/sync-engine.d.ts.map +1 -0
  36. package/dist/core/db-adapter/sync-engine.js +342 -0
  37. package/dist/core/db-adapter/sync-engine.js.map +1 -0
  38. package/dist/core/logic-engine/engine.d.ts +8 -0
  39. package/dist/core/logic-engine/engine.d.ts.map +1 -0
  40. package/dist/core/logic-engine/engine.js +8 -0
  41. package/dist/core/logic-engine/engine.js.map +1 -0
  42. package/dist/core/logic-engine/index.d.ts +16 -0
  43. package/dist/core/logic-engine/index.d.ts.map +1 -0
  44. package/dist/core/logic-engine/index.js +16 -0
  45. package/dist/core/logic-engine/index.js.map +1 -0
  46. package/dist/core/logic-engine/protocol.d.ts +7 -0
  47. package/dist/core/logic-engine/protocol.d.ts.map +1 -0
  48. package/dist/core/logic-engine/protocol.js +7 -0
  49. package/dist/core/logic-engine/protocol.js.map +1 -0
  50. package/dist/core/logic-engine/psf-adapter.d.ts +88 -0
  51. package/dist/core/logic-engine/psf-adapter.d.ts.map +1 -0
  52. package/dist/core/logic-engine/psf-adapter.js +207 -0
  53. package/dist/core/logic-engine/psf-adapter.js.map +1 -0
  54. package/dist/core/logic-engine/rules.d.ts +7 -0
  55. package/dist/core/logic-engine/rules.d.ts.map +1 -0
  56. package/dist/core/logic-engine/rules.js +7 -0
  57. package/dist/core/logic-engine/rules.js.map +1 -0
  58. package/dist/core/schema-engine/compiler.d.ts +198 -0
  59. package/dist/core/schema-engine/compiler.d.ts.map +1 -0
  60. package/dist/core/schema-engine/compiler.js +262 -0
  61. package/dist/core/schema-engine/compiler.js.map +1 -0
  62. package/dist/core/schema-engine/generator.d.ts +115 -0
  63. package/dist/core/schema-engine/generator.d.ts.map +1 -0
  64. package/dist/core/schema-engine/generator.js +506 -0
  65. package/dist/core/schema-engine/generator.js.map +1 -0
  66. package/dist/core/schema-engine/index.d.ts +18 -0
  67. package/dist/core/schema-engine/index.d.ts.map +1 -0
  68. package/dist/core/schema-engine/index.js +18 -0
  69. package/dist/core/schema-engine/index.js.map +1 -0
  70. package/dist/core/schema-engine/psf.d.ts +612 -0
  71. package/dist/core/schema-engine/psf.d.ts.map +1 -0
  72. package/dist/core/schema-engine/psf.js +45 -0
  73. package/dist/core/schema-engine/psf.js.map +1 -0
  74. package/dist/core/schema-engine/types.d.ts +10 -0
  75. package/dist/core/schema-engine/types.d.ts.map +1 -0
  76. package/dist/core/schema-engine/types.js +7 -0
  77. package/dist/core/schema-engine/types.js.map +1 -0
  78. package/dist/core/schema-engine/validator.d.ts +140 -0
  79. package/dist/core/schema-engine/validator.d.ts.map +1 -0
  80. package/dist/core/schema-engine/validator.js +407 -0
  81. package/dist/core/schema-engine/validator.js.map +1 -0
  82. package/dist/src/adapters/cli.d.ts.map +1 -0
  83. package/dist/src/adapters/cli.js.map +1 -0
  84. package/dist/src/cli/commands/auth.d.ts.map +1 -0
  85. package/dist/src/cli/commands/auth.js.map +1 -0
  86. package/dist/src/cli/commands/build.d.ts +23 -0
  87. package/dist/src/cli/commands/build.d.ts.map +1 -0
  88. package/dist/src/cli/commands/build.js +162 -0
  89. package/dist/src/cli/commands/build.js.map +1 -0
  90. package/dist/src/cli/commands/canvas.d.ts +23 -0
  91. package/dist/src/cli/commands/canvas.d.ts.map +1 -0
  92. package/dist/src/cli/commands/canvas.js +215 -0
  93. package/dist/src/cli/commands/canvas.js.map +1 -0
  94. package/dist/src/cli/commands/cloud.d.ts.map +1 -0
  95. package/dist/src/cli/commands/cloud.js.map +1 -0
  96. package/dist/src/cli/commands/create.d.ts +21 -0
  97. package/dist/src/cli/commands/create.d.ts.map +1 -0
  98. package/dist/src/cli/commands/create.js +621 -0
  99. package/dist/src/cli/commands/create.js.map +1 -0
  100. package/dist/src/cli/commands/dev.d.ts +21 -0
  101. package/dist/src/cli/commands/dev.d.ts.map +1 -0
  102. package/dist/src/cli/commands/dev.js +71 -0
  103. package/dist/src/cli/commands/dev.js.map +1 -0
  104. package/dist/src/cli/commands/generate.d.ts.map +1 -0
  105. package/dist/src/cli/commands/generate.js.map +1 -0
  106. package/dist/src/cli/commands/orchestrate.d.ts +44 -0
  107. package/dist/src/cli/commands/orchestrate.d.ts.map +1 -0
  108. package/dist/src/cli/commands/orchestrate.js +150 -0
  109. package/dist/src/cli/commands/orchestrate.js.map +1 -0
  110. package/dist/{cli → src/cli}/index.d.ts.map +1 -1
  111. package/dist/{cli → src/cli}/index.js +53 -21
  112. package/dist/src/cli/index.js.map +1 -0
  113. package/dist/src/cloud/auth.d.ts.map +1 -0
  114. package/dist/src/cloud/auth.js.map +1 -0
  115. package/dist/src/cloud/billing.d.ts.map +1 -0
  116. package/dist/src/cloud/billing.js.map +1 -0
  117. package/dist/src/cloud/client.d.ts.map +1 -0
  118. package/dist/src/cloud/client.js.map +1 -0
  119. package/dist/src/cloud/index.d.ts.map +1 -0
  120. package/dist/src/cloud/index.js.map +1 -0
  121. package/dist/src/cloud/marketplace.d.ts.map +1 -0
  122. package/dist/src/cloud/marketplace.js.map +1 -0
  123. package/dist/src/cloud/provisioning.d.ts.map +1 -0
  124. package/dist/src/cloud/provisioning.js.map +1 -0
  125. package/dist/src/cloud/relay/endpoints.d.ts.map +1 -0
  126. package/dist/src/cloud/relay/endpoints.js.map +1 -0
  127. package/dist/src/cloud/relay/health/index.d.ts.map +1 -0
  128. package/dist/src/cloud/relay/health/index.js.map +1 -0
  129. package/dist/src/cloud/relay/stats/index.d.ts.map +1 -0
  130. package/dist/src/cloud/relay/stats/index.js.map +1 -0
  131. package/dist/src/cloud/relay/sync/index.d.ts.map +1 -0
  132. package/dist/src/cloud/relay/sync/index.js.map +1 -0
  133. package/dist/src/cloud/relay/usage/index.d.ts.map +1 -0
  134. package/dist/src/cloud/relay/usage/index.js.map +1 -0
  135. package/dist/src/cloud/sponsors.d.ts.map +1 -0
  136. package/dist/src/cloud/sponsors.js.map +1 -0
  137. package/dist/src/cloud/types.d.ts.map +1 -0
  138. package/dist/src/cloud/types.js.map +1 -0
  139. package/dist/src/components/index.d.ts.map +1 -0
  140. package/dist/src/components/index.js.map +1 -0
  141. package/dist/src/core/actors.d.ts.map +1 -0
  142. package/dist/src/core/actors.js.map +1 -0
  143. package/dist/src/core/component/generator.d.ts.map +1 -0
  144. package/dist/{core → src/core}/component/generator.js +45 -3
  145. package/dist/src/core/component/generator.js.map +1 -0
  146. package/dist/src/core/engine.d.ts.map +1 -0
  147. package/dist/src/core/engine.js.map +1 -0
  148. package/dist/src/core/introspection.d.ts.map +1 -0
  149. package/dist/src/core/introspection.js.map +1 -0
  150. package/dist/src/core/logic/generator.d.ts.map +1 -0
  151. package/dist/{core → src/core}/logic/generator.js +35 -4
  152. package/dist/src/core/logic/generator.js.map +1 -0
  153. package/dist/src/core/pluresdb/adapter.d.ts +72 -0
  154. package/dist/src/core/pluresdb/adapter.d.ts.map +1 -0
  155. package/dist/src/core/pluresdb/adapter.js +73 -0
  156. package/dist/src/core/pluresdb/adapter.js.map +1 -0
  157. package/dist/src/core/pluresdb/generator.d.ts.map +1 -0
  158. package/dist/{core → src/core}/pluresdb/generator.js +33 -4
  159. package/dist/src/core/pluresdb/generator.js.map +1 -0
  160. package/dist/src/core/pluresdb/index.d.ts +15 -0
  161. package/dist/src/core/pluresdb/index.d.ts.map +1 -0
  162. package/dist/src/core/pluresdb/index.js +11 -0
  163. package/dist/src/core/pluresdb/index.js.map +1 -0
  164. package/dist/src/core/pluresdb/schema-registry.d.ts +104 -0
  165. package/dist/src/core/pluresdb/schema-registry.d.ts.map +1 -0
  166. package/dist/src/core/pluresdb/schema-registry.js +130 -0
  167. package/dist/src/core/pluresdb/schema-registry.js.map +1 -0
  168. package/dist/src/core/pluresdb/store.d.ts +199 -0
  169. package/dist/src/core/pluresdb/store.d.ts.map +1 -0
  170. package/dist/src/core/pluresdb/store.js +344 -0
  171. package/dist/src/core/pluresdb/store.js.map +1 -0
  172. package/dist/src/core/protocol.d.ts.map +1 -0
  173. package/dist/src/core/protocol.js.map +1 -0
  174. package/dist/src/core/rules.d.ts.map +1 -0
  175. package/dist/src/core/rules.js.map +1 -0
  176. package/dist/src/core/schema/loader.d.ts.map +1 -0
  177. package/dist/src/core/schema/loader.js.map +1 -0
  178. package/dist/src/core/schema/normalize.d.ts.map +1 -0
  179. package/dist/src/core/schema/normalize.js.map +1 -0
  180. package/dist/src/core/schema/types.d.ts.map +1 -0
  181. package/dist/src/core/schema/types.js.map +1 -0
  182. package/dist/src/dsl/index.d.ts.map +1 -0
  183. package/dist/src/dsl/index.js.map +1 -0
  184. package/dist/src/dsl.d.ts.map +1 -0
  185. package/dist/src/dsl.js.map +1 -0
  186. package/dist/src/examples/advanced-todo/index.d.ts.map +1 -0
  187. package/dist/src/examples/advanced-todo/index.js.map +1 -0
  188. package/dist/src/examples/auth-basic/index.d.ts.map +1 -0
  189. package/dist/src/examples/auth-basic/index.js.map +1 -0
  190. package/dist/src/examples/cart/index.d.ts.map +1 -0
  191. package/dist/src/examples/cart/index.js.map +1 -0
  192. package/dist/src/examples/hero-ecommerce/index.d.ts.map +1 -0
  193. package/dist/src/examples/hero-ecommerce/index.js.map +1 -0
  194. package/dist/src/examples/svelte-counter/index.d.ts.map +1 -0
  195. package/dist/src/examples/svelte-counter/index.js.map +1 -0
  196. package/dist/src/flows.d.ts.map +1 -0
  197. package/dist/src/flows.js.map +1 -0
  198. package/dist/{index.d.ts → src/index.d.ts} +12 -2
  199. package/dist/src/index.d.ts.map +1 -0
  200. package/dist/{index.js → src/index.js} +6 -1
  201. package/dist/src/index.js.map +1 -0
  202. package/dist/src/integrations/code-canvas.d.ts +265 -0
  203. package/dist/src/integrations/code-canvas.d.ts.map +1 -0
  204. package/dist/src/integrations/code-canvas.js +451 -0
  205. package/dist/src/integrations/code-canvas.js.map +1 -0
  206. package/dist/src/integrations/pluresdb.d.ts +117 -0
  207. package/dist/src/integrations/pluresdb.d.ts.map +1 -0
  208. package/dist/src/integrations/pluresdb.js +117 -0
  209. package/dist/src/integrations/pluresdb.js.map +1 -0
  210. package/dist/src/integrations/state-docs.d.ts +191 -0
  211. package/dist/src/integrations/state-docs.d.ts.map +1 -0
  212. package/dist/src/integrations/state-docs.js +515 -0
  213. package/dist/src/integrations/state-docs.js.map +1 -0
  214. package/dist/src/integrations/svelte.d.ts.map +1 -0
  215. package/dist/src/integrations/svelte.js.map +1 -0
  216. package/dist/src/integrations/tauri.d.ts +360 -0
  217. package/dist/src/integrations/tauri.d.ts.map +1 -0
  218. package/dist/src/integrations/tauri.js +278 -0
  219. package/dist/src/integrations/tauri.js.map +1 -0
  220. package/dist/src/integrations/unum.d.ts +159 -0
  221. package/dist/src/integrations/unum.d.ts.map +1 -0
  222. package/dist/src/integrations/unum.js +240 -0
  223. package/dist/src/integrations/unum.js.map +1 -0
  224. package/dist/src/registry.d.ts.map +1 -0
  225. package/dist/src/registry.js.map +1 -0
  226. package/dist/{runtime → src/runtime}/terminal-adapter.d.ts +58 -7
  227. package/dist/src/runtime/terminal-adapter.d.ts.map +1 -0
  228. package/dist/src/runtime/terminal-adapter.js +239 -0
  229. package/dist/src/runtime/terminal-adapter.js.map +1 -0
  230. package/dist/src/step.d.ts.map +1 -0
  231. package/dist/src/step.js.map +1 -0
  232. package/dist/src/types.d.ts.map +1 -0
  233. package/dist/{cloud → src}/types.js.map +1 -1
  234. package/dist/tools/cli/commands/index.d.ts +7 -0
  235. package/dist/tools/cli/commands/index.d.ts.map +1 -0
  236. package/dist/tools/cli/commands/index.js +7 -0
  237. package/dist/tools/cli/commands/index.js.map +1 -0
  238. package/dist/tools/cli/index.d.ts +8 -0
  239. package/dist/tools/cli/index.d.ts.map +1 -0
  240. package/dist/tools/cli/index.js +9 -0
  241. package/dist/tools/cli/index.js.map +1 -0
  242. package/dist/tools/watcher/index.d.ts +105 -0
  243. package/dist/tools/watcher/index.d.ts.map +1 -0
  244. package/dist/tools/watcher/index.js +213 -0
  245. package/dist/tools/watcher/index.js.map +1 -0
  246. package/dist/ui/canvas/canvas-projection.d.ts +78 -0
  247. package/dist/ui/canvas/canvas-projection.d.ts.map +1 -0
  248. package/dist/ui/canvas/canvas-projection.js +416 -0
  249. package/dist/ui/canvas/canvas-projection.js.map +1 -0
  250. package/dist/ui/canvas/canvas-state.d.ts +200 -0
  251. package/dist/ui/canvas/canvas-state.d.ts.map +1 -0
  252. package/dist/ui/canvas/canvas-state.js +464 -0
  253. package/dist/ui/canvas/canvas-state.js.map +1 -0
  254. package/dist/ui/canvas/components/index.d.ts +95 -0
  255. package/dist/ui/canvas/components/index.d.ts.map +1 -0
  256. package/dist/ui/canvas/components/index.js +19 -0
  257. package/dist/ui/canvas/components/index.js.map +1 -0
  258. package/dist/ui/canvas/index.d.ts +32 -0
  259. package/dist/ui/canvas/index.d.ts.map +1 -0
  260. package/dist/ui/canvas/index.js +32 -0
  261. package/dist/ui/canvas/index.js.map +1 -0
  262. package/dist/ui/svelte-generator/index.d.ts +9 -0
  263. package/dist/ui/svelte-generator/index.d.ts.map +1 -0
  264. package/dist/ui/svelte-generator/index.js +11 -0
  265. package/dist/ui/svelte-generator/index.js.map +1 -0
  266. package/dist/ui/svelte-generator/psf-generator.d.ts +128 -0
  267. package/dist/ui/svelte-generator/psf-generator.d.ts.map +1 -0
  268. package/dist/ui/svelte-generator/psf-generator.js +506 -0
  269. package/dist/ui/svelte-generator/psf-generator.js.map +1 -0
  270. package/docs/README.md +155 -0
  271. package/docs/core/building-extensions.md +553 -0
  272. package/docs/core/cli-usage.md +498 -0
  273. package/docs/core/code-canvas-sync.md +468 -0
  274. package/docs/core/logic-engine.md +566 -0
  275. package/docs/core/pluresdb-integration.md +646 -0
  276. package/docs/core/schema-model.md +414 -0
  277. package/docs/core/ui-generation.md +580 -0
  278. package/docs/core/what-is-praxis.md +240 -0
  279. package/docs/tutorials/README.md +84 -0
  280. package/docs/tutorials/ecommerce-cart.md +631 -0
  281. package/docs/tutorials/first-app.md +529 -0
  282. package/docs/tutorials/form-builder.md +620 -0
  283. package/docs/tutorials/todo-pluresdb.md +589 -0
  284. package/package.json +16 -16
  285. package/src/__tests__/canvas-components.test.ts +450 -0
  286. package/src/__tests__/cli-create.test.ts +178 -0
  287. package/src/__tests__/code-canvas-integration.test.ts +277 -0
  288. package/src/__tests__/docs-generator.test.ts +181 -0
  289. package/src/__tests__/generators.test.ts +3 -2
  290. package/src/__tests__/pluresdb.test.ts +457 -0
  291. package/src/__tests__/psf-schema-engine.test.ts +450 -0
  292. package/src/__tests__/state-docs-integration.test.ts +297 -0
  293. package/src/__tests__/tauri-integration.test.ts +298 -0
  294. package/src/__tests__/terminal-node.test.ts +1 -1
  295. package/src/__tests__/unum-integration.test.ts +142 -0
  296. package/src/cli/commands/build.ts +203 -0
  297. package/src/cli/commands/canvas.ts +246 -0
  298. package/src/cli/commands/create.ts +666 -0
  299. package/src/cli/commands/dev.ts +95 -0
  300. package/src/cli/commands/orchestrate.ts +212 -0
  301. package/src/cli/index.ts +48 -21
  302. package/src/core/component/generator.ts +45 -3
  303. package/src/core/logic/generator.ts +39 -4
  304. package/src/core/pluresdb/adapter.ts +117 -0
  305. package/src/core/pluresdb/generator.ts +33 -4
  306. package/src/core/pluresdb/index.ts +37 -0
  307. package/src/core/pluresdb/schema-registry.ts +162 -0
  308. package/src/core/pluresdb/store.ts +446 -0
  309. package/src/index.ts +109 -0
  310. package/src/integrations/code-canvas.ts +717 -0
  311. package/src/integrations/pluresdb.ts +140 -29
  312. package/src/integrations/state-docs.ts +710 -0
  313. package/src/integrations/tauri.ts +638 -0
  314. package/src/integrations/unum.ts +395 -0
  315. package/src/runtime/terminal-adapter.ts +184 -23
  316. package/dist/adapters/cli.d.ts.map +0 -1
  317. package/dist/adapters/cli.js.map +0 -1
  318. package/dist/cli/commands/auth.d.ts.map +0 -1
  319. package/dist/cli/commands/auth.js.map +0 -1
  320. package/dist/cli/commands/cloud.d.ts.map +0 -1
  321. package/dist/cli/commands/cloud.js.map +0 -1
  322. package/dist/cli/commands/generate.d.ts.map +0 -1
  323. package/dist/cli/commands/generate.js.map +0 -1
  324. package/dist/cli/index.js.map +0 -1
  325. package/dist/cloud/auth.d.ts.map +0 -1
  326. package/dist/cloud/auth.js.map +0 -1
  327. package/dist/cloud/billing.d.ts.map +0 -1
  328. package/dist/cloud/billing.js.map +0 -1
  329. package/dist/cloud/client.d.ts.map +0 -1
  330. package/dist/cloud/client.js.map +0 -1
  331. package/dist/cloud/index.d.ts.map +0 -1
  332. package/dist/cloud/index.js.map +0 -1
  333. package/dist/cloud/marketplace.d.ts.map +0 -1
  334. package/dist/cloud/marketplace.js.map +0 -1
  335. package/dist/cloud/provisioning.d.ts.map +0 -1
  336. package/dist/cloud/provisioning.js.map +0 -1
  337. package/dist/cloud/relay/endpoints.d.ts.map +0 -1
  338. package/dist/cloud/relay/endpoints.js.map +0 -1
  339. package/dist/cloud/relay/health/index.d.ts.map +0 -1
  340. package/dist/cloud/relay/health/index.js.map +0 -1
  341. package/dist/cloud/relay/stats/index.d.ts.map +0 -1
  342. package/dist/cloud/relay/stats/index.js.map +0 -1
  343. package/dist/cloud/relay/sync/index.d.ts.map +0 -1
  344. package/dist/cloud/relay/sync/index.js.map +0 -1
  345. package/dist/cloud/relay/usage/index.d.ts.map +0 -1
  346. package/dist/cloud/relay/usage/index.js.map +0 -1
  347. package/dist/cloud/sponsors.d.ts.map +0 -1
  348. package/dist/cloud/sponsors.js.map +0 -1
  349. package/dist/cloud/types.d.ts.map +0 -1
  350. package/dist/components/index.d.ts.map +0 -1
  351. package/dist/components/index.js.map +0 -1
  352. package/dist/core/actors.d.ts.map +0 -1
  353. package/dist/core/actors.js.map +0 -1
  354. package/dist/core/component/generator.d.ts.map +0 -1
  355. package/dist/core/component/generator.js.map +0 -1
  356. package/dist/core/engine.d.ts.map +0 -1
  357. package/dist/core/engine.js.map +0 -1
  358. package/dist/core/introspection.d.ts.map +0 -1
  359. package/dist/core/introspection.js.map +0 -1
  360. package/dist/core/logic/generator.d.ts.map +0 -1
  361. package/dist/core/logic/generator.js.map +0 -1
  362. package/dist/core/pluresdb/generator.d.ts.map +0 -1
  363. package/dist/core/pluresdb/generator.js.map +0 -1
  364. package/dist/core/protocol.d.ts.map +0 -1
  365. package/dist/core/protocol.js.map +0 -1
  366. package/dist/core/rules.d.ts.map +0 -1
  367. package/dist/core/rules.js.map +0 -1
  368. package/dist/core/schema/loader.d.ts.map +0 -1
  369. package/dist/core/schema/loader.js.map +0 -1
  370. package/dist/core/schema/normalize.d.ts.map +0 -1
  371. package/dist/core/schema/normalize.js.map +0 -1
  372. package/dist/core/schema/types.d.ts.map +0 -1
  373. package/dist/core/schema/types.js.map +0 -1
  374. package/dist/dsl/index.d.ts.map +0 -1
  375. package/dist/dsl/index.js.map +0 -1
  376. package/dist/dsl.d.ts.map +0 -1
  377. package/dist/dsl.js.map +0 -1
  378. package/dist/examples/advanced-todo/index.d.ts.map +0 -1
  379. package/dist/examples/advanced-todo/index.js.map +0 -1
  380. package/dist/examples/auth-basic/index.d.ts.map +0 -1
  381. package/dist/examples/auth-basic/index.js.map +0 -1
  382. package/dist/examples/cart/index.d.ts.map +0 -1
  383. package/dist/examples/cart/index.js.map +0 -1
  384. package/dist/examples/hero-ecommerce/index.d.ts.map +0 -1
  385. package/dist/examples/hero-ecommerce/index.js.map +0 -1
  386. package/dist/examples/svelte-counter/index.d.ts.map +0 -1
  387. package/dist/examples/svelte-counter/index.js.map +0 -1
  388. package/dist/flows.d.ts.map +0 -1
  389. package/dist/flows.js.map +0 -1
  390. package/dist/index.d.ts.map +0 -1
  391. package/dist/index.js.map +0 -1
  392. package/dist/integrations/pluresdb.d.ts +0 -56
  393. package/dist/integrations/pluresdb.d.ts.map +0 -1
  394. package/dist/integrations/pluresdb.js +0 -46
  395. package/dist/integrations/pluresdb.js.map +0 -1
  396. package/dist/integrations/svelte.d.ts.map +0 -1
  397. package/dist/integrations/svelte.js.map +0 -1
  398. package/dist/registry.d.ts.map +0 -1
  399. package/dist/registry.js.map +0 -1
  400. package/dist/runtime/terminal-adapter.d.ts.map +0 -1
  401. package/dist/runtime/terminal-adapter.js +0 -113
  402. package/dist/runtime/terminal-adapter.js.map +0 -1
  403. package/dist/step.d.ts.map +0 -1
  404. package/dist/step.js.map +0 -1
  405. package/dist/types.d.ts.map +0 -1
  406. package/dist/types.js.map +0 -1
  407. /package/dist/{adapters → src/adapters}/cli.d.ts +0 -0
  408. /package/dist/{adapters → src/adapters}/cli.js +0 -0
  409. /package/dist/{cli → src/cli}/commands/auth.d.ts +0 -0
  410. /package/dist/{cli → src/cli}/commands/auth.js +0 -0
  411. /package/dist/{cli → src/cli}/commands/cloud.d.ts +0 -0
  412. /package/dist/{cli → src/cli}/commands/cloud.js +0 -0
  413. /package/dist/{cli → src/cli}/commands/generate.d.ts +0 -0
  414. /package/dist/{cli → src/cli}/commands/generate.js +0 -0
  415. /package/dist/{cli → src/cli}/index.d.ts +0 -0
  416. /package/dist/{cloud → src/cloud}/auth.d.ts +0 -0
  417. /package/dist/{cloud → src/cloud}/auth.js +0 -0
  418. /package/dist/{cloud → src/cloud}/billing.d.ts +0 -0
  419. /package/dist/{cloud → src/cloud}/billing.js +0 -0
  420. /package/dist/{cloud → src/cloud}/client.d.ts +0 -0
  421. /package/dist/{cloud → src/cloud}/client.js +0 -0
  422. /package/dist/{cloud → src/cloud}/index.d.ts +0 -0
  423. /package/dist/{cloud → src/cloud}/index.js +0 -0
  424. /package/dist/{cloud → src/cloud}/marketplace.d.ts +0 -0
  425. /package/dist/{cloud → src/cloud}/marketplace.js +0 -0
  426. /package/dist/{cloud → src/cloud}/provisioning.d.ts +0 -0
  427. /package/dist/{cloud → src/cloud}/provisioning.js +0 -0
  428. /package/dist/{cloud → src/cloud}/relay/endpoints.d.ts +0 -0
  429. /package/dist/{cloud → src/cloud}/relay/endpoints.js +0 -0
  430. /package/dist/{cloud → src/cloud}/relay/health/index.d.ts +0 -0
  431. /package/dist/{cloud → src/cloud}/relay/health/index.js +0 -0
  432. /package/dist/{cloud → src/cloud}/relay/stats/index.d.ts +0 -0
  433. /package/dist/{cloud → src/cloud}/relay/stats/index.js +0 -0
  434. /package/dist/{cloud → src/cloud}/relay/sync/index.d.ts +0 -0
  435. /package/dist/{cloud → src/cloud}/relay/sync/index.js +0 -0
  436. /package/dist/{cloud → src/cloud}/relay/usage/index.d.ts +0 -0
  437. /package/dist/{cloud → src/cloud}/relay/usage/index.js +0 -0
  438. /package/dist/{cloud → src/cloud}/sponsors.d.ts +0 -0
  439. /package/dist/{cloud → src/cloud}/sponsors.js +0 -0
  440. /package/dist/{cloud → src/cloud}/types.d.ts +0 -0
  441. /package/dist/{cloud → src/cloud}/types.js +0 -0
  442. /package/dist/{components → src/components}/index.d.ts +0 -0
  443. /package/dist/{components → src/components}/index.js +0 -0
  444. /package/dist/{core → src/core}/actors.d.ts +0 -0
  445. /package/dist/{core → src/core}/actors.js +0 -0
  446. /package/dist/{core → src/core}/component/generator.d.ts +0 -0
  447. /package/dist/{core → src/core}/engine.d.ts +0 -0
  448. /package/dist/{core → src/core}/engine.js +0 -0
  449. /package/dist/{core → src/core}/introspection.d.ts +0 -0
  450. /package/dist/{core → src/core}/introspection.js +0 -0
  451. /package/dist/{core → src/core}/logic/generator.d.ts +0 -0
  452. /package/dist/{core → src/core}/pluresdb/generator.d.ts +0 -0
  453. /package/dist/{core → src/core}/protocol.d.ts +0 -0
  454. /package/dist/{core → src/core}/protocol.js +0 -0
  455. /package/dist/{core → src/core}/rules.d.ts +0 -0
  456. /package/dist/{core → src/core}/rules.js +0 -0
  457. /package/dist/{core → src/core}/schema/loader.d.ts +0 -0
  458. /package/dist/{core → src/core}/schema/loader.js +0 -0
  459. /package/dist/{core → src/core}/schema/normalize.d.ts +0 -0
  460. /package/dist/{core → src/core}/schema/normalize.js +0 -0
  461. /package/dist/{core → src/core}/schema/types.d.ts +0 -0
  462. /package/dist/{core → src/core}/schema/types.js +0 -0
  463. /package/dist/{dsl → src/dsl}/index.d.ts +0 -0
  464. /package/dist/{dsl → src/dsl}/index.js +0 -0
  465. /package/dist/{dsl.d.ts → src/dsl.d.ts} +0 -0
  466. /package/dist/{dsl.js → src/dsl.js} +0 -0
  467. /package/dist/{examples → src/examples}/advanced-todo/index.d.ts +0 -0
  468. /package/dist/{examples → src/examples}/advanced-todo/index.js +0 -0
  469. /package/dist/{examples → src/examples}/auth-basic/index.d.ts +0 -0
  470. /package/dist/{examples → src/examples}/auth-basic/index.js +0 -0
  471. /package/dist/{examples → src/examples}/cart/index.d.ts +0 -0
  472. /package/dist/{examples → src/examples}/cart/index.js +0 -0
  473. /package/dist/{examples → src/examples}/hero-ecommerce/index.d.ts +0 -0
  474. /package/dist/{examples → src/examples}/hero-ecommerce/index.js +0 -0
  475. /package/dist/{examples → src/examples}/svelte-counter/index.d.ts +0 -0
  476. /package/dist/{examples → src/examples}/svelte-counter/index.js +0 -0
  477. /package/dist/{flows.d.ts → src/flows.d.ts} +0 -0
  478. /package/dist/{flows.js → src/flows.js} +0 -0
  479. /package/dist/{integrations → src/integrations}/svelte.d.ts +0 -0
  480. /package/dist/{integrations → src/integrations}/svelte.js +0 -0
  481. /package/dist/{registry.d.ts → src/registry.d.ts} +0 -0
  482. /package/dist/{registry.js → src/registry.js} +0 -0
  483. /package/dist/{step.d.ts → src/step.d.ts} +0 -0
  484. /package/dist/{step.js → src/step.js} +0 -0
  485. /package/dist/{types.d.ts → src/types.d.ts} +0 -0
  486. /package/dist/{types.js → src/types.js} +0 -0
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Praxis Schema Registry for PluresDB
3
+ *
4
+ * Registers Praxis schema definitions in PluresDB for type-safe storage
5
+ * and cross-agent schema discovery.
6
+ */
7
+ import { PRAXIS_PATHS } from "./store.js";
8
+ /**
9
+ * Get the path for a schema in PluresDB
10
+ * @param schemaName The schema name
11
+ */
12
+ export function getSchemaPath(schemaName) {
13
+ return `${PRAXIS_PATHS.SCHEMAS}/${schemaName}`;
14
+ }
15
+ /**
16
+ * PraxisSchemaRegistry
17
+ *
18
+ * Manages schema definitions in PluresDB.
19
+ * Schemas are stored under `/_praxis/schemas/<schemaName>`
20
+ */
21
+ export class PraxisSchemaRegistry {
22
+ db;
23
+ constructor(db) {
24
+ this.db = db;
25
+ }
26
+ /**
27
+ * Register a schema in PluresDB
28
+ *
29
+ * @param schema The schema to register
30
+ */
31
+ async register(schema) {
32
+ const path = getSchemaPath(schema.name);
33
+ const storedSchema = {
34
+ schema,
35
+ registeredAt: Date.now(),
36
+ version: schema.version,
37
+ };
38
+ await this.db.set(path, storedSchema);
39
+ }
40
+ /**
41
+ * Get a schema by name
42
+ *
43
+ * @param schemaName The schema name
44
+ * @returns The stored schema or undefined if not found
45
+ */
46
+ async get(schemaName) {
47
+ const path = getSchemaPath(schemaName);
48
+ return this.db.get(path);
49
+ }
50
+ /**
51
+ * Check if a schema is registered
52
+ *
53
+ * @param schemaName The schema name
54
+ * @returns True if the schema exists
55
+ */
56
+ async exists(schemaName) {
57
+ const stored = await this.get(schemaName);
58
+ return stored !== undefined;
59
+ }
60
+ /**
61
+ * Update a schema (replaces existing)
62
+ *
63
+ * @param schema The updated schema
64
+ */
65
+ async update(schema) {
66
+ await this.register(schema);
67
+ }
68
+ /**
69
+ * List all registered schema names
70
+ *
71
+ * Implementation note: This method uses an index stored at `/_praxis/schemas/_index`.
72
+ * When using InMemoryPraxisDB, schemas must be registered using `registerWithIndex()`
73
+ * for them to appear in this listing. When using a full PluresDB implementation,
74
+ * native listing capabilities should be used instead.
75
+ *
76
+ * @returns Array of registered schema names
77
+ */
78
+ async list() {
79
+ const indexPath = `${PRAXIS_PATHS.SCHEMAS}/_index`;
80
+ const index = await this.db.get(indexPath);
81
+ return index ?? [];
82
+ }
83
+ /**
84
+ * Register a schema and update the index
85
+ *
86
+ * @param schema The schema to register
87
+ */
88
+ async registerWithIndex(schema) {
89
+ // Register the schema
90
+ await this.register(schema);
91
+ // Update the index
92
+ const indexPath = `${PRAXIS_PATHS.SCHEMAS}/_index`;
93
+ const existingIndex = await this.db.get(indexPath) ?? [];
94
+ if (!existingIndex.includes(schema.name)) {
95
+ await this.db.set(indexPath, [...existingIndex, schema.name]);
96
+ }
97
+ }
98
+ }
99
+ /**
100
+ * Register a schema in PluresDB
101
+ *
102
+ * Convenience function for one-off schema registration.
103
+ *
104
+ * @param db The PraxisDB instance
105
+ * @param schema The schema to register
106
+ *
107
+ * @example
108
+ * ```typescript
109
+ * const db = createInMemoryDB();
110
+ * await registerSchema(db, {
111
+ * version: "1.0.0",
112
+ * name: "MyApp",
113
+ * description: "My application schema"
114
+ * });
115
+ * ```
116
+ */
117
+ export async function registerSchema(db, schema) {
118
+ const registry = new PraxisSchemaRegistry(db);
119
+ await registry.registerWithIndex(schema);
120
+ }
121
+ /**
122
+ * Create a PraxisSchemaRegistry instance
123
+ *
124
+ * @param db The PraxisDB instance
125
+ * @returns PraxisSchemaRegistry instance
126
+ */
127
+ export function createSchemaRegistry(db) {
128
+ return new PraxisSchemaRegistry(db);
129
+ }
130
+ //# sourceMappingURL=schema-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-registry.js","sourceRoot":"","sources":["../../../../src/core/pluresdb/schema-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,GAAG,YAAY,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;AACjD,CAAC;AAcD;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IACvB,EAAE,CAAW;IAErB,YAAY,EAAY;QACtB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAoB;QACjC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,YAAY,GAAiB;YACjC,MAAM;YACN,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;YACxB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;QAEF,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAC,UAAkB;QAC1B,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAe,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,UAAkB;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,OAAO,MAAM,KAAK,SAAS,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,MAAoB;QAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,SAAS,GAAG,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAW,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,IAAI,EAAE,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CAAC,MAAoB;QAC1C,sBAAsB;QACtB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE5B,mBAAmB;QACnB,MAAM,SAAS,GAAG,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC;QACnD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAW,SAAS,CAAC,IAAI,EAAE,CAAC;QAEnE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAY,EACZ,MAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAY;IAC/C,OAAO,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC;AACtC,CAAC"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * PraxisDB Store
3
+ *
4
+ * Connects Praxis Facts, Events, Rules, and Constraints to PluresDB.
5
+ * Provides CRDT-backed storage for facts and append-only event streams.
6
+ */
7
+ import type { PraxisDB, UnsubscribeFn } from "./adapter.js";
8
+ import type { PraxisRegistry } from "../rules.js";
9
+ import type { PraxisFact, PraxisEvent } from "../protocol.js";
10
+ /**
11
+ * Key paths for Praxis data in PluresDB
12
+ */
13
+ export declare const PRAXIS_PATHS: {
14
+ /** Base path for all Praxis data */
15
+ readonly BASE: "/_praxis";
16
+ /** Path for facts storage */
17
+ readonly FACTS: "/_praxis/facts";
18
+ /** Path for events storage */
19
+ readonly EVENTS: "/_praxis/events";
20
+ /** Path for schema registry */
21
+ readonly SCHEMAS: "/_praxis/schemas";
22
+ };
23
+ /**
24
+ * Generate a fact key path
25
+ * @param factTag The fact type tag
26
+ * @param id Optional unique identifier for the fact instance
27
+ */
28
+ export declare function getFactPath(factTag: string, id?: string): string;
29
+ /**
30
+ * Generate an event stream key path
31
+ * @param eventTag The event type tag
32
+ */
33
+ export declare function getEventPath(eventTag: string): string;
34
+ /**
35
+ * Generate a unique ID for facts or events
36
+ * Uses timestamp and random string for uniqueness
37
+ */
38
+ export declare function generateId(): string;
39
+ /**
40
+ * Event stream entry with timestamp
41
+ */
42
+ export interface EventStreamEntry {
43
+ /** The event data */
44
+ event: PraxisEvent;
45
+ /** Timestamp when the event was appended */
46
+ timestamp: number;
47
+ /** Optional sequence number */
48
+ sequence?: number;
49
+ }
50
+ /**
51
+ * Options for creating a PraxisDBStore
52
+ */
53
+ export interface PraxisDBStoreOptions<TContext = unknown> {
54
+ /** The PraxisDB instance to use */
55
+ db: PraxisDB;
56
+ /** The PraxisRegistry for rules and constraints */
57
+ registry: PraxisRegistry<TContext>;
58
+ /** Initial context for rule evaluation */
59
+ initialContext?: TContext;
60
+ }
61
+ /**
62
+ * PraxisDBStore
63
+ *
64
+ * Manages persistence and reactive updates for Praxis state in PluresDB.
65
+ *
66
+ * - Facts are stored as CRDT-backed documents under `/_praxis/facts/<factTag>/<id>`
67
+ * - Events are stored as append-only streams under `/_praxis/events/<eventTag>`
68
+ * - Rules are triggered automatically when watched keys change
69
+ * - Constraints are run before writing mutated state
70
+ */
71
+ /**
72
+ * Error handler callback for rule execution errors
73
+ */
74
+ export type RuleErrorHandler = (ruleId: string, error: unknown) => void;
75
+ export declare class PraxisDBStore<TContext = unknown> {
76
+ private db;
77
+ private registry;
78
+ private context;
79
+ private subscriptions;
80
+ private factWatchers;
81
+ private onRuleError;
82
+ constructor(options: PraxisDBStoreOptions<TContext> & {
83
+ onRuleError?: RuleErrorHandler;
84
+ });
85
+ /**
86
+ * Store a fact in PluresDB
87
+ *
88
+ * Facts are stored under `/_praxis/facts/<factTag>/<id>`
89
+ * If no id is provided in the payload, a timestamp-based id is used.
90
+ *
91
+ * @param fact The fact to store
92
+ * @returns Promise that resolves when the fact is stored
93
+ */
94
+ storeFact(fact: PraxisFact): Promise<void>;
95
+ /**
96
+ * Store multiple facts in PluresDB
97
+ *
98
+ * @param facts The facts to store
99
+ */
100
+ storeFacts(facts: PraxisFact[]): Promise<void>;
101
+ /**
102
+ * Internal method to persist a fact without constraint checking
103
+ * Used by both storeFact and derived fact storage
104
+ */
105
+ private persistFact;
106
+ /**
107
+ * Get a fact by tag and id
108
+ *
109
+ * @param factTag The fact type tag
110
+ * @param id The fact id
111
+ * @returns The fact or undefined if not found
112
+ */
113
+ getFact(factTag: string, id: string): Promise<PraxisFact | undefined>;
114
+ /**
115
+ * Append an event to the event stream
116
+ *
117
+ * Events are stored as append-only streams under `/_praxis/events/<eventTag>`
118
+ *
119
+ * @param event The event to append
120
+ */
121
+ appendEvent(event: PraxisEvent): Promise<void>;
122
+ /**
123
+ * Append multiple events to their respective streams
124
+ *
125
+ * @param events The events to append
126
+ */
127
+ appendEvents(events: PraxisEvent[]): Promise<void>;
128
+ /**
129
+ * Get events from a stream
130
+ *
131
+ * @param eventTag The event type tag
132
+ * @param options Query options
133
+ * @returns Array of event stream entries
134
+ */
135
+ getEvents(eventTag: string, options?: {
136
+ since?: number;
137
+ limit?: number;
138
+ }): Promise<EventStreamEntry[]>;
139
+ /**
140
+ * Watch a fact path for changes
141
+ *
142
+ * @param factTag The fact type tag to watch
143
+ * @param callback Called when facts of this type change
144
+ * @returns Unsubscribe function
145
+ */
146
+ watchFacts(factTag: string, callback: (facts: PraxisFact[]) => void): UnsubscribeFn;
147
+ /**
148
+ * Check constraints against the current state with new facts
149
+ */
150
+ private checkConstraints;
151
+ /**
152
+ * Trigger rules when new facts are added
153
+ *
154
+ * This method is called after facts are stored. It can be extended
155
+ * for derived fact computation where rules generate new facts based
156
+ * on existing facts. Currently implemented as a hook point for future
157
+ * enhancements.
158
+ *
159
+ * @param _newFacts The newly stored facts (unused in current implementation)
160
+ */
161
+ private triggerRules;
162
+ /**
163
+ * Trigger rules when events are appended
164
+ */
165
+ private triggerRulesForEvents;
166
+ /**
167
+ * Update the context
168
+ */
169
+ updateContext(context: TContext): void;
170
+ /**
171
+ * Get the current context
172
+ */
173
+ getContext(): TContext;
174
+ /**
175
+ * Dispose of all subscriptions
176
+ */
177
+ dispose(): void;
178
+ }
179
+ /**
180
+ * Create a new PraxisDBStore
181
+ *
182
+ * @param db The PraxisDB instance to use
183
+ * @param registry The PraxisRegistry for rules and constraints
184
+ * @param initialContext Optional initial context
185
+ * @param onRuleError Optional error handler for rule execution errors
186
+ * @returns PraxisDBStore instance
187
+ *
188
+ * @example
189
+ * ```typescript
190
+ * const db = createInMemoryDB();
191
+ * const registry = new PraxisRegistry();
192
+ * const store = createPraxisDBStore(db, registry);
193
+ *
194
+ * await store.storeFact({ tag: "UserLoggedIn", payload: { userId: "alice" } });
195
+ * await store.appendEvent({ tag: "LOGIN", payload: { username: "alice" } });
196
+ * ```
197
+ */
198
+ export declare function createPraxisDBStore<TContext = unknown>(db: PraxisDB, registry: PraxisRegistry<TContext>, initialContext?: TContext, onRuleError?: RuleErrorHandler): PraxisDBStore<TContext>;
199
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/core/pluresdb/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,344 @@
1
+ /**
2
+ * PraxisDB Store
3
+ *
4
+ * Connects Praxis Facts, Events, Rules, and Constraints to PluresDB.
5
+ * Provides CRDT-backed storage for facts and append-only event streams.
6
+ */
7
+ /**
8
+ * Key paths for Praxis data in PluresDB
9
+ */
10
+ export const PRAXIS_PATHS = {
11
+ /** Base path for all Praxis data */
12
+ BASE: "/_praxis",
13
+ /** Path for facts storage */
14
+ FACTS: "/_praxis/facts",
15
+ /** Path for events storage */
16
+ EVENTS: "/_praxis/events",
17
+ /** Path for schema registry */
18
+ SCHEMAS: "/_praxis/schemas",
19
+ };
20
+ /**
21
+ * Generate a fact key path
22
+ * @param factTag The fact type tag
23
+ * @param id Optional unique identifier for the fact instance
24
+ */
25
+ export function getFactPath(factTag, id) {
26
+ if (id) {
27
+ return `${PRAXIS_PATHS.FACTS}/${factTag}/${id}`;
28
+ }
29
+ return `${PRAXIS_PATHS.FACTS}/${factTag}`;
30
+ }
31
+ /**
32
+ * Generate an event stream key path
33
+ * @param eventTag The event type tag
34
+ */
35
+ export function getEventPath(eventTag) {
36
+ return `${PRAXIS_PATHS.EVENTS}/${eventTag}`;
37
+ }
38
+ /**
39
+ * Generate a unique ID for facts or events
40
+ * Uses timestamp and random string for uniqueness
41
+ */
42
+ export function generateId() {
43
+ return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
44
+ }
45
+ /**
46
+ * Default error handler that logs to console
47
+ */
48
+ const defaultErrorHandler = (ruleId, error) => {
49
+ // Default behavior: silent in production, can be overridden
50
+ if (typeof process !== "undefined" && process.env?.NODE_ENV === "development") {
51
+ console.error(`Error executing rule "${ruleId}":`, error);
52
+ }
53
+ };
54
+ export class PraxisDBStore {
55
+ db;
56
+ registry;
57
+ context;
58
+ subscriptions = [];
59
+ factWatchers = new Map();
60
+ onRuleError;
61
+ constructor(options) {
62
+ this.db = options.db;
63
+ this.registry = options.registry;
64
+ this.context = options.initialContext ?? {};
65
+ this.onRuleError = options.onRuleError ?? defaultErrorHandler;
66
+ }
67
+ /**
68
+ * Store a fact in PluresDB
69
+ *
70
+ * Facts are stored under `/_praxis/facts/<factTag>/<id>`
71
+ * If no id is provided in the payload, a timestamp-based id is used.
72
+ *
73
+ * @param fact The fact to store
74
+ * @returns Promise that resolves when the fact is stored
75
+ */
76
+ async storeFact(fact) {
77
+ // Run constraints before storing
78
+ const constraintResult = await this.checkConstraints([fact]);
79
+ if (!constraintResult.valid) {
80
+ throw new Error(`Constraint violation: ${constraintResult.errors.join(", ")}`);
81
+ }
82
+ await this.persistFact(fact);
83
+ // Trigger rule evaluation - facts stored directly may trigger derived computations
84
+ await this.triggerRules([fact]);
85
+ }
86
+ /**
87
+ * Store multiple facts in PluresDB
88
+ *
89
+ * @param facts The facts to store
90
+ */
91
+ async storeFacts(facts) {
92
+ // Run constraints before storing
93
+ const constraintResult = await this.checkConstraints(facts);
94
+ if (!constraintResult.valid) {
95
+ throw new Error(`Constraint violation: ${constraintResult.errors.join(", ")}`);
96
+ }
97
+ for (const fact of facts) {
98
+ await this.persistFact(fact);
99
+ }
100
+ // Trigger rule evaluation
101
+ await this.triggerRules(facts);
102
+ }
103
+ /**
104
+ * Internal method to persist a fact without constraint checking
105
+ * Used by both storeFact and derived fact storage
106
+ */
107
+ async persistFact(fact) {
108
+ const payload = fact.payload;
109
+ const id = payload?.id ?? generateId();
110
+ const path = getFactPath(fact.tag, id);
111
+ await this.db.set(path, fact);
112
+ }
113
+ /**
114
+ * Get a fact by tag and id
115
+ *
116
+ * @param factTag The fact type tag
117
+ * @param id The fact id
118
+ * @returns The fact or undefined if not found
119
+ */
120
+ async getFact(factTag, id) {
121
+ const path = getFactPath(factTag, id);
122
+ return this.db.get(path);
123
+ }
124
+ /**
125
+ * Append an event to the event stream
126
+ *
127
+ * Events are stored as append-only streams under `/_praxis/events/<eventTag>`
128
+ *
129
+ * @param event The event to append
130
+ */
131
+ async appendEvent(event) {
132
+ const path = getEventPath(event.tag);
133
+ // Get existing events for this tag
134
+ const existingEvents = await this.db.get(path) ?? [];
135
+ // Create new entry
136
+ const entry = {
137
+ event,
138
+ timestamp: Date.now(),
139
+ sequence: existingEvents.length,
140
+ };
141
+ // Append and store
142
+ const newEvents = [...existingEvents, entry];
143
+ await this.db.set(path, newEvents);
144
+ // Trigger rules with this event
145
+ await this.triggerRulesForEvents([event]);
146
+ }
147
+ /**
148
+ * Append multiple events to their respective streams
149
+ *
150
+ * @param events The events to append
151
+ */
152
+ async appendEvents(events) {
153
+ // Group events by tag for efficient storage
154
+ const eventsByTag = new Map();
155
+ for (const event of events) {
156
+ const existing = eventsByTag.get(event.tag) ?? [];
157
+ eventsByTag.set(event.tag, [...existing, event]);
158
+ }
159
+ // Append each group
160
+ for (const [tag, tagEvents] of eventsByTag) {
161
+ const path = getEventPath(tag);
162
+ const existingEvents = await this.db.get(path) ?? [];
163
+ let sequence = existingEvents.length;
164
+ const newEntries = tagEvents.map(event => ({
165
+ event,
166
+ timestamp: Date.now(),
167
+ sequence: sequence++,
168
+ }));
169
+ await this.db.set(path, [...existingEvents, ...newEntries]);
170
+ }
171
+ // Trigger rules
172
+ await this.triggerRulesForEvents(events);
173
+ }
174
+ /**
175
+ * Get events from a stream
176
+ *
177
+ * @param eventTag The event type tag
178
+ * @param options Query options
179
+ * @returns Array of event stream entries
180
+ */
181
+ async getEvents(eventTag, options) {
182
+ const path = getEventPath(eventTag);
183
+ const events = await this.db.get(path) ?? [];
184
+ let result = events;
185
+ if (options?.since !== undefined) {
186
+ const sinceTimestamp = options.since;
187
+ result = result.filter(e => e.timestamp > sinceTimestamp);
188
+ }
189
+ if (options?.limit !== undefined) {
190
+ result = result.slice(-options.limit);
191
+ }
192
+ return result;
193
+ }
194
+ /**
195
+ * Watch a fact path for changes
196
+ *
197
+ * @param factTag The fact type tag to watch
198
+ * @param callback Called when facts of this type change
199
+ * @returns Unsubscribe function
200
+ */
201
+ watchFacts(factTag, callback) {
202
+ const path = getFactPath(factTag);
203
+ // Register the callback
204
+ if (!this.factWatchers.has(factTag)) {
205
+ this.factWatchers.set(factTag, new Set());
206
+ }
207
+ const watchers = this.factWatchers.get(factTag);
208
+ if (watchers) {
209
+ watchers.add(callback);
210
+ }
211
+ // Watch the path in the DB
212
+ const unsubscribe = this.db.watch(path, (fact) => {
213
+ callback([fact]);
214
+ });
215
+ this.subscriptions.push(unsubscribe);
216
+ return () => {
217
+ unsubscribe();
218
+ this.factWatchers.get(factTag)?.delete(callback);
219
+ };
220
+ }
221
+ /**
222
+ * Check constraints against the current state with new facts
223
+ */
224
+ async checkConstraints(newFacts) {
225
+ const constraints = this.registry.getAllConstraints();
226
+ const errors = [];
227
+ // Build a minimal state for constraint checking
228
+ const state = {
229
+ context: this.context,
230
+ facts: newFacts,
231
+ meta: {},
232
+ };
233
+ for (const constraint of constraints) {
234
+ try {
235
+ const result = constraint.impl(state);
236
+ if (result === false) {
237
+ errors.push(`Constraint "${constraint.id}" violated`);
238
+ }
239
+ else if (typeof result === "string") {
240
+ errors.push(result);
241
+ }
242
+ }
243
+ catch (error) {
244
+ errors.push(`Error checking constraint "${constraint.id}": ${error instanceof Error ? error.message : String(error)}`);
245
+ }
246
+ }
247
+ return {
248
+ valid: errors.length === 0,
249
+ errors,
250
+ };
251
+ }
252
+ /**
253
+ * Trigger rules when new facts are added
254
+ *
255
+ * This method is called after facts are stored. It can be extended
256
+ * for derived fact computation where rules generate new facts based
257
+ * on existing facts. Currently implemented as a hook point for future
258
+ * enhancements.
259
+ *
260
+ * @param _newFacts The newly stored facts (unused in current implementation)
261
+ */
262
+ async triggerRules(_newFacts) {
263
+ // Rules are typically triggered by events, not facts
264
+ // This method serves as a hook for derived fact computation
265
+ // which can be implemented by subclasses or future enhancements
266
+ }
267
+ /**
268
+ * Trigger rules when events are appended
269
+ */
270
+ async triggerRulesForEvents(events) {
271
+ const rules = this.registry.getAllRules();
272
+ // Build state for rule evaluation
273
+ const state = {
274
+ context: this.context,
275
+ facts: [],
276
+ meta: {},
277
+ };
278
+ // Execute each rule
279
+ const derivedFacts = [];
280
+ for (const rule of rules) {
281
+ try {
282
+ const facts = rule.impl(state, events);
283
+ derivedFacts.push(...facts);
284
+ }
285
+ catch (error) {
286
+ this.onRuleError(rule.id, error);
287
+ }
288
+ }
289
+ // Store derived facts (without re-triggering rules to avoid infinite loops)
290
+ if (derivedFacts.length > 0) {
291
+ const constraintResult = await this.checkConstraints(derivedFacts);
292
+ if (constraintResult.valid) {
293
+ for (const fact of derivedFacts) {
294
+ await this.persistFact(fact);
295
+ }
296
+ }
297
+ }
298
+ }
299
+ /**
300
+ * Update the context
301
+ */
302
+ updateContext(context) {
303
+ this.context = context;
304
+ }
305
+ /**
306
+ * Get the current context
307
+ */
308
+ getContext() {
309
+ return this.context;
310
+ }
311
+ /**
312
+ * Dispose of all subscriptions
313
+ */
314
+ dispose() {
315
+ for (const unsubscribe of this.subscriptions) {
316
+ unsubscribe();
317
+ }
318
+ this.subscriptions = [];
319
+ this.factWatchers.clear();
320
+ }
321
+ }
322
+ /**
323
+ * Create a new PraxisDBStore
324
+ *
325
+ * @param db The PraxisDB instance to use
326
+ * @param registry The PraxisRegistry for rules and constraints
327
+ * @param initialContext Optional initial context
328
+ * @param onRuleError Optional error handler for rule execution errors
329
+ * @returns PraxisDBStore instance
330
+ *
331
+ * @example
332
+ * ```typescript
333
+ * const db = createInMemoryDB();
334
+ * const registry = new PraxisRegistry();
335
+ * const store = createPraxisDBStore(db, registry);
336
+ *
337
+ * await store.storeFact({ tag: "UserLoggedIn", payload: { userId: "alice" } });
338
+ * await store.appendEvent({ tag: "LOGIN", payload: { username: "alice" } });
339
+ * ```
340
+ */
341
+ export function createPraxisDBStore(db, registry, initialContext, onRuleError) {
342
+ return new PraxisDBStore({ db, registry, initialContext, onRuleError });
343
+ }
344
+ //# sourceMappingURL=store.js.map