okengine 0.2.6 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +24 -23
- package/README.md +52 -346
- package/docs/spec/console.md +165 -142
- package/docs/spec/example.md +490 -312
- package/docs/spec/four-applications.md +495 -314
- package/docs/spec/unified-theory.md +184 -175
- package/package.json +45 -37
- package/spec/manifest.v1.schema.json +40 -9
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +53 -31
- package/src/auth/invoke-as.ts +1 -3
- package/src/auth/operator.ts +8 -26
- package/src/auth/planes.ts +2 -7
- package/src/auth/plugin.ts +4 -7
- package/src/auth/roles.ts +1 -5
- package/src/auth/sessions.ts +10 -39
- package/src/cli/args.ts +1 -5
- package/src/cli/ask-dev-mode.ts +40 -0
- package/src/cli/build.ts +1 -2
- package/src/cli/client-add.test.ts +8 -15
- package/src/cli/client-add.ts +5 -14
- package/src/cli/completion.test.ts +1 -5
- package/src/cli/completion.ts +4 -17
- package/src/cli/db-auto-push.test.ts +64 -0
- package/src/cli/db-auto-push.ts +72 -0
- package/src/cli/db.test.ts +189 -0
- package/src/cli/db.ts +386 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +163 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev.test.ts +148 -21
- package/src/cli/dev.ts +208 -134
- package/src/cli/doc-drift.test.ts +3 -2
- package/src/cli/doc-drift.ts +21 -50
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +7 -8
- package/src/cli/docker.ts +1 -3
- package/src/cli/doctor-diff-examples.ts +1 -3
- package/src/cli/doctor-diff.test.ts +1 -5
- package/src/cli/doctor-diff.ts +17 -46
- package/src/cli/doctor-pii.ts +2 -7
- package/src/cli/doctor.test.ts +26 -4
- package/src/cli/doctor.ts +35 -11
- package/src/cli/eval.ts +4 -14
- package/src/cli/gates-list.ts +1 -4
- package/src/cli/hero-meta.test.ts +17 -19
- package/src/cli/hero-meta.ts +20 -30
- package/src/cli/images.ts +3 -8
- package/src/cli/index.ts +11 -2
- package/src/cli/load-config.images.test.ts +14 -14
- package/src/cli/load-config.ts +41 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +45 -0
- package/src/cli/ports.test.ts +4 -13
- package/src/cli/ports.ts +1 -3
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +2 -7
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/client/budget-entry.ts +1 -6
- package/src/client/create.test.ts +6 -12
- package/src/client/create.ts +2 -8
- package/src/client/errors.ts +1 -4
- package/src/client/index.ts +1 -6
- package/src/client/notes-contract.test.ts +4 -13
- package/src/client/transport.ts +9 -30
- package/src/client/types.ts +8 -29
- package/src/compiler/aot.test.ts +2 -9
- package/src/compiler/aot.ts +1 -4
- package/src/compiler/differential.test.ts +3 -11
- package/src/compiler/dynamic.ts +1 -4
- package/src/compiler/effects-infer.ts +8 -34
- package/src/compiler/emit.ts +1 -3
- package/src/compiler/extract.test.ts +96 -30
- package/src/compiler/extract.ts +362 -156
- package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
- package/src/compiler/fixtures/skyport.expected.json +24 -83
- package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
- package/src/compiler/http-parse.ts +2 -9
- package/src/compiler/index.ts +1 -5
- package/src/compiler/response.ts +4 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +57 -34
- package/src/config/index.ts +181 -37
- package/src/config/resolve-driver.test.ts +28 -17
- package/src/console/budget.test.ts +1 -4
- package/src/console/index.ts +1 -4
- package/src/console/server/access.test.ts +15 -43
- package/src/console/server/access.ts +19 -49
- package/src/console/server/ai.test.ts +3 -11
- package/src/console/server/ai.ts +23 -46
- package/src/console/server/app.ts +14 -45
- package/src/console/server/auth-rate.test.ts +4 -12
- package/src/console/server/bind.ts +1 -5
- package/src/console/server/channels.test.ts +2 -6
- package/src/console/server/channels.ts +10 -35
- package/src/console/server/claim.ts +2 -8
- package/src/console/server/clock.test.ts +2 -6
- package/src/console/server/clock.ts +8 -26
- package/src/console/server/console.test.ts +1 -3
- package/src/console/server/diff.test.ts +5 -17
- package/src/console/server/diff.ts +10 -31
- package/src/console/server/dry-run.audit.test.ts +2 -8
- package/src/console/server/flows.ts +64 -233
- package/src/console/server/gates.test.ts +14 -50
- package/src/console/server/gates.ts +13 -48
- package/src/console/server/index.ts +2 -9
- package/src/console/server/live.ts +3 -12
- package/src/console/server/operator-db.test.ts +4 -15
- package/src/console/server/operator-db.ts +13 -32
- package/src/console/server/plugin.ts +50 -53
- package/src/console/server/plugins.test.ts +2 -6
- package/src/console/server/plugins.ts +17 -56
- package/src/console/server/runs-pii.ts +2 -7
- package/src/console/server/security.gate.test.ts +18 -40
- package/src/console/server/serve.ts +10 -25
- package/src/console/server/signals.test.ts +1 -3
- package/src/console/server/signals.ts +17 -40
- package/src/console/server/state.ts +21 -59
- package/src/console/server/store.test.ts +20 -22
- package/src/console/server/store.ts +31 -76
- package/src/console/server/vault.test.ts +12 -29
- package/src/console/server/vault.ts +23 -60
- package/src/console/ui/access/AccessA11yView.tsx +6 -21
- package/src/console/ui/access/a11y.test.tsx +3 -12
- package/src/console/ui/access/acknowledgement.test.ts +1 -4
- package/src/console/ui/access/acknowledgement.ts +1 -3
- package/src/console/ui/access/blast-radius.ts +1 -3
- package/src/console/ui/access/confirmation.test.ts +1 -5
- package/src/console/ui/access/confirmation.ts +1 -4
- package/src/console/ui/access/fixture.ts +1 -5
- package/src/console/ui/access/grantable.test.ts +1 -3
- package/src/console/ui/access/grantable.ts +2 -7
- package/src/console/ui/access/index.ts +2 -9
- package/src/console/ui/access/provenance.test.ts +1 -3
- package/src/console/ui/access/provenance.ts +2 -6
- package/src/console/ui/access/search.test.ts +1 -5
- package/src/console/ui/access/search.ts +2 -6
- package/src/console/ui/ai/AiA11yView.tsx +6 -17
- package/src/console/ui/ai/a11y.test.tsx +2 -5
- package/src/console/ui/ai/fixture.ts +2 -7
- package/src/console/ui/ai/format.ts +1 -3
- package/src/console/ui/ai/group.test.ts +1 -3
- package/src/console/ui/ai/group.ts +4 -12
- package/src/console/ui/ai/index.ts +2 -9
- package/src/console/ui/ai/promotion.test.ts +2 -7
- package/src/console/ui/ai/promotion.ts +4 -13
- package/src/console/ui/ai/search.test.ts +2 -11
- package/src/console/ui/ai/search.ts +3 -13
- package/src/console/ui/ai/types.ts +1 -8
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
- package/src/console/ui/architecture/a11y.test.tsx +1 -2
- package/src/console/ui/architecture/declared.ts +1 -5
- package/src/console/ui/architecture/index.ts +7 -35
- package/src/console/ui/architecture/layout.ts +1 -3
- package/src/console/ui/architecture/pathologies.ts +10 -19
- package/src/console/ui/architecture/search.ts +6 -15
- package/src/console/ui/architecture/traffic.ts +4 -14
- package/src/console/ui/architecture/types.ts +2 -10
- package/src/console/ui/architecture/view.test.ts +7 -19
- package/src/console/ui/architecture/view.ts +9 -36
- package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
- package/src/console/ui/channels/a11y.test.tsx +1 -2
- package/src/console/ui/channels/confirmation.test.ts +1 -4
- package/src/console/ui/channels/confirmation.ts +1 -4
- package/src/console/ui/channels/findings.ts +1 -5
- package/src/console/ui/channels/index.ts +2 -8
- package/src/console/ui/channels/locale.test.ts +1 -3
- package/src/console/ui/channels/locale.ts +2 -8
- package/src/console/ui/channels/search.ts +4 -13
- package/src/console/ui/channels/taxonomy.ts +1 -3
- package/src/console/ui/clock/ClockA11yView.tsx +9 -26
- package/src/console/ui/clock/a11y.test.tsx +2 -5
- package/src/console/ui/clock/confirmation.test.ts +1 -3
- package/src/console/ui/clock/confirmation.ts +1 -4
- package/src/console/ui/clock/findings.ts +1 -4
- package/src/console/ui/clock/health.ts +2 -7
- package/src/console/ui/clock/index.ts +2 -10
- package/src/console/ui/clock/search.test.ts +1 -3
- package/src/console/ui/clock/search.ts +2 -6
- package/src/console/ui/clock/timeline.test.ts +1 -3
- package/src/console/ui/clock/waiting-on.test.ts +1 -5
- package/src/console/ui/clock/waiting-on.ts +2 -7
- package/src/console/ui/diff/DiffA11yView.tsx +8 -17
- package/src/console/ui/diff/a11y.test.tsx +2 -5
- package/src/console/ui/diff/group.test.ts +3 -13
- package/src/console/ui/diff/group.ts +2 -8
- package/src/console/ui/diff/index.ts +2 -8
- package/src/console/ui/diff/search.test.ts +1 -5
- package/src/console/ui/diff/search.ts +4 -16
- package/src/console/ui/diff/summary.ts +1 -2
- package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
- package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
- package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
- package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
- package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
- package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
- package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
- package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
- package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
- package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
- package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
- package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
- package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
- package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
- package/src/console/ui/flows/a11y.test.tsx +2 -8
- package/src/console/ui/flows/buffer.test.ts +3 -11
- package/src/console/ui/flows/buffer.ts +4 -11
- package/src/console/ui/flows/confirmation.ts +1 -3
- package/src/console/ui/flows/contract.test.ts +3 -7
- package/src/console/ui/flows/contract.ts +12 -36
- package/src/console/ui/flows/graph.test.ts +3 -11
- package/src/console/ui/flows/graph.ts +5 -15
- package/src/console/ui/flows/index.ts +1 -6
- package/src/console/ui/flows/save-as-test.ts +1 -3
- package/src/console/ui/flows/search.ts +8 -25
- package/src/console/ui/flows/tiers.ts +2 -9
- package/src/console/ui/gates/GatesA11yView.tsx +4 -13
- package/src/console/ui/gates/a11y.test.tsx +2 -5
- package/src/console/ui/gates/audit.ts +1 -3
- package/src/console/ui/gates/denial.test.ts +1 -3
- package/src/console/ui/gates/denial.ts +4 -12
- package/src/console/ui/gates/findings.ts +1 -3
- package/src/console/ui/gates/group.test.ts +3 -3
- package/src/console/ui/gates/group.ts +3 -11
- package/src/console/ui/gates/index.ts +2 -10
- package/src/console/ui/gates/search.ts +3 -10
- package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
- package/src/console/ui/overview/a11y.test.tsx +1 -2
- package/src/console/ui/overview/busiest.ts +1 -3
- package/src/console/ui/overview/compose.ts +1 -13
- package/src/console/ui/overview/cost.ts +34 -38
- package/src/console/ui/overview/fixture.ts +21 -26
- package/src/console/ui/overview/golden.ts +4 -14
- package/src/console/ui/overview/index.ts +2 -9
- package/src/console/ui/overview/rank.test.ts +3 -10
- package/src/console/ui/overview/rank.ts +2 -7
- package/src/console/ui/overview/slo.test.ts +5 -9
- package/src/console/ui/overview/slo.ts +6 -23
- package/src/console/ui/overview/verdict.ts +3 -10
- package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
- package/src/console/ui/plugins/a11y.test.tsx +1 -2
- package/src/console/ui/plugins/fixture.ts +2 -4
- package/src/console/ui/plugins/group.test.ts +1 -3
- package/src/console/ui/plugins/group.ts +1 -6
- package/src/console/ui/plugins/index.ts +3 -13
- package/src/console/ui/plugins/search.ts +7 -19
- package/src/console/ui/runs/RunsA11yView.tsx +5 -20
- package/src/console/ui/runs/a11y.test.tsx +2 -5
- package/src/console/ui/runs/explain.ts +2 -6
- package/src/console/ui/runs/group.ts +3 -12
- package/src/console/ui/runs/histogram.test.ts +2 -11
- package/src/console/ui/runs/histogram.ts +1 -4
- package/src/console/ui/runs/index.ts +4 -18
- package/src/console/ui/runs/project.ts +2 -6
- package/src/console/ui/runs/query.test.ts +1 -3
- package/src/console/ui/runs/query.ts +12 -35
- package/src/console/ui/runs/search.ts +5 -19
- package/src/console/ui/runs/trace-link.test.ts +2 -6
- package/src/console/ui/runs/trace-link.ts +4 -16
- package/src/console/ui/runs/types.ts +1 -3
- package/src/console/ui/shell/App.tsx +2 -10
- package/src/console/ui/shell/client.ts +22 -115
- package/src/console/ui/shell/components/ui.tsx +1 -4
- package/src/console/ui/shell/layout/Shell.tsx +2 -4
- package/src/console/ui/shell/main.tsx +31 -96
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
- package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
- package/src/console/ui/shell/setup/Wizard.tsx +3 -5
- package/src/console/ui/shell/styles.css +1 -2
- package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
- package/src/console/ui/signals/a11y.test.tsx +2 -5
- package/src/console/ui/signals/confirmation.test.ts +1 -5
- package/src/console/ui/signals/confirmation.ts +2 -6
- package/src/console/ui/signals/dry-run.ts +1 -3
- package/src/console/ui/signals/durable.ts +1 -3
- package/src/console/ui/signals/findings.ts +1 -3
- package/src/console/ui/signals/group.test.ts +2 -8
- package/src/console/ui/signals/group.ts +2 -10
- package/src/console/ui/signals/index.ts +1 -4
- package/src/console/ui/signals/monitor.ts +2 -7
- package/src/console/ui/signals/schema-form.test.ts +3 -14
- package/src/console/ui/signals/schema-form.ts +1 -4
- package/src/console/ui/signals/search.ts +4 -13
- package/src/console/ui/store/StoreA11yView.tsx +3 -9
- package/src/console/ui/store/a11y.test.tsx +2 -5
- package/src/console/ui/store/confirmation.test.ts +1 -3
- package/src/console/ui/store/confirmation.ts +1 -4
- package/src/console/ui/store/dry-run.ts +2 -5
- package/src/console/ui/store/fixture.ts +1 -2
- package/src/console/ui/store/group.test.ts +1 -6
- package/src/console/ui/store/group.ts +1 -4
- package/src/console/ui/store/index.ts +1 -5
- package/src/console/ui/store/search.ts +2 -6
- package/src/console/ui/store/will-not-fire.ts +1 -2
- package/src/console/ui/traces/TracesA11yView.tsx +10 -29
- package/src/console/ui/traces/a11y.test.tsx +1 -2
- package/src/console/ui/traces/chain.test.ts +5 -19
- package/src/console/ui/traces/chain.ts +1 -3
- package/src/console/ui/traces/critical-path.test.ts +1 -3
- package/src/console/ui/traces/critical-path.ts +2 -6
- package/src/console/ui/traces/filter.test.ts +2 -6
- package/src/console/ui/traces/filter.ts +5 -13
- package/src/console/ui/traces/fold.test.ts +4 -12
- package/src/console/ui/traces/fold.ts +1 -3
- package/src/console/ui/traces/mini.ts +1 -3
- package/src/console/ui/traces/replay.test.ts +1 -3
- package/src/console/ui/traces/replay.ts +1 -3
- package/src/console/ui/traces/sampling.ts +1 -4
- package/src/console/ui/traces/search.ts +4 -17
- package/src/console/ui/traces/tier.ts +1 -3
- package/src/console/ui/vault/VaultA11yView.tsx +5 -17
- package/src/console/ui/vault/a11y.test.tsx +1 -2
- package/src/console/ui/vault/blast-radius.ts +1 -3
- package/src/console/ui/vault/confirmation.test.ts +1 -5
- package/src/console/ui/vault/confirmation.ts +1 -4
- package/src/console/ui/vault/dormant.test.ts +1 -4
- package/src/console/ui/vault/export-safe.test.ts +1 -5
- package/src/console/ui/vault/export-safe.ts +1 -4
- package/src/console/ui/vault/fixture.ts +3 -3
- package/src/console/ui/vault/group.ts +1 -2
- package/src/console/ui/vault/index.ts +2 -10
- package/src/console/ui/vault/search.ts +2 -6
- package/src/console/ui/vault/types.ts +1 -1
- package/src/console/xss.gate.test.ts +1 -3
- package/src/docker/compose.ts +112 -20
- package/src/docker/derive.ts +5 -19
- package/src/docker/docker.test.ts +15 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +4 -11
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +5 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +6 -1
- package/src/docker/recipes/rustfs.ts +33 -0
- package/src/docker/stack-id.test.ts +33 -0
- package/src/docker/stack-id.ts +25 -13
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/types.ts +13 -4
- package/src/drivers/ai-anthropic.ts +5 -14
- package/src/drivers/ai-mock.ts +2 -5
- package/src/drivers/ai-openai-compatible.ts +4 -10
- package/src/drivers/ai-providers.test.ts +6 -13
- package/src/drivers/bun-native-completeness.test.ts +6 -15
- package/src/drivers/channel-console.ts +6 -7
- package/src/drivers/channel-fcm.ts +20 -30
- package/src/drivers/channel-resend.ts +1 -3
- package/src/drivers/channel-smtp.ts +2 -6
- package/src/drivers/channel-types.ts +2 -12
- package/src/drivers/channel-unifonic.ts +2 -6
- package/src/drivers/channel-wa-cloud.ts +2 -6
- package/src/drivers/channel-webpush.ts +21 -60
- package/src/drivers/conformance.test.ts +2 -10
- package/src/drivers/conformance.ts +8 -21
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -56
- package/src/drivers/memory.ts +14 -41
- package/src/drivers/pgvector.ts +7 -11
- package/src/drivers/postgres.ts +7 -13
- package/src/drivers/redis.ts +13 -37
- package/src/drivers/s3.ts +5 -17
- package/src/drivers/signal-engine.ts +12 -49
- package/src/drivers/signal-memory.ts +2 -8
- package/src/drivers/signal-nats.ts +4 -9
- package/src/drivers/signal-postgres.ts +62 -129
- package/src/drivers/signal-redis.ts +7 -21
- package/src/drivers/signal-types.ts +1 -4
- package/src/drivers/sqlite.ts +3 -12
- package/src/drivers/types.ts +4 -23
- package/src/drivers/vault-env.ts +2 -6
- package/src/drivers/vault-infisical.ts +1 -5
- package/src/drivers/vault-managed.ts +1 -5
- package/src/drivers/vault-memory.ts +1 -5
- package/src/drivers/vault-openbao.ts +1 -5
- package/src/drivers/vault-sops.ts +10 -35
- package/src/drivers/vault-types.ts +1 -7
- package/src/elements/ai/declare.ts +4 -14
- package/src/elements/ai/eval.ts +2 -6
- package/src/elements/ai/pii.ts +1 -3
- package/src/elements/ai/runtime.ts +12 -50
- package/src/elements/ai/schema.ts +4 -15
- package/src/elements/ai.test.ts +13 -24
- package/src/elements/ai.ts +1 -5
- package/src/elements/channel/consent.ts +3 -12
- package/src/elements/channel/costs.ts +4 -15
- package/src/elements/channel/declare.ts +1 -4
- package/src/elements/channel/email-auth.ts +1 -4
- package/src/elements/channel/locale.ts +2 -10
- package/src/elements/channel/mask.ts +1 -3
- package/src/elements/channel/mime.ts +2 -12
- package/src/elements/channel/outcomes.test.ts +1 -5
- package/src/elements/channel/outcomes.ts +5 -15
- package/src/elements/channel/receipts.ts +2 -7
- package/src/elements/channel/runtime.ts +28 -74
- package/src/elements/channel/suppression.ts +8 -14
- package/src/elements/channel.test.ts +8 -31
- package/src/elements/channel.ts +3 -14
- package/src/elements/clock/actions.ts +6 -18
- package/src/elements/clock/declare.ts +1 -3
- package/src/elements/clock/dst.ts +1 -5
- package/src/elements/clock/durable.ts +4 -16
- package/src/elements/clock/health.ts +2 -7
- package/src/elements/clock/leader.ts +2 -9
- package/src/elements/clock/reconcile.ts +4 -15
- package/src/elements/clock/runtime.ts +2 -5
- package/src/elements/clock/schedule.ts +4 -20
- package/src/elements/clock.test.ts +2 -7
- package/src/elements/clock.ts +5 -23
- package/src/elements/gate/permissions.ts +1 -4
- package/src/elements/gate/runtime.ts +7 -28
- package/src/elements/gate.ts +1 -5
- package/src/elements/index.ts +9 -7
- package/src/elements/signal/declare.ts +2 -7
- package/src/elements/signal/reconcile.test.ts +1 -4
- package/src/elements/signal/runtime.ts +1 -3
- package/src/elements/signal.test.ts +3 -15
- package/src/elements/signal.ts +2 -8
- package/src/elements/store/cache.test.ts +46 -0
- package/src/elements/store/cache.ts +3 -11
- package/src/elements/store/classify.ts +5 -22
- package/src/elements/store/declare.ts +8 -17
- package/src/elements/store/domain-ddl.test.ts +86 -0
- package/src/elements/store/emit-drizzle.ts +363 -0
- package/src/elements/store/files-policy.test.ts +1 -5
- package/src/elements/store/files-policy.ts +4 -12
- package/src/elements/store/load-plugin-tables.ts +103 -0
- package/src/elements/store/missing-relation.test.ts +83 -0
- package/src/elements/store/missing-relation.ts +38 -0
- package/src/elements/store/replica.ts +1 -4
- package/src/elements/store/runtime.ts +25 -28
- package/src/elements/store/schema-decl.test.ts +227 -0
- package/src/elements/store/schema-decl.ts +516 -0
- package/src/elements/store/sql-condition.ts +11 -21
- package/src/elements/store/sql-session.test.ts +50 -0
- package/src/elements/store/sql-session.ts +60 -63
- package/src/elements/store/table.ts +35 -19
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +37 -31
- package/src/elements/vault/chain.ts +34 -0
- package/src/elements/vault/declare.ts +22 -32
- package/src/elements/vault/fingerprint.ts +2 -7
- package/src/elements/vault/redact.ts +2 -6
- package/src/elements/vault/runtime.ts +18 -32
- package/src/elements/vault.test.ts +12 -28
- package/src/elements/vault.ts +8 -12
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +34 -94
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.ts +2 -8
- package/src/kernel/boot-bind/clock.ts +2 -6
- package/src/kernel/boot-bind/gate.ts +2 -8
- package/src/kernel/boot-bind/runs.ts +1 -3
- package/src/kernel/boot-bind/signal.ts +3 -10
- package/src/kernel/boot-bind/store.test.ts +17 -17
- package/src/kernel/boot-bind/store.ts +44 -50
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -9
- package/src/kernel/boot.ts +29 -76
- package/src/kernel/budget.test.ts +1 -3
- package/src/kernel/capability.ts +3 -10
- package/src/kernel/dry-run.test.ts +1 -4
- package/src/kernel/dry-run.ts +3 -11
- package/src/kernel/effects.test.ts +1 -5
- package/src/kernel/effects.ts +4 -11
- package/src/kernel/errors.registry.test.ts +2 -8
- package/src/kernel/errors.ts +23 -32
- package/src/kernel/flow.test.ts +12 -25
- package/src/kernel/flow.ts +5 -25
- package/src/kernel/fx.test.ts +15 -44
- package/src/kernel/fx.ts +27 -79
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +10 -10
- package/src/kernel/hooks.ts +3 -12
- package/src/kernel/index.ts +4 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +1 -6
- package/src/kernel/pipeline.test.ts +10 -19
- package/src/kernel/pipeline.ts +5 -17
- package/src/kernel/plug.ts +4 -11
- package/src/kernel/plugin/conflicts.test.ts +13 -25
- package/src/kernel/plugin/decorate.test.ts +8 -13
- package/src/kernel/plugin/scoping.test.ts +4 -11
- package/src/kernel/plugin.ts +48 -24
- package/src/kernel/registry.ts +80 -29
- package/src/kernel/router.test.ts +15 -13
- package/src/kernel/router.ts +9 -29
- package/src/kernel/routing-budget.test.ts +1 -3
- package/src/kernel/run-telemetry.ts +1 -3
- package/src/kernel/triggers.ts +4 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/index.ts +2 -9
- package/src/manifest/types.ts +29 -5
- package/src/manifest/undeclared.test.ts +4 -12
- package/src/manifest/undeclared.ts +1 -2
- package/src/manifest/validate.test.ts +2 -6
- package/src/manifest/validate.ts +4 -14
- package/src/mcp/authorization.ts +8 -27
- package/src/mcp/confirmation.ts +3 -10
- package/src/mcp/data.ts +2 -6
- package/src/mcp/docs-index.ts +4 -7
- package/src/mcp/docs-mcp.test.ts +3 -12
- package/src/mcp/docs-server.ts +7 -27
- package/src/mcp/docs-tools.ts +2 -6
- package/src/mcp/index.ts +1 -6
- package/src/mcp/injection.gate.test.ts +4 -18
- package/src/mcp/mcp.test.ts +18 -49
- package/src/mcp/protocol.ts +3 -10
- package/src/mcp/server.ts +11 -52
- package/src/mcp/session.ts +4 -14
- package/src/mcp/tools.ts +14 -50
- package/src/plugins/catalogue.test.ts +3 -7
- package/src/plugins/catalogue.ts +1 -3
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/supply-chain.ts +5 -17
- package/src/release/exports.ts +3 -8
- package/src/release/measure.exports.test.ts +1 -3
- package/src/release/measure.ts +15 -43
- package/src/runs/bench.test.ts +1 -3
- package/src/runs/collect.ts +8 -25
- package/src/runs/drivers/clickhouse.ts +2 -9
- package/src/runs/drivers/files.ts +9 -31
- package/src/runs/drivers/memory.ts +5 -22
- package/src/runs/drivers/postgres.ts +8 -20
- package/src/runs/duckdb.ts +2 -8
- package/src/runs/index.ts +3 -14
- package/src/runs/outlier.ts +3 -10
- package/src/runs/parquet.ts +8 -26
- package/src/runs/privacy.ts +2 -8
- package/src/runs/runs.test.ts +3 -9
- package/src/runs/runtime.ts +7 -32
- package/src/runs/shred.ts +10 -29
- package/src/runs/types.ts +1 -4
- package/src/runtime/bun.ts +4 -15
- package/src/runtime/cold-start.bench.ts +1 -3
- package/src/runtime/dev-request-log.test.ts +1 -4
- package/src/runtime/dev-request-log.ts +1 -4
- package/src/runtime/index.ts +1 -6
- package/src/runtime/primitives.ts +5 -4
- package/src/runtime/security.ts +3 -13
- package/src/runtime/serve.test.ts +4 -7
- package/src/runtime/types.ts +1 -4
- package/src/runtime/web-standard.ts +3 -15
- package/src/term.test.ts +4 -6
- package/src/term.ts +49 -98
- package/src/test/create-test-app.test.ts +4 -14
- package/src/test/create-test-app.ts +13 -31
- package/src/test/provisions.integration.test.ts +3 -11
- package/src/upgrade/codemods.test.ts +25 -6
- package/src/upgrade/codemods.ts +116 -3
- package/src/validation/standard-schema.test.ts +2 -5
- package/src/validation/standard-schema.ts +13 -33
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
|
@@ -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
|
|
|
@@ -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;
|
|
@@ -43,27 +43,23 @@ describe("vault declaration", () => {
|
|
|
43
43
|
expect(cfg.kind).toBe("config");
|
|
44
44
|
expect(cfg.sensitive).toBe(false);
|
|
45
45
|
|
|
46
|
-
const
|
|
47
|
-
expect(
|
|
48
|
-
const c = vault.secret("DATABASE_URL", { dev:
|
|
49
|
-
expect(c.dev).toBe(
|
|
46
|
+
const fromDocker = vault.fromDocker("store.sql");
|
|
47
|
+
expect(fromDocker).toStartWith("__oke_from_docker__:");
|
|
48
|
+
const c = vault.secret("DATABASE_URL", { dev: fromDocker });
|
|
49
|
+
expect(c.dev).toBe(fromDocker);
|
|
50
50
|
});
|
|
51
51
|
|
|
52
|
-
test("
|
|
52
|
+
test("fromDocker resolves via OKE_<ROLE>_URL without env-var names in the kernel", async () => {
|
|
53
53
|
const prev = process.env.OKE_STORE_SQL_URL;
|
|
54
54
|
process.env.OKE_STORE_SQL_URL = "postgres://oke:x@127.0.0.1:5432/oke";
|
|
55
55
|
try {
|
|
56
56
|
const runtime = createVaultRuntime({
|
|
57
|
-
secrets: [
|
|
58
|
-
vault.secret("DATABASE_URL", { dev: vault.fromStack("store.sql") }),
|
|
59
|
-
],
|
|
57
|
+
secrets: [vault.secret("DATABASE_URL", { dev: vault.fromDocker("store.sql") })],
|
|
60
58
|
chain: [],
|
|
61
59
|
allowDevFallbacks: true,
|
|
62
60
|
});
|
|
63
61
|
await runtime.boot();
|
|
64
|
-
expect(runtime.read("DATABASE_URL")).toBe(
|
|
65
|
-
"postgres://oke:x@127.0.0.1:5432/oke",
|
|
66
|
-
);
|
|
62
|
+
expect(runtime.read("DATABASE_URL")).toBe("postgres://oke:x@127.0.0.1:5432/oke");
|
|
67
63
|
} finally {
|
|
68
64
|
if (prev === undefined) delete process.env.OKE_STORE_SQL_URL;
|
|
69
65
|
else process.env.OKE_STORE_SQL_URL = prev;
|
|
@@ -94,10 +90,7 @@ describe("boot lists every missing secret", () => {
|
|
|
94
90
|
expect(err).toBeInstanceOf(VaultBootError);
|
|
95
91
|
const boot = err as VaultBootError;
|
|
96
92
|
expect(boot.gaps).toHaveLength(2);
|
|
97
|
-
expect(boot.gaps.map((g) => g.name).sort()).toEqual([
|
|
98
|
-
"DATABASE_URL",
|
|
99
|
-
"STRIPE_KEY",
|
|
100
|
-
]);
|
|
93
|
+
expect(boot.gaps.map((g) => g.name).sort()).toEqual(["DATABASE_URL", "STRIPE_KEY"]);
|
|
101
94
|
expect(boot.message).toContain("STRIPE_KEY");
|
|
102
95
|
expect(boot.message).toContain("Payments gateway key");
|
|
103
96
|
expect(boot.message).toContain("DATABASE_URL");
|
|
@@ -181,10 +174,7 @@ describe("resolution chain", () => {
|
|
|
181
174
|
|
|
182
175
|
test("config cleartext is exposed; secrets are not", async () => {
|
|
183
176
|
const runtime = createVaultRuntime({
|
|
184
|
-
secrets: [
|
|
185
|
-
vault.secret("STRIPE_KEY"),
|
|
186
|
-
vault.config("PUBLIC_URL"),
|
|
187
|
-
],
|
|
177
|
+
secrets: [vault.secret("STRIPE_KEY"), vault.config("PUBLIC_URL")],
|
|
188
178
|
chain: [
|
|
189
179
|
{
|
|
190
180
|
driver: memoryVaultDriver,
|
|
@@ -210,14 +200,11 @@ describe("redaction + fingerprints", () => {
|
|
|
210
200
|
const secret = "sk_live_super_secret_value_do_not_leak";
|
|
211
201
|
const runtime = createVaultRuntime({
|
|
212
202
|
secrets: [vault("STRIPE_KEY")],
|
|
213
|
-
chain: [
|
|
214
|
-
{ driver: memoryVaultDriver, options: { secrets: { STRIPE_KEY: secret } } },
|
|
215
|
-
],
|
|
203
|
+
chain: [{ driver: memoryVaultDriver, options: { secrets: { STRIPE_KEY: secret } } }],
|
|
216
204
|
});
|
|
217
205
|
await runtime.boot();
|
|
218
206
|
|
|
219
|
-
const lines: Array<{ message: string; data?: Record<string, unknown> }> =
|
|
220
|
-
[];
|
|
207
|
+
const lines: Array<{ message: string; data?: Record<string, unknown> }> = [];
|
|
221
208
|
const { fx } = createFxContextWithVault(runtime, lines);
|
|
222
209
|
|
|
223
210
|
const value = fx.vault("STRIPE_KEY");
|
|
@@ -256,10 +243,7 @@ describe("sops / age (Typage)", () => {
|
|
|
256
243
|
test("decrypts SOPS JSON in-process with age-encryption", async () => {
|
|
257
244
|
const identity = await age.generateIdentity();
|
|
258
245
|
const recipient = await age.identityToRecipient(identity);
|
|
259
|
-
const { json } = await buildSopsFixture(
|
|
260
|
-
{ STRIPE_KEY: "sk_sops_decrypted" },
|
|
261
|
-
recipient,
|
|
262
|
-
);
|
|
246
|
+
const { json } = await buildSopsFixture({ STRIPE_KEY: "sk_sops_decrypted" }, recipient);
|
|
263
247
|
|
|
264
248
|
const runtime = createVaultRuntime({
|
|
265
249
|
secrets: [vault("STRIPE_KEY")],
|
package/src/elements/vault.ts
CHANGED
|
@@ -12,15 +12,12 @@
|
|
|
12
12
|
|
|
13
13
|
export {
|
|
14
14
|
vault,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
} from "./vault/declare.ts";
|
|
20
|
-
export type {
|
|
21
|
-
VaultSecretDecl,
|
|
22
|
-
VaultSecretOptions,
|
|
15
|
+
fromDocker,
|
|
16
|
+
FROM_DOCKER_PREFIX,
|
|
17
|
+
isFromDocker,
|
|
18
|
+
fromDockerRole,
|
|
23
19
|
} from "./vault/declare.ts";
|
|
20
|
+
export type { VaultSecretDecl, VaultSecretOptions } from "./vault/declare.ts";
|
|
24
21
|
|
|
25
22
|
export {
|
|
26
23
|
createVaultRuntime,
|
|
@@ -37,9 +34,8 @@ export type {
|
|
|
37
34
|
VaultRuntime,
|
|
38
35
|
} from "./vault/runtime.ts";
|
|
39
36
|
|
|
40
|
-
export {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
} from "./vault/fingerprint.ts";
|
|
37
|
+
export { COMPOSE_ENV_REL, resolveComposeEnvPath } from "./vault/chain.ts";
|
|
38
|
+
|
|
39
|
+
export { fingerprintSecret, fingerprintSecretSync } from "./vault/fingerprint.ts";
|
|
44
40
|
|
|
45
41
|
export { createSecretRedactor } from "./vault/redact.ts";
|
package/src/index.ts
CHANGED
|
@@ -56,11 +56,14 @@ export {
|
|
|
56
56
|
id,
|
|
57
57
|
now,
|
|
58
58
|
defineTable,
|
|
59
|
+
field,
|
|
59
60
|
createStoreRuntime,
|
|
60
61
|
type StoreDecl,
|
|
61
62
|
type StoreRuntime,
|
|
62
63
|
type SqlStoreHandle,
|
|
63
64
|
type TableHandle,
|
|
65
|
+
type SchemaTableDecl,
|
|
66
|
+
type SchemaColumnDecl,
|
|
64
67
|
} from "./elements/store.ts";
|
|
65
68
|
|
|
66
69
|
export {
|
|
@@ -98,8 +101,8 @@ export {
|
|
|
98
101
|
|
|
99
102
|
export {
|
|
100
103
|
vault,
|
|
101
|
-
|
|
102
|
-
|
|
104
|
+
fromDocker,
|
|
105
|
+
FROM_DOCKER_PREFIX,
|
|
103
106
|
createVaultRuntime,
|
|
104
107
|
VaultBootError,
|
|
105
108
|
SECRET_MASK,
|
|
@@ -68,17 +68,12 @@ export type ErrorDataOf<E extends FlowErrorMap> = {
|
|
|
68
68
|
*
|
|
69
69
|
* @typeParam F - Flow definition
|
|
70
70
|
*/
|
|
71
|
-
export type RouteFromFlow<F> =
|
|
72
|
-
infer I,
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
>
|
|
78
|
-
? [T] extends [HttpTrigger<infer M, infer P>]
|
|
79
|
-
? AppFlowRoute<I, O, ErrorDataOf<E>, M, P>
|
|
80
|
-
: AppFlowRoute<I, O, ErrorDataOf<E>>
|
|
81
|
-
: never;
|
|
71
|
+
export type RouteFromFlow<F> =
|
|
72
|
+
F extends FlowDef<infer I, infer O, infer E, any, infer T>
|
|
73
|
+
? [T] extends [HttpTrigger<infer M, infer P>]
|
|
74
|
+
? AppFlowRoute<I, O, ErrorDataOf<E>, M, P>
|
|
75
|
+
: AppFlowRoute<I, O, ErrorDataOf<E>>
|
|
76
|
+
: never;
|
|
82
77
|
|
|
83
78
|
/**
|
|
84
79
|
* Map a flow namespace (`{ create, get, … }`) to a unit route table.
|
|
@@ -115,12 +110,11 @@ export type RoutesFromAdoptArg<A> = A extends AnyFlowDef
|
|
|
115
110
|
*
|
|
116
111
|
* @typeParam Args - Adopt argument tuple
|
|
117
112
|
*/
|
|
118
|
-
export type RoutesFromAdoptArgs<Args extends readonly unknown[]> =
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
: {};
|
|
113
|
+
export type RoutesFromAdoptArgs<Args extends readonly unknown[]> = Args extends readonly []
|
|
114
|
+
? {}
|
|
115
|
+
: Args extends readonly [infer H, ...infer T]
|
|
116
|
+
? RoutesFromAdoptArg<H> & RoutesFromAdoptArgs<T>
|
|
117
|
+
: {};
|
|
124
118
|
|
|
125
119
|
/** Runtime leaf: method/path when the flow has an HTTP trigger. */
|
|
126
120
|
export interface RuntimeFlowRoute {
|
|
@@ -141,8 +135,7 @@ export type RuntimeRouteMap = {
|
|
|
141
135
|
* @param flowDef - Flow definition
|
|
142
136
|
*/
|
|
143
137
|
export function runtimeRouteFromFlow(flowDef: AnyFlowDef): RuntimeFlowRoute {
|
|
144
|
-
const trigger: Trigger | undefined =
|
|
145
|
-
flowDef.$trigger ?? flowDef.triggers[0];
|
|
138
|
+
const trigger: Trigger | undefined = flowDef.$trigger ?? flowDef.triggers[0];
|
|
146
139
|
if (trigger?.kind === "http") {
|
|
147
140
|
return { method: trigger.method, path: trigger.path };
|
|
148
141
|
}
|
|
@@ -156,10 +149,7 @@ export function runtimeRouteFromFlow(flowDef: AnyFlowDef): RuntimeFlowRoute {
|
|
|
156
149
|
* @param into - Mutable route map to extend
|
|
157
150
|
* @returns Flows discovered (for `fx.call` registration)
|
|
158
151
|
*/
|
|
159
|
-
export function accumulateAdoptArgs(
|
|
160
|
-
args: readonly unknown[],
|
|
161
|
-
into: RuntimeRouteMap,
|
|
162
|
-
): AnyFlowDef[] {
|
|
152
|
+
export function accumulateAdoptArgs(args: readonly unknown[], into: RuntimeRouteMap): AnyFlowDef[] {
|
|
163
153
|
const found: AnyFlowDef[] = [];
|
|
164
154
|
|
|
165
155
|
for (const arg of args) {
|
|
@@ -169,9 +159,7 @@ export function accumulateAdoptArgs(
|
|
|
169
159
|
}
|
|
170
160
|
if (typeof arg !== "object" || arg === null) continue;
|
|
171
161
|
|
|
172
|
-
for (const [unit, value] of Object.entries(
|
|
173
|
-
arg as Record<string, unknown>,
|
|
174
|
-
)) {
|
|
162
|
+
for (const [unit, value] of Object.entries(arg as Record<string, unknown>)) {
|
|
175
163
|
if (isFlow(value)) {
|
|
176
164
|
// Flat `{ create: flow }` without a unit wrapper — skip client map
|
|
177
165
|
found.push(value);
|
|
@@ -180,9 +168,7 @@ export function accumulateAdoptArgs(
|
|
|
180
168
|
if (typeof value !== "object" || value === null) continue;
|
|
181
169
|
|
|
182
170
|
const unitBag = into[unit] ?? (into[unit] = {});
|
|
183
|
-
for (const [flowName, flowDef] of Object.entries(
|
|
184
|
-
value as Record<string, unknown>,
|
|
185
|
-
)) {
|
|
171
|
+
for (const [flowName, flowDef] of Object.entries(value as Record<string, unknown>)) {
|
|
186
172
|
if (!isFlow(flowDef)) continue;
|
|
187
173
|
found.push(flowDef);
|
|
188
174
|
unitBag[flowName] = runtimeRouteFromFlow(flowDef);
|