@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,457 +1,457 @@
1
- <script lang="ts">
2
- /**
3
- * TerminalNode.svelte
4
- *
5
- * Svelte component for terminal nodes in Praxis/RuneBook.
6
- * Provides a terminal interface with command execution, history, and canvas integration.
7
- */
8
- import { onDestroy } from 'svelte';
9
- import type { TerminalAdapter } from '../runtime/terminal-adapter.js';
10
- import type { TerminalExecutionResult } from '../runtime/terminal-adapter.js';
11
-
12
- // Props
13
- export let adapter: TerminalAdapter;
14
- export let x: number = 0;
15
- export let y: number = 0;
16
- export let width: number = 600;
17
- export let height: number = 400;
18
- export let draggable: boolean = true;
19
- export let resizable: boolean = true;
20
- export let showContextMenu: boolean = false;
21
-
22
- // Local state
23
- let currentCommand = '';
24
- let isDragging = false;
25
- let isResizing = false;
26
- let dragStartX = 0;
27
- let dragStartY = 0;
28
- let resizeStartX = 0;
29
- let resizeStartY = 0;
30
- let resizeStartWidth = 0;
31
- let resizeStartHeight = 0;
32
- let terminalOutput: TerminalExecutionResult[] = [];
33
- let contextMenuX = 0;
34
- let contextMenuY = 0;
35
- let outputContainer: HTMLDivElement;
36
-
37
- // Get state from adapter
38
- $: state = adapter.getState();
39
- $: inputMode = state.inputMode;
40
- $: history = state.history;
41
- $: lastOutput = state.lastOutput;
42
-
43
- // Execute command
44
- async function executeCommand() {
45
- if (!currentCommand.trim()) return;
46
-
47
- const result = await adapter.executeCommand(currentCommand);
48
- terminalOutput = [...terminalOutput, result];
49
- currentCommand = '';
50
-
51
- // Auto-scroll to bottom after DOM update
52
- if (outputContainer) {
53
- setTimeout(() => {
54
- outputContainer.scrollTop = outputContainer.scrollHeight;
55
- }, 0);
56
- }
57
- }
58
-
59
- // Handle keyboard shortcuts
60
- function handleKeyDown(event: KeyboardEvent) {
61
- if (event.key === 'Enter' && !event.shiftKey) {
62
- event.preventDefault();
63
- executeCommand();
64
- }
65
- }
66
-
67
- // Drag handling
68
- function startDrag(event: MouseEvent) {
69
- if (!draggable) return;
70
- isDragging = true;
71
- dragStartX = event.clientX - x;
72
- dragStartY = event.clientY - y;
73
- }
74
-
75
- function handleDrag(event: MouseEvent) {
76
- if (!isDragging) return;
77
- x = event.clientX - dragStartX;
78
- y = event.clientY - dragStartY;
79
- }
80
-
81
- function stopDrag() {
82
- isDragging = false;
83
- }
84
-
85
- // Resize handling
86
- function startResize(event: MouseEvent) {
87
- if (!resizable) return;
88
- event.stopPropagation();
89
- isResizing = true;
90
- resizeStartX = event.clientX;
91
- resizeStartY = event.clientY;
92
- resizeStartWidth = width;
93
- resizeStartHeight = height;
94
- }
95
-
96
- function handleResize(event: MouseEvent) {
97
- if (!isResizing) return;
98
- const deltaX = event.clientX - resizeStartX;
99
- const deltaY = event.clientY - resizeStartY;
100
- width = Math.max(300, resizeStartWidth + deltaX);
101
- height = Math.max(200, resizeStartHeight + deltaY);
102
- }
103
-
104
- function stopResize() {
105
- isResizing = false;
106
- }
107
-
108
- // Context menu handling
109
- function handleContextMenu(event: MouseEvent) {
110
- event.preventDefault();
111
- contextMenuX = event.clientX;
112
- contextMenuY = event.clientY;
113
- showContextMenu = true;
114
- }
115
-
116
- function closeContextMenu() {
117
- showContextMenu = false;
118
- }
119
-
120
- function clearTerminal() {
121
- terminalOutput = [];
122
- adapter.clearHistory();
123
- closeContextMenu();
124
- }
125
-
126
- function copyLastOutput() {
127
- if (lastOutput) {
128
- navigator.clipboard.writeText(lastOutput);
129
- }
130
- closeContextMenu();
131
- }
132
-
133
- // Global mouse event listeners with proper cleanup
134
- let mouseMoveHandler: ((e: MouseEvent) => void) | null = null;
135
- let mouseUpHandler: (() => void) | null = null;
136
-
137
- $: {
138
- // Remove old listeners if they exist
139
- if (mouseMoveHandler) {
140
- window.removeEventListener('mousemove', mouseMoveHandler);
141
- }
142
- if (mouseUpHandler) {
143
- window.removeEventListener('mouseup', mouseUpHandler);
144
- }
145
-
146
- // Add new listeners if dragging or resizing
147
- if (isDragging) {
148
- mouseMoveHandler = handleDrag;
149
- mouseUpHandler = stopDrag;
150
- window.addEventListener('mousemove', mouseMoveHandler);
151
- window.addEventListener('mouseup', mouseUpHandler);
152
- } else if (isResizing) {
153
- mouseMoveHandler = handleResize;
154
- mouseUpHandler = stopResize;
155
- window.addEventListener('mousemove', mouseMoveHandler);
156
- window.addEventListener('mouseup', mouseUpHandler);
157
- } else {
158
- mouseMoveHandler = null;
159
- mouseUpHandler = null;
160
- }
161
- }
162
-
163
- // Cleanup event listeners on component destroy
164
- onDestroy(() => {
165
- if (mouseMoveHandler) {
166
- window.removeEventListener('mousemove', mouseMoveHandler);
167
- }
168
- if (mouseUpHandler) {
169
- window.removeEventListener('mouseup', mouseUpHandler);
170
- }
171
- });
172
-
173
- // Click outside to close context menu
174
- function handleDocumentClick() {
175
- if (showContextMenu) {
176
- closeContextMenu();
177
- }
178
- }
179
- </script>
180
-
181
- <svelte:window on:click={handleDocumentClick} />
182
-
183
- <div
184
- class="terminal-node"
185
- style="left: {x}px; top: {y}px; width: {width}px; height: {height}px;"
186
- on:contextmenu={handleContextMenu}
187
- role="application"
188
- aria-label="Terminal Node"
189
- >
190
- <!-- Title bar -->
191
- <div
192
- class="terminal-header"
193
- on:mousedown={startDrag}
194
- role="banner"
195
- >
196
- <span class="terminal-title">Terminal: {state.nodeId}</span>
197
- <span class="terminal-mode">Mode: {inputMode}</span>
198
- </div>
199
-
200
- <!-- Output area -->
201
- <div class="terminal-output" bind:this={outputContainer}>
202
- {#if terminalOutput.length === 0}
203
- <div class="terminal-empty">No output yet. Enter a command below.</div>
204
- {:else}
205
- {#each terminalOutput as result}
206
- <div class="terminal-result">
207
- <div class="terminal-command">$ {result.command}</div>
208
- <div class="terminal-result-output">{result.output}</div>
209
- {#if result.error}
210
- <div class="terminal-error">Error: {result.error}</div>
211
- {/if}
212
- </div>
213
- {/each}
214
- {/if}
215
- </div>
216
-
217
- <!-- Input area -->
218
- <div class="terminal-input-area">
219
- <span class="terminal-prompt">$</span>
220
- {#if inputMode === 'text'}
221
- <input
222
- type="text"
223
- class="terminal-input"
224
- bind:value={currentCommand}
225
- on:keydown={handleKeyDown}
226
- placeholder="Enter command..."
227
- aria-label="Terminal input"
228
- />
229
- {:else if inputMode === 'widget'}
230
- <textarea
231
- class="terminal-input terminal-input-widget"
232
- bind:value={currentCommand}
233
- on:keydown={handleKeyDown}
234
- placeholder="Enter command..."
235
- rows="1"
236
- aria-label="Terminal input widget"
237
- />
238
- {/if}
239
- <button class="terminal-submit" on:click={executeCommand}>Run</button>
240
- </div>
241
-
242
- <!-- Resize handle -->
243
- {#if resizable}
244
- <div
245
- class="terminal-resize-handle"
246
- on:mousedown={startResize}
247
- role="button"
248
- tabindex="0"
249
- aria-label="Resize terminal"
250
- />
251
- {/if}
252
-
253
- <!-- Context menu -->
254
- {#if showContextMenu}
255
- <div
256
- class="terminal-context-menu"
257
- style="left: {contextMenuX}px; top: {contextMenuY}px;"
258
- role="menu"
259
- >
260
- <button class="context-menu-item" on:click={clearTerminal}>Clear Terminal</button>
261
- <button class="context-menu-item" on:click={copyLastOutput} disabled={!lastOutput}>
262
- Copy Last Output
263
- </button>
264
- <button class="context-menu-item" on:click={closeContextMenu}>Close Menu</button>
265
- </div>
266
- {/if}
267
- </div>
268
-
269
- <style>
270
- .terminal-node {
271
- position: absolute;
272
- display: flex;
273
- flex-direction: column;
274
- background: #1e1e1e;
275
- border: 1px solid #3c3c3c;
276
- border-radius: 8px;
277
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
278
- font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
279
- color: #d4d4d4;
280
- overflow: hidden;
281
- }
282
-
283
- .terminal-header {
284
- display: flex;
285
- justify-content: space-between;
286
- align-items: center;
287
- padding: 8px 12px;
288
- background: #2d2d2d;
289
- border-bottom: 1px solid #3c3c3c;
290
- cursor: move;
291
- user-select: none;
292
- }
293
-
294
- .terminal-title {
295
- font-weight: 600;
296
- font-size: 14px;
297
- }
298
-
299
- .terminal-mode {
300
- font-size: 12px;
301
- color: #858585;
302
- }
303
-
304
- .terminal-output {
305
- flex: 1;
306
- padding: 12px;
307
- overflow-y: auto;
308
- background: #1e1e1e;
309
- font-size: 13px;
310
- line-height: 1.6;
311
- }
312
-
313
- .terminal-empty {
314
- color: #858585;
315
- font-style: italic;
316
- }
317
-
318
- .terminal-result {
319
- margin-bottom: 16px;
320
- }
321
-
322
- .terminal-command {
323
- color: #4ec9b0;
324
- font-weight: 600;
325
- margin-bottom: 4px;
326
- }
327
-
328
- .terminal-result-output {
329
- color: #d4d4d4;
330
- white-space: pre-wrap;
331
- word-break: break-word;
332
- }
333
-
334
- .terminal-error {
335
- color: #f48771;
336
- margin-top: 4px;
337
- }
338
-
339
- .terminal-input-area {
340
- display: flex;
341
- align-items: center;
342
- gap: 8px;
343
- padding: 8px 12px;
344
- background: #2d2d2d;
345
- border-top: 1px solid #3c3c3c;
346
- }
347
-
348
- .terminal-prompt {
349
- color: #4ec9b0;
350
- font-weight: 600;
351
- }
352
-
353
- .terminal-input {
354
- flex: 1;
355
- padding: 6px 8px;
356
- background: #3c3c3c;
357
- border: 1px solid #515151;
358
- border-radius: 4px;
359
- color: #d4d4d4;
360
- font-family: inherit;
361
- font-size: 13px;
362
- }
363
-
364
- .terminal-input:focus {
365
- outline: none;
366
- border-color: #007acc;
367
- }
368
-
369
- .terminal-input-widget {
370
- resize: vertical;
371
- min-height: 28px;
372
- }
373
-
374
- .terminal-submit {
375
- padding: 6px 16px;
376
- background: #007acc;
377
- border: none;
378
- border-radius: 4px;
379
- color: white;
380
- font-size: 13px;
381
- font-weight: 600;
382
- cursor: pointer;
383
- transition: background 0.2s;
384
- }
385
-
386
- .terminal-submit:hover {
387
- background: #005a9e;
388
- }
389
-
390
- .terminal-submit:active {
391
- background: #004578;
392
- }
393
-
394
- .terminal-resize-handle {
395
- position: absolute;
396
- bottom: 0;
397
- right: 0;
398
- width: 16px;
399
- height: 16px;
400
- cursor: nwse-resize;
401
- background: linear-gradient(135deg, transparent 50%, #515151 50%);
402
- }
403
-
404
- .terminal-resize-handle:hover {
405
- background: linear-gradient(135deg, transparent 50%, #007acc 50%);
406
- }
407
-
408
- .terminal-context-menu {
409
- position: fixed;
410
- background: #2d2d2d;
411
- border: 1px solid #515151;
412
- border-radius: 4px;
413
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
414
- padding: 4px 0;
415
- z-index: 1000;
416
- }
417
-
418
- .context-menu-item {
419
- display: block;
420
- width: 100%;
421
- padding: 8px 16px;
422
- background: transparent;
423
- border: none;
424
- color: #d4d4d4;
425
- font-size: 13px;
426
- text-align: left;
427
- cursor: pointer;
428
- transition: background 0.2s;
429
- }
430
-
431
- .context-menu-item:hover:not(:disabled) {
432
- background: #3c3c3c;
433
- }
434
-
435
- .context-menu-item:disabled {
436
- color: #858585;
437
- cursor: not-allowed;
438
- }
439
-
440
- /* Scrollbar styling */
441
- .terminal-output::-webkit-scrollbar {
442
- width: 8px;
443
- }
444
-
445
- .terminal-output::-webkit-scrollbar-track {
446
- background: #1e1e1e;
447
- }
448
-
449
- .terminal-output::-webkit-scrollbar-thumb {
450
- background: #515151;
451
- border-radius: 4px;
452
- }
453
-
454
- .terminal-output::-webkit-scrollbar-thumb:hover {
455
- background: #686868;
456
- }
457
- </style>
1
+ <script lang="ts">
2
+ /**
3
+ * TerminalNode.svelte
4
+ *
5
+ * Svelte component for terminal nodes in Praxis/RuneBook.
6
+ * Provides a terminal interface with command execution, history, and canvas integration.
7
+ */
8
+ import { onDestroy } from 'svelte';
9
+ import type { TerminalAdapter } from '../runtime/terminal-adapter.js';
10
+ import type { TerminalExecutionResult } from '../runtime/terminal-adapter.js';
11
+
12
+ // Props
13
+ export let adapter: TerminalAdapter;
14
+ export let x: number = 0;
15
+ export let y: number = 0;
16
+ export let width: number = 600;
17
+ export let height: number = 400;
18
+ export let draggable: boolean = true;
19
+ export let resizable: boolean = true;
20
+ export let showContextMenu: boolean = false;
21
+
22
+ // Local state
23
+ let currentCommand = '';
24
+ let isDragging = false;
25
+ let isResizing = false;
26
+ let dragStartX = 0;
27
+ let dragStartY = 0;
28
+ let resizeStartX = 0;
29
+ let resizeStartY = 0;
30
+ let resizeStartWidth = 0;
31
+ let resizeStartHeight = 0;
32
+ let terminalOutput: TerminalExecutionResult[] = [];
33
+ let contextMenuX = 0;
34
+ let contextMenuY = 0;
35
+ let outputContainer: HTMLDivElement;
36
+
37
+ // Get state from adapter
38
+ $: state = adapter.getState();
39
+ $: inputMode = state.inputMode;
40
+ $: history = state.history;
41
+ $: lastOutput = state.lastOutput;
42
+
43
+ // Execute command
44
+ async function executeCommand() {
45
+ if (!currentCommand.trim()) return;
46
+
47
+ const result = await adapter.executeCommand(currentCommand);
48
+ terminalOutput = [...terminalOutput, result];
49
+ currentCommand = '';
50
+
51
+ // Auto-scroll to bottom after DOM update
52
+ if (outputContainer) {
53
+ setTimeout(() => {
54
+ outputContainer.scrollTop = outputContainer.scrollHeight;
55
+ }, 0);
56
+ }
57
+ }
58
+
59
+ // Handle keyboard shortcuts
60
+ function handleKeyDown(event: KeyboardEvent) {
61
+ if (event.key === 'Enter' && !event.shiftKey) {
62
+ event.preventDefault();
63
+ executeCommand();
64
+ }
65
+ }
66
+
67
+ // Drag handling
68
+ function startDrag(event: MouseEvent) {
69
+ if (!draggable) return;
70
+ isDragging = true;
71
+ dragStartX = event.clientX - x;
72
+ dragStartY = event.clientY - y;
73
+ }
74
+
75
+ function handleDrag(event: MouseEvent) {
76
+ if (!isDragging) return;
77
+ x = event.clientX - dragStartX;
78
+ y = event.clientY - dragStartY;
79
+ }
80
+
81
+ function stopDrag() {
82
+ isDragging = false;
83
+ }
84
+
85
+ // Resize handling
86
+ function startResize(event: MouseEvent) {
87
+ if (!resizable) return;
88
+ event.stopPropagation();
89
+ isResizing = true;
90
+ resizeStartX = event.clientX;
91
+ resizeStartY = event.clientY;
92
+ resizeStartWidth = width;
93
+ resizeStartHeight = height;
94
+ }
95
+
96
+ function handleResize(event: MouseEvent) {
97
+ if (!isResizing) return;
98
+ const deltaX = event.clientX - resizeStartX;
99
+ const deltaY = event.clientY - resizeStartY;
100
+ width = Math.max(300, resizeStartWidth + deltaX);
101
+ height = Math.max(200, resizeStartHeight + deltaY);
102
+ }
103
+
104
+ function stopResize() {
105
+ isResizing = false;
106
+ }
107
+
108
+ // Context menu handling
109
+ function handleContextMenu(event: MouseEvent) {
110
+ event.preventDefault();
111
+ contextMenuX = event.clientX;
112
+ contextMenuY = event.clientY;
113
+ showContextMenu = true;
114
+ }
115
+
116
+ function closeContextMenu() {
117
+ showContextMenu = false;
118
+ }
119
+
120
+ function clearTerminal() {
121
+ terminalOutput = [];
122
+ adapter.clearHistory();
123
+ closeContextMenu();
124
+ }
125
+
126
+ function copyLastOutput() {
127
+ if (lastOutput) {
128
+ navigator.clipboard.writeText(lastOutput);
129
+ }
130
+ closeContextMenu();
131
+ }
132
+
133
+ // Global mouse event listeners with proper cleanup
134
+ let mouseMoveHandler: ((e: MouseEvent) => void) | null = null;
135
+ let mouseUpHandler: (() => void) | null = null;
136
+
137
+ $: {
138
+ // Remove old listeners if they exist
139
+ if (mouseMoveHandler) {
140
+ window.removeEventListener('mousemove', mouseMoveHandler);
141
+ }
142
+ if (mouseUpHandler) {
143
+ window.removeEventListener('mouseup', mouseUpHandler);
144
+ }
145
+
146
+ // Add new listeners if dragging or resizing
147
+ if (isDragging) {
148
+ mouseMoveHandler = handleDrag;
149
+ mouseUpHandler = stopDrag;
150
+ window.addEventListener('mousemove', mouseMoveHandler);
151
+ window.addEventListener('mouseup', mouseUpHandler);
152
+ } else if (isResizing) {
153
+ mouseMoveHandler = handleResize;
154
+ mouseUpHandler = stopResize;
155
+ window.addEventListener('mousemove', mouseMoveHandler);
156
+ window.addEventListener('mouseup', mouseUpHandler);
157
+ } else {
158
+ mouseMoveHandler = null;
159
+ mouseUpHandler = null;
160
+ }
161
+ }
162
+
163
+ // Cleanup event listeners on component destroy
164
+ onDestroy(() => {
165
+ if (mouseMoveHandler) {
166
+ window.removeEventListener('mousemove', mouseMoveHandler);
167
+ }
168
+ if (mouseUpHandler) {
169
+ window.removeEventListener('mouseup', mouseUpHandler);
170
+ }
171
+ });
172
+
173
+ // Click outside to close context menu
174
+ function handleDocumentClick() {
175
+ if (showContextMenu) {
176
+ closeContextMenu();
177
+ }
178
+ }
179
+ </script>
180
+
181
+ <svelte:window on:click={handleDocumentClick} />
182
+
183
+ <div
184
+ class="terminal-node"
185
+ style="left: {x}px; top: {y}px; width: {width}px; height: {height}px;"
186
+ on:contextmenu={handleContextMenu}
187
+ role="application"
188
+ aria-label="Terminal Node"
189
+ >
190
+ <!-- Title bar -->
191
+ <div
192
+ class="terminal-header"
193
+ on:mousedown={startDrag}
194
+ role="banner"
195
+ >
196
+ <span class="terminal-title">Terminal: {state.nodeId}</span>
197
+ <span class="terminal-mode">Mode: {inputMode}</span>
198
+ </div>
199
+
200
+ <!-- Output area -->
201
+ <div class="terminal-output" bind:this={outputContainer}>
202
+ {#if terminalOutput.length === 0}
203
+ <div class="terminal-empty">No output yet. Enter a command below.</div>
204
+ {:else}
205
+ {#each terminalOutput as result}
206
+ <div class="terminal-result">
207
+ <div class="terminal-command">$ {result.command}</div>
208
+ <div class="terminal-result-output">{result.output}</div>
209
+ {#if result.error}
210
+ <div class="terminal-error">Error: {result.error}</div>
211
+ {/if}
212
+ </div>
213
+ {/each}
214
+ {/if}
215
+ </div>
216
+
217
+ <!-- Input area -->
218
+ <div class="terminal-input-area">
219
+ <span class="terminal-prompt">$</span>
220
+ {#if inputMode === 'text'}
221
+ <input
222
+ type="text"
223
+ class="terminal-input"
224
+ bind:value={currentCommand}
225
+ on:keydown={handleKeyDown}
226
+ placeholder="Enter command..."
227
+ aria-label="Terminal input"
228
+ />
229
+ {:else if inputMode === 'widget'}
230
+ <textarea
231
+ class="terminal-input terminal-input-widget"
232
+ bind:value={currentCommand}
233
+ on:keydown={handleKeyDown}
234
+ placeholder="Enter command..."
235
+ rows="1"
236
+ aria-label="Terminal input widget"
237
+ />
238
+ {/if}
239
+ <button class="terminal-submit" on:click={executeCommand}>Run</button>
240
+ </div>
241
+
242
+ <!-- Resize handle -->
243
+ {#if resizable}
244
+ <div
245
+ class="terminal-resize-handle"
246
+ on:mousedown={startResize}
247
+ role="button"
248
+ tabindex="0"
249
+ aria-label="Resize terminal"
250
+ />
251
+ {/if}
252
+
253
+ <!-- Context menu -->
254
+ {#if showContextMenu}
255
+ <div
256
+ class="terminal-context-menu"
257
+ style="left: {contextMenuX}px; top: {contextMenuY}px;"
258
+ role="menu"
259
+ >
260
+ <button class="context-menu-item" on:click={clearTerminal}>Clear Terminal</button>
261
+ <button class="context-menu-item" on:click={copyLastOutput} disabled={!lastOutput}>
262
+ Copy Last Output
263
+ </button>
264
+ <button class="context-menu-item" on:click={closeContextMenu}>Close Menu</button>
265
+ </div>
266
+ {/if}
267
+ </div>
268
+
269
+ <style>
270
+ .terminal-node {
271
+ position: absolute;
272
+ display: flex;
273
+ flex-direction: column;
274
+ background: #1e1e1e;
275
+ border: 1px solid #3c3c3c;
276
+ border-radius: 8px;
277
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
278
+ font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
279
+ color: #d4d4d4;
280
+ overflow: hidden;
281
+ }
282
+
283
+ .terminal-header {
284
+ display: flex;
285
+ justify-content: space-between;
286
+ align-items: center;
287
+ padding: 8px 12px;
288
+ background: #2d2d2d;
289
+ border-bottom: 1px solid #3c3c3c;
290
+ cursor: move;
291
+ user-select: none;
292
+ }
293
+
294
+ .terminal-title {
295
+ font-weight: 600;
296
+ font-size: 14px;
297
+ }
298
+
299
+ .terminal-mode {
300
+ font-size: 12px;
301
+ color: #858585;
302
+ }
303
+
304
+ .terminal-output {
305
+ flex: 1;
306
+ padding: 12px;
307
+ overflow-y: auto;
308
+ background: #1e1e1e;
309
+ font-size: 13px;
310
+ line-height: 1.6;
311
+ }
312
+
313
+ .terminal-empty {
314
+ color: #858585;
315
+ font-style: italic;
316
+ }
317
+
318
+ .terminal-result {
319
+ margin-bottom: 16px;
320
+ }
321
+
322
+ .terminal-command {
323
+ color: #4ec9b0;
324
+ font-weight: 600;
325
+ margin-bottom: 4px;
326
+ }
327
+
328
+ .terminal-result-output {
329
+ color: #d4d4d4;
330
+ white-space: pre-wrap;
331
+ word-break: break-word;
332
+ }
333
+
334
+ .terminal-error {
335
+ color: #f48771;
336
+ margin-top: 4px;
337
+ }
338
+
339
+ .terminal-input-area {
340
+ display: flex;
341
+ align-items: center;
342
+ gap: 8px;
343
+ padding: 8px 12px;
344
+ background: #2d2d2d;
345
+ border-top: 1px solid #3c3c3c;
346
+ }
347
+
348
+ .terminal-prompt {
349
+ color: #4ec9b0;
350
+ font-weight: 600;
351
+ }
352
+
353
+ .terminal-input {
354
+ flex: 1;
355
+ padding: 6px 8px;
356
+ background: #3c3c3c;
357
+ border: 1px solid #515151;
358
+ border-radius: 4px;
359
+ color: #d4d4d4;
360
+ font-family: inherit;
361
+ font-size: 13px;
362
+ }
363
+
364
+ .terminal-input:focus {
365
+ outline: none;
366
+ border-color: #007acc;
367
+ }
368
+
369
+ .terminal-input-widget {
370
+ resize: vertical;
371
+ min-height: 28px;
372
+ }
373
+
374
+ .terminal-submit {
375
+ padding: 6px 16px;
376
+ background: #007acc;
377
+ border: none;
378
+ border-radius: 4px;
379
+ color: white;
380
+ font-size: 13px;
381
+ font-weight: 600;
382
+ cursor: pointer;
383
+ transition: background 0.2s;
384
+ }
385
+
386
+ .terminal-submit:hover {
387
+ background: #005a9e;
388
+ }
389
+
390
+ .terminal-submit:active {
391
+ background: #004578;
392
+ }
393
+
394
+ .terminal-resize-handle {
395
+ position: absolute;
396
+ bottom: 0;
397
+ right: 0;
398
+ width: 16px;
399
+ height: 16px;
400
+ cursor: nwse-resize;
401
+ background: linear-gradient(135deg, transparent 50%, #515151 50%);
402
+ }
403
+
404
+ .terminal-resize-handle:hover {
405
+ background: linear-gradient(135deg, transparent 50%, #007acc 50%);
406
+ }
407
+
408
+ .terminal-context-menu {
409
+ position: fixed;
410
+ background: #2d2d2d;
411
+ border: 1px solid #515151;
412
+ border-radius: 4px;
413
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.4);
414
+ padding: 4px 0;
415
+ z-index: 1000;
416
+ }
417
+
418
+ .context-menu-item {
419
+ display: block;
420
+ width: 100%;
421
+ padding: 8px 16px;
422
+ background: transparent;
423
+ border: none;
424
+ color: #d4d4d4;
425
+ font-size: 13px;
426
+ text-align: left;
427
+ cursor: pointer;
428
+ transition: background 0.2s;
429
+ }
430
+
431
+ .context-menu-item:hover:not(:disabled) {
432
+ background: #3c3c3c;
433
+ }
434
+
435
+ .context-menu-item:disabled {
436
+ color: #858585;
437
+ cursor: not-allowed;
438
+ }
439
+
440
+ /* Scrollbar styling */
441
+ .terminal-output::-webkit-scrollbar {
442
+ width: 8px;
443
+ }
444
+
445
+ .terminal-output::-webkit-scrollbar-track {
446
+ background: #1e1e1e;
447
+ }
448
+
449
+ .terminal-output::-webkit-scrollbar-thumb {
450
+ background: #515151;
451
+ border-radius: 4px;
452
+ }
453
+
454
+ .terminal-output::-webkit-scrollbar-thumb:hover {
455
+ background: #686868;
456
+ }
457
+ </style>