@plures/praxis 1.0.3 → 1.1.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 (530) hide show
  1. package/FRAMEWORK.md +55 -5
  2. package/README.md +162 -375
  3. package/core/codegen/docs-generator.ts +5 -2
  4. package/core/codegen/index.ts +1 -1
  5. package/core/db-adapter/index.ts +2 -2
  6. package/core/db-adapter/sync-engine.ts +17 -6
  7. package/core/logic-engine/engine.ts +1 -1
  8. package/core/logic-engine/index.ts +2 -2
  9. package/core/logic-engine/protocol.ts +1 -1
  10. package/core/logic-engine/psf-adapter.ts +8 -4
  11. package/core/logic-engine/rules.ts +1 -1
  12. package/core/schema-engine/compiler.ts +53 -11
  13. package/core/schema-engine/generator.ts +17 -7
  14. package/core/schema-engine/index.ts +2 -2
  15. package/core/schema-engine/psf.ts +12 -3
  16. package/core/schema-engine/types.ts +3 -11
  17. package/core/schema-engine/validator.ts +112 -22
  18. package/dist/browser/engine-BjdqxeXG.d.ts +333 -0
  19. package/dist/browser/index.d.ts +3004 -0
  20. package/dist/browser/index.js +2892 -0
  21. package/dist/{src → browser}/integrations/svelte.d.ts +19 -17
  22. package/dist/browser/integrations/svelte.js +298 -0
  23. package/dist/node/auth-STARLY7I.js +207 -0
  24. package/dist/node/build-Y7OT5VBF.js +144 -0
  25. package/dist/node/canvas-UERZHJYW.js +362 -0
  26. package/dist/node/chunk-DSDC2JWZ.js +256 -0
  27. package/dist/node/chunk-FXQZXAWF.js +175 -0
  28. package/dist/node/chunk-N5Y37EUV.js +202 -0
  29. package/dist/node/chunk-QGM4M3NI.js +37 -0
  30. package/dist/node/chunk-RJMWCNHR.js +175 -0
  31. package/dist/node/chunk-SRM3OPPM.js +404 -0
  32. package/dist/node/chunk-UATVJBNV.js +175 -0
  33. package/dist/node/chunk-UY7YEBE2.js +159 -0
  34. package/dist/node/chunk-XCY2VIFX.js +143 -0
  35. package/dist/node/chunk-YXH4Y7ZZ.js +349 -0
  36. package/dist/node/cli/index.cjs +215139 -0
  37. package/dist/node/cli/index.d.cts +1 -0
  38. package/dist/node/cli/index.d.ts +1 -0
  39. package/dist/node/cli/index.js +690 -0
  40. package/dist/node/cloud/index.cjs +1043 -0
  41. package/dist/node/cloud/index.d.cts +864 -0
  42. package/dist/node/cloud/index.d.ts +864 -0
  43. package/dist/node/cloud/index.js +456 -0
  44. package/dist/node/cloud-AXOK4PSN.js +212 -0
  45. package/dist/node/component.cjs +374 -0
  46. package/dist/node/component.d.cts +125 -0
  47. package/dist/{src/core/component/generator.d.ts → node/component.d.ts} +11 -8
  48. package/dist/node/component.js +9 -0
  49. package/dist/node/components/index.cjs +216 -0
  50. package/dist/node/components/index.d.cts +43 -0
  51. package/dist/{src → node}/components/index.d.ts +8 -8
  52. package/dist/node/components/index.js +7 -0
  53. package/dist/node/create-TRLSVCNQ.js +584 -0
  54. package/dist/node/dev-PMJZUYGE.js +65 -0
  55. package/dist/node/engine-1iqLe6_P.d.ts +214 -0
  56. package/dist/node/engine-CVJobhHm.d.cts +214 -0
  57. package/dist/node/index.cjs +3247 -0
  58. package/dist/node/index.d.cts +2579 -0
  59. package/dist/node/index.d.ts +2579 -0
  60. package/dist/node/index.js +2098 -0
  61. package/dist/node/integrations/svelte.cjs +330 -0
  62. package/dist/node/integrations/svelte.d.cts +309 -0
  63. package/dist/node/integrations/svelte.d.ts +309 -0
  64. package/dist/node/integrations/svelte.js +300 -0
  65. package/dist/node/orchestrate-737TCL5H.js +127 -0
  66. package/dist/{src/core/protocol.d.ts → node/protocol-Qek7ebBl.d.cts} +11 -10
  67. package/dist/node/protocol-Qek7ebBl.d.ts +122 -0
  68. package/dist/node/schema.cjs +200 -0
  69. package/dist/{src/core/schema/types.d.ts → node/schema.d.cts} +30 -29
  70. package/dist/node/schema.d.ts +371 -0
  71. package/dist/node/schema.js +9 -0
  72. package/dist/{src/runtime/terminal-adapter.d.ts → node/terminal-adapter-07HGftGQ.d.ts} +86 -11
  73. package/dist/node/terminal-adapter-XLtCjjb_.d.cts +231 -0
  74. package/dist/node/verify-QRYKRIDU.js +210960 -0
  75. package/docs/MONETIZATION.md +21 -16
  76. package/docs/REACTIVE_REDESIGN.md +132 -0
  77. package/docs/README.md +47 -36
  78. package/docs/SVELTE_INTEGRATION_STRATEGY.md +68 -0
  79. package/docs/TERMINAL_NODE.md +27 -24
  80. package/docs/core/building-extensions.md +58 -61
  81. package/docs/core/cli-usage.md +59 -59
  82. package/docs/core/code-canvas-sync.md +28 -16
  83. package/docs/core/logic-engine.md +77 -82
  84. package/docs/core/pluresdb-integration.md +29 -39
  85. package/docs/core/schema-model.md +66 -52
  86. package/docs/core/ui-generation.md +57 -49
  87. package/docs/core/what-is-praxis.md +32 -15
  88. package/docs/guides/canvas.md +21 -5
  89. package/docs/guides/getting-started.md +13 -7
  90. package/docs/guides/history-state-pattern.md +65 -51
  91. package/docs/guides/orchestration.md +46 -32
  92. package/docs/guides/parallel-state-pattern.md +56 -72
  93. package/docs/guides/svelte-integration.md +45 -53
  94. package/docs/tutorials/README.md +16 -0
  95. package/docs/tutorials/ecommerce-cart.md +177 -95
  96. package/docs/tutorials/first-app.md +26 -41
  97. package/docs/tutorials/form-builder.md +191 -138
  98. package/docs/tutorials/todo-pluresdb.md +71 -69
  99. package/package.json +58 -23
  100. package/src/__tests__/actors.test.ts +68 -68
  101. package/src/__tests__/billing.test.ts +32 -32
  102. package/src/__tests__/canvas-components.test.ts +94 -73
  103. package/src/__tests__/cli-create.test.ts +28 -28
  104. package/src/__tests__/cloud.test.ts +36 -36
  105. package/src/__tests__/code-canvas-integration.test.ts +132 -141
  106. package/src/__tests__/docs-generator.test.ts +3 -9
  107. package/src/__tests__/dsl.test.ts +58 -64
  108. package/src/__tests__/edge-cases.test.ts +106 -108
  109. package/src/__tests__/engine.test.ts +51 -25
  110. package/src/__tests__/generators.test.ts +42 -44
  111. package/src/__tests__/introspection.test.ts +104 -114
  112. package/src/__tests__/pluresdb.test.ts +189 -187
  113. package/src/__tests__/protocol.test.ts +15 -15
  114. package/src/__tests__/provisioning.test.ts +61 -61
  115. package/src/__tests__/schema.test.ts +7 -11
  116. package/src/__tests__/state-docs-integration.test.ts +162 -145
  117. package/src/__tests__/svelte-integration.test.ts +16 -19
  118. package/src/__tests__/tauri-integration.test.ts +149 -147
  119. package/src/__tests__/terminal-node.test.ts +12 -7
  120. package/src/__tests__/unum-integration.test.ts +68 -68
  121. package/src/adapters/cli.ts +21 -15
  122. package/src/cli/commands/auth.ts +82 -78
  123. package/src/cli/commands/build.ts +29 -27
  124. package/src/cli/commands/canvas.ts +338 -127
  125. package/src/cli/commands/cloud.ts +47 -47
  126. package/src/cli/commands/create.ts +59 -47
  127. package/src/cli/commands/dev.ts +12 -12
  128. package/src/cli/commands/generate.ts +29 -40
  129. package/src/cli/commands/orchestrate.ts +24 -24
  130. package/src/cli/commands/verify.ts +7 -8
  131. package/src/cli/index.ts +14 -10
  132. package/src/cloud/README.md +28 -15
  133. package/src/cloud/auth.ts +55 -70
  134. package/src/cloud/billing.ts +59 -58
  135. package/src/cloud/client.ts +29 -35
  136. package/src/cloud/index.ts +19 -40
  137. package/src/cloud/marketplace.ts +69 -78
  138. package/src/cloud/provisioning.ts +42 -51
  139. package/src/cloud/relay/endpoints.ts +30 -34
  140. package/src/cloud/relay/health/index.ts +1 -1
  141. package/src/cloud/relay/stats/index.ts +1 -1
  142. package/src/cloud/relay/sync/index.ts +1 -1
  143. package/src/cloud/relay/usage/index.ts +1 -1
  144. package/src/cloud/sponsors.ts +31 -34
  145. package/src/cloud/types.ts +4 -4
  146. package/src/components/README.md +1 -0
  147. package/src/components/index.ts +3 -4
  148. package/src/core/actors.ts +7 -7
  149. package/src/core/component/generator.ts +10 -28
  150. package/src/core/engine.ts +51 -24
  151. package/src/core/introspection.ts +37 -35
  152. package/src/core/logic/generator.ts +62 -62
  153. package/src/core/pluresdb/adapter.ts +8 -8
  154. package/src/core/pluresdb/generator.ts +39 -35
  155. package/src/core/pluresdb/index.ts +9 -12
  156. package/src/core/pluresdb/schema-registry.ts +22 -25
  157. package/src/core/pluresdb/store.ts +57 -57
  158. package/src/core/protocol.ts +14 -14
  159. package/src/core/reactive-engine.svelte.ts +65 -0
  160. package/src/core/reactive-engine.ts +67 -0
  161. package/src/core/rules.ts +4 -4
  162. package/src/core/schema/loader.common.ts +150 -0
  163. package/src/core/schema/loader.ts +19 -149
  164. package/src/core/schema/normalize.ts +34 -51
  165. package/src/core/schema/types.ts +47 -11
  166. package/src/dsl/index.ts +8 -8
  167. package/src/dsl.ts +11 -17
  168. package/src/examples/advanced-todo/README.md +58 -40
  169. package/src/examples/advanced-todo/index.ts +3 -3
  170. package/src/examples/auth-basic/index.ts +30 -30
  171. package/src/examples/cart/index.ts +50 -50
  172. package/src/examples/hero-ecommerce/index.ts +130 -157
  173. package/src/examples/svelte-counter/index.ts +22 -26
  174. package/src/flows.ts +6 -17
  175. package/src/index.browser.ts +204 -0
  176. package/src/index.ts +37 -42
  177. package/src/integrations/code-canvas.ts +237 -193
  178. package/src/integrations/pluresdb.ts +55 -35
  179. package/src/integrations/state-docs.ts +104 -104
  180. package/src/integrations/svelte.ts +35 -35
  181. package/src/integrations/tauri.ts +75 -73
  182. package/src/integrations/unum.ts +68 -61
  183. package/src/registry.ts +7 -14
  184. package/src/runtime/terminal-adapter.ts +31 -26
  185. package/src/step.ts +10 -16
  186. package/src/types.ts +1 -1
  187. package/templates/basic-app/README.md +6 -9
  188. package/templates/fullstack-app/README.md +10 -0
  189. package/dist/core/codegen/docs-generator.d.ts +0 -123
  190. package/dist/core/codegen/docs-generator.d.ts.map +0 -1
  191. package/dist/core/codegen/docs-generator.js +0 -674
  192. package/dist/core/codegen/docs-generator.js.map +0 -1
  193. package/dist/core/codegen/index.d.ts +0 -11
  194. package/dist/core/codegen/index.d.ts.map +0 -1
  195. package/dist/core/codegen/index.js +0 -13
  196. package/dist/core/codegen/index.js.map +0 -1
  197. package/dist/core/codegen/ts-generator.d.ts +0 -8
  198. package/dist/core/codegen/ts-generator.d.ts.map +0 -1
  199. package/dist/core/codegen/ts-generator.js +0 -8
  200. package/dist/core/codegen/ts-generator.js.map +0 -1
  201. package/dist/core/db-adapter/index.d.ts +0 -18
  202. package/dist/core/db-adapter/index.d.ts.map +0 -1
  203. package/dist/core/db-adapter/index.js +0 -23
  204. package/dist/core/db-adapter/index.js.map +0 -1
  205. package/dist/core/db-adapter/sync-engine.d.ts +0 -180
  206. package/dist/core/db-adapter/sync-engine.d.ts.map +0 -1
  207. package/dist/core/db-adapter/sync-engine.js +0 -342
  208. package/dist/core/db-adapter/sync-engine.js.map +0 -1
  209. package/dist/core/logic-engine/engine.d.ts +0 -8
  210. package/dist/core/logic-engine/engine.d.ts.map +0 -1
  211. package/dist/core/logic-engine/engine.js +0 -8
  212. package/dist/core/logic-engine/engine.js.map +0 -1
  213. package/dist/core/logic-engine/index.d.ts +0 -16
  214. package/dist/core/logic-engine/index.d.ts.map +0 -1
  215. package/dist/core/logic-engine/index.js +0 -16
  216. package/dist/core/logic-engine/index.js.map +0 -1
  217. package/dist/core/logic-engine/protocol.d.ts +0 -7
  218. package/dist/core/logic-engine/protocol.d.ts.map +0 -1
  219. package/dist/core/logic-engine/protocol.js +0 -7
  220. package/dist/core/logic-engine/protocol.js.map +0 -1
  221. package/dist/core/logic-engine/psf-adapter.d.ts +0 -88
  222. package/dist/core/logic-engine/psf-adapter.d.ts.map +0 -1
  223. package/dist/core/logic-engine/psf-adapter.js +0 -207
  224. package/dist/core/logic-engine/psf-adapter.js.map +0 -1
  225. package/dist/core/logic-engine/rules.d.ts +0 -7
  226. package/dist/core/logic-engine/rules.d.ts.map +0 -1
  227. package/dist/core/logic-engine/rules.js +0 -7
  228. package/dist/core/logic-engine/rules.js.map +0 -1
  229. package/dist/core/schema-engine/compiler.d.ts +0 -198
  230. package/dist/core/schema-engine/compiler.d.ts.map +0 -1
  231. package/dist/core/schema-engine/compiler.js +0 -262
  232. package/dist/core/schema-engine/compiler.js.map +0 -1
  233. package/dist/core/schema-engine/generator.d.ts +0 -115
  234. package/dist/core/schema-engine/generator.d.ts.map +0 -1
  235. package/dist/core/schema-engine/generator.js +0 -506
  236. package/dist/core/schema-engine/generator.js.map +0 -1
  237. package/dist/core/schema-engine/index.d.ts +0 -18
  238. package/dist/core/schema-engine/index.d.ts.map +0 -1
  239. package/dist/core/schema-engine/index.js +0 -18
  240. package/dist/core/schema-engine/index.js.map +0 -1
  241. package/dist/core/schema-engine/psf.d.ts +0 -612
  242. package/dist/core/schema-engine/psf.d.ts.map +0 -1
  243. package/dist/core/schema-engine/psf.js +0 -45
  244. package/dist/core/schema-engine/psf.js.map +0 -1
  245. package/dist/core/schema-engine/types.d.ts +0 -10
  246. package/dist/core/schema-engine/types.d.ts.map +0 -1
  247. package/dist/core/schema-engine/types.js +0 -7
  248. package/dist/core/schema-engine/types.js.map +0 -1
  249. package/dist/core/schema-engine/validator.d.ts +0 -140
  250. package/dist/core/schema-engine/validator.d.ts.map +0 -1
  251. package/dist/core/schema-engine/validator.js +0 -407
  252. package/dist/core/schema-engine/validator.js.map +0 -1
  253. package/dist/src/adapters/cli.d.ts +0 -43
  254. package/dist/src/adapters/cli.d.ts.map +0 -1
  255. package/dist/src/adapters/cli.js +0 -126
  256. package/dist/src/adapters/cli.js.map +0 -1
  257. package/dist/src/cli/commands/auth.d.ts +0 -26
  258. package/dist/src/cli/commands/auth.d.ts.map +0 -1
  259. package/dist/src/cli/commands/auth.js +0 -233
  260. package/dist/src/cli/commands/auth.js.map +0 -1
  261. package/dist/src/cli/commands/build.d.ts +0 -23
  262. package/dist/src/cli/commands/build.d.ts.map +0 -1
  263. package/dist/src/cli/commands/build.js +0 -162
  264. package/dist/src/cli/commands/build.js.map +0 -1
  265. package/dist/src/cli/commands/canvas.d.ts +0 -23
  266. package/dist/src/cli/commands/canvas.d.ts.map +0 -1
  267. package/dist/src/cli/commands/canvas.js +0 -215
  268. package/dist/src/cli/commands/canvas.js.map +0 -1
  269. package/dist/src/cli/commands/cloud.d.ts +0 -27
  270. package/dist/src/cli/commands/cloud.d.ts.map +0 -1
  271. package/dist/src/cli/commands/cloud.js +0 -232
  272. package/dist/src/cli/commands/cloud.js.map +0 -1
  273. package/dist/src/cli/commands/create.d.ts +0 -21
  274. package/dist/src/cli/commands/create.d.ts.map +0 -1
  275. package/dist/src/cli/commands/create.js +0 -621
  276. package/dist/src/cli/commands/create.js.map +0 -1
  277. package/dist/src/cli/commands/dev.d.ts +0 -21
  278. package/dist/src/cli/commands/dev.d.ts.map +0 -1
  279. package/dist/src/cli/commands/dev.js +0 -71
  280. package/dist/src/cli/commands/dev.js.map +0 -1
  281. package/dist/src/cli/commands/generate.d.ts +0 -25
  282. package/dist/src/cli/commands/generate.d.ts.map +0 -1
  283. package/dist/src/cli/commands/generate.js +0 -168
  284. package/dist/src/cli/commands/generate.js.map +0 -1
  285. package/dist/src/cli/commands/orchestrate.d.ts +0 -44
  286. package/dist/src/cli/commands/orchestrate.d.ts.map +0 -1
  287. package/dist/src/cli/commands/orchestrate.js +0 -150
  288. package/dist/src/cli/commands/orchestrate.js.map +0 -1
  289. package/dist/src/cli/commands/verify.d.ts +0 -10
  290. package/dist/src/cli/commands/verify.d.ts.map +0 -1
  291. package/dist/src/cli/commands/verify.js +0 -39
  292. package/dist/src/cli/commands/verify.js.map +0 -1
  293. package/dist/src/cli/index.d.ts +0 -8
  294. package/dist/src/cli/index.d.ts.map +0 -1
  295. package/dist/src/cli/index.js +0 -226
  296. package/dist/src/cli/index.js.map +0 -1
  297. package/dist/src/cloud/auth.d.ts +0 -51
  298. package/dist/src/cloud/auth.d.ts.map +0 -1
  299. package/dist/src/cloud/auth.js +0 -194
  300. package/dist/src/cloud/auth.js.map +0 -1
  301. package/dist/src/cloud/billing.d.ts +0 -184
  302. package/dist/src/cloud/billing.d.ts.map +0 -1
  303. package/dist/src/cloud/billing.js +0 -179
  304. package/dist/src/cloud/billing.js.map +0 -1
  305. package/dist/src/cloud/client.d.ts +0 -39
  306. package/dist/src/cloud/client.d.ts.map +0 -1
  307. package/dist/src/cloud/client.js +0 -176
  308. package/dist/src/cloud/client.js.map +0 -1
  309. package/dist/src/cloud/index.d.ts +0 -44
  310. package/dist/src/cloud/index.d.ts.map +0 -1
  311. package/dist/src/cloud/index.js +0 -44
  312. package/dist/src/cloud/index.js.map +0 -1
  313. package/dist/src/cloud/marketplace.d.ts +0 -166
  314. package/dist/src/cloud/marketplace.d.ts.map +0 -1
  315. package/dist/src/cloud/marketplace.js +0 -159
  316. package/dist/src/cloud/marketplace.js.map +0 -1
  317. package/dist/src/cloud/provisioning.d.ts +0 -110
  318. package/dist/src/cloud/provisioning.d.ts.map +0 -1
  319. package/dist/src/cloud/provisioning.js +0 -148
  320. package/dist/src/cloud/provisioning.js.map +0 -1
  321. package/dist/src/cloud/relay/endpoints.d.ts +0 -62
  322. package/dist/src/cloud/relay/endpoints.d.ts.map +0 -1
  323. package/dist/src/cloud/relay/endpoints.js +0 -217
  324. package/dist/src/cloud/relay/endpoints.js.map +0 -1
  325. package/dist/src/cloud/relay/health/index.d.ts +0 -5
  326. package/dist/src/cloud/relay/health/index.d.ts.map +0 -1
  327. package/dist/src/cloud/relay/health/index.js +0 -9
  328. package/dist/src/cloud/relay/health/index.js.map +0 -1
  329. package/dist/src/cloud/relay/stats/index.d.ts +0 -5
  330. package/dist/src/cloud/relay/stats/index.d.ts.map +0 -1
  331. package/dist/src/cloud/relay/stats/index.js +0 -9
  332. package/dist/src/cloud/relay/stats/index.js.map +0 -1
  333. package/dist/src/cloud/relay/sync/index.d.ts +0 -5
  334. package/dist/src/cloud/relay/sync/index.d.ts.map +0 -1
  335. package/dist/src/cloud/relay/sync/index.js +0 -9
  336. package/dist/src/cloud/relay/sync/index.js.map +0 -1
  337. package/dist/src/cloud/relay/usage/index.d.ts +0 -5
  338. package/dist/src/cloud/relay/usage/index.d.ts.map +0 -1
  339. package/dist/src/cloud/relay/usage/index.js +0 -9
  340. package/dist/src/cloud/relay/usage/index.js.map +0 -1
  341. package/dist/src/cloud/sponsors.d.ts +0 -81
  342. package/dist/src/cloud/sponsors.d.ts.map +0 -1
  343. package/dist/src/cloud/sponsors.js +0 -130
  344. package/dist/src/cloud/sponsors.js.map +0 -1
  345. package/dist/src/cloud/types.d.ts +0 -169
  346. package/dist/src/cloud/types.d.ts.map +0 -1
  347. package/dist/src/cloud/types.js +0 -7
  348. package/dist/src/cloud/types.js.map +0 -1
  349. package/dist/src/components/index.d.ts.map +0 -1
  350. package/dist/src/components/index.js +0 -17
  351. package/dist/src/components/index.js.map +0 -1
  352. package/dist/src/core/actors.d.ts +0 -95
  353. package/dist/src/core/actors.d.ts.map +0 -1
  354. package/dist/src/core/actors.js +0 -158
  355. package/dist/src/core/actors.js.map +0 -1
  356. package/dist/src/core/component/generator.d.ts.map +0 -1
  357. package/dist/src/core/component/generator.js +0 -349
  358. package/dist/src/core/component/generator.js.map +0 -1
  359. package/dist/src/core/engine.d.ts +0 -92
  360. package/dist/src/core/engine.d.ts.map +0 -1
  361. package/dist/src/core/engine.js +0 -199
  362. package/dist/src/core/engine.js.map +0 -1
  363. package/dist/src/core/introspection.d.ts +0 -141
  364. package/dist/src/core/introspection.d.ts.map +0 -1
  365. package/dist/src/core/introspection.js +0 -208
  366. package/dist/src/core/introspection.js.map +0 -1
  367. package/dist/src/core/logic/generator.d.ts +0 -76
  368. package/dist/src/core/logic/generator.d.ts.map +0 -1
  369. package/dist/src/core/logic/generator.js +0 -370
  370. package/dist/src/core/logic/generator.js.map +0 -1
  371. package/dist/src/core/pluresdb/adapter.d.ts +0 -72
  372. package/dist/src/core/pluresdb/adapter.d.ts.map +0 -1
  373. package/dist/src/core/pluresdb/adapter.js +0 -73
  374. package/dist/src/core/pluresdb/adapter.js.map +0 -1
  375. package/dist/src/core/pluresdb/generator.d.ts +0 -58
  376. package/dist/src/core/pluresdb/generator.d.ts.map +0 -1
  377. package/dist/src/core/pluresdb/generator.js +0 -191
  378. package/dist/src/core/pluresdb/generator.js.map +0 -1
  379. package/dist/src/core/pluresdb/index.d.ts +0 -15
  380. package/dist/src/core/pluresdb/index.d.ts.map +0 -1
  381. package/dist/src/core/pluresdb/index.js +0 -11
  382. package/dist/src/core/pluresdb/index.js.map +0 -1
  383. package/dist/src/core/pluresdb/schema-registry.d.ts +0 -104
  384. package/dist/src/core/pluresdb/schema-registry.d.ts.map +0 -1
  385. package/dist/src/core/pluresdb/schema-registry.js +0 -130
  386. package/dist/src/core/pluresdb/schema-registry.js.map +0 -1
  387. package/dist/src/core/pluresdb/store.d.ts +0 -199
  388. package/dist/src/core/pluresdb/store.d.ts.map +0 -1
  389. package/dist/src/core/pluresdb/store.js +0 -344
  390. package/dist/src/core/pluresdb/store.js.map +0 -1
  391. package/dist/src/core/protocol.d.ts.map +0 -1
  392. package/dist/src/core/protocol.js +0 -46
  393. package/dist/src/core/protocol.js.map +0 -1
  394. package/dist/src/core/rules.d.ts +0 -120
  395. package/dist/src/core/rules.d.ts.map +0 -1
  396. package/dist/src/core/rules.js +0 -81
  397. package/dist/src/core/rules.js.map +0 -1
  398. package/dist/src/core/schema/loader.d.ts +0 -47
  399. package/dist/src/core/schema/loader.d.ts.map +0 -1
  400. package/dist/src/core/schema/loader.js +0 -189
  401. package/dist/src/core/schema/loader.js.map +0 -1
  402. package/dist/src/core/schema/normalize.d.ts +0 -72
  403. package/dist/src/core/schema/normalize.d.ts.map +0 -1
  404. package/dist/src/core/schema/normalize.js +0 -190
  405. package/dist/src/core/schema/normalize.js.map +0 -1
  406. package/dist/src/core/schema/types.d.ts.map +0 -1
  407. package/dist/src/core/schema/types.js +0 -161
  408. package/dist/src/core/schema/types.js.map +0 -1
  409. package/dist/src/dsl/index.d.ts +0 -152
  410. package/dist/src/dsl/index.d.ts.map +0 -1
  411. package/dist/src/dsl/index.js +0 -132
  412. package/dist/src/dsl/index.js.map +0 -1
  413. package/dist/src/dsl.d.ts +0 -124
  414. package/dist/src/dsl.d.ts.map +0 -1
  415. package/dist/src/dsl.js +0 -130
  416. package/dist/src/dsl.js.map +0 -1
  417. package/dist/src/examples/advanced-todo/index.d.ts +0 -55
  418. package/dist/src/examples/advanced-todo/index.d.ts.map +0 -1
  419. package/dist/src/examples/advanced-todo/index.js +0 -222
  420. package/dist/src/examples/advanced-todo/index.js.map +0 -1
  421. package/dist/src/examples/auth-basic/index.d.ts +0 -17
  422. package/dist/src/examples/auth-basic/index.d.ts.map +0 -1
  423. package/dist/src/examples/auth-basic/index.js +0 -122
  424. package/dist/src/examples/auth-basic/index.js.map +0 -1
  425. package/dist/src/examples/cart/index.d.ts +0 -19
  426. package/dist/src/examples/cart/index.d.ts.map +0 -1
  427. package/dist/src/examples/cart/index.js +0 -202
  428. package/dist/src/examples/cart/index.js.map +0 -1
  429. package/dist/src/examples/hero-ecommerce/index.d.ts +0 -39
  430. package/dist/src/examples/hero-ecommerce/index.d.ts.map +0 -1
  431. package/dist/src/examples/hero-ecommerce/index.js +0 -506
  432. package/dist/src/examples/hero-ecommerce/index.js.map +0 -1
  433. package/dist/src/examples/svelte-counter/index.d.ts +0 -31
  434. package/dist/src/examples/svelte-counter/index.d.ts.map +0 -1
  435. package/dist/src/examples/svelte-counter/index.js +0 -123
  436. package/dist/src/examples/svelte-counter/index.js.map +0 -1
  437. package/dist/src/flows.d.ts +0 -125
  438. package/dist/src/flows.d.ts.map +0 -1
  439. package/dist/src/flows.js +0 -160
  440. package/dist/src/flows.js.map +0 -1
  441. package/dist/src/index.d.ts +0 -77
  442. package/dist/src/index.d.ts.map +0 -1
  443. package/dist/src/index.js +0 -64
  444. package/dist/src/index.js.map +0 -1
  445. package/dist/src/integrations/code-canvas.d.ts +0 -265
  446. package/dist/src/integrations/code-canvas.d.ts.map +0 -1
  447. package/dist/src/integrations/code-canvas.js +0 -451
  448. package/dist/src/integrations/code-canvas.js.map +0 -1
  449. package/dist/src/integrations/pluresdb.d.ts +0 -117
  450. package/dist/src/integrations/pluresdb.d.ts.map +0 -1
  451. package/dist/src/integrations/pluresdb.js +0 -117
  452. package/dist/src/integrations/pluresdb.js.map +0 -1
  453. package/dist/src/integrations/state-docs.d.ts +0 -191
  454. package/dist/src/integrations/state-docs.d.ts.map +0 -1
  455. package/dist/src/integrations/state-docs.js +0 -515
  456. package/dist/src/integrations/state-docs.js.map +0 -1
  457. package/dist/src/integrations/svelte.d.ts.map +0 -1
  458. package/dist/src/integrations/svelte.js +0 -447
  459. package/dist/src/integrations/svelte.js.map +0 -1
  460. package/dist/src/integrations/tauri.d.ts +0 -360
  461. package/dist/src/integrations/tauri.d.ts.map +0 -1
  462. package/dist/src/integrations/tauri.js +0 -278
  463. package/dist/src/integrations/tauri.js.map +0 -1
  464. package/dist/src/integrations/unum.d.ts +0 -159
  465. package/dist/src/integrations/unum.d.ts.map +0 -1
  466. package/dist/src/integrations/unum.js +0 -240
  467. package/dist/src/integrations/unum.js.map +0 -1
  468. package/dist/src/registry.d.ts +0 -94
  469. package/dist/src/registry.d.ts.map +0 -1
  470. package/dist/src/registry.js +0 -181
  471. package/dist/src/registry.js.map +0 -1
  472. package/dist/src/runtime/terminal-adapter.d.ts.map +0 -1
  473. package/dist/src/runtime/terminal-adapter.js +0 -239
  474. package/dist/src/runtime/terminal-adapter.js.map +0 -1
  475. package/dist/src/step.d.ts +0 -34
  476. package/dist/src/step.d.ts.map +0 -1
  477. package/dist/src/step.js +0 -111
  478. package/dist/src/step.js.map +0 -1
  479. package/dist/src/types.d.ts +0 -63
  480. package/dist/src/types.d.ts.map +0 -1
  481. package/dist/src/types.js +0 -6
  482. package/dist/src/types.js.map +0 -1
  483. package/dist/tools/ast-analyzer/src/ast-analyzer.d.ts +0 -8
  484. package/dist/tools/ast-analyzer/src/ast-analyzer.d.ts.map +0 -1
  485. package/dist/tools/ast-analyzer/src/ast-analyzer.js +0 -119
  486. package/dist/tools/ast-analyzer/src/ast-analyzer.js.map +0 -1
  487. package/dist/tools/cli/commands/index.d.ts +0 -7
  488. package/dist/tools/cli/commands/index.d.ts.map +0 -1
  489. package/dist/tools/cli/commands/index.js +0 -7
  490. package/dist/tools/cli/commands/index.js.map +0 -1
  491. package/dist/tools/cli/index.d.ts +0 -8
  492. package/dist/tools/cli/index.d.ts.map +0 -1
  493. package/dist/tools/cli/index.js +0 -9
  494. package/dist/tools/cli/index.js.map +0 -1
  495. package/dist/tools/watcher/index.d.ts +0 -105
  496. package/dist/tools/watcher/index.d.ts.map +0 -1
  497. package/dist/tools/watcher/index.js +0 -213
  498. package/dist/tools/watcher/index.js.map +0 -1
  499. package/dist/ui/canvas/canvas-projection.d.ts +0 -78
  500. package/dist/ui/canvas/canvas-projection.d.ts.map +0 -1
  501. package/dist/ui/canvas/canvas-projection.js +0 -416
  502. package/dist/ui/canvas/canvas-projection.js.map +0 -1
  503. package/dist/ui/canvas/canvas-state.d.ts +0 -200
  504. package/dist/ui/canvas/canvas-state.d.ts.map +0 -1
  505. package/dist/ui/canvas/canvas-state.js +0 -464
  506. package/dist/ui/canvas/canvas-state.js.map +0 -1
  507. package/dist/ui/canvas/components/index.d.ts +0 -95
  508. package/dist/ui/canvas/components/index.d.ts.map +0 -1
  509. package/dist/ui/canvas/components/index.js +0 -19
  510. package/dist/ui/canvas/components/index.js.map +0 -1
  511. package/dist/ui/canvas/index.d.ts +0 -32
  512. package/dist/ui/canvas/index.d.ts.map +0 -1
  513. package/dist/ui/canvas/index.js +0 -32
  514. package/dist/ui/canvas/index.js.map +0 -1
  515. package/dist/ui/canvas-inspector/src/server.d.ts +0 -2
  516. package/dist/ui/canvas-inspector/src/server.d.ts.map +0 -1
  517. package/dist/ui/canvas-inspector/src/server.js +0 -248
  518. package/dist/ui/canvas-inspector/src/server.js.map +0 -1
  519. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.d.ts +0 -5
  520. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.d.ts.map +0 -1
  521. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.js +0 -58
  522. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.js.map +0 -1
  523. package/dist/ui/svelte-generator/index.d.ts +0 -9
  524. package/dist/ui/svelte-generator/index.d.ts.map +0 -1
  525. package/dist/ui/svelte-generator/index.js +0 -11
  526. package/dist/ui/svelte-generator/index.js.map +0 -1
  527. package/dist/ui/svelte-generator/psf-generator.d.ts +0 -128
  528. package/dist/ui/svelte-generator/psf-generator.d.ts.map +0 -1
  529. package/dist/ui/svelte-generator/psf-generator.js +0 -506
  530. package/dist/ui/svelte-generator/psf-generator.js.map +0 -1
@@ -1,12 +1,13 @@
1
1
  /**
2
2
  * Canvas Command
3
- *
3
+ *
4
4
  * Opens the CodeCanvas visual schema editor.
5
5
  */
6
6
 
7
7
  import * as fs from 'fs';
8
8
  import * as path from 'path';
9
9
  import * as http from 'http';
10
+ import { spawn } from 'child_process';
10
11
  import {
11
12
  schemaToCanvas,
12
13
  canvasToYaml,
@@ -14,7 +15,7 @@ import {
14
15
  createCanvasEditor,
15
16
  } from '../../integrations/code-canvas.js';
16
17
  import { loadSchemaFromFile } from '../../core/schema/loader.js';
17
- import type { PraxisSchema } from '../../core/schema/types.js';
18
+ import type { PSFSchema } from '../../../core/schema-engine/psf.js';
18
19
 
19
20
  /**
20
21
  * Canvas command options
@@ -33,22 +34,25 @@ export interface CanvasOptions {
33
34
  /**
34
35
  * Open CodeCanvas for visual editing
35
36
  */
36
- export async function canvas(schemaPath: string | undefined, options: CanvasOptions): Promise<void> {
37
+ export async function canvas(
38
+ schemaPath: string | undefined,
39
+ options: CanvasOptions
40
+ ): Promise<void> {
37
41
  const port = parseInt(options.port || '3000', 10);
38
- const mode = options.mode || 'edit';
39
-
42
+ // const mode = options.mode || 'edit'; // Unused
43
+
40
44
  console.log('\n╔═══════════════════════════════════════════════════╗');
41
45
  console.log('║ CodeCanvas Visual Editor ║');
42
46
  console.log('╚═══════════════════════════════════════════════════╝\n');
43
-
47
+
44
48
  // If export format is specified, export and exit
45
49
  if (options.export) {
46
50
  await exportCanvas(schemaPath, options);
47
51
  return;
48
52
  }
49
-
53
+
50
54
  // Load schema if provided
51
- let schema: PraxisSchema | undefined;
55
+ let schema: PSFSchema | undefined;
52
56
  if (schemaPath && fs.existsSync(schemaPath)) {
53
57
  try {
54
58
  const result = await loadSchemaFromFile(schemaPath);
@@ -56,26 +60,179 @@ export async function canvas(schemaPath: string | undefined, options: CanvasOpti
56
60
  console.error(`Error loading schema: ${result.errors.join(', ')}`);
57
61
  process.exit(1);
58
62
  }
59
- schema = result.schema;
63
+ const loadedSchema = result.schema as any;
64
+ console.log('Loaded schema keys:', Object.keys(loadedSchema));
65
+ console.log('Has logic:', !!loadedSchema.logic);
66
+ console.log('Has events:', !!loadedSchema.events);
67
+
68
+ // Convert legacy schema to PSFSchema if needed
69
+ if (loadedSchema.logic && !loadedSchema.events) {
70
+ console.log('Converting legacy schema to PSF format...');
71
+ console.log(`Found ${loadedSchema.logic.length} logic groups.`);
72
+
73
+ // 1. Extract Rules and ensure IDs, tagging them with their source flow
74
+ const rules: any[] = [];
75
+ const flows: any[] = [];
76
+
77
+ loadedSchema.logic.forEach((l: any) => {
78
+ const flowId = l.id || 'default-flow';
79
+ console.log(`Processing flow: ${flowId}`);
80
+ flows.push({
81
+ id: flowId,
82
+ name: l.description || flowId,
83
+ type: 'sequence',
84
+ steps: [], // Populated implicitly by rules for now
85
+ description: l.description,
86
+ });
87
+
88
+ (l.rules || []).forEach((r: any) => {
89
+ rules.push({
90
+ ...r,
91
+ id: r.id || r.name,
92
+ triggers: r.on,
93
+ meta: { ...r.meta, flowId: flowId },
94
+ });
95
+ });
96
+ });
97
+
98
+ // Extract Facts and ensure IDs
99
+ const facts = loadedSchema.logic
100
+ .flatMap((l: any) => l.facts || [])
101
+ .map((f: any) => ({
102
+ ...f,
103
+ id: f.id || f.name,
104
+ }));
105
+
106
+ // 2. Infer Models from Rules
107
+ const inferredModels = new Map<string, any>();
108
+
109
+ // Always ensure core models exist for Azure DevOps Integration
110
+ inferredModels.set('Connection', {
111
+ id: 'Connection',
112
+ name: 'Connection',
113
+ description: 'Azure DevOps Connection',
114
+ properties: [
115
+ { name: 'id', type: 'string' },
116
+ { name: 'name', type: 'string' },
117
+ { name: 'orgUrl', type: 'string' },
118
+ { name: 'project', type: 'string' },
119
+ { name: 'token', type: 'string' },
120
+ ],
121
+ });
122
+
123
+ inferredModels.set('WorkItem', {
124
+ id: 'WorkItem',
125
+ name: 'WorkItem',
126
+ description: 'Azure DevOps Work Item',
127
+ properties: [
128
+ { name: 'id', type: 'number' },
129
+ { name: 'title', type: 'string' },
130
+ { name: 'state', type: 'string' },
131
+ { name: 'type', type: 'string' },
132
+ { name: 'assignedTo', type: 'string' },
133
+ ],
134
+ });
135
+
136
+ // 3. Extract Events Aggressively
137
+ const eventSet = new Set<string>();
138
+ // From explicit events list
139
+ loadedSchema.logic.forEach((l: any) => {
140
+ (l.events || []).forEach((e: any) => eventSet.add(typeof e === 'string' ? e : e.name));
141
+ });
142
+ // From rules
143
+ rules.forEach((r: any) => {
144
+ (r.on || []).forEach((e: string) => eventSet.add(e));
145
+ if (r.logic && r.logic.events) {
146
+ r.logic.events.forEach((e: string) => eventSet.add(e));
147
+ }
148
+ });
149
+
150
+ // 4. Generate Connections
151
+ const connections: any[] = [];
152
+ const factMap = new Map(facts.map((f: any) => [f.name, f.id]));
153
+
154
+ rules.forEach((r: any) => {
155
+ // Event -> Rule
156
+ (r.on || []).forEach((e: string) => {
157
+ connections.push({
158
+ id: `conn_evt_${e}_${r.id}`,
159
+ source: e,
160
+ target: r.id,
161
+ type: 'event',
162
+ label: 'triggers',
163
+ });
164
+ });
165
+
166
+ // Rule -> Fact (Heuristic)
167
+ if (r.do) {
168
+ const doStrs = Array.isArray(r.do) ? r.do : [r.do];
169
+ doStrs.forEach((action: string) => {
170
+ factMap.forEach((factId, factName) => {
171
+ if (typeof action === 'string' && action.includes(factName as string)) {
172
+ connections.push({
173
+ id: `conn_act_${r.id}_${factId}`,
174
+ source: r.id,
175
+ target: factId,
176
+ type: 'control',
177
+ label: 'updates',
178
+ });
179
+ }
180
+ });
181
+ });
182
+ }
183
+ });
184
+
185
+ schema = {
186
+ $version: loadedSchema.version || '1.0.0',
187
+ id: loadedSchema.name || 'schema',
188
+ name: loadedSchema.name,
189
+ description: loadedSchema.description,
190
+ models: [...(loadedSchema.models || []), ...inferredModels.values()],
191
+ components: loadedSchema.components || [],
192
+ events: Array.from(eventSet).map((name) => ({
193
+ id: name,
194
+ tag: name,
195
+ name: name,
196
+ payload: { type: 'object', properties: {} },
197
+ })),
198
+ facts: facts,
199
+ rules: rules,
200
+ constraints: loadedSchema.logic.flatMap((l: any) => l.constraints || []),
201
+ flows: flows,
202
+ canvas: {
203
+ connections: connections,
204
+ },
205
+ metadata: loadedSchema.metadata,
206
+ } as unknown as PSFSchema;
207
+ } else {
208
+ schema = loadedSchema as unknown as PSFSchema;
209
+ }
60
210
  console.log(`✓ Loaded schema: ${schemaPath}`);
61
211
  } catch (error) {
62
212
  console.error(`Error loading schema: ${error}`);
63
213
  process.exit(1);
64
214
  }
65
215
  }
66
-
216
+
67
217
  // Create canvas from schema
68
218
  const editor = createCanvasEditor({ schema, layout: 'hierarchical' });
69
-
70
- console.log(`\nStarting Canvas server on http://localhost:${port}`);
71
- console.log(`Mode: ${mode}\n`);
72
-
73
- // Start a simple HTTP server for the canvas
219
+
220
+ console.log(`\nStarting Canvas API server on http://localhost:${port}`);
221
+
222
+ // Start a simple HTTP server for the canvas API
74
223
  const server = http.createServer((req, res) => {
75
- if (req.url === '/') {
76
- res.writeHead(200, { 'Content-Type': 'text/html' });
77
- res.end(generateCanvasHtml(editor.document, mode));
78
- } else if (req.url === '/api/canvas') {
224
+ // Enable CORS for Vite dev server
225
+ res.setHeader('Access-Control-Allow-Origin', '*');
226
+ res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
227
+ res.setHeader('Access-Control-Allow-Headers', 'Content-Type');
228
+
229
+ if (req.method === 'OPTIONS') {
230
+ res.writeHead(200);
231
+ res.end();
232
+ return;
233
+ }
234
+
235
+ if (req.url === '/api/canvas') {
79
236
  res.writeHead(200, { 'Content-Type': 'application/json' });
80
237
  res.end(JSON.stringify(editor.document));
81
238
  } else if (req.url === '/api/mermaid') {
@@ -92,16 +249,59 @@ export async function canvas(schemaPath: string | undefined, options: CanvasOpti
92
249
  res.end('Not found');
93
250
  }
94
251
  });
95
-
252
+
96
253
  server.listen(port, () => {
97
- console.log('Canvas server running!');
98
- console.log(`\n Local: http://localhost:${port}`);
99
- console.log(` Mermaid: http://localhost:${port}/api/mermaid`);
100
- console.log(` YAML: http://localhost:${port}/api/yaml`);
101
- console.log(` Schema: http://localhost:${port}/api/schema\n`);
254
+ console.log('Canvas API server running!');
255
+
256
+ // Start Vite to serve the UI
257
+ console.log('Starting UI...');
258
+ const vitePort = 5173;
259
+
260
+ // Use npm exec to run vite from the praxis directory context
261
+ const isWin = process.platform === 'win32';
262
+ const cmd = isWin ? 'cmd.exe' : 'npm';
263
+ const args = isWin
264
+ ? [
265
+ '/d',
266
+ '/s',
267
+ '/c',
268
+ 'npm',
269
+ 'exec',
270
+ '--prefix',
271
+ 'praxis',
272
+ 'vite',
273
+ 'praxis/ui/canvas',
274
+ '--',
275
+ '--port',
276
+ vitePort.toString(),
277
+ ]
278
+ : [
279
+ 'exec',
280
+ '--prefix',
281
+ 'praxis',
282
+ 'vite',
283
+ 'praxis/ui/canvas',
284
+ '--',
285
+ '--port',
286
+ vitePort.toString(),
287
+ ];
288
+
289
+ const vite = spawn(cmd, args, {
290
+ stdio: 'inherit',
291
+ shell: false,
292
+ env: { ...process.env, API_URL: `http://localhost:${port}` },
293
+ });
294
+ console.log(`\n UI: http://localhost:${vitePort}`);
295
+ console.log(` API: http://localhost:${port}/api/canvas`);
102
296
  console.log('Press Ctrl+C to stop.\n');
297
+
298
+ vite.on('close', (code) => {
299
+ console.log(`UI process exited with code ${code}`);
300
+ server.close();
301
+ process.exit(code || 0);
302
+ });
103
303
  });
104
-
304
+
105
305
  // Handle shutdown
106
306
  process.on('SIGINT', () => {
107
307
  console.log('\nShutting down Canvas server...');
@@ -119,17 +319,121 @@ async function exportCanvas(schemaPath: string | undefined, options: CanvasOptio
119
319
  console.log('Usage: praxis canvas <schema-file> --export yaml --output schema.canvas.yaml');
120
320
  process.exit(1);
121
321
  }
122
-
322
+
123
323
  const result = await loadSchemaFromFile(schemaPath);
124
324
  if (result.errors.length > 0 || !result.schema) {
125
325
  console.error(`Error loading schema: ${result.errors.join(', ')}`);
126
326
  process.exit(1);
127
327
  }
128
- const canvas = schemaToCanvas(result.schema);
129
-
328
+ const loadedSchema = result.schema as any;
329
+ let schema: PSFSchema;
330
+
331
+ if (loadedSchema.logic && !loadedSchema.events) {
332
+ console.log('Converting legacy schema to PSF format...');
333
+
334
+ // 1. Extract Rules and ensure IDs, tagging them with their source flow
335
+ const rules: any[] = [];
336
+ const flows: any[] = [];
337
+
338
+ loadedSchema.logic.forEach((l: any) => {
339
+ const flowId = l.id || 'default-flow';
340
+ flows.push({
341
+ id: flowId,
342
+ name: l.description || flowId,
343
+ type: 'sequence',
344
+ steps: [], // Populated implicitly by rules for now
345
+ description: l.description,
346
+ });
347
+
348
+ (l.rules || []).forEach((r: any) => {
349
+ rules.push({
350
+ ...r,
351
+ id: r.id || r.name,
352
+ triggers: r.on,
353
+ meta: { ...r.meta, flowId: flowId },
354
+ });
355
+ });
356
+ });
357
+
358
+ // Extract Facts and ensure IDs
359
+ const facts = loadedSchema.logic
360
+ .flatMap((l: any) => l.facts || [])
361
+ .map((f: any) => ({
362
+ ...f,
363
+ id: f.id || f.name,
364
+ }));
365
+
366
+ // 2. Infer Models from Rules
367
+ const inferredModels = new Map<string, any>();
368
+
369
+ // Always ensure core models exist for Azure DevOps Integration
370
+ inferredModels.set('Connection', {
371
+ id: 'Connection',
372
+ name: 'Connection',
373
+ description: 'Azure DevOps Connection',
374
+ properties: [
375
+ { name: 'id', type: 'string' },
376
+ { name: 'name', type: 'string' },
377
+ { name: 'orgUrl', type: 'string' },
378
+ { name: 'project', type: 'string' },
379
+ { name: 'token', type: 'string' },
380
+ ],
381
+ });
382
+
383
+ inferredModels.set('WorkItem', {
384
+ id: 'WorkItem',
385
+ name: 'WorkItem',
386
+ description: 'Azure DevOps Work Item',
387
+ properties: [
388
+ { name: 'id', type: 'number' },
389
+ { name: 'title', type: 'string' },
390
+ { name: 'state', type: 'string' },
391
+ { name: 'type', type: 'string' },
392
+ { name: 'assignedTo', type: 'string' },
393
+ ],
394
+ });
395
+
396
+ // 3. Extract Events Aggressively
397
+ const eventSet = new Set<string>();
398
+ // From explicit events list
399
+ loadedSchema.logic.forEach((l: any) => {
400
+ (l.events || []).forEach((e: any) => eventSet.add(typeof e === 'string' ? e : e.name));
401
+ });
402
+ // From rules
403
+ rules.forEach((r: any) => {
404
+ (r.on || []).forEach((e: string) => eventSet.add(e));
405
+ if (r.logic && r.logic.events) {
406
+ r.logic.events.forEach((e: string) => eventSet.add(e));
407
+ }
408
+ });
409
+
410
+ schema = {
411
+ $version: loadedSchema.version || '1.0.0',
412
+ id: loadedSchema.name || 'schema',
413
+ name: loadedSchema.name,
414
+ description: loadedSchema.description,
415
+ models: [...(loadedSchema.models || []), ...inferredModels.values()],
416
+ components: loadedSchema.components || [],
417
+ events: Array.from(eventSet).map((name) => ({
418
+ id: name,
419
+ tag: name,
420
+ name: name,
421
+ payload: { type: 'object', properties: {} },
422
+ })),
423
+ facts: facts,
424
+ rules: rules,
425
+ constraints: loadedSchema.logic.flatMap((l: any) => l.constraints || []),
426
+ flows: flows,
427
+ metadata: loadedSchema.metadata,
428
+ } as PSFSchema;
429
+ } else {
430
+ schema = loadedSchema as unknown as PSFSchema;
431
+ }
432
+ const canvas = schemaToCanvas(schema);
433
+
130
434
  let output: string;
131
435
  let ext: string;
132
-
436
+
133
437
  switch (options.export) {
134
438
  case 'yaml':
135
439
  output = canvasToYaml(canvas);
@@ -144,103 +448,10 @@ async function exportCanvas(schemaPath: string | undefined, options: CanvasOptio
144
448
  output = JSON.stringify(canvas, null, 2);
145
449
  ext = 'json';
146
450
  }
147
-
148
- const outputPath = options.output || `${path.basename(schemaPath, path.extname(schemaPath))}.canvas.${ext}`;
451
+
452
+ const outputPath =
453
+ options.output || `${path.basename(schemaPath, path.extname(schemaPath))}.canvas.${ext}`;
149
454
  fs.writeFileSync(outputPath, output);
150
-
151
- console.log(`✓ Exported canvas to: ${outputPath}`);
152
- }
153
455
 
154
- /**
155
- * Generate HTML for canvas viewer
156
- */
157
- function generateCanvasHtml(document: ReturnType<typeof createCanvasEditor>['document'], mode: string): string {
158
- const mermaidDiagram = canvasToMermaid({
159
- id: document.id,
160
- name: document.name,
161
- version: document.version,
162
- nodes: document.nodes,
163
- edges: document.edges,
164
- });
165
-
166
- return `<!DOCTYPE html>
167
- <html lang="en">
168
- <head>
169
- <meta charset="UTF-8">
170
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
171
- <title>CodeCanvas - ${document.name}</title>
172
- <script src="https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js"></script>
173
- <style>
174
- * { box-sizing: border-box; margin: 0; padding: 0; }
175
- body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; background: #1a1a2e; color: #eee; }
176
- .header { background: #16213e; padding: 1rem 2rem; display: flex; justify-content: space-between; align-items: center; }
177
- .header h1 { font-size: 1.25rem; color: #00d9ff; }
178
- .header .mode { background: #0f3460; padding: 0.25rem 0.75rem; border-radius: 4px; font-size: 0.875rem; }
179
- .main { padding: 2rem; display: flex; gap: 2rem; }
180
- .canvas { flex: 1; background: #16213e; border-radius: 8px; padding: 1.5rem; min-height: 500px; }
181
- .sidebar { width: 300px; }
182
- .panel { background: #16213e; border-radius: 8px; padding: 1rem; margin-bottom: 1rem; }
183
- .panel h3 { font-size: 0.875rem; color: #00d9ff; margin-bottom: 0.75rem; text-transform: uppercase; letter-spacing: 0.05em; }
184
- .panel ul { list-style: none; }
185
- .panel li { padding: 0.5rem 0; border-bottom: 1px solid #0f3460; font-size: 0.875rem; }
186
- .panel li:last-child { border-bottom: none; }
187
- .mermaid { background: #fff; border-radius: 8px; padding: 1rem; }
188
- .stats { display: grid; grid-template-columns: repeat(2, 1fr); gap: 0.5rem; }
189
- .stat { background: #0f3460; padding: 0.75rem; border-radius: 4px; text-align: center; }
190
- .stat-value { font-size: 1.5rem; font-weight: bold; color: #00d9ff; }
191
- .stat-label { font-size: 0.75rem; color: #888; }
192
- </style>
193
- </head>
194
- <body>
195
- <div class="header">
196
- <h1>🎨 CodeCanvas - ${document.name}</h1>
197
- <span class="mode">${mode.toUpperCase()} MODE</span>
198
- </div>
199
- <div class="main">
200
- <div class="canvas">
201
- <div class="mermaid">
202
- ${mermaidDiagram}
203
- </div>
204
- </div>
205
- <div class="sidebar">
206
- <div class="panel">
207
- <h3>Statistics</h3>
208
- <div class="stats">
209
- <div class="stat">
210
- <div class="stat-value">${document.nodes.filter(n => n.type === 'model').length}</div>
211
- <div class="stat-label">Models</div>
212
- </div>
213
- <div class="stat">
214
- <div class="stat-value">${document.nodes.filter(n => n.type === 'component').length}</div>
215
- <div class="stat-label">Components</div>
216
- </div>
217
- <div class="stat">
218
- <div class="stat-value">${document.nodes.filter(n => n.type === 'event').length}</div>
219
- <div class="stat-label">Events</div>
220
- </div>
221
- <div class="stat">
222
- <div class="stat-value">${document.nodes.filter(n => n.type === 'fact').length}</div>
223
- <div class="stat-label">Facts</div>
224
- </div>
225
- </div>
226
- </div>
227
- <div class="panel">
228
- <h3>Nodes</h3>
229
- <ul>
230
- ${document.nodes.map(n => `<li><strong>${n.type}:</strong> ${n.label}</li>`).join('\n ')}
231
- </ul>
232
- </div>
233
- <div class="panel">
234
- <h3>Edges</h3>
235
- <ul>
236
- ${document.edges.length ? document.edges.map(e => `<li>${e.source} → ${e.target}</li>`).join('\n ') : '<li>No edges</li>'}
237
- </ul>
238
- </div>
239
- </div>
240
- </div>
241
- <script>
242
- mermaid.initialize({ startOnLoad: true, theme: 'base' });
243
- </script>
244
- </body>
245
- </html>`;
456
+ console.log(`✓ Exported canvas to: ${outputPath}`);
246
457
  }