okengine 0.2.6 → 0.2.8
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/AGENTS.md +24 -23
- package/README.md +52 -346
- package/docs/spec/console.md +165 -142
- package/docs/spec/example.md +490 -312
- package/docs/spec/four-applications.md +495 -314
- package/docs/spec/unified-theory.md +184 -175
- package/package.json +45 -37
- package/spec/manifest.v1.schema.json +40 -9
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +53 -31
- package/src/auth/invoke-as.ts +1 -3
- package/src/auth/operator.ts +8 -26
- package/src/auth/planes.ts +2 -7
- package/src/auth/plugin.ts +4 -7
- package/src/auth/roles.ts +1 -5
- package/src/auth/sessions.ts +10 -39
- package/src/cli/args.ts +1 -5
- package/src/cli/ask-dev-mode.ts +40 -0
- package/src/cli/build.ts +1 -2
- package/src/cli/client-add.test.ts +8 -15
- package/src/cli/client-add.ts +5 -14
- package/src/cli/completion.test.ts +1 -5
- package/src/cli/completion.ts +4 -17
- package/src/cli/db-auto-push.test.ts +64 -0
- package/src/cli/db-auto-push.ts +72 -0
- package/src/cli/db.test.ts +189 -0
- package/src/cli/db.ts +386 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +163 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev.test.ts +148 -21
- package/src/cli/dev.ts +208 -134
- package/src/cli/doc-drift.test.ts +3 -2
- package/src/cli/doc-drift.ts +21 -50
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +7 -8
- package/src/cli/docker.ts +1 -3
- package/src/cli/doctor-diff-examples.ts +1 -3
- package/src/cli/doctor-diff.test.ts +1 -5
- package/src/cli/doctor-diff.ts +17 -46
- package/src/cli/doctor-pii.ts +2 -7
- package/src/cli/doctor.test.ts +26 -4
- package/src/cli/doctor.ts +35 -11
- package/src/cli/eval.ts +4 -14
- package/src/cli/gates-list.ts +1 -4
- package/src/cli/hero-meta.test.ts +17 -19
- package/src/cli/hero-meta.ts +20 -30
- package/src/cli/images.ts +3 -8
- package/src/cli/index.ts +11 -2
- package/src/cli/load-config.images.test.ts +14 -14
- package/src/cli/load-config.ts +41 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +45 -0
- package/src/cli/ports.test.ts +4 -13
- package/src/cli/ports.ts +1 -3
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +2 -7
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/client/budget-entry.ts +1 -6
- package/src/client/create.test.ts +6 -12
- package/src/client/create.ts +2 -8
- package/src/client/errors.ts +1 -4
- package/src/client/index.ts +1 -6
- package/src/client/notes-contract.test.ts +4 -13
- package/src/client/transport.ts +9 -30
- package/src/client/types.ts +8 -29
- package/src/compiler/aot.test.ts +2 -9
- package/src/compiler/aot.ts +1 -4
- package/src/compiler/differential.test.ts +3 -11
- package/src/compiler/dynamic.ts +1 -4
- package/src/compiler/effects-infer.ts +8 -34
- package/src/compiler/emit.ts +1 -3
- package/src/compiler/extract.test.ts +96 -30
- package/src/compiler/extract.ts +362 -156
- package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
- package/src/compiler/fixtures/skyport.expected.json +24 -83
- package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
- package/src/compiler/http-parse.ts +2 -9
- package/src/compiler/index.ts +1 -5
- package/src/compiler/response.ts +4 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +57 -34
- package/src/config/index.ts +181 -37
- package/src/config/resolve-driver.test.ts +28 -17
- package/src/console/budget.test.ts +1 -4
- package/src/console/index.ts +1 -4
- package/src/console/server/access.test.ts +15 -43
- package/src/console/server/access.ts +19 -49
- package/src/console/server/ai.test.ts +3 -11
- package/src/console/server/ai.ts +23 -46
- package/src/console/server/app.ts +14 -45
- package/src/console/server/auth-rate.test.ts +4 -12
- package/src/console/server/bind.ts +1 -5
- package/src/console/server/channels.test.ts +2 -6
- package/src/console/server/channels.ts +10 -35
- package/src/console/server/claim.ts +2 -8
- package/src/console/server/clock.test.ts +2 -6
- package/src/console/server/clock.ts +8 -26
- package/src/console/server/console.test.ts +1 -3
- package/src/console/server/diff.test.ts +5 -17
- package/src/console/server/diff.ts +10 -31
- package/src/console/server/dry-run.audit.test.ts +2 -8
- package/src/console/server/flows.ts +64 -233
- package/src/console/server/gates.test.ts +14 -50
- package/src/console/server/gates.ts +13 -48
- package/src/console/server/index.ts +2 -9
- package/src/console/server/live.ts +3 -12
- package/src/console/server/operator-db.test.ts +4 -15
- package/src/console/server/operator-db.ts +13 -32
- package/src/console/server/plugin.ts +50 -53
- package/src/console/server/plugins.test.ts +2 -6
- package/src/console/server/plugins.ts +17 -56
- package/src/console/server/runs-pii.ts +2 -7
- package/src/console/server/security.gate.test.ts +18 -40
- package/src/console/server/serve.ts +10 -25
- package/src/console/server/signals.test.ts +1 -3
- package/src/console/server/signals.ts +17 -40
- package/src/console/server/state.ts +21 -59
- package/src/console/server/store.test.ts +20 -22
- package/src/console/server/store.ts +31 -76
- package/src/console/server/vault.test.ts +12 -29
- package/src/console/server/vault.ts +23 -60
- package/src/console/ui/access/AccessA11yView.tsx +6 -21
- package/src/console/ui/access/a11y.test.tsx +3 -12
- package/src/console/ui/access/acknowledgement.test.ts +1 -4
- package/src/console/ui/access/acknowledgement.ts +1 -3
- package/src/console/ui/access/blast-radius.ts +1 -3
- package/src/console/ui/access/confirmation.test.ts +1 -5
- package/src/console/ui/access/confirmation.ts +1 -4
- package/src/console/ui/access/fixture.ts +1 -5
- package/src/console/ui/access/grantable.test.ts +1 -3
- package/src/console/ui/access/grantable.ts +2 -7
- package/src/console/ui/access/index.ts +2 -9
- package/src/console/ui/access/provenance.test.ts +1 -3
- package/src/console/ui/access/provenance.ts +2 -6
- package/src/console/ui/access/search.test.ts +1 -5
- package/src/console/ui/access/search.ts +2 -6
- package/src/console/ui/ai/AiA11yView.tsx +6 -17
- package/src/console/ui/ai/a11y.test.tsx +2 -5
- package/src/console/ui/ai/fixture.ts +2 -7
- package/src/console/ui/ai/format.ts +1 -3
- package/src/console/ui/ai/group.test.ts +1 -3
- package/src/console/ui/ai/group.ts +4 -12
- package/src/console/ui/ai/index.ts +2 -9
- package/src/console/ui/ai/promotion.test.ts +2 -7
- package/src/console/ui/ai/promotion.ts +4 -13
- package/src/console/ui/ai/search.test.ts +2 -11
- package/src/console/ui/ai/search.ts +3 -13
- package/src/console/ui/ai/types.ts +1 -8
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
- package/src/console/ui/architecture/a11y.test.tsx +1 -2
- package/src/console/ui/architecture/declared.ts +1 -5
- package/src/console/ui/architecture/index.ts +7 -35
- package/src/console/ui/architecture/layout.ts +1 -3
- package/src/console/ui/architecture/pathologies.ts +10 -19
- package/src/console/ui/architecture/search.ts +6 -15
- package/src/console/ui/architecture/traffic.ts +4 -14
- package/src/console/ui/architecture/types.ts +2 -10
- package/src/console/ui/architecture/view.test.ts +7 -19
- package/src/console/ui/architecture/view.ts +9 -36
- package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
- package/src/console/ui/channels/a11y.test.tsx +1 -2
- package/src/console/ui/channels/confirmation.test.ts +1 -4
- package/src/console/ui/channels/confirmation.ts +1 -4
- package/src/console/ui/channels/findings.ts +1 -5
- package/src/console/ui/channels/index.ts +2 -8
- package/src/console/ui/channels/locale.test.ts +1 -3
- package/src/console/ui/channels/locale.ts +2 -8
- package/src/console/ui/channels/search.ts +4 -13
- package/src/console/ui/channels/taxonomy.ts +1 -3
- package/src/console/ui/clock/ClockA11yView.tsx +9 -26
- package/src/console/ui/clock/a11y.test.tsx +2 -5
- package/src/console/ui/clock/confirmation.test.ts +1 -3
- package/src/console/ui/clock/confirmation.ts +1 -4
- package/src/console/ui/clock/findings.ts +1 -4
- package/src/console/ui/clock/health.ts +2 -7
- package/src/console/ui/clock/index.ts +2 -10
- package/src/console/ui/clock/search.test.ts +1 -3
- package/src/console/ui/clock/search.ts +2 -6
- package/src/console/ui/clock/timeline.test.ts +1 -3
- package/src/console/ui/clock/waiting-on.test.ts +1 -5
- package/src/console/ui/clock/waiting-on.ts +2 -7
- package/src/console/ui/diff/DiffA11yView.tsx +8 -17
- package/src/console/ui/diff/a11y.test.tsx +2 -5
- package/src/console/ui/diff/group.test.ts +3 -13
- package/src/console/ui/diff/group.ts +2 -8
- package/src/console/ui/diff/index.ts +2 -8
- package/src/console/ui/diff/search.test.ts +1 -5
- package/src/console/ui/diff/search.ts +4 -16
- package/src/console/ui/diff/summary.ts +1 -2
- package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
- package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
- package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
- package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
- package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
- package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
- package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
- package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
- package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
- package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
- package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
- package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
- package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
- package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
- package/src/console/ui/flows/a11y.test.tsx +2 -8
- package/src/console/ui/flows/buffer.test.ts +3 -11
- package/src/console/ui/flows/buffer.ts +4 -11
- package/src/console/ui/flows/confirmation.ts +1 -3
- package/src/console/ui/flows/contract.test.ts +3 -7
- package/src/console/ui/flows/contract.ts +12 -36
- package/src/console/ui/flows/graph.test.ts +3 -11
- package/src/console/ui/flows/graph.ts +5 -15
- package/src/console/ui/flows/index.ts +1 -6
- package/src/console/ui/flows/save-as-test.ts +1 -3
- package/src/console/ui/flows/search.ts +8 -25
- package/src/console/ui/flows/tiers.ts +2 -9
- package/src/console/ui/gates/GatesA11yView.tsx +4 -13
- package/src/console/ui/gates/a11y.test.tsx +2 -5
- package/src/console/ui/gates/audit.ts +1 -3
- package/src/console/ui/gates/denial.test.ts +1 -3
- package/src/console/ui/gates/denial.ts +4 -12
- package/src/console/ui/gates/findings.ts +1 -3
- package/src/console/ui/gates/group.test.ts +3 -3
- package/src/console/ui/gates/group.ts +3 -11
- package/src/console/ui/gates/index.ts +2 -10
- package/src/console/ui/gates/search.ts +3 -10
- package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
- package/src/console/ui/overview/a11y.test.tsx +1 -2
- package/src/console/ui/overview/busiest.ts +1 -3
- package/src/console/ui/overview/compose.ts +1 -13
- package/src/console/ui/overview/cost.ts +34 -38
- package/src/console/ui/overview/fixture.ts +21 -26
- package/src/console/ui/overview/golden.ts +4 -14
- package/src/console/ui/overview/index.ts +2 -9
- package/src/console/ui/overview/rank.test.ts +3 -10
- package/src/console/ui/overview/rank.ts +2 -7
- package/src/console/ui/overview/slo.test.ts +5 -9
- package/src/console/ui/overview/slo.ts +6 -23
- package/src/console/ui/overview/verdict.ts +3 -10
- package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
- package/src/console/ui/plugins/a11y.test.tsx +1 -2
- package/src/console/ui/plugins/fixture.ts +2 -4
- package/src/console/ui/plugins/group.test.ts +1 -3
- package/src/console/ui/plugins/group.ts +1 -6
- package/src/console/ui/plugins/index.ts +3 -13
- package/src/console/ui/plugins/search.ts +7 -19
- package/src/console/ui/runs/RunsA11yView.tsx +5 -20
- package/src/console/ui/runs/a11y.test.tsx +2 -5
- package/src/console/ui/runs/explain.ts +2 -6
- package/src/console/ui/runs/group.ts +3 -12
- package/src/console/ui/runs/histogram.test.ts +2 -11
- package/src/console/ui/runs/histogram.ts +1 -4
- package/src/console/ui/runs/index.ts +4 -18
- package/src/console/ui/runs/project.ts +2 -6
- package/src/console/ui/runs/query.test.ts +1 -3
- package/src/console/ui/runs/query.ts +12 -35
- package/src/console/ui/runs/search.ts +5 -19
- package/src/console/ui/runs/trace-link.test.ts +2 -6
- package/src/console/ui/runs/trace-link.ts +4 -16
- package/src/console/ui/runs/types.ts +1 -3
- package/src/console/ui/shell/App.tsx +2 -10
- package/src/console/ui/shell/client.ts +22 -115
- package/src/console/ui/shell/components/ui.tsx +1 -4
- package/src/console/ui/shell/layout/Shell.tsx +2 -4
- package/src/console/ui/shell/main.tsx +31 -96
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
- package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
- package/src/console/ui/shell/setup/Wizard.tsx +3 -5
- package/src/console/ui/shell/styles.css +1 -2
- package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
- package/src/console/ui/signals/a11y.test.tsx +2 -5
- package/src/console/ui/signals/confirmation.test.ts +1 -5
- package/src/console/ui/signals/confirmation.ts +2 -6
- package/src/console/ui/signals/dry-run.ts +1 -3
- package/src/console/ui/signals/durable.ts +1 -3
- package/src/console/ui/signals/findings.ts +1 -3
- package/src/console/ui/signals/group.test.ts +2 -8
- package/src/console/ui/signals/group.ts +2 -10
- package/src/console/ui/signals/index.ts +1 -4
- package/src/console/ui/signals/monitor.ts +2 -7
- package/src/console/ui/signals/schema-form.test.ts +3 -14
- package/src/console/ui/signals/schema-form.ts +1 -4
- package/src/console/ui/signals/search.ts +4 -13
- package/src/console/ui/store/StoreA11yView.tsx +3 -9
- package/src/console/ui/store/a11y.test.tsx +2 -5
- package/src/console/ui/store/confirmation.test.ts +1 -3
- package/src/console/ui/store/confirmation.ts +1 -4
- package/src/console/ui/store/dry-run.ts +2 -5
- package/src/console/ui/store/fixture.ts +1 -2
- package/src/console/ui/store/group.test.ts +1 -6
- package/src/console/ui/store/group.ts +1 -4
- package/src/console/ui/store/index.ts +1 -5
- package/src/console/ui/store/search.ts +2 -6
- package/src/console/ui/store/will-not-fire.ts +1 -2
- package/src/console/ui/traces/TracesA11yView.tsx +10 -29
- package/src/console/ui/traces/a11y.test.tsx +1 -2
- package/src/console/ui/traces/chain.test.ts +5 -19
- package/src/console/ui/traces/chain.ts +1 -3
- package/src/console/ui/traces/critical-path.test.ts +1 -3
- package/src/console/ui/traces/critical-path.ts +2 -6
- package/src/console/ui/traces/filter.test.ts +2 -6
- package/src/console/ui/traces/filter.ts +5 -13
- package/src/console/ui/traces/fold.test.ts +4 -12
- package/src/console/ui/traces/fold.ts +1 -3
- package/src/console/ui/traces/mini.ts +1 -3
- package/src/console/ui/traces/replay.test.ts +1 -3
- package/src/console/ui/traces/replay.ts +1 -3
- package/src/console/ui/traces/sampling.ts +1 -4
- package/src/console/ui/traces/search.ts +4 -17
- package/src/console/ui/traces/tier.ts +1 -3
- package/src/console/ui/vault/VaultA11yView.tsx +5 -17
- package/src/console/ui/vault/a11y.test.tsx +1 -2
- package/src/console/ui/vault/blast-radius.ts +1 -3
- package/src/console/ui/vault/confirmation.test.ts +1 -5
- package/src/console/ui/vault/confirmation.ts +1 -4
- package/src/console/ui/vault/dormant.test.ts +1 -4
- package/src/console/ui/vault/export-safe.test.ts +1 -5
- package/src/console/ui/vault/export-safe.ts +1 -4
- package/src/console/ui/vault/fixture.ts +3 -3
- package/src/console/ui/vault/group.ts +1 -2
- package/src/console/ui/vault/index.ts +2 -10
- package/src/console/ui/vault/search.ts +2 -6
- package/src/console/ui/vault/types.ts +1 -1
- package/src/console/xss.gate.test.ts +1 -3
- package/src/docker/compose.ts +112 -20
- package/src/docker/derive.ts +5 -19
- package/src/docker/docker.test.ts +15 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +4 -11
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +5 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +6 -1
- package/src/docker/recipes/rustfs.ts +33 -0
- package/src/docker/stack-id.test.ts +33 -0
- package/src/docker/stack-id.ts +25 -13
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/types.ts +13 -4
- package/src/drivers/ai-anthropic.ts +5 -14
- package/src/drivers/ai-mock.ts +2 -5
- package/src/drivers/ai-openai-compatible.ts +4 -10
- package/src/drivers/ai-providers.test.ts +6 -13
- package/src/drivers/bun-native-completeness.test.ts +6 -15
- package/src/drivers/channel-console.ts +6 -7
- package/src/drivers/channel-fcm.ts +20 -30
- package/src/drivers/channel-resend.ts +1 -3
- package/src/drivers/channel-smtp.ts +2 -6
- package/src/drivers/channel-types.ts +2 -12
- package/src/drivers/channel-unifonic.ts +2 -6
- package/src/drivers/channel-wa-cloud.ts +2 -6
- package/src/drivers/channel-webpush.ts +21 -60
- package/src/drivers/conformance.test.ts +2 -10
- package/src/drivers/conformance.ts +8 -21
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -56
- package/src/drivers/memory.ts +14 -41
- package/src/drivers/pgvector.ts +7 -11
- package/src/drivers/postgres.ts +7 -13
- package/src/drivers/redis.ts +13 -37
- package/src/drivers/s3.ts +5 -17
- package/src/drivers/signal-engine.ts +12 -49
- package/src/drivers/signal-memory.ts +2 -8
- package/src/drivers/signal-nats.ts +4 -9
- package/src/drivers/signal-postgres.ts +62 -129
- package/src/drivers/signal-redis.ts +7 -21
- package/src/drivers/signal-types.ts +1 -4
- package/src/drivers/sqlite.ts +3 -12
- package/src/drivers/types.ts +4 -23
- package/src/drivers/vault-env.ts +2 -6
- package/src/drivers/vault-infisical.ts +1 -5
- package/src/drivers/vault-managed.ts +1 -5
- package/src/drivers/vault-memory.ts +1 -5
- package/src/drivers/vault-openbao.ts +1 -5
- package/src/drivers/vault-sops.ts +10 -35
- package/src/drivers/vault-types.ts +1 -7
- package/src/elements/ai/declare.ts +4 -14
- package/src/elements/ai/eval.ts +2 -6
- package/src/elements/ai/pii.ts +1 -3
- package/src/elements/ai/runtime.ts +12 -50
- package/src/elements/ai/schema.ts +4 -15
- package/src/elements/ai.test.ts +13 -24
- package/src/elements/ai.ts +1 -5
- package/src/elements/channel/consent.ts +3 -12
- package/src/elements/channel/costs.ts +4 -15
- package/src/elements/channel/declare.ts +1 -4
- package/src/elements/channel/email-auth.ts +1 -4
- package/src/elements/channel/locale.ts +2 -10
- package/src/elements/channel/mask.ts +1 -3
- package/src/elements/channel/mime.ts +2 -12
- package/src/elements/channel/outcomes.test.ts +1 -5
- package/src/elements/channel/outcomes.ts +5 -15
- package/src/elements/channel/receipts.ts +2 -7
- package/src/elements/channel/runtime.ts +28 -74
- package/src/elements/channel/suppression.ts +8 -14
- package/src/elements/channel.test.ts +8 -31
- package/src/elements/channel.ts +3 -14
- package/src/elements/clock/actions.ts +6 -18
- package/src/elements/clock/declare.ts +1 -3
- package/src/elements/clock/dst.ts +1 -5
- package/src/elements/clock/durable.ts +4 -16
- package/src/elements/clock/health.ts +2 -7
- package/src/elements/clock/leader.ts +2 -9
- package/src/elements/clock/reconcile.ts +4 -15
- package/src/elements/clock/runtime.ts +2 -5
- package/src/elements/clock/schedule.ts +4 -20
- package/src/elements/clock.test.ts +2 -7
- package/src/elements/clock.ts +5 -23
- package/src/elements/gate/permissions.ts +1 -4
- package/src/elements/gate/runtime.ts +7 -28
- package/src/elements/gate.ts +1 -5
- package/src/elements/index.ts +9 -7
- package/src/elements/signal/declare.ts +2 -7
- package/src/elements/signal/reconcile.test.ts +1 -4
- package/src/elements/signal/runtime.ts +1 -3
- package/src/elements/signal.test.ts +3 -15
- package/src/elements/signal.ts +2 -8
- package/src/elements/store/cache.test.ts +46 -0
- package/src/elements/store/cache.ts +3 -11
- package/src/elements/store/classify.ts +5 -22
- package/src/elements/store/declare.ts +8 -17
- package/src/elements/store/domain-ddl.test.ts +86 -0
- package/src/elements/store/emit-drizzle.ts +363 -0
- package/src/elements/store/files-policy.test.ts +1 -5
- package/src/elements/store/files-policy.ts +4 -12
- package/src/elements/store/load-plugin-tables.ts +103 -0
- package/src/elements/store/missing-relation.test.ts +83 -0
- package/src/elements/store/missing-relation.ts +38 -0
- package/src/elements/store/replica.ts +1 -4
- package/src/elements/store/runtime.ts +25 -28
- package/src/elements/store/schema-decl.test.ts +227 -0
- package/src/elements/store/schema-decl.ts +516 -0
- package/src/elements/store/sql-condition.ts +11 -21
- package/src/elements/store/sql-session.test.ts +50 -0
- package/src/elements/store/sql-session.ts +60 -63
- package/src/elements/store/table.ts +35 -19
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +37 -31
- package/src/elements/vault/chain.ts +34 -0
- package/src/elements/vault/declare.ts +22 -32
- package/src/elements/vault/fingerprint.ts +2 -7
- package/src/elements/vault/redact.ts +2 -6
- package/src/elements/vault/runtime.ts +18 -32
- package/src/elements/vault.test.ts +12 -28
- package/src/elements/vault.ts +8 -12
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +34 -94
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.ts +2 -8
- package/src/kernel/boot-bind/clock.ts +2 -6
- package/src/kernel/boot-bind/gate.ts +2 -8
- package/src/kernel/boot-bind/runs.ts +1 -3
- package/src/kernel/boot-bind/signal.ts +3 -10
- package/src/kernel/boot-bind/store.test.ts +17 -17
- package/src/kernel/boot-bind/store.ts +44 -50
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -9
- package/src/kernel/boot.ts +29 -76
- package/src/kernel/budget.test.ts +1 -3
- package/src/kernel/capability.ts +3 -10
- package/src/kernel/dry-run.test.ts +1 -4
- package/src/kernel/dry-run.ts +3 -11
- package/src/kernel/effects.test.ts +1 -5
- package/src/kernel/effects.ts +4 -11
- package/src/kernel/errors.registry.test.ts +2 -8
- package/src/kernel/errors.ts +23 -32
- package/src/kernel/flow.test.ts +12 -25
- package/src/kernel/flow.ts +5 -25
- package/src/kernel/fx.test.ts +15 -44
- package/src/kernel/fx.ts +27 -79
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +10 -10
- package/src/kernel/hooks.ts +3 -12
- package/src/kernel/index.ts +4 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +1 -6
- package/src/kernel/pipeline.test.ts +10 -19
- package/src/kernel/pipeline.ts +5 -17
- package/src/kernel/plug.ts +4 -11
- package/src/kernel/plugin/conflicts.test.ts +13 -25
- package/src/kernel/plugin/decorate.test.ts +8 -13
- package/src/kernel/plugin/scoping.test.ts +4 -11
- package/src/kernel/plugin.ts +48 -24
- package/src/kernel/registry.ts +80 -29
- package/src/kernel/router.test.ts +15 -13
- package/src/kernel/router.ts +9 -29
- package/src/kernel/routing-budget.test.ts +1 -3
- package/src/kernel/run-telemetry.ts +1 -3
- package/src/kernel/triggers.ts +4 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/index.ts +2 -9
- package/src/manifest/types.ts +29 -5
- package/src/manifest/undeclared.test.ts +4 -12
- package/src/manifest/undeclared.ts +1 -2
- package/src/manifest/validate.test.ts +2 -6
- package/src/manifest/validate.ts +4 -14
- package/src/mcp/authorization.ts +8 -27
- package/src/mcp/confirmation.ts +3 -10
- package/src/mcp/data.ts +2 -6
- package/src/mcp/docs-index.ts +4 -7
- package/src/mcp/docs-mcp.test.ts +3 -12
- package/src/mcp/docs-server.ts +7 -27
- package/src/mcp/docs-tools.ts +2 -6
- package/src/mcp/index.ts +1 -6
- package/src/mcp/injection.gate.test.ts +4 -18
- package/src/mcp/mcp.test.ts +18 -49
- package/src/mcp/protocol.ts +3 -10
- package/src/mcp/server.ts +11 -52
- package/src/mcp/session.ts +4 -14
- package/src/mcp/tools.ts +14 -50
- package/src/plugins/catalogue.test.ts +3 -7
- package/src/plugins/catalogue.ts +1 -3
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/supply-chain.ts +5 -17
- package/src/release/exports.ts +3 -8
- package/src/release/measure.exports.test.ts +1 -3
- package/src/release/measure.ts +15 -43
- package/src/runs/bench.test.ts +1 -3
- package/src/runs/collect.ts +8 -25
- package/src/runs/drivers/clickhouse.ts +2 -9
- package/src/runs/drivers/files.ts +9 -31
- package/src/runs/drivers/memory.ts +5 -22
- package/src/runs/drivers/postgres.ts +8 -20
- package/src/runs/duckdb.ts +2 -8
- package/src/runs/index.ts +3 -14
- package/src/runs/outlier.ts +3 -10
- package/src/runs/parquet.ts +8 -26
- package/src/runs/privacy.ts +2 -8
- package/src/runs/runs.test.ts +3 -9
- package/src/runs/runtime.ts +7 -32
- package/src/runs/shred.ts +10 -29
- package/src/runs/types.ts +1 -4
- package/src/runtime/bun.ts +4 -15
- package/src/runtime/cold-start.bench.ts +1 -3
- package/src/runtime/dev-request-log.test.ts +1 -4
- package/src/runtime/dev-request-log.ts +1 -4
- package/src/runtime/index.ts +1 -6
- package/src/runtime/primitives.ts +5 -4
- package/src/runtime/security.ts +3 -13
- package/src/runtime/serve.test.ts +4 -7
- package/src/runtime/types.ts +1 -4
- package/src/runtime/web-standard.ts +3 -15
- package/src/term.test.ts +4 -6
- package/src/term.ts +49 -98
- package/src/test/create-test-app.test.ts +4 -14
- package/src/test/create-test-app.ts +13 -31
- package/src/test/provisions.integration.test.ts +3 -11
- package/src/upgrade/codemods.test.ts +25 -6
- package/src/upgrade/codemods.ts +116 -3
- package/src/validation/standard-schema.test.ts +2 -5
- package/src/validation/standard-schema.ts +13 -33
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
|
@@ -68,12 +68,7 @@ export interface CronStore {
|
|
|
68
68
|
* @param now - Current epoch-ms
|
|
69
69
|
* @param leaseMs - Lease TTL
|
|
70
70
|
*/
|
|
71
|
-
acquireLease(
|
|
72
|
-
name: string,
|
|
73
|
-
instanceId: string,
|
|
74
|
-
now: number,
|
|
75
|
-
leaseMs: number,
|
|
76
|
-
): Promise<boolean>;
|
|
71
|
+
acquireLease(name: string, instanceId: string, now: number, leaseMs: number): Promise<boolean>;
|
|
77
72
|
}
|
|
78
73
|
|
|
79
74
|
/** Result of one reconciliation pass. */
|
|
@@ -107,13 +102,9 @@ export async function reconcileClocks(
|
|
|
107
102
|
for (const decl of declared) {
|
|
108
103
|
const prev = await store.get(decl.name);
|
|
109
104
|
const overrideCron =
|
|
110
|
-
decl.overridable && prev?.overrideCron !== undefined
|
|
111
|
-
? prev.overrideCron
|
|
112
|
-
: undefined;
|
|
105
|
+
decl.overridable && prev?.overrideCron !== undefined ? prev.overrideCron : undefined;
|
|
113
106
|
const overrideEvery =
|
|
114
|
-
decl.overridable && prev?.overrideEvery !== undefined
|
|
115
|
-
? prev.overrideEvery
|
|
116
|
-
: undefined;
|
|
107
|
+
decl.overridable && prev?.overrideEvery !== undefined ? prev.overrideEvery : undefined;
|
|
117
108
|
|
|
118
109
|
const row: CronRow = {
|
|
119
110
|
name: decl.name,
|
|
@@ -179,9 +170,7 @@ export function effectiveSchedule(row: CronRow): {
|
|
|
179
170
|
*
|
|
180
171
|
* @param seed - Optional initial rows
|
|
181
172
|
*/
|
|
182
|
-
export function createMemoryCronStore(
|
|
183
|
-
seed?: readonly CronRow[],
|
|
184
|
-
): CronStore {
|
|
173
|
+
export function createMemoryCronStore(seed?: readonly CronRow[]): CronStore {
|
|
185
174
|
const rows = new Map<string, CronRow>();
|
|
186
175
|
for (const r of seed ?? []) {
|
|
187
176
|
rows.set(r.name, structuredClone(r));
|
|
@@ -99,12 +99,9 @@ export interface ClockRuntime {
|
|
|
99
99
|
*
|
|
100
100
|
* @param options - Instance id, store, clock
|
|
101
101
|
*/
|
|
102
|
-
export function createClockRuntime(
|
|
103
|
-
options: CreateClockRuntimeOptions = {},
|
|
104
|
-
): ClockRuntime {
|
|
102
|
+
export function createClockRuntime(options: CreateClockRuntimeOptions = {}): ClockRuntime {
|
|
105
103
|
const timeTravel = options.timeTravel;
|
|
106
|
-
const now = (): number =>
|
|
107
|
-
timeTravel ? timeTravel.now() : (options.now ?? (() => Date.now()))();
|
|
104
|
+
const now = (): number => (timeTravel ? timeTravel.now() : (options.now ?? (() => Date.now()))());
|
|
108
105
|
const store = options.store ?? createMemoryCronStore();
|
|
109
106
|
const instanceId = options.instanceId ?? crypto.randomUUID();
|
|
110
107
|
const leaseMs = options.leaseMs ?? 30_000;
|
|
@@ -15,11 +15,7 @@ import { effectiveSchedule, type CronRow } from "./reconcile.ts";
|
|
|
15
15
|
* @param from - Inclusive start epoch-ms
|
|
16
16
|
* @param until - Exclusive end epoch-ms
|
|
17
17
|
*/
|
|
18
|
-
export function nextOccurrences(
|
|
19
|
-
row: CronRow,
|
|
20
|
-
from: number,
|
|
21
|
-
until: number,
|
|
22
|
-
): readonly number[] {
|
|
18
|
+
export function nextOccurrences(row: CronRow, from: number, until: number): readonly number[] {
|
|
23
19
|
if (row.status !== "active" && row.status !== "paused") return [];
|
|
24
20
|
if (until <= from) return [];
|
|
25
21
|
|
|
@@ -75,11 +71,7 @@ export function previousOccurrence(row: CronRow, at: number): number | null {
|
|
|
75
71
|
* @param from - Exclusive lower bound (usually lastRunAt)
|
|
76
72
|
* @param until - Inclusive upper bound (usually now)
|
|
77
73
|
*/
|
|
78
|
-
export function countMissedOccurrences(
|
|
79
|
-
row: CronRow,
|
|
80
|
-
from: number,
|
|
81
|
-
until: number,
|
|
82
|
-
): number {
|
|
74
|
+
export function countMissedOccurrences(row: CronRow, from: number, until: number): number {
|
|
83
75
|
if (until <= from) return 0;
|
|
84
76
|
const sched = effectiveSchedule(row);
|
|
85
77
|
if (sched.every) {
|
|
@@ -129,11 +121,7 @@ function nextCronOccurrences(
|
|
|
129
121
|
): readonly number[] {
|
|
130
122
|
const parsed = parseSimpleDaily(cron);
|
|
131
123
|
if (!parsed) {
|
|
132
|
-
if (
|
|
133
|
-
row.nextRunAt !== undefined &&
|
|
134
|
-
row.nextRunAt >= from &&
|
|
135
|
-
row.nextRunAt < until
|
|
136
|
-
) {
|
|
124
|
+
if (row.nextRunAt !== undefined && row.nextRunAt >= from && row.nextRunAt < until) {
|
|
137
125
|
return [row.nextRunAt];
|
|
138
126
|
}
|
|
139
127
|
return [];
|
|
@@ -202,11 +190,7 @@ function civilFiresOnDay(
|
|
|
202
190
|
for (let offsetMin = -14 * 60; offsetMin <= 14 * 60; offsetMin += 15) {
|
|
203
191
|
const utc = base + parsed.hour * 3_600_000 + parsed.minute * 60_000 - offsetMin * 60_000;
|
|
204
192
|
const local = zonedParts(utc, timezone);
|
|
205
|
-
if (
|
|
206
|
-
local.date === dateStr &&
|
|
207
|
-
local.hour === parsed.hour &&
|
|
208
|
-
local.minute === parsed.minute
|
|
209
|
-
) {
|
|
193
|
+
if (local.date === dateStr && local.hour === parsed.hour && local.minute === parsed.minute) {
|
|
210
194
|
if (parsed.dow !== undefined) {
|
|
211
195
|
const localDow = zonedDow(utc, timezone);
|
|
212
196
|
if (localDow !== parsed.dow) continue;
|
|
@@ -13,10 +13,7 @@ import { tmpdir } from "node:os";
|
|
|
13
13
|
import { join } from "node:path";
|
|
14
14
|
|
|
15
15
|
import { flow } from "../kernel/flow.ts";
|
|
16
|
-
import {
|
|
17
|
-
createFileJournalStore,
|
|
18
|
-
createMemoryJournalStore,
|
|
19
|
-
} from "../kernel/journal.ts";
|
|
16
|
+
import { createFileJournalStore, createMemoryJournalStore } from "../kernel/journal.ts";
|
|
20
17
|
import {
|
|
21
18
|
clock,
|
|
22
19
|
createClockRuntime,
|
|
@@ -340,9 +337,7 @@ describe("DST ambiguity", () => {
|
|
|
340
337
|
expect(detectDstAmbiguity("0 2 * * *", "UTC")).toBeNull();
|
|
341
338
|
|
|
342
339
|
// Noon is outside the transition window for US zones.
|
|
343
|
-
expect(
|
|
344
|
-
detectDstAmbiguity("0 12 * * *", "America/New_York", Date.UTC(2026, 0, 1)),
|
|
345
|
-
).toBeNull();
|
|
340
|
+
expect(detectDstAmbiguity("0 12 * * *", "America/New_York", Date.UTC(2026, 0, 1))).toBeNull();
|
|
346
341
|
});
|
|
347
342
|
|
|
348
343
|
test("reconcile attaches dstAmbiguity on the store row", async () => {
|
package/src/elements/clock.ts
CHANGED
|
@@ -15,10 +15,7 @@ export type { ClockDecl, ClockOptions } from "./clock/declare.ts";
|
|
|
15
15
|
|
|
16
16
|
export { parseDurationMs } from "./clock/duration.ts";
|
|
17
17
|
|
|
18
|
-
export {
|
|
19
|
-
detectDstAmbiguity,
|
|
20
|
-
type DstAmbiguity,
|
|
21
|
-
} from "./clock/dst.ts";
|
|
18
|
+
export { detectDstAmbiguity, type DstAmbiguity } from "./clock/dst.ts";
|
|
22
19
|
|
|
23
20
|
export {
|
|
24
21
|
tryAcquireLease,
|
|
@@ -38,10 +35,7 @@ export {
|
|
|
38
35
|
type ReconcileResult,
|
|
39
36
|
} from "./clock/reconcile.ts";
|
|
40
37
|
|
|
41
|
-
export {
|
|
42
|
-
createTimeTravel,
|
|
43
|
-
type TimeTravel,
|
|
44
|
-
} from "./clock/time-travel.ts";
|
|
38
|
+
export { createTimeTravel, type TimeTravel } from "./clock/time-travel.ts";
|
|
45
39
|
|
|
46
40
|
export {
|
|
47
41
|
createClockRuntime,
|
|
@@ -51,23 +45,11 @@ export {
|
|
|
51
45
|
type CronHandler,
|
|
52
46
|
} from "./clock/runtime.ts";
|
|
53
47
|
|
|
54
|
-
export {
|
|
55
|
-
runDurable,
|
|
56
|
-
type DurableResult,
|
|
57
|
-
type RunDurableOptions,
|
|
58
|
-
} from "./clock/durable.ts";
|
|
48
|
+
export { runDurable, type DurableResult, type RunDurableOptions } from "./clock/durable.ts";
|
|
59
49
|
|
|
60
|
-
export {
|
|
61
|
-
cronHealth,
|
|
62
|
-
type CatchUpPolicy,
|
|
63
|
-
type CronHealth,
|
|
64
|
-
} from "./clock/health.ts";
|
|
50
|
+
export { cronHealth, type CatchUpPolicy, type CronHealth } from "./clock/health.ts";
|
|
65
51
|
|
|
66
|
-
export {
|
|
67
|
-
nextOccurrences,
|
|
68
|
-
previousOccurrence,
|
|
69
|
-
countMissedOccurrences,
|
|
70
|
-
} from "./clock/schedule.ts";
|
|
52
|
+
export { nextOccurrences, previousOccurrence, countMissedOccurrences } from "./clock/schedule.ts";
|
|
71
53
|
|
|
72
54
|
export {
|
|
73
55
|
pauseCron,
|
|
@@ -81,10 +81,7 @@ function effectToAction(ref: string, op: "read" | "write"): string {
|
|
|
81
81
|
return `store.${facet}:${op}`;
|
|
82
82
|
}
|
|
83
83
|
|
|
84
|
-
function collectEffects(
|
|
85
|
-
manifest: Manifest,
|
|
86
|
-
kind: "reads" | "writes",
|
|
87
|
-
): string[] {
|
|
84
|
+
function collectEffects(manifest: Manifest, kind: "reads" | "writes"): string[] {
|
|
88
85
|
const out: string[] = [];
|
|
89
86
|
for (const flow of Object.values(manifest.flows ?? {})) {
|
|
90
87
|
const list = flow.effects?.[kind];
|
|
@@ -8,11 +8,7 @@ import { takeRate } from "./strategies.ts";
|
|
|
8
8
|
|
|
9
9
|
/** KV surface required for rate gates. */
|
|
10
10
|
export interface GateKv {
|
|
11
|
-
eval<T = unknown>(
|
|
12
|
-
script: string,
|
|
13
|
-
keys: readonly string[],
|
|
14
|
-
args?: readonly string[],
|
|
15
|
-
): Promise<T>;
|
|
11
|
+
eval<T = unknown>(script: string, keys: readonly string[], args?: readonly string[]): Promise<T>;
|
|
16
12
|
}
|
|
17
13
|
|
|
18
14
|
/** Options for {@link createGateRuntime}. */
|
|
@@ -45,20 +41,14 @@ export interface GateRuntime {
|
|
|
45
41
|
* @param names - Gate names / rate ids
|
|
46
42
|
* @param ctx - Policy context
|
|
47
43
|
*/
|
|
48
|
-
check(
|
|
49
|
-
names: readonly string[],
|
|
50
|
-
ctx: GatePolicyContext,
|
|
51
|
-
): Promise<GateEvaluation[]>;
|
|
44
|
+
check(names: readonly string[], ctx: GatePolicyContext): Promise<GateEvaluation[]>;
|
|
52
45
|
/**
|
|
53
46
|
* Whether every gate in the chain allows.
|
|
54
47
|
*
|
|
55
48
|
* @param names - Gate names
|
|
56
49
|
* @param ctx - Policy context
|
|
57
50
|
*/
|
|
58
|
-
allow(
|
|
59
|
-
names: readonly string[],
|
|
60
|
-
ctx: GatePolicyContext,
|
|
61
|
-
): Promise<boolean>;
|
|
51
|
+
allow(names: readonly string[], ctx: GatePolicyContext): Promise<boolean>;
|
|
62
52
|
}
|
|
63
53
|
|
|
64
54
|
/**
|
|
@@ -66,19 +56,14 @@ export interface GateRuntime {
|
|
|
66
56
|
*
|
|
67
57
|
* @param options - Declarations + kv
|
|
68
58
|
*/
|
|
69
|
-
export function createGateRuntime(
|
|
70
|
-
options: CreateGateRuntimeOptions = {},
|
|
71
|
-
): GateRuntime {
|
|
59
|
+
export function createGateRuntime(options: CreateGateRuntimeOptions = {}): GateRuntime {
|
|
72
60
|
const map = new Map<string, GateDecl>();
|
|
73
61
|
for (const g of options.gates ?? []) {
|
|
74
62
|
map.set(g.name, g);
|
|
75
63
|
}
|
|
76
64
|
const now = options.now ?? (() => Date.now());
|
|
77
65
|
|
|
78
|
-
async function evaluateOne(
|
|
79
|
-
name: string,
|
|
80
|
-
ctx: GatePolicyContext,
|
|
81
|
-
): Promise<GateEvaluation> {
|
|
66
|
+
async function evaluateOne(name: string, ctx: GatePolicyContext): Promise<GateEvaluation> {
|
|
82
67
|
const decl = map.get(name);
|
|
83
68
|
if (!decl) {
|
|
84
69
|
return {
|
|
@@ -100,10 +85,7 @@ export function createGateRuntime(
|
|
|
100
85
|
return evaluateRate(decl, ctx);
|
|
101
86
|
}
|
|
102
87
|
|
|
103
|
-
async function evaluateRate(
|
|
104
|
-
decl: RateGateDecl,
|
|
105
|
-
ctx: GatePolicyContext,
|
|
106
|
-
): Promise<GateEvaluation> {
|
|
88
|
+
async function evaluateRate(decl: RateGateDecl, ctx: GatePolicyContext): Promise<GateEvaluation> {
|
|
107
89
|
if (!options.kv) {
|
|
108
90
|
return {
|
|
109
91
|
name: decl.name,
|
|
@@ -157,10 +139,7 @@ export function createGateRuntime(
|
|
|
157
139
|
};
|
|
158
140
|
}
|
|
159
141
|
|
|
160
|
-
function resolveSubject(
|
|
161
|
-
keyBy: string | undefined,
|
|
162
|
-
ctx: GatePolicyContext,
|
|
163
|
-
): string {
|
|
142
|
+
function resolveSubject(keyBy: string | undefined, ctx: GatePolicyContext): string {
|
|
164
143
|
switch (keyBy) {
|
|
165
144
|
case "user":
|
|
166
145
|
return ctx.auth.userId ?? ctx.meta?.userId ?? "anon";
|
package/src/elements/gate.ts
CHANGED
|
@@ -35,8 +35,4 @@ export {
|
|
|
35
35
|
type TakeRateOptions,
|
|
36
36
|
} from "./gate/strategies.ts";
|
|
37
37
|
|
|
38
|
-
export {
|
|
39
|
-
deriveModuleActions,
|
|
40
|
-
flowIdToAction,
|
|
41
|
-
formatGatesList,
|
|
42
|
-
} from "./gate/permissions.ts";
|
|
38
|
+
export { deriveModuleActions, flowIdToAction, formatGatesList } from "./gate/permissions.ts";
|
package/src/elements/index.ts
CHANGED
|
@@ -12,6 +12,9 @@ export {
|
|
|
12
12
|
id,
|
|
13
13
|
now,
|
|
14
14
|
defineTable,
|
|
15
|
+
field,
|
|
16
|
+
schemaTable,
|
|
17
|
+
schemaRelations,
|
|
15
18
|
createStoreRuntime,
|
|
16
19
|
createStoreCache,
|
|
17
20
|
computedCacheKey,
|
|
@@ -32,6 +35,9 @@ export type {
|
|
|
32
35
|
SqlStoreHandle,
|
|
33
36
|
TableHandle,
|
|
34
37
|
ColumnDef,
|
|
38
|
+
SchemaTableDecl,
|
|
39
|
+
SchemaColumnDecl,
|
|
40
|
+
SchemaRelationsDecl,
|
|
35
41
|
} from "./store.ts";
|
|
36
42
|
|
|
37
43
|
export { signal, createSignalRuntime } from "./signal.ts";
|
|
@@ -52,13 +58,7 @@ export {
|
|
|
52
58
|
detectDstAmbiguity,
|
|
53
59
|
parseDurationMs,
|
|
54
60
|
} from "./clock.ts";
|
|
55
|
-
export type {
|
|
56
|
-
ClockDecl,
|
|
57
|
-
ClockOptions,
|
|
58
|
-
ClockRuntime,
|
|
59
|
-
TimeTravel,
|
|
60
|
-
DurableResult,
|
|
61
|
-
} from "./clock.ts";
|
|
61
|
+
export type { ClockDecl, ClockOptions, ClockRuntime, TimeTravel, DurableResult } from "./clock.ts";
|
|
62
62
|
|
|
63
63
|
export {
|
|
64
64
|
gate,
|
|
@@ -86,6 +86,8 @@ export {
|
|
|
86
86
|
fingerprintSecretSync,
|
|
87
87
|
createSecretRedactor,
|
|
88
88
|
resolveLayerSource,
|
|
89
|
+
COMPOSE_ENV_REL,
|
|
90
|
+
resolveComposeEnvPath,
|
|
89
91
|
} from "./vault.ts";
|
|
90
92
|
export type {
|
|
91
93
|
VaultSecretDecl,
|
|
@@ -53,18 +53,13 @@ export interface SignalDecl<T = unknown> {
|
|
|
53
53
|
* @param name - Signal name
|
|
54
54
|
* @param options - Delivery physics and retry / DLQ policy
|
|
55
55
|
*/
|
|
56
|
-
export function signal<T = unknown>(
|
|
57
|
-
name: string,
|
|
58
|
-
options: SignalOptions,
|
|
59
|
-
): SignalDecl<T> {
|
|
56
|
+
export function signal<T = unknown>(name: string, options: SignalOptions): SignalDecl<T> {
|
|
60
57
|
if (
|
|
61
58
|
options.delivery !== "once" &&
|
|
62
59
|
options.delivery !== "broadcast" &&
|
|
63
60
|
options.delivery !== "live"
|
|
64
61
|
) {
|
|
65
|
-
throw new TypeError(
|
|
66
|
-
`signal("${name}"): delivery is mandatory (once | broadcast | live)`,
|
|
67
|
-
);
|
|
62
|
+
throw new TypeError(`signal("${name}"): delivery is mandatory (once | broadcast | live)`);
|
|
68
63
|
}
|
|
69
64
|
return {
|
|
70
65
|
name,
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
import { signal } from "./declare.ts";
|
|
3
|
-
import {
|
|
4
|
-
createMemorySignalConfigStore,
|
|
5
|
-
reconcileSignals,
|
|
6
|
-
} from "./reconcile.ts";
|
|
3
|
+
import { createMemorySignalConfigStore, reconcileSignals } from "./reconcile.ts";
|
|
7
4
|
|
|
8
5
|
describe("reconcileSignals", () => {
|
|
9
6
|
test("marks a removed signal orphaned without deleting it", async () => {
|
|
@@ -52,9 +52,7 @@ export interface SignalRuntime {
|
|
|
52
52
|
*
|
|
53
53
|
* @param options - Driver and bindings
|
|
54
54
|
*/
|
|
55
|
-
export function createSignalRuntime(
|
|
56
|
-
options: CreateSignalRuntimeOptions,
|
|
57
|
-
): SignalRuntime {
|
|
55
|
+
export function createSignalRuntime(options: CreateSignalRuntimeOptions): SignalRuntime {
|
|
58
56
|
const declarations = new Map<string, SignalDecl>();
|
|
59
57
|
let bus: SignalBus | null = null;
|
|
60
58
|
|
|
@@ -205,9 +205,7 @@ for (const { label, driver, setup } of drivers) {
|
|
|
205
205
|
attempt: 1,
|
|
206
206
|
});
|
|
207
207
|
expect(dlq[0]!.failures[0]!.message).toContain("boom-");
|
|
208
|
-
expect(dlq[0]!.failures.map((f) => f.attempt)).toEqual(
|
|
209
|
-
dlq[0]!.failures.map((_, i) => i + 1),
|
|
210
|
-
);
|
|
208
|
+
expect(dlq[0]!.failures.map((f) => f.attempt)).toEqual(dlq[0]!.failures.map((_, i) => i + 1));
|
|
211
209
|
});
|
|
212
210
|
});
|
|
213
211
|
}
|
|
@@ -303,12 +301,7 @@ describe("chaos — kill process mid-transaction", () => {
|
|
|
303
301
|
const durablePath = join(dir, "bus.json");
|
|
304
302
|
try {
|
|
305
303
|
const child = Bun.spawn({
|
|
306
|
-
cmd: [
|
|
307
|
-
"bun",
|
|
308
|
-
join(import.meta.dir, "signal/chaos-child.ts"),
|
|
309
|
-
durablePath,
|
|
310
|
-
"mid-txn",
|
|
311
|
-
],
|
|
304
|
+
cmd: ["bun", join(import.meta.dir, "signal/chaos-child.ts"), durablePath, "mid-txn"],
|
|
312
305
|
stdout: "pipe",
|
|
313
306
|
stderr: "pipe",
|
|
314
307
|
});
|
|
@@ -406,12 +399,7 @@ describe("chaos — kill process mid-transaction", () => {
|
|
|
406
399
|
const durablePath = join(dir, "bus.json");
|
|
407
400
|
try {
|
|
408
401
|
const child = Bun.spawn({
|
|
409
|
-
cmd: [
|
|
410
|
-
"bun",
|
|
411
|
-
join(import.meta.dir, "signal/chaos-child.ts"),
|
|
412
|
-
durablePath,
|
|
413
|
-
"commit",
|
|
414
|
-
],
|
|
402
|
+
cmd: ["bun", join(import.meta.dir, "signal/chaos-child.ts"), durablePath, "commit"],
|
|
415
403
|
stdout: "pipe",
|
|
416
404
|
stderr: "pipe",
|
|
417
405
|
});
|
package/src/elements/signal.ts
CHANGED
|
@@ -10,15 +10,9 @@ export { signal } from "./signal/declare.ts";
|
|
|
10
10
|
export type { SignalDecl, SignalOptions } from "./signal/declare.ts";
|
|
11
11
|
|
|
12
12
|
export { createSignalRuntime } from "./signal/runtime.ts";
|
|
13
|
-
export type {
|
|
14
|
-
CreateSignalRuntimeOptions,
|
|
15
|
-
SignalRuntime,
|
|
16
|
-
} from "./signal/runtime.ts";
|
|
13
|
+
export type { CreateSignalRuntimeOptions, SignalRuntime } from "./signal/runtime.ts";
|
|
17
14
|
|
|
18
|
-
export {
|
|
19
|
-
reconcileSignals,
|
|
20
|
-
createMemorySignalConfigStore,
|
|
21
|
-
} from "./signal/reconcile.ts";
|
|
15
|
+
export { reconcileSignals, createMemorySignalConfigStore } from "./signal/reconcile.ts";
|
|
22
16
|
export type {
|
|
23
17
|
SignalConfigRow,
|
|
24
18
|
SignalConfigStatus,
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tier-1 cache exactness lock — invalidation keys off declared resources.
|
|
3
|
+
*
|
|
4
|
+
* A write invalidates a cached read only when the written resource appears
|
|
5
|
+
* in that read's `effects.reads`. A read that recorded only its root table
|
|
6
|
+
* is NOT invalidated by a write to a related table — which is exactly why
|
|
7
|
+
* relational `with:` is not exposed through `fx` (silent staleness hazard).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { describe, expect, test } from "bun:test";
|
|
11
|
+
import type { Effects } from "../../manifest/types.ts";
|
|
12
|
+
import {
|
|
13
|
+
computedCacheKey,
|
|
14
|
+
createStoreCache,
|
|
15
|
+
isInvalidatedByWrite,
|
|
16
|
+
tier1KeysForReads,
|
|
17
|
+
} from "./cache.ts";
|
|
18
|
+
|
|
19
|
+
describe("tier-1 cache — exact per-resource invalidation (path b)", () => {
|
|
20
|
+
test("a write invalidates only reads that declared the written resource", () => {
|
|
21
|
+
const cache = createStoreCache();
|
|
22
|
+
|
|
23
|
+
// Root-only read — what a half-shipped `with:` expansion would record.
|
|
24
|
+
const rootOnly: Effects = { reads: ["sql:links"] };
|
|
25
|
+
const keys = tier1KeysForReads(rootOnly);
|
|
26
|
+
expect(keys).toEqual([computedCacheKey("sql:links")]);
|
|
27
|
+
|
|
28
|
+
cache.set({
|
|
29
|
+
tier: 1,
|
|
30
|
+
key: keys[0]!,
|
|
31
|
+
value: [{ id: "l1" }],
|
|
32
|
+
resources: ["sql:links"],
|
|
33
|
+
expiresAt: null,
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// A write to the related table does not invalidate the root-only read.
|
|
37
|
+
expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:daily"] })).toBe(false);
|
|
38
|
+
expect(cache.invalidateFromEffects({ writes: ["sql:daily"] }).keys).toEqual([]);
|
|
39
|
+
expect(cache.get(keys[0]!)).toBeDefined();
|
|
40
|
+
|
|
41
|
+
// Exact match on the declared resource still invalidates.
|
|
42
|
+
expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:links"] })).toBe(true);
|
|
43
|
+
expect(cache.invalidateFromEffects({ writes: ["sql:links"] }).keys).toEqual(keys);
|
|
44
|
+
expect(cache.get(keys[0]!)).toBeUndefined();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
@@ -38,10 +38,7 @@ export interface InvalidationEvent {
|
|
|
38
38
|
* @param resource - Store resource ref
|
|
39
39
|
* @param dims - Optional dimension suffixes (e.g. `userId`)
|
|
40
40
|
*/
|
|
41
|
-
export function computedCacheKey(
|
|
42
|
-
resource: ResourceRef,
|
|
43
|
-
dims?: readonly string[],
|
|
44
|
-
): string {
|
|
41
|
+
export function computedCacheKey(resource: ResourceRef, dims?: readonly string[]): string {
|
|
45
42
|
if (!dims || dims.length === 0) return `computed:${resource}`;
|
|
46
43
|
return `computed:${resource}/${dims.join("/")}`;
|
|
47
44
|
}
|
|
@@ -57,9 +54,7 @@ export function tier1KeysForReads(
|
|
|
57
54
|
dimsByResource?: Readonly<Record<string, readonly string[]>>,
|
|
58
55
|
): string[] {
|
|
59
56
|
const reads = effects.reads ?? [];
|
|
60
|
-
return reads.map((resource) =>
|
|
61
|
-
computedCacheKey(resource, dimsByResource?.[resource]),
|
|
62
|
-
);
|
|
57
|
+
return reads.map((resource) => computedCacheKey(resource, dimsByResource?.[resource]));
|
|
63
58
|
}
|
|
64
59
|
|
|
65
60
|
/**
|
|
@@ -79,10 +74,7 @@ export function resourcesTouchedByWrites(effects: Effects): ResourceRef[] {
|
|
|
79
74
|
* @param key - Tier-1 cache key (`computed:…`)
|
|
80
75
|
* @param writeEffects - Effects of the writing flow
|
|
81
76
|
*/
|
|
82
|
-
export function isInvalidatedByWrite(
|
|
83
|
-
key: string,
|
|
84
|
-
writeEffects: Effects,
|
|
85
|
-
): boolean {
|
|
77
|
+
export function isInvalidatedByWrite(key: string, writeEffects: Effects): boolean {
|
|
86
78
|
if (!key.startsWith("computed:")) return false;
|
|
87
79
|
const body = key.slice("computed:".length);
|
|
88
80
|
const resource = body.split("/")[0] ?? "";
|
|
@@ -4,11 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
6
|
import type { ColumnClassification } from "../../manifest/types.ts";
|
|
7
|
-
import {
|
|
8
|
-
classificationKey,
|
|
9
|
-
type ClassificationMap,
|
|
10
|
-
type SqlRow,
|
|
11
|
-
} from "../../drivers/types.ts";
|
|
7
|
+
import { classificationKey, type ClassificationMap, type SqlRow } from "../../drivers/types.ts";
|
|
12
8
|
|
|
13
9
|
/** Default mask token for PII columns when reveal is denied. */
|
|
14
10
|
export const PII_MASK = "[redacted]";
|
|
@@ -21,9 +17,7 @@ export const PII_MASK = "[redacted]";
|
|
|
21
17
|
*
|
|
22
18
|
* @param classification - Tags to attach
|
|
23
19
|
*/
|
|
24
|
-
export function classify(
|
|
25
|
-
classification: ColumnClassification,
|
|
26
|
-
): ColumnClassification {
|
|
20
|
+
export function classify(classification: ColumnClassification): ColumnClassification {
|
|
27
21
|
return { ...classification };
|
|
28
22
|
}
|
|
29
23
|
|
|
@@ -33,9 +27,7 @@ export function classify(
|
|
|
33
27
|
* @param tables - Per-table column classifications
|
|
34
28
|
*/
|
|
35
29
|
export function buildClassificationMap(
|
|
36
|
-
tables: Readonly<
|
|
37
|
-
Record<string, Readonly<Record<string, ColumnClassification>>>
|
|
38
|
-
>,
|
|
30
|
+
tables: Readonly<Record<string, Readonly<Record<string, ColumnClassification>>>>,
|
|
39
31
|
): ClassificationMap {
|
|
40
32
|
const map = new Map<string, ColumnClassification>();
|
|
41
33
|
for (const [table, cols] of Object.entries(tables)) {
|
|
@@ -90,10 +82,7 @@ export interface MaskRowsOptions {
|
|
|
90
82
|
* @param rows - Raw driver rows
|
|
91
83
|
* @param options - Classification + reveal policy
|
|
92
84
|
*/
|
|
93
|
-
export function maskRows(
|
|
94
|
-
rows: readonly SqlRow[],
|
|
95
|
-
options: MaskRowsOptions,
|
|
96
|
-
): SqlRow[] {
|
|
85
|
+
export function maskRows(rows: readonly SqlRow[], options: MaskRowsOptions): SqlRow[] {
|
|
97
86
|
if (options.revealPii || options.classifications.size === 0) {
|
|
98
87
|
return rows.map((r) => ({ ...r }));
|
|
99
88
|
}
|
|
@@ -101,13 +90,7 @@ export function maskRows(
|
|
|
101
90
|
return rows.map((row) => {
|
|
102
91
|
const out: SqlRow = {};
|
|
103
92
|
for (const [column, value] of Object.entries(row)) {
|
|
104
|
-
out[column] = isPiiColumn(
|
|
105
|
-
options.classifications,
|
|
106
|
-
options.table,
|
|
107
|
-
column,
|
|
108
|
-
)
|
|
109
|
-
? mask
|
|
110
|
-
: value;
|
|
93
|
+
out[column] = isPiiColumn(options.classifications, options.table, column) ? mask : value;
|
|
111
94
|
}
|
|
112
95
|
return out;
|
|
113
96
|
});
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
7
|
import type { ColumnClassification, ResourceRef, StoreFacet } from "../../manifest/types.ts";
|
|
8
|
+
import { schema } from "./schema-decl.ts";
|
|
8
9
|
import { resolveTableName, type TableHandle } from "./table.ts";
|
|
9
10
|
|
|
10
11
|
/** CDC trigger shape (mirrors kernel `CdcTrigger` without importing it). */
|
|
@@ -47,9 +48,7 @@ export interface SqlStoreOptions {
|
|
|
47
48
|
* Explicit classifications: `table → column → tags`.
|
|
48
49
|
* Merged with schema-derived tags; wins on conflict for the same column.
|
|
49
50
|
*/
|
|
50
|
-
readonly classify?: Readonly<
|
|
51
|
-
Record<string, Readonly<Record<string, ColumnClassification>>>
|
|
52
|
-
>;
|
|
51
|
+
readonly classify?: Readonly<Record<string, Readonly<Record<string, ColumnClassification>>>>;
|
|
53
52
|
}
|
|
54
53
|
|
|
55
54
|
/** SQL store declaration. */
|
|
@@ -106,11 +105,7 @@ export interface IndexStoreDecl extends StoreDeclBase {
|
|
|
106
105
|
}
|
|
107
106
|
|
|
108
107
|
/** Any store declaration. */
|
|
109
|
-
export type StoreDecl =
|
|
110
|
-
| SqlStoreDecl
|
|
111
|
-
| KvStoreDecl
|
|
112
|
-
| FilesStoreDecl
|
|
113
|
-
| IndexStoreDecl;
|
|
108
|
+
export type StoreDecl = SqlStoreDecl | KvStoreDecl | FilesStoreDecl | IndexStoreDecl;
|
|
114
109
|
|
|
115
110
|
/**
|
|
116
111
|
* Declare a SQL store.
|
|
@@ -161,10 +156,7 @@ export function kv(name: string, options: KvStoreOptions = {}): KvStoreDecl {
|
|
|
161
156
|
* @param name - Bucket name
|
|
162
157
|
* @param options - Options
|
|
163
158
|
*/
|
|
164
|
-
export function files(
|
|
165
|
-
name: string,
|
|
166
|
-
options: FilesStoreOptions = {},
|
|
167
|
-
): FilesStoreDecl {
|
|
159
|
+
export function files(name: string, options: FilesStoreOptions = {}): FilesStoreDecl {
|
|
168
160
|
return {
|
|
169
161
|
facet: "files",
|
|
170
162
|
name,
|
|
@@ -179,10 +171,7 @@ export function files(
|
|
|
179
171
|
* @param name - Index name
|
|
180
172
|
* @param options - Dimensions
|
|
181
173
|
*/
|
|
182
|
-
export function index(
|
|
183
|
-
name: string,
|
|
184
|
-
options: IndexStoreOptions = {},
|
|
185
|
-
): IndexStoreDecl {
|
|
174
|
+
export function index(name: string, options: IndexStoreOptions = {}): IndexStoreDecl {
|
|
186
175
|
return {
|
|
187
176
|
facet: "index",
|
|
188
177
|
name,
|
|
@@ -191,10 +180,12 @@ export function index(
|
|
|
191
180
|
};
|
|
192
181
|
}
|
|
193
182
|
|
|
194
|
-
/** Public `store` element — four facets. */
|
|
183
|
+
/** Public `store` element — four facets + abstract schema declare. */
|
|
195
184
|
export const store = {
|
|
196
185
|
sql,
|
|
197
186
|
kv,
|
|
198
187
|
files,
|
|
199
188
|
index,
|
|
189
|
+
/** ORM-agnostic table declarations (`store.schema.table`). */
|
|
190
|
+
schema,
|
|
200
191
|
} as const;
|