@plures/praxis 1.0.3 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (534) hide show
  1. package/FRAMEWORK.md +55 -5
  2. package/LICENSE +21 -21
  3. package/README.md +162 -375
  4. package/core/codegen/docs-generator.ts +5 -2
  5. package/core/codegen/index.ts +1 -1
  6. package/core/codegen/ts-generator.ts +15 -15
  7. package/core/db-adapter/index.ts +2 -2
  8. package/core/db-adapter/sync-engine.ts +17 -6
  9. package/core/logic-engine/engine.ts +1 -1
  10. package/core/logic-engine/index.ts +2 -2
  11. package/core/logic-engine/protocol.ts +1 -1
  12. package/core/logic-engine/psf-adapter.ts +8 -4
  13. package/core/logic-engine/rules.ts +1 -1
  14. package/core/schema-engine/compiler.ts +53 -11
  15. package/core/schema-engine/generator.ts +17 -7
  16. package/core/schema-engine/index.ts +2 -2
  17. package/core/schema-engine/psf.ts +12 -3
  18. package/core/schema-engine/types.ts +3 -11
  19. package/core/schema-engine/validator.ts +112 -22
  20. package/dist/browser/engine-BjdqxeXG.d.ts +333 -0
  21. package/dist/browser/index.d.ts +3004 -0
  22. package/dist/browser/index.js +2892 -0
  23. package/dist/{src → browser}/integrations/svelte.d.ts +19 -17
  24. package/dist/browser/integrations/svelte.js +298 -0
  25. package/dist/node/auth-STARLY7I.js +207 -0
  26. package/dist/node/build-Y7OT5VBF.js +144 -0
  27. package/dist/node/canvas-UERZHJYW.js +362 -0
  28. package/dist/node/chunk-DSDC2JWZ.js +256 -0
  29. package/dist/node/chunk-FXQZXAWF.js +175 -0
  30. package/dist/node/chunk-N5Y37EUV.js +202 -0
  31. package/dist/node/chunk-QGM4M3NI.js +37 -0
  32. package/dist/node/chunk-RJMWCNHR.js +175 -0
  33. package/dist/node/chunk-SRM3OPPM.js +404 -0
  34. package/dist/node/chunk-UATVJBNV.js +175 -0
  35. package/dist/node/chunk-UY7YEBE2.js +159 -0
  36. package/dist/node/chunk-XCY2VIFX.js +143 -0
  37. package/dist/node/chunk-YXH4Y7ZZ.js +349 -0
  38. package/dist/node/cli/index.cjs +217418 -0
  39. package/dist/node/cli/index.d.cts +1 -0
  40. package/dist/node/cli/index.d.ts +1 -0
  41. package/dist/node/cli/index.js +690 -0
  42. package/dist/node/cloud/index.cjs +1043 -0
  43. package/dist/node/cloud/index.d.cts +864 -0
  44. package/dist/node/cloud/index.d.ts +864 -0
  45. package/dist/node/cloud/index.js +456 -0
  46. package/dist/node/cloud-AXOK4PSN.js +212 -0
  47. package/dist/node/component.cjs +374 -0
  48. package/dist/node/component.d.cts +125 -0
  49. package/dist/{src/core/component/generator.d.ts → node/component.d.ts} +11 -8
  50. package/dist/node/component.js +9 -0
  51. package/dist/node/components/index.cjs +216 -0
  52. package/dist/node/components/index.d.cts +43 -0
  53. package/dist/{src → node}/components/index.d.ts +8 -8
  54. package/dist/node/components/index.js +7 -0
  55. package/dist/node/create-TRLSVCNQ.js +584 -0
  56. package/dist/node/dev-PMJZUYGE.js +65 -0
  57. package/dist/node/engine-1iqLe6_P.d.ts +214 -0
  58. package/dist/node/engine-CVJobhHm.d.cts +214 -0
  59. package/dist/node/index.cjs +3247 -0
  60. package/dist/node/index.d.cts +2579 -0
  61. package/dist/node/index.d.ts +2579 -0
  62. package/dist/node/index.js +2098 -0
  63. package/dist/node/integrations/svelte.cjs +330 -0
  64. package/dist/node/integrations/svelte.d.cts +309 -0
  65. package/dist/node/integrations/svelte.d.ts +309 -0
  66. package/dist/node/integrations/svelte.js +300 -0
  67. package/dist/node/orchestrate-737TCL5H.js +127 -0
  68. package/dist/{src/core/protocol.d.ts → node/protocol-Qek7ebBl.d.cts} +11 -10
  69. package/dist/node/protocol-Qek7ebBl.d.ts +122 -0
  70. package/dist/node/schema.cjs +200 -0
  71. package/dist/{src/core/schema/types.d.ts → node/schema.d.cts} +30 -29
  72. package/dist/node/schema.d.ts +371 -0
  73. package/dist/node/schema.js +9 -0
  74. package/dist/{src/runtime/terminal-adapter.d.ts → node/terminal-adapter-07HGftGQ.d.ts} +86 -11
  75. package/dist/node/terminal-adapter-XLtCjjb_.d.cts +231 -0
  76. package/dist/node/verify-YBZ7W24H.js +213239 -0
  77. package/docs/MONETIZATION.md +21 -16
  78. package/docs/REACTIVE_REDESIGN.md +132 -0
  79. package/docs/README.md +47 -36
  80. package/docs/SVELTE_INTEGRATION_STRATEGY.md +68 -0
  81. package/docs/TERMINAL_NODE.md +27 -24
  82. package/docs/core/building-extensions.md +58 -61
  83. package/docs/core/cli-usage.md +59 -59
  84. package/docs/core/code-canvas-sync.md +28 -16
  85. package/docs/core/logic-engine.md +77 -82
  86. package/docs/core/pluresdb-integration.md +29 -39
  87. package/docs/core/schema-model.md +66 -52
  88. package/docs/core/ui-generation.md +57 -49
  89. package/docs/core/what-is-praxis.md +32 -15
  90. package/docs/guides/canvas.md +21 -5
  91. package/docs/guides/getting-started.md +13 -7
  92. package/docs/guides/history-state-pattern.md +65 -51
  93. package/docs/guides/orchestration.md +46 -32
  94. package/docs/guides/parallel-state-pattern.md +56 -72
  95. package/docs/guides/svelte-integration.md +45 -53
  96. package/docs/tutorials/README.md +16 -0
  97. package/docs/tutorials/ecommerce-cart.md +177 -95
  98. package/docs/tutorials/first-app.md +26 -41
  99. package/docs/tutorials/form-builder.md +191 -138
  100. package/docs/tutorials/todo-pluresdb.md +71 -69
  101. package/package.json +132 -97
  102. package/src/__tests__/actors.test.ts +68 -68
  103. package/src/__tests__/billing.test.ts +32 -32
  104. package/src/__tests__/canvas-components.test.ts +94 -73
  105. package/src/__tests__/cli-create.test.ts +28 -28
  106. package/src/__tests__/cloud.test.ts +36 -36
  107. package/src/__tests__/code-canvas-integration.test.ts +132 -141
  108. package/src/__tests__/docs-generator.test.ts +3 -9
  109. package/src/__tests__/dsl.test.ts +58 -64
  110. package/src/__tests__/edge-cases.test.ts +106 -108
  111. package/src/__tests__/engine.test.ts +51 -25
  112. package/src/__tests__/generators.test.ts +42 -44
  113. package/src/__tests__/introspection.test.ts +104 -114
  114. package/src/__tests__/pluresdb.test.ts +189 -187
  115. package/src/__tests__/protocol.test.ts +15 -15
  116. package/src/__tests__/provisioning.test.ts +61 -61
  117. package/src/__tests__/schema.test.ts +7 -11
  118. package/src/__tests__/state-docs-integration.test.ts +162 -145
  119. package/src/__tests__/svelte-integration.test.ts +16 -19
  120. package/src/__tests__/tauri-integration.test.ts +149 -147
  121. package/src/__tests__/terminal-node.test.ts +12 -7
  122. package/src/__tests__/unum-integration.test.ts +68 -68
  123. package/src/adapters/cli.ts +21 -15
  124. package/src/cli/commands/auth.ts +82 -78
  125. package/src/cli/commands/build.ts +29 -27
  126. package/src/cli/commands/canvas.ts +338 -127
  127. package/src/cli/commands/cloud.ts +47 -47
  128. package/src/cli/commands/create.ts +59 -47
  129. package/src/cli/commands/dev.ts +12 -12
  130. package/src/cli/commands/generate.ts +29 -40
  131. package/src/cli/commands/orchestrate.ts +24 -24
  132. package/src/cli/commands/verify.ts +7 -8
  133. package/src/cli/index.ts +14 -10
  134. package/src/cloud/README.md +28 -15
  135. package/src/cloud/auth.ts +55 -70
  136. package/src/cloud/billing.ts +59 -58
  137. package/src/cloud/client.ts +29 -35
  138. package/src/cloud/index.ts +19 -40
  139. package/src/cloud/marketplace.ts +69 -78
  140. package/src/cloud/provisioning.ts +42 -51
  141. package/src/cloud/relay/endpoints.ts +30 -34
  142. package/src/cloud/relay/health/index.ts +1 -1
  143. package/src/cloud/relay/stats/index.ts +1 -1
  144. package/src/cloud/relay/sync/index.ts +1 -1
  145. package/src/cloud/relay/usage/index.ts +1 -1
  146. package/src/cloud/sponsors.ts +31 -34
  147. package/src/cloud/types.ts +4 -4
  148. package/src/components/README.md +1 -0
  149. package/src/components/TerminalNode.svelte +457 -457
  150. package/src/components/index.ts +3 -4
  151. package/src/core/actors.ts +7 -7
  152. package/src/core/component/generator.ts +10 -28
  153. package/src/core/engine.ts +51 -24
  154. package/src/core/introspection.ts +37 -35
  155. package/src/core/logic/generator.ts +62 -62
  156. package/src/core/pluresdb/adapter.ts +8 -8
  157. package/src/core/pluresdb/generator.ts +39 -35
  158. package/src/core/pluresdb/index.ts +9 -12
  159. package/src/core/pluresdb/schema-registry.ts +22 -25
  160. package/src/core/pluresdb/store.ts +57 -57
  161. package/src/core/protocol.ts +14 -14
  162. package/src/core/reactive-engine.svelte.ts +65 -0
  163. package/src/core/reactive-engine.ts +67 -0
  164. package/src/core/rules.ts +4 -4
  165. package/src/core/schema/loader.common.ts +150 -0
  166. package/src/core/schema/loader.ts +19 -149
  167. package/src/core/schema/normalize.ts +34 -51
  168. package/src/core/schema/types.ts +47 -11
  169. package/src/dsl/index.ts +8 -8
  170. package/src/dsl.ts +11 -17
  171. package/src/examples/advanced-todo/App.svelte +506 -506
  172. package/src/examples/advanced-todo/README.md +58 -40
  173. package/src/examples/advanced-todo/index.ts +3 -3
  174. package/src/examples/auth-basic/index.ts +30 -30
  175. package/src/examples/cart/index.ts +50 -50
  176. package/src/examples/hero-ecommerce/index.ts +130 -157
  177. package/src/examples/svelte-counter/index.ts +22 -26
  178. package/src/flows.ts +6 -17
  179. package/src/index.browser.ts +204 -0
  180. package/src/index.ts +37 -42
  181. package/src/integrations/code-canvas.ts +237 -193
  182. package/src/integrations/pluresdb.ts +55 -35
  183. package/src/integrations/state-docs.ts +104 -104
  184. package/src/integrations/svelte.ts +35 -35
  185. package/src/integrations/tauri.ts +75 -73
  186. package/src/integrations/unum.ts +68 -61
  187. package/src/registry.ts +7 -14
  188. package/src/runtime/terminal-adapter.ts +31 -26
  189. package/src/step.ts +10 -16
  190. package/src/types.ts +1 -1
  191. package/templates/basic-app/README.md +6 -9
  192. package/templates/fullstack-app/README.md +10 -0
  193. package/dist/core/codegen/docs-generator.d.ts +0 -123
  194. package/dist/core/codegen/docs-generator.d.ts.map +0 -1
  195. package/dist/core/codegen/docs-generator.js +0 -674
  196. package/dist/core/codegen/docs-generator.js.map +0 -1
  197. package/dist/core/codegen/index.d.ts +0 -11
  198. package/dist/core/codegen/index.d.ts.map +0 -1
  199. package/dist/core/codegen/index.js +0 -13
  200. package/dist/core/codegen/index.js.map +0 -1
  201. package/dist/core/codegen/ts-generator.d.ts +0 -8
  202. package/dist/core/codegen/ts-generator.d.ts.map +0 -1
  203. package/dist/core/codegen/ts-generator.js +0 -8
  204. package/dist/core/codegen/ts-generator.js.map +0 -1
  205. package/dist/core/db-adapter/index.d.ts +0 -18
  206. package/dist/core/db-adapter/index.d.ts.map +0 -1
  207. package/dist/core/db-adapter/index.js +0 -23
  208. package/dist/core/db-adapter/index.js.map +0 -1
  209. package/dist/core/db-adapter/sync-engine.d.ts +0 -180
  210. package/dist/core/db-adapter/sync-engine.d.ts.map +0 -1
  211. package/dist/core/db-adapter/sync-engine.js +0 -342
  212. package/dist/core/db-adapter/sync-engine.js.map +0 -1
  213. package/dist/core/logic-engine/engine.d.ts +0 -8
  214. package/dist/core/logic-engine/engine.d.ts.map +0 -1
  215. package/dist/core/logic-engine/engine.js +0 -8
  216. package/dist/core/logic-engine/engine.js.map +0 -1
  217. package/dist/core/logic-engine/index.d.ts +0 -16
  218. package/dist/core/logic-engine/index.d.ts.map +0 -1
  219. package/dist/core/logic-engine/index.js +0 -16
  220. package/dist/core/logic-engine/index.js.map +0 -1
  221. package/dist/core/logic-engine/protocol.d.ts +0 -7
  222. package/dist/core/logic-engine/protocol.d.ts.map +0 -1
  223. package/dist/core/logic-engine/protocol.js +0 -7
  224. package/dist/core/logic-engine/protocol.js.map +0 -1
  225. package/dist/core/logic-engine/psf-adapter.d.ts +0 -88
  226. package/dist/core/logic-engine/psf-adapter.d.ts.map +0 -1
  227. package/dist/core/logic-engine/psf-adapter.js +0 -207
  228. package/dist/core/logic-engine/psf-adapter.js.map +0 -1
  229. package/dist/core/logic-engine/rules.d.ts +0 -7
  230. package/dist/core/logic-engine/rules.d.ts.map +0 -1
  231. package/dist/core/logic-engine/rules.js +0 -7
  232. package/dist/core/logic-engine/rules.js.map +0 -1
  233. package/dist/core/schema-engine/compiler.d.ts +0 -198
  234. package/dist/core/schema-engine/compiler.d.ts.map +0 -1
  235. package/dist/core/schema-engine/compiler.js +0 -262
  236. package/dist/core/schema-engine/compiler.js.map +0 -1
  237. package/dist/core/schema-engine/generator.d.ts +0 -115
  238. package/dist/core/schema-engine/generator.d.ts.map +0 -1
  239. package/dist/core/schema-engine/generator.js +0 -506
  240. package/dist/core/schema-engine/generator.js.map +0 -1
  241. package/dist/core/schema-engine/index.d.ts +0 -18
  242. package/dist/core/schema-engine/index.d.ts.map +0 -1
  243. package/dist/core/schema-engine/index.js +0 -18
  244. package/dist/core/schema-engine/index.js.map +0 -1
  245. package/dist/core/schema-engine/psf.d.ts +0 -612
  246. package/dist/core/schema-engine/psf.d.ts.map +0 -1
  247. package/dist/core/schema-engine/psf.js +0 -45
  248. package/dist/core/schema-engine/psf.js.map +0 -1
  249. package/dist/core/schema-engine/types.d.ts +0 -10
  250. package/dist/core/schema-engine/types.d.ts.map +0 -1
  251. package/dist/core/schema-engine/types.js +0 -7
  252. package/dist/core/schema-engine/types.js.map +0 -1
  253. package/dist/core/schema-engine/validator.d.ts +0 -140
  254. package/dist/core/schema-engine/validator.d.ts.map +0 -1
  255. package/dist/core/schema-engine/validator.js +0 -407
  256. package/dist/core/schema-engine/validator.js.map +0 -1
  257. package/dist/src/adapters/cli.d.ts +0 -43
  258. package/dist/src/adapters/cli.d.ts.map +0 -1
  259. package/dist/src/adapters/cli.js +0 -126
  260. package/dist/src/adapters/cli.js.map +0 -1
  261. package/dist/src/cli/commands/auth.d.ts +0 -26
  262. package/dist/src/cli/commands/auth.d.ts.map +0 -1
  263. package/dist/src/cli/commands/auth.js +0 -233
  264. package/dist/src/cli/commands/auth.js.map +0 -1
  265. package/dist/src/cli/commands/build.d.ts +0 -23
  266. package/dist/src/cli/commands/build.d.ts.map +0 -1
  267. package/dist/src/cli/commands/build.js +0 -162
  268. package/dist/src/cli/commands/build.js.map +0 -1
  269. package/dist/src/cli/commands/canvas.d.ts +0 -23
  270. package/dist/src/cli/commands/canvas.d.ts.map +0 -1
  271. package/dist/src/cli/commands/canvas.js +0 -215
  272. package/dist/src/cli/commands/canvas.js.map +0 -1
  273. package/dist/src/cli/commands/cloud.d.ts +0 -27
  274. package/dist/src/cli/commands/cloud.d.ts.map +0 -1
  275. package/dist/src/cli/commands/cloud.js +0 -232
  276. package/dist/src/cli/commands/cloud.js.map +0 -1
  277. package/dist/src/cli/commands/create.d.ts +0 -21
  278. package/dist/src/cli/commands/create.d.ts.map +0 -1
  279. package/dist/src/cli/commands/create.js +0 -621
  280. package/dist/src/cli/commands/create.js.map +0 -1
  281. package/dist/src/cli/commands/dev.d.ts +0 -21
  282. package/dist/src/cli/commands/dev.d.ts.map +0 -1
  283. package/dist/src/cli/commands/dev.js +0 -71
  284. package/dist/src/cli/commands/dev.js.map +0 -1
  285. package/dist/src/cli/commands/generate.d.ts +0 -25
  286. package/dist/src/cli/commands/generate.d.ts.map +0 -1
  287. package/dist/src/cli/commands/generate.js +0 -168
  288. package/dist/src/cli/commands/generate.js.map +0 -1
  289. package/dist/src/cli/commands/orchestrate.d.ts +0 -44
  290. package/dist/src/cli/commands/orchestrate.d.ts.map +0 -1
  291. package/dist/src/cli/commands/orchestrate.js +0 -150
  292. package/dist/src/cli/commands/orchestrate.js.map +0 -1
  293. package/dist/src/cli/commands/verify.d.ts +0 -10
  294. package/dist/src/cli/commands/verify.d.ts.map +0 -1
  295. package/dist/src/cli/commands/verify.js +0 -39
  296. package/dist/src/cli/commands/verify.js.map +0 -1
  297. package/dist/src/cli/index.d.ts +0 -8
  298. package/dist/src/cli/index.d.ts.map +0 -1
  299. package/dist/src/cli/index.js +0 -226
  300. package/dist/src/cli/index.js.map +0 -1
  301. package/dist/src/cloud/auth.d.ts +0 -51
  302. package/dist/src/cloud/auth.d.ts.map +0 -1
  303. package/dist/src/cloud/auth.js +0 -194
  304. package/dist/src/cloud/auth.js.map +0 -1
  305. package/dist/src/cloud/billing.d.ts +0 -184
  306. package/dist/src/cloud/billing.d.ts.map +0 -1
  307. package/dist/src/cloud/billing.js +0 -179
  308. package/dist/src/cloud/billing.js.map +0 -1
  309. package/dist/src/cloud/client.d.ts +0 -39
  310. package/dist/src/cloud/client.d.ts.map +0 -1
  311. package/dist/src/cloud/client.js +0 -176
  312. package/dist/src/cloud/client.js.map +0 -1
  313. package/dist/src/cloud/index.d.ts +0 -44
  314. package/dist/src/cloud/index.d.ts.map +0 -1
  315. package/dist/src/cloud/index.js +0 -44
  316. package/dist/src/cloud/index.js.map +0 -1
  317. package/dist/src/cloud/marketplace.d.ts +0 -166
  318. package/dist/src/cloud/marketplace.d.ts.map +0 -1
  319. package/dist/src/cloud/marketplace.js +0 -159
  320. package/dist/src/cloud/marketplace.js.map +0 -1
  321. package/dist/src/cloud/provisioning.d.ts +0 -110
  322. package/dist/src/cloud/provisioning.d.ts.map +0 -1
  323. package/dist/src/cloud/provisioning.js +0 -148
  324. package/dist/src/cloud/provisioning.js.map +0 -1
  325. package/dist/src/cloud/relay/endpoints.d.ts +0 -62
  326. package/dist/src/cloud/relay/endpoints.d.ts.map +0 -1
  327. package/dist/src/cloud/relay/endpoints.js +0 -217
  328. package/dist/src/cloud/relay/endpoints.js.map +0 -1
  329. package/dist/src/cloud/relay/health/index.d.ts +0 -5
  330. package/dist/src/cloud/relay/health/index.d.ts.map +0 -1
  331. package/dist/src/cloud/relay/health/index.js +0 -9
  332. package/dist/src/cloud/relay/health/index.js.map +0 -1
  333. package/dist/src/cloud/relay/stats/index.d.ts +0 -5
  334. package/dist/src/cloud/relay/stats/index.d.ts.map +0 -1
  335. package/dist/src/cloud/relay/stats/index.js +0 -9
  336. package/dist/src/cloud/relay/stats/index.js.map +0 -1
  337. package/dist/src/cloud/relay/sync/index.d.ts +0 -5
  338. package/dist/src/cloud/relay/sync/index.d.ts.map +0 -1
  339. package/dist/src/cloud/relay/sync/index.js +0 -9
  340. package/dist/src/cloud/relay/sync/index.js.map +0 -1
  341. package/dist/src/cloud/relay/usage/index.d.ts +0 -5
  342. package/dist/src/cloud/relay/usage/index.d.ts.map +0 -1
  343. package/dist/src/cloud/relay/usage/index.js +0 -9
  344. package/dist/src/cloud/relay/usage/index.js.map +0 -1
  345. package/dist/src/cloud/sponsors.d.ts +0 -81
  346. package/dist/src/cloud/sponsors.d.ts.map +0 -1
  347. package/dist/src/cloud/sponsors.js +0 -130
  348. package/dist/src/cloud/sponsors.js.map +0 -1
  349. package/dist/src/cloud/types.d.ts +0 -169
  350. package/dist/src/cloud/types.d.ts.map +0 -1
  351. package/dist/src/cloud/types.js +0 -7
  352. package/dist/src/cloud/types.js.map +0 -1
  353. package/dist/src/components/index.d.ts.map +0 -1
  354. package/dist/src/components/index.js +0 -17
  355. package/dist/src/components/index.js.map +0 -1
  356. package/dist/src/core/actors.d.ts +0 -95
  357. package/dist/src/core/actors.d.ts.map +0 -1
  358. package/dist/src/core/actors.js +0 -158
  359. package/dist/src/core/actors.js.map +0 -1
  360. package/dist/src/core/component/generator.d.ts.map +0 -1
  361. package/dist/src/core/component/generator.js +0 -349
  362. package/dist/src/core/component/generator.js.map +0 -1
  363. package/dist/src/core/engine.d.ts +0 -92
  364. package/dist/src/core/engine.d.ts.map +0 -1
  365. package/dist/src/core/engine.js +0 -199
  366. package/dist/src/core/engine.js.map +0 -1
  367. package/dist/src/core/introspection.d.ts +0 -141
  368. package/dist/src/core/introspection.d.ts.map +0 -1
  369. package/dist/src/core/introspection.js +0 -208
  370. package/dist/src/core/introspection.js.map +0 -1
  371. package/dist/src/core/logic/generator.d.ts +0 -76
  372. package/dist/src/core/logic/generator.d.ts.map +0 -1
  373. package/dist/src/core/logic/generator.js +0 -370
  374. package/dist/src/core/logic/generator.js.map +0 -1
  375. package/dist/src/core/pluresdb/adapter.d.ts +0 -72
  376. package/dist/src/core/pluresdb/adapter.d.ts.map +0 -1
  377. package/dist/src/core/pluresdb/adapter.js +0 -73
  378. package/dist/src/core/pluresdb/adapter.js.map +0 -1
  379. package/dist/src/core/pluresdb/generator.d.ts +0 -58
  380. package/dist/src/core/pluresdb/generator.d.ts.map +0 -1
  381. package/dist/src/core/pluresdb/generator.js +0 -191
  382. package/dist/src/core/pluresdb/generator.js.map +0 -1
  383. package/dist/src/core/pluresdb/index.d.ts +0 -15
  384. package/dist/src/core/pluresdb/index.d.ts.map +0 -1
  385. package/dist/src/core/pluresdb/index.js +0 -11
  386. package/dist/src/core/pluresdb/index.js.map +0 -1
  387. package/dist/src/core/pluresdb/schema-registry.d.ts +0 -104
  388. package/dist/src/core/pluresdb/schema-registry.d.ts.map +0 -1
  389. package/dist/src/core/pluresdb/schema-registry.js +0 -130
  390. package/dist/src/core/pluresdb/schema-registry.js.map +0 -1
  391. package/dist/src/core/pluresdb/store.d.ts +0 -199
  392. package/dist/src/core/pluresdb/store.d.ts.map +0 -1
  393. package/dist/src/core/pluresdb/store.js +0 -344
  394. package/dist/src/core/pluresdb/store.js.map +0 -1
  395. package/dist/src/core/protocol.d.ts.map +0 -1
  396. package/dist/src/core/protocol.js +0 -46
  397. package/dist/src/core/protocol.js.map +0 -1
  398. package/dist/src/core/rules.d.ts +0 -120
  399. package/dist/src/core/rules.d.ts.map +0 -1
  400. package/dist/src/core/rules.js +0 -81
  401. package/dist/src/core/rules.js.map +0 -1
  402. package/dist/src/core/schema/loader.d.ts +0 -47
  403. package/dist/src/core/schema/loader.d.ts.map +0 -1
  404. package/dist/src/core/schema/loader.js +0 -189
  405. package/dist/src/core/schema/loader.js.map +0 -1
  406. package/dist/src/core/schema/normalize.d.ts +0 -72
  407. package/dist/src/core/schema/normalize.d.ts.map +0 -1
  408. package/dist/src/core/schema/normalize.js +0 -190
  409. package/dist/src/core/schema/normalize.js.map +0 -1
  410. package/dist/src/core/schema/types.d.ts.map +0 -1
  411. package/dist/src/core/schema/types.js +0 -161
  412. package/dist/src/core/schema/types.js.map +0 -1
  413. package/dist/src/dsl/index.d.ts +0 -152
  414. package/dist/src/dsl/index.d.ts.map +0 -1
  415. package/dist/src/dsl/index.js +0 -132
  416. package/dist/src/dsl/index.js.map +0 -1
  417. package/dist/src/dsl.d.ts +0 -124
  418. package/dist/src/dsl.d.ts.map +0 -1
  419. package/dist/src/dsl.js +0 -130
  420. package/dist/src/dsl.js.map +0 -1
  421. package/dist/src/examples/advanced-todo/index.d.ts +0 -55
  422. package/dist/src/examples/advanced-todo/index.d.ts.map +0 -1
  423. package/dist/src/examples/advanced-todo/index.js +0 -222
  424. package/dist/src/examples/advanced-todo/index.js.map +0 -1
  425. package/dist/src/examples/auth-basic/index.d.ts +0 -17
  426. package/dist/src/examples/auth-basic/index.d.ts.map +0 -1
  427. package/dist/src/examples/auth-basic/index.js +0 -122
  428. package/dist/src/examples/auth-basic/index.js.map +0 -1
  429. package/dist/src/examples/cart/index.d.ts +0 -19
  430. package/dist/src/examples/cart/index.d.ts.map +0 -1
  431. package/dist/src/examples/cart/index.js +0 -202
  432. package/dist/src/examples/cart/index.js.map +0 -1
  433. package/dist/src/examples/hero-ecommerce/index.d.ts +0 -39
  434. package/dist/src/examples/hero-ecommerce/index.d.ts.map +0 -1
  435. package/dist/src/examples/hero-ecommerce/index.js +0 -506
  436. package/dist/src/examples/hero-ecommerce/index.js.map +0 -1
  437. package/dist/src/examples/svelte-counter/index.d.ts +0 -31
  438. package/dist/src/examples/svelte-counter/index.d.ts.map +0 -1
  439. package/dist/src/examples/svelte-counter/index.js +0 -123
  440. package/dist/src/examples/svelte-counter/index.js.map +0 -1
  441. package/dist/src/flows.d.ts +0 -125
  442. package/dist/src/flows.d.ts.map +0 -1
  443. package/dist/src/flows.js +0 -160
  444. package/dist/src/flows.js.map +0 -1
  445. package/dist/src/index.d.ts +0 -77
  446. package/dist/src/index.d.ts.map +0 -1
  447. package/dist/src/index.js +0 -64
  448. package/dist/src/index.js.map +0 -1
  449. package/dist/src/integrations/code-canvas.d.ts +0 -265
  450. package/dist/src/integrations/code-canvas.d.ts.map +0 -1
  451. package/dist/src/integrations/code-canvas.js +0 -451
  452. package/dist/src/integrations/code-canvas.js.map +0 -1
  453. package/dist/src/integrations/pluresdb.d.ts +0 -117
  454. package/dist/src/integrations/pluresdb.d.ts.map +0 -1
  455. package/dist/src/integrations/pluresdb.js +0 -117
  456. package/dist/src/integrations/pluresdb.js.map +0 -1
  457. package/dist/src/integrations/state-docs.d.ts +0 -191
  458. package/dist/src/integrations/state-docs.d.ts.map +0 -1
  459. package/dist/src/integrations/state-docs.js +0 -515
  460. package/dist/src/integrations/state-docs.js.map +0 -1
  461. package/dist/src/integrations/svelte.d.ts.map +0 -1
  462. package/dist/src/integrations/svelte.js +0 -447
  463. package/dist/src/integrations/svelte.js.map +0 -1
  464. package/dist/src/integrations/tauri.d.ts +0 -360
  465. package/dist/src/integrations/tauri.d.ts.map +0 -1
  466. package/dist/src/integrations/tauri.js +0 -278
  467. package/dist/src/integrations/tauri.js.map +0 -1
  468. package/dist/src/integrations/unum.d.ts +0 -159
  469. package/dist/src/integrations/unum.d.ts.map +0 -1
  470. package/dist/src/integrations/unum.js +0 -240
  471. package/dist/src/integrations/unum.js.map +0 -1
  472. package/dist/src/registry.d.ts +0 -94
  473. package/dist/src/registry.d.ts.map +0 -1
  474. package/dist/src/registry.js +0 -181
  475. package/dist/src/registry.js.map +0 -1
  476. package/dist/src/runtime/terminal-adapter.d.ts.map +0 -1
  477. package/dist/src/runtime/terminal-adapter.js +0 -239
  478. package/dist/src/runtime/terminal-adapter.js.map +0 -1
  479. package/dist/src/step.d.ts +0 -34
  480. package/dist/src/step.d.ts.map +0 -1
  481. package/dist/src/step.js +0 -111
  482. package/dist/src/step.js.map +0 -1
  483. package/dist/src/types.d.ts +0 -63
  484. package/dist/src/types.d.ts.map +0 -1
  485. package/dist/src/types.js +0 -6
  486. package/dist/src/types.js.map +0 -1
  487. package/dist/tools/ast-analyzer/src/ast-analyzer.d.ts +0 -8
  488. package/dist/tools/ast-analyzer/src/ast-analyzer.d.ts.map +0 -1
  489. package/dist/tools/ast-analyzer/src/ast-analyzer.js +0 -119
  490. package/dist/tools/ast-analyzer/src/ast-analyzer.js.map +0 -1
  491. package/dist/tools/cli/commands/index.d.ts +0 -7
  492. package/dist/tools/cli/commands/index.d.ts.map +0 -1
  493. package/dist/tools/cli/commands/index.js +0 -7
  494. package/dist/tools/cli/commands/index.js.map +0 -1
  495. package/dist/tools/cli/index.d.ts +0 -8
  496. package/dist/tools/cli/index.d.ts.map +0 -1
  497. package/dist/tools/cli/index.js +0 -9
  498. package/dist/tools/cli/index.js.map +0 -1
  499. package/dist/tools/watcher/index.d.ts +0 -105
  500. package/dist/tools/watcher/index.d.ts.map +0 -1
  501. package/dist/tools/watcher/index.js +0 -213
  502. package/dist/tools/watcher/index.js.map +0 -1
  503. package/dist/ui/canvas/canvas-projection.d.ts +0 -78
  504. package/dist/ui/canvas/canvas-projection.d.ts.map +0 -1
  505. package/dist/ui/canvas/canvas-projection.js +0 -416
  506. package/dist/ui/canvas/canvas-projection.js.map +0 -1
  507. package/dist/ui/canvas/canvas-state.d.ts +0 -200
  508. package/dist/ui/canvas/canvas-state.d.ts.map +0 -1
  509. package/dist/ui/canvas/canvas-state.js +0 -464
  510. package/dist/ui/canvas/canvas-state.js.map +0 -1
  511. package/dist/ui/canvas/components/index.d.ts +0 -95
  512. package/dist/ui/canvas/components/index.d.ts.map +0 -1
  513. package/dist/ui/canvas/components/index.js +0 -19
  514. package/dist/ui/canvas/components/index.js.map +0 -1
  515. package/dist/ui/canvas/index.d.ts +0 -32
  516. package/dist/ui/canvas/index.d.ts.map +0 -1
  517. package/dist/ui/canvas/index.js +0 -32
  518. package/dist/ui/canvas/index.js.map +0 -1
  519. package/dist/ui/canvas-inspector/src/server.d.ts +0 -2
  520. package/dist/ui/canvas-inspector/src/server.d.ts.map +0 -1
  521. package/dist/ui/canvas-inspector/src/server.js +0 -248
  522. package/dist/ui/canvas-inspector/src/server.js.map +0 -1
  523. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.d.ts +0 -5
  524. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.d.ts.map +0 -1
  525. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.js +0 -58
  526. package/dist/ui/canvas-inspector/src/verify-fsm-implementation.js.map +0 -1
  527. package/dist/ui/svelte-generator/index.d.ts +0 -9
  528. package/dist/ui/svelte-generator/index.d.ts.map +0 -1
  529. package/dist/ui/svelte-generator/index.js +0 -11
  530. package/dist/ui/svelte-generator/index.js.map +0 -1
  531. package/dist/ui/svelte-generator/psf-generator.d.ts +0 -128
  532. package/dist/ui/svelte-generator/psf-generator.d.ts.map +0 -1
  533. package/dist/ui/svelte-generator/psf-generator.js +0 -506
  534. 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
  }