@plumbus/core 0.7.1 → 0.8.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +49 -0
- package/README.md +2 -1
- package/dist/.tsbuildinfo +1 -1
- package/dist/admission/client.d.ts +9 -0
- package/dist/admission/client.d.ts.map +1 -0
- package/dist/admission/client.js +34 -0
- package/dist/admission/client.js.map +1 -0
- package/dist/admission/index.d.ts +5 -0
- package/dist/admission/index.d.ts.map +1 -0
- package/dist/admission/index.js +4 -0
- package/dist/admission/index.js.map +1 -0
- package/dist/admission/request-admission.d.ts +26 -0
- package/dist/admission/request-admission.d.ts.map +1 -0
- package/dist/admission/request-admission.js +85 -0
- package/dist/admission/request-admission.js.map +1 -0
- package/dist/admission/shared.d.ts +31 -0
- package/dist/admission/shared.d.ts.map +1 -0
- package/dist/admission/shared.js +30 -0
- package/dist/admission/shared.js.map +1 -0
- package/dist/ai/ai/provider.d.ts +5 -7
- package/dist/ai/ai-service.d.ts +8 -1
- package/dist/ai/ai-service.d.ts.map +1 -1
- package/dist/ai/ai-service.js +23 -13
- package/dist/ai/ai-service.js.map +1 -1
- package/dist/ai/errors/data-errors.d.ts +6 -0
- package/dist/ai/errors/index.d.ts +4 -1
- package/dist/ai/fill-prompt-template.d.ts +12 -0
- package/dist/ai/fill-prompt-template.d.ts.map +1 -0
- package/dist/ai/fill-prompt-template.js +19 -0
- package/dist/ai/fill-prompt-template.js.map +1 -0
- package/dist/ai/governed-artifacts.d.ts +49 -0
- package/dist/ai/governed-artifacts.d.ts.map +1 -0
- package/dist/ai/governed-artifacts.js +277 -0
- package/dist/ai/governed-artifacts.js.map +1 -0
- package/dist/ai/governed-budget.d.ts +17 -0
- package/dist/ai/governed-budget.d.ts.map +1 -0
- package/dist/ai/governed-budget.js +52 -0
- package/dist/ai/governed-budget.js.map +1 -0
- package/dist/ai/governed-host.d.ts +54 -0
- package/dist/ai/governed-host.d.ts.map +1 -0
- package/dist/ai/governed-host.js +8 -0
- package/dist/ai/governed-host.js.map +1 -0
- package/dist/ai/governed-invoke.d.ts +41 -0
- package/dist/ai/governed-invoke.d.ts.map +1 -0
- package/dist/ai/governed-invoke.js +102 -0
- package/dist/ai/governed-invoke.js.map +1 -0
- package/dist/ai/governed-runtime.d.ts +103 -0
- package/dist/ai/governed-runtime.d.ts.map +1 -0
- package/dist/ai/governed-runtime.js +151 -0
- package/dist/ai/governed-runtime.js.map +1 -0
- package/dist/ai/index.d.ts +12 -2
- package/dist/ai/index.d.ts.map +1 -1
- package/dist/ai/index.js +8 -2
- package/dist/ai/index.js.map +1 -1
- package/dist/ai/prompt-registry.d.ts +6 -0
- package/dist/ai/prompt-registry.d.ts.map +1 -1
- package/dist/ai/prompt-registry.js +12 -0
- package/dist/ai/prompt-registry.js.map +1 -1
- package/dist/ai/provider.d.ts +5 -7
- package/dist/ai/provider.d.ts.map +1 -1
- package/dist/ai/provider.js +29 -0
- package/dist/ai/provider.js.map +1 -1
- package/dist/ai/types/enums.d.ts +2 -0
- package/dist/ai/types/fields.d.ts +7 -0
- package/dist/ai/types/prompt.d.ts +8 -0
- package/dist/ai/validation.d.ts.map +1 -1
- package/dist/ai/validation.js +10 -1
- package/dist/ai/validation.js.map +1 -1
- package/dist/api/exposure.d.ts +14 -0
- package/dist/api/exposure.d.ts.map +1 -1
- package/dist/api/exposure.js +16 -0
- package/dist/api/exposure.js.map +1 -1
- package/dist/api/idempotency.d.ts +67 -0
- package/dist/api/idempotency.d.ts.map +1 -0
- package/dist/api/idempotency.js +176 -0
- package/dist/api/idempotency.js.map +1 -0
- package/dist/api/index.d.ts +3 -1
- package/dist/api/index.d.ts.map +1 -1
- package/dist/api/index.js +4 -2
- package/dist/api/index.js.map +1 -1
- package/dist/api/route-generator.d.ts +50 -6
- package/dist/api/route-generator.d.ts.map +1 -1
- package/dist/api/route-generator.js +254 -12
- package/dist/api/route-generator.js.map +1 -1
- package/dist/approvals/action-risk.d.ts +41 -0
- package/dist/approvals/action-risk.d.ts.map +1 -0
- package/dist/approvals/action-risk.js +56 -0
- package/dist/approvals/action-risk.js.map +1 -0
- package/dist/approvals/actors.d.ts +8 -0
- package/dist/approvals/actors.d.ts.map +1 -0
- package/dist/approvals/actors.js +26 -0
- package/dist/approvals/actors.js.map +1 -0
- package/dist/approvals/authorization.d.ts +5 -0
- package/dist/approvals/authorization.d.ts.map +1 -0
- package/dist/approvals/authorization.js +16 -0
- package/dist/approvals/authorization.js.map +1 -0
- package/dist/approvals/digest.d.ts +3 -0
- package/dist/approvals/digest.d.ts.map +1 -0
- package/dist/approvals/digest.js +21 -0
- package/dist/approvals/digest.js.map +1 -0
- package/dist/approvals/gate.d.ts +15 -0
- package/dist/approvals/gate.d.ts.map +1 -0
- package/dist/approvals/gate.js +102 -0
- package/dist/approvals/gate.js.map +1 -0
- package/dist/approvals/host-runtime.d.ts +16 -0
- package/dist/approvals/host-runtime.d.ts.map +1 -0
- package/dist/approvals/host-runtime.js +12 -0
- package/dist/approvals/host-runtime.js.map +1 -0
- package/dist/approvals/index.d.ts +19 -0
- package/dist/approvals/index.d.ts.map +1 -0
- package/dist/approvals/index.js +13 -0
- package/dist/approvals/index.js.map +1 -0
- package/dist/approvals/memory-store.d.ts +3 -0
- package/dist/approvals/memory-store.d.ts.map +1 -0
- package/dist/approvals/memory-store.js +33 -0
- package/dist/approvals/memory-store.js.map +1 -0
- package/dist/approvals/schema.d.ts +484 -0
- package/dist/approvals/schema.d.ts.map +1 -0
- package/dist/approvals/schema.js +55 -0
- package/dist/approvals/schema.js.map +1 -0
- package/dist/approvals/service.d.ts +17 -0
- package/dist/approvals/service.d.ts.map +1 -0
- package/dist/approvals/service.js +240 -0
- package/dist/approvals/service.js.map +1 -0
- package/dist/approvals/sql-store.d.ts +9 -0
- package/dist/approvals/sql-store.d.ts.map +1 -0
- package/dist/approvals/sql-store.js +179 -0
- package/dist/approvals/sql-store.js.map +1 -0
- package/dist/approvals/types.d.ts +156 -0
- package/dist/approvals/types.d.ts.map +1 -0
- package/dist/approvals/types.js +32 -0
- package/dist/approvals/types.js.map +1 -0
- package/dist/approvals/wait.d.ts +10 -0
- package/dist/approvals/wait.d.ts.map +1 -0
- package/dist/approvals/wait.js +11 -0
- package/dist/approvals/wait.js.map +1 -0
- package/dist/audit/service.d.ts.map +1 -1
- package/dist/audit/service.js +6 -1
- package/dist/audit/service.js.map +1 -1
- package/dist/cli/cli.d.ts.map +1 -1
- package/dist/cli/cli.js +2 -1
- package/dist/cli/cli.js.map +1 -1
- package/dist/cli/commands/api.d.ts +65 -0
- package/dist/cli/commands/api.d.ts.map +1 -1
- package/dist/cli/commands/api.js +79 -4
- package/dist/cli/commands/api.js.map +1 -1
- package/dist/cli/commands/compile-flows.d.ts +9 -0
- package/dist/cli/commands/compile-flows.d.ts.map +1 -0
- package/dist/cli/commands/compile-flows.js +55 -0
- package/dist/cli/commands/compile-flows.js.map +1 -0
- package/dist/cli/commands/dev.d.ts +6 -0
- package/dist/cli/commands/dev.d.ts.map +1 -1
- package/dist/cli/commands/dev.js +22 -5
- package/dist/cli/commands/dev.js.map +1 -1
- package/dist/cli/commands/e2e.d.ts +5 -0
- package/dist/cli/commands/e2e.d.ts.map +1 -1
- package/dist/cli/commands/e2e.js +42 -3
- package/dist/cli/commands/e2e.js.map +1 -1
- package/dist/cli/commands/flow.d.ts.map +1 -1
- package/dist/cli/commands/flow.js +12 -3
- package/dist/cli/commands/flow.js.map +1 -1
- package/dist/cli/commands/generate-openapi-from-zod.d.ts +26 -0
- package/dist/cli/commands/generate-openapi-from-zod.d.ts.map +1 -0
- package/dist/cli/commands/generate-openapi-from-zod.js +189 -0
- package/dist/cli/commands/generate-openapi-from-zod.js.map +1 -0
- package/dist/cli/commands/generate.d.ts +10 -4
- package/dist/cli/commands/generate.d.ts.map +1 -1
- package/dist/cli/commands/generate.js +27 -70
- package/dist/cli/commands/generate.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +2 -0
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/mcp.d.ts +5 -0
- package/dist/cli/commands/mcp.d.ts.map +1 -1
- package/dist/cli/commands/mcp.js +28 -2
- package/dist/cli/commands/mcp.js.map +1 -1
- package/dist/cli/commands/migrate.d.ts +1 -0
- package/dist/cli/commands/migrate.d.ts.map +1 -1
- package/dist/cli/commands/migrate.js +145 -34
- package/dist/cli/commands/migrate.js.map +1 -1
- package/dist/cli/commands/openapi-3-1.d.ts +34 -0
- package/dist/cli/commands/openapi-3-1.d.ts.map +1 -0
- package/dist/cli/commands/openapi-3-1.js +333 -0
- package/dist/cli/commands/openapi-3-1.js.map +1 -0
- package/dist/cli/commands/start.d.ts +5 -0
- package/dist/cli/commands/start.d.ts.map +1 -1
- package/dist/cli/commands/start.js +20 -2
- package/dist/cli/commands/start.js.map +1 -1
- package/dist/cli/commands/ui.d.ts +11 -0
- package/dist/cli/commands/ui.d.ts.map +1 -1
- package/dist/cli/commands/ui.js +105 -20
- package/dist/cli/commands/ui.js.map +1 -1
- package/dist/cli/commands/verify.d.ts.map +1 -1
- package/dist/cli/commands/verify.js +2 -0
- package/dist/cli/commands/verify.js.map +1 -1
- package/dist/cli/commands/worker.d.ts +5 -0
- package/dist/cli/commands/worker.d.ts.map +1 -1
- package/dist/cli/commands/worker.js +18 -2
- package/dist/cli/commands/worker.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/credentials/catalog.d.ts +71 -0
- package/dist/credentials/catalog.d.ts.map +1 -0
- package/dist/credentials/catalog.js +293 -0
- package/dist/credentials/catalog.js.map +1 -0
- package/dist/credentials/index.d.ts +3 -0
- package/dist/credentials/index.d.ts.map +1 -0
- package/dist/credentials/index.js +2 -0
- package/dist/credentials/index.js.map +1 -0
- package/dist/data/drift-inspector.d.ts +1 -4
- package/dist/data/drift-inspector.d.ts.map +1 -1
- package/dist/data/drift-inspector.js +39 -5
- package/dist/data/drift-inspector.js.map +1 -1
- package/dist/data/field-encryption.d.ts +7 -0
- package/dist/data/field-encryption.d.ts.map +1 -1
- package/dist/data/field-encryption.js +35 -17
- package/dist/data/field-encryption.js.map +1 -1
- package/dist/data/framework-migration-rewriter.js +1 -1
- package/dist/data/framework-migration-rewriter.js.map +1 -1
- package/dist/data/index.d.ts +1 -1
- package/dist/data/index.d.ts.map +1 -1
- package/dist/data/index.js +1 -1
- package/dist/data/index.js.map +1 -1
- package/dist/data/mask-fields.d.ts +2 -0
- package/dist/data/mask-fields.d.ts.map +1 -1
- package/dist/data/mask-fields.js +6 -0
- package/dist/data/mask-fields.js.map +1 -1
- package/dist/data/migration.d.ts.map +1 -1
- package/dist/data/migration.js +25 -1
- package/dist/data/migration.js.map +1 -1
- package/dist/data/repository.d.ts.map +1 -1
- package/dist/data/repository.js +15 -3
- package/dist/data/repository.js.map +1 -1
- package/dist/data/schema-generator.d.ts +95 -3
- package/dist/data/schema-generator.d.ts.map +1 -1
- package/dist/data/schema-generator.js +122 -6
- package/dist/data/schema-generator.js.map +1 -1
- package/dist/define/defineCapability.d.ts +7 -0
- package/dist/define/defineCapability.d.ts.map +1 -1
- package/dist/define/defineCapability.js +15 -0
- package/dist/define/defineCapability.js.map +1 -1
- package/dist/define/defineFlow.d.ts +3 -1
- package/dist/define/defineFlow.d.ts.map +1 -1
- package/dist/define/defineFlow.js.map +1 -1
- package/dist/durable/apply-ddl.d.ts +13 -0
- package/dist/durable/apply-ddl.d.ts.map +1 -0
- package/dist/durable/apply-ddl.js +278 -0
- package/dist/durable/apply-ddl.js.map +1 -0
- package/dist/durable/harness.d.ts +31 -0
- package/dist/durable/harness.d.ts.map +1 -0
- package/dist/durable/harness.js +136 -0
- package/dist/durable/harness.js.map +1 -0
- package/dist/durable/index.d.ts +18 -0
- package/dist/durable/index.d.ts.map +1 -0
- package/dist/durable/index.js +16 -0
- package/dist/durable/index.js.map +1 -0
- package/dist/durable/memory-store.d.ts +48 -0
- package/dist/durable/memory-store.d.ts.map +1 -0
- package/dist/durable/memory-store.js +260 -0
- package/dist/durable/memory-store.js.map +1 -0
- package/dist/durable/migrations-path.d.ts +5 -0
- package/dist/durable/migrations-path.d.ts.map +1 -0
- package/dist/durable/migrations-path.js +8 -0
- package/dist/durable/migrations-path.js.map +1 -0
- package/dist/durable/opaque-dispatch.d.ts +7 -0
- package/dist/durable/opaque-dispatch.d.ts.map +1 -0
- package/dist/durable/opaque-dispatch.js +67 -0
- package/dist/durable/opaque-dispatch.js.map +1 -0
- package/dist/durable/persist-before-ack.d.ts +52 -0
- package/dist/durable/persist-before-ack.d.ts.map +1 -0
- package/dist/durable/persist-before-ack.js +153 -0
- package/dist/durable/persist-before-ack.js.map +1 -0
- package/dist/durable/pg-env.d.ts +9 -0
- package/dist/durable/pg-env.d.ts.map +1 -0
- package/dist/durable/pg-env.js +20 -0
- package/dist/durable/pg-env.js.map +1 -0
- package/dist/durable/postgres-persist.d.ts +33 -0
- package/dist/durable/postgres-persist.d.ts.map +1 -0
- package/dist/durable/postgres-persist.js +239 -0
- package/dist/durable/postgres-persist.js.map +1 -0
- package/dist/durable/reconciliation.d.ts +20 -0
- package/dist/durable/reconciliation.d.ts.map +1 -0
- package/dist/durable/reconciliation.js +91 -0
- package/dist/durable/reconciliation.js.map +1 -0
- package/dist/durable/schema.d.ts +1448 -0
- package/dist/durable/schema.d.ts.map +1 -0
- package/dist/durable/schema.js +138 -0
- package/dist/durable/schema.js.map +1 -0
- package/dist/durable/spine-claim.d.ts +16 -0
- package/dist/durable/spine-claim.d.ts.map +1 -0
- package/dist/durable/spine-claim.js +131 -0
- package/dist/durable/spine-claim.js.map +1 -0
- package/dist/durable/types.d.ts +153 -0
- package/dist/durable/types.d.ts.map +1 -0
- package/dist/durable/types.js +114 -0
- package/dist/durable/types.js.map +1 -0
- package/dist/errors/data-errors.d.ts +6 -0
- package/dist/errors/data-errors.d.ts.map +1 -1
- package/dist/errors/data-errors.js +9 -0
- package/dist/errors/data-errors.js.map +1 -1
- package/dist/errors/http.d.ts.map +1 -1
- package/dist/errors/http.js +9 -1
- package/dist/errors/http.js.map +1 -1
- package/dist/errors/index.d.ts +4 -1
- package/dist/errors/index.d.ts.map +1 -1
- package/dist/errors/index.js +11 -1
- package/dist/errors/index.js.map +1 -1
- package/dist/errors-entry.d.ts +1 -1
- package/dist/errors-entry.d.ts.map +1 -1
- package/dist/errors-entry.js +1 -1
- package/dist/errors-entry.js.map +1 -1
- package/dist/events/consumer-registry.d.ts +6 -0
- package/dist/events/consumer-registry.d.ts.map +1 -1
- package/dist/events/consumer-registry.js.map +1 -1
- package/dist/events/dispatcher.d.ts +19 -0
- package/dist/events/dispatcher.d.ts.map +1 -1
- package/dist/events/dispatcher.js +161 -114
- package/dist/events/dispatcher.js.map +1 -1
- package/dist/events/idempotency.d.ts +3 -2
- package/dist/events/idempotency.d.ts.map +1 -1
- package/dist/events/idempotency.js +3 -2
- package/dist/events/idempotency.js.map +1 -1
- package/dist/events/index.d.ts +2 -0
- package/dist/events/index.d.ts.map +1 -1
- package/dist/events/index.js +1 -0
- package/dist/events/index.js.map +1 -1
- package/dist/events/subscription.d.ts +29 -0
- package/dist/events/subscription.d.ts.map +1 -0
- package/dist/events/subscription.js +19 -0
- package/dist/events/subscription.js.map +1 -0
- package/dist/events/worker.d.ts +8 -1
- package/dist/events/worker.d.ts.map +1 -1
- package/dist/events/worker.js +32 -5
- package/dist/events/worker.js.map +1 -1
- package/dist/execution/capability-executor.d.ts +6 -3
- package/dist/execution/capability-executor.d.ts.map +1 -1
- package/dist/execution/capability-executor.js +34 -6
- package/dist/execution/capability-executor.js.map +1 -1
- package/dist/execution/context-deps.d.ts +2 -0
- package/dist/execution/context-deps.d.ts.map +1 -1
- package/dist/execution/context-deps.js +2 -1
- package/dist/execution/context-deps.js.map +1 -1
- package/dist/execution/context-factory.d.ts +38 -1
- package/dist/execution/context-factory.d.ts.map +1 -1
- package/dist/execution/context-factory.js +102 -4
- package/dist/execution/context-factory.js.map +1 -1
- package/dist/execution/index.d.ts +2 -2
- package/dist/execution/index.d.ts.map +1 -1
- package/dist/execution/index.js +1 -1
- package/dist/execution/index.js.map +1 -1
- package/dist/execution/transactional-outbox.d.ts +10 -0
- package/dist/execution/transactional-outbox.d.ts.map +1 -1
- package/dist/execution/transactional-outbox.js +41 -2
- package/dist/execution/transactional-outbox.js.map +1 -1
- package/dist/flows/budget.d.ts +44 -0
- package/dist/flows/budget.d.ts.map +1 -0
- package/dist/flows/budget.js +81 -0
- package/dist/flows/budget.js.map +1 -0
- package/dist/flows/compile-flow.d.ts +23 -0
- package/dist/flows/compile-flow.d.ts.map +1 -0
- package/dist/flows/compile-flow.js +176 -0
- package/dist/flows/compile-flow.js.map +1 -0
- package/dist/flows/compiled-registry.d.ts +43 -0
- package/dist/flows/compiled-registry.d.ts.map +1 -0
- package/dist/flows/compiled-registry.js +198 -0
- package/dist/flows/compiled-registry.js.map +1 -0
- package/dist/flows/dead-letter.d.ts +16 -0
- package/dist/flows/dead-letter.d.ts.map +1 -1
- package/dist/flows/dead-letter.js +67 -0
- package/dist/flows/dead-letter.js.map +1 -1
- package/dist/flows/definition-strategy.d.ts +13 -0
- package/dist/flows/definition-strategy.d.ts.map +1 -0
- package/dist/flows/definition-strategy.js +30 -0
- package/dist/flows/definition-strategy.js.map +1 -0
- package/dist/flows/engine.d.ts +38 -1
- package/dist/flows/engine.d.ts.map +1 -1
- package/dist/flows/engine.js +375 -32
- package/dist/flows/engine.js.map +1 -1
- package/dist/flows/index.d.ts +12 -4
- package/dist/flows/index.d.ts.map +1 -1
- package/dist/flows/index.js +7 -2
- package/dist/flows/index.js.map +1 -1
- package/dist/flows/scheduler.d.ts +26 -0
- package/dist/flows/scheduler.d.ts.map +1 -1
- package/dist/flows/scheduler.js +157 -37
- package/dist/flows/scheduler.js.map +1 -1
- package/dist/flows/schema.d.ts +34 -0
- package/dist/flows/schema.d.ts.map +1 -1
- package/dist/flows/schema.js +4 -0
- package/dist/flows/schema.js.map +1 -1
- package/dist/flows/step-executor.d.ts +3 -0
- package/dist/flows/step-executor.d.ts.map +1 -1
- package/dist/flows/step-executor.js +33 -0
- package/dist/flows/step-executor.js.map +1 -1
- package/dist/governance/capability-source-scan.d.ts.map +1 -1
- package/dist/governance/capability-source-scan.js +2 -29
- package/dist/governance/capability-source-scan.js.map +1 -1
- package/dist/governance/forbidden-path-scan.d.ts +7 -0
- package/dist/governance/forbidden-path-scan.d.ts.map +1 -0
- package/dist/governance/forbidden-path-scan.js +60 -0
- package/dist/governance/forbidden-path-scan.js.map +1 -0
- package/dist/governance/index.d.ts +2 -0
- package/dist/governance/index.d.ts.map +1 -1
- package/dist/governance/index.js +2 -0
- package/dist/governance/index.js.map +1 -1
- package/dist/governance/source-walk.d.ts +3 -0
- package/dist/governance/source-walk.d.ts.map +1 -0
- package/dist/governance/source-walk.js +33 -0
- package/dist/governance/source-walk.js.map +1 -0
- package/dist/index.d.ts +21 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +22 -9
- package/dist/index.js.map +1 -1
- package/dist/runtime/bootstrap.d.ts +3 -1
- package/dist/runtime/bootstrap.d.ts.map +1 -1
- package/dist/runtime/load-extensions.d.ts.map +1 -1
- package/dist/runtime/load-extensions.js +11 -0
- package/dist/runtime/load-extensions.js.map +1 -1
- package/dist/runtime/register-consumers.d.ts +3 -0
- package/dist/runtime/register-consumers.d.ts.map +1 -1
- package/dist/runtime/register-consumers.js +4 -0
- package/dist/runtime/register-consumers.js.map +1 -1
- package/dist/runtime/start-worker-pool.d.ts.map +1 -1
- package/dist/runtime/start-worker-pool.js +1 -0
- package/dist/runtime/start-worker-pool.js.map +1 -1
- package/dist/runtime-entry.d.ts +4 -0
- package/dist/runtime-entry.d.ts.map +1 -0
- package/dist/runtime-entry.js +30 -0
- package/dist/runtime-entry.js.map +1 -0
- package/dist/server/bootstrap.d.ts +116 -8
- package/dist/server/bootstrap.d.ts.map +1 -1
- package/dist/server/bootstrap.js +139 -62
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/tenancy/data-plane-connection.d.ts +108 -0
- package/dist/tenancy/data-plane-connection.d.ts.map +1 -0
- package/dist/tenancy/data-plane-connection.js +320 -0
- package/dist/tenancy/data-plane-connection.js.map +1 -0
- package/dist/tenancy/data-plane-migrate.d.ts +30 -0
- package/dist/tenancy/data-plane-migrate.d.ts.map +1 -0
- package/dist/tenancy/data-plane-migrate.js +44 -0
- package/dist/tenancy/data-plane-migrate.js.map +1 -0
- package/dist/tenancy/data-plane-provisioning.d.ts +135 -0
- package/dist/tenancy/data-plane-provisioning.d.ts.map +1 -0
- package/dist/tenancy/data-plane-provisioning.js +639 -0
- package/dist/tenancy/data-plane-provisioning.js.map +1 -0
- package/dist/tenancy/data-plane-resolver.d.ts +37 -0
- package/dist/tenancy/data-plane-resolver.d.ts.map +1 -0
- package/dist/tenancy/data-plane-resolver.js +302 -0
- package/dist/tenancy/data-plane-resolver.js.map +1 -0
- package/dist/tenancy/index.d.ts +9 -0
- package/dist/tenancy/index.d.ts.map +1 -0
- package/dist/tenancy/index.js +22 -0
- package/dist/tenancy/index.js.map +1 -0
- package/dist/tenancy/types.d.ts +117 -0
- package/dist/tenancy/types.d.ts.map +1 -0
- package/dist/tenancy/types.js +8 -0
- package/dist/tenancy/types.js.map +1 -0
- package/dist/testing/context.d.ts.map +1 -1
- package/dist/testing/context.js +6 -1
- package/dist/testing/context.js.map +1 -1
- package/dist/testing/crash-matrix-simulation.d.ts +51 -0
- package/dist/testing/crash-matrix-simulation.d.ts.map +1 -0
- package/dist/testing/crash-matrix-simulation.js +350 -0
- package/dist/testing/crash-matrix-simulation.js.map +1 -0
- package/dist/testing/scaffolding.d.ts.map +1 -1
- package/dist/testing/scaffolding.js +4 -1
- package/dist/testing/scaffolding.js.map +1 -1
- package/dist/types/capability.d.ts +16 -0
- package/dist/types/capability.d.ts.map +1 -1
- package/dist/types/capability.js.map +1 -1
- package/dist/types/context.d.ts +62 -0
- package/dist/types/context.d.ts.map +1 -1
- package/dist/types/enums.d.ts +2 -0
- package/dist/types/enums.d.ts.map +1 -1
- package/dist/types/enums.js +2 -0
- package/dist/types/enums.js.map +1 -1
- package/dist/types/fields.d.ts +7 -0
- package/dist/types/fields.d.ts.map +1 -1
- package/dist/types/flow.d.ts +96 -1
- package/dist/types/flow.d.ts.map +1 -1
- package/dist/types/flow.js +7 -1
- package/dist/types/flow.js.map +1 -1
- package/dist/types/index.d.ts +9 -6
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +5 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/prompt.d.ts +8 -0
- package/dist/types/prompt.d.ts.map +1 -1
- package/dist/types/prompt.js +7 -0
- package/dist/types/prompt.js.map +1 -1
- package/dist/worker/bootstrap.d.ts +100 -1
- package/dist/worker/bootstrap.d.ts.map +1 -1
- package/dist/worker/bootstrap.js +155 -14
- package/dist/worker/bootstrap.js.map +1 -1
- package/instructions/api.md +21 -0
- package/instructions/cli.md +15 -9
- package/instructions/deployment.md +27 -25
- package/instructions/flows.md +8 -1
- package/instructions/framework.md +2 -1
- package/instructions/mcp.md +1 -1
- package/instructions/peer-dependencies.md +16 -14
- package/instructions/prompts.md +3 -0
- package/instructions/security.md +4 -0
- package/instructions/testing.md +2 -2
- package/migrations/durable-tenant/0000_durable_tenant.sql +92 -0
- package/migrations/durable-tenant/0001_human_task.sql +45 -0
- package/migrations/durable-tenant/meta/_journal.json +20 -0
- package/migrations/spine/0000_opaque_dispatch.sql +26 -0
- package/migrations/spine/meta/_journal.json +13 -0
- package/package.json +26 -8
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
// ── Data-Plane Connections ──
|
|
2
|
+
// Opening one data plane: a pooled connection to a named database, opened as a
|
|
3
|
+
// named role, handed back in the `{ db, close }` shape the pooled resolver's
|
|
4
|
+
// `connect` step has to produce.
|
|
5
|
+
//
|
|
6
|
+
// `createPooledDataPlaneResolver` deliberately does not know how a connection is
|
|
7
|
+
// made — the host answers that. Without a framework-supplied answer every host
|
|
8
|
+
// reaches for the raw driver, which is where unbounded pools and credentials in
|
|
9
|
+
// error messages come from. This is that answer, with three properties a
|
|
10
|
+
// hand-rolled `connect` rarely has:
|
|
11
|
+
//
|
|
12
|
+
// bounded — a ceiling is always applied (`DEFAULT_DATA_PLANE_POOL_SIZE` by
|
|
13
|
+
// default, never above `MAX_DATA_PLANE_POOL_SIZE`), so a resolver
|
|
14
|
+
// holding many data planes open cannot multiply into an unbounded
|
|
15
|
+
// number of server backends.
|
|
16
|
+
// quiet — no password and no connection string reaches a message, error
|
|
17
|
+
// metadata or the notice stream. Failures are re-raised as
|
|
18
|
+
// `DataPlaneConnectionError` carrying only host, port, database,
|
|
19
|
+
// role and SQLSTATE, with the driver's text scrubbed of secrets.
|
|
20
|
+
// per-tenant — every call builds its own client and its own `close`, sharing
|
|
21
|
+
// no state with any other call, so it is safe to invoke once per
|
|
22
|
+
// tenant. `close` is idempotent and closes the whole pool.
|
|
23
|
+
//
|
|
24
|
+
// By default the connection is verified with a round trip before it is returned,
|
|
25
|
+
// so a wrong credential or an unreachable placement fails at resolve time rather
|
|
26
|
+
// than inside the first capability that happens to query.
|
|
27
|
+
//
|
|
28
|
+
// Key exports: openDataPlaneConnection, DataPlaneConnectionError.
|
|
29
|
+
import { PlumbusError } from '../errors/plumbus-error.js';
|
|
30
|
+
import { ErrorCode } from '../types/enums.js';
|
|
31
|
+
/** Connections a data-plane pool holds when the caller names no ceiling. */
|
|
32
|
+
export const DEFAULT_DATA_PLANE_POOL_SIZE = 5;
|
|
33
|
+
/**
|
|
34
|
+
* Largest pool one data plane may hold. A resolver caches many data planes at
|
|
35
|
+
* once, so the per-tenant ceiling is what keeps the total number of server
|
|
36
|
+
* backends finite; a request for more is a configuration error, not a tuning
|
|
37
|
+
* choice the framework silently honours.
|
|
38
|
+
*/
|
|
39
|
+
export const MAX_DATA_PLANE_POOL_SIZE = 64;
|
|
40
|
+
const DEFAULT_PORT = 5432;
|
|
41
|
+
const DEFAULT_CONNECT_TIMEOUT_SECONDS = 10;
|
|
42
|
+
const DEFAULT_IDLE_TIMEOUT_SECONDS = 30;
|
|
43
|
+
const DEFAULT_CLOSE_TIMEOUT_SECONDS = 5;
|
|
44
|
+
/** What a scrubbed secret is replaced with wherever one could have appeared. */
|
|
45
|
+
const REDACTED = '[redacted]';
|
|
46
|
+
const NUL = '\u0000';
|
|
47
|
+
// ── Errors ──
|
|
48
|
+
/**
|
|
49
|
+
* A data plane could not be opened, or the connection did not answer.
|
|
50
|
+
*
|
|
51
|
+
* Carries only non-secret coordinates: `host`, `port`, `database`, `user` and,
|
|
52
|
+
* when the server rejected the attempt, `sqlState`. The driver's own error is
|
|
53
|
+
* never re-thrown and never attached, because its text and its fields are
|
|
54
|
+
* outside this module's control.
|
|
55
|
+
*/
|
|
56
|
+
export class DataPlaneConnectionError extends PlumbusError {
|
|
57
|
+
constructor(message, metadata) {
|
|
58
|
+
super(ErrorCode.Internal, message, metadata);
|
|
59
|
+
this.name = 'DataPlaneConnectionError';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function validationError(message, metadata) {
|
|
63
|
+
return new PlumbusError(ErrorCode.Validation, message, metadata);
|
|
64
|
+
}
|
|
65
|
+
function isConnectionUrl(target) {
|
|
66
|
+
return typeof target.connectionString === 'string';
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Connection parameters travel in the startup packet, where a NUL terminates the
|
|
70
|
+
* value: a parameter carrying one is refused rather than silently truncated.
|
|
71
|
+
*/
|
|
72
|
+
function assertParameter(value, field) {
|
|
73
|
+
if (typeof value !== 'string' || value.length === 0) {
|
|
74
|
+
throw validationError(`${field} must be a non-empty string`, { field });
|
|
75
|
+
}
|
|
76
|
+
if (value.includes(NUL)) {
|
|
77
|
+
throw validationError(`${field} must not contain a NUL character`, { field });
|
|
78
|
+
}
|
|
79
|
+
return value;
|
|
80
|
+
}
|
|
81
|
+
function assertPort(value, field) {
|
|
82
|
+
if (!Number.isInteger(value) || value < 1 || value > 65535) {
|
|
83
|
+
throw validationError(`${field} must be an integer between 1 and 65535`, { field });
|
|
84
|
+
}
|
|
85
|
+
return value;
|
|
86
|
+
}
|
|
87
|
+
function assertSeconds(value, field) {
|
|
88
|
+
if (typeof value !== 'number' || !Number.isFinite(value) || value <= 0) {
|
|
89
|
+
throw validationError(`${field} must be a positive, finite number of seconds`, { field });
|
|
90
|
+
}
|
|
91
|
+
return value;
|
|
92
|
+
}
|
|
93
|
+
function normalizePoolSize(value) {
|
|
94
|
+
if (value === undefined)
|
|
95
|
+
return DEFAULT_DATA_PLANE_POOL_SIZE;
|
|
96
|
+
if (!Number.isInteger(value) || value < 1 || value > MAX_DATA_PLANE_POOL_SIZE) {
|
|
97
|
+
throw validationError(`maxConnections must be an integer between 1 and ${MAX_DATA_PLANE_POOL_SIZE} (received ${String(value)})`, { field: 'maxConnections' });
|
|
98
|
+
}
|
|
99
|
+
return value;
|
|
100
|
+
}
|
|
101
|
+
function hasControlCharacter(value) {
|
|
102
|
+
for (const character of value) {
|
|
103
|
+
const code = character.codePointAt(0) ?? 0;
|
|
104
|
+
if (code < 0x20 || code === 0x7f)
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
function normalizeApplicationName(value) {
|
|
110
|
+
const name = assertParameter(value, 'applicationName');
|
|
111
|
+
if (hasControlCharacter(name)) {
|
|
112
|
+
throw validationError('applicationName must not contain control characters', {
|
|
113
|
+
field: 'applicationName',
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
return name;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Reads the non-secret coordinates out of a URL. A string that does not parse
|
|
120
|
+
* yields no coordinates rather than an excerpt — an excerpt of a connection
|
|
121
|
+
* string is an excerpt of a credential.
|
|
122
|
+
*/
|
|
123
|
+
function endpointOfUrl(connectionString) {
|
|
124
|
+
let url;
|
|
125
|
+
try {
|
|
126
|
+
url = new URL(connectionString);
|
|
127
|
+
}
|
|
128
|
+
catch {
|
|
129
|
+
return { endpoint: {} };
|
|
130
|
+
}
|
|
131
|
+
const database = decodeURIComponent(url.pathname.replace(/^\//, ''));
|
|
132
|
+
const endpoint = {
|
|
133
|
+
...(url.hostname ? { host: url.hostname } : {}),
|
|
134
|
+
...(url.port ? { port: Number(url.port) } : {}),
|
|
135
|
+
...(database ? { database } : {}),
|
|
136
|
+
...(url.username ? { user: decodeURIComponent(url.username) } : {}),
|
|
137
|
+
};
|
|
138
|
+
const password = url.password ? decodeURIComponent(url.password) : '';
|
|
139
|
+
return password ? { endpoint, secret: password } : { endpoint };
|
|
140
|
+
}
|
|
141
|
+
function normalizeTarget(target) {
|
|
142
|
+
if (target === null || typeof target !== 'object') {
|
|
143
|
+
throw validationError('target must describe the database to connect to', { field: 'target' });
|
|
144
|
+
}
|
|
145
|
+
if (isConnectionUrl(target)) {
|
|
146
|
+
const connectionString = assertParameter(target.connectionString, 'target.connectionString');
|
|
147
|
+
const scheme = connectionString.slice(0, connectionString.indexOf(':') + 1);
|
|
148
|
+
if (scheme !== 'postgres:' && scheme !== 'postgresql:') {
|
|
149
|
+
throw validationError('target.connectionString must be a postgres:// or postgresql:// URL', {
|
|
150
|
+
field: 'target.connectionString',
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
const databaseOverride = target.database === undefined
|
|
154
|
+
? undefined
|
|
155
|
+
: assertParameter(target.database, 'target.database');
|
|
156
|
+
const { endpoint, secret } = endpointOfUrl(connectionString);
|
|
157
|
+
return {
|
|
158
|
+
kind: 'url',
|
|
159
|
+
endpoint: databaseOverride ? { ...endpoint, database: databaseOverride } : endpoint,
|
|
160
|
+
secrets: secret ? [connectionString, secret] : [connectionString],
|
|
161
|
+
connectionString,
|
|
162
|
+
...(databaseOverride === undefined ? {} : { databaseOverride }),
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
const host = assertParameter(target.host, 'target.host');
|
|
166
|
+
const database = assertParameter(target.database, 'target.database');
|
|
167
|
+
const user = assertParameter(target.user, 'target.user');
|
|
168
|
+
const port = target.port === undefined ? DEFAULT_PORT : assertPort(target.port, 'target.port');
|
|
169
|
+
const password = target.password === undefined ? undefined : assertParameter(target.password, 'target.password');
|
|
170
|
+
return {
|
|
171
|
+
kind: 'fields',
|
|
172
|
+
endpoint: { host, port, database, user },
|
|
173
|
+
secrets: password === undefined ? [] : [password],
|
|
174
|
+
host,
|
|
175
|
+
port,
|
|
176
|
+
database,
|
|
177
|
+
user,
|
|
178
|
+
...(password === undefined ? {} : { password }),
|
|
179
|
+
...(target.ssl === undefined ? {} : { ssl: target.ssl }),
|
|
180
|
+
};
|
|
181
|
+
}
|
|
182
|
+
// ── Failure reporting ──
|
|
183
|
+
function sqlStateOf(error) {
|
|
184
|
+
if (typeof error !== 'object' || error === null)
|
|
185
|
+
return undefined;
|
|
186
|
+
const code = error.code;
|
|
187
|
+
return typeof code === 'string' ? code : undefined;
|
|
188
|
+
}
|
|
189
|
+
function messageOf(error) {
|
|
190
|
+
if (error instanceof Error && typeof error.message === 'string')
|
|
191
|
+
return error.message;
|
|
192
|
+
return typeof error === 'string' ? error : 'unknown error';
|
|
193
|
+
}
|
|
194
|
+
/** Replaces every occurrence of every secret, longest first so overlaps are covered. */
|
|
195
|
+
function redact(text, secrets) {
|
|
196
|
+
let scrubbed = text;
|
|
197
|
+
for (const secret of [...secrets].sort((a, b) => b.length - a.length)) {
|
|
198
|
+
if (secret.length === 0)
|
|
199
|
+
continue;
|
|
200
|
+
scrubbed = scrubbed.split(secret).join(REDACTED);
|
|
201
|
+
}
|
|
202
|
+
return scrubbed;
|
|
203
|
+
}
|
|
204
|
+
function describeEndpoint(endpoint) {
|
|
205
|
+
const where = endpoint.host
|
|
206
|
+
? `${endpoint.host}:${endpoint.port ?? DEFAULT_PORT}`
|
|
207
|
+
: 'the configured host';
|
|
208
|
+
const database = endpoint.database ? `"${endpoint.database}"` : 'the configured database';
|
|
209
|
+
const role = endpoint.user ? ` as role "${endpoint.user}"` : '';
|
|
210
|
+
return `database ${database} on ${where}${role}`;
|
|
211
|
+
}
|
|
212
|
+
function connectionFailure(action, target, error) {
|
|
213
|
+
const sqlState = sqlStateOf(error);
|
|
214
|
+
return new DataPlaneConnectionError(`Could not ${action} ${describeEndpoint(target.endpoint)}: ${redact(messageOf(error), target.secrets)}`, {
|
|
215
|
+
...target.endpoint,
|
|
216
|
+
...(sqlState === undefined ? {} : { sqlState }),
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
// ── Opening ──
|
|
220
|
+
/**
|
|
221
|
+
* Opens a pooled connection to one database as one role.
|
|
222
|
+
*
|
|
223
|
+
* This is the `connect` step of `createPooledDataPlaneResolver`:
|
|
224
|
+
*
|
|
225
|
+
* ```ts
|
|
226
|
+
* const resolver = createPooledDataPlaneResolver<Placement>({
|
|
227
|
+
* describe: async (tenantRef) => placements.get(tenantRef),
|
|
228
|
+
* connect: ({ descriptor }) =>
|
|
229
|
+
* openDataPlaneConnection({ target: descriptor.connectionInfo, maxConnections: 4 }),
|
|
230
|
+
* });
|
|
231
|
+
* ```
|
|
232
|
+
*
|
|
233
|
+
* Each call owns its pool: nothing is shared between calls, so calling it once
|
|
234
|
+
* per tenant gives every tenant an isolated set of connections that the resolver
|
|
235
|
+
* closes through the returned `close` when it evicts or invalidates the entry.
|
|
236
|
+
*
|
|
237
|
+
* Throws `PlumbusError` (`validation`) for an unusable target or option before
|
|
238
|
+
* any socket is opened, and `DataPlaneConnectionError` when the server refuses
|
|
239
|
+
* or does not answer. Neither carries a password or a connection string.
|
|
240
|
+
*/
|
|
241
|
+
export async function openDataPlaneConnection(options) {
|
|
242
|
+
const target = normalizeTarget(options.target);
|
|
243
|
+
const max = normalizePoolSize(options.maxConnections);
|
|
244
|
+
const connectTimeout = options.connectTimeoutSeconds === undefined
|
|
245
|
+
? DEFAULT_CONNECT_TIMEOUT_SECONDS
|
|
246
|
+
: assertSeconds(options.connectTimeoutSeconds, 'connectTimeoutSeconds');
|
|
247
|
+
const idleTimeout = options.idleTimeoutSeconds === undefined
|
|
248
|
+
? DEFAULT_IDLE_TIMEOUT_SECONDS
|
|
249
|
+
: assertSeconds(options.idleTimeoutSeconds, 'idleTimeoutSeconds');
|
|
250
|
+
const closeTimeout = options.closeTimeoutSeconds === undefined
|
|
251
|
+
? DEFAULT_CLOSE_TIMEOUT_SECONDS
|
|
252
|
+
: assertSeconds(options.closeTimeoutSeconds, 'closeTimeoutSeconds');
|
|
253
|
+
const maxLifetime = options.maxLifetimeSeconds === undefined
|
|
254
|
+
? undefined
|
|
255
|
+
: assertSeconds(options.maxLifetimeSeconds, 'maxLifetimeSeconds');
|
|
256
|
+
const applicationName = options.applicationName === undefined
|
|
257
|
+
? undefined
|
|
258
|
+
: normalizeApplicationName(options.applicationName);
|
|
259
|
+
const postgresModule = (await import('postgres')).default;
|
|
260
|
+
const { drizzle } = await import('drizzle-orm/postgres-js');
|
|
261
|
+
const shared = {
|
|
262
|
+
max,
|
|
263
|
+
connect_timeout: connectTimeout,
|
|
264
|
+
idle_timeout: idleTimeout,
|
|
265
|
+
// The server's notice stream can echo statement text; the caller's own
|
|
266
|
+
// logging is the record, not this module's stderr.
|
|
267
|
+
onnotice: () => { },
|
|
268
|
+
...(maxLifetime === undefined ? {} : { max_lifetime: maxLifetime }),
|
|
269
|
+
...(applicationName === undefined ? {} : { connection: { application_name: applicationName } }),
|
|
270
|
+
};
|
|
271
|
+
let client;
|
|
272
|
+
try {
|
|
273
|
+
client =
|
|
274
|
+
target.kind === 'url'
|
|
275
|
+
? postgresModule(target.connectionString, target.databaseOverride === undefined
|
|
276
|
+
? shared
|
|
277
|
+
: { ...shared, database: target.databaseOverride })
|
|
278
|
+
: postgresModule({
|
|
279
|
+
...shared,
|
|
280
|
+
host: target.host,
|
|
281
|
+
port: target.port,
|
|
282
|
+
database: target.database,
|
|
283
|
+
username: target.user,
|
|
284
|
+
...(target.password === undefined ? {} : { password: target.password }),
|
|
285
|
+
...(target.ssl === undefined ? {} : { ssl: target.ssl }),
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
throw connectionFailure('open a connection to', target, error);
|
|
290
|
+
}
|
|
291
|
+
const close = createCloser(client, closeTimeout, target);
|
|
292
|
+
if (options.verify !== false) {
|
|
293
|
+
try {
|
|
294
|
+
await client `SELECT 1`;
|
|
295
|
+
}
|
|
296
|
+
catch (error) {
|
|
297
|
+
await close().catch(() => undefined);
|
|
298
|
+
throw connectionFailure('open a connection to', target, error);
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
return { db: drizzle(client), close };
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Idempotent pool shutdown. Concurrent and repeated calls await the same
|
|
305
|
+
* shutdown; a failed one is not cached, so a later call may try again.
|
|
306
|
+
*/
|
|
307
|
+
function createCloser(client, timeoutSeconds, target) {
|
|
308
|
+
let ending;
|
|
309
|
+
return async function close() {
|
|
310
|
+
ending ??= client.end({ timeout: timeoutSeconds }).then(() => undefined);
|
|
311
|
+
try {
|
|
312
|
+
await ending;
|
|
313
|
+
}
|
|
314
|
+
catch (error) {
|
|
315
|
+
ending = undefined;
|
|
316
|
+
throw connectionFailure('close the connection to', target, error);
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=data-plane-connection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-plane-connection.js","sourceRoot":"","sources":["../../src/tenancy/data-plane-connection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type MigrationApplyResult } from '../data/migration.js';
|
|
2
|
+
import { type DataPlaneConnectionTarget } from './data-plane-connection.js';
|
|
3
|
+
export declare const DATA_PLANE_MIGRATE_APPLICATION_NAME = "plumbus-migrate";
|
|
4
|
+
export interface ApplyDataPlaneMigrationsOptions {
|
|
5
|
+
/** Named tenant database, opened as the role that may run DDL (typically the owner). */
|
|
6
|
+
target: DataPlaneConnectionTarget;
|
|
7
|
+
/** Folder that holds generated SQL and `meta/_journal.json` (usually `drizzle/`). */
|
|
8
|
+
migrationsFolder: string;
|
|
9
|
+
/**
|
|
10
|
+
* Maximum connections this one-shot apply may open. Default 1.
|
|
11
|
+
* Must stay within the factory ceiling.
|
|
12
|
+
*/
|
|
13
|
+
maxConnections?: number;
|
|
14
|
+
/** Reported to the server as `application_name`. Default `plumbus-migrate`. */
|
|
15
|
+
applicationName?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface DataPlaneMigrationApplyResult extends MigrationApplyResult {
|
|
18
|
+
/** The database name when the target named one (fields target, or URL override). */
|
|
19
|
+
database?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Open one named tenant database through `openDataPlaneConnection` and apply
|
|
23
|
+
* pending migrations from `migrationsFolder`. Always closes the pool, including
|
|
24
|
+
* when apply fails.
|
|
25
|
+
*
|
|
26
|
+
* This is the host-side counterpart of `plumbus migrate apply --database`.
|
|
27
|
+
* It does not create the database or roles — call `provisionDataPlane` first.
|
|
28
|
+
*/
|
|
29
|
+
export declare function applyDataPlaneMigrations(options: ApplyDataPlaneMigrationsOptions): Promise<DataPlaneMigrationApplyResult>;
|
|
30
|
+
//# sourceMappingURL=data-plane-migrate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-plane-migrate.d.ts","sourceRoot":"","sources":["../../src/tenancy/data-plane-migrate.ts"],"names":[],"mappings":"AASA,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAClF,OAAO,EAEL,KAAK,yBAAyB,EAC/B,MAAM,4BAA4B,CAAC;AAEpC,eAAO,MAAM,mCAAmC,oBAAoB,CAAC;AAErE,MAAM,WAAW,+BAA+B;IAC9C,wFAAwF;IACxF,MAAM,EAAE,yBAAyB,CAAC;IAClC,qFAAqF;IACrF,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,+EAA+E;IAC/E,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,6BAA8B,SAAQ,oBAAoB;IACzE,oFAAoF;IACpF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AASD;;;;;;;GAOG;AACH,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,+BAA+B,GACvC,OAAO,CAAC,6BAA6B,CAAC,CAiBxC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
// ── Data-plane migrations ──
|
|
2
|
+
// A host applies the same generated framework/app migrations to one named
|
|
3
|
+
// tenant database. The connection is the existing factory
|
|
4
|
+
// (`openDataPlaneConnection`); the SQL runner is the existing
|
|
5
|
+
// `applyMigrations`. This module only composes those two and always closes.
|
|
6
|
+
//
|
|
7
|
+
// Connect as the owner role from `provisionDataPlane`. The runtime role is
|
|
8
|
+
// DML-only and cannot apply schema.
|
|
9
|
+
import { applyMigrations } from '../data/migration.js';
|
|
10
|
+
import { openDataPlaneConnection, } from './data-plane-connection.js';
|
|
11
|
+
export const DATA_PLANE_MIGRATE_APPLICATION_NAME = 'plumbus-migrate';
|
|
12
|
+
function databaseNameOf(target) {
|
|
13
|
+
if (typeof target.database === 'string') {
|
|
14
|
+
return target.database;
|
|
15
|
+
}
|
|
16
|
+
return undefined;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Open one named tenant database through `openDataPlaneConnection` and apply
|
|
20
|
+
* pending migrations from `migrationsFolder`. Always closes the pool, including
|
|
21
|
+
* when apply fails.
|
|
22
|
+
*
|
|
23
|
+
* This is the host-side counterpart of `plumbus migrate apply --database`.
|
|
24
|
+
* It does not create the database or roles — call `provisionDataPlane` first.
|
|
25
|
+
*/
|
|
26
|
+
export async function applyDataPlaneMigrations(options) {
|
|
27
|
+
const connection = await openDataPlaneConnection({
|
|
28
|
+
target: options.target,
|
|
29
|
+
maxConnections: options.maxConnections ?? 1,
|
|
30
|
+
applicationName: options.applicationName ?? DATA_PLANE_MIGRATE_APPLICATION_NAME,
|
|
31
|
+
});
|
|
32
|
+
try {
|
|
33
|
+
const result = await applyMigrations({
|
|
34
|
+
db: connection.db,
|
|
35
|
+
migrationsFolder: options.migrationsFolder,
|
|
36
|
+
});
|
|
37
|
+
const database = databaseNameOf(options.target);
|
|
38
|
+
return database === undefined ? result : { ...result, database };
|
|
39
|
+
}
|
|
40
|
+
finally {
|
|
41
|
+
await connection.close();
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data-plane-migrate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-plane-migrate.js","sourceRoot":"","sources":["../../src/tenancy/data-plane-migrate.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,0EAA0E;AAC1E,0DAA0D;AAC1D,8DAA8D;AAC9D,4EAA4E;AAC5E,EAAE;AACF,2EAA2E;AAC3E,oCAAoC;AAEpC,OAAO,EAAE,eAAe,EAA6B,MAAM,sBAAsB,CAAC;AAClF,OAAO,EACL,uBAAuB,GAExB,MAAM,4BAA4B,CAAC;AAEpC,MAAM,CAAC,MAAM,mCAAmC,GAAG,iBAAiB,CAAC;AAqBrE,SAAS,cAAc,CAAC,MAAiC;IACvD,IAAI,OAAQ,MAAiC,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACpE,OAAQ,MAA+B,CAAC,QAAQ,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,OAAwC;IAExC,MAAM,UAAU,GAAG,MAAM,uBAAuB,CAAC;QAC/C,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,cAAc,EAAE,OAAO,CAAC,cAAc,IAAI,CAAC;QAC3C,eAAe,EAAE,OAAO,CAAC,eAAe,IAAI,mCAAmC;KAChF,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;YACnC,EAAE,EAAE,UAAU,CAAC,EAAE;YACjB,gBAAgB,EAAE,OAAO,CAAC,gBAAgB;SAC3C,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAChD,OAAO,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,CAAC;IACnE,CAAC;YAAS,CAAC;QACT,MAAM,UAAU,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { PlumbusError } from '../errors/plumbus-error.js';
|
|
2
|
+
import type { DatabaseConfig } from '../types/config.js';
|
|
3
|
+
/** An identifier supplied by a caller is not safe to use as a SQL identifier. */
|
|
4
|
+
export declare class DataPlaneNameError extends PlumbusError {
|
|
5
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
6
|
+
}
|
|
7
|
+
/** A destructive operation was refused because it fell outside the caller's guard. */
|
|
8
|
+
export declare class DataPlaneGuardError extends PlumbusError {
|
|
9
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
10
|
+
}
|
|
11
|
+
/** A provisioning step failed; `metadata.step` names the step that failed. */
|
|
12
|
+
export declare class DataPlaneProvisioningError extends PlumbusError {
|
|
13
|
+
constructor(message: string, metadata?: Record<string, unknown>);
|
|
14
|
+
}
|
|
15
|
+
declare const ALLOWED_TABLE_PRIVILEGES: readonly ["SELECT", "INSERT", "UPDATE", "DELETE", "TRUNCATE", "REFERENCES", "TRIGGER"];
|
|
16
|
+
export type DataPlaneTablePrivilege = (typeof ALLOWED_TABLE_PRIVILEGES)[number];
|
|
17
|
+
/**
|
|
18
|
+
* Validates a caller-supplied identifier and returns it unchanged.
|
|
19
|
+
*
|
|
20
|
+
* @param extraPattern additional convention the caller requires (e.g. a tenant
|
|
21
|
+
* database prefix). Applied on top of the framework pattern, never instead of it.
|
|
22
|
+
*/
|
|
23
|
+
export declare function assertSafeIdentifier(value: unknown, field: string, extraPattern?: RegExp): string;
|
|
24
|
+
/** Double-quotes an already-validated identifier. Defence in depth, not the defence. */
|
|
25
|
+
export declare function quoteIdentifier(value: string): string;
|
|
26
|
+
/** Admin credentials with cluster-level rights (CREATEDB + CREATEROLE, or superuser). */
|
|
27
|
+
export type DataPlaneAdminConnection = DatabaseConfig | {
|
|
28
|
+
connectionString: string;
|
|
29
|
+
};
|
|
30
|
+
export type DataPlaneStepName = 'create-role' | 'alter-role-password' | 'grant-role-membership' | 'create-database' | 'revoke-database-from-public' | 'grant-database-connect' | 'create-schema' | 'revoke-schema-from-public' | 'grant-schema-usage' | 'grant-table-privileges' | 'grant-sequence-privileges' | 'set-default-table-privileges' | 'set-default-sequence-privileges' | 'terminate-connections' | 'drop-owned' | 'drop-database' | 'drop-role';
|
|
31
|
+
export type DataPlaneStepOutcome = 'created' | 'already-present' | 'updated' | 'applied' | 'dropped' | 'absent' | 'skipped';
|
|
32
|
+
export interface DataPlaneStep {
|
|
33
|
+
step: DataPlaneStepName;
|
|
34
|
+
/** The object the step acted on (database, role or schema name). */
|
|
35
|
+
target: string;
|
|
36
|
+
outcome: DataPlaneStepOutcome;
|
|
37
|
+
/** The SQL that ran, with any password literal redacted. Empty for no-op steps. */
|
|
38
|
+
statement: string;
|
|
39
|
+
}
|
|
40
|
+
export interface DataPlaneRoleSpec {
|
|
41
|
+
name: string;
|
|
42
|
+
/** Omit to create a role without a password (peer/trust or externally managed auth). */
|
|
43
|
+
password?: string;
|
|
44
|
+
}
|
|
45
|
+
export interface ProvisionDataPlaneOptions {
|
|
46
|
+
/** Credentials able to CREATE DATABASE and CREATE ROLE on the target cluster. */
|
|
47
|
+
adminConnection: DataPlaneAdminConnection;
|
|
48
|
+
/** Database to create. Validated and quoted; never interpolated raw. */
|
|
49
|
+
databaseName: string;
|
|
50
|
+
/** Owns the database and its schemas; the identity migrations run as. */
|
|
51
|
+
ownerRole: string | DataPlaneRoleSpec;
|
|
52
|
+
/** Least-privilege identity for request-time work: DML only, no DDL. */
|
|
53
|
+
runtimeRole: string | DataPlaneRoleSpec;
|
|
54
|
+
/** Extra schemas to create alongside `public`, owned by `ownerRole`. */
|
|
55
|
+
schemas?: readonly string[];
|
|
56
|
+
/** Table privileges granted to the runtime role. Default: SELECT/INSERT/UPDATE/DELETE. */
|
|
57
|
+
runtimeTablePrivileges?: readonly string[];
|
|
58
|
+
/** `CREATE DATABASE ... TEMPLATE`. */
|
|
59
|
+
template?: string;
|
|
60
|
+
/** `CREATE DATABASE ... ENCODING`. */
|
|
61
|
+
encoding?: string;
|
|
62
|
+
/** `CREATE DATABASE ... LC_COLLATE / LC_CTYPE`. */
|
|
63
|
+
locale?: string;
|
|
64
|
+
/** Reset the password of a role that already exists. Default false. */
|
|
65
|
+
updateExistingRolePasswords?: boolean;
|
|
66
|
+
/**
|
|
67
|
+
* Naming convention the database and role names must satisfy, on top of the
|
|
68
|
+
* framework identifier pattern. Schema names are deliberately outside it: they are
|
|
69
|
+
* structural names chosen by the caller's own code (`core_plumbus`, `pkg_*`), not
|
|
70
|
+
* names drawn from a tenant's naming space. They are still validated as identifiers.
|
|
71
|
+
*/
|
|
72
|
+
namePattern?: RegExp;
|
|
73
|
+
/** Default 10. */
|
|
74
|
+
connectTimeoutSeconds?: number;
|
|
75
|
+
}
|
|
76
|
+
export interface DataPlaneProvisionResult {
|
|
77
|
+
databaseName: string;
|
|
78
|
+
ownerRole: string;
|
|
79
|
+
runtimeRole: string;
|
|
80
|
+
/** True when this call created the database, false when it was already present. */
|
|
81
|
+
databaseCreated: boolean;
|
|
82
|
+
rolesCreated: string[];
|
|
83
|
+
rolesAlreadyPresent: string[];
|
|
84
|
+
schemasCreated: string[];
|
|
85
|
+
schemasAlreadyPresent: string[];
|
|
86
|
+
/** Ordered log of every statement issued, for auditing and resumability. */
|
|
87
|
+
steps: DataPlaneStep[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Creates a tenant's data plane, idempotently.
|
|
91
|
+
*
|
|
92
|
+
* Performs, in order: owner and runtime roles, admin membership of the owner role
|
|
93
|
+
* (required to set the database owner and default privileges when the admin is not
|
|
94
|
+
* a superuser), `CREATE DATABASE` outside a transaction, database-level revocation
|
|
95
|
+
* of PUBLIC, then per-schema grants and default privileges inside the new database.
|
|
96
|
+
*
|
|
97
|
+
* Safe to re-run after a partial failure: each step reports `created` or
|
|
98
|
+
* `already-present`, so a caller can resume without special-casing.
|
|
99
|
+
*/
|
|
100
|
+
export declare function provisionDataPlane(options: ProvisionDataPlaneOptions): Promise<DataPlaneProvisionResult>;
|
|
101
|
+
export interface DropDataPlaneOptions {
|
|
102
|
+
adminConnection: DataPlaneAdminConnection;
|
|
103
|
+
databaseName: string;
|
|
104
|
+
/**
|
|
105
|
+
* Required guard. The database and every role named here must match this
|
|
106
|
+
* caller-supplied convention or nothing is dropped. There is no default: a
|
|
107
|
+
* teardown primitive without an explicit blast radius is not safe to ship.
|
|
108
|
+
*/
|
|
109
|
+
allowedNamePattern: RegExp;
|
|
110
|
+
/** Roles to drop after the database. Each must match `allowedNamePattern`. */
|
|
111
|
+
roles?: readonly string[];
|
|
112
|
+
/** Terminate sessions still attached to the database. Default true. */
|
|
113
|
+
terminateConnections?: boolean;
|
|
114
|
+
/** Default 10. */
|
|
115
|
+
connectTimeoutSeconds?: number;
|
|
116
|
+
}
|
|
117
|
+
export interface DataPlaneDropResult {
|
|
118
|
+
databaseName: string;
|
|
119
|
+
/** True when this call dropped the database, false when it was already gone. */
|
|
120
|
+
databaseDropped: boolean;
|
|
121
|
+
rolesDropped: string[];
|
|
122
|
+
rolesAbsent: string[];
|
|
123
|
+
terminatedConnections: number;
|
|
124
|
+
steps: DataPlaneStep[];
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Drops a tenant's data plane — intended for test and fixture tenants.
|
|
128
|
+
*
|
|
129
|
+
* Refuses any database or role name that does not match `allowedNamePattern`, and
|
|
130
|
+
* refuses to drop the database the admin connection is itself using. Idempotent:
|
|
131
|
+
* a second call reports `absent` rather than failing.
|
|
132
|
+
*/
|
|
133
|
+
export declare function dropDataPlane(options: DropDataPlaneOptions): Promise<DataPlaneDropResult>;
|
|
134
|
+
export {};
|
|
135
|
+
//# sourceMappingURL=data-plane-provisioning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-plane-provisioning.d.ts","sourceRoot":"","sources":["../../src/tenancy/data-plane-provisioning.ts"],"names":[],"mappings":"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"}
|