@plures/praxis 0.2.1 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (486) hide show
  1. package/README.md +188 -61
  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 +237 -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 +1 -1
  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 +443 -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 +178 -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,638 @@
1
+ /**
2
+ * Tauri Integration
3
+ *
4
+ * Integration with plures/svelte-tauri-template for cross-platform desktop applications.
5
+ * Provides Praxis engine integration with Tauri 2 for native desktop capabilities.
6
+ *
7
+ * Features:
8
+ * - Cross-Platform: Windows, macOS, Linux, Android, iOS
9
+ * - Native Integration: File system, system tray, notifications
10
+ * - IPC Bridge: Type-safe communication between Rust and TypeScript
11
+ * - Auto-Updates: Built-in update system
12
+ * - Code Signing: Support for signed releases
13
+ *
14
+ * @see https://github.com/plures/svelte-tauri-template
15
+ */
16
+
17
+ import type { LogicEngine } from "../core/engine.js";
18
+ import type { PraxisEvent } from "../core/protocol.js";
19
+
20
+ /**
21
+ * Tauri app configuration
22
+ */
23
+ export interface TauriAppConfig {
24
+ /** Application name */
25
+ name: string;
26
+ /** Application version */
27
+ version: string;
28
+ /** Application identifier (e.g., com.example.myapp) */
29
+ identifier: string;
30
+ /** Window configuration */
31
+ window?: TauriWindowConfig;
32
+ /** Security configuration */
33
+ security?: TauriSecurityConfig;
34
+ /** Update configuration */
35
+ updates?: TauriUpdateConfig;
36
+ /** Plugins to enable */
37
+ plugins?: TauriPlugin[];
38
+ }
39
+
40
+ /**
41
+ * Window configuration
42
+ */
43
+ export interface TauriWindowConfig {
44
+ /** Window title */
45
+ title?: string;
46
+ /** Window width */
47
+ width?: number;
48
+ /** Window height */
49
+ height?: number;
50
+ /** Minimum width */
51
+ minWidth?: number;
52
+ /** Minimum height */
53
+ minHeight?: number;
54
+ /** Whether window is resizable */
55
+ resizable?: boolean;
56
+ /** Whether window is fullscreen */
57
+ fullscreen?: boolean;
58
+ /** Whether to show title bar */
59
+ decorations?: boolean;
60
+ /** Whether window is transparent */
61
+ transparent?: boolean;
62
+ /** Whether to always be on top */
63
+ alwaysOnTop?: boolean;
64
+ /** Center window on screen */
65
+ center?: boolean;
66
+ }
67
+
68
+ /**
69
+ * Security configuration
70
+ */
71
+ export interface TauriSecurityConfig {
72
+ /** Content Security Policy */
73
+ csp?: string;
74
+ /** Allowed domains for fetch */
75
+ allowedDomains?: string[];
76
+ /** Enable dev tools in production */
77
+ devTools?: boolean;
78
+ /** Dangerous features to allow */
79
+ dangerousAllowList?: string[];
80
+ }
81
+
82
+ /**
83
+ * Auto-update configuration
84
+ */
85
+ export interface TauriUpdateConfig {
86
+ /** Enable auto-updates */
87
+ enabled: boolean;
88
+ /** Update endpoint URL */
89
+ endpoint?: string;
90
+ /** Update check interval (ms) */
91
+ checkInterval?: number;
92
+ /** Whether to install silently */
93
+ silent?: boolean;
94
+ /** Public key for update verification */
95
+ publicKey?: string;
96
+ }
97
+
98
+ /**
99
+ * Tauri plugin definition
100
+ */
101
+ export interface TauriPlugin {
102
+ /** Plugin name */
103
+ name: string;
104
+ /** Plugin version */
105
+ version?: string;
106
+ /** Plugin configuration */
107
+ config?: Record<string, unknown>;
108
+ }
109
+
110
+ /**
111
+ * IPC message from frontend to backend
112
+ */
113
+ export interface TauriCommand<T = unknown> {
114
+ /** Command name */
115
+ cmd: string;
116
+ /** Command payload */
117
+ payload?: T;
118
+ }
119
+
120
+ /**
121
+ * IPC event from backend to frontend
122
+ */
123
+ export interface TauriEvent<T = unknown> {
124
+ /** Event name */
125
+ event: string;
126
+ /** Event payload */
127
+ payload?: T;
128
+ /** Window label that emitted the event */
129
+ windowLabel?: string;
130
+ }
131
+
132
+ /**
133
+ * File system operations
134
+ */
135
+ export interface TauriFS {
136
+ /** Read a file */
137
+ readFile(path: string): Promise<Uint8Array>;
138
+ /** Read a file as text */
139
+ readTextFile(path: string): Promise<string>;
140
+ /** Write to a file */
141
+ writeFile(path: string, data: Uint8Array): Promise<void>;
142
+ /** Write text to a file */
143
+ writeTextFile(path: string, data: string): Promise<void>;
144
+ /** Check if path exists */
145
+ exists(path: string): Promise<boolean>;
146
+ /** Create directory */
147
+ mkdir(path: string, options?: { recursive?: boolean }): Promise<void>;
148
+ /** Remove file or directory */
149
+ remove(path: string, options?: { recursive?: boolean }): Promise<void>;
150
+ /** Rename/move file */
151
+ rename(oldPath: string, newPath: string): Promise<void>;
152
+ /** List directory contents */
153
+ readDir(path: string): Promise<TauriFileEntry[]>;
154
+ }
155
+
156
+ /**
157
+ * File entry from directory listing
158
+ */
159
+ export interface TauriFileEntry {
160
+ /** File name */
161
+ name: string;
162
+ /** Full path */
163
+ path: string;
164
+ /** Is directory */
165
+ isDirectory: boolean;
166
+ /** Is file */
167
+ isFile: boolean;
168
+ /** File size in bytes */
169
+ size?: number;
170
+ /** Last modified timestamp */
171
+ modifiedAt?: number;
172
+ }
173
+
174
+ /**
175
+ * System tray operations
176
+ */
177
+ export interface TauriTray {
178
+ /** Set tray icon */
179
+ setIcon(icon: string | Uint8Array): Promise<void>;
180
+ /** Set tray tooltip */
181
+ setTooltip(tooltip: string): Promise<void>;
182
+ /** Set tray menu */
183
+ setMenu(menu: TauriMenuItem[]): Promise<void>;
184
+ /** Show tray */
185
+ show(): Promise<void>;
186
+ /** Hide tray */
187
+ hide(): Promise<void>;
188
+ }
189
+
190
+ /**
191
+ * Tray menu item
192
+ */
193
+ export interface TauriMenuItem {
194
+ /** Item ID */
195
+ id: string;
196
+ /** Item label */
197
+ label: string;
198
+ /** Is item enabled */
199
+ enabled?: boolean;
200
+ /** Is item checked (for checkboxes) */
201
+ checked?: boolean;
202
+ /** Submenu items */
203
+ submenu?: TauriMenuItem[];
204
+ /** Click handler */
205
+ onClick?: () => void;
206
+ }
207
+
208
+ /**
209
+ * Notification API
210
+ */
211
+ export interface TauriNotification {
212
+ /** Send a notification */
213
+ send(options: TauriNotificationOptions): Promise<void>;
214
+ /** Request notification permission */
215
+ requestPermission(): Promise<'granted' | 'denied' | 'default'>;
216
+ /** Check notification permission */
217
+ checkPermission(): Promise<'granted' | 'denied' | 'default'>;
218
+ }
219
+
220
+ /**
221
+ * Notification options
222
+ */
223
+ export interface TauriNotificationOptions {
224
+ /** Notification title */
225
+ title: string;
226
+ /** Notification body */
227
+ body?: string;
228
+ /** Notification icon */
229
+ icon?: string;
230
+ /** Sound to play */
231
+ sound?: string;
232
+ }
233
+
234
+ /**
235
+ * Tauri bridge for Praxis integration
236
+ *
237
+ * Provides type-safe access to Tauri APIs from Praxis applications.
238
+ */
239
+ export interface TauriBridge {
240
+ /** Application info */
241
+ app: {
242
+ name: string;
243
+ version: string;
244
+ tauriVersion: string;
245
+ };
246
+
247
+ /** File system operations */
248
+ fs: TauriFS;
249
+
250
+ /** System tray operations */
251
+ tray: TauriTray;
252
+
253
+ /** Notification operations */
254
+ notification: TauriNotification;
255
+
256
+ /** Invoke a Tauri command */
257
+ invoke<T = unknown>(cmd: string, payload?: unknown): Promise<T>;
258
+
259
+ /** Listen to a Tauri event */
260
+ listen<T = unknown>(event: string, handler: (event: TauriEvent<T>) => void): Promise<() => void>;
261
+
262
+ /** Emit a Tauri event */
263
+ emit(event: string, payload?: unknown): Promise<void>;
264
+
265
+ /** Get window operations */
266
+ window: {
267
+ /** Minimize window */
268
+ minimize(): Promise<void>;
269
+ /** Maximize window */
270
+ maximize(): Promise<void>;
271
+ /** Unmaximize window */
272
+ unmaximize(): Promise<void>;
273
+ /** Close window */
274
+ close(): Promise<void>;
275
+ /** Toggle fullscreen */
276
+ toggleFullscreen(): Promise<void>;
277
+ /** Set window title */
278
+ setTitle(title: string): Promise<void>;
279
+ /** Show window */
280
+ show(): Promise<void>;
281
+ /** Hide window */
282
+ hide(): Promise<void>;
283
+ /** Focus window */
284
+ focus(): Promise<void>;
285
+ };
286
+
287
+ /** Check for updates */
288
+ checkForUpdates(): Promise<TauriUpdateInfo | null>;
289
+
290
+ /** Install update */
291
+ installUpdate(): Promise<void>;
292
+ }
293
+
294
+ /**
295
+ * Update information
296
+ */
297
+ export interface TauriUpdateInfo {
298
+ /** New version available */
299
+ version: string;
300
+ /** Release date */
301
+ date: string;
302
+ /** Release notes */
303
+ notes?: string;
304
+ /** Download URL */
305
+ url: string;
306
+ }
307
+
308
+ /**
309
+ * Praxis-Tauri adapter for engine persistence
310
+ */
311
+ export interface TauriPraxisAdapter<TContext = unknown> {
312
+ /** Save engine state to file */
313
+ saveState(state: TContext): Promise<void>;
314
+
315
+ /** Load engine state from file */
316
+ loadState(): Promise<TContext | null>;
317
+
318
+ /** Save events to file */
319
+ saveEvents(events: PraxisEvent[]): Promise<void>;
320
+
321
+ /** Load events from file */
322
+ loadEvents(): Promise<PraxisEvent[]>;
323
+
324
+ /** Watch for file changes */
325
+ watchStateFile(handler: (state: TContext) => void): Promise<() => void>;
326
+
327
+ /** Get state file path */
328
+ getStatePath(): string;
329
+
330
+ /** Get events file path */
331
+ getEventsPath(): string;
332
+ }
333
+
334
+ /**
335
+ * Create a mock Tauri bridge for development/testing
336
+ *
337
+ * This provides a mock implementation that works without Tauri runtime.
338
+ */
339
+ export function createMockTauriBridge(): TauriBridge {
340
+ const eventHandlers = new Map<string, Set<(event: TauriEvent) => void>>();
341
+ const storage = new Map<string, unknown>();
342
+
343
+ return {
344
+ app: {
345
+ name: 'Mock App',
346
+ version: '0.0.0',
347
+ tauriVersion: 'mock',
348
+ },
349
+
350
+ fs: {
351
+ async readFile(path: string): Promise<Uint8Array> {
352
+ const data = storage.get(path);
353
+ if (data instanceof Uint8Array) return data;
354
+ throw new Error(`File not found: ${path}`);
355
+ },
356
+
357
+ async readTextFile(path: string): Promise<string> {
358
+ const data = storage.get(path);
359
+ if (typeof data === 'string') return data;
360
+ throw new Error(`File not found: ${path}`);
361
+ },
362
+
363
+ async writeFile(path: string, data: Uint8Array): Promise<void> {
364
+ storage.set(path, data);
365
+ },
366
+
367
+ async writeTextFile(path: string, data: string): Promise<void> {
368
+ storage.set(path, data);
369
+ },
370
+
371
+ async exists(path: string): Promise<boolean> {
372
+ return storage.has(path);
373
+ },
374
+
375
+ async mkdir(_path: string, _options?: { recursive?: boolean }): Promise<void> {
376
+ // No-op for mock
377
+ },
378
+
379
+ async remove(path: string, _options?: { recursive?: boolean }): Promise<void> {
380
+ storage.delete(path);
381
+ },
382
+
383
+ async rename(oldPath: string, newPath: string): Promise<void> {
384
+ const data = storage.get(oldPath);
385
+ if (data !== undefined) {
386
+ storage.set(newPath, data);
387
+ storage.delete(oldPath);
388
+ }
389
+ },
390
+
391
+ async readDir(_path: string): Promise<TauriFileEntry[]> {
392
+ return [];
393
+ },
394
+ },
395
+
396
+ tray: {
397
+ async setIcon(_icon: string | Uint8Array): Promise<void> {},
398
+ async setTooltip(_tooltip: string): Promise<void> {},
399
+ async setMenu(_menu: TauriMenuItem[]): Promise<void> {},
400
+ async show(): Promise<void> {},
401
+ async hide(): Promise<void> {},
402
+ },
403
+
404
+ notification: {
405
+ async send(options: TauriNotificationOptions): Promise<void> {
406
+ console.log('Mock notification:', options.title, options.body);
407
+ },
408
+ async requestPermission(): Promise<'granted' | 'denied' | 'default'> {
409
+ return 'granted';
410
+ },
411
+ async checkPermission(): Promise<'granted' | 'denied' | 'default'> {
412
+ return 'granted';
413
+ },
414
+ },
415
+
416
+ async invoke<T = unknown>(cmd: string, payload?: unknown): Promise<T> {
417
+ console.log('Mock invoke:', cmd, payload);
418
+ return null as T;
419
+ },
420
+
421
+ async listen<T = unknown>(event: string, handler: (event: TauriEvent<T>) => void): Promise<() => void> {
422
+ if (!eventHandlers.has(event)) {
423
+ eventHandlers.set(event, new Set());
424
+ }
425
+ eventHandlers.get(event)!.add(handler as (event: TauriEvent) => void);
426
+
427
+ return () => {
428
+ eventHandlers.get(event)?.delete(handler as (event: TauriEvent) => void);
429
+ };
430
+ },
431
+
432
+ async emit(event: string, payload?: unknown): Promise<void> {
433
+ const handlers = eventHandlers.get(event);
434
+ if (handlers) {
435
+ const tauriEvent: TauriEvent = { event, payload };
436
+ handlers.forEach(h => h(tauriEvent));
437
+ }
438
+ },
439
+
440
+ window: {
441
+ async minimize(): Promise<void> {},
442
+ async maximize(): Promise<void> {},
443
+ async unmaximize(): Promise<void> {},
444
+ async close(): Promise<void> {},
445
+ async toggleFullscreen(): Promise<void> {},
446
+ async setTitle(_title: string): Promise<void> {},
447
+ async show(): Promise<void> {},
448
+ async hide(): Promise<void> {},
449
+ async focus(): Promise<void> {},
450
+ },
451
+
452
+ async checkForUpdates(): Promise<TauriUpdateInfo | null> {
453
+ return null;
454
+ },
455
+
456
+ async installUpdate(): Promise<void> {},
457
+ };
458
+ }
459
+
460
+ /**
461
+ * Create a Tauri-Praxis adapter for engine persistence
462
+ *
463
+ * @example
464
+ * ```typescript
465
+ * import { createTauriPraxisAdapter } from '@plures/praxis/integrations/tauri';
466
+ *
467
+ * const adapter = createTauriPraxisAdapter({
468
+ * bridge: tauriBridge,
469
+ * statePath: 'app-state.json',
470
+ * eventsPath: 'app-events.json',
471
+ * });
472
+ *
473
+ * // Save state
474
+ * await adapter.saveState(engine.getContext());
475
+ *
476
+ * // Load state
477
+ * const savedState = await adapter.loadState();
478
+ * ```
479
+ */
480
+ export function createTauriPraxisAdapter<TContext = unknown>(options: {
481
+ bridge: TauriBridge;
482
+ statePath?: string;
483
+ eventsPath?: string;
484
+ }): TauriPraxisAdapter<TContext> {
485
+ const { bridge, statePath = 'praxis-state.json', eventsPath = 'praxis-events.json' } = options;
486
+
487
+ return {
488
+ async saveState(state: TContext): Promise<void> {
489
+ const json = JSON.stringify(state, null, 2);
490
+ await bridge.fs.writeTextFile(statePath, json);
491
+ },
492
+
493
+ async loadState(): Promise<TContext | null> {
494
+ try {
495
+ const exists = await bridge.fs.exists(statePath);
496
+ if (!exists) return null;
497
+
498
+ const json = await bridge.fs.readTextFile(statePath);
499
+ return JSON.parse(json) as TContext;
500
+ } catch {
501
+ return null;
502
+ }
503
+ },
504
+
505
+ async saveEvents(events: PraxisEvent[]): Promise<void> {
506
+ const json = JSON.stringify(events, null, 2);
507
+ await bridge.fs.writeTextFile(eventsPath, json);
508
+ },
509
+
510
+ async loadEvents(): Promise<PraxisEvent[]> {
511
+ try {
512
+ const exists = await bridge.fs.exists(eventsPath);
513
+ if (!exists) return [];
514
+
515
+ const json = await bridge.fs.readTextFile(eventsPath);
516
+ return JSON.parse(json) as PraxisEvent[];
517
+ } catch {
518
+ return [];
519
+ }
520
+ },
521
+
522
+ async watchStateFile(_handler: (state: TContext) => void): Promise<() => void> {
523
+ // In a real implementation, this would use Tauri's fs watch API
524
+ // For now, we'll just return a no-op cleanup function
525
+ console.log('File watching not implemented in mock');
526
+ return () => {};
527
+ },
528
+
529
+ getStatePath(): string {
530
+ return statePath;
531
+ },
532
+
533
+ getEventsPath(): string {
534
+ return eventsPath;
535
+ },
536
+ };
537
+ }
538
+
539
+ /**
540
+ * Attach Tauri bridge to a Praxis engine for auto-save
541
+ *
542
+ * @example
543
+ * ```typescript
544
+ * import { attachTauriToEngine } from '@plures/praxis/integrations/tauri';
545
+ *
546
+ * const cleanup = attachTauriToEngine(engine, adapter, {
547
+ * autoSave: true,
548
+ * saveInterval: 5000,
549
+ * });
550
+ *
551
+ * // Later, cleanup subscriptions
552
+ * cleanup();
553
+ * ```
554
+ */
555
+ export function attachTauriToEngine<TContext>(
556
+ engine: LogicEngine<TContext>,
557
+ adapter: TauriPraxisAdapter<TContext>,
558
+ options: {
559
+ autoSave?: boolean;
560
+ saveInterval?: number;
561
+ } = {}
562
+ ): () => void {
563
+ const { autoSave = true, saveInterval = 5000 } = options;
564
+ const cleanupFns: Array<() => void> = [];
565
+
566
+ if (autoSave) {
567
+ let saveTimer: ReturnType<typeof setTimeout> | null = null;
568
+ let pendingSave = false;
569
+
570
+ const debouncedSave = async () => {
571
+ pendingSave = true;
572
+ if (saveTimer) clearTimeout(saveTimer);
573
+
574
+ saveTimer = setTimeout(async () => {
575
+ if (pendingSave) {
576
+ await adapter.saveState(engine.getContext());
577
+ pendingSave = false;
578
+ }
579
+ }, saveInterval);
580
+ };
581
+
582
+ // Note: In a future implementation, this would hook into engine state changes
583
+ // For now, we provide manual save on interval if state is dirty
584
+ // The caller can trigger debouncedSave manually after engine.step() calls
585
+
586
+ // Initial save setup - clean up timer on dispose
587
+ cleanupFns.push(() => {
588
+ if (saveTimer) clearTimeout(saveTimer);
589
+ });
590
+
591
+ // Expose a way to trigger save (for future use)
592
+ void debouncedSave;
593
+ }
594
+
595
+ return () => {
596
+ cleanupFns.forEach(fn => fn());
597
+ };
598
+ }
599
+
600
+ /**
601
+ * Generate Tauri configuration from Praxis app config
602
+ */
603
+ export function generateTauriConfig(config: TauriAppConfig): Record<string, unknown> {
604
+ return {
605
+ $schema: "https://raw.githubusercontent.com/tauri-apps/tauri/tauri-v2.0.0/core/tauri-config-schema/schema.json",
606
+ productName: config.name,
607
+ version: config.version,
608
+ identifier: config.identifier,
609
+ app: {
610
+ windows: [
611
+ {
612
+ title: config.window?.title || config.name,
613
+ width: config.window?.width || 800,
614
+ height: config.window?.height || 600,
615
+ minWidth: config.window?.minWidth,
616
+ minHeight: config.window?.minHeight,
617
+ resizable: config.window?.resizable ?? true,
618
+ fullscreen: config.window?.fullscreen ?? false,
619
+ decorations: config.window?.decorations ?? true,
620
+ transparent: config.window?.transparent ?? false,
621
+ alwaysOnTop: config.window?.alwaysOnTop ?? false,
622
+ center: config.window?.center ?? true,
623
+ },
624
+ ],
625
+ security: {
626
+ csp: config.security?.csp || "default-src 'self'",
627
+ devtools: config.security?.devTools ?? false,
628
+ },
629
+ },
630
+ build: {
631
+ devUrl: "http://localhost:5173",
632
+ frontendDist: "../dist",
633
+ },
634
+ plugins: Object.fromEntries(
635
+ (config.plugins || []).map(p => [p.name, p.config || {}])
636
+ ),
637
+ };
638
+ }