@plures/praxis 1.0.2 → 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.
- package/FRAMEWORK.md +55 -5
- package/LICENSE +21 -21
- package/README.md +162 -375
- package/core/codegen/docs-generator.ts +5 -2
- package/core/codegen/index.ts +1 -1
- package/core/codegen/ts-generator.ts +15 -15
- package/core/db-adapter/index.ts +2 -2
- package/core/db-adapter/sync-engine.ts +17 -6
- package/core/logic-engine/engine.ts +1 -1
- package/core/logic-engine/index.ts +2 -2
- package/core/logic-engine/protocol.ts +1 -1
- package/core/logic-engine/psf-adapter.ts +8 -4
- package/core/logic-engine/rules.ts +1 -1
- package/core/schema-engine/compiler.ts +53 -11
- package/core/schema-engine/generator.ts +17 -7
- package/core/schema-engine/index.ts +2 -2
- package/core/schema-engine/psf.ts +12 -3
- package/core/schema-engine/types.ts +3 -11
- package/core/schema-engine/validator.ts +112 -22
- package/dist/browser/engine-BjdqxeXG.d.ts +333 -0
- package/dist/browser/index.d.ts +3004 -0
- package/dist/browser/index.js +2892 -0
- package/dist/{src → browser}/integrations/svelte.d.ts +19 -17
- package/dist/browser/integrations/svelte.js +298 -0
- package/dist/node/auth-STARLY7I.js +207 -0
- package/dist/node/build-Y7OT5VBF.js +144 -0
- package/dist/node/canvas-UERZHJYW.js +362 -0
- package/dist/node/chunk-DSDC2JWZ.js +256 -0
- package/dist/node/chunk-FXQZXAWF.js +175 -0
- package/dist/node/chunk-N5Y37EUV.js +202 -0
- package/dist/node/chunk-QGM4M3NI.js +37 -0
- package/dist/node/chunk-RJMWCNHR.js +175 -0
- package/dist/node/chunk-SRM3OPPM.js +404 -0
- package/dist/node/chunk-UATVJBNV.js +175 -0
- package/dist/node/chunk-UY7YEBE2.js +159 -0
- package/dist/node/chunk-XCY2VIFX.js +143 -0
- package/dist/node/chunk-YXH4Y7ZZ.js +349 -0
- package/dist/node/cli/index.cjs +217418 -0
- package/dist/node/cli/index.d.cts +1 -0
- package/dist/node/cli/index.d.ts +1 -0
- package/dist/node/cli/index.js +690 -0
- package/dist/node/cloud/index.cjs +1043 -0
- package/dist/node/cloud/index.d.cts +864 -0
- package/dist/node/cloud/index.d.ts +864 -0
- package/dist/node/cloud/index.js +456 -0
- package/dist/node/cloud-AXOK4PSN.js +212 -0
- package/dist/node/component.cjs +374 -0
- package/dist/node/component.d.cts +125 -0
- package/dist/{src/core/component/generator.d.ts → node/component.d.ts} +11 -8
- package/dist/node/component.js +9 -0
- package/dist/node/components/index.cjs +216 -0
- package/dist/node/components/index.d.cts +43 -0
- package/dist/{src → node}/components/index.d.ts +8 -8
- package/dist/node/components/index.js +7 -0
- package/dist/node/create-TRLSVCNQ.js +584 -0
- package/dist/node/dev-PMJZUYGE.js +65 -0
- package/dist/node/engine-1iqLe6_P.d.ts +214 -0
- package/dist/node/engine-CVJobhHm.d.cts +214 -0
- package/dist/node/index.cjs +3247 -0
- package/dist/node/index.d.cts +2579 -0
- package/dist/node/index.d.ts +2579 -0
- package/dist/node/index.js +2098 -0
- package/dist/node/integrations/svelte.cjs +330 -0
- package/dist/node/integrations/svelte.d.cts +309 -0
- package/dist/node/integrations/svelte.d.ts +309 -0
- package/dist/node/integrations/svelte.js +300 -0
- package/dist/node/orchestrate-737TCL5H.js +127 -0
- package/dist/{src/core/protocol.d.ts → node/protocol-Qek7ebBl.d.cts} +11 -10
- package/dist/node/protocol-Qek7ebBl.d.ts +122 -0
- package/dist/node/schema.cjs +200 -0
- package/dist/{src/core/schema/types.d.ts → node/schema.d.cts} +30 -29
- package/dist/node/schema.d.ts +371 -0
- package/dist/node/schema.js +9 -0
- package/dist/{src/runtime/terminal-adapter.d.ts → node/terminal-adapter-07HGftGQ.d.ts} +86 -11
- package/dist/node/terminal-adapter-XLtCjjb_.d.cts +231 -0
- package/dist/node/verify-YBZ7W24H.js +213239 -0
- package/docs/MONETIZATION.md +21 -16
- package/docs/REACTIVE_REDESIGN.md +132 -0
- package/docs/README.md +47 -36
- package/docs/SVELTE_INTEGRATION_STRATEGY.md +68 -0
- package/docs/TERMINAL_NODE.md +27 -24
- package/docs/core/building-extensions.md +58 -61
- package/docs/core/cli-usage.md +59 -59
- package/docs/core/code-canvas-sync.md +28 -16
- package/docs/core/logic-engine.md +77 -82
- package/docs/core/pluresdb-integration.md +29 -39
- package/docs/core/schema-model.md +66 -52
- package/docs/core/ui-generation.md +57 -49
- package/docs/core/what-is-praxis.md +32 -15
- package/docs/guides/canvas.md +21 -5
- package/docs/guides/getting-started.md +13 -7
- package/docs/guides/history-state-pattern.md +65 -51
- package/docs/guides/orchestration.md +46 -32
- package/docs/guides/parallel-state-pattern.md +56 -72
- package/docs/guides/svelte-integration.md +45 -53
- package/docs/tutorials/README.md +16 -0
- package/docs/tutorials/ecommerce-cart.md +177 -95
- package/docs/tutorials/first-app.md +26 -41
- package/docs/tutorials/form-builder.md +191 -138
- package/docs/tutorials/todo-pluresdb.md +71 -69
- package/package.json +132 -96
- package/src/__tests__/actors.test.ts +68 -68
- package/src/__tests__/billing.test.ts +32 -32
- package/src/__tests__/canvas-components.test.ts +94 -73
- package/src/__tests__/cli-create.test.ts +28 -28
- package/src/__tests__/cloud.test.ts +36 -36
- package/src/__tests__/code-canvas-integration.test.ts +132 -141
- package/src/__tests__/docs-generator.test.ts +3 -9
- package/src/__tests__/dsl.test.ts +58 -64
- package/src/__tests__/edge-cases.test.ts +106 -108
- package/src/__tests__/engine.test.ts +51 -25
- package/src/__tests__/generators.test.ts +42 -44
- package/src/__tests__/introspection.test.ts +104 -114
- package/src/__tests__/pluresdb.test.ts +189 -187
- package/src/__tests__/protocol.test.ts +15 -15
- package/src/__tests__/provisioning.test.ts +61 -61
- package/src/__tests__/schema.test.ts +7 -11
- package/src/__tests__/state-docs-integration.test.ts +162 -145
- package/src/__tests__/svelte-integration.test.ts +16 -19
- package/src/__tests__/tauri-integration.test.ts +149 -147
- package/src/__tests__/terminal-node.test.ts +12 -7
- package/src/__tests__/unum-integration.test.ts +68 -68
- package/src/adapters/cli.ts +21 -15
- package/src/cli/commands/auth.ts +82 -78
- package/src/cli/commands/build.ts +29 -27
- package/src/cli/commands/canvas.ts +338 -127
- package/src/cli/commands/cloud.ts +47 -47
- package/src/cli/commands/create.ts +59 -47
- package/src/cli/commands/dev.ts +12 -12
- package/src/cli/commands/generate.ts +29 -40
- package/src/cli/commands/orchestrate.ts +24 -24
- package/src/cli/commands/verify.ts +49 -0
- package/src/cli/index.ts +21 -2
- package/src/cloud/README.md +28 -15
- package/src/cloud/auth.ts +55 -70
- package/src/cloud/billing.ts +59 -58
- package/src/cloud/client.ts +29 -35
- package/src/cloud/index.ts +19 -40
- package/src/cloud/marketplace.ts +69 -78
- package/src/cloud/provisioning.ts +42 -51
- package/src/cloud/relay/endpoints.ts +30 -34
- package/src/cloud/relay/health/index.ts +1 -1
- package/src/cloud/relay/stats/index.ts +1 -1
- package/src/cloud/relay/sync/index.ts +1 -1
- package/src/cloud/relay/usage/index.ts +1 -1
- package/src/cloud/sponsors.ts +31 -34
- package/src/cloud/types.ts +4 -4
- package/src/components/README.md +1 -0
- package/src/components/TerminalNode.svelte +457 -457
- package/src/components/index.ts +3 -4
- package/src/core/actors.ts +7 -7
- package/src/core/component/generator.ts +10 -28
- package/src/core/engine.ts +51 -24
- package/src/core/introspection.ts +37 -35
- package/src/core/logic/generator.ts +62 -62
- package/src/core/pluresdb/adapter.ts +8 -8
- package/src/core/pluresdb/generator.ts +39 -35
- package/src/core/pluresdb/index.ts +9 -12
- package/src/core/pluresdb/schema-registry.ts +22 -25
- package/src/core/pluresdb/store.ts +57 -57
- package/src/core/protocol.ts +14 -14
- package/src/core/reactive-engine.svelte.ts +65 -0
- package/src/core/reactive-engine.ts +67 -0
- package/src/core/rules.ts +4 -4
- package/src/core/schema/loader.common.ts +150 -0
- package/src/core/schema/loader.ts +19 -149
- package/src/core/schema/normalize.ts +34 -51
- package/src/core/schema/types.ts +47 -11
- package/src/dsl/index.ts +8 -8
- package/src/dsl.ts +11 -17
- package/src/examples/advanced-todo/App.svelte +506 -506
- package/src/examples/advanced-todo/README.md +58 -40
- package/src/examples/advanced-todo/index.ts +3 -3
- package/src/examples/auth-basic/index.ts +30 -30
- package/src/examples/cart/index.ts +50 -50
- package/src/examples/hero-ecommerce/index.ts +130 -157
- package/src/examples/svelte-counter/index.ts +22 -26
- package/src/flows.ts +6 -17
- package/src/index.browser.ts +204 -0
- package/src/index.ts +37 -42
- package/src/integrations/code-canvas.ts +237 -193
- package/src/integrations/pluresdb.ts +55 -35
- package/src/integrations/state-docs.ts +104 -104
- package/src/integrations/svelte.ts +35 -35
- package/src/integrations/tauri.ts +75 -73
- package/src/integrations/unum.ts +68 -61
- package/src/registry.ts +7 -14
- package/src/runtime/terminal-adapter.ts +31 -26
- package/src/step.ts +10 -16
- package/src/types.ts +1 -1
- package/templates/basic-app/README.md +6 -9
- package/templates/fullstack-app/README.md +10 -0
- package/dist/core/codegen/docs-generator.d.ts +0 -123
- package/dist/core/codegen/docs-generator.d.ts.map +0 -1
- package/dist/core/codegen/docs-generator.js +0 -674
- package/dist/core/codegen/docs-generator.js.map +0 -1
- package/dist/core/codegen/index.d.ts +0 -11
- package/dist/core/codegen/index.d.ts.map +0 -1
- package/dist/core/codegen/index.js +0 -13
- package/dist/core/codegen/index.js.map +0 -1
- package/dist/core/codegen/ts-generator.d.ts +0 -8
- package/dist/core/codegen/ts-generator.d.ts.map +0 -1
- package/dist/core/codegen/ts-generator.js +0 -8
- package/dist/core/codegen/ts-generator.js.map +0 -1
- package/dist/core/db-adapter/index.d.ts +0 -18
- package/dist/core/db-adapter/index.d.ts.map +0 -1
- package/dist/core/db-adapter/index.js +0 -23
- package/dist/core/db-adapter/index.js.map +0 -1
- package/dist/core/db-adapter/sync-engine.d.ts +0 -180
- package/dist/core/db-adapter/sync-engine.d.ts.map +0 -1
- package/dist/core/db-adapter/sync-engine.js +0 -342
- package/dist/core/db-adapter/sync-engine.js.map +0 -1
- package/dist/core/logic-engine/engine.d.ts +0 -8
- package/dist/core/logic-engine/engine.d.ts.map +0 -1
- package/dist/core/logic-engine/engine.js +0 -8
- package/dist/core/logic-engine/engine.js.map +0 -1
- package/dist/core/logic-engine/index.d.ts +0 -16
- package/dist/core/logic-engine/index.d.ts.map +0 -1
- package/dist/core/logic-engine/index.js +0 -16
- package/dist/core/logic-engine/index.js.map +0 -1
- package/dist/core/logic-engine/protocol.d.ts +0 -7
- package/dist/core/logic-engine/protocol.d.ts.map +0 -1
- package/dist/core/logic-engine/protocol.js +0 -7
- package/dist/core/logic-engine/protocol.js.map +0 -1
- package/dist/core/logic-engine/psf-adapter.d.ts +0 -88
- package/dist/core/logic-engine/psf-adapter.d.ts.map +0 -1
- package/dist/core/logic-engine/psf-adapter.js +0 -207
- package/dist/core/logic-engine/psf-adapter.js.map +0 -1
- package/dist/core/logic-engine/rules.d.ts +0 -7
- package/dist/core/logic-engine/rules.d.ts.map +0 -1
- package/dist/core/logic-engine/rules.js +0 -7
- package/dist/core/logic-engine/rules.js.map +0 -1
- package/dist/core/schema-engine/compiler.d.ts +0 -198
- package/dist/core/schema-engine/compiler.d.ts.map +0 -1
- package/dist/core/schema-engine/compiler.js +0 -262
- package/dist/core/schema-engine/compiler.js.map +0 -1
- package/dist/core/schema-engine/generator.d.ts +0 -115
- package/dist/core/schema-engine/generator.d.ts.map +0 -1
- package/dist/core/schema-engine/generator.js +0 -506
- package/dist/core/schema-engine/generator.js.map +0 -1
- package/dist/core/schema-engine/index.d.ts +0 -18
- package/dist/core/schema-engine/index.d.ts.map +0 -1
- package/dist/core/schema-engine/index.js +0 -18
- package/dist/core/schema-engine/index.js.map +0 -1
- package/dist/core/schema-engine/psf.d.ts +0 -612
- package/dist/core/schema-engine/psf.d.ts.map +0 -1
- package/dist/core/schema-engine/psf.js +0 -45
- package/dist/core/schema-engine/psf.js.map +0 -1
- package/dist/core/schema-engine/types.d.ts +0 -10
- package/dist/core/schema-engine/types.d.ts.map +0 -1
- package/dist/core/schema-engine/types.js +0 -7
- package/dist/core/schema-engine/types.js.map +0 -1
- package/dist/core/schema-engine/validator.d.ts +0 -140
- package/dist/core/schema-engine/validator.d.ts.map +0 -1
- package/dist/core/schema-engine/validator.js +0 -407
- package/dist/core/schema-engine/validator.js.map +0 -1
- package/dist/src/adapters/cli.d.ts +0 -43
- package/dist/src/adapters/cli.d.ts.map +0 -1
- package/dist/src/adapters/cli.js +0 -126
- package/dist/src/adapters/cli.js.map +0 -1
- package/dist/src/cli/commands/auth.d.ts +0 -26
- package/dist/src/cli/commands/auth.d.ts.map +0 -1
- package/dist/src/cli/commands/auth.js +0 -233
- package/dist/src/cli/commands/auth.js.map +0 -1
- package/dist/src/cli/commands/build.d.ts +0 -23
- package/dist/src/cli/commands/build.d.ts.map +0 -1
- package/dist/src/cli/commands/build.js +0 -162
- package/dist/src/cli/commands/build.js.map +0 -1
- package/dist/src/cli/commands/canvas.d.ts +0 -23
- package/dist/src/cli/commands/canvas.d.ts.map +0 -1
- package/dist/src/cli/commands/canvas.js +0 -215
- package/dist/src/cli/commands/canvas.js.map +0 -1
- package/dist/src/cli/commands/cloud.d.ts +0 -27
- package/dist/src/cli/commands/cloud.d.ts.map +0 -1
- package/dist/src/cli/commands/cloud.js +0 -232
- package/dist/src/cli/commands/cloud.js.map +0 -1
- package/dist/src/cli/commands/create.d.ts +0 -21
- package/dist/src/cli/commands/create.d.ts.map +0 -1
- package/dist/src/cli/commands/create.js +0 -621
- package/dist/src/cli/commands/create.js.map +0 -1
- package/dist/src/cli/commands/dev.d.ts +0 -21
- package/dist/src/cli/commands/dev.d.ts.map +0 -1
- package/dist/src/cli/commands/dev.js +0 -71
- package/dist/src/cli/commands/dev.js.map +0 -1
- package/dist/src/cli/commands/generate.d.ts +0 -25
- package/dist/src/cli/commands/generate.d.ts.map +0 -1
- package/dist/src/cli/commands/generate.js +0 -168
- package/dist/src/cli/commands/generate.js.map +0 -1
- package/dist/src/cli/commands/orchestrate.d.ts +0 -44
- package/dist/src/cli/commands/orchestrate.d.ts.map +0 -1
- package/dist/src/cli/commands/orchestrate.js +0 -150
- package/dist/src/cli/commands/orchestrate.js.map +0 -1
- package/dist/src/cli/index.d.ts +0 -8
- package/dist/src/cli/index.d.ts.map +0 -1
- package/dist/src/cli/index.js +0 -211
- package/dist/src/cli/index.js.map +0 -1
- package/dist/src/cloud/auth.d.ts +0 -51
- package/dist/src/cloud/auth.d.ts.map +0 -1
- package/dist/src/cloud/auth.js +0 -194
- package/dist/src/cloud/auth.js.map +0 -1
- package/dist/src/cloud/billing.d.ts +0 -184
- package/dist/src/cloud/billing.d.ts.map +0 -1
- package/dist/src/cloud/billing.js +0 -179
- package/dist/src/cloud/billing.js.map +0 -1
- package/dist/src/cloud/client.d.ts +0 -39
- package/dist/src/cloud/client.d.ts.map +0 -1
- package/dist/src/cloud/client.js +0 -176
- package/dist/src/cloud/client.js.map +0 -1
- package/dist/src/cloud/index.d.ts +0 -44
- package/dist/src/cloud/index.d.ts.map +0 -1
- package/dist/src/cloud/index.js +0 -44
- package/dist/src/cloud/index.js.map +0 -1
- package/dist/src/cloud/marketplace.d.ts +0 -166
- package/dist/src/cloud/marketplace.d.ts.map +0 -1
- package/dist/src/cloud/marketplace.js +0 -159
- package/dist/src/cloud/marketplace.js.map +0 -1
- package/dist/src/cloud/provisioning.d.ts +0 -110
- package/dist/src/cloud/provisioning.d.ts.map +0 -1
- package/dist/src/cloud/provisioning.js +0 -148
- package/dist/src/cloud/provisioning.js.map +0 -1
- package/dist/src/cloud/relay/endpoints.d.ts +0 -62
- package/dist/src/cloud/relay/endpoints.d.ts.map +0 -1
- package/dist/src/cloud/relay/endpoints.js +0 -217
- package/dist/src/cloud/relay/endpoints.js.map +0 -1
- package/dist/src/cloud/relay/health/index.d.ts +0 -5
- package/dist/src/cloud/relay/health/index.d.ts.map +0 -1
- package/dist/src/cloud/relay/health/index.js +0 -9
- package/dist/src/cloud/relay/health/index.js.map +0 -1
- package/dist/src/cloud/relay/stats/index.d.ts +0 -5
- package/dist/src/cloud/relay/stats/index.d.ts.map +0 -1
- package/dist/src/cloud/relay/stats/index.js +0 -9
- package/dist/src/cloud/relay/stats/index.js.map +0 -1
- package/dist/src/cloud/relay/sync/index.d.ts +0 -5
- package/dist/src/cloud/relay/sync/index.d.ts.map +0 -1
- package/dist/src/cloud/relay/sync/index.js +0 -9
- package/dist/src/cloud/relay/sync/index.js.map +0 -1
- package/dist/src/cloud/relay/usage/index.d.ts +0 -5
- package/dist/src/cloud/relay/usage/index.d.ts.map +0 -1
- package/dist/src/cloud/relay/usage/index.js +0 -9
- package/dist/src/cloud/relay/usage/index.js.map +0 -1
- package/dist/src/cloud/sponsors.d.ts +0 -81
- package/dist/src/cloud/sponsors.d.ts.map +0 -1
- package/dist/src/cloud/sponsors.js +0 -130
- package/dist/src/cloud/sponsors.js.map +0 -1
- package/dist/src/cloud/types.d.ts +0 -169
- package/dist/src/cloud/types.d.ts.map +0 -1
- package/dist/src/cloud/types.js +0 -7
- package/dist/src/cloud/types.js.map +0 -1
- package/dist/src/components/index.d.ts.map +0 -1
- package/dist/src/components/index.js +0 -17
- package/dist/src/components/index.js.map +0 -1
- package/dist/src/core/actors.d.ts +0 -95
- package/dist/src/core/actors.d.ts.map +0 -1
- package/dist/src/core/actors.js +0 -158
- package/dist/src/core/actors.js.map +0 -1
- package/dist/src/core/component/generator.d.ts.map +0 -1
- package/dist/src/core/component/generator.js +0 -349
- package/dist/src/core/component/generator.js.map +0 -1
- package/dist/src/core/engine.d.ts +0 -92
- package/dist/src/core/engine.d.ts.map +0 -1
- package/dist/src/core/engine.js +0 -199
- package/dist/src/core/engine.js.map +0 -1
- package/dist/src/core/introspection.d.ts +0 -141
- package/dist/src/core/introspection.d.ts.map +0 -1
- package/dist/src/core/introspection.js +0 -208
- package/dist/src/core/introspection.js.map +0 -1
- package/dist/src/core/logic/generator.d.ts +0 -76
- package/dist/src/core/logic/generator.d.ts.map +0 -1
- package/dist/src/core/logic/generator.js +0 -370
- package/dist/src/core/logic/generator.js.map +0 -1
- package/dist/src/core/pluresdb/adapter.d.ts +0 -72
- package/dist/src/core/pluresdb/adapter.d.ts.map +0 -1
- package/dist/src/core/pluresdb/adapter.js +0 -73
- package/dist/src/core/pluresdb/adapter.js.map +0 -1
- package/dist/src/core/pluresdb/generator.d.ts +0 -58
- package/dist/src/core/pluresdb/generator.d.ts.map +0 -1
- package/dist/src/core/pluresdb/generator.js +0 -191
- package/dist/src/core/pluresdb/generator.js.map +0 -1
- package/dist/src/core/pluresdb/index.d.ts +0 -15
- package/dist/src/core/pluresdb/index.d.ts.map +0 -1
- package/dist/src/core/pluresdb/index.js +0 -11
- package/dist/src/core/pluresdb/index.js.map +0 -1
- package/dist/src/core/pluresdb/schema-registry.d.ts +0 -104
- package/dist/src/core/pluresdb/schema-registry.d.ts.map +0 -1
- package/dist/src/core/pluresdb/schema-registry.js +0 -130
- package/dist/src/core/pluresdb/schema-registry.js.map +0 -1
- package/dist/src/core/pluresdb/store.d.ts +0 -199
- package/dist/src/core/pluresdb/store.d.ts.map +0 -1
- package/dist/src/core/pluresdb/store.js +0 -344
- package/dist/src/core/pluresdb/store.js.map +0 -1
- package/dist/src/core/protocol.d.ts.map +0 -1
- package/dist/src/core/protocol.js +0 -46
- package/dist/src/core/protocol.js.map +0 -1
- package/dist/src/core/rules.d.ts +0 -120
- package/dist/src/core/rules.d.ts.map +0 -1
- package/dist/src/core/rules.js +0 -81
- package/dist/src/core/rules.js.map +0 -1
- package/dist/src/core/schema/loader.d.ts +0 -47
- package/dist/src/core/schema/loader.d.ts.map +0 -1
- package/dist/src/core/schema/loader.js +0 -189
- package/dist/src/core/schema/loader.js.map +0 -1
- package/dist/src/core/schema/normalize.d.ts +0 -72
- package/dist/src/core/schema/normalize.d.ts.map +0 -1
- package/dist/src/core/schema/normalize.js +0 -190
- package/dist/src/core/schema/normalize.js.map +0 -1
- package/dist/src/core/schema/types.d.ts.map +0 -1
- package/dist/src/core/schema/types.js +0 -161
- package/dist/src/core/schema/types.js.map +0 -1
- package/dist/src/dsl/index.d.ts +0 -152
- package/dist/src/dsl/index.d.ts.map +0 -1
- package/dist/src/dsl/index.js +0 -132
- package/dist/src/dsl/index.js.map +0 -1
- package/dist/src/dsl.d.ts +0 -124
- package/dist/src/dsl.d.ts.map +0 -1
- package/dist/src/dsl.js +0 -130
- package/dist/src/dsl.js.map +0 -1
- package/dist/src/examples/advanced-todo/index.d.ts +0 -55
- package/dist/src/examples/advanced-todo/index.d.ts.map +0 -1
- package/dist/src/examples/advanced-todo/index.js +0 -222
- package/dist/src/examples/advanced-todo/index.js.map +0 -1
- package/dist/src/examples/auth-basic/index.d.ts +0 -17
- package/dist/src/examples/auth-basic/index.d.ts.map +0 -1
- package/dist/src/examples/auth-basic/index.js +0 -122
- package/dist/src/examples/auth-basic/index.js.map +0 -1
- package/dist/src/examples/cart/index.d.ts +0 -19
- package/dist/src/examples/cart/index.d.ts.map +0 -1
- package/dist/src/examples/cart/index.js +0 -202
- package/dist/src/examples/cart/index.js.map +0 -1
- package/dist/src/examples/hero-ecommerce/index.d.ts +0 -39
- package/dist/src/examples/hero-ecommerce/index.d.ts.map +0 -1
- package/dist/src/examples/hero-ecommerce/index.js +0 -506
- package/dist/src/examples/hero-ecommerce/index.js.map +0 -1
- package/dist/src/examples/svelte-counter/index.d.ts +0 -31
- package/dist/src/examples/svelte-counter/index.d.ts.map +0 -1
- package/dist/src/examples/svelte-counter/index.js +0 -123
- package/dist/src/examples/svelte-counter/index.js.map +0 -1
- package/dist/src/flows.d.ts +0 -125
- package/dist/src/flows.d.ts.map +0 -1
- package/dist/src/flows.js +0 -160
- package/dist/src/flows.js.map +0 -1
- package/dist/src/index.d.ts +0 -77
- package/dist/src/index.d.ts.map +0 -1
- package/dist/src/index.js +0 -64
- package/dist/src/index.js.map +0 -1
- package/dist/src/integrations/code-canvas.d.ts +0 -265
- package/dist/src/integrations/code-canvas.d.ts.map +0 -1
- package/dist/src/integrations/code-canvas.js +0 -451
- package/dist/src/integrations/code-canvas.js.map +0 -1
- package/dist/src/integrations/pluresdb.d.ts +0 -117
- package/dist/src/integrations/pluresdb.d.ts.map +0 -1
- package/dist/src/integrations/pluresdb.js +0 -117
- package/dist/src/integrations/pluresdb.js.map +0 -1
- package/dist/src/integrations/state-docs.d.ts +0 -191
- package/dist/src/integrations/state-docs.d.ts.map +0 -1
- package/dist/src/integrations/state-docs.js +0 -515
- package/dist/src/integrations/state-docs.js.map +0 -1
- package/dist/src/integrations/svelte.d.ts.map +0 -1
- package/dist/src/integrations/svelte.js +0 -447
- package/dist/src/integrations/svelte.js.map +0 -1
- package/dist/src/integrations/tauri.d.ts +0 -360
- package/dist/src/integrations/tauri.d.ts.map +0 -1
- package/dist/src/integrations/tauri.js +0 -278
- package/dist/src/integrations/tauri.js.map +0 -1
- package/dist/src/integrations/unum.d.ts +0 -159
- package/dist/src/integrations/unum.d.ts.map +0 -1
- package/dist/src/integrations/unum.js +0 -240
- package/dist/src/integrations/unum.js.map +0 -1
- package/dist/src/registry.d.ts +0 -94
- package/dist/src/registry.d.ts.map +0 -1
- package/dist/src/registry.js +0 -181
- package/dist/src/registry.js.map +0 -1
- package/dist/src/runtime/terminal-adapter.d.ts.map +0 -1
- package/dist/src/runtime/terminal-adapter.js +0 -239
- package/dist/src/runtime/terminal-adapter.js.map +0 -1
- package/dist/src/step.d.ts +0 -34
- package/dist/src/step.d.ts.map +0 -1
- package/dist/src/step.js +0 -111
- package/dist/src/step.js.map +0 -1
- package/dist/src/types.d.ts +0 -63
- package/dist/src/types.d.ts.map +0 -1
- package/dist/src/types.js +0 -6
- package/dist/src/types.js.map +0 -1
- package/dist/tools/cli/commands/index.d.ts +0 -7
- package/dist/tools/cli/commands/index.d.ts.map +0 -1
- package/dist/tools/cli/commands/index.js +0 -7
- package/dist/tools/cli/commands/index.js.map +0 -1
- package/dist/tools/cli/index.d.ts +0 -8
- package/dist/tools/cli/index.d.ts.map +0 -1
- package/dist/tools/cli/index.js +0 -9
- package/dist/tools/cli/index.js.map +0 -1
- package/dist/tools/watcher/index.d.ts +0 -105
- package/dist/tools/watcher/index.d.ts.map +0 -1
- package/dist/tools/watcher/index.js +0 -213
- package/dist/tools/watcher/index.js.map +0 -1
- package/dist/ui/canvas/canvas-projection.d.ts +0 -78
- package/dist/ui/canvas/canvas-projection.d.ts.map +0 -1
- package/dist/ui/canvas/canvas-projection.js +0 -416
- package/dist/ui/canvas/canvas-projection.js.map +0 -1
- package/dist/ui/canvas/canvas-state.d.ts +0 -200
- package/dist/ui/canvas/canvas-state.d.ts.map +0 -1
- package/dist/ui/canvas/canvas-state.js +0 -464
- package/dist/ui/canvas/canvas-state.js.map +0 -1
- package/dist/ui/canvas/components/index.d.ts +0 -95
- package/dist/ui/canvas/components/index.d.ts.map +0 -1
- package/dist/ui/canvas/components/index.js +0 -19
- package/dist/ui/canvas/components/index.js.map +0 -1
- package/dist/ui/canvas/index.d.ts +0 -32
- package/dist/ui/canvas/index.d.ts.map +0 -1
- package/dist/ui/canvas/index.js +0 -32
- package/dist/ui/canvas/index.js.map +0 -1
- package/dist/ui/svelte-generator/index.d.ts +0 -9
- package/dist/ui/svelte-generator/index.d.ts.map +0 -1
- package/dist/ui/svelte-generator/index.js +0 -11
- package/dist/ui/svelte-generator/index.js.map +0 -1
- package/dist/ui/svelte-generator/psf-generator.d.ts +0 -128
- package/dist/ui/svelte-generator/psf-generator.d.ts.map +0 -1
- package/dist/ui/svelte-generator/psf-generator.js +0 -506
- package/dist/ui/svelte-generator/psf-generator.js.map +0 -1
|
@@ -5,6 +5,7 @@ Praxis provides built-in support for orchestrating distributed systems using Des
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
7
|
Praxis orchestration enables:
|
|
8
|
+
|
|
8
9
|
- **Multi-Node Coordination**: Manage distributed application instances
|
|
9
10
|
- **State Synchronization**: Keep distributed state consistent
|
|
10
11
|
- **Health Monitoring**: Automatic health checks and recovery
|
|
@@ -17,6 +18,7 @@ Praxis orchestration enables:
|
|
|
17
18
|
### Desired State Configuration (DSC)
|
|
18
19
|
|
|
19
20
|
DSC defines the desired state of your distributed system:
|
|
21
|
+
|
|
20
22
|
- Node configurations
|
|
21
23
|
- Service dependencies
|
|
22
24
|
- Resource allocation
|
|
@@ -26,6 +28,7 @@ DSC defines the desired state of your distributed system:
|
|
|
26
28
|
### Model Context Protocol (MCP)
|
|
27
29
|
|
|
28
30
|
MCP enables:
|
|
31
|
+
|
|
29
32
|
- Inter-node communication
|
|
30
33
|
- State distribution
|
|
31
34
|
- Event propagation
|
|
@@ -40,7 +43,7 @@ In your schema:
|
|
|
40
43
|
```typescript
|
|
41
44
|
export const appSchema: PraxisSchema = {
|
|
42
45
|
// ... other schema config
|
|
43
|
-
|
|
46
|
+
|
|
44
47
|
orchestration: {
|
|
45
48
|
type: 'dsc',
|
|
46
49
|
nodes: [
|
|
@@ -89,6 +92,7 @@ praxis orchestrate --config src/schemas/app.schema.ts
|
|
|
89
92
|
### Primary Node
|
|
90
93
|
|
|
91
94
|
Main coordinator node:
|
|
95
|
+
|
|
92
96
|
- Accepts write operations
|
|
93
97
|
- Coordinates state distribution
|
|
94
98
|
- Manages replica health
|
|
@@ -97,6 +101,7 @@ Main coordinator node:
|
|
|
97
101
|
### Replica Node
|
|
98
102
|
|
|
99
103
|
Read-replica node:
|
|
104
|
+
|
|
100
105
|
- Receives state updates from primary
|
|
101
106
|
- Serves read operations
|
|
102
107
|
- Can become primary on failover
|
|
@@ -105,6 +110,7 @@ Read-replica node:
|
|
|
105
110
|
### Worker Node
|
|
106
111
|
|
|
107
112
|
Processing node:
|
|
113
|
+
|
|
108
114
|
- Executes background jobs
|
|
109
115
|
- Processes queued tasks
|
|
110
116
|
- Reports status to primary
|
|
@@ -113,6 +119,7 @@ Processing node:
|
|
|
113
119
|
### Gateway Node
|
|
114
120
|
|
|
115
121
|
Entry point node:
|
|
122
|
+
|
|
116
123
|
- Load balancing
|
|
117
124
|
- Request routing
|
|
118
125
|
- Authentication
|
|
@@ -139,7 +146,7 @@ export const dscConfig: OrchestrationConfig = {
|
|
|
139
146
|
gateway: 1,
|
|
140
147
|
},
|
|
141
148
|
},
|
|
142
|
-
|
|
149
|
+
|
|
143
150
|
// Node configuration
|
|
144
151
|
nodeDefaults: {
|
|
145
152
|
memory: '512MB',
|
|
@@ -147,7 +154,7 @@ export const dscConfig: OrchestrationConfig = {
|
|
|
147
154
|
disk: '10GB',
|
|
148
155
|
network: 'private',
|
|
149
156
|
},
|
|
150
|
-
|
|
157
|
+
|
|
151
158
|
// State sync configuration
|
|
152
159
|
sync: {
|
|
153
160
|
protocol: 'websocket',
|
|
@@ -160,7 +167,7 @@ export const dscConfig: OrchestrationConfig = {
|
|
|
160
167
|
customResolver: './resolvers/custom.ts',
|
|
161
168
|
},
|
|
162
169
|
},
|
|
163
|
-
|
|
170
|
+
|
|
164
171
|
// Health monitoring
|
|
165
172
|
health: {
|
|
166
173
|
checkInterval: 30000,
|
|
@@ -176,7 +183,7 @@ export const dscConfig: OrchestrationConfig = {
|
|
|
176
183
|
slack: 'https://hooks.slack.com/...',
|
|
177
184
|
},
|
|
178
185
|
},
|
|
179
|
-
|
|
186
|
+
|
|
180
187
|
// Auto-scaling
|
|
181
188
|
scaling: {
|
|
182
189
|
enabled: true,
|
|
@@ -200,7 +207,7 @@ export const dscConfig: OrchestrationConfig = {
|
|
|
200
207
|
maxNodes: 10,
|
|
201
208
|
},
|
|
202
209
|
},
|
|
203
|
-
|
|
210
|
+
|
|
204
211
|
// Service discovery
|
|
205
212
|
discovery: {
|
|
206
213
|
enabled: true,
|
|
@@ -208,7 +215,7 @@ export const dscConfig: OrchestrationConfig = {
|
|
|
208
215
|
ttl: 60000,
|
|
209
216
|
tags: ['praxis', 'production'],
|
|
210
217
|
},
|
|
211
|
-
|
|
218
|
+
|
|
212
219
|
// Load balancing
|
|
213
220
|
loadBalancing: {
|
|
214
221
|
strategy: 'round-robin', // 'round-robin' | 'least-conn' | 'ip-hash'
|
|
@@ -223,16 +230,19 @@ export const dscConfig: OrchestrationConfig = {
|
|
|
223
230
|
### Sync Strategies
|
|
224
231
|
|
|
225
232
|
**Last-Write-Wins**:
|
|
233
|
+
|
|
226
234
|
```typescript
|
|
227
|
-
conflictResolution: 'last-write-wins'
|
|
235
|
+
conflictResolution: 'last-write-wins';
|
|
228
236
|
```
|
|
229
237
|
|
|
230
238
|
**Merge Strategy**:
|
|
239
|
+
|
|
231
240
|
```typescript
|
|
232
|
-
conflictResolution: 'merge'
|
|
241
|
+
conflictResolution: 'merge';
|
|
233
242
|
```
|
|
234
243
|
|
|
235
244
|
**Custom Resolver**:
|
|
245
|
+
|
|
236
246
|
```typescript
|
|
237
247
|
conflictResolution: {
|
|
238
248
|
strategy: 'custom',
|
|
@@ -286,18 +296,18 @@ export const healthChecks = {
|
|
|
286
296
|
// Check if node is alive
|
|
287
297
|
return { status: 'ok' };
|
|
288
298
|
},
|
|
289
|
-
|
|
299
|
+
|
|
290
300
|
readiness: async () => {
|
|
291
301
|
// Check if node is ready to serve requests
|
|
292
302
|
const dbReady = await checkDatabase();
|
|
293
303
|
const cacheReady = await checkCache();
|
|
294
|
-
|
|
304
|
+
|
|
295
305
|
return {
|
|
296
306
|
status: dbReady && cacheReady ? 'ok' : 'not-ready',
|
|
297
307
|
details: { database: dbReady, cache: cacheReady },
|
|
298
308
|
};
|
|
299
309
|
},
|
|
300
|
-
|
|
310
|
+
|
|
301
311
|
metrics: async () => {
|
|
302
312
|
// Return metrics
|
|
303
313
|
return {
|
|
@@ -312,6 +322,7 @@ export const healthChecks = {
|
|
|
312
322
|
### Failure Detection
|
|
313
323
|
|
|
314
324
|
Automatic failure detection:
|
|
325
|
+
|
|
315
326
|
- Heartbeat monitoring
|
|
316
327
|
- Health check failures
|
|
317
328
|
- Network partition detection
|
|
@@ -320,6 +331,7 @@ Automatic failure detection:
|
|
|
320
331
|
### Recovery Actions
|
|
321
332
|
|
|
322
333
|
Configured recovery actions:
|
|
334
|
+
|
|
323
335
|
- **Restart**: Restart failed node
|
|
324
336
|
- **Failover**: Promote replica to primary
|
|
325
337
|
- **Scale**: Add new nodes
|
|
@@ -419,9 +431,7 @@ Events propagate across nodes:
|
|
|
419
431
|
|
|
420
432
|
```typescript
|
|
421
433
|
// Define distributed event
|
|
422
|
-
const UserLoginEvent = defineEvent<'USER_LOGIN', { userId: string }>(
|
|
423
|
-
'USER_LOGIN'
|
|
424
|
-
);
|
|
434
|
+
const UserLoginEvent = defineEvent<'USER_LOGIN', { userId: string }>('USER_LOGIN');
|
|
425
435
|
|
|
426
436
|
// Dispatch on any node
|
|
427
437
|
engine.step([UserLoginEvent.create({ userId: 'user123' })]);
|
|
@@ -495,23 +505,23 @@ spec:
|
|
|
495
505
|
app: praxis-app
|
|
496
506
|
spec:
|
|
497
507
|
containers:
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
508
|
+
- name: praxis
|
|
509
|
+
image: my-praxis-app:latest
|
|
510
|
+
ports:
|
|
511
|
+
- containerPort: 8080
|
|
512
|
+
env:
|
|
513
|
+
- name: NODE_TYPE
|
|
514
|
+
value: 'replica'
|
|
515
|
+
- name: PRIMARY_HOST
|
|
516
|
+
value: 'praxis-primary'
|
|
517
|
+
livenessProbe:
|
|
518
|
+
httpGet:
|
|
519
|
+
path: /health/live
|
|
520
|
+
port: 8080
|
|
521
|
+
readinessProbe:
|
|
522
|
+
httpGet:
|
|
523
|
+
path: /health/ready
|
|
524
|
+
port: 8080
|
|
515
525
|
```
|
|
516
526
|
|
|
517
527
|
## Monitoring & Observability
|
|
@@ -519,6 +529,7 @@ spec:
|
|
|
519
529
|
### Metrics
|
|
520
530
|
|
|
521
531
|
Collect cluster metrics:
|
|
532
|
+
|
|
522
533
|
- Request rate per node
|
|
523
534
|
- State sync latency
|
|
524
535
|
- Health check status
|
|
@@ -563,6 +574,7 @@ orchestration: {
|
|
|
563
574
|
### Split Brain
|
|
564
575
|
|
|
565
576
|
Detect and resolve split brain:
|
|
577
|
+
|
|
566
578
|
```bash
|
|
567
579
|
praxis orchestrate diagnose split-brain
|
|
568
580
|
praxis orchestrate resolve split-brain --strategy quorum
|
|
@@ -571,6 +583,7 @@ praxis orchestrate resolve split-brain --strategy quorum
|
|
|
571
583
|
### Network Partition
|
|
572
584
|
|
|
573
585
|
Handle network partitions:
|
|
586
|
+
|
|
574
587
|
```typescript
|
|
575
588
|
sync: {
|
|
576
589
|
partitionTolerance: {
|
|
@@ -583,6 +596,7 @@ sync: {
|
|
|
583
596
|
### State Divergence
|
|
584
597
|
|
|
585
598
|
Reconcile diverged state:
|
|
599
|
+
|
|
586
600
|
```bash
|
|
587
601
|
praxis orchestrate reconcile --force
|
|
588
602
|
```
|
|
@@ -85,7 +85,7 @@ console.log('Cart:', cartEngine.getContext());
|
|
|
85
85
|
console.log('Notifications:', notificationEngine.getContext());
|
|
86
86
|
|
|
87
87
|
// Events are processed independently
|
|
88
|
-
authEngine.step([Login.create({})]);
|
|
88
|
+
authEngine.step([Login.create({})]); // Only affects auth
|
|
89
89
|
cartEngine.step([Checkout.create({})]); // Only affects cart
|
|
90
90
|
notificationEngine.step([Clear.create({})]); // Only affects notifications
|
|
91
91
|
```
|
|
@@ -133,15 +133,13 @@ class AppCoordinator {
|
|
|
133
133
|
// When user logs out, clear cart
|
|
134
134
|
if (results.auth.state.facts.some((f: any) => f.tag === 'UserLoggedOut')) {
|
|
135
135
|
this.cartEngine.step([ClearCart.create({})]);
|
|
136
|
-
this.notificationEngine.step([
|
|
137
|
-
ShowNotification.create({ message: 'Cart cleared' })
|
|
138
|
-
]);
|
|
136
|
+
this.notificationEngine.step([ShowNotification.create({ message: 'Cart cleared' })]);
|
|
139
137
|
}
|
|
140
138
|
|
|
141
139
|
// When order is placed, show notification
|
|
142
140
|
if (results.cart.state.facts.some((f: any) => f.tag === 'OrderPlaced')) {
|
|
143
141
|
this.notificationEngine.step([
|
|
144
|
-
ShowNotification.create({ message: 'Order placed successfully!' })
|
|
142
|
+
ShowNotification.create({ message: 'Order placed successfully!' }),
|
|
145
143
|
]);
|
|
146
144
|
}
|
|
147
145
|
|
|
@@ -150,7 +148,7 @@ class AppCoordinator {
|
|
|
150
148
|
const authContext = this.authEngine.getContext();
|
|
151
149
|
if (!authContext.user) {
|
|
152
150
|
this.notificationEngine.step([
|
|
153
|
-
ShowNotification.create({ message: 'Please login to continue' })
|
|
151
|
+
ShowNotification.create({ message: 'Please login to continue' }),
|
|
154
152
|
]);
|
|
155
153
|
}
|
|
156
154
|
}
|
|
@@ -169,11 +167,7 @@ class AppCoordinator {
|
|
|
169
167
|
}
|
|
170
168
|
|
|
171
169
|
// Usage
|
|
172
|
-
const coordinator = new AppCoordinator(
|
|
173
|
-
authEngine,
|
|
174
|
-
cartEngine,
|
|
175
|
-
notificationEngine
|
|
176
|
-
);
|
|
170
|
+
const coordinator = new AppCoordinator(authEngine, cartEngine, notificationEngine);
|
|
177
171
|
|
|
178
172
|
coordinator.dispatch({
|
|
179
173
|
auth: [Login.create({ username: 'alice' })],
|
|
@@ -210,7 +204,7 @@ class EventBus {
|
|
|
210
204
|
publish(event: PraxisEvent) {
|
|
211
205
|
const handlers = this.handlers.get(event.tag);
|
|
212
206
|
if (handlers) {
|
|
213
|
-
handlers.forEach(handler => handler(event));
|
|
207
|
+
handlers.forEach((handler) => handler(event));
|
|
214
208
|
}
|
|
215
209
|
}
|
|
216
210
|
}
|
|
@@ -221,39 +215,33 @@ const eventBus = new EventBus();
|
|
|
221
215
|
// Connect engines to event bus
|
|
222
216
|
eventBus.subscribe('USER_LOGGED_OUT', () => {
|
|
223
217
|
cartEngine.step([ClearCart.create({})]);
|
|
224
|
-
notificationEngine.step([
|
|
225
|
-
ShowNotification.create({ message: 'Cart cleared' })
|
|
226
|
-
]);
|
|
218
|
+
notificationEngine.step([ShowNotification.create({ message: 'Cart cleared' })]);
|
|
227
219
|
});
|
|
228
220
|
|
|
229
221
|
eventBus.subscribe('ORDER_PLACED', (event) => {
|
|
230
|
-
notificationEngine.step([
|
|
231
|
-
ShowNotification.create({ message: 'Order placed!' })
|
|
232
|
-
]);
|
|
222
|
+
notificationEngine.step([ShowNotification.create({ message: 'Order placed!' })]);
|
|
233
223
|
});
|
|
234
224
|
|
|
235
225
|
eventBus.subscribe('CART_ITEM_ADDED', (event) => {
|
|
236
226
|
const authContext = authEngine.getContext();
|
|
237
227
|
if (!authContext.user) {
|
|
238
|
-
notificationEngine.step([
|
|
239
|
-
ShowNotification.create({ message: 'Login to save your cart' })
|
|
240
|
-
]);
|
|
228
|
+
notificationEngine.step([ShowNotification.create({ message: 'Login to save your cart' })]);
|
|
241
229
|
}
|
|
242
230
|
});
|
|
243
231
|
|
|
244
232
|
// Dispatch events through bus
|
|
245
233
|
function dispatchWithBroadcast(engine: LogicEngine<any>, events: PraxisEvent[]) {
|
|
246
234
|
const result = engine.step(events);
|
|
247
|
-
|
|
235
|
+
|
|
248
236
|
// Broadcast facts as events
|
|
249
|
-
result.state.facts.forEach(fact => {
|
|
237
|
+
result.state.facts.forEach((fact) => {
|
|
250
238
|
eventBus.publish({
|
|
251
239
|
tag: fact.tag,
|
|
252
240
|
payload: fact.payload,
|
|
253
241
|
timestamp: Date.now(),
|
|
254
242
|
});
|
|
255
243
|
});
|
|
256
|
-
|
|
244
|
+
|
|
257
245
|
return result;
|
|
258
246
|
}
|
|
259
247
|
```
|
|
@@ -278,7 +266,7 @@ class HierarchicalEngine {
|
|
|
278
266
|
|
|
279
267
|
addChild<T>(id: string, engine: LogicEngine<T>) {
|
|
280
268
|
this.childEngines.set(id, engine);
|
|
281
|
-
|
|
269
|
+
|
|
282
270
|
// Update parent context
|
|
283
271
|
const parentContext = this.parentEngine.getContext();
|
|
284
272
|
parentContext.children.set(id, engine.getContext());
|
|
@@ -286,7 +274,7 @@ class HierarchicalEngine {
|
|
|
286
274
|
|
|
287
275
|
removeChild(id: string) {
|
|
288
276
|
this.childEngines.delete(id);
|
|
289
|
-
|
|
277
|
+
|
|
290
278
|
const parentContext = this.parentEngine.getContext();
|
|
291
279
|
parentContext.children.delete(id);
|
|
292
280
|
}
|
|
@@ -379,14 +367,14 @@ class SharedStateManager {
|
|
|
379
367
|
subscribe(callback: (state: SharedState) => void) {
|
|
380
368
|
this.subscribers.add(callback);
|
|
381
369
|
callback(this.state);
|
|
382
|
-
|
|
370
|
+
|
|
383
371
|
return () => {
|
|
384
372
|
this.subscribers.delete(callback);
|
|
385
373
|
};
|
|
386
374
|
}
|
|
387
375
|
|
|
388
376
|
private notify() {
|
|
389
|
-
this.subscribers.forEach(sub => sub(this.state));
|
|
377
|
+
this.subscribers.forEach((sub) => sub(this.state));
|
|
390
378
|
}
|
|
391
379
|
}
|
|
392
380
|
|
|
@@ -403,9 +391,7 @@ sharedState.subscribe((state) => {
|
|
|
403
391
|
|
|
404
392
|
sharedState.subscribe((state) => {
|
|
405
393
|
// Update notification badge
|
|
406
|
-
notificationEngine.step([
|
|
407
|
-
UpdateBadge.create({ count: state.unreadCount })
|
|
408
|
-
]);
|
|
394
|
+
notificationEngine.step([UpdateBadge.create({ count: state.unreadCount })]);
|
|
409
395
|
});
|
|
410
396
|
|
|
411
397
|
// Engines update shared state
|
|
@@ -425,10 +411,10 @@ Using parallel engines with Svelte 5:
|
|
|
425
411
|
```svelte
|
|
426
412
|
<script lang="ts">
|
|
427
413
|
import { usePraxisEngine } from '@plures/praxis/svelte';
|
|
428
|
-
import {
|
|
429
|
-
createAuthEngine,
|
|
430
|
-
createCartEngine,
|
|
431
|
-
createNotificationEngine
|
|
414
|
+
import {
|
|
415
|
+
createAuthEngine,
|
|
416
|
+
createCartEngine,
|
|
417
|
+
createNotificationEngine
|
|
432
418
|
} from './engines';
|
|
433
419
|
|
|
434
420
|
// Create independent engines
|
|
@@ -443,14 +429,14 @@ Using parallel engines with Svelte 5:
|
|
|
443
429
|
|
|
444
430
|
// Cross-engine reactions
|
|
445
431
|
$: if (auth.context.user) {
|
|
446
|
-
cart.dispatch([LoadUserCart.create({
|
|
447
|
-
userId: auth.context.user.id
|
|
432
|
+
cart.dispatch([LoadUserCart.create({
|
|
433
|
+
userId: auth.context.user.id
|
|
448
434
|
})]);
|
|
449
435
|
}
|
|
450
436
|
|
|
451
437
|
$: if (cart.context.items.length > 0 && !auth.context.user) {
|
|
452
|
-
notifications.dispatch([ShowNotification.create({
|
|
453
|
-
message: 'Please login to continue'
|
|
438
|
+
notifications.dispatch([ShowNotification.create({
|
|
439
|
+
message: 'Please login to continue'
|
|
454
440
|
})]);
|
|
455
441
|
}
|
|
456
442
|
</script>
|
|
@@ -498,10 +484,10 @@ Using parallel engines with Svelte 5:
|
|
|
498
484
|
<script lang="ts">
|
|
499
485
|
import { usePraxisEngine } from '@plures/praxis/svelte';
|
|
500
486
|
import { AppCoordinator } from './coordinator';
|
|
501
|
-
import {
|
|
502
|
-
createAuthEngine,
|
|
503
|
-
createCartEngine,
|
|
504
|
-
createNotificationEngine
|
|
487
|
+
import {
|
|
488
|
+
createAuthEngine,
|
|
489
|
+
createCartEngine,
|
|
490
|
+
createNotificationEngine
|
|
505
491
|
} from './engines';
|
|
506
492
|
|
|
507
493
|
// Create coordinator
|
|
@@ -566,26 +552,20 @@ function setupCoordination() {
|
|
|
566
552
|
// When user logs in, load their cart
|
|
567
553
|
authEngine.subscribe((state) => {
|
|
568
554
|
if (state.context.user) {
|
|
569
|
-
cartEngine.step([
|
|
570
|
-
LoadCart.create({ userId: state.context.user.id })
|
|
571
|
-
]);
|
|
555
|
+
cartEngine.step([LoadCart.create({ userId: state.context.user.id })]);
|
|
572
556
|
}
|
|
573
557
|
});
|
|
574
558
|
|
|
575
559
|
// When cart updates, update checkout
|
|
576
560
|
cartEngine.subscribe((state) => {
|
|
577
|
-
checkoutEngine.step([
|
|
578
|
-
UpdateTotal.create({ total: state.context.total })
|
|
579
|
-
]);
|
|
561
|
+
checkoutEngine.step([UpdateTotal.create({ total: state.context.total })]);
|
|
580
562
|
});
|
|
581
563
|
|
|
582
564
|
// When checkout completes, clear cart and show notification
|
|
583
565
|
checkoutEngine.subscribe((state) => {
|
|
584
|
-
if (state.facts.some(f => f.tag === 'OrderPlaced')) {
|
|
566
|
+
if (state.facts.some((f) => f.tag === 'OrderPlaced')) {
|
|
585
567
|
cartEngine.step([ClearCart.create({})]);
|
|
586
|
-
notificationEngine.step([
|
|
587
|
-
ShowNotification.create({ message: 'Order placed!' })
|
|
588
|
-
]);
|
|
568
|
+
notificationEngine.step([ShowNotification.create({ message: 'Order placed!' })]);
|
|
589
569
|
}
|
|
590
570
|
});
|
|
591
571
|
}
|
|
@@ -609,7 +589,7 @@ function updatePanel(panelId: keyof typeof panels, events: PraxisEvent[]) {
|
|
|
609
589
|
|
|
610
590
|
// Shared coordination for common actions
|
|
611
591
|
function refreshAll() {
|
|
612
|
-
Object.values(panels).forEach(panel => {
|
|
592
|
+
Object.values(panels).forEach((panel) => {
|
|
613
593
|
panel.step([Refresh.create({})]);
|
|
614
594
|
});
|
|
615
595
|
}
|
|
@@ -619,7 +599,7 @@ function exportAll() {
|
|
|
619
599
|
panel: id,
|
|
620
600
|
data: panel.getContext(),
|
|
621
601
|
}));
|
|
622
|
-
|
|
602
|
+
|
|
623
603
|
downloadJSON(data, 'dashboard-export.json');
|
|
624
604
|
}
|
|
625
605
|
```
|
|
@@ -641,7 +621,7 @@ function gameTick(deltaTime: number) {
|
|
|
641
621
|
game.player.step([Tick.create({ deltaTime })]);
|
|
642
622
|
game.inventory.step([Tick.create({ deltaTime })]);
|
|
643
623
|
game.world.step([Tick.create({ deltaTime })]);
|
|
644
|
-
|
|
624
|
+
|
|
645
625
|
// Sync states
|
|
646
626
|
const playerPos = game.player.getContext().position;
|
|
647
627
|
game.world.step([UpdatePlayerPosition.create({ position: playerPos })]);
|
|
@@ -655,13 +635,15 @@ function handlePlayerAction(action: string) {
|
|
|
655
635
|
game.player.step([UseItem.create({ item })]);
|
|
656
636
|
game.inventory.step([RemoveItem.create({ item })]);
|
|
657
637
|
break;
|
|
658
|
-
|
|
638
|
+
|
|
659
639
|
case 'SEND_MESSAGE':
|
|
660
640
|
const player = game.player.getContext();
|
|
661
|
-
game.chat.step([
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
641
|
+
game.chat.step([
|
|
642
|
+
SendMessage.create({
|
|
643
|
+
player: player.name,
|
|
644
|
+
message: player.currentMessage,
|
|
645
|
+
}),
|
|
646
|
+
]);
|
|
665
647
|
break;
|
|
666
648
|
}
|
|
667
649
|
}
|
|
@@ -673,9 +655,9 @@ function handlePlayerAction(action: string) {
|
|
|
673
655
|
|
|
674
656
|
```typescript
|
|
675
657
|
// ✅ Good: Clear separation of concerns
|
|
676
|
-
const userEngine = createUserEngine();
|
|
658
|
+
const userEngine = createUserEngine(); // User state only
|
|
677
659
|
const ordersEngine = createOrdersEngine(); // Orders only
|
|
678
|
-
const cartEngine = createCartEngine();
|
|
660
|
+
const cartEngine = createCartEngine(); // Cart only
|
|
679
661
|
|
|
680
662
|
// ❌ Bad: Mixing concerns
|
|
681
663
|
const everythingEngine = createEverythingEngine(); // Too much
|
|
@@ -719,11 +701,11 @@ describe('Auth Engine', () => {
|
|
|
719
701
|
```typescript
|
|
720
702
|
/**
|
|
721
703
|
* Shopping Cart Engine
|
|
722
|
-
*
|
|
704
|
+
*
|
|
723
705
|
* Dependencies:
|
|
724
706
|
* - Auth engine: Requires user ID to load cart
|
|
725
707
|
* - Checkout engine: Sends total for checkout
|
|
726
|
-
*
|
|
708
|
+
*
|
|
727
709
|
* Emits:
|
|
728
710
|
* - CartUpdated: When items change
|
|
729
711
|
* - CartCleared: When cart is emptied
|
|
@@ -735,13 +717,13 @@ export function createCartEngine() {
|
|
|
735
717
|
|
|
736
718
|
## Comparison with XState
|
|
737
719
|
|
|
738
|
-
| Feature
|
|
739
|
-
|
|
740
|
-
| **Parallel States** | `type: 'parallel'`
|
|
741
|
-
| **Coordination**
|
|
742
|
-
| **Communication**
|
|
743
|
-
| **Hierarchy**
|
|
744
|
-
| **Testing**
|
|
720
|
+
| Feature | XState | Praxis |
|
|
721
|
+
| ------------------- | -------------------- | ------------------------------ |
|
|
722
|
+
| **Parallel States** | `type: 'parallel'` | Multiple engines |
|
|
723
|
+
| **Coordination** | Parent state machine | Coordinator pattern |
|
|
724
|
+
| **Communication** | Event forwarding | Event bus or shared state |
|
|
725
|
+
| **Hierarchy** | Nested states | Parent-child engines |
|
|
726
|
+
| **Testing** | Test parent machine | Test each engine independently |
|
|
745
727
|
|
|
746
728
|
## Summary
|
|
747
729
|
|
|
@@ -755,6 +737,7 @@ The parallel state pattern in Praxis provides:
|
|
|
755
737
|
- ✅ **Scalable**: Add or remove engines as needed
|
|
756
738
|
|
|
757
739
|
Choose the right pattern based on your needs:
|
|
740
|
+
|
|
758
741
|
- **Independent engines**: When subsystems don't interact
|
|
759
742
|
- **Event bus**: When you need loose coupling with pub/sub
|
|
760
743
|
- **Coordinator**: When you need centralized orchestration
|
|
@@ -762,6 +745,7 @@ Choose the right pattern based on your needs:
|
|
|
762
745
|
- **Hierarchy**: When you have parent-child relationships
|
|
763
746
|
|
|
764
747
|
For more examples, see:
|
|
748
|
+
|
|
765
749
|
- [E-Commerce Example](/src/examples/hero-ecommerce/)
|
|
766
750
|
- [Auth Example](/src/examples/auth-basic/)
|
|
767
751
|
- [Multiple Engine Tests](/src/__tests__/edge-cases.test.ts)
|