@plures/praxis 0.2.1 → 1.0.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/README.md +188 -61
- package/core/codegen/docs-generator.ts +808 -0
- package/core/codegen/index.ts +27 -0
- package/core/codegen/ts-generator.ts +15 -0
- package/core/db-adapter/index.ts +52 -0
- package/core/db-adapter/sync-engine.ts +450 -0
- package/core/logic-engine/engine.ts +12 -0
- package/core/logic-engine/index.ts +16 -0
- package/core/logic-engine/protocol.ts +16 -0
- package/core/logic-engine/psf-adapter.ts +269 -0
- package/core/logic-engine/rules.ts +16 -0
- package/core/schema-engine/compiler.ts +431 -0
- package/core/schema-engine/generator.ts +635 -0
- package/core/schema-engine/index.ts +18 -0
- package/core/schema-engine/psf.ts +664 -0
- package/core/schema-engine/types.ts +63 -0
- package/core/schema-engine/validator.ts +541 -0
- package/dist/core/codegen/docs-generator.d.ts +123 -0
- package/dist/core/codegen/docs-generator.d.ts.map +1 -0
- package/dist/core/codegen/docs-generator.js +674 -0
- package/dist/core/codegen/docs-generator.js.map +1 -0
- package/dist/core/codegen/index.d.ts +11 -0
- package/dist/core/codegen/index.d.ts.map +1 -0
- package/dist/core/codegen/index.js +13 -0
- package/dist/core/codegen/index.js.map +1 -0
- package/dist/core/codegen/ts-generator.d.ts +8 -0
- package/dist/core/codegen/ts-generator.d.ts.map +1 -0
- package/dist/core/codegen/ts-generator.js +8 -0
- package/dist/core/codegen/ts-generator.js.map +1 -0
- package/dist/core/db-adapter/index.d.ts +18 -0
- package/dist/core/db-adapter/index.d.ts.map +1 -0
- package/dist/core/db-adapter/index.js +23 -0
- package/dist/core/db-adapter/index.js.map +1 -0
- package/dist/core/db-adapter/sync-engine.d.ts +180 -0
- package/dist/core/db-adapter/sync-engine.d.ts.map +1 -0
- package/dist/core/db-adapter/sync-engine.js +342 -0
- package/dist/core/db-adapter/sync-engine.js.map +1 -0
- package/dist/core/logic-engine/engine.d.ts +8 -0
- package/dist/core/logic-engine/engine.d.ts.map +1 -0
- package/dist/core/logic-engine/engine.js +8 -0
- package/dist/core/logic-engine/engine.js.map +1 -0
- package/dist/core/logic-engine/index.d.ts +16 -0
- package/dist/core/logic-engine/index.d.ts.map +1 -0
- package/dist/core/logic-engine/index.js +16 -0
- package/dist/core/logic-engine/index.js.map +1 -0
- package/dist/core/logic-engine/protocol.d.ts +7 -0
- package/dist/core/logic-engine/protocol.d.ts.map +1 -0
- package/dist/core/logic-engine/protocol.js +7 -0
- package/dist/core/logic-engine/protocol.js.map +1 -0
- package/dist/core/logic-engine/psf-adapter.d.ts +88 -0
- package/dist/core/logic-engine/psf-adapter.d.ts.map +1 -0
- package/dist/core/logic-engine/psf-adapter.js +207 -0
- package/dist/core/logic-engine/psf-adapter.js.map +1 -0
- package/dist/core/logic-engine/rules.d.ts +7 -0
- package/dist/core/logic-engine/rules.d.ts.map +1 -0
- package/dist/core/logic-engine/rules.js +7 -0
- package/dist/core/logic-engine/rules.js.map +1 -0
- package/dist/core/schema-engine/compiler.d.ts +198 -0
- package/dist/core/schema-engine/compiler.d.ts.map +1 -0
- package/dist/core/schema-engine/compiler.js +262 -0
- package/dist/core/schema-engine/compiler.js.map +1 -0
- package/dist/core/schema-engine/generator.d.ts +115 -0
- package/dist/core/schema-engine/generator.d.ts.map +1 -0
- package/dist/core/schema-engine/generator.js +506 -0
- package/dist/core/schema-engine/generator.js.map +1 -0
- package/dist/core/schema-engine/index.d.ts +18 -0
- package/dist/core/schema-engine/index.d.ts.map +1 -0
- package/dist/core/schema-engine/index.js +18 -0
- package/dist/core/schema-engine/index.js.map +1 -0
- package/dist/core/schema-engine/psf.d.ts +612 -0
- package/dist/core/schema-engine/psf.d.ts.map +1 -0
- package/dist/core/schema-engine/psf.js +45 -0
- package/dist/core/schema-engine/psf.js.map +1 -0
- package/dist/core/schema-engine/types.d.ts +10 -0
- package/dist/core/schema-engine/types.d.ts.map +1 -0
- package/dist/core/schema-engine/types.js +7 -0
- package/dist/core/schema-engine/types.js.map +1 -0
- package/dist/core/schema-engine/validator.d.ts +140 -0
- package/dist/core/schema-engine/validator.d.ts.map +1 -0
- package/dist/core/schema-engine/validator.js +407 -0
- package/dist/core/schema-engine/validator.js.map +1 -0
- package/dist/src/adapters/cli.d.ts.map +1 -0
- package/dist/src/adapters/cli.js.map +1 -0
- package/dist/src/cli/commands/auth.d.ts.map +1 -0
- package/dist/src/cli/commands/auth.js.map +1 -0
- package/dist/src/cli/commands/build.d.ts +23 -0
- package/dist/src/cli/commands/build.d.ts.map +1 -0
- package/dist/src/cli/commands/build.js +162 -0
- package/dist/src/cli/commands/build.js.map +1 -0
- package/dist/src/cli/commands/canvas.d.ts +23 -0
- package/dist/src/cli/commands/canvas.d.ts.map +1 -0
- package/dist/src/cli/commands/canvas.js +215 -0
- package/dist/src/cli/commands/canvas.js.map +1 -0
- package/dist/src/cli/commands/cloud.d.ts.map +1 -0
- package/dist/src/cli/commands/cloud.js.map +1 -0
- package/dist/src/cli/commands/create.d.ts +21 -0
- package/dist/src/cli/commands/create.d.ts.map +1 -0
- package/dist/src/cli/commands/create.js +621 -0
- package/dist/src/cli/commands/create.js.map +1 -0
- package/dist/src/cli/commands/dev.d.ts +21 -0
- package/dist/src/cli/commands/dev.d.ts.map +1 -0
- package/dist/src/cli/commands/dev.js +71 -0
- package/dist/src/cli/commands/dev.js.map +1 -0
- package/dist/src/cli/commands/generate.d.ts.map +1 -0
- package/dist/src/cli/commands/generate.js.map +1 -0
- package/dist/src/cli/commands/orchestrate.d.ts +44 -0
- package/dist/src/cli/commands/orchestrate.d.ts.map +1 -0
- package/dist/src/cli/commands/orchestrate.js +150 -0
- package/dist/src/cli/commands/orchestrate.js.map +1 -0
- package/dist/{cli → src/cli}/index.d.ts.map +1 -1
- package/dist/{cli → src/cli}/index.js +53 -21
- package/dist/src/cli/index.js.map +1 -0
- package/dist/src/cloud/auth.d.ts.map +1 -0
- package/dist/src/cloud/auth.js.map +1 -0
- package/dist/src/cloud/billing.d.ts.map +1 -0
- package/dist/src/cloud/billing.js.map +1 -0
- package/dist/src/cloud/client.d.ts.map +1 -0
- package/dist/src/cloud/client.js.map +1 -0
- package/dist/src/cloud/index.d.ts.map +1 -0
- package/dist/src/cloud/index.js.map +1 -0
- package/dist/src/cloud/marketplace.d.ts.map +1 -0
- package/dist/src/cloud/marketplace.js.map +1 -0
- package/dist/src/cloud/provisioning.d.ts.map +1 -0
- package/dist/src/cloud/provisioning.js.map +1 -0
- package/dist/src/cloud/relay/endpoints.d.ts.map +1 -0
- package/dist/src/cloud/relay/endpoints.js.map +1 -0
- package/dist/src/cloud/relay/health/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/health/index.js.map +1 -0
- package/dist/src/cloud/relay/stats/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/stats/index.js.map +1 -0
- package/dist/src/cloud/relay/sync/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/sync/index.js.map +1 -0
- package/dist/src/cloud/relay/usage/index.d.ts.map +1 -0
- package/dist/src/cloud/relay/usage/index.js.map +1 -0
- package/dist/src/cloud/sponsors.d.ts.map +1 -0
- package/dist/src/cloud/sponsors.js.map +1 -0
- package/dist/src/cloud/types.d.ts.map +1 -0
- package/dist/src/cloud/types.js.map +1 -0
- package/dist/src/components/index.d.ts.map +1 -0
- package/dist/src/components/index.js.map +1 -0
- package/dist/src/core/actors.d.ts.map +1 -0
- package/dist/src/core/actors.js.map +1 -0
- package/dist/src/core/component/generator.d.ts.map +1 -0
- package/dist/{core → src/core}/component/generator.js +45 -3
- package/dist/src/core/component/generator.js.map +1 -0
- package/dist/src/core/engine.d.ts.map +1 -0
- package/dist/src/core/engine.js.map +1 -0
- package/dist/src/core/introspection.d.ts.map +1 -0
- package/dist/src/core/introspection.js.map +1 -0
- package/dist/src/core/logic/generator.d.ts.map +1 -0
- package/dist/{core → src/core}/logic/generator.js +35 -4
- package/dist/src/core/logic/generator.js.map +1 -0
- package/dist/src/core/pluresdb/adapter.d.ts +72 -0
- package/dist/src/core/pluresdb/adapter.d.ts.map +1 -0
- package/dist/src/core/pluresdb/adapter.js +73 -0
- package/dist/src/core/pluresdb/adapter.js.map +1 -0
- package/dist/src/core/pluresdb/generator.d.ts.map +1 -0
- package/dist/{core → src/core}/pluresdb/generator.js +33 -4
- package/dist/src/core/pluresdb/generator.js.map +1 -0
- package/dist/src/core/pluresdb/index.d.ts +15 -0
- package/dist/src/core/pluresdb/index.d.ts.map +1 -0
- package/dist/src/core/pluresdb/index.js +11 -0
- package/dist/src/core/pluresdb/index.js.map +1 -0
- package/dist/src/core/pluresdb/schema-registry.d.ts +104 -0
- package/dist/src/core/pluresdb/schema-registry.d.ts.map +1 -0
- package/dist/src/core/pluresdb/schema-registry.js +130 -0
- package/dist/src/core/pluresdb/schema-registry.js.map +1 -0
- package/dist/src/core/pluresdb/store.d.ts +199 -0
- package/dist/src/core/pluresdb/store.d.ts.map +1 -0
- package/dist/src/core/pluresdb/store.js +344 -0
- package/dist/src/core/pluresdb/store.js.map +1 -0
- package/dist/src/core/protocol.d.ts.map +1 -0
- package/dist/src/core/protocol.js.map +1 -0
- package/dist/src/core/rules.d.ts.map +1 -0
- package/dist/src/core/rules.js.map +1 -0
- package/dist/src/core/schema/loader.d.ts.map +1 -0
- package/dist/src/core/schema/loader.js.map +1 -0
- package/dist/src/core/schema/normalize.d.ts.map +1 -0
- package/dist/src/core/schema/normalize.js.map +1 -0
- package/dist/src/core/schema/types.d.ts.map +1 -0
- package/dist/src/core/schema/types.js.map +1 -0
- package/dist/src/dsl/index.d.ts.map +1 -0
- package/dist/src/dsl/index.js.map +1 -0
- package/dist/src/dsl.d.ts.map +1 -0
- package/dist/src/dsl.js.map +1 -0
- package/dist/src/examples/advanced-todo/index.d.ts.map +1 -0
- package/dist/src/examples/advanced-todo/index.js.map +1 -0
- package/dist/src/examples/auth-basic/index.d.ts.map +1 -0
- package/dist/src/examples/auth-basic/index.js.map +1 -0
- package/dist/src/examples/cart/index.d.ts.map +1 -0
- package/dist/src/examples/cart/index.js.map +1 -0
- package/dist/src/examples/hero-ecommerce/index.d.ts.map +1 -0
- package/dist/src/examples/hero-ecommerce/index.js.map +1 -0
- package/dist/src/examples/svelte-counter/index.d.ts.map +1 -0
- package/dist/src/examples/svelte-counter/index.js.map +1 -0
- package/dist/src/flows.d.ts.map +1 -0
- package/dist/src/flows.js.map +1 -0
- package/dist/{index.d.ts → src/index.d.ts} +12 -2
- package/dist/src/index.d.ts.map +1 -0
- package/dist/{index.js → src/index.js} +6 -1
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/code-canvas.d.ts +265 -0
- package/dist/src/integrations/code-canvas.d.ts.map +1 -0
- package/dist/src/integrations/code-canvas.js +451 -0
- package/dist/src/integrations/code-canvas.js.map +1 -0
- package/dist/src/integrations/pluresdb.d.ts +117 -0
- package/dist/src/integrations/pluresdb.d.ts.map +1 -0
- package/dist/src/integrations/pluresdb.js +117 -0
- package/dist/src/integrations/pluresdb.js.map +1 -0
- package/dist/src/integrations/state-docs.d.ts +191 -0
- package/dist/src/integrations/state-docs.d.ts.map +1 -0
- package/dist/src/integrations/state-docs.js +515 -0
- package/dist/src/integrations/state-docs.js.map +1 -0
- package/dist/src/integrations/svelte.d.ts.map +1 -0
- package/dist/src/integrations/svelte.js.map +1 -0
- package/dist/src/integrations/tauri.d.ts +360 -0
- package/dist/src/integrations/tauri.d.ts.map +1 -0
- package/dist/src/integrations/tauri.js +278 -0
- package/dist/src/integrations/tauri.js.map +1 -0
- package/dist/src/integrations/unum.d.ts +159 -0
- package/dist/src/integrations/unum.d.ts.map +1 -0
- package/dist/src/integrations/unum.js +240 -0
- package/dist/src/integrations/unum.js.map +1 -0
- package/dist/src/registry.d.ts.map +1 -0
- package/dist/src/registry.js.map +1 -0
- package/dist/{runtime → src/runtime}/terminal-adapter.d.ts +58 -7
- package/dist/src/runtime/terminal-adapter.d.ts.map +1 -0
- package/dist/src/runtime/terminal-adapter.js +237 -0
- package/dist/src/runtime/terminal-adapter.js.map +1 -0
- package/dist/src/step.d.ts.map +1 -0
- package/dist/src/step.js.map +1 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/{cloud → src}/types.js.map +1 -1
- package/dist/tools/cli/commands/index.d.ts +7 -0
- package/dist/tools/cli/commands/index.d.ts.map +1 -0
- package/dist/tools/cli/commands/index.js +7 -0
- package/dist/tools/cli/commands/index.js.map +1 -0
- package/dist/tools/cli/index.d.ts +8 -0
- package/dist/tools/cli/index.d.ts.map +1 -0
- package/dist/tools/cli/index.js +9 -0
- package/dist/tools/cli/index.js.map +1 -0
- package/dist/tools/watcher/index.d.ts +105 -0
- package/dist/tools/watcher/index.d.ts.map +1 -0
- package/dist/tools/watcher/index.js +213 -0
- package/dist/tools/watcher/index.js.map +1 -0
- package/dist/ui/canvas/canvas-projection.d.ts +78 -0
- package/dist/ui/canvas/canvas-projection.d.ts.map +1 -0
- package/dist/ui/canvas/canvas-projection.js +416 -0
- package/dist/ui/canvas/canvas-projection.js.map +1 -0
- package/dist/ui/canvas/canvas-state.d.ts +200 -0
- package/dist/ui/canvas/canvas-state.d.ts.map +1 -0
- package/dist/ui/canvas/canvas-state.js +464 -0
- package/dist/ui/canvas/canvas-state.js.map +1 -0
- package/dist/ui/canvas/components/index.d.ts +95 -0
- package/dist/ui/canvas/components/index.d.ts.map +1 -0
- package/dist/ui/canvas/components/index.js +19 -0
- package/dist/ui/canvas/components/index.js.map +1 -0
- package/dist/ui/canvas/index.d.ts +32 -0
- package/dist/ui/canvas/index.d.ts.map +1 -0
- package/dist/ui/canvas/index.js +32 -0
- package/dist/ui/canvas/index.js.map +1 -0
- package/dist/ui/svelte-generator/index.d.ts +9 -0
- package/dist/ui/svelte-generator/index.d.ts.map +1 -0
- package/dist/ui/svelte-generator/index.js +11 -0
- package/dist/ui/svelte-generator/index.js.map +1 -0
- package/dist/ui/svelte-generator/psf-generator.d.ts +128 -0
- package/dist/ui/svelte-generator/psf-generator.d.ts.map +1 -0
- package/dist/ui/svelte-generator/psf-generator.js +506 -0
- package/dist/ui/svelte-generator/psf-generator.js.map +1 -0
- package/docs/README.md +155 -0
- package/docs/core/building-extensions.md +553 -0
- package/docs/core/cli-usage.md +498 -0
- package/docs/core/code-canvas-sync.md +468 -0
- package/docs/core/logic-engine.md +566 -0
- package/docs/core/pluresdb-integration.md +646 -0
- package/docs/core/schema-model.md +414 -0
- package/docs/core/ui-generation.md +580 -0
- package/docs/core/what-is-praxis.md +240 -0
- package/docs/tutorials/README.md +84 -0
- package/docs/tutorials/ecommerce-cart.md +631 -0
- package/docs/tutorials/first-app.md +529 -0
- package/docs/tutorials/form-builder.md +620 -0
- package/docs/tutorials/todo-pluresdb.md +589 -0
- package/package.json +1 -1
- package/src/__tests__/canvas-components.test.ts +450 -0
- package/src/__tests__/cli-create.test.ts +178 -0
- package/src/__tests__/code-canvas-integration.test.ts +277 -0
- package/src/__tests__/docs-generator.test.ts +181 -0
- package/src/__tests__/generators.test.ts +3 -2
- package/src/__tests__/pluresdb.test.ts +457 -0
- package/src/__tests__/psf-schema-engine.test.ts +450 -0
- package/src/__tests__/state-docs-integration.test.ts +297 -0
- package/src/__tests__/tauri-integration.test.ts +298 -0
- package/src/__tests__/terminal-node.test.ts +1 -1
- package/src/__tests__/unum-integration.test.ts +142 -0
- package/src/cli/commands/build.ts +203 -0
- package/src/cli/commands/canvas.ts +246 -0
- package/src/cli/commands/create.ts +666 -0
- package/src/cli/commands/dev.ts +95 -0
- package/src/cli/commands/orchestrate.ts +212 -0
- package/src/cli/index.ts +48 -21
- package/src/core/component/generator.ts +45 -3
- package/src/core/logic/generator.ts +39 -4
- package/src/core/pluresdb/adapter.ts +117 -0
- package/src/core/pluresdb/generator.ts +33 -4
- package/src/core/pluresdb/index.ts +37 -0
- package/src/core/pluresdb/schema-registry.ts +162 -0
- package/src/core/pluresdb/store.ts +443 -0
- package/src/index.ts +109 -0
- package/src/integrations/code-canvas.ts +717 -0
- package/src/integrations/pluresdb.ts +140 -29
- package/src/integrations/state-docs.ts +710 -0
- package/src/integrations/tauri.ts +638 -0
- package/src/integrations/unum.ts +395 -0
- package/src/runtime/terminal-adapter.ts +178 -23
- package/dist/adapters/cli.d.ts.map +0 -1
- package/dist/adapters/cli.js.map +0 -1
- package/dist/cli/commands/auth.d.ts.map +0 -1
- package/dist/cli/commands/auth.js.map +0 -1
- package/dist/cli/commands/cloud.d.ts.map +0 -1
- package/dist/cli/commands/cloud.js.map +0 -1
- package/dist/cli/commands/generate.d.ts.map +0 -1
- package/dist/cli/commands/generate.js.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cloud/auth.d.ts.map +0 -1
- package/dist/cloud/auth.js.map +0 -1
- package/dist/cloud/billing.d.ts.map +0 -1
- package/dist/cloud/billing.js.map +0 -1
- package/dist/cloud/client.d.ts.map +0 -1
- package/dist/cloud/client.js.map +0 -1
- package/dist/cloud/index.d.ts.map +0 -1
- package/dist/cloud/index.js.map +0 -1
- package/dist/cloud/marketplace.d.ts.map +0 -1
- package/dist/cloud/marketplace.js.map +0 -1
- package/dist/cloud/provisioning.d.ts.map +0 -1
- package/dist/cloud/provisioning.js.map +0 -1
- package/dist/cloud/relay/endpoints.d.ts.map +0 -1
- package/dist/cloud/relay/endpoints.js.map +0 -1
- package/dist/cloud/relay/health/index.d.ts.map +0 -1
- package/dist/cloud/relay/health/index.js.map +0 -1
- package/dist/cloud/relay/stats/index.d.ts.map +0 -1
- package/dist/cloud/relay/stats/index.js.map +0 -1
- package/dist/cloud/relay/sync/index.d.ts.map +0 -1
- package/dist/cloud/relay/sync/index.js.map +0 -1
- package/dist/cloud/relay/usage/index.d.ts.map +0 -1
- package/dist/cloud/relay/usage/index.js.map +0 -1
- package/dist/cloud/sponsors.d.ts.map +0 -1
- package/dist/cloud/sponsors.js.map +0 -1
- package/dist/cloud/types.d.ts.map +0 -1
- package/dist/components/index.d.ts.map +0 -1
- package/dist/components/index.js.map +0 -1
- package/dist/core/actors.d.ts.map +0 -1
- package/dist/core/actors.js.map +0 -1
- package/dist/core/component/generator.d.ts.map +0 -1
- package/dist/core/component/generator.js.map +0 -1
- package/dist/core/engine.d.ts.map +0 -1
- package/dist/core/engine.js.map +0 -1
- package/dist/core/introspection.d.ts.map +0 -1
- package/dist/core/introspection.js.map +0 -1
- package/dist/core/logic/generator.d.ts.map +0 -1
- package/dist/core/logic/generator.js.map +0 -1
- package/dist/core/pluresdb/generator.d.ts.map +0 -1
- package/dist/core/pluresdb/generator.js.map +0 -1
- package/dist/core/protocol.d.ts.map +0 -1
- package/dist/core/protocol.js.map +0 -1
- package/dist/core/rules.d.ts.map +0 -1
- package/dist/core/rules.js.map +0 -1
- package/dist/core/schema/loader.d.ts.map +0 -1
- package/dist/core/schema/loader.js.map +0 -1
- package/dist/core/schema/normalize.d.ts.map +0 -1
- package/dist/core/schema/normalize.js.map +0 -1
- package/dist/core/schema/types.d.ts.map +0 -1
- package/dist/core/schema/types.js.map +0 -1
- package/dist/dsl/index.d.ts.map +0 -1
- package/dist/dsl/index.js.map +0 -1
- package/dist/dsl.d.ts.map +0 -1
- package/dist/dsl.js.map +0 -1
- package/dist/examples/advanced-todo/index.d.ts.map +0 -1
- package/dist/examples/advanced-todo/index.js.map +0 -1
- package/dist/examples/auth-basic/index.d.ts.map +0 -1
- package/dist/examples/auth-basic/index.js.map +0 -1
- package/dist/examples/cart/index.d.ts.map +0 -1
- package/dist/examples/cart/index.js.map +0 -1
- package/dist/examples/hero-ecommerce/index.d.ts.map +0 -1
- package/dist/examples/hero-ecommerce/index.js.map +0 -1
- package/dist/examples/svelte-counter/index.d.ts.map +0 -1
- package/dist/examples/svelte-counter/index.js.map +0 -1
- package/dist/flows.d.ts.map +0 -1
- package/dist/flows.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/integrations/pluresdb.d.ts +0 -56
- package/dist/integrations/pluresdb.d.ts.map +0 -1
- package/dist/integrations/pluresdb.js +0 -46
- package/dist/integrations/pluresdb.js.map +0 -1
- package/dist/integrations/svelte.d.ts.map +0 -1
- package/dist/integrations/svelte.js.map +0 -1
- package/dist/registry.d.ts.map +0 -1
- package/dist/registry.js.map +0 -1
- package/dist/runtime/terminal-adapter.d.ts.map +0 -1
- package/dist/runtime/terminal-adapter.js +0 -113
- package/dist/runtime/terminal-adapter.js.map +0 -1
- package/dist/step.d.ts.map +0 -1
- package/dist/step.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- /package/dist/{adapters → src/adapters}/cli.d.ts +0 -0
- /package/dist/{adapters → src/adapters}/cli.js +0 -0
- /package/dist/{cli → src/cli}/commands/auth.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/auth.js +0 -0
- /package/dist/{cli → src/cli}/commands/cloud.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/cloud.js +0 -0
- /package/dist/{cli → src/cli}/commands/generate.d.ts +0 -0
- /package/dist/{cli → src/cli}/commands/generate.js +0 -0
- /package/dist/{cli → src/cli}/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/auth.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/auth.js +0 -0
- /package/dist/{cloud → src/cloud}/billing.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/billing.js +0 -0
- /package/dist/{cloud → src/cloud}/client.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/client.js +0 -0
- /package/dist/{cloud → src/cloud}/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/index.js +0 -0
- /package/dist/{cloud → src/cloud}/marketplace.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/marketplace.js +0 -0
- /package/dist/{cloud → src/cloud}/provisioning.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/provisioning.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/endpoints.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/endpoints.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/health/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/health/index.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/stats/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/stats/index.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/sync/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/sync/index.js +0 -0
- /package/dist/{cloud → src/cloud}/relay/usage/index.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/relay/usage/index.js +0 -0
- /package/dist/{cloud → src/cloud}/sponsors.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/sponsors.js +0 -0
- /package/dist/{cloud → src/cloud}/types.d.ts +0 -0
- /package/dist/{cloud → src/cloud}/types.js +0 -0
- /package/dist/{components → src/components}/index.d.ts +0 -0
- /package/dist/{components → src/components}/index.js +0 -0
- /package/dist/{core → src/core}/actors.d.ts +0 -0
- /package/dist/{core → src/core}/actors.js +0 -0
- /package/dist/{core → src/core}/component/generator.d.ts +0 -0
- /package/dist/{core → src/core}/engine.d.ts +0 -0
- /package/dist/{core → src/core}/engine.js +0 -0
- /package/dist/{core → src/core}/introspection.d.ts +0 -0
- /package/dist/{core → src/core}/introspection.js +0 -0
- /package/dist/{core → src/core}/logic/generator.d.ts +0 -0
- /package/dist/{core → src/core}/pluresdb/generator.d.ts +0 -0
- /package/dist/{core → src/core}/protocol.d.ts +0 -0
- /package/dist/{core → src/core}/protocol.js +0 -0
- /package/dist/{core → src/core}/rules.d.ts +0 -0
- /package/dist/{core → src/core}/rules.js +0 -0
- /package/dist/{core → src/core}/schema/loader.d.ts +0 -0
- /package/dist/{core → src/core}/schema/loader.js +0 -0
- /package/dist/{core → src/core}/schema/normalize.d.ts +0 -0
- /package/dist/{core → src/core}/schema/normalize.js +0 -0
- /package/dist/{core → src/core}/schema/types.d.ts +0 -0
- /package/dist/{core → src/core}/schema/types.js +0 -0
- /package/dist/{dsl → src/dsl}/index.d.ts +0 -0
- /package/dist/{dsl → src/dsl}/index.js +0 -0
- /package/dist/{dsl.d.ts → src/dsl.d.ts} +0 -0
- /package/dist/{dsl.js → src/dsl.js} +0 -0
- /package/dist/{examples → src/examples}/advanced-todo/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/advanced-todo/index.js +0 -0
- /package/dist/{examples → src/examples}/auth-basic/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/auth-basic/index.js +0 -0
- /package/dist/{examples → src/examples}/cart/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/cart/index.js +0 -0
- /package/dist/{examples → src/examples}/hero-ecommerce/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/hero-ecommerce/index.js +0 -0
- /package/dist/{examples → src/examples}/svelte-counter/index.d.ts +0 -0
- /package/dist/{examples → src/examples}/svelte-counter/index.js +0 -0
- /package/dist/{flows.d.ts → src/flows.d.ts} +0 -0
- /package/dist/{flows.js → src/flows.js} +0 -0
- /package/dist/{integrations → src/integrations}/svelte.d.ts +0 -0
- /package/dist/{integrations → src/integrations}/svelte.js +0 -0
- /package/dist/{registry.d.ts → src/registry.d.ts} +0 -0
- /package/dist/{registry.js → src/registry.js} +0 -0
- /package/dist/{step.d.ts → src/step.d.ts} +0 -0
- /package/dist/{step.js → src/step.js} +0 -0
- /package/dist/{types.d.ts → src/types.d.ts} +0 -0
- /package/dist/{types.js → src/types.js} +0 -0
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Praxis Schema Registry for PluresDB
|
|
3
|
+
*
|
|
4
|
+
* Registers Praxis schema definitions in PluresDB for type-safe storage
|
|
5
|
+
* and cross-agent schema discovery.
|
|
6
|
+
*/
|
|
7
|
+
import { PRAXIS_PATHS } from "./store.js";
|
|
8
|
+
/**
|
|
9
|
+
* Get the path for a schema in PluresDB
|
|
10
|
+
* @param schemaName The schema name
|
|
11
|
+
*/
|
|
12
|
+
export function getSchemaPath(schemaName) {
|
|
13
|
+
return `${PRAXIS_PATHS.SCHEMAS}/${schemaName}`;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* PraxisSchemaRegistry
|
|
17
|
+
*
|
|
18
|
+
* Manages schema definitions in PluresDB.
|
|
19
|
+
* Schemas are stored under `/_praxis/schemas/<schemaName>`
|
|
20
|
+
*/
|
|
21
|
+
export class PraxisSchemaRegistry {
|
|
22
|
+
db;
|
|
23
|
+
constructor(db) {
|
|
24
|
+
this.db = db;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Register a schema in PluresDB
|
|
28
|
+
*
|
|
29
|
+
* @param schema The schema to register
|
|
30
|
+
*/
|
|
31
|
+
async register(schema) {
|
|
32
|
+
const path = getSchemaPath(schema.name);
|
|
33
|
+
const storedSchema = {
|
|
34
|
+
schema,
|
|
35
|
+
registeredAt: Date.now(),
|
|
36
|
+
version: schema.version,
|
|
37
|
+
};
|
|
38
|
+
await this.db.set(path, storedSchema);
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Get a schema by name
|
|
42
|
+
*
|
|
43
|
+
* @param schemaName The schema name
|
|
44
|
+
* @returns The stored schema or undefined if not found
|
|
45
|
+
*/
|
|
46
|
+
async get(schemaName) {
|
|
47
|
+
const path = getSchemaPath(schemaName);
|
|
48
|
+
return this.db.get(path);
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Check if a schema is registered
|
|
52
|
+
*
|
|
53
|
+
* @param schemaName The schema name
|
|
54
|
+
* @returns True if the schema exists
|
|
55
|
+
*/
|
|
56
|
+
async exists(schemaName) {
|
|
57
|
+
const stored = await this.get(schemaName);
|
|
58
|
+
return stored !== undefined;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Update a schema (replaces existing)
|
|
62
|
+
*
|
|
63
|
+
* @param schema The updated schema
|
|
64
|
+
*/
|
|
65
|
+
async update(schema) {
|
|
66
|
+
await this.register(schema);
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* List all registered schema names
|
|
70
|
+
*
|
|
71
|
+
* Implementation note: This method uses an index stored at `/_praxis/schemas/_index`.
|
|
72
|
+
* When using InMemoryPraxisDB, schemas must be registered using `registerWithIndex()`
|
|
73
|
+
* for them to appear in this listing. When using a full PluresDB implementation,
|
|
74
|
+
* native listing capabilities should be used instead.
|
|
75
|
+
*
|
|
76
|
+
* @returns Array of registered schema names
|
|
77
|
+
*/
|
|
78
|
+
async list() {
|
|
79
|
+
const indexPath = `${PRAXIS_PATHS.SCHEMAS}/_index`;
|
|
80
|
+
const index = await this.db.get(indexPath);
|
|
81
|
+
return index ?? [];
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Register a schema and update the index
|
|
85
|
+
*
|
|
86
|
+
* @param schema The schema to register
|
|
87
|
+
*/
|
|
88
|
+
async registerWithIndex(schema) {
|
|
89
|
+
// Register the schema
|
|
90
|
+
await this.register(schema);
|
|
91
|
+
// Update the index
|
|
92
|
+
const indexPath = `${PRAXIS_PATHS.SCHEMAS}/_index`;
|
|
93
|
+
const existingIndex = await this.db.get(indexPath) ?? [];
|
|
94
|
+
if (!existingIndex.includes(schema.name)) {
|
|
95
|
+
await this.db.set(indexPath, [...existingIndex, schema.name]);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Register a schema in PluresDB
|
|
101
|
+
*
|
|
102
|
+
* Convenience function for one-off schema registration.
|
|
103
|
+
*
|
|
104
|
+
* @param db The PraxisDB instance
|
|
105
|
+
* @param schema The schema to register
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* const db = createInMemoryDB();
|
|
110
|
+
* await registerSchema(db, {
|
|
111
|
+
* version: "1.0.0",
|
|
112
|
+
* name: "MyApp",
|
|
113
|
+
* description: "My application schema"
|
|
114
|
+
* });
|
|
115
|
+
* ```
|
|
116
|
+
*/
|
|
117
|
+
export async function registerSchema(db, schema) {
|
|
118
|
+
const registry = new PraxisSchemaRegistry(db);
|
|
119
|
+
await registry.registerWithIndex(schema);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Create a PraxisSchemaRegistry instance
|
|
123
|
+
*
|
|
124
|
+
* @param db The PraxisDB instance
|
|
125
|
+
* @returns PraxisSchemaRegistry instance
|
|
126
|
+
*/
|
|
127
|
+
export function createSchemaRegistry(db) {
|
|
128
|
+
return new PraxisSchemaRegistry(db);
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=schema-registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema-registry.js","sourceRoot":"","sources":["../../../../src/core/pluresdb/schema-registry.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAE1C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,UAAkB;IAC9C,OAAO,GAAG,YAAY,CAAC,OAAO,IAAI,UAAU,EAAE,CAAC;AACjD,CAAC;AAcD;;;;;GAKG;AACH,MAAM,OAAO,oBAAoB;IACvB,EAAE,CAAW;IAErB,YAAY,EAAY;QACtB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ,CAAC,MAAoB;QACjC,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAExC,MAAM,YAAY,GAAiB;YACjC,MAAM;YACN,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE;YACxB,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC;QAEF,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACxC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,GAAG,CAAC,UAAkB;QAC1B,MAAM,IAAI,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC,EAAE,CAAC,GAAG,CAAe,IAAI,CAAC,CAAC;IACzC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,MAAM,CAAC,UAAkB;QAC7B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1C,OAAO,MAAM,KAAK,SAAS,CAAC;IAC9B,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,MAAM,CAAC,MAAoB;QAC/B,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IAED;;;;;;;;;OASG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,SAAS,GAAG,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC;QACnD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAW,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,IAAI,EAAE,CAAC;IACrB,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,iBAAiB,CAAC,MAAoB;QAC1C,sBAAsB;QACtB,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAE5B,mBAAmB;QACnB,MAAM,SAAS,GAAG,GAAG,YAAY,CAAC,OAAO,SAAS,CAAC;QACnD,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAW,SAAS,CAAC,IAAI,EAAE,CAAC;QAEnE,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,GAAG,aAAa,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,EAAY,EACZ,MAAoB;IAEpB,MAAM,QAAQ,GAAG,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAC9C,MAAM,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAY;IAC/C,OAAO,IAAI,oBAAoB,CAAC,EAAE,CAAC,CAAC;AACtC,CAAC"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PraxisDB Store
|
|
3
|
+
*
|
|
4
|
+
* Connects Praxis Facts, Events, Rules, and Constraints to PluresDB.
|
|
5
|
+
* Provides CRDT-backed storage for facts and append-only event streams.
|
|
6
|
+
*/
|
|
7
|
+
import type { PraxisDB, UnsubscribeFn } from "./adapter.js";
|
|
8
|
+
import type { PraxisRegistry } from "../rules.js";
|
|
9
|
+
import type { PraxisFact, PraxisEvent } from "../protocol.js";
|
|
10
|
+
/**
|
|
11
|
+
* Key paths for Praxis data in PluresDB
|
|
12
|
+
*/
|
|
13
|
+
export declare const PRAXIS_PATHS: {
|
|
14
|
+
/** Base path for all Praxis data */
|
|
15
|
+
readonly BASE: "/_praxis";
|
|
16
|
+
/** Path for facts storage */
|
|
17
|
+
readonly FACTS: "/_praxis/facts";
|
|
18
|
+
/** Path for events storage */
|
|
19
|
+
readonly EVENTS: "/_praxis/events";
|
|
20
|
+
/** Path for schema registry */
|
|
21
|
+
readonly SCHEMAS: "/_praxis/schemas";
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Generate a fact key path
|
|
25
|
+
* @param factTag The fact type tag
|
|
26
|
+
* @param id Optional unique identifier for the fact instance
|
|
27
|
+
*/
|
|
28
|
+
export declare function getFactPath(factTag: string, id?: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Generate an event stream key path
|
|
31
|
+
* @param eventTag The event type tag
|
|
32
|
+
*/
|
|
33
|
+
export declare function getEventPath(eventTag: string): string;
|
|
34
|
+
/**
|
|
35
|
+
* Generate a unique ID for facts or events
|
|
36
|
+
* Uses timestamp and random string for uniqueness
|
|
37
|
+
*/
|
|
38
|
+
export declare function generateId(): string;
|
|
39
|
+
/**
|
|
40
|
+
* Event stream entry with timestamp
|
|
41
|
+
*/
|
|
42
|
+
export interface EventStreamEntry {
|
|
43
|
+
/** The event data */
|
|
44
|
+
event: PraxisEvent;
|
|
45
|
+
/** Timestamp when the event was appended */
|
|
46
|
+
timestamp: number;
|
|
47
|
+
/** Optional sequence number */
|
|
48
|
+
sequence?: number;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Options for creating a PraxisDBStore
|
|
52
|
+
*/
|
|
53
|
+
export interface PraxisDBStoreOptions<TContext = unknown> {
|
|
54
|
+
/** The PraxisDB instance to use */
|
|
55
|
+
db: PraxisDB;
|
|
56
|
+
/** The PraxisRegistry for rules and constraints */
|
|
57
|
+
registry: PraxisRegistry<TContext>;
|
|
58
|
+
/** Initial context for rule evaluation */
|
|
59
|
+
initialContext?: TContext;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* PraxisDBStore
|
|
63
|
+
*
|
|
64
|
+
* Manages persistence and reactive updates for Praxis state in PluresDB.
|
|
65
|
+
*
|
|
66
|
+
* - Facts are stored as CRDT-backed documents under `/_praxis/facts/<factTag>/<id>`
|
|
67
|
+
* - Events are stored as append-only streams under `/_praxis/events/<eventTag>`
|
|
68
|
+
* - Rules are triggered automatically when watched keys change
|
|
69
|
+
* - Constraints are run before writing mutated state
|
|
70
|
+
*/
|
|
71
|
+
/**
|
|
72
|
+
* Error handler callback for rule execution errors
|
|
73
|
+
*/
|
|
74
|
+
export type RuleErrorHandler = (ruleId: string, error: unknown) => void;
|
|
75
|
+
export declare class PraxisDBStore<TContext = unknown> {
|
|
76
|
+
private db;
|
|
77
|
+
private registry;
|
|
78
|
+
private context;
|
|
79
|
+
private subscriptions;
|
|
80
|
+
private factWatchers;
|
|
81
|
+
private onRuleError;
|
|
82
|
+
constructor(options: PraxisDBStoreOptions<TContext> & {
|
|
83
|
+
onRuleError?: RuleErrorHandler;
|
|
84
|
+
});
|
|
85
|
+
/**
|
|
86
|
+
* Store a fact in PluresDB
|
|
87
|
+
*
|
|
88
|
+
* Facts are stored under `/_praxis/facts/<factTag>/<id>`
|
|
89
|
+
* If no id is provided in the payload, a timestamp-based id is used.
|
|
90
|
+
*
|
|
91
|
+
* @param fact The fact to store
|
|
92
|
+
* @returns Promise that resolves when the fact is stored
|
|
93
|
+
*/
|
|
94
|
+
storeFact(fact: PraxisFact): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Store multiple facts in PluresDB
|
|
97
|
+
*
|
|
98
|
+
* @param facts The facts to store
|
|
99
|
+
*/
|
|
100
|
+
storeFacts(facts: PraxisFact[]): Promise<void>;
|
|
101
|
+
/**
|
|
102
|
+
* Internal method to persist a fact without constraint checking
|
|
103
|
+
* Used by both storeFact and derived fact storage
|
|
104
|
+
*/
|
|
105
|
+
private persistFact;
|
|
106
|
+
/**
|
|
107
|
+
* Get a fact by tag and id
|
|
108
|
+
*
|
|
109
|
+
* @param factTag The fact type tag
|
|
110
|
+
* @param id The fact id
|
|
111
|
+
* @returns The fact or undefined if not found
|
|
112
|
+
*/
|
|
113
|
+
getFact(factTag: string, id: string): Promise<PraxisFact | undefined>;
|
|
114
|
+
/**
|
|
115
|
+
* Append an event to the event stream
|
|
116
|
+
*
|
|
117
|
+
* Events are stored as append-only streams under `/_praxis/events/<eventTag>`
|
|
118
|
+
*
|
|
119
|
+
* @param event The event to append
|
|
120
|
+
*/
|
|
121
|
+
appendEvent(event: PraxisEvent): Promise<void>;
|
|
122
|
+
/**
|
|
123
|
+
* Append multiple events to their respective streams
|
|
124
|
+
*
|
|
125
|
+
* @param events The events to append
|
|
126
|
+
*/
|
|
127
|
+
appendEvents(events: PraxisEvent[]): Promise<void>;
|
|
128
|
+
/**
|
|
129
|
+
* Get events from a stream
|
|
130
|
+
*
|
|
131
|
+
* @param eventTag The event type tag
|
|
132
|
+
* @param options Query options
|
|
133
|
+
* @returns Array of event stream entries
|
|
134
|
+
*/
|
|
135
|
+
getEvents(eventTag: string, options?: {
|
|
136
|
+
since?: number;
|
|
137
|
+
limit?: number;
|
|
138
|
+
}): Promise<EventStreamEntry[]>;
|
|
139
|
+
/**
|
|
140
|
+
* Watch a fact path for changes
|
|
141
|
+
*
|
|
142
|
+
* @param factTag The fact type tag to watch
|
|
143
|
+
* @param callback Called when facts of this type change
|
|
144
|
+
* @returns Unsubscribe function
|
|
145
|
+
*/
|
|
146
|
+
watchFacts(factTag: string, callback: (facts: PraxisFact[]) => void): UnsubscribeFn;
|
|
147
|
+
/**
|
|
148
|
+
* Check constraints against the current state with new facts
|
|
149
|
+
*/
|
|
150
|
+
private checkConstraints;
|
|
151
|
+
/**
|
|
152
|
+
* Trigger rules when new facts are added
|
|
153
|
+
*
|
|
154
|
+
* This method is called after facts are stored. It can be extended
|
|
155
|
+
* for derived fact computation where rules generate new facts based
|
|
156
|
+
* on existing facts. Currently implemented as a hook point for future
|
|
157
|
+
* enhancements.
|
|
158
|
+
*
|
|
159
|
+
* @param _newFacts The newly stored facts (unused in current implementation)
|
|
160
|
+
*/
|
|
161
|
+
private triggerRules;
|
|
162
|
+
/**
|
|
163
|
+
* Trigger rules when events are appended
|
|
164
|
+
*/
|
|
165
|
+
private triggerRulesForEvents;
|
|
166
|
+
/**
|
|
167
|
+
* Update the context
|
|
168
|
+
*/
|
|
169
|
+
updateContext(context: TContext): void;
|
|
170
|
+
/**
|
|
171
|
+
* Get the current context
|
|
172
|
+
*/
|
|
173
|
+
getContext(): TContext;
|
|
174
|
+
/**
|
|
175
|
+
* Dispose of all subscriptions
|
|
176
|
+
*/
|
|
177
|
+
dispose(): void;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Create a new PraxisDBStore
|
|
181
|
+
*
|
|
182
|
+
* @param db The PraxisDB instance to use
|
|
183
|
+
* @param registry The PraxisRegistry for rules and constraints
|
|
184
|
+
* @param initialContext Optional initial context
|
|
185
|
+
* @param onRuleError Optional error handler for rule execution errors
|
|
186
|
+
* @returns PraxisDBStore instance
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```typescript
|
|
190
|
+
* const db = createInMemoryDB();
|
|
191
|
+
* const registry = new PraxisRegistry();
|
|
192
|
+
* const store = createPraxisDBStore(db, registry);
|
|
193
|
+
*
|
|
194
|
+
* await store.storeFact({ tag: "UserLoggedIn", payload: { userId: "alice" } });
|
|
195
|
+
* await store.appendEvent({ tag: "LOGIN", payload: { username: "alice" } });
|
|
196
|
+
* ```
|
|
197
|
+
*/
|
|
198
|
+
export declare function createPraxisDBStore<TContext = unknown>(db: PraxisDB, registry: PraxisRegistry<TContext>, initialContext?: TContext, onRuleError?: RuleErrorHandler): PraxisDBStore<TContext>;
|
|
199
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../../../src/core/pluresdb/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PraxisDB Store
|
|
3
|
+
*
|
|
4
|
+
* Connects Praxis Facts, Events, Rules, and Constraints to PluresDB.
|
|
5
|
+
* Provides CRDT-backed storage for facts and append-only event streams.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Key paths for Praxis data in PluresDB
|
|
9
|
+
*/
|
|
10
|
+
export const PRAXIS_PATHS = {
|
|
11
|
+
/** Base path for all Praxis data */
|
|
12
|
+
BASE: "/_praxis",
|
|
13
|
+
/** Path for facts storage */
|
|
14
|
+
FACTS: "/_praxis/facts",
|
|
15
|
+
/** Path for events storage */
|
|
16
|
+
EVENTS: "/_praxis/events",
|
|
17
|
+
/** Path for schema registry */
|
|
18
|
+
SCHEMAS: "/_praxis/schemas",
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* Generate a fact key path
|
|
22
|
+
* @param factTag The fact type tag
|
|
23
|
+
* @param id Optional unique identifier for the fact instance
|
|
24
|
+
*/
|
|
25
|
+
export function getFactPath(factTag, id) {
|
|
26
|
+
if (id) {
|
|
27
|
+
return `${PRAXIS_PATHS.FACTS}/${factTag}/${id}`;
|
|
28
|
+
}
|
|
29
|
+
return `${PRAXIS_PATHS.FACTS}/${factTag}`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Generate an event stream key path
|
|
33
|
+
* @param eventTag The event type tag
|
|
34
|
+
*/
|
|
35
|
+
export function getEventPath(eventTag) {
|
|
36
|
+
return `${PRAXIS_PATHS.EVENTS}/${eventTag}`;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Generate a unique ID for facts or events
|
|
40
|
+
* Uses timestamp and random string for uniqueness
|
|
41
|
+
*/
|
|
42
|
+
export function generateId() {
|
|
43
|
+
return `${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Default error handler that logs to console
|
|
47
|
+
*/
|
|
48
|
+
const defaultErrorHandler = (ruleId, error) => {
|
|
49
|
+
// Default behavior: silent in production, can be overridden
|
|
50
|
+
if (typeof process !== "undefined" && process.env?.NODE_ENV === "development") {
|
|
51
|
+
console.error(`Error executing rule "${ruleId}":`, error);
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
export class PraxisDBStore {
|
|
55
|
+
db;
|
|
56
|
+
registry;
|
|
57
|
+
context;
|
|
58
|
+
subscriptions = [];
|
|
59
|
+
factWatchers = new Map();
|
|
60
|
+
onRuleError;
|
|
61
|
+
constructor(options) {
|
|
62
|
+
this.db = options.db;
|
|
63
|
+
this.registry = options.registry;
|
|
64
|
+
this.context = options.initialContext ?? {};
|
|
65
|
+
this.onRuleError = options.onRuleError ?? defaultErrorHandler;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Store a fact in PluresDB
|
|
69
|
+
*
|
|
70
|
+
* Facts are stored under `/_praxis/facts/<factTag>/<id>`
|
|
71
|
+
* If no id is provided in the payload, a timestamp-based id is used.
|
|
72
|
+
*
|
|
73
|
+
* @param fact The fact to store
|
|
74
|
+
* @returns Promise that resolves when the fact is stored
|
|
75
|
+
*/
|
|
76
|
+
async storeFact(fact) {
|
|
77
|
+
// Run constraints before storing
|
|
78
|
+
const constraintResult = await this.checkConstraints([fact]);
|
|
79
|
+
if (!constraintResult.valid) {
|
|
80
|
+
throw new Error(`Constraint violation: ${constraintResult.errors.join(", ")}`);
|
|
81
|
+
}
|
|
82
|
+
await this.persistFact(fact);
|
|
83
|
+
// Trigger rule evaluation - facts stored directly may trigger derived computations
|
|
84
|
+
await this.triggerRules([fact]);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Store multiple facts in PluresDB
|
|
88
|
+
*
|
|
89
|
+
* @param facts The facts to store
|
|
90
|
+
*/
|
|
91
|
+
async storeFacts(facts) {
|
|
92
|
+
// Run constraints before storing
|
|
93
|
+
const constraintResult = await this.checkConstraints(facts);
|
|
94
|
+
if (!constraintResult.valid) {
|
|
95
|
+
throw new Error(`Constraint violation: ${constraintResult.errors.join(", ")}`);
|
|
96
|
+
}
|
|
97
|
+
for (const fact of facts) {
|
|
98
|
+
await this.persistFact(fact);
|
|
99
|
+
}
|
|
100
|
+
// Trigger rule evaluation
|
|
101
|
+
await this.triggerRules(facts);
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Internal method to persist a fact without constraint checking
|
|
105
|
+
* Used by both storeFact and derived fact storage
|
|
106
|
+
*/
|
|
107
|
+
async persistFact(fact) {
|
|
108
|
+
const payload = fact.payload;
|
|
109
|
+
const id = payload?.id ?? generateId();
|
|
110
|
+
const path = getFactPath(fact.tag, id);
|
|
111
|
+
await this.db.set(path, fact);
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Get a fact by tag and id
|
|
115
|
+
*
|
|
116
|
+
* @param factTag The fact type tag
|
|
117
|
+
* @param id The fact id
|
|
118
|
+
* @returns The fact or undefined if not found
|
|
119
|
+
*/
|
|
120
|
+
async getFact(factTag, id) {
|
|
121
|
+
const path = getFactPath(factTag, id);
|
|
122
|
+
return this.db.get(path);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Append an event to the event stream
|
|
126
|
+
*
|
|
127
|
+
* Events are stored as append-only streams under `/_praxis/events/<eventTag>`
|
|
128
|
+
*
|
|
129
|
+
* @param event The event to append
|
|
130
|
+
*/
|
|
131
|
+
async appendEvent(event) {
|
|
132
|
+
const path = getEventPath(event.tag);
|
|
133
|
+
// Get existing events for this tag
|
|
134
|
+
const existingEvents = await this.db.get(path) ?? [];
|
|
135
|
+
// Create new entry
|
|
136
|
+
const entry = {
|
|
137
|
+
event,
|
|
138
|
+
timestamp: Date.now(),
|
|
139
|
+
sequence: existingEvents.length,
|
|
140
|
+
};
|
|
141
|
+
// Append and store
|
|
142
|
+
const newEvents = [...existingEvents, entry];
|
|
143
|
+
await this.db.set(path, newEvents);
|
|
144
|
+
// Trigger rules with this event
|
|
145
|
+
await this.triggerRulesForEvents([event]);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Append multiple events to their respective streams
|
|
149
|
+
*
|
|
150
|
+
* @param events The events to append
|
|
151
|
+
*/
|
|
152
|
+
async appendEvents(events) {
|
|
153
|
+
// Group events by tag for efficient storage
|
|
154
|
+
const eventsByTag = new Map();
|
|
155
|
+
for (const event of events) {
|
|
156
|
+
const existing = eventsByTag.get(event.tag) ?? [];
|
|
157
|
+
eventsByTag.set(event.tag, [...existing, event]);
|
|
158
|
+
}
|
|
159
|
+
// Append each group
|
|
160
|
+
for (const [tag, tagEvents] of eventsByTag) {
|
|
161
|
+
const path = getEventPath(tag);
|
|
162
|
+
const existingEvents = await this.db.get(path) ?? [];
|
|
163
|
+
let sequence = existingEvents.length;
|
|
164
|
+
const newEntries = tagEvents.map(event => ({
|
|
165
|
+
event,
|
|
166
|
+
timestamp: Date.now(),
|
|
167
|
+
sequence: sequence++,
|
|
168
|
+
}));
|
|
169
|
+
await this.db.set(path, [...existingEvents, ...newEntries]);
|
|
170
|
+
}
|
|
171
|
+
// Trigger rules
|
|
172
|
+
await this.triggerRulesForEvents(events);
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Get events from a stream
|
|
176
|
+
*
|
|
177
|
+
* @param eventTag The event type tag
|
|
178
|
+
* @param options Query options
|
|
179
|
+
* @returns Array of event stream entries
|
|
180
|
+
*/
|
|
181
|
+
async getEvents(eventTag, options) {
|
|
182
|
+
const path = getEventPath(eventTag);
|
|
183
|
+
const events = await this.db.get(path) ?? [];
|
|
184
|
+
let result = events;
|
|
185
|
+
if (options?.since !== undefined) {
|
|
186
|
+
const sinceTimestamp = options.since;
|
|
187
|
+
result = result.filter(e => e.timestamp > sinceTimestamp);
|
|
188
|
+
}
|
|
189
|
+
if (options?.limit !== undefined) {
|
|
190
|
+
result = result.slice(-options.limit);
|
|
191
|
+
}
|
|
192
|
+
return result;
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Watch a fact path for changes
|
|
196
|
+
*
|
|
197
|
+
* @param factTag The fact type tag to watch
|
|
198
|
+
* @param callback Called when facts of this type change
|
|
199
|
+
* @returns Unsubscribe function
|
|
200
|
+
*/
|
|
201
|
+
watchFacts(factTag, callback) {
|
|
202
|
+
const path = getFactPath(factTag);
|
|
203
|
+
// Register the callback
|
|
204
|
+
if (!this.factWatchers.has(factTag)) {
|
|
205
|
+
this.factWatchers.set(factTag, new Set());
|
|
206
|
+
}
|
|
207
|
+
const watchers = this.factWatchers.get(factTag);
|
|
208
|
+
if (watchers) {
|
|
209
|
+
watchers.add(callback);
|
|
210
|
+
}
|
|
211
|
+
// Watch the path in the DB
|
|
212
|
+
const unsubscribe = this.db.watch(path, (fact) => {
|
|
213
|
+
callback([fact]);
|
|
214
|
+
});
|
|
215
|
+
this.subscriptions.push(unsubscribe);
|
|
216
|
+
return () => {
|
|
217
|
+
unsubscribe();
|
|
218
|
+
this.factWatchers.get(factTag)?.delete(callback);
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Check constraints against the current state with new facts
|
|
223
|
+
*/
|
|
224
|
+
async checkConstraints(newFacts) {
|
|
225
|
+
const constraints = this.registry.getAllConstraints();
|
|
226
|
+
const errors = [];
|
|
227
|
+
// Build a minimal state for constraint checking
|
|
228
|
+
const state = {
|
|
229
|
+
context: this.context,
|
|
230
|
+
facts: newFacts,
|
|
231
|
+
meta: {},
|
|
232
|
+
};
|
|
233
|
+
for (const constraint of constraints) {
|
|
234
|
+
try {
|
|
235
|
+
const result = constraint.impl(state);
|
|
236
|
+
if (result === false) {
|
|
237
|
+
errors.push(`Constraint "${constraint.id}" violated`);
|
|
238
|
+
}
|
|
239
|
+
else if (typeof result === "string") {
|
|
240
|
+
errors.push(result);
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
catch (error) {
|
|
244
|
+
errors.push(`Error checking constraint "${constraint.id}": ${error instanceof Error ? error.message : String(error)}`);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return {
|
|
248
|
+
valid: errors.length === 0,
|
|
249
|
+
errors,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* Trigger rules when new facts are added
|
|
254
|
+
*
|
|
255
|
+
* This method is called after facts are stored. It can be extended
|
|
256
|
+
* for derived fact computation where rules generate new facts based
|
|
257
|
+
* on existing facts. Currently implemented as a hook point for future
|
|
258
|
+
* enhancements.
|
|
259
|
+
*
|
|
260
|
+
* @param _newFacts The newly stored facts (unused in current implementation)
|
|
261
|
+
*/
|
|
262
|
+
async triggerRules(_newFacts) {
|
|
263
|
+
// Rules are typically triggered by events, not facts
|
|
264
|
+
// This method serves as a hook for derived fact computation
|
|
265
|
+
// which can be implemented by subclasses or future enhancements
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Trigger rules when events are appended
|
|
269
|
+
*/
|
|
270
|
+
async triggerRulesForEvents(events) {
|
|
271
|
+
const rules = this.registry.getAllRules();
|
|
272
|
+
// Build state for rule evaluation
|
|
273
|
+
const state = {
|
|
274
|
+
context: this.context,
|
|
275
|
+
facts: [],
|
|
276
|
+
meta: {},
|
|
277
|
+
};
|
|
278
|
+
// Execute each rule
|
|
279
|
+
const derivedFacts = [];
|
|
280
|
+
for (const rule of rules) {
|
|
281
|
+
try {
|
|
282
|
+
const facts = rule.impl(state, events);
|
|
283
|
+
derivedFacts.push(...facts);
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
this.onRuleError(rule.id, error);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
// Store derived facts (without re-triggering rules to avoid infinite loops)
|
|
290
|
+
if (derivedFacts.length > 0) {
|
|
291
|
+
const constraintResult = await this.checkConstraints(derivedFacts);
|
|
292
|
+
if (constraintResult.valid) {
|
|
293
|
+
for (const fact of derivedFacts) {
|
|
294
|
+
await this.persistFact(fact);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
/**
|
|
300
|
+
* Update the context
|
|
301
|
+
*/
|
|
302
|
+
updateContext(context) {
|
|
303
|
+
this.context = context;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Get the current context
|
|
307
|
+
*/
|
|
308
|
+
getContext() {
|
|
309
|
+
return this.context;
|
|
310
|
+
}
|
|
311
|
+
/**
|
|
312
|
+
* Dispose of all subscriptions
|
|
313
|
+
*/
|
|
314
|
+
dispose() {
|
|
315
|
+
for (const unsubscribe of this.subscriptions) {
|
|
316
|
+
unsubscribe();
|
|
317
|
+
}
|
|
318
|
+
this.subscriptions = [];
|
|
319
|
+
this.factWatchers.clear();
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
/**
|
|
323
|
+
* Create a new PraxisDBStore
|
|
324
|
+
*
|
|
325
|
+
* @param db The PraxisDB instance to use
|
|
326
|
+
* @param registry The PraxisRegistry for rules and constraints
|
|
327
|
+
* @param initialContext Optional initial context
|
|
328
|
+
* @param onRuleError Optional error handler for rule execution errors
|
|
329
|
+
* @returns PraxisDBStore instance
|
|
330
|
+
*
|
|
331
|
+
* @example
|
|
332
|
+
* ```typescript
|
|
333
|
+
* const db = createInMemoryDB();
|
|
334
|
+
* const registry = new PraxisRegistry();
|
|
335
|
+
* const store = createPraxisDBStore(db, registry);
|
|
336
|
+
*
|
|
337
|
+
* await store.storeFact({ tag: "UserLoggedIn", payload: { userId: "alice" } });
|
|
338
|
+
* await store.appendEvent({ tag: "LOGIN", payload: { username: "alice" } });
|
|
339
|
+
* ```
|
|
340
|
+
*/
|
|
341
|
+
export function createPraxisDBStore(db, registry, initialContext, onRuleError) {
|
|
342
|
+
return new PraxisDBStore({ db, registry, initialContext, onRuleError });
|
|
343
|
+
}
|
|
344
|
+
//# sourceMappingURL=store.js.map
|