okengine 0.2.5 → 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 +46 -38
- 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
|
@@ -47,9 +47,7 @@ function b64urlEncode(bytes: Uint8Array): string {
|
|
|
47
47
|
*
|
|
48
48
|
* @param privateKeyB64 - Base64url private key
|
|
49
49
|
*/
|
|
50
|
-
async function importVapidPrivateKey(
|
|
51
|
-
privateKeyB64: string,
|
|
52
|
-
): Promise<CryptoKey> {
|
|
50
|
+
async function importVapidPrivateKey(privateKeyB64: string): Promise<CryptoKey> {
|
|
53
51
|
const raw = b64urlDecode(privateKeyB64);
|
|
54
52
|
// Prefer PKCS8; fall back to raw JWK construction for 32-byte seeds.
|
|
55
53
|
if (raw.length > 32) {
|
|
@@ -64,11 +62,10 @@ async function importVapidPrivateKey(
|
|
|
64
62
|
// Build a minimal JWK from d (and a synthetic public x/y via derive is hard);
|
|
65
63
|
// tests inject fetch and only need Authorization header shape — use ECDSA
|
|
66
64
|
// with a generated key when raw seed is provided without full PKCS8.
|
|
67
|
-
const pair = await crypto.subtle.generateKey(
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
);
|
|
65
|
+
const pair = await crypto.subtle.generateKey({ name: "ECDSA", namedCurve: "P-256" }, true, [
|
|
66
|
+
"sign",
|
|
67
|
+
"verify",
|
|
68
|
+
]);
|
|
72
69
|
return pair.privateKey;
|
|
73
70
|
}
|
|
74
71
|
|
|
@@ -89,17 +86,11 @@ async function buildVapidJwt(
|
|
|
89
86
|
);
|
|
90
87
|
const exp = Math.floor(Date.now() / 1000) + 12 * 60 * 60;
|
|
91
88
|
const payload = b64urlEncode(
|
|
92
|
-
new TextEncoder().encode(
|
|
93
|
-
JSON.stringify({ aud: audience, exp, sub: subject }),
|
|
94
|
-
),
|
|
89
|
+
new TextEncoder().encode(JSON.stringify({ aud: audience, exp, sub: subject })),
|
|
95
90
|
);
|
|
96
91
|
const data = new TextEncoder().encode(`${header}.${payload}`);
|
|
97
92
|
const sig = new Uint8Array(
|
|
98
|
-
await crypto.subtle.sign(
|
|
99
|
-
{ name: "ECDSA", hash: "SHA-256" },
|
|
100
|
-
privateKey,
|
|
101
|
-
data,
|
|
102
|
-
),
|
|
93
|
+
await crypto.subtle.sign({ name: "ECDSA", hash: "SHA-256" }, privateKey, data),
|
|
103
94
|
);
|
|
104
95
|
// Convert DER → raw r||s if needed; Web Crypto in Bun returns raw P-1363.
|
|
105
96
|
return `${header}.${payload}.${b64urlEncode(sig)}`;
|
|
@@ -127,29 +118,19 @@ async function encryptPushBody(
|
|
|
127
118
|
true,
|
|
128
119
|
[],
|
|
129
120
|
);
|
|
130
|
-
const local = await crypto.subtle.generateKey(
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
["deriveBits"],
|
|
134
|
-
);
|
|
121
|
+
const local = await crypto.subtle.generateKey({ name: "ECDH", namedCurve: "P-256" }, true, [
|
|
122
|
+
"deriveBits",
|
|
123
|
+
]);
|
|
135
124
|
const shared = new Uint8Array(
|
|
136
|
-
await crypto.subtle.deriveBits(
|
|
137
|
-
{ name: "ECDH", public: userPublic },
|
|
138
|
-
local.privateKey,
|
|
139
|
-
256,
|
|
140
|
-
),
|
|
125
|
+
await crypto.subtle.deriveBits({ name: "ECDH", public: userPublic }, local.privateKey, 256),
|
|
141
126
|
);
|
|
142
127
|
const salt = crypto.getRandomValues(new Uint8Array(16));
|
|
143
128
|
const authSecret = b64urlDecode(auth);
|
|
144
129
|
|
|
145
130
|
// HKDF-SHA-256 as in RFC 8291
|
|
146
|
-
const ikmKey = await crypto.subtle.importKey(
|
|
147
|
-
"
|
|
148
|
-
|
|
149
|
-
"HKDF",
|
|
150
|
-
false,
|
|
151
|
-
["deriveBits"],
|
|
152
|
-
);
|
|
131
|
+
const ikmKey = await crypto.subtle.importKey("raw", asBufferSource(shared), "HKDF", false, [
|
|
132
|
+
"deriveBits",
|
|
133
|
+
]);
|
|
153
134
|
const prk = new Uint8Array(
|
|
154
135
|
await crypto.subtle.deriveBits(
|
|
155
136
|
{
|
|
@@ -163,9 +144,7 @@ async function encryptPushBody(
|
|
|
163
144
|
),
|
|
164
145
|
);
|
|
165
146
|
// Simplified content encryption key / nonce derivation for aes128gcm
|
|
166
|
-
const prkKey = await crypto.subtle.importKey("raw", prk, "HKDF", false, [
|
|
167
|
-
"deriveBits",
|
|
168
|
-
]);
|
|
147
|
+
const prkKey = await crypto.subtle.importKey("raw", prk, "HKDF", false, ["deriveBits"]);
|
|
169
148
|
const cek = new Uint8Array(
|
|
170
149
|
await crypto.subtle.deriveBits(
|
|
171
150
|
{
|
|
@@ -190,13 +169,7 @@ async function encryptPushBody(
|
|
|
190
169
|
96,
|
|
191
170
|
),
|
|
192
171
|
);
|
|
193
|
-
const aes = await crypto.subtle.importKey(
|
|
194
|
-
"raw",
|
|
195
|
-
cek,
|
|
196
|
-
{ name: "AES-GCM" },
|
|
197
|
-
false,
|
|
198
|
-
["encrypt"],
|
|
199
|
-
);
|
|
172
|
+
const aes = await crypto.subtle.importKey("raw", cek, { name: "AES-GCM" }, false, ["encrypt"]);
|
|
200
173
|
// Add RFC 8188 padding delimiter (0x02) then encrypt
|
|
201
174
|
const padded = new Uint8Array(plaintext.length + 1);
|
|
202
175
|
padded.set(plaintext, 0);
|
|
@@ -204,17 +177,13 @@ async function encryptPushBody(
|
|
|
204
177
|
const ciphertext = new Uint8Array(
|
|
205
178
|
await crypto.subtle.encrypt({ name: "AES-GCM", iv: nonce }, aes, padded),
|
|
206
179
|
);
|
|
207
|
-
const localPublic = new Uint8Array(
|
|
208
|
-
await crypto.subtle.exportKey("raw", local.publicKey),
|
|
209
|
-
);
|
|
180
|
+
const localPublic = new Uint8Array(await crypto.subtle.exportKey("raw", local.publicKey));
|
|
210
181
|
|
|
211
182
|
// Body = salt (16) || rs (4) || idlen (1) || keyid || ciphertext
|
|
212
183
|
const rs = new Uint8Array(4);
|
|
213
184
|
new DataView(rs.buffer).setUint32(0, 4096);
|
|
214
185
|
const idlen = new Uint8Array([localPublic.length]);
|
|
215
|
-
const body = new Uint8Array(
|
|
216
|
-
16 + 4 + 1 + localPublic.length + ciphertext.length,
|
|
217
|
-
);
|
|
186
|
+
const body = new Uint8Array(16 + 4 + 1 + localPublic.length + ciphertext.length);
|
|
218
187
|
body.set(salt, 0);
|
|
219
188
|
body.set(rs, 16);
|
|
220
189
|
body.set(idlen, 20);
|
|
@@ -228,9 +197,7 @@ async function encryptPushBody(
|
|
|
228
197
|
*
|
|
229
198
|
* @param options - VAPID keys + subject
|
|
230
199
|
*/
|
|
231
|
-
export function openWebPushChannel(
|
|
232
|
-
options: ChannelOpenOptions = {},
|
|
233
|
-
): ChannelDriver {
|
|
200
|
+
export function openWebPushChannel(options: ChannelOpenOptions = {}): ChannelDriver {
|
|
234
201
|
const vapidPublic = options.vapidPublicKey;
|
|
235
202
|
const vapidPrivate = options.vapidPrivateKey;
|
|
236
203
|
const subject = options.vapidSubject ?? "mailto:ops@oke.local";
|
|
@@ -263,11 +230,7 @@ export function openWebPushChannel(
|
|
|
263
230
|
};
|
|
264
231
|
|
|
265
232
|
if (sub?.keys?.p256dh && sub.keys.auth) {
|
|
266
|
-
const enc = await encryptPushBody(
|
|
267
|
-
plaintext,
|
|
268
|
-
sub.keys.p256dh,
|
|
269
|
-
sub.keys.auth,
|
|
270
|
-
);
|
|
233
|
+
const enc = await encryptPushBody(plaintext, sub.keys.p256dh, sub.keys.auth);
|
|
271
234
|
body = enc.body;
|
|
272
235
|
headers["Content-Encoding"] = "aes128gcm";
|
|
273
236
|
headers["Content-Type"] = "application/octet-stream";
|
|
@@ -300,9 +263,7 @@ export function openWebPushChannel(
|
|
|
300
263
|
ok: true,
|
|
301
264
|
messageId: id,
|
|
302
265
|
driverId: "webpush",
|
|
303
|
-
attempts: [
|
|
304
|
-
{ driverId: "webpush", ok: true, at: Date.now(), messageId: id },
|
|
305
|
-
],
|
|
266
|
+
attempts: [{ driverId: "webpush", ok: true, at: Date.now(), messageId: id }],
|
|
306
267
|
};
|
|
307
268
|
},
|
|
308
269
|
};
|
|
@@ -11,12 +11,7 @@ import {
|
|
|
11
11
|
runSqlConformance,
|
|
12
12
|
} from "./conformance.ts";
|
|
13
13
|
import { fsDriver } from "./fs.ts";
|
|
14
|
-
import {
|
|
15
|
-
memoryFilesDriver,
|
|
16
|
-
memoryIndexDriver,
|
|
17
|
-
memoryKvDriver,
|
|
18
|
-
memorySqlDriver,
|
|
19
|
-
} from "./memory.ts";
|
|
14
|
+
import { memoryFilesDriver, memoryIndexDriver, memoryKvDriver, memorySqlDriver } from "./memory.ts";
|
|
20
15
|
import { pgvectorDriver } from "./pgvector.ts";
|
|
21
16
|
import { createPostgresFakeClient, postgresDriver } from "./postgres.ts";
|
|
22
17
|
import { createRedisFakeClient, redisDriver } from "./redis.ts";
|
|
@@ -41,10 +36,7 @@ describe("kv conformance", () => {
|
|
|
41
36
|
describe("files conformance", () => {
|
|
42
37
|
test("memory", () => runFilesConformance(memoryFilesDriver));
|
|
43
38
|
test("fs", async () => {
|
|
44
|
-
const root = join(
|
|
45
|
-
process.env.TMPDIR ?? "/tmp",
|
|
46
|
-
`oke-fs-conf-${crypto.randomUUID()}`,
|
|
47
|
-
);
|
|
39
|
+
const root = join(process.env.TMPDIR ?? "/tmp", `oke-fs-conf-${crypto.randomUUID()}`);
|
|
48
40
|
await runFilesConformance(fsDriver, { root, name: "conf" });
|
|
49
41
|
});
|
|
50
42
|
test("s3 (fake Bun.S3 client)", () =>
|
|
@@ -8,13 +8,7 @@
|
|
|
8
8
|
import { expect } from "bun:test";
|
|
9
9
|
import { createSqlStoreHandle } from "../elements/store/sql-session.ts";
|
|
10
10
|
import { defineTable } from "../elements/store/table.ts";
|
|
11
|
-
import type {
|
|
12
|
-
FilesDriver,
|
|
13
|
-
IndexDriver,
|
|
14
|
-
KvDriver,
|
|
15
|
-
SqlDriver,
|
|
16
|
-
SqlConnectOptions,
|
|
17
|
-
} from "./types.ts";
|
|
11
|
+
import type { FilesDriver, IndexDriver, KvDriver, SqlDriver, SqlConnectOptions } from "./types.ts";
|
|
18
12
|
|
|
19
13
|
/** SQL conformance against one driver. */
|
|
20
14
|
export async function runSqlConformance(
|
|
@@ -37,9 +31,7 @@ export async function runSqlConformance(
|
|
|
37
31
|
expect(all).toHaveLength(1);
|
|
38
32
|
expect(all[0]?.title).toBe("hello");
|
|
39
33
|
|
|
40
|
-
const one = await primary.query(`SELECT * FROM "notes" WHERE "id" = ?`, [
|
|
41
|
-
"n1",
|
|
42
|
-
]);
|
|
34
|
+
const one = await primary.query(`SELECT * FROM "notes" WHERE "id" = ?`, ["n1"]);
|
|
43
35
|
expect(one[0]?.email).toBe("a@b.c");
|
|
44
36
|
|
|
45
37
|
const del = await primary.exec(`DELETE FROM "notes" WHERE "id" = ?`, ["n1"]);
|
|
@@ -51,10 +43,10 @@ export async function runSqlConformance(
|
|
|
51
43
|
await primary.exec(
|
|
52
44
|
`CREATE TABLE IF NOT EXISTS "counters" ("id" TEXT PRIMARY KEY, "clicks" INTEGER)`,
|
|
53
45
|
);
|
|
54
|
-
await primary.query(
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
);
|
|
46
|
+
await primary.query(`INSERT INTO "counters" ("id", "clicks") VALUES (?, ?) RETURNING *`, [
|
|
47
|
+
"c1",
|
|
48
|
+
0,
|
|
49
|
+
]);
|
|
58
50
|
|
|
59
51
|
const handle = createSqlStoreHandle(`sql:conformance`, {
|
|
60
52
|
connection: primary,
|
|
@@ -71,14 +63,9 @@ export async function runSqlConformance(
|
|
|
71
63
|
|
|
72
64
|
const concurrent = 100;
|
|
73
65
|
await Promise.all(
|
|
74
|
-
Array.from({ length: concurrent }, () =>
|
|
75
|
-
handle.increment(counters, "c1", "clicks"),
|
|
76
|
-
),
|
|
77
|
-
);
|
|
78
|
-
const finalRows = await primary.query(
|
|
79
|
-
`SELECT * FROM "counters" WHERE "id" = ?`,
|
|
80
|
-
["c1"],
|
|
66
|
+
Array.from({ length: concurrent }, () => handle.increment(counters, "c1", "clicks")),
|
|
81
67
|
);
|
|
68
|
+
const finalRows = await primary.query(`SELECT * FROM "counters" WHERE "id" = ?`, ["c1"]);
|
|
82
69
|
expect(Number(finalRows[0]?.clicks)).toBe(1 + concurrent);
|
|
83
70
|
} finally {
|
|
84
71
|
await primary.close();
|
package/src/drivers/fs.ts
CHANGED
|
@@ -4,20 +4,14 @@
|
|
|
4
4
|
|
|
5
5
|
import { mkdir, rm } from "node:fs/promises";
|
|
6
6
|
import { join } from "node:path";
|
|
7
|
-
import type {
|
|
8
|
-
FilesBucket,
|
|
9
|
-
FilesDriver,
|
|
10
|
-
FilesOpenOptions,
|
|
11
|
-
} from "./types.ts";
|
|
7
|
+
import type { FilesBucket, FilesDriver, FilesOpenOptions } from "./types.ts";
|
|
12
8
|
|
|
13
9
|
/**
|
|
14
10
|
* Open a files bucket rooted on the local filesystem.
|
|
15
11
|
*
|
|
16
12
|
* @param options - Bucket name and root directory
|
|
17
13
|
*/
|
|
18
|
-
export async function openFsBucket(
|
|
19
|
-
options: FilesOpenOptions,
|
|
20
|
-
): Promise<FilesBucket> {
|
|
14
|
+
export async function openFsBucket(options: FilesOpenOptions): Promise<FilesBucket> {
|
|
21
15
|
const root = options.root ?? join(tmpdirSafe(), `oke-files-${options.name}`);
|
|
22
16
|
await mkdir(root, { recursive: true });
|
|
23
17
|
|
package/src/drivers/index.ts
CHANGED
|
@@ -67,33 +67,17 @@ export {
|
|
|
67
67
|
type PostgresClientLike,
|
|
68
68
|
} from "./postgres.ts";
|
|
69
69
|
|
|
70
|
-
export {
|
|
71
|
-
redisDriver,
|
|
72
|
-
openRedisKv,
|
|
73
|
-
createRedisFakeClient,
|
|
74
|
-
createBunRedisClient,
|
|
75
|
-
} from "./redis.ts";
|
|
70
|
+
export { redisDriver, openRedisKv, createRedisFakeClient, createBunRedisClient } from "./redis.ts";
|
|
76
71
|
|
|
77
|
-
export {
|
|
78
|
-
LuaKvStore,
|
|
79
|
-
registerLuaScript,
|
|
80
|
-
hasLuaScript,
|
|
81
|
-
} from "./kv-lua.ts";
|
|
72
|
+
export { LuaKvStore, registerLuaScript, hasLuaScript } from "./kv-lua.ts";
|
|
82
73
|
|
|
83
74
|
export { fsDriver, openFsBucket } from "./fs.ts";
|
|
84
75
|
|
|
85
|
-
export {
|
|
86
|
-
s3Driver,
|
|
87
|
-
openS3Bucket,
|
|
88
|
-
createS3FakeClient,
|
|
89
|
-
} from "./s3.ts";
|
|
76
|
+
export { s3Driver, openS3Bucket, createS3FakeClient } from "./s3.ts";
|
|
90
77
|
|
|
91
78
|
export { pgvectorDriver, openPgvectorIndex } from "./pgvector.ts";
|
|
92
79
|
|
|
93
|
-
export {
|
|
94
|
-
memorySignalDriver,
|
|
95
|
-
openMemorySignal,
|
|
96
|
-
} from "./signal-memory.ts";
|
|
80
|
+
export { memorySignalDriver, openMemorySignal } from "./signal-memory.ts";
|
|
97
81
|
|
|
98
82
|
export {
|
|
99
83
|
postgresSignalDriver,
|
|
@@ -110,28 +94,15 @@ export {
|
|
|
110
94
|
parseXreadgroupReply,
|
|
111
95
|
} from "./signal-redis.ts";
|
|
112
96
|
|
|
113
|
-
export {
|
|
114
|
-
natsSignalDriver,
|
|
115
|
-
openNatsSignal,
|
|
116
|
-
createSignalNatsFake,
|
|
117
|
-
} from "./signal-nats.ts";
|
|
97
|
+
export { natsSignalDriver, openNatsSignal, createSignalNatsFake } from "./signal-nats.ts";
|
|
118
98
|
|
|
119
99
|
// Conformance helpers are test-only — import from `okengine/drivers/conformance`.
|
|
120
100
|
|
|
121
|
-
export type {
|
|
122
|
-
VaultDriverId,
|
|
123
|
-
VaultOpenOptions,
|
|
124
|
-
VaultBag,
|
|
125
|
-
VaultDriver,
|
|
126
|
-
} from "./vault-types.ts";
|
|
101
|
+
export type { VaultDriverId, VaultOpenOptions, VaultBag, VaultDriver } from "./vault-types.ts";
|
|
127
102
|
|
|
128
103
|
export { memoryVaultDriver } from "./vault-memory.ts";
|
|
129
104
|
export { envVaultDriver } from "./vault-env.ts";
|
|
130
|
-
export {
|
|
131
|
-
sopsVaultDriver,
|
|
132
|
-
buildSopsFixture,
|
|
133
|
-
sopsEncryptValue,
|
|
134
|
-
} from "./vault-sops.ts";
|
|
105
|
+
export { sopsVaultDriver, buildSopsFixture, sopsEncryptValue } from "./vault-sops.ts";
|
|
135
106
|
export { openbaoVaultDriver } from "./vault-openbao.ts";
|
|
136
107
|
export { infisicalVaultDriver } from "./vault-infisical.ts";
|
|
137
108
|
export { managedVaultDriver } from "./vault-managed.ts";
|
|
@@ -150,25 +121,13 @@ export type {
|
|
|
150
121
|
} from "./channel-types.ts";
|
|
151
122
|
export { createChannelInbox } from "./channel-types.ts";
|
|
152
123
|
|
|
153
|
-
export {
|
|
154
|
-
consoleChannelDriver,
|
|
155
|
-
openConsoleChannel,
|
|
156
|
-
} from "./channel-console.ts";
|
|
124
|
+
export { consoleChannelDriver, openConsoleChannel } from "./channel-console.ts";
|
|
157
125
|
export { smtpChannelDriver, openSmtpChannel } from "./channel-smtp.ts";
|
|
158
126
|
export { resendChannelDriver, openResendChannel } from "./channel-resend.ts";
|
|
159
|
-
export {
|
|
160
|
-
|
|
161
|
-
openUnifonicChannel,
|
|
162
|
-
} from "./channel-unifonic.ts";
|
|
163
|
-
export {
|
|
164
|
-
waCloudChannelDriver,
|
|
165
|
-
openWaCloudChannel,
|
|
166
|
-
} from "./channel-wa-cloud.ts";
|
|
127
|
+
export { unifonicChannelDriver, openUnifonicChannel } from "./channel-unifonic.ts";
|
|
128
|
+
export { waCloudChannelDriver, openWaCloudChannel } from "./channel-wa-cloud.ts";
|
|
167
129
|
export { fcmChannelDriver, openFcmChannel } from "./channel-fcm.ts";
|
|
168
|
-
export {
|
|
169
|
-
webpushChannelDriver,
|
|
170
|
-
openWebPushChannel,
|
|
171
|
-
} from "./channel-webpush.ts";
|
|
130
|
+
export { webpushChannelDriver, openWebPushChannel } from "./channel-webpush.ts";
|
|
172
131
|
|
|
173
132
|
export type {
|
|
174
133
|
AiDriverId,
|
|
@@ -184,7 +143,4 @@ export type {
|
|
|
184
143
|
|
|
185
144
|
export { mockAiDriver, createMockAiDriver } from "./ai-mock.ts";
|
|
186
145
|
export { anthropicAiDriver, openAnthropic } from "./ai-anthropic.ts";
|
|
187
|
-
export {
|
|
188
|
-
openaiCompatibleAiDriver,
|
|
189
|
-
openOpenaiCompatible,
|
|
190
|
-
} from "./ai-openai-compatible.ts";
|
|
146
|
+
export { openaiCompatibleAiDriver, openOpenaiCompatible } from "./ai-openai-compatible.ts";
|
package/src/drivers/memory.ts
CHANGED
|
@@ -53,12 +53,8 @@ function createMemorySqlConnection(role: "primary" | "replica"): SqlConnection {
|
|
|
53
53
|
const table = getTable(parseIdent(selectGeneric[2]!));
|
|
54
54
|
const selectList = selectGeneric[1]!.trim();
|
|
55
55
|
const whereClause = selectGeneric[3]?.trim();
|
|
56
|
-
const orderCol = selectGeneric[4]
|
|
57
|
-
|
|
58
|
-
: undefined;
|
|
59
|
-
const limit = selectGeneric[5]
|
|
60
|
-
? Number(selectGeneric[5])
|
|
61
|
-
: undefined;
|
|
56
|
+
const orderCol = selectGeneric[4] ? parseIdent(selectGeneric[4]) : undefined;
|
|
57
|
+
const limit = selectGeneric[5] ? Number(selectGeneric[5]) : undefined;
|
|
62
58
|
let rows = table.rows.map((r) => ({ ...r }));
|
|
63
59
|
if (whereClause) {
|
|
64
60
|
const preds = parseWherePredicates(whereClause);
|
|
@@ -74,9 +70,8 @@ function createMemorySqlConnection(role: "primary" | "replica"): SqlConnection {
|
|
|
74
70
|
if (limit !== undefined) rows = rows.slice(0, limit);
|
|
75
71
|
if (selectList === "*") return rows;
|
|
76
72
|
const cols = selectList.split(",").map((part) => {
|
|
77
|
-
const as =
|
|
78
|
-
part
|
|
79
|
-
);
|
|
73
|
+
const as =
|
|
74
|
+
/^\s*("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s+AS\s+("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s*$/i.exec(part);
|
|
80
75
|
if (as) {
|
|
81
76
|
return { sql: parseIdent(as[1]!), alias: parseIdent(as[2]!) };
|
|
82
77
|
}
|
|
@@ -97,9 +92,7 @@ function createMemorySqlConnection(role: "primary" | "replica"): SqlConnection {
|
|
|
97
92
|
if (exists) {
|
|
98
93
|
const table = getTable(parseIdent(exists[2]!));
|
|
99
94
|
const preds = parseEqualityWhere(exists[3]!);
|
|
100
|
-
const hit = table.rows.some((r) =>
|
|
101
|
-
preds.every((p, i) => r[p] === params[i]),
|
|
102
|
-
);
|
|
95
|
+
const hit = table.rows.some((r) => preds.every((p, i) => r[p] === params[i]));
|
|
103
96
|
return hit ? [{ [parseIdent(exists[1]!)]: 1 }] : [];
|
|
104
97
|
}
|
|
105
98
|
|
|
@@ -215,18 +208,14 @@ function createMemorySqlConnection(role: "primary" | "replica"): SqlConnection {
|
|
|
215
208
|
throw new Error(`memory sql: unsupported exec: ${sql}`);
|
|
216
209
|
}
|
|
217
210
|
const preds = parseEqualityWhere(updateIncAnd[4]!);
|
|
218
|
-
const row = table.rows.find((r) =>
|
|
219
|
-
preds.every((p, i) => r[p] === params[i]),
|
|
220
|
-
);
|
|
211
|
+
const row = table.rows.find((r) => preds.every((p, i) => r[p] === params[i]));
|
|
221
212
|
if (!row) return { changes: 0 };
|
|
222
213
|
row[setCol] = Number(row[setCol] ?? 0) + 1;
|
|
223
214
|
return { changes: 1 };
|
|
224
215
|
}
|
|
225
216
|
|
|
226
217
|
const updateSet =
|
|
227
|
-
/^UPDATE\s+("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s+SET\s+(.+?)\s+WHERE\s+(.+)\s*$/i.exec(
|
|
228
|
-
text,
|
|
229
|
-
);
|
|
218
|
+
/^UPDATE\s+("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s+SET\s+(.+?)\s+WHERE\s+(.+)\s*$/i.exec(text);
|
|
230
219
|
if (updateSet) {
|
|
231
220
|
const table = getTable(parseIdent(updateSet[1]!));
|
|
232
221
|
const setParts = updateSet[2]!.split(",").map((p) => p.trim());
|
|
@@ -237,9 +226,7 @@ function createMemorySqlConnection(role: "primary" | "replica"): SqlConnection {
|
|
|
237
226
|
});
|
|
238
227
|
const preds = parseWherePredicates(updateSet[3]!);
|
|
239
228
|
const row = table.rows.find((r) =>
|
|
240
|
-
preds.every((p, i) =>
|
|
241
|
-
compareRow(r[p.column], params[setCols.length + i], p.op),
|
|
242
|
-
),
|
|
229
|
+
preds.every((p, i) => compareRow(r[p.column], params[setCols.length + i], p.op)),
|
|
243
230
|
);
|
|
244
231
|
if (!row) return { changes: 0 };
|
|
245
232
|
setCols.forEach((col, i) => {
|
|
@@ -275,23 +262,15 @@ interface WherePred {
|
|
|
275
262
|
/** Parse `col = ? AND col2 < ?` into ordered predicates. */
|
|
276
263
|
function parseWherePredicates(clause: string): WherePred[] {
|
|
277
264
|
return clause.split(/\s+AND\s+/i).map((part) => {
|
|
278
|
-
const m =
|
|
279
|
-
/^("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s*(=|<=|>=|<>|!=|<|>)\s*\?$/.exec(
|
|
280
|
-
part.trim(),
|
|
281
|
-
);
|
|
265
|
+
const m = /^("?[a-zA-Z_][a-zA-Z0-9_]*"?)\s*(=|<=|>=|<>|!=|<|>)\s*\?$/.exec(part.trim());
|
|
282
266
|
if (!m) throw new Error(`memory sql: unsupported WHERE: ${clause}`);
|
|
283
267
|
const opRaw = m[2]!;
|
|
284
|
-
const op: WherePred["op"] =
|
|
285
|
-
opRaw === "<>" ? "!=" : (opRaw as WherePred["op"]);
|
|
268
|
+
const op: WherePred["op"] = opRaw === "<>" ? "!=" : (opRaw as WherePred["op"]);
|
|
286
269
|
return { column: m[1]!.replaceAll('"', "").trim(), op };
|
|
287
270
|
});
|
|
288
271
|
}
|
|
289
272
|
|
|
290
|
-
function compareRow(
|
|
291
|
-
cell: unknown,
|
|
292
|
-
want: unknown,
|
|
293
|
-
op: WherePred["op"],
|
|
294
|
-
): boolean {
|
|
273
|
+
function compareRow(cell: unknown, want: unknown, op: WherePred["op"]): boolean {
|
|
295
274
|
if (op === "=") return cell === want;
|
|
296
275
|
if (op === "!=") return cell !== want;
|
|
297
276
|
const a = Number(cell ?? 0);
|
|
@@ -382,8 +361,7 @@ export const memoryFilesDriver: FilesDriver = {
|
|
|
382
361
|
return {
|
|
383
362
|
driverId: "memory",
|
|
384
363
|
async put(key, data) {
|
|
385
|
-
const bytes =
|
|
386
|
-
typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
364
|
+
const bytes = typeof data === "string" ? new TextEncoder().encode(data) : data;
|
|
387
365
|
objects.set(prefix + key, bytes);
|
|
388
366
|
},
|
|
389
367
|
async get(key) {
|
|
@@ -425,17 +403,12 @@ export const memoryIndexDriver: IndexDriver = {
|
|
|
425
403
|
id: "memory",
|
|
426
404
|
facet: "index",
|
|
427
405
|
async open(options: IndexOpenOptions): Promise<IndexStore> {
|
|
428
|
-
const docs = new Map<
|
|
429
|
-
string,
|
|
430
|
-
{ vector: number[]; meta?: Record<string, unknown> }
|
|
431
|
-
>();
|
|
406
|
+
const docs = new Map<string, { vector: number[]; meta?: Record<string, unknown> }>();
|
|
432
407
|
return {
|
|
433
408
|
driverId: "memory",
|
|
434
409
|
async upsert(id, vector, meta) {
|
|
435
410
|
if (vector.length !== options.dims) {
|
|
436
|
-
throw new Error(
|
|
437
|
-
`vector dims ${vector.length} !== index dims ${options.dims}`,
|
|
438
|
-
);
|
|
411
|
+
throw new Error(`vector dims ${vector.length} !== index dims ${options.dims}`);
|
|
439
412
|
}
|
|
440
413
|
docs.set(id, { vector: [...vector], meta });
|
|
441
414
|
},
|
package/src/drivers/pgvector.ts
CHANGED
|
@@ -18,9 +18,7 @@ import type {
|
|
|
18
18
|
*
|
|
19
19
|
* @param options - Name / dims / SQL connection
|
|
20
20
|
*/
|
|
21
|
-
export async function openPgvectorIndex(
|
|
22
|
-
options: IndexOpenOptions,
|
|
23
|
-
): Promise<IndexStore> {
|
|
21
|
+
export async function openPgvectorIndex(options: IndexOpenOptions): Promise<IndexStore> {
|
|
24
22
|
if (options.sql) {
|
|
25
23
|
return openPgvectorSql(options.name, options.dims, options.sql);
|
|
26
24
|
}
|
|
@@ -45,10 +43,11 @@ async function openPgvectorSql(
|
|
|
45
43
|
throw new Error(`vector dims ${vector.length} !== index dims ${dims}`);
|
|
46
44
|
}
|
|
47
45
|
await sql.exec(`DELETE FROM "${table}" WHERE id = ?`, [id]);
|
|
48
|
-
await sql.exec(
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
await sql.exec(`INSERT INTO "${table}" (id, embedding, meta) VALUES (?, ?, ?)`, [
|
|
47
|
+
id,
|
|
48
|
+
JSON.stringify(vector),
|
|
49
|
+
meta ? JSON.stringify(meta) : null,
|
|
50
|
+
]);
|
|
52
51
|
},
|
|
53
52
|
async search(vector, topK = 10): Promise<IndexHit[]> {
|
|
54
53
|
const rows = await sql.query(`SELECT id, embedding, meta FROM "${table}"`);
|
|
@@ -78,10 +77,7 @@ async function openPgvectorSql(
|
|
|
78
77
|
}
|
|
79
78
|
|
|
80
79
|
function openPgvectorMemory(dims: number): IndexStore {
|
|
81
|
-
const docs = new Map<
|
|
82
|
-
string,
|
|
83
|
-
{ vector: number[]; meta?: Record<string, unknown> }
|
|
84
|
-
>();
|
|
80
|
+
const docs = new Map<string, { vector: number[]; meta?: Record<string, unknown> }>();
|
|
85
81
|
return {
|
|
86
82
|
driverId: "pgvector",
|
|
87
83
|
async upsert(id, vector, meta) {
|
package/src/drivers/postgres.ts
CHANGED
|
@@ -4,16 +4,14 @@
|
|
|
4
4
|
* Protocol-named: Neon, Supabase, RDS, Timescale all speak postgres.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type {
|
|
8
|
-
SqlConnectOptions,
|
|
9
|
-
SqlConnection,
|
|
10
|
-
SqlDriver,
|
|
11
|
-
SqlRow,
|
|
12
|
-
} from "./types.ts";
|
|
7
|
+
import type { SqlConnectOptions, SqlConnection, SqlDriver, SqlRow } from "./types.ts";
|
|
13
8
|
|
|
14
9
|
/** Minimal surface we use from Bun.SQL (and test fakes). */
|
|
15
10
|
export interface PostgresClientLike {
|
|
16
|
-
unsafe(
|
|
11
|
+
unsafe(
|
|
12
|
+
sql: string,
|
|
13
|
+
values?: unknown[],
|
|
14
|
+
): PromiseLike<SqlRow[] | { length: number; changes?: number } | SqlRow[]>;
|
|
17
15
|
close?(options?: { timeout?: number }): Promise<void>;
|
|
18
16
|
}
|
|
19
17
|
|
|
@@ -32,9 +30,7 @@ export function toPostgresParams(sql: string): string {
|
|
|
32
30
|
*
|
|
33
31
|
* @param options - URL / role / injected client
|
|
34
32
|
*/
|
|
35
|
-
export async function connectPostgres(
|
|
36
|
-
options: SqlConnectOptions = {},
|
|
37
|
-
): Promise<SqlConnection> {
|
|
33
|
+
export async function connectPostgres(options: SqlConnectOptions = {}): Promise<SqlConnection> {
|
|
38
34
|
const role = options.role ?? "primary";
|
|
39
35
|
const client =
|
|
40
36
|
(options.client as PostgresClientLike | undefined) ??
|
|
@@ -121,9 +117,7 @@ export function createPostgresFakeClient(): PostgresClientLike & {
|
|
|
121
117
|
if (exists) {
|
|
122
118
|
const rows = tables.get(parseIdent(exists[2]!)) ?? [];
|
|
123
119
|
const preds = parseEqualityWhere(exists[3]!);
|
|
124
|
-
const hit = rows.some((r) =>
|
|
125
|
-
preds.every((p, i) => r[p] === values[i]),
|
|
126
|
-
);
|
|
120
|
+
const hit = rows.some((r) => preds.every((p, i) => r[p] === values[i]));
|
|
127
121
|
return hit ? [{ [parseIdent(exists[1]!)]: 1 }] : [];
|
|
128
122
|
}
|
|
129
123
|
|