@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,717 @@
1
+ /**
2
+ * CodeCanvas Integration
3
+ *
4
+ * Integration with plures/code-canvas - A visual schema editor and FSM enforcement tool.
5
+ * Provides visual editing capabilities for Praxis schemas and logic flows.
6
+ *
7
+ * Features:
8
+ * - Visual Schema Editor: Drag-and-drop interface for schema design
9
+ * - FSM Visualization: Mermaid and DOT graph generation
10
+ * - State Lifecycle Management: Activity tracking and validation
11
+ * - Canvas Export/Import: YAML and JSON Canvas formats
12
+ * - Guardian Integration: Pre-commit validation and rules enforcement
13
+ *
14
+ * @see https://github.com/plures/code-canvas
15
+ */
16
+
17
+ import type { PraxisSchema, ModelDefinition, ComponentDefinition, LogicDefinition } from "../core/schema/types.js";
18
+
19
+ /**
20
+ * Canvas node representing a visual element
21
+ */
22
+ export interface CanvasNode {
23
+ /** Unique node identifier */
24
+ id: string;
25
+ /** Node type */
26
+ type: 'model' | 'component' | 'event' | 'fact' | 'rule' | 'constraint' | 'state' | 'transition';
27
+ /** Node label/name */
28
+ label: string;
29
+ /** X position */
30
+ x: number;
31
+ /** Y position */
32
+ y: number;
33
+ /** Width */
34
+ width: number;
35
+ /** Height */
36
+ height: number;
37
+ /** Node data (model, component, etc.) */
38
+ data?: unknown;
39
+ /** Node style */
40
+ style?: CanvasNodeStyle;
41
+ /** FSM state reference */
42
+ fsmState?: string;
43
+ }
44
+
45
+ /**
46
+ * Canvas edge representing a connection between nodes
47
+ */
48
+ export interface CanvasEdge {
49
+ /** Unique edge identifier */
50
+ id: string;
51
+ /** Source node ID */
52
+ source: string;
53
+ /** Target node ID */
54
+ target: string;
55
+ /** Edge label */
56
+ label?: string;
57
+ /** Edge type */
58
+ type?: 'dependency' | 'transition' | 'trigger' | 'reference';
59
+ /** Edge style */
60
+ style?: CanvasEdgeStyle;
61
+ }
62
+
63
+ /**
64
+ * Node style configuration
65
+ */
66
+ export interface CanvasNodeStyle {
67
+ /** Background color */
68
+ backgroundColor?: string;
69
+ /** Border color */
70
+ borderColor?: string;
71
+ /** Border width */
72
+ borderWidth?: number;
73
+ /** Text color */
74
+ textColor?: string;
75
+ /** Font size */
76
+ fontSize?: number;
77
+ /** Border radius */
78
+ borderRadius?: number;
79
+ }
80
+
81
+ /**
82
+ * Edge style configuration
83
+ */
84
+ export interface CanvasEdgeStyle {
85
+ /** Stroke color */
86
+ strokeColor?: string;
87
+ /** Stroke width */
88
+ strokeWidth?: number;
89
+ /** Stroke style */
90
+ strokeDasharray?: string;
91
+ /** Arrow type */
92
+ arrowType?: 'arrow' | 'none' | 'circle';
93
+ }
94
+
95
+ /**
96
+ * Canvas document containing nodes and edges
97
+ */
98
+ export interface CanvasDocument {
99
+ /** Document identifier */
100
+ id: string;
101
+ /** Document name */
102
+ name: string;
103
+ /** Document version */
104
+ version: string;
105
+ /** All nodes in the canvas */
106
+ nodes: CanvasNode[];
107
+ /** All edges in the canvas */
108
+ edges: CanvasEdge[];
109
+ /** Document metadata */
110
+ metadata?: {
111
+ created: number;
112
+ modified: number;
113
+ author?: string;
114
+ description?: string;
115
+ };
116
+ /** Viewport settings */
117
+ viewport?: {
118
+ x: number;
119
+ y: number;
120
+ zoom: number;
121
+ };
122
+ }
123
+
124
+ /**
125
+ * FSM lifecycle state
126
+ */
127
+ export interface LifecycleState {
128
+ /** State identifier */
129
+ id: string;
130
+ /** State name */
131
+ name: string;
132
+ /** State description */
133
+ description?: string;
134
+ /** Allowed transitions from this state */
135
+ transitions: string[];
136
+ /** Entry actions */
137
+ onEntry?: string[];
138
+ /** Exit actions */
139
+ onExit?: string[];
140
+ /** Is this an initial state */
141
+ initial?: boolean;
142
+ /** Is this a final state */
143
+ final?: boolean;
144
+ }
145
+
146
+ /**
147
+ * Activity tracking for current work context
148
+ */
149
+ export interface ActivityState {
150
+ /** Current activity type */
151
+ activity: 'designing' | 'implementing' | 'testing' | 'documenting' | 'reviewing';
152
+ /** Actor performing the activity */
153
+ actor: string;
154
+ /** Current intent/goal */
155
+ intent?: string;
156
+ /** Started timestamp */
157
+ startedAt: number;
158
+ /** Allowed file patterns for this activity */
159
+ allowedPaths?: string[];
160
+ }
161
+
162
+ /**
163
+ * Canvas editor configuration
164
+ */
165
+ export interface CanvasEditorConfig {
166
+ /** Canvas document to edit */
167
+ document?: CanvasDocument;
168
+ /** Schema to visualize */
169
+ schema?: PraxisSchema;
170
+ /** Enable FSM validation */
171
+ enableFSM?: boolean;
172
+ /** Custom node styles by type */
173
+ nodeStyles?: Record<string, CanvasNodeStyle>;
174
+ /** Custom edge styles by type */
175
+ edgeStyles?: Record<string, CanvasEdgeStyle>;
176
+ /** Auto-layout algorithm */
177
+ layout?: 'hierarchical' | 'force' | 'grid' | 'circular';
178
+ }
179
+
180
+ /**
181
+ * Guardian validation result
182
+ */
183
+ export interface GuardianResult {
184
+ /** Whether validation passed */
185
+ valid: boolean;
186
+ /** Validation errors */
187
+ errors: GuardianError[];
188
+ /** Validation warnings */
189
+ warnings: GuardianWarning[];
190
+ /** Files validated */
191
+ filesChecked: string[];
192
+ /** Current activity state */
193
+ activity?: ActivityState;
194
+ }
195
+
196
+ /**
197
+ * Guardian validation error
198
+ */
199
+ export interface GuardianError {
200
+ /** Error code */
201
+ code: string;
202
+ /** Error message */
203
+ message: string;
204
+ /** File path (if applicable) */
205
+ file?: string;
206
+ /** Line number (if applicable) */
207
+ line?: number;
208
+ /** Rule that was violated */
209
+ rule?: string;
210
+ }
211
+
212
+ /**
213
+ * Guardian validation warning
214
+ */
215
+ export interface GuardianWarning {
216
+ /** Warning code */
217
+ code: string;
218
+ /** Warning message */
219
+ message: string;
220
+ /** File path (if applicable) */
221
+ file?: string;
222
+ /** Suggestion for resolution */
223
+ suggestion?: string;
224
+ }
225
+
226
+ /**
227
+ * Create a canvas document from a Praxis schema
228
+ *
229
+ * @example
230
+ * ```typescript
231
+ * import { schemaToCanvas } from '@plures/praxis/integrations/code-canvas';
232
+ *
233
+ * const canvas = schemaToCanvas(mySchema, {
234
+ * layout: 'hierarchical',
235
+ * });
236
+ *
237
+ * // Export to YAML
238
+ * const yaml = canvasToYaml(canvas);
239
+ * ```
240
+ */
241
+ export function schemaToCanvas(
242
+ schema: PraxisSchema,
243
+ _options: { layout?: 'hierarchical' | 'force' | 'grid' | 'circular' } = {}
244
+ ): CanvasDocument {
245
+ // Note: layout option reserved for future auto-layout implementation
246
+ const nodes: CanvasNode[] = [];
247
+ const edges: CanvasEdge[] = [];
248
+ let nodeId = 0;
249
+ let yOffset = 0;
250
+ const xSpacing = 200;
251
+ const ySpacing = 100;
252
+
253
+ // Add model nodes
254
+ if (schema.models) {
255
+ schema.models.forEach((model, index) => {
256
+ const node: CanvasNode = {
257
+ id: `model-${nodeId++}`,
258
+ type: 'model',
259
+ label: model.name,
260
+ x: 50,
261
+ y: yOffset + (index * ySpacing),
262
+ width: 150,
263
+ height: 60,
264
+ data: model,
265
+ style: {
266
+ backgroundColor: '#e3f2fd',
267
+ borderColor: '#1976d2',
268
+ },
269
+ };
270
+ nodes.push(node);
271
+ });
272
+ yOffset += (schema.models.length * ySpacing) + 50;
273
+ }
274
+
275
+ // Add component nodes
276
+ if (schema.components) {
277
+ schema.components.forEach((component, index) => {
278
+ const node: CanvasNode = {
279
+ id: `component-${nodeId++}`,
280
+ type: 'component',
281
+ label: component.name,
282
+ x: 50 + xSpacing,
283
+ y: yOffset + (index * ySpacing),
284
+ width: 150,
285
+ height: 60,
286
+ data: component,
287
+ style: {
288
+ backgroundColor: '#e8f5e9',
289
+ borderColor: '#388e3c',
290
+ },
291
+ };
292
+ nodes.push(node);
293
+
294
+ // Add edges for component-model relationships
295
+ if (component.model) {
296
+ const modelNode = nodes.find(n => n.type === 'model' && n.label === component.model);
297
+ if (modelNode) {
298
+ edges.push({
299
+ id: `edge-${edges.length}`,
300
+ source: node.id,
301
+ target: modelNode.id,
302
+ type: 'reference',
303
+ label: 'uses',
304
+ });
305
+ }
306
+ }
307
+ });
308
+ yOffset += (schema.components.length * ySpacing) + 50;
309
+ }
310
+
311
+ // Add logic nodes
312
+ if (schema.logic) {
313
+ schema.logic.forEach((logic) => {
314
+ // Add events
315
+ logic.events?.forEach((event, eventIndex) => {
316
+ const node: CanvasNode = {
317
+ id: `event-${nodeId++}`,
318
+ type: 'event',
319
+ label: event.tag,
320
+ x: 50 + (xSpacing * 2),
321
+ y: yOffset + (eventIndex * ySpacing),
322
+ width: 150,
323
+ height: 50,
324
+ data: event,
325
+ style: {
326
+ backgroundColor: '#fff3e0',
327
+ borderColor: '#f57c00',
328
+ },
329
+ };
330
+ nodes.push(node);
331
+ });
332
+
333
+ yOffset += ((logic.events?.length || 0) * ySpacing) + 30;
334
+
335
+ // Add facts
336
+ logic.facts?.forEach((fact, factIndex) => {
337
+ const node: CanvasNode = {
338
+ id: `fact-${nodeId++}`,
339
+ type: 'fact',
340
+ label: fact.tag,
341
+ x: 50 + (xSpacing * 3),
342
+ y: yOffset + (factIndex * ySpacing),
343
+ width: 150,
344
+ height: 50,
345
+ data: fact,
346
+ style: {
347
+ backgroundColor: '#fce4ec',
348
+ borderColor: '#c2185b',
349
+ },
350
+ };
351
+ nodes.push(node);
352
+ });
353
+
354
+ yOffset += ((logic.facts?.length || 0) * ySpacing) + 30;
355
+
356
+ // Add rules
357
+ logic.rules?.forEach((rule, ruleIndex) => {
358
+ const node: CanvasNode = {
359
+ id: `rule-${nodeId++}`,
360
+ type: 'rule',
361
+ label: rule.id,
362
+ x: 50 + (xSpacing * 4),
363
+ y: yOffset + (ruleIndex * ySpacing),
364
+ width: 150,
365
+ height: 50,
366
+ data: rule,
367
+ style: {
368
+ backgroundColor: '#e1f5fe',
369
+ borderColor: '#0288d1',
370
+ },
371
+ };
372
+ nodes.push(node);
373
+ });
374
+
375
+ yOffset += ((logic.rules?.length || 0) * ySpacing) + 30;
376
+ });
377
+ }
378
+
379
+ return {
380
+ id: `canvas-${Date.now()}`,
381
+ name: schema.name || 'Praxis Schema',
382
+ version: schema.version || '1.0.0',
383
+ nodes,
384
+ edges,
385
+ metadata: {
386
+ created: Date.now(),
387
+ modified: Date.now(),
388
+ description: schema.description,
389
+ },
390
+ viewport: { x: 0, y: 0, zoom: 1 },
391
+ };
392
+ }
393
+
394
+ /**
395
+ * Convert a canvas document back to a Praxis schema
396
+ */
397
+ export function canvasToSchema(canvas: CanvasDocument): PraxisSchema {
398
+ const models: ModelDefinition[] = [];
399
+ const components: ComponentDefinition[] = [];
400
+ const logic: LogicDefinition[] = [];
401
+
402
+ // Group logic elements - using proper schema types
403
+ const events: Array<{ tag: string; payload: Record<string, string>; description?: string }> = [];
404
+ const facts: Array<{ tag: string; payload: Record<string, string>; description?: string }> = [];
405
+ const rules: Array<{ id: string; description: string; on?: string[]; when?: string; then: string; priority?: number }> = [];
406
+ const constraints: Array<{ id: string; description: string; check: string; message: string }> = [];
407
+
408
+ for (const node of canvas.nodes) {
409
+ switch (node.type) {
410
+ case 'model':
411
+ if (node.data) {
412
+ models.push(node.data as ModelDefinition);
413
+ }
414
+ break;
415
+ case 'component':
416
+ if (node.data) {
417
+ components.push(node.data as ComponentDefinition);
418
+ }
419
+ break;
420
+ case 'event':
421
+ if (node.data) {
422
+ const eventData = node.data as { tag: string; payload?: Record<string, string>; description?: string };
423
+ events.push({
424
+ tag: eventData.tag,
425
+ payload: eventData.payload || {},
426
+ description: eventData.description,
427
+ });
428
+ }
429
+ break;
430
+ case 'fact':
431
+ if (node.data) {
432
+ const factData = node.data as { tag: string; payload?: Record<string, string>; description?: string };
433
+ facts.push({
434
+ tag: factData.tag,
435
+ payload: factData.payload || {},
436
+ description: factData.description,
437
+ });
438
+ }
439
+ break;
440
+ case 'rule':
441
+ if (node.data) {
442
+ const ruleData = node.data as { id: string; description?: string; on?: string[]; when?: string; then?: string; priority?: number };
443
+ rules.push({
444
+ id: ruleData.id,
445
+ description: ruleData.description || '',
446
+ on: ruleData.on,
447
+ when: ruleData.when,
448
+ then: ruleData.then || '',
449
+ priority: ruleData.priority,
450
+ });
451
+ }
452
+ break;
453
+ case 'constraint':
454
+ if (node.data) {
455
+ const constraintData = node.data as { id: string; description?: string; check?: string; message?: string };
456
+ constraints.push({
457
+ id: constraintData.id,
458
+ description: constraintData.description || '',
459
+ check: constraintData.check || 'true',
460
+ message: constraintData.message || '',
461
+ });
462
+ }
463
+ break;
464
+ }
465
+ }
466
+
467
+ // Create logic definition if we have any logic elements
468
+ if (events.length > 0 || facts.length > 0 || rules.length > 0 || constraints.length > 0) {
469
+ logic.push({
470
+ id: 'canvas-logic',
471
+ description: 'Logic extracted from canvas',
472
+ events: events.length > 0 ? events : undefined,
473
+ facts: facts.length > 0 ? facts : undefined,
474
+ rules: rules.length > 0 ? rules : undefined,
475
+ constraints: constraints.length > 0 ? constraints : undefined,
476
+ });
477
+ }
478
+
479
+ return {
480
+ version: canvas.version,
481
+ name: canvas.name,
482
+ description: canvas.metadata?.description,
483
+ models,
484
+ components,
485
+ logic,
486
+ };
487
+ }
488
+
489
+ /**
490
+ * Export canvas to YAML format (compatible with Obsidian Canvas)
491
+ */
492
+ export function canvasToYaml(canvas: CanvasDocument): string {
493
+ const lines: string[] = [
494
+ `# ${canvas.name}`,
495
+ `# Generated by Praxis CodeCanvas Integration`,
496
+ `# Version: ${canvas.version}`,
497
+ '',
498
+ 'nodes:',
499
+ ];
500
+
501
+ for (const node of canvas.nodes) {
502
+ lines.push(` - id: "${node.id}"`);
503
+ lines.push(` type: "${node.type}"`);
504
+ lines.push(` label: "${node.label}"`);
505
+ lines.push(` x: ${node.x}`);
506
+ lines.push(` y: ${node.y}`);
507
+ lines.push(` width: ${node.width}`);
508
+ lines.push(` height: ${node.height}`);
509
+ if (node.fsmState) {
510
+ lines.push(` fsmState: "${node.fsmState}"`);
511
+ }
512
+ lines.push('');
513
+ }
514
+
515
+ lines.push('edges:');
516
+ for (const edge of canvas.edges) {
517
+ lines.push(` - id: "${edge.id}"`);
518
+ lines.push(` source: "${edge.source}"`);
519
+ lines.push(` target: "${edge.target}"`);
520
+ if (edge.label) {
521
+ lines.push(` label: "${edge.label}"`);
522
+ }
523
+ if (edge.type) {
524
+ lines.push(` type: "${edge.type}"`);
525
+ }
526
+ lines.push('');
527
+ }
528
+
529
+ return lines.join('\n');
530
+ }
531
+
532
+ /**
533
+ * Export canvas to Mermaid diagram format
534
+ */
535
+ export function canvasToMermaid(canvas: CanvasDocument): string {
536
+ const lines: string[] = [
537
+ 'graph TD',
538
+ ];
539
+
540
+ // Add node definitions with styling
541
+ for (const node of canvas.nodes) {
542
+ let shape: string;
543
+ switch (node.type) {
544
+ case 'model':
545
+ shape = `[${node.label}]`;
546
+ break;
547
+ case 'component':
548
+ shape = `(${node.label})`;
549
+ break;
550
+ case 'event':
551
+ shape = `{{${node.label}}}`;
552
+ break;
553
+ case 'fact':
554
+ shape = `((${node.label}))`;
555
+ break;
556
+ case 'rule':
557
+ shape = `[/${node.label}/]`;
558
+ break;
559
+ case 'constraint':
560
+ shape = `[\\${node.label}\\]`;
561
+ break;
562
+ default:
563
+ shape = `[${node.label}]`;
564
+ }
565
+ lines.push(` ${node.id}${shape}`);
566
+ }
567
+
568
+ lines.push('');
569
+
570
+ // Add edges
571
+ for (const edge of canvas.edges) {
572
+ const label = edge.label ? `|${edge.label}|` : '';
573
+ lines.push(` ${edge.source} -->${label} ${edge.target}`);
574
+ }
575
+
576
+ return lines.join('\n');
577
+ }
578
+
579
+ /**
580
+ * Validate files against FSM lifecycle rules
581
+ *
582
+ * This provides integration with the CodeCanvas Guardian for pre-commit validation.
583
+ */
584
+ export function validateWithGuardian(
585
+ files: string[],
586
+ activity: ActivityState,
587
+ lifecycle: LifecycleState[]
588
+ ): GuardianResult {
589
+ const errors: GuardianError[] = [];
590
+ const warnings: GuardianWarning[] = [];
591
+
592
+ // Check if activity is in a valid state
593
+ const currentState = lifecycle.find(s => s.id === activity.activity);
594
+ if (!currentState) {
595
+ errors.push({
596
+ code: 'INVALID_ACTIVITY',
597
+ message: `Activity "${activity.activity}" is not a valid lifecycle state`,
598
+ rule: 'lifecycle-state',
599
+ });
600
+ }
601
+
602
+ // Validate file access based on allowed paths
603
+ if (activity.allowedPaths) {
604
+ for (const file of files) {
605
+ const allowed = activity.allowedPaths.some(pattern => {
606
+ // Simple glob matching
607
+ const regex = new RegExp('^' + pattern.replace(/\*/g, '.*') + '$');
608
+ return regex.test(file);
609
+ });
610
+
611
+ if (!allowed) {
612
+ errors.push({
613
+ code: 'PATH_NOT_ALLOWED',
614
+ message: `File "${file}" is not allowed during "${activity.activity}" activity`,
615
+ file,
616
+ rule: 'allowed-paths',
617
+ });
618
+ }
619
+ }
620
+ }
621
+
622
+ return {
623
+ valid: errors.length === 0,
624
+ errors,
625
+ warnings,
626
+ filesChecked: files,
627
+ activity,
628
+ };
629
+ }
630
+
631
+ /**
632
+ * Create a CodeCanvas editor instance
633
+ *
634
+ * Note: This is a placeholder for the visual editor integration.
635
+ * The actual visual editor requires a browser environment.
636
+ */
637
+ export function createCanvasEditor(config: CanvasEditorConfig): {
638
+ document: CanvasDocument;
639
+ addNode: (node: Omit<CanvasNode, 'id'>) => CanvasNode;
640
+ removeNode: (id: string) => void;
641
+ addEdge: (edge: Omit<CanvasEdge, 'id'>) => CanvasEdge;
642
+ removeEdge: (id: string) => void;
643
+ toSchema: () => PraxisSchema;
644
+ toYaml: () => string;
645
+ toMermaid: () => string;
646
+ } {
647
+ const document = config.document || (config.schema
648
+ ? schemaToCanvas(config.schema, { layout: config.layout })
649
+ : {
650
+ id: `canvas-${Date.now()}`,
651
+ name: 'New Canvas',
652
+ version: '1.0.0',
653
+ nodes: [],
654
+ edges: [],
655
+ metadata: { created: Date.now(), modified: Date.now() },
656
+ viewport: { x: 0, y: 0, zoom: 1 },
657
+ });
658
+
659
+ let nodeIdCounter = document.nodes.length;
660
+ let edgeIdCounter = document.edges.length;
661
+
662
+ return {
663
+ document,
664
+
665
+ addNode(node: Omit<CanvasNode, 'id'>): CanvasNode {
666
+ const fullNode: CanvasNode = {
667
+ ...node,
668
+ id: `node-${nodeIdCounter++}`,
669
+ };
670
+ document.nodes.push(fullNode);
671
+ document.metadata!.modified = Date.now();
672
+ return fullNode;
673
+ },
674
+
675
+ removeNode(id: string): void {
676
+ const index = document.nodes.findIndex(n => n.id === id);
677
+ if (index !== -1) {
678
+ document.nodes.splice(index, 1);
679
+ // Also remove connected edges
680
+ document.edges = document.edges.filter(
681
+ e => e.source !== id && e.target !== id
682
+ );
683
+ document.metadata!.modified = Date.now();
684
+ }
685
+ },
686
+
687
+ addEdge(edge: Omit<CanvasEdge, 'id'>): CanvasEdge {
688
+ const fullEdge: CanvasEdge = {
689
+ ...edge,
690
+ id: `edge-${edgeIdCounter++}`,
691
+ };
692
+ document.edges.push(fullEdge);
693
+ document.metadata!.modified = Date.now();
694
+ return fullEdge;
695
+ },
696
+
697
+ removeEdge(id: string): void {
698
+ const index = document.edges.findIndex(e => e.id === id);
699
+ if (index !== -1) {
700
+ document.edges.splice(index, 1);
701
+ document.metadata!.modified = Date.now();
702
+ }
703
+ },
704
+
705
+ toSchema(): PraxisSchema {
706
+ return canvasToSchema(document);
707
+ },
708
+
709
+ toYaml(): string {
710
+ return canvasToYaml(document);
711
+ },
712
+
713
+ toMermaid(): string {
714
+ return canvasToMermaid(document);
715
+ },
716
+ };
717
+ }