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
|
@@ -7,11 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import type { SignalDecl } from "../elements/signal/declare.ts";
|
|
9
9
|
import type { SignalDelivery } from "../manifest/types.ts";
|
|
10
|
-
import {
|
|
11
|
-
DryRunWriteIsolationError,
|
|
12
|
-
setDryRunMessageId,
|
|
13
|
-
withDryRun,
|
|
14
|
-
} from "../kernel/dry-run.ts";
|
|
10
|
+
import { DryRunWriteIsolationError, setDryRunMessageId, withDryRun } from "../kernel/dry-run.ts";
|
|
15
11
|
import type {
|
|
16
12
|
DeadLetter,
|
|
17
13
|
LiveHandler,
|
|
@@ -141,7 +137,10 @@ export function createPostgresSignalFake(options?: {
|
|
|
141
137
|
};
|
|
142
138
|
}
|
|
143
139
|
|
|
144
|
-
const api: PostgresSignalSql & {
|
|
140
|
+
const api: PostgresSignalSql & {
|
|
141
|
+
killActiveTransaction(): void;
|
|
142
|
+
_ensureReady: () => Promise<void>;
|
|
143
|
+
} = {
|
|
145
144
|
_ensureReady: ensureReady,
|
|
146
145
|
killActiveTransaction() {
|
|
147
146
|
active = null;
|
|
@@ -180,9 +179,7 @@ export function createPostgresSignalFake(options?: {
|
|
|
180
179
|
);
|
|
181
180
|
if (selMsg) {
|
|
182
181
|
return state.messages
|
|
183
|
-
.filter(
|
|
184
|
-
(m) => m.signal === params[0] && m.status === params[1],
|
|
185
|
-
)
|
|
182
|
+
.filter((m) => m.signal === params[0] && m.status === params[1])
|
|
186
183
|
.map((m) => ({ ...m }));
|
|
187
184
|
}
|
|
188
185
|
|
|
@@ -197,33 +194,24 @@ export function createPostgresSignalFake(options?: {
|
|
|
197
194
|
}
|
|
198
195
|
|
|
199
196
|
const selAll =
|
|
200
|
-
/^SELECT\s+\*\s+FROM\s+oke_signal_messages\s+WHERE\s+signal\s*=\s*\?\s*$/i.exec(
|
|
201
|
-
text,
|
|
202
|
-
);
|
|
197
|
+
/^SELECT\s+\*\s+FROM\s+oke_signal_messages\s+WHERE\s+signal\s*=\s*\?\s*$/i.exec(text);
|
|
203
198
|
if (selAll) {
|
|
204
|
-
return state.messages
|
|
205
|
-
.filter((m) => m.signal === params[0])
|
|
206
|
-
.map((m) => ({ ...m }));
|
|
199
|
+
return state.messages.filter((m) => m.signal === params[0]).map((m) => ({ ...m }));
|
|
207
200
|
}
|
|
208
201
|
|
|
209
202
|
const selWrite =
|
|
210
|
-
/^SELECT\s+value\s+FROM\s+oke_signal_writes\s+WHERE\s+key\s*=\s*\?\s*$/i.exec(
|
|
211
|
-
text,
|
|
212
|
-
);
|
|
203
|
+
/^SELECT\s+value\s+FROM\s+oke_signal_writes\s+WHERE\s+key\s*=\s*\?\s*$/i.exec(text);
|
|
213
204
|
if (selWrite) {
|
|
214
205
|
const v = state.writes.get(String(params[0]));
|
|
215
206
|
if (v === undefined) return [];
|
|
216
207
|
return [{ value: JSON.stringify(v) }];
|
|
217
208
|
}
|
|
218
209
|
|
|
219
|
-
const byId =
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
);
|
|
210
|
+
const byId = /^SELECT\s+\*\s+FROM\s+oke_signal_messages\s+WHERE\s+id\s*=\s*\?\s*$/i.exec(
|
|
211
|
+
text,
|
|
212
|
+
);
|
|
223
213
|
if (byId) {
|
|
224
|
-
return state.messages
|
|
225
|
-
.filter((m) => m.id === params[0])
|
|
226
|
-
.map((m) => ({ ...m }));
|
|
214
|
+
return state.messages.filter((m) => m.id === params[0]).map((m) => ({ ...m }));
|
|
227
215
|
}
|
|
228
216
|
|
|
229
217
|
const selLive =
|
|
@@ -253,11 +241,7 @@ export function createPostgresSignalFake(options?: {
|
|
|
253
241
|
let changes = 0;
|
|
254
242
|
for (let i = state.messages.length - 1; i >= 0; i--) {
|
|
255
243
|
const m = state.messages[i]!;
|
|
256
|
-
if (
|
|
257
|
-
m.id === params[0] &&
|
|
258
|
-
m.signal === params[1] &&
|
|
259
|
-
m.status === "dead"
|
|
260
|
-
) {
|
|
244
|
+
if (m.id === params[0] && m.signal === params[1] && m.status === "dead") {
|
|
261
245
|
state.messages.splice(i, 1);
|
|
262
246
|
changes += 1;
|
|
263
247
|
}
|
|
@@ -266,9 +250,7 @@ export function createPostgresSignalFake(options?: {
|
|
|
266
250
|
}
|
|
267
251
|
|
|
268
252
|
const insertMsg =
|
|
269
|
-
/^INSERT\s+INTO\s+oke_signal_messages\s*\(([^)]+)\)\s*VALUES\s*\(([^)]+)\)\s*$/i.exec(
|
|
270
|
-
text,
|
|
271
|
-
);
|
|
253
|
+
/^INSERT\s+INTO\s+oke_signal_messages\s*\(([^)]+)\)\s*VALUES\s*\(([^)]+)\)\s*$/i.exec(text);
|
|
272
254
|
if (insertMsg) {
|
|
273
255
|
const cols = insertMsg[1]!.split(",").map((c) => c.trim());
|
|
274
256
|
const row: Record<string, unknown> = {};
|
|
@@ -300,10 +282,9 @@ export function createPostgresSignalFake(options?: {
|
|
|
300
282
|
return { changes: 1 };
|
|
301
283
|
}
|
|
302
284
|
|
|
303
|
-
const upd =
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
);
|
|
285
|
+
const upd = /^UPDATE\s+oke_signal_messages\s+SET\s+(.+)\s+WHERE\s+id\s*=\s*\?\s*$/i.exec(
|
|
286
|
+
text,
|
|
287
|
+
);
|
|
307
288
|
if (upd) {
|
|
308
289
|
const id = String(params[params.length - 1]);
|
|
309
290
|
const row = state.messages.find((m) => m.id === id);
|
|
@@ -414,9 +395,7 @@ function rowToMessage(row: Record<string, unknown>): SignalMessage {
|
|
|
414
395
|
*
|
|
415
396
|
* @param options - Declarations / sql fake / clock
|
|
416
397
|
*/
|
|
417
|
-
export async function openPostgresSignal(
|
|
418
|
-
options: SignalOpenOptions,
|
|
419
|
-
): Promise<SignalBus> {
|
|
398
|
+
export async function openPostgresSignal(options: SignalOpenOptions): Promise<SignalBus> {
|
|
420
399
|
const now = options.now ?? (() => Date.now());
|
|
421
400
|
const signals = options.signals;
|
|
422
401
|
const sql =
|
|
@@ -443,10 +422,7 @@ export async function openPostgresSignal(
|
|
|
443
422
|
let unlisten: (() => void) | null = null;
|
|
444
423
|
let draining: Promise<void> | null = null;
|
|
445
424
|
|
|
446
|
-
function failureFromError(
|
|
447
|
-
err: unknown,
|
|
448
|
-
attempt: number,
|
|
449
|
-
): SignalFailureReason {
|
|
425
|
+
function failureFromError(err: unknown, attempt: number): SignalFailureReason {
|
|
450
426
|
const code =
|
|
451
427
|
err &&
|
|
452
428
|
typeof err === "object" &&
|
|
@@ -539,10 +515,10 @@ export async function openPostgresSignal(
|
|
|
539
515
|
finished = true;
|
|
540
516
|
await sql.begin(async (tx) => {
|
|
541
517
|
for (const [k, v] of stagedWrites) {
|
|
542
|
-
await tx.exec(
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
);
|
|
518
|
+
await tx.exec(`INSERT INTO oke_signal_writes (key, value) VALUES (?, ?)`, [
|
|
519
|
+
k,
|
|
520
|
+
JSON.stringify(v),
|
|
521
|
+
]);
|
|
546
522
|
}
|
|
547
523
|
for (const e of stagedEmits) {
|
|
548
524
|
await insertEmit(tx, e.signal, e.payload);
|
|
@@ -594,10 +570,7 @@ export async function openPostgresSignal(
|
|
|
594
570
|
};
|
|
595
571
|
}
|
|
596
572
|
|
|
597
|
-
async function live(
|
|
598
|
-
signal: string,
|
|
599
|
-
handler: LiveHandler,
|
|
600
|
-
): Promise<SignalUnsubscribe> {
|
|
573
|
+
async function live(signal: string, handler: LiveHandler): Promise<SignalUnsubscribe> {
|
|
601
574
|
const decl = requireDecl(signal);
|
|
602
575
|
if (decl.delivery !== "live") {
|
|
603
576
|
throw new Error(`signal "${signal}" is not delivery: "live"`);
|
|
@@ -628,10 +601,10 @@ export async function openPostgresSignal(
|
|
|
628
601
|
const msg = rowToMessage(row);
|
|
629
602
|
try {
|
|
630
603
|
await consumer.handler(msg);
|
|
631
|
-
await sql.exec(
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
);
|
|
604
|
+
await sql.exec(`UPDATE oke_signal_messages SET status = ?, locked_by = NULL WHERE id = ?`, [
|
|
605
|
+
"delivered",
|
|
606
|
+
msg.id,
|
|
607
|
+
]);
|
|
635
608
|
noteDelivered();
|
|
636
609
|
} catch (err) {
|
|
637
610
|
const failures = [...msg.failures, failureFromError(err, msg.attempts)];
|
|
@@ -689,38 +662,27 @@ export async function openPostgresSignal(
|
|
|
689
662
|
for (const consumer of consumers) {
|
|
690
663
|
const decl = signals.get(consumer.signal);
|
|
691
664
|
if (decl?.delivery !== "broadcast") continue;
|
|
692
|
-
const rows = await sql.query(
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
);
|
|
665
|
+
const rows = await sql.query(`SELECT * FROM oke_signal_messages WHERE signal = ?`, [
|
|
666
|
+
consumer.signal,
|
|
667
|
+
]);
|
|
696
668
|
for (const row of rows) {
|
|
697
669
|
if (row.status === "dead" || row.status === "delivered") continue;
|
|
698
670
|
if (row.delivery !== "broadcast") continue;
|
|
699
671
|
// Re-read delivered_to so concurrent drain (NOTIFY) cannot double-deliver.
|
|
700
|
-
const fresh = await sql.query(
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
);
|
|
672
|
+
const fresh = await sql.query(`SELECT * FROM oke_signal_messages WHERE signal = ?`, [
|
|
673
|
+
consumer.signal,
|
|
674
|
+
]);
|
|
704
675
|
const current = fresh.find((r) => r.id === row.id);
|
|
705
676
|
if (!current || current.status === "delivered") continue;
|
|
706
|
-
const deliveredTo = new Set(
|
|
707
|
-
JSON.parse(String(current.delivered_to ?? "[]")) as string[],
|
|
708
|
-
);
|
|
677
|
+
const deliveredTo = new Set(JSON.parse(String(current.delivered_to ?? "[]")) as string[]);
|
|
709
678
|
if (deliveredTo.has(consumer.subscriberId)) continue;
|
|
710
679
|
// Claim this subscriber slot before invoking the handler.
|
|
711
680
|
deliveredTo.add(consumer.subscriberId);
|
|
712
681
|
const subs = consumers.filter((c) => c.signal === consumer.signal);
|
|
713
|
-
const status = subs.every((s) => deliveredTo.has(s.subscriberId))
|
|
714
|
-
? "delivered"
|
|
715
|
-
: "pending";
|
|
682
|
+
const status = subs.every((s) => deliveredTo.has(s.subscriberId)) ? "delivered" : "pending";
|
|
716
683
|
await sql.exec(
|
|
717
684
|
`UPDATE oke_signal_messages SET delivered_to = ?, status = ?, attempts = ? WHERE id = ?`,
|
|
718
|
-
[
|
|
719
|
-
JSON.stringify([...deliveredTo]),
|
|
720
|
-
status,
|
|
721
|
-
Number(current.attempts) + 1,
|
|
722
|
-
row.id,
|
|
723
|
-
],
|
|
685
|
+
[JSON.stringify([...deliveredTo]), status, Number(current.attempts) + 1, row.id],
|
|
724
686
|
);
|
|
725
687
|
progress = true;
|
|
726
688
|
const msg = rowToMessage(current);
|
|
@@ -728,16 +690,13 @@ export async function openPostgresSignal(
|
|
|
728
690
|
await consumer.handler(msg);
|
|
729
691
|
noteDelivered();
|
|
730
692
|
} catch (err) {
|
|
731
|
-
const failures = [
|
|
732
|
-
...msg.failures,
|
|
733
|
-
failureFromError(err, Number(current.attempts) + 1),
|
|
734
|
-
];
|
|
693
|
+
const failures = [...msg.failures, failureFromError(err, Number(current.attempts) + 1)];
|
|
735
694
|
const key = `${consumer.signal}::${consumer.subscriberId}`;
|
|
736
695
|
subscriberErrors.set(key, (subscriberErrors.get(key) ?? 0) + 1);
|
|
737
|
-
await sql.exec(
|
|
738
|
-
|
|
739
|
-
|
|
740
|
-
);
|
|
696
|
+
await sql.exec(`UPDATE oke_signal_messages SET failures = ? WHERE id = ?`, [
|
|
697
|
+
JSON.stringify(failures),
|
|
698
|
+
row.id,
|
|
699
|
+
]);
|
|
741
700
|
}
|
|
742
701
|
}
|
|
743
702
|
}
|
|
@@ -805,10 +764,7 @@ export async function openPostgresSignal(
|
|
|
805
764
|
async function statsFor(name: string): Promise<SignalStats | null> {
|
|
806
765
|
const decl = signals.get(name);
|
|
807
766
|
if (!decl) return null;
|
|
808
|
-
const rows = await sql.query(
|
|
809
|
-
`SELECT * FROM oke_signal_messages WHERE signal = ?`,
|
|
810
|
-
[name],
|
|
811
|
-
);
|
|
767
|
+
const rows = await sql.query(`SELECT * FROM oke_signal_messages WHERE signal = ?`, [name]);
|
|
812
768
|
let pending = 0;
|
|
813
769
|
let inflight = 0;
|
|
814
770
|
let dead = 0;
|
|
@@ -843,9 +799,7 @@ export async function openPostgresSignal(
|
|
|
843
799
|
for (const row of rows) {
|
|
844
800
|
if (row.delivery !== "broadcast") continue;
|
|
845
801
|
if (row.status === "dead" || row.status === "delivered") continue;
|
|
846
|
-
const deliveredTo = new Set(
|
|
847
|
-
JSON.parse(String(row.delivered_to ?? "[]")) as string[],
|
|
848
|
-
);
|
|
802
|
+
const deliveredTo = new Set(JSON.parse(String(row.delivered_to ?? "[]")) as string[]);
|
|
849
803
|
if (!deliveredTo.has(c.subscriberId)) lag += 1;
|
|
850
804
|
}
|
|
851
805
|
return {
|
|
@@ -864,8 +818,7 @@ export async function openPostgresSignal(
|
|
|
864
818
|
delivered,
|
|
865
819
|
retries: decl.retries,
|
|
866
820
|
deadLetterEnabled: decl.deadLetter,
|
|
867
|
-
outboxLagMs:
|
|
868
|
-
oldestPending === null ? null : Math.max(0, now() - oldestPending),
|
|
821
|
+
outboxLagMs: oldestPending === null ? null : Math.max(0, now() - oldestPending),
|
|
869
822
|
subscribers,
|
|
870
823
|
connections: liveHandlers.get(name)?.size ?? 0,
|
|
871
824
|
throughputPerSec: throughputPerSec(),
|
|
@@ -888,17 +841,13 @@ export async function openPostgresSignal(
|
|
|
888
841
|
return out;
|
|
889
842
|
}
|
|
890
843
|
|
|
891
|
-
async function replay(
|
|
892
|
-
options: SignalReplayOptions,
|
|
893
|
-
): Promise<SignalReplayResult> {
|
|
844
|
+
async function replay(options: SignalReplayOptions): Promise<SignalReplayResult> {
|
|
894
845
|
requireDecl(options.signal);
|
|
895
846
|
const rate = Math.max(1, options.ratePerSec);
|
|
896
847
|
const intervalMs = Math.floor(1_000 / rate);
|
|
897
848
|
const dead = await deadLetters(options.signal);
|
|
898
849
|
const ids =
|
|
899
|
-
options.messageIds && options.messageIds.length > 0
|
|
900
|
-
? new Set(options.messageIds)
|
|
901
|
-
: null;
|
|
850
|
+
options.messageIds && options.messageIds.length > 0 ? new Set(options.messageIds) : null;
|
|
902
851
|
const targets = dead.filter((m) => ids === null || ids.has(m.id));
|
|
903
852
|
const results: SignalReplayResult["results"][number][] = [];
|
|
904
853
|
const wouldHaveFired: SignalReplayResult["wouldHaveFired"][number][] = [];
|
|
@@ -910,18 +859,12 @@ export async function openPostgresSignal(
|
|
|
910
859
|
await new Promise((r) => setTimeout(r, intervalMs));
|
|
911
860
|
}
|
|
912
861
|
const m = targets[i]!;
|
|
913
|
-
const payload =
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
!options.dryRun
|
|
920
|
-
) {
|
|
921
|
-
await sql.exec(
|
|
922
|
-
`UPDATE oke_signal_messages SET payload = ? WHERE id = ?`,
|
|
923
|
-
[JSON.stringify(payload), m.id],
|
|
924
|
-
);
|
|
862
|
+
const payload = options.payloads?.[m.id] !== undefined ? options.payloads[m.id] : m.payload;
|
|
863
|
+
if (options.payloads?.[m.id] !== undefined && !options.dryRun) {
|
|
864
|
+
await sql.exec(`UPDATE oke_signal_messages SET payload = ? WHERE id = ?`, [
|
|
865
|
+
JSON.stringify(payload),
|
|
866
|
+
m.id,
|
|
867
|
+
]);
|
|
925
868
|
}
|
|
926
869
|
|
|
927
870
|
const handlers = consumers.filter((c) => {
|
|
@@ -983,10 +926,10 @@ export async function openPostgresSignal(
|
|
|
983
926
|
lastErr = { code: reason.code, message: reason.message };
|
|
984
927
|
if (!options.dryRun) {
|
|
985
928
|
const failures = [...m.failures, reason];
|
|
986
|
-
await sql.exec(
|
|
987
|
-
|
|
988
|
-
|
|
989
|
-
);
|
|
929
|
+
await sql.exec(`UPDATE oke_signal_messages SET failures = ? WHERE id = ?`, [
|
|
930
|
+
JSON.stringify(failures),
|
|
931
|
+
m.id,
|
|
932
|
+
]);
|
|
990
933
|
}
|
|
991
934
|
}
|
|
992
935
|
}
|
|
@@ -997,14 +940,9 @@ export async function openPostgresSignal(
|
|
|
997
940
|
if (!options.dryRun) {
|
|
998
941
|
if (options.subscriberId && m.delivery === "broadcast") {
|
|
999
942
|
const row = (
|
|
1000
|
-
await sql.query(
|
|
1001
|
-
`SELECT * FROM oke_signal_messages WHERE id = ?`,
|
|
1002
|
-
[m.id],
|
|
1003
|
-
)
|
|
943
|
+
await sql.query(`SELECT * FROM oke_signal_messages WHERE id = ?`, [m.id])
|
|
1004
944
|
)[0];
|
|
1005
|
-
const deliveredTo = new Set(
|
|
1006
|
-
JSON.parse(String(row?.delivered_to ?? "[]")) as string[],
|
|
1007
|
-
);
|
|
945
|
+
const deliveredTo = new Set(JSON.parse(String(row?.delivered_to ?? "[]")) as string[]);
|
|
1008
946
|
deliveredTo.delete(options.subscriberId);
|
|
1009
947
|
await sql.exec(
|
|
1010
948
|
`UPDATE oke_signal_messages SET status = 'pending', locked_by = NULL, attempts = 0, available_at = ?, delivered_to = ? WHERE id = ?`,
|
|
@@ -1033,9 +971,7 @@ export async function openPostgresSignal(
|
|
|
1033
971
|
};
|
|
1034
972
|
}
|
|
1035
973
|
|
|
1036
|
-
async function discard(
|
|
1037
|
-
options: SignalDiscardOptions,
|
|
1038
|
-
): Promise<{ readonly discarded: number }> {
|
|
974
|
+
async function discard(options: SignalDiscardOptions): Promise<{ readonly discarded: number }> {
|
|
1039
975
|
let discarded = 0;
|
|
1040
976
|
for (const id of options.messageIds) {
|
|
1041
977
|
const result = await sql.exec(
|
|
@@ -1048,10 +984,7 @@ export async function openPostgresSignal(
|
|
|
1048
984
|
}
|
|
1049
985
|
|
|
1050
986
|
async function getWrite(key: string): Promise<unknown> {
|
|
1051
|
-
const rows = await sql.query(
|
|
1052
|
-
`SELECT value FROM oke_signal_writes WHERE key = ?`,
|
|
1053
|
-
[key],
|
|
1054
|
-
);
|
|
987
|
+
const rows = await sql.query(`SELECT value FROM oke_signal_writes WHERE key = ?`, [key]);
|
|
1055
988
|
if (!rows[0]) return undefined;
|
|
1056
989
|
return JSON.parse(String(rows[0].value));
|
|
1057
990
|
}
|
|
@@ -27,15 +27,10 @@ import type {
|
|
|
27
27
|
*
|
|
28
28
|
* @param url - Optional Redis URL
|
|
29
29
|
*/
|
|
30
|
-
export function createBunSignalRedisClient(
|
|
31
|
-
url
|
|
32
|
-
): SignalRedisClientLike {
|
|
33
|
-
const redis =
|
|
34
|
-
url !== undefined ? new Bun.RedisClient(url) : Bun.redis;
|
|
30
|
+
export function createBunSignalRedisClient(url?: string): SignalRedisClientLike {
|
|
31
|
+
const redis = url !== undefined ? new Bun.RedisClient(url) : Bun.redis;
|
|
35
32
|
/** Subscribe blocks a connection — keep a dedicated client. */
|
|
36
|
-
let sub:
|
|
37
|
-
| InstanceType<typeof Bun.RedisClient>
|
|
38
|
-
| undefined;
|
|
33
|
+
let sub: InstanceType<typeof Bun.RedisClient> | undefined;
|
|
39
34
|
|
|
40
35
|
function subClient(): InstanceType<typeof Bun.RedisClient> {
|
|
41
36
|
if (!sub) {
|
|
@@ -127,16 +122,10 @@ export function parseXreadgroupReply(
|
|
|
127
122
|
* In-memory redis-protocol fake for signal streams + pub/sub.
|
|
128
123
|
*/
|
|
129
124
|
export function createSignalRedisFake(): SignalRedisClientLike & {
|
|
130
|
-
readonly streams: Map<
|
|
131
|
-
string,
|
|
132
|
-
Array<{ id: string; fields: Record<string, string> }>
|
|
133
|
-
>;
|
|
125
|
+
readonly streams: Map<string, Array<{ id: string; fields: Record<string, string> }>>;
|
|
134
126
|
readonly published: Array<{ channel: string; message: string }>;
|
|
135
127
|
} {
|
|
136
|
-
const streams = new Map<
|
|
137
|
-
string,
|
|
138
|
-
Array<{ id: string; fields: Record<string, string> }>
|
|
139
|
-
>();
|
|
128
|
+
const streams = new Map<string, Array<{ id: string; fields: Record<string, string> }>>();
|
|
140
129
|
const groups = new Map<string, Set<string>>();
|
|
141
130
|
const claimed = new Map<string, Set<string>>();
|
|
142
131
|
const subs = new Map<string, Set<(message: string) => void>>();
|
|
@@ -210,9 +199,7 @@ export function createSignalRedisFake(): SignalRedisClientLike & {
|
|
|
210
199
|
*
|
|
211
200
|
* @param options - Declarations / redis client / durable outbox path
|
|
212
201
|
*/
|
|
213
|
-
export async function openRedisSignal(
|
|
214
|
-
options: SignalOpenOptions,
|
|
215
|
-
): Promise<SignalBus> {
|
|
202
|
+
export async function openRedisSignal(options: SignalOpenOptions): Promise<SignalBus> {
|
|
216
203
|
// Same DI shape as postgres/redis/s3: inject a client in tests; production
|
|
217
204
|
// binds Bun.redis (Streams via send until Bun ships typed xadd).
|
|
218
205
|
const redis = options.redis ?? createBunSignalRedisClient();
|
|
@@ -255,8 +242,7 @@ export async function openRedisSignal(
|
|
|
255
242
|
rollback: () => tx.rollback(),
|
|
256
243
|
};
|
|
257
244
|
},
|
|
258
|
-
subscribe: (signal, subscriberId, handler) =>
|
|
259
|
-
outbox.subscribe(signal, subscriberId, handler),
|
|
245
|
+
subscribe: (signal, subscriberId, handler) => outbox.subscribe(signal, subscriberId, handler),
|
|
260
246
|
live: (signal, handler) => outbox.live(signal, handler),
|
|
261
247
|
drain: () => outbox.drain(),
|
|
262
248
|
deadLetters: (s) => outbox.deadLetters(s),
|
|
@@ -229,10 +229,7 @@ export interface SignalRedisClientLike {
|
|
|
229
229
|
): Promise<Array<{ id: string; fields: Record<string, string> }>>;
|
|
230
230
|
xack(key: string, group: string, id: string): Promise<number>;
|
|
231
231
|
publish(channel: string, message: string): Promise<number>;
|
|
232
|
-
subscribe(
|
|
233
|
-
channel: string,
|
|
234
|
-
listener: (message: string) => void,
|
|
235
|
-
): Promise<() => void>;
|
|
232
|
+
subscribe(channel: string, listener: (message: string) => void): Promise<() => void>;
|
|
236
233
|
}
|
|
237
234
|
|
|
238
235
|
/** Minimal NATS / JetStream surface. */
|
package/src/drivers/sqlite.ts
CHANGED
|
@@ -3,26 +3,17 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { Database, type SQLQueryBindings } from "bun:sqlite";
|
|
6
|
-
import type {
|
|
7
|
-
SqlConnectOptions,
|
|
8
|
-
SqlConnection,
|
|
9
|
-
SqlDriver,
|
|
10
|
-
SqlRow,
|
|
11
|
-
} from "./types.ts";
|
|
6
|
+
import type { SqlConnectOptions, SqlConnection, SqlDriver, SqlRow } from "./types.ts";
|
|
12
7
|
|
|
13
8
|
/**
|
|
14
9
|
* Open a bun:sqlite connection implementing {@link SqlConnection}.
|
|
15
10
|
*
|
|
16
11
|
* @param options - URL (`:memory:` / path) or injected Database
|
|
17
12
|
*/
|
|
18
|
-
export async function connectSqlite(
|
|
19
|
-
options: SqlConnectOptions = {},
|
|
20
|
-
): Promise<SqlConnection> {
|
|
13
|
+
export async function connectSqlite(options: SqlConnectOptions = {}): Promise<SqlConnection> {
|
|
21
14
|
const role = options.role ?? "primary";
|
|
22
15
|
const db =
|
|
23
|
-
options.client instanceof Database
|
|
24
|
-
? options.client
|
|
25
|
-
: new Database(options.url ?? ":memory:");
|
|
16
|
+
options.client instanceof Database ? options.client : new Database(options.url ?? ":memory:");
|
|
26
17
|
|
|
27
18
|
function asBindings(params: readonly unknown[]): SQLQueryBindings[] {
|
|
28
19
|
return params as SQLQueryBindings[];
|
package/src/drivers/types.ts
CHANGED
|
@@ -8,14 +8,7 @@
|
|
|
8
8
|
import type { ColumnClassification, StoreFacet } from "../manifest/types.ts";
|
|
9
9
|
|
|
10
10
|
/** Protocol ids for store drivers in scope. */
|
|
11
|
-
export type StoreDriverId =
|
|
12
|
-
| "sqlite"
|
|
13
|
-
| "postgres"
|
|
14
|
-
| "memory"
|
|
15
|
-
| "redis"
|
|
16
|
-
| "fs"
|
|
17
|
-
| "s3"
|
|
18
|
-
| "pgvector";
|
|
11
|
+
export type StoreDriverId = "sqlite" | "postgres" | "memory" | "redis" | "fs" | "s3" | "pgvector";
|
|
19
12
|
|
|
20
13
|
/** Facets a driver may serve. */
|
|
21
14
|
export type DriverFacet = StoreFacet;
|
|
@@ -112,11 +105,7 @@ export interface KvNamespace {
|
|
|
112
105
|
* @param keys - KEYS table entries (unprefixed)
|
|
113
106
|
* @param args - ARGV table entries
|
|
114
107
|
*/
|
|
115
|
-
eval<T = unknown>(
|
|
116
|
-
script: string,
|
|
117
|
-
keys: readonly string[],
|
|
118
|
-
args?: readonly string[],
|
|
119
|
-
): Promise<T>;
|
|
108
|
+
eval<T = unknown>(script: string, keys: readonly string[], args?: readonly string[]): Promise<T>;
|
|
120
109
|
/**
|
|
121
110
|
* List keys in this namespace, optionally by prefix (Console Store browser).
|
|
122
111
|
*
|
|
@@ -151,11 +140,7 @@ export interface KvClientLike {
|
|
|
151
140
|
* @param numkeys - KEYS count
|
|
152
141
|
* @param keysAndArgs - KEYS then ARGV
|
|
153
142
|
*/
|
|
154
|
-
eval?(
|
|
155
|
-
script: string,
|
|
156
|
-
numkeys: number,
|
|
157
|
-
...keysAndArgs: string[]
|
|
158
|
-
): Promise<unknown>;
|
|
143
|
+
eval?(script: string, numkeys: number, ...keysAndArgs: string[]): Promise<unknown>;
|
|
159
144
|
/**
|
|
160
145
|
* Raw command send (Bun.RedisClient). Used when `eval` is absent.
|
|
161
146
|
*
|
|
@@ -271,11 +256,7 @@ export interface IndexStore {
|
|
|
271
256
|
* @param vector - Embedding
|
|
272
257
|
* @param meta - Optional metadata
|
|
273
258
|
*/
|
|
274
|
-
upsert(
|
|
275
|
-
id: string,
|
|
276
|
-
vector: readonly number[],
|
|
277
|
-
meta?: Record<string, unknown>,
|
|
278
|
-
): Promise<void>;
|
|
259
|
+
upsert(id: string, vector: readonly number[], meta?: Record<string, unknown>): Promise<void>;
|
|
279
260
|
/**
|
|
280
261
|
* Similarity search (cosine).
|
|
281
262
|
*
|
package/src/drivers/vault-env.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* `env` vault driver — resolves secrets from the process environment
|
|
3
|
-
* and/or a dotenv file path (`.env.local`, `.env.
|
|
3
|
+
* and/or a dotenv file path (`.env.local`, `.env.docker`, …).
|
|
4
4
|
*
|
|
5
5
|
* Resolution order is owned by {@link createVaultRuntime}; this driver only
|
|
6
6
|
* exposes one layer of the chain. Layer identity (`process.env` vs file)
|
|
@@ -8,11 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { parseDotenv, formatDotenv } from "./vault-dotenv-parse.ts";
|
|
11
|
-
import type {
|
|
12
|
-
VaultBag,
|
|
13
|
-
VaultDriver,
|
|
14
|
-
VaultOpenOptions,
|
|
15
|
-
} from "./vault-types.ts";
|
|
11
|
+
import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
|
|
16
12
|
|
|
17
13
|
/**
|
|
18
14
|
* Create an env vault driver.
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
* `infisical` vault driver — Infisical REST secrets API (protocol-shaped).
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type {
|
|
6
|
-
VaultBag,
|
|
7
|
-
VaultDriver,
|
|
8
|
-
VaultOpenOptions,
|
|
9
|
-
} from "./vault-types.ts";
|
|
5
|
+
import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
|
|
10
6
|
|
|
11
7
|
/**
|
|
12
8
|
* Infisical secrets driver.
|
|
@@ -4,11 +4,7 @@
|
|
|
4
4
|
* Values arrive as an injected map (or env); OKE never invents a vendor client.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type {
|
|
8
|
-
VaultBag,
|
|
9
|
-
VaultDriver,
|
|
10
|
-
VaultOpenOptions,
|
|
11
|
-
} from "./vault-types.ts";
|
|
7
|
+
import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
|
|
12
8
|
|
|
13
9
|
/**
|
|
14
10
|
* Managed / platform vault driver.
|
|
@@ -2,11 +2,7 @@
|
|
|
2
2
|
* In-memory vault driver — tests and deterministic harnesses.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type {
|
|
6
|
-
VaultBag,
|
|
7
|
-
VaultDriver,
|
|
8
|
-
VaultOpenOptions,
|
|
9
|
-
} from "./vault-types.ts";
|
|
5
|
+
import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
|
|
10
6
|
|
|
11
7
|
/**
|
|
12
8
|
* Create a memory vault driver seeded from `options.secrets`.
|
|
@@ -4,11 +4,7 @@
|
|
|
4
4
|
* Protocol-named; image/vendor choice lives in `images`.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type {
|
|
8
|
-
VaultBag,
|
|
9
|
-
VaultDriver,
|
|
10
|
-
VaultOpenOptions,
|
|
11
|
-
} from "./vault-types.ts";
|
|
7
|
+
import type { VaultBag, VaultDriver, VaultOpenOptions } from "./vault-types.ts";
|
|
12
8
|
|
|
13
9
|
/**
|
|
14
10
|
* OpenBao / Vault KV driver.
|