okengine 0.2.6 → 0.3.2
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 +33 -30
- package/README.md +74 -340
- package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
- package/package.json +47 -44
- package/site/content/docs/ai/llms-txt.mdx +54 -0
- package/site/content/docs/ai/mcp.mdx +123 -0
- package/site/content/docs/ai/meta.json +5 -0
- package/site/content/docs/ai/skills.mdx +53 -0
- package/site/content/docs/console/access.mdx +29 -0
- package/site/content/docs/console/ai.mdx +35 -0
- package/site/content/docs/console/architecture.mdx +35 -0
- package/site/content/docs/console/channels.mdx +37 -0
- package/site/content/docs/console/clock.mdx +31 -0
- package/site/content/docs/console/flows.mdx +31 -0
- package/site/content/docs/console/gates.mdx +35 -0
- package/site/content/docs/console/manifest-diff.mdx +34 -0
- package/site/content/docs/console/meta.json +23 -0
- package/site/content/docs/console/overview.mdx +40 -0
- package/site/content/docs/console/plugins.mdx +41 -0
- package/site/content/docs/console/privacy.mdx +32 -0
- package/site/content/docs/console/runs.mdx +40 -0
- package/site/content/docs/console/signals.mdx +31 -0
- package/site/content/docs/console/store.mdx +32 -0
- package/site/content/docs/console/tenancy.mdx +32 -0
- package/site/content/docs/console/traces.mdx +34 -0
- package/site/content/docs/console/vault.mdx +37 -0
- package/site/content/docs/elements/ai.mdx +180 -0
- package/site/content/docs/elements/channel.mdx +167 -0
- package/site/content/docs/elements/clock.mdx +182 -0
- package/site/content/docs/elements/flow.mdx +288 -0
- package/site/content/docs/elements/gate.mdx +171 -0
- package/site/content/docs/elements/meta.json +5 -0
- package/site/content/docs/elements/signal.mdx +171 -0
- package/site/content/docs/elements/store.mdx +320 -0
- package/site/content/docs/elements/vault.mdx +263 -0
- package/site/content/docs/get-started/basic-usage.mdx +124 -0
- package/site/content/docs/get-started/comparison.mdx +65 -0
- package/site/content/docs/get-started/installation.mdx +113 -0
- package/site/content/docs/get-started/introduction.mdx +123 -0
- package/site/content/docs/get-started/meta.json +5 -0
- package/site/content/docs/index.mdx +63 -0
- package/site/content/docs/meta.json +5 -0
- package/site/content/docs/plugins/compression.mdx +60 -0
- package/site/content/docs/plugins/cors.mdx +92 -0
- package/site/content/docs/plugins/csrf.mdx +96 -0
- package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
- package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
- package/site/content/docs/plugins/meta.json +15 -0
- package/site/content/docs/plugins/security-headers.mdx +136 -0
- package/site/content/docs/reference/cli.md +101 -0
- package/site/content/docs/reference/configuration.mdx +159 -0
- package/site/content/docs/reference/environment-variables.mdx +87 -0
- package/site/content/docs/reference/errors.mdx +80 -0
- package/site/content/docs/reference/fx.mdx +117 -0
- package/site/content/docs/reference/meta.json +5 -0
- package/site/content/docs/reference/plugins.mdx +249 -0
- package/site/content/docs/reference/security.md +63 -0
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +56 -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 +456 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +193 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev-schema-sync.test.ts +66 -0
- package/src/cli/dev-schema-sync.ts +139 -0
- package/src/cli/dev.test.ts +264 -15
- package/src/cli/dev.ts +355 -139
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +27 -8
- package/src/cli/docker.ts +11 -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/drizzle-env.test.ts +67 -0
- package/src/cli/drizzle-env.ts +78 -0
- package/src/cli/ensure-drizzle-config.ts +50 -0
- 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 +47 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +65 -0
- package/src/cli/openbao-bootstrap.test.ts +147 -0
- package/src/cli/openbao-bootstrap.ts +280 -0
- package/src/cli/openbao-restart.integration.test.ts +136 -0
- package/src/cli/ports.test.ts +7 -14
- package/src/cli/ports.ts +7 -5
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/resolve-dev-sql-env.test.ts +48 -0
- package/src/cli/resolve-dev-sql-env.ts +42 -0
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +8 -10
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/cli/vault-cmd.ts +63 -0
- 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 +15 -30
- 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 +136 -30
- package/src/compiler/extract.ts +485 -157
- package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
- 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 +16 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +55 -34
- package/src/config/index.ts +177 -46
- 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 +16 -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 +44 -66
- 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 +215 -27
- package/src/docker/derive.ts +6 -14
- package/src/docker/docker.test.ts +118 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +9 -6
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +6 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/openbao.ts +47 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +11 -2
- package/src/docker/recipes/rustfs.ts +32 -0
- package/src/docker/stack-id.test.ts +73 -5
- package/src/docker/stack-id.ts +124 -33
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/stack.ts +36 -4
- package/src/docker/types.ts +16 -4
- package/src/docs-origin.ts +4 -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/drizzle-dialect.test.ts +20 -0
- package/src/drivers/drizzle-dialect.ts +37 -0
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -57
- package/src/drivers/memory.ts +287 -75
- 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 +15 -18
- 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-driver-removal.test.ts +55 -0
- 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.test.ts +97 -0
- package/src/drivers/vault-openbao.ts +103 -40
- package/src/drivers/vault-types.ts +3 -16
- 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 +11 -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/resource-list-docs.fixture.ts +56 -0
- package/src/elements/store/resource-list-docs.test.ts +79 -0
- package/src/elements/store/resource.test.ts +253 -0
- package/src/elements/store/resource.ts +786 -0
- 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.test.ts +132 -0
- package/src/elements/store/sql-condition.ts +293 -65
- package/src/elements/store/sql-session.test.ts +135 -0
- package/src/elements/store/sql-session.ts +241 -84
- package/src/elements/store/table.ts +69 -23
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +53 -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 +19 -33
- package/src/elements/vault.test.ts +12 -55
- package/src/elements/vault.ts +9 -13
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +92 -118
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.test.ts +60 -0
- package/src/kernel/boot-bind/channel.ts +61 -5
- 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 +27 -18
- package/src/kernel/boot-bind/store.ts +93 -52
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -10
- package/src/kernel/boot.ts +30 -77
- 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/edge.test.ts +68 -0
- 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 +13 -25
- package/src/kernel/fx.test.ts +31 -40
- package/src/kernel/fx.ts +135 -90
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +43 -10
- package/src/kernel/hooks.ts +25 -12
- package/src/kernel/index.ts +11 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +45 -9
- 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 +81 -27
- package/src/kernel/registry-isolation.test.ts +74 -0
- package/src/kernel/registry.ts +102 -30
- 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 +63 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/fixtures/skyport.excerpt.json +1 -1
- package/src/manifest/fixtures/skyport.manifest.json +1 -1
- package/src/manifest/index.ts +3 -10
- package/src/manifest/types.ts +30 -6
- 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 +5 -15
- 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/compression.test.ts +127 -0
- package/src/plugins/compression.ts +94 -0
- package/src/plugins/config-source.test.ts +204 -0
- package/src/plugins/config-source.ts +209 -0
- package/src/plugins/cors.test.ts +138 -0
- package/src/plugins/cors.ts +129 -0
- package/src/plugins/csrf.test.ts +102 -0
- package/src/plugins/csrf.ts +86 -0
- package/src/plugins/headers.ts +54 -0
- package/src/plugins/index.ts +26 -0
- package/src/plugins/ip-allowlist.test.ts +105 -0
- package/src/plugins/ip-allowlist.ts +76 -0
- package/src/plugins/maintenance-mode.test.ts +91 -0
- package/src/plugins/maintenance-mode.ts +85 -0
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/security-headers.test.ts +243 -0
- package/src/plugins/security-headers.ts +255 -0
- 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 +16 -45
- 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 +27 -33
- 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/docs/spec/console.md +0 -739
- package/docs/spec/example.md +0 -1196
- package/docs/spec/four-applications.md +0 -1195
- package/docs/spec/unified-theory.md +0 -489
- package/src/cli/doc-drift.test.ts +0 -146
- package/src/cli/doc-drift.ts +0 -430
- package/src/cli/doctor-diff-examples.ts +0 -92
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
- package/src/drivers/vault-sops.ts +0 -271
|
@@ -7,11 +7,7 @@
|
|
|
7
7
|
*/
|
|
8
8
|
|
|
9
9
|
import { describe, expect, test } from "bun:test";
|
|
10
|
-
import {
|
|
11
|
-
createPostgresFakeClient,
|
|
12
|
-
postgresDriver,
|
|
13
|
-
sqliteDriver,
|
|
14
|
-
} from "../drivers/index.ts";
|
|
10
|
+
import { createPostgresFakeClient, postgresDriver, sqliteDriver } from "../drivers/index.ts";
|
|
15
11
|
import type { Effects } from "../manifest/types.ts";
|
|
16
12
|
import {
|
|
17
13
|
classify,
|
|
@@ -72,9 +68,7 @@ describe("store facets", () => {
|
|
|
72
68
|
});
|
|
73
69
|
|
|
74
70
|
test("id and now helpers", () => {
|
|
75
|
-
expect(id()).toMatch(
|
|
76
|
-
/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,
|
|
77
|
-
);
|
|
71
|
+
expect(id()).toMatch(/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i);
|
|
78
72
|
expect(now()).toBeGreaterThan(0);
|
|
79
73
|
});
|
|
80
74
|
});
|
|
@@ -119,13 +113,11 @@ describe("same flow against sqlite and postgres", () => {
|
|
|
119
113
|
describe("replica routing from effects", () => {
|
|
120
114
|
test("read-only flows are detected from the effect set", () => {
|
|
121
115
|
expect(isReadOnlyStoreFlow({ reads: ["sql:notes"] })).toBe(true);
|
|
122
|
-
expect(
|
|
123
|
-
isReadOnlyStoreFlow({ reads: ["sql:notes"], writes: ["sql:notes"] }),
|
|
124
|
-
).toBe(false);
|
|
116
|
+
expect(isReadOnlyStoreFlow({ reads: ["sql:notes"], writes: ["sql:notes"] })).toBe(false);
|
|
125
117
|
expect(sqlRoleForEffects({ reads: ["sql:notes"] }, true)).toBe("replica");
|
|
126
|
-
expect(
|
|
127
|
-
|
|
128
|
-
)
|
|
118
|
+
expect(sqlRoleForEffects({ reads: ["sql:notes"], writes: ["sql:notes"] }, true)).toBe(
|
|
119
|
+
"primary",
|
|
120
|
+
);
|
|
129
121
|
});
|
|
130
122
|
|
|
131
123
|
test("read-only flow provably hits a replica", async () => {
|
|
@@ -135,10 +127,11 @@ describe("replica routing from effects", () => {
|
|
|
135
127
|
await replicaClient.unsafe(
|
|
136
128
|
`CREATE TABLE IF NOT EXISTS "notes" ("id" TEXT PRIMARY KEY, "title" TEXT, "email" TEXT)`,
|
|
137
129
|
);
|
|
138
|
-
await replicaClient.unsafe(
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
130
|
+
await replicaClient.unsafe(`INSERT INTO "notes" ("id", "title", "email") VALUES ($1, $2, $3)`, [
|
|
131
|
+
"n1",
|
|
132
|
+
"from-replica",
|
|
133
|
+
"x@y.z",
|
|
134
|
+
]);
|
|
142
135
|
|
|
143
136
|
const decl = store.sql("notes", {
|
|
144
137
|
classify: { notes: { email: classify({ pii: true }) } },
|
|
@@ -213,12 +206,8 @@ describe("tier-1 cache invalidation from effects", () => {
|
|
|
213
206
|
expiresAt: null,
|
|
214
207
|
});
|
|
215
208
|
|
|
216
|
-
expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:notes"] })).toBe(
|
|
217
|
-
|
|
218
|
-
);
|
|
219
|
-
expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:orders"] })).toBe(
|
|
220
|
-
false,
|
|
221
|
-
);
|
|
209
|
+
expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:notes"] })).toBe(true);
|
|
210
|
+
expect(isInvalidatedByWrite(keys[0]!, { writes: ["sql:orders"] })).toBe(false);
|
|
222
211
|
|
|
223
212
|
const event = cache.invalidateFromEffects({ writes: ["sql:notes"] });
|
|
224
213
|
expect(event.keys).toEqual([computedCacheKey("sql:notes")]);
|
|
@@ -268,10 +257,7 @@ describe("exists and increment helpers", () => {
|
|
|
268
257
|
}),
|
|
269
258
|
);
|
|
270
259
|
await handle.ensureTable(counters);
|
|
271
|
-
await handle
|
|
272
|
-
.insert(counters)
|
|
273
|
-
.values({ id: "c1", clicks: 0 })
|
|
274
|
-
.execute();
|
|
260
|
+
await handle.insert(counters).values({ id: "c1", clicks: 0 }).execute();
|
|
275
261
|
|
|
276
262
|
expect(await handle.exists(counters, { id: "c1" }), label).toBe(true);
|
|
277
263
|
expect(await handle.exists(counters, { id: "gone" }), label).toBe(false);
|
|
@@ -301,16 +287,11 @@ describe("exists and increment helpers", () => {
|
|
|
301
287
|
}),
|
|
302
288
|
);
|
|
303
289
|
await handle.ensureTable(counters);
|
|
304
|
-
await handle
|
|
305
|
-
.insert(counters)
|
|
306
|
-
.values({ id: "c1", clicks: 0 })
|
|
307
|
-
.execute();
|
|
290
|
+
await handle.insert(counters).values({ id: "c1", clicks: 0 }).execute();
|
|
308
291
|
|
|
309
292
|
const n = 100;
|
|
310
293
|
const results = await Promise.all(
|
|
311
|
-
Array.from({ length: n }, () =>
|
|
312
|
-
handle.increment(counters, "c1", "clicks"),
|
|
313
|
-
),
|
|
294
|
+
Array.from({ length: n }, () => handle.increment(counters, "c1", "clicks")),
|
|
314
295
|
);
|
|
315
296
|
expect(new Set(results).size, label).toBe(n);
|
|
316
297
|
expect(Math.max(...results), label).toBe(n);
|
|
@@ -337,10 +318,7 @@ describe("PII masking at the driver boundary", () => {
|
|
|
337
318
|
}),
|
|
338
319
|
);
|
|
339
320
|
await handle.ensureTable(notes);
|
|
340
|
-
await handle
|
|
341
|
-
.insert(notes)
|
|
342
|
-
.values({ id: "1", title: "t", email: "pii@x.com" })
|
|
343
|
-
.execute();
|
|
321
|
+
await handle.insert(notes).values({ id: "1", title: "t", email: "pii@x.com" }).execute();
|
|
344
322
|
|
|
345
323
|
const rows = await handle.raw(`SELECT * FROM notes`);
|
|
346
324
|
expect(rows[0]?.title).toBe("t");
|
package/src/elements/store.ts
CHANGED
|
@@ -21,6 +21,37 @@ export type {
|
|
|
21
21
|
IndexStoreOptions,
|
|
22
22
|
} from "./store/declare.ts";
|
|
23
23
|
|
|
24
|
+
export {
|
|
25
|
+
field,
|
|
26
|
+
schema,
|
|
27
|
+
schemaTable,
|
|
28
|
+
schemaRelations,
|
|
29
|
+
isSchemaTableDecl,
|
|
30
|
+
isSchemaColumnDecl,
|
|
31
|
+
isSchemaRelationsDecl,
|
|
32
|
+
isFieldBuilder,
|
|
33
|
+
finalizeColumnMap,
|
|
34
|
+
tablesFromExports,
|
|
35
|
+
relationsFromExports,
|
|
36
|
+
} from "./store/schema-decl.ts";
|
|
37
|
+
export type {
|
|
38
|
+
FieldBuilder,
|
|
39
|
+
FieldSqlType,
|
|
40
|
+
DefaultFnKind,
|
|
41
|
+
SchemaColumnDecl,
|
|
42
|
+
SchemaColumnInput,
|
|
43
|
+
SchemaTableDecl,
|
|
44
|
+
SchemaTableWithColumns,
|
|
45
|
+
SchemaRelationsDecl,
|
|
46
|
+
SchemaRelationEntry,
|
|
47
|
+
SchemaRelationOne,
|
|
48
|
+
SchemaRelationMany,
|
|
49
|
+
RelationColumnRef,
|
|
50
|
+
ReferenceAction,
|
|
51
|
+
ReferenceActions,
|
|
52
|
+
ColumnReference,
|
|
53
|
+
} from "./store/schema-decl.ts";
|
|
54
|
+
|
|
24
55
|
export {
|
|
25
56
|
classify,
|
|
26
57
|
buildClassificationMap,
|
|
@@ -39,47 +70,42 @@ export {
|
|
|
39
70
|
isInvalidatedByWrite,
|
|
40
71
|
parseTtlMs,
|
|
41
72
|
} from "./store/cache.ts";
|
|
42
|
-
export type {
|
|
43
|
-
CacheTier,
|
|
44
|
-
CacheEntry,
|
|
45
|
-
InvalidationEvent,
|
|
46
|
-
StoreCache,
|
|
47
|
-
} from "./store/cache.ts";
|
|
73
|
+
export type { CacheTier, CacheEntry, InvalidationEvent, StoreCache } from "./store/cache.ts";
|
|
48
74
|
|
|
49
|
-
export {
|
|
50
|
-
isReadOnlyStoreFlow,
|
|
51
|
-
sqlRoleForEffects,
|
|
52
|
-
resolveSqlTarget,
|
|
53
|
-
} from "./store/replica.ts";
|
|
75
|
+
export { isReadOnlyStoreFlow, sqlRoleForEffects, resolveSqlTarget } from "./store/replica.ts";
|
|
54
76
|
export type { SqlBindingConfig } from "./store/replica.ts";
|
|
55
77
|
|
|
56
|
-
export {
|
|
57
|
-
defineTable,
|
|
58
|
-
resolveTableName,
|
|
59
|
-
classificationsFromTable,
|
|
60
|
-
id,
|
|
61
|
-
now,
|
|
62
|
-
} from "./store/table.ts";
|
|
78
|
+
export { defineTable, resolveTableName, classificationsFromTable, id, now } from "./store/table.ts";
|
|
63
79
|
export type { ColumnDef, TableHandle } from "./store/table.ts";
|
|
64
80
|
|
|
65
|
-
export {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
81
|
+
export { resource } from "./store/resource.ts";
|
|
82
|
+
export type {
|
|
83
|
+
ColumnScope,
|
|
84
|
+
ListCountMode,
|
|
85
|
+
ListPageMode,
|
|
86
|
+
ResourceColumns,
|
|
87
|
+
ResourceDef,
|
|
88
|
+
ResourceFlowDefs,
|
|
89
|
+
ResourceListOptions,
|
|
90
|
+
ResourceOptions,
|
|
91
|
+
ResolvedListConfig,
|
|
92
|
+
} from "./store/resource.ts";
|
|
93
|
+
|
|
94
|
+
export { createSqlStoreHandle, resolvePkColumn } from "./store/sql-session.ts";
|
|
69
95
|
export type {
|
|
70
96
|
SqlStoreHandle,
|
|
71
97
|
SelectBuilder,
|
|
72
98
|
SelectFromBuilder,
|
|
99
|
+
SelectWhereBuilder,
|
|
100
|
+
SelectOrderBuilder,
|
|
73
101
|
InsertBuilder,
|
|
74
102
|
InsertValuesBuilder,
|
|
75
103
|
SqlSessionOptions,
|
|
104
|
+
SqlPageOptions,
|
|
76
105
|
WhereMap,
|
|
77
106
|
} from "./store/sql-session.ts";
|
|
78
107
|
|
|
79
|
-
export {
|
|
80
|
-
createStoreRuntime,
|
|
81
|
-
putTier2,
|
|
82
|
-
} from "./store/runtime.ts";
|
|
108
|
+
export { createStoreRuntime, putTier2 } from "./store/runtime.ts";
|
|
83
109
|
export type {
|
|
84
110
|
StoreRuntime,
|
|
85
111
|
StoreDriverBundle,
|
|
@@ -92,9 +118,5 @@ export type {
|
|
|
92
118
|
IndexStoreFxHandle,
|
|
93
119
|
} from "./store/runtime.ts";
|
|
94
120
|
|
|
95
|
-
export {
|
|
96
|
-
fileKeyWarnings,
|
|
97
|
-
contentAddressedKey,
|
|
98
|
-
projectFileKeys,
|
|
99
|
-
} from "./store/files-policy.ts";
|
|
121
|
+
export { fileKeyWarnings, contentAddressedKey, projectFileKeys } from "./store/files-policy.ts";
|
|
100
122
|
export type { FileKeyWarning } from "./store/files-policy.ts";
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Canonical vault compose-env path resolution — shared by app boot and Console.
|
|
3
|
+
*
|
|
4
|
+
* Compose credentials live at `docker/.env.docker`. Legacy project-root
|
|
5
|
+
* `.env.docker` is consulted when absent (soft-compat).
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { existsSync } from "node:fs";
|
|
9
|
+
import { resolve } from "node:path";
|
|
10
|
+
import type { VaultResolutionSource } from "./runtime.ts";
|
|
11
|
+
|
|
12
|
+
/** Canonical relative path for compose stack credentials. */
|
|
13
|
+
export const COMPOSE_ENV_REL = "docker/.env.docker";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Resolve the compose-env path: prefer `docker/.env.docker`, then legacy
|
|
17
|
+
* project-root `.env.docker`.
|
|
18
|
+
*
|
|
19
|
+
* @param root - Project root
|
|
20
|
+
*/
|
|
21
|
+
export function resolveComposeEnvPath(root: string): {
|
|
22
|
+
readonly path: string;
|
|
23
|
+
readonly source: Extract<VaultResolutionSource, ".env.docker">;
|
|
24
|
+
} {
|
|
25
|
+
const dockerPath = resolve(root, COMPOSE_ENV_REL);
|
|
26
|
+
if (existsSync(dockerPath)) {
|
|
27
|
+
return { path: dockerPath, source: ".env.docker" };
|
|
28
|
+
}
|
|
29
|
+
const legacyDocker = resolve(root, ".env.docker");
|
|
30
|
+
if (existsSync(legacyDocker)) {
|
|
31
|
+
return { path: legacyDocker, source: ".env.docker" };
|
|
32
|
+
}
|
|
33
|
+
return { path: dockerPath, source: ".env.docker" };
|
|
34
|
+
}
|
|
@@ -41,10 +41,7 @@ export interface VaultSecretDecl {
|
|
|
41
41
|
* @param name - Secret name
|
|
42
42
|
* @param options - Description / rotate / schema / dev fallback
|
|
43
43
|
*/
|
|
44
|
-
function declareSecret(
|
|
45
|
-
name: string,
|
|
46
|
-
options: VaultSecretOptions = {},
|
|
47
|
-
): VaultSecretDecl {
|
|
44
|
+
function declareSecret(name: string, options: VaultSecretOptions = {}): VaultSecretDecl {
|
|
48
45
|
if (!name) {
|
|
49
46
|
throw new TypeError("vault.secret: name is required");
|
|
50
47
|
}
|
|
@@ -52,9 +49,7 @@ function declareSecret(
|
|
|
52
49
|
kind: "secret",
|
|
53
50
|
name,
|
|
54
51
|
sensitive: options.sensitive ?? true,
|
|
55
|
-
...(options.description !== undefined
|
|
56
|
-
? { description: options.description }
|
|
57
|
-
: {}),
|
|
52
|
+
...(options.description !== undefined ? { description: options.description } : {}),
|
|
58
53
|
...(options.rotate !== undefined ? { rotate: options.rotate } : {}),
|
|
59
54
|
...(options.schema !== undefined ? { schema: options.schema } : {}),
|
|
60
55
|
...(options.dev !== undefined ? { dev: options.dev } : {}),
|
|
@@ -67,10 +62,7 @@ function declareSecret(
|
|
|
67
62
|
* @param name - Config name
|
|
68
63
|
* @param options - Description / schema / dev fallback
|
|
69
64
|
*/
|
|
70
|
-
function declareConfig(
|
|
71
|
-
name: string,
|
|
72
|
-
options: VaultSecretOptions = {},
|
|
73
|
-
): VaultSecretDecl {
|
|
65
|
+
function declareConfig(name: string, options: VaultSecretOptions = {}): VaultSecretDecl {
|
|
74
66
|
if (!name) {
|
|
75
67
|
throw new TypeError("vault.config: name is required");
|
|
76
68
|
}
|
|
@@ -78,9 +70,7 @@ function declareConfig(
|
|
|
78
70
|
kind: "config",
|
|
79
71
|
name,
|
|
80
72
|
sensitive: options.sensitive ?? false,
|
|
81
|
-
...(options.description !== undefined
|
|
82
|
-
? { description: options.description }
|
|
83
|
-
: {}),
|
|
73
|
+
...(options.description !== undefined ? { description: options.description } : {}),
|
|
84
74
|
...(options.rotate !== undefined ? { rotate: options.rotate } : {}),
|
|
85
75
|
...(options.schema !== undefined ? { schema: options.schema } : {}),
|
|
86
76
|
...(options.dev !== undefined ? { dev: options.dev } : {}),
|
|
@@ -88,41 +78,41 @@ function declareConfig(
|
|
|
88
78
|
}
|
|
89
79
|
|
|
90
80
|
/**
|
|
91
|
-
* Marker prefix for {@link vault.
|
|
92
|
-
* Resolved from
|
|
81
|
+
* Marker prefix for {@link vault.fromDocker} local fallbacks.
|
|
82
|
+
* Resolved from `docker/.env.docker` by `oke dev --docker` / vault boot.
|
|
93
83
|
*/
|
|
94
|
-
export const
|
|
84
|
+
export const FROM_DOCKER_PREFIX = "__oke_from_docker__:";
|
|
95
85
|
|
|
96
86
|
/**
|
|
97
|
-
*
|
|
87
|
+
* Local fallback that reads the URL built by the image recipe for `role`.
|
|
98
88
|
* The kernel never sees the underlying env-var names — only the URL.
|
|
99
89
|
*
|
|
100
90
|
* @param role - Image role (`store.sql`, …)
|
|
101
91
|
*/
|
|
102
|
-
export function
|
|
103
|
-
if (!role) throw new TypeError("vault.
|
|
104
|
-
return `${
|
|
92
|
+
export function fromDocker(role: string): string {
|
|
93
|
+
if (!role) throw new TypeError("vault.fromDocker: role is required");
|
|
94
|
+
return `${FROM_DOCKER_PREFIX}${role}`;
|
|
105
95
|
}
|
|
106
96
|
|
|
107
97
|
/**
|
|
108
|
-
* Whether a
|
|
98
|
+
* Whether a local fallback is a {@link fromDocker} marker.
|
|
109
99
|
*
|
|
110
100
|
* @param value - Candidate
|
|
111
101
|
*/
|
|
112
|
-
export function
|
|
113
|
-
return value.startsWith(
|
|
102
|
+
export function isFromDocker(value: string): boolean {
|
|
103
|
+
return value.startsWith(FROM_DOCKER_PREFIX);
|
|
114
104
|
}
|
|
115
105
|
|
|
116
106
|
/**
|
|
117
|
-
* Role encoded in a {@link
|
|
107
|
+
* Role encoded in a {@link fromDocker} marker.
|
|
118
108
|
*
|
|
119
|
-
* @param value - Marker from {@link
|
|
109
|
+
* @param value - Marker from {@link fromDocker}
|
|
120
110
|
*/
|
|
121
|
-
export function
|
|
122
|
-
if (!
|
|
123
|
-
throw new TypeError(`vault: not a
|
|
111
|
+
export function fromDockerRole(value: string): string {
|
|
112
|
+
if (!isFromDocker(value)) {
|
|
113
|
+
throw new TypeError(`vault: not a fromDocker marker: ${value}`);
|
|
124
114
|
}
|
|
125
|
-
return value.slice(
|
|
115
|
+
return value.slice(FROM_DOCKER_PREFIX.length);
|
|
126
116
|
}
|
|
127
117
|
|
|
128
118
|
/**
|
|
@@ -135,9 +125,9 @@ export const vault: {
|
|
|
135
125
|
(name: string, options?: VaultSecretOptions): VaultSecretDecl;
|
|
136
126
|
secret(name: string, options?: VaultSecretOptions): VaultSecretDecl;
|
|
137
127
|
config(name: string, options?: VaultSecretOptions): VaultSecretDecl;
|
|
138
|
-
|
|
128
|
+
fromDocker(role: string): string;
|
|
139
129
|
} = Object.assign(declareSecret, {
|
|
140
130
|
secret: declareSecret,
|
|
141
131
|
config: declareConfig,
|
|
142
|
-
|
|
132
|
+
fromDocker,
|
|
143
133
|
});
|
|
@@ -8,13 +8,8 @@
|
|
|
8
8
|
* @param value - Cleartext secret
|
|
9
9
|
*/
|
|
10
10
|
export async function fingerprintSecret(value: string): Promise<string> {
|
|
11
|
-
const digest = await crypto.subtle.digest(
|
|
12
|
-
|
|
13
|
-
new TextEncoder().encode(value),
|
|
14
|
-
);
|
|
15
|
-
const hex = [...new Uint8Array(digest)]
|
|
16
|
-
.map((b) => b.toString(16).padStart(2, "0"))
|
|
17
|
-
.join("");
|
|
11
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(value));
|
|
12
|
+
const hex = [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
18
13
|
return `sha256:${hex.slice(0, 16)}`;
|
|
19
14
|
}
|
|
20
15
|
|
|
@@ -11,17 +11,13 @@ export const SECRET_MASK = "[redacted:secret]";
|
|
|
11
11
|
*
|
|
12
12
|
* @param secrets - Cleartext values currently loaded
|
|
13
13
|
*/
|
|
14
|
-
export function createSecretRedactor(
|
|
15
|
-
secrets: Iterable<string>,
|
|
16
|
-
): {
|
|
14
|
+
export function createSecretRedactor(secrets: Iterable<string>): {
|
|
17
15
|
/** Redact a free-form string. */
|
|
18
16
|
redactString(input: string): string;
|
|
19
17
|
/** Deep-redact a JSON-like value. */
|
|
20
18
|
redact(value: unknown): unknown;
|
|
21
19
|
} {
|
|
22
|
-
const values = [...secrets]
|
|
23
|
-
.filter((v) => v.length > 0)
|
|
24
|
-
.sort((a, b) => b.length - a.length);
|
|
20
|
+
const values = [...secrets].filter((v) => v.length > 0).sort((a, b) => b.length - a.length);
|
|
25
21
|
|
|
26
22
|
function redactString(input: string): string {
|
|
27
23
|
let out = input;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import type { VaultBag, VaultDriver } from "../../drivers/vault-types.ts";
|
|
6
|
-
import {
|
|
6
|
+
import { fromDockerRole, isFromDocker } from "./declare.ts";
|
|
7
7
|
import type { VaultSecretDecl } from "./declare.ts";
|
|
8
8
|
import { fingerprintSecretSync } from "./fingerprint.ts";
|
|
9
9
|
import { createSecretRedactor, SECRET_MASK } from "./redact.ts";
|
|
@@ -25,13 +25,8 @@ export class VaultBootError extends Error {
|
|
|
25
25
|
* @param gaps - Missing secrets
|
|
26
26
|
*/
|
|
27
27
|
constructor(gaps: readonly VaultGap[]) {
|
|
28
|
-
const lines = gaps.map(
|
|
29
|
-
|
|
30
|
-
` - ${g.name}${g.description ? `: ${g.description}` : ""}`,
|
|
31
|
-
);
|
|
32
|
-
super(
|
|
33
|
-
`vault boot failed — ${gaps.length} missing secret(s):\n${lines.join("\n")}`,
|
|
34
|
-
);
|
|
28
|
+
const lines = gaps.map((g) => ` - ${g.name}${g.description ? `: ${g.description}` : ""}`);
|
|
29
|
+
super(`vault boot failed — ${gaps.length} missing secret(s):\n${lines.join("\n")}`);
|
|
35
30
|
this.name = "VaultBootError";
|
|
36
31
|
this.gaps = gaps;
|
|
37
32
|
}
|
|
@@ -39,12 +34,12 @@ export class VaultBootError extends Error {
|
|
|
39
34
|
|
|
40
35
|
/**
|
|
41
36
|
* Named layer in the resolution chain (console §9.8).
|
|
42
|
-
* Spec order: process.env → .env.local → .env.
|
|
37
|
+
* Spec order: process.env → .env.local → .env.docker → driver → dev-fallback.
|
|
43
38
|
*/
|
|
44
39
|
export type VaultResolutionSource =
|
|
45
40
|
| "process.env"
|
|
46
41
|
| ".env.local"
|
|
47
|
-
| ".env.
|
|
42
|
+
| ".env.docker"
|
|
48
43
|
| "driver"
|
|
49
44
|
| "dev-fallback";
|
|
50
45
|
|
|
@@ -76,7 +71,7 @@ export interface CreateVaultRuntimeOptions {
|
|
|
76
71
|
readonly secrets?: readonly VaultSecretDecl[];
|
|
77
72
|
/**
|
|
78
73
|
* Resolution chain — first hit wins.
|
|
79
|
-
*
|
|
74
|
+
* Callers pass the env-appropriate layers (env / openbao / memory / …).
|
|
80
75
|
*/
|
|
81
76
|
readonly chain?: readonly VaultChainLayer[];
|
|
82
77
|
/**
|
|
@@ -173,9 +168,7 @@ export interface VaultRuntime {
|
|
|
173
168
|
*
|
|
174
169
|
* @param options - Contracts + resolution chain
|
|
175
170
|
*/
|
|
176
|
-
export function createVaultRuntime(
|
|
177
|
-
options: CreateVaultRuntimeOptions = {},
|
|
178
|
-
): VaultRuntime {
|
|
171
|
+
export function createVaultRuntime(options: CreateVaultRuntimeOptions = {}): VaultRuntime {
|
|
179
172
|
const contracts = new Map<string, VaultSecretDecl>();
|
|
180
173
|
for (const s of options.secrets ?? []) {
|
|
181
174
|
contracts.set(s.name, s);
|
|
@@ -236,9 +229,7 @@ export function createVaultRuntime(
|
|
|
236
229
|
if (value === undefined || value.length === 0) {
|
|
237
230
|
gaps.push({
|
|
238
231
|
name: c.name,
|
|
239
|
-
...(c.description !== undefined
|
|
240
|
-
? { description: c.description }
|
|
241
|
-
: {}),
|
|
232
|
+
...(c.description !== undefined ? { description: c.description } : {}),
|
|
242
233
|
});
|
|
243
234
|
}
|
|
244
235
|
}
|
|
@@ -384,17 +375,15 @@ export function createVaultRuntime(
|
|
|
384
375
|
*
|
|
385
376
|
* @param layer - Chain layer
|
|
386
377
|
*/
|
|
387
|
-
export function resolveLayerSource(
|
|
388
|
-
layer: VaultChainLayer,
|
|
389
|
-
): VaultResolutionSource {
|
|
378
|
+
export function resolveLayerSource(layer: VaultChainLayer): VaultResolutionSource {
|
|
390
379
|
if (layer.source) return layer.source;
|
|
391
380
|
const path = layer.options?.path;
|
|
392
381
|
if (typeof path === "string") {
|
|
393
382
|
if (path.endsWith(".env.local") || path.includes("/.env.local")) {
|
|
394
383
|
return ".env.local";
|
|
395
384
|
}
|
|
396
|
-
if (path.endsWith(".env.
|
|
397
|
-
return ".env.
|
|
385
|
+
if (path.endsWith(".env.docker") || path.includes("/.env.docker")) {
|
|
386
|
+
return ".env.docker";
|
|
398
387
|
}
|
|
399
388
|
}
|
|
400
389
|
if (layer.driver.id === "env" && path === undefined) {
|
|
@@ -404,25 +393,25 @@ export function resolveLayerSource(
|
|
|
404
393
|
}
|
|
405
394
|
|
|
406
395
|
/**
|
|
407
|
-
* Resolve a `dev` fallback, expanding {@link import("./declare.ts").
|
|
408
|
-
* markers via
|
|
396
|
+
* Resolve a `dev` fallback, expanding {@link import("./declare.ts").fromDocker}
|
|
397
|
+
* markers via docker env (`OKE_<ROLE>_URL`) without teaching the kernel
|
|
409
398
|
* image-specific env-var names.
|
|
410
399
|
*
|
|
411
400
|
* @param dev - Declared fallback
|
|
412
401
|
*/
|
|
413
402
|
function resolveDevFallback(dev: string): string | undefined {
|
|
414
|
-
if (!
|
|
415
|
-
const role =
|
|
403
|
+
if (!isFromDocker(dev)) return dev;
|
|
404
|
+
const role = fromDockerRole(dev);
|
|
416
405
|
const key = `OKE_${role.replaceAll(".", "_").toUpperCase()}_URL`;
|
|
417
406
|
const fromEnv =
|
|
418
407
|
(typeof Bun !== "undefined" ? Bun.env[key] : undefined) ??
|
|
419
408
|
process.env[key] ??
|
|
420
409
|
(role === "store.sql"
|
|
421
|
-
? (typeof Bun !== "undefined" ? Bun.env.DATABASE_URL : undefined) ??
|
|
422
|
-
process.env.DATABASE_URL
|
|
410
|
+
? ((typeof Bun !== "undefined" ? Bun.env.DATABASE_URL : undefined) ??
|
|
411
|
+
process.env.DATABASE_URL)
|
|
423
412
|
: undefined);
|
|
424
413
|
if (fromEnv && fromEnv.length > 0) return fromEnv;
|
|
425
|
-
//
|
|
414
|
+
// Local/test without `oke dev --docker`: still satisfy url-shaped contracts.
|
|
426
415
|
if (role === "store.sql") return "postgres://localhost/oke";
|
|
427
416
|
return undefined;
|
|
428
417
|
}
|
|
@@ -431,10 +420,7 @@ function resolveDevFallback(dev: string): string | undefined {
|
|
|
431
420
|
* @param contracts - Declared contracts
|
|
432
421
|
* @param name - Contract name
|
|
433
422
|
*/
|
|
434
|
-
function isSensitiveName(
|
|
435
|
-
contracts: ReadonlyMap<string, VaultSecretDecl>,
|
|
436
|
-
name: string,
|
|
437
|
-
): boolean {
|
|
423
|
+
function isSensitiveName(contracts: ReadonlyMap<string, VaultSecretDecl>, name: string): boolean {
|
|
438
424
|
const c = contracts.get(name);
|
|
439
425
|
if (!c) return true;
|
|
440
426
|
return c.sensitive;
|
|
@@ -4,17 +4,10 @@
|
|
|
4
4
|
* - a secret value never appears in a log or trace even when passed to fx.log
|
|
5
5
|
* - fingerprints instead of values
|
|
6
6
|
* - resolution chain (first hit wins)
|
|
7
|
-
* - sops/age via Typage (in-process, no Go binary)
|
|
8
7
|
*/
|
|
9
8
|
|
|
10
9
|
import { describe, expect, test } from "bun:test";
|
|
11
|
-
import
|
|
12
|
-
import {
|
|
13
|
-
buildSopsFixture,
|
|
14
|
-
envVaultDriver,
|
|
15
|
-
memoryVaultDriver,
|
|
16
|
-
sopsVaultDriver,
|
|
17
|
-
} from "../drivers/index.ts";
|
|
10
|
+
import { envVaultDriver, memoryVaultDriver } from "../drivers/index.ts";
|
|
18
11
|
import { createFx } from "../kernel/fx.ts";
|
|
19
12
|
import {
|
|
20
13
|
createVaultRuntime,
|
|
@@ -43,27 +36,23 @@ describe("vault declaration", () => {
|
|
|
43
36
|
expect(cfg.kind).toBe("config");
|
|
44
37
|
expect(cfg.sensitive).toBe(false);
|
|
45
38
|
|
|
46
|
-
const
|
|
47
|
-
expect(
|
|
48
|
-
const c = vault.secret("DATABASE_URL", { dev:
|
|
49
|
-
expect(c.dev).toBe(
|
|
39
|
+
const fromDocker = vault.fromDocker("store.sql");
|
|
40
|
+
expect(fromDocker).toStartWith("__oke_from_docker__:");
|
|
41
|
+
const c = vault.secret("DATABASE_URL", { dev: fromDocker });
|
|
42
|
+
expect(c.dev).toBe(fromDocker);
|
|
50
43
|
});
|
|
51
44
|
|
|
52
|
-
test("
|
|
45
|
+
test("fromDocker resolves via OKE_<ROLE>_URL without env-var names in the kernel", async () => {
|
|
53
46
|
const prev = process.env.OKE_STORE_SQL_URL;
|
|
54
47
|
process.env.OKE_STORE_SQL_URL = "postgres://oke:x@127.0.0.1:5432/oke";
|
|
55
48
|
try {
|
|
56
49
|
const runtime = createVaultRuntime({
|
|
57
|
-
secrets: [
|
|
58
|
-
vault.secret("DATABASE_URL", { dev: vault.fromStack("store.sql") }),
|
|
59
|
-
],
|
|
50
|
+
secrets: [vault.secret("DATABASE_URL", { dev: vault.fromDocker("store.sql") })],
|
|
60
51
|
chain: [],
|
|
61
52
|
allowDevFallbacks: true,
|
|
62
53
|
});
|
|
63
54
|
await runtime.boot();
|
|
64
|
-
expect(runtime.read("DATABASE_URL")).toBe(
|
|
65
|
-
"postgres://oke:x@127.0.0.1:5432/oke",
|
|
66
|
-
);
|
|
55
|
+
expect(runtime.read("DATABASE_URL")).toBe("postgres://oke:x@127.0.0.1:5432/oke");
|
|
67
56
|
} finally {
|
|
68
57
|
if (prev === undefined) delete process.env.OKE_STORE_SQL_URL;
|
|
69
58
|
else process.env.OKE_STORE_SQL_URL = prev;
|
|
@@ -94,10 +83,7 @@ describe("boot lists every missing secret", () => {
|
|
|
94
83
|
expect(err).toBeInstanceOf(VaultBootError);
|
|
95
84
|
const boot = err as VaultBootError;
|
|
96
85
|
expect(boot.gaps).toHaveLength(2);
|
|
97
|
-
expect(boot.gaps.map((g) => g.name).sort()).toEqual([
|
|
98
|
-
"DATABASE_URL",
|
|
99
|
-
"STRIPE_KEY",
|
|
100
|
-
]);
|
|
86
|
+
expect(boot.gaps.map((g) => g.name).sort()).toEqual(["DATABASE_URL", "STRIPE_KEY"]);
|
|
101
87
|
expect(boot.message).toContain("STRIPE_KEY");
|
|
102
88
|
expect(boot.message).toContain("Payments gateway key");
|
|
103
89
|
expect(boot.message).toContain("DATABASE_URL");
|
|
@@ -181,10 +167,7 @@ describe("resolution chain", () => {
|
|
|
181
167
|
|
|
182
168
|
test("config cleartext is exposed; secrets are not", async () => {
|
|
183
169
|
const runtime = createVaultRuntime({
|
|
184
|
-
secrets: [
|
|
185
|
-
vault.secret("STRIPE_KEY"),
|
|
186
|
-
vault.config("PUBLIC_URL"),
|
|
187
|
-
],
|
|
170
|
+
secrets: [vault.secret("STRIPE_KEY"), vault.config("PUBLIC_URL")],
|
|
188
171
|
chain: [
|
|
189
172
|
{
|
|
190
173
|
driver: memoryVaultDriver,
|
|
@@ -210,14 +193,11 @@ describe("redaction + fingerprints", () => {
|
|
|
210
193
|
const secret = "sk_live_super_secret_value_do_not_leak";
|
|
211
194
|
const runtime = createVaultRuntime({
|
|
212
195
|
secrets: [vault("STRIPE_KEY")],
|
|
213
|
-
chain: [
|
|
214
|
-
{ driver: memoryVaultDriver, options: { secrets: { STRIPE_KEY: secret } } },
|
|
215
|
-
],
|
|
196
|
+
chain: [{ driver: memoryVaultDriver, options: { secrets: { STRIPE_KEY: secret } } }],
|
|
216
197
|
});
|
|
217
198
|
await runtime.boot();
|
|
218
199
|
|
|
219
|
-
const lines: Array<{ message: string; data?: Record<string, unknown> }> =
|
|
220
|
-
[];
|
|
200
|
+
const lines: Array<{ message: string; data?: Record<string, unknown> }> = [];
|
|
221
201
|
const { fx } = createFxContextWithVault(runtime, lines);
|
|
222
202
|
|
|
223
203
|
const value = fx.vault("STRIPE_KEY");
|
|
@@ -252,29 +232,6 @@ describe("redaction + fingerprints", () => {
|
|
|
252
232
|
});
|
|
253
233
|
});
|
|
254
234
|
|
|
255
|
-
describe("sops / age (Typage)", () => {
|
|
256
|
-
test("decrypts SOPS JSON in-process with age-encryption", async () => {
|
|
257
|
-
const identity = await age.generateIdentity();
|
|
258
|
-
const recipient = await age.identityToRecipient(identity);
|
|
259
|
-
const { json } = await buildSopsFixture(
|
|
260
|
-
{ STRIPE_KEY: "sk_sops_decrypted" },
|
|
261
|
-
recipient,
|
|
262
|
-
);
|
|
263
|
-
|
|
264
|
-
const runtime = createVaultRuntime({
|
|
265
|
-
secrets: [vault("STRIPE_KEY")],
|
|
266
|
-
chain: [
|
|
267
|
-
{
|
|
268
|
-
driver: sopsVaultDriver,
|
|
269
|
-
options: { ciphertext: json, ageIdentity: identity },
|
|
270
|
-
},
|
|
271
|
-
],
|
|
272
|
-
});
|
|
273
|
-
await runtime.boot();
|
|
274
|
-
expect(runtime.read("STRIPE_KEY")).toBe("sk_sops_decrypted");
|
|
275
|
-
});
|
|
276
|
-
});
|
|
277
|
-
|
|
278
235
|
/**
|
|
279
236
|
* Helper — createFx with vault runtime + log sink.
|
|
280
237
|
*/
|