okengine 0.2.5 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +24 -23
- package/README.md +52 -346
- package/docs/spec/console.md +165 -142
- package/docs/spec/example.md +490 -312
- package/docs/spec/four-applications.md +495 -314
- package/docs/spec/unified-theory.md +184 -175
- package/package.json +46 -38
- package/spec/manifest.v1.schema.json +40 -9
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +53 -31
- package/src/auth/invoke-as.ts +1 -3
- package/src/auth/operator.ts +8 -26
- package/src/auth/planes.ts +2 -7
- package/src/auth/plugin.ts +4 -7
- package/src/auth/roles.ts +1 -5
- package/src/auth/sessions.ts +10 -39
- package/src/cli/args.ts +1 -5
- package/src/cli/ask-dev-mode.ts +40 -0
- package/src/cli/build.ts +1 -2
- package/src/cli/client-add.test.ts +8 -15
- package/src/cli/client-add.ts +5 -14
- package/src/cli/completion.test.ts +1 -5
- package/src/cli/completion.ts +4 -17
- package/src/cli/db-auto-push.test.ts +64 -0
- package/src/cli/db-auto-push.ts +72 -0
- package/src/cli/db.test.ts +189 -0
- package/src/cli/db.ts +386 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +163 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev.test.ts +148 -21
- package/src/cli/dev.ts +208 -134
- package/src/cli/doc-drift.test.ts +3 -2
- package/src/cli/doc-drift.ts +21 -50
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +7 -8
- package/src/cli/docker.ts +1 -3
- package/src/cli/doctor-diff-examples.ts +1 -3
- package/src/cli/doctor-diff.test.ts +1 -5
- package/src/cli/doctor-diff.ts +17 -46
- package/src/cli/doctor-pii.ts +2 -7
- package/src/cli/doctor.test.ts +26 -4
- package/src/cli/doctor.ts +35 -11
- package/src/cli/eval.ts +4 -14
- package/src/cli/gates-list.ts +1 -4
- package/src/cli/hero-meta.test.ts +17 -19
- package/src/cli/hero-meta.ts +20 -30
- package/src/cli/images.ts +3 -8
- package/src/cli/index.ts +11 -2
- package/src/cli/load-config.images.test.ts +14 -14
- package/src/cli/load-config.ts +41 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +45 -0
- package/src/cli/ports.test.ts +4 -13
- package/src/cli/ports.ts +1 -3
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +2 -7
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/client/budget-entry.ts +1 -6
- package/src/client/create.test.ts +6 -12
- package/src/client/create.ts +2 -8
- package/src/client/errors.ts +1 -4
- package/src/client/index.ts +1 -6
- package/src/client/notes-contract.test.ts +4 -13
- package/src/client/transport.ts +9 -30
- package/src/client/types.ts +8 -29
- package/src/compiler/aot.test.ts +2 -9
- package/src/compiler/aot.ts +1 -4
- package/src/compiler/differential.test.ts +3 -11
- package/src/compiler/dynamic.ts +1 -4
- package/src/compiler/effects-infer.ts +8 -34
- package/src/compiler/emit.ts +1 -3
- package/src/compiler/extract.test.ts +96 -30
- package/src/compiler/extract.ts +362 -156
- package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
- package/src/compiler/fixtures/skyport.expected.json +24 -83
- package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
- package/src/compiler/http-parse.ts +2 -9
- package/src/compiler/index.ts +1 -5
- package/src/compiler/response.ts +4 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +57 -34
- package/src/config/index.ts +181 -37
- package/src/config/resolve-driver.test.ts +28 -17
- package/src/console/budget.test.ts +1 -4
- package/src/console/index.ts +1 -4
- package/src/console/server/access.test.ts +15 -43
- package/src/console/server/access.ts +19 -49
- package/src/console/server/ai.test.ts +3 -11
- package/src/console/server/ai.ts +23 -46
- package/src/console/server/app.ts +14 -45
- package/src/console/server/auth-rate.test.ts +4 -12
- package/src/console/server/bind.ts +1 -5
- package/src/console/server/channels.test.ts +2 -6
- package/src/console/server/channels.ts +10 -35
- package/src/console/server/claim.ts +2 -8
- package/src/console/server/clock.test.ts +2 -6
- package/src/console/server/clock.ts +8 -26
- package/src/console/server/console.test.ts +1 -3
- package/src/console/server/diff.test.ts +5 -17
- package/src/console/server/diff.ts +10 -31
- package/src/console/server/dry-run.audit.test.ts +2 -8
- package/src/console/server/flows.ts +64 -233
- package/src/console/server/gates.test.ts +14 -50
- package/src/console/server/gates.ts +13 -48
- package/src/console/server/index.ts +2 -9
- package/src/console/server/live.ts +3 -12
- package/src/console/server/operator-db.test.ts +4 -15
- package/src/console/server/operator-db.ts +13 -32
- package/src/console/server/plugin.ts +50 -53
- package/src/console/server/plugins.test.ts +2 -6
- package/src/console/server/plugins.ts +17 -56
- package/src/console/server/runs-pii.ts +2 -7
- package/src/console/server/security.gate.test.ts +18 -40
- package/src/console/server/serve.ts +10 -25
- package/src/console/server/signals.test.ts +1 -3
- package/src/console/server/signals.ts +17 -40
- package/src/console/server/state.ts +21 -59
- package/src/console/server/store.test.ts +20 -22
- package/src/console/server/store.ts +31 -76
- package/src/console/server/vault.test.ts +12 -29
- package/src/console/server/vault.ts +23 -60
- package/src/console/ui/access/AccessA11yView.tsx +6 -21
- package/src/console/ui/access/a11y.test.tsx +3 -12
- package/src/console/ui/access/acknowledgement.test.ts +1 -4
- package/src/console/ui/access/acknowledgement.ts +1 -3
- package/src/console/ui/access/blast-radius.ts +1 -3
- package/src/console/ui/access/confirmation.test.ts +1 -5
- package/src/console/ui/access/confirmation.ts +1 -4
- package/src/console/ui/access/fixture.ts +1 -5
- package/src/console/ui/access/grantable.test.ts +1 -3
- package/src/console/ui/access/grantable.ts +2 -7
- package/src/console/ui/access/index.ts +2 -9
- package/src/console/ui/access/provenance.test.ts +1 -3
- package/src/console/ui/access/provenance.ts +2 -6
- package/src/console/ui/access/search.test.ts +1 -5
- package/src/console/ui/access/search.ts +2 -6
- package/src/console/ui/ai/AiA11yView.tsx +6 -17
- package/src/console/ui/ai/a11y.test.tsx +2 -5
- package/src/console/ui/ai/fixture.ts +2 -7
- package/src/console/ui/ai/format.ts +1 -3
- package/src/console/ui/ai/group.test.ts +1 -3
- package/src/console/ui/ai/group.ts +4 -12
- package/src/console/ui/ai/index.ts +2 -9
- package/src/console/ui/ai/promotion.test.ts +2 -7
- package/src/console/ui/ai/promotion.ts +4 -13
- package/src/console/ui/ai/search.test.ts +2 -11
- package/src/console/ui/ai/search.ts +3 -13
- package/src/console/ui/ai/types.ts +1 -8
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
- package/src/console/ui/architecture/a11y.test.tsx +1 -2
- package/src/console/ui/architecture/declared.ts +1 -5
- package/src/console/ui/architecture/index.ts +7 -35
- package/src/console/ui/architecture/layout.ts +1 -3
- package/src/console/ui/architecture/pathologies.ts +10 -19
- package/src/console/ui/architecture/search.ts +6 -15
- package/src/console/ui/architecture/traffic.ts +4 -14
- package/src/console/ui/architecture/types.ts +2 -10
- package/src/console/ui/architecture/view.test.ts +7 -19
- package/src/console/ui/architecture/view.ts +9 -36
- package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
- package/src/console/ui/channels/a11y.test.tsx +1 -2
- package/src/console/ui/channels/confirmation.test.ts +1 -4
- package/src/console/ui/channels/confirmation.ts +1 -4
- package/src/console/ui/channels/findings.ts +1 -5
- package/src/console/ui/channels/index.ts +2 -8
- package/src/console/ui/channels/locale.test.ts +1 -3
- package/src/console/ui/channels/locale.ts +2 -8
- package/src/console/ui/channels/search.ts +4 -13
- package/src/console/ui/channels/taxonomy.ts +1 -3
- package/src/console/ui/clock/ClockA11yView.tsx +9 -26
- package/src/console/ui/clock/a11y.test.tsx +2 -5
- package/src/console/ui/clock/confirmation.test.ts +1 -3
- package/src/console/ui/clock/confirmation.ts +1 -4
- package/src/console/ui/clock/findings.ts +1 -4
- package/src/console/ui/clock/health.ts +2 -7
- package/src/console/ui/clock/index.ts +2 -10
- package/src/console/ui/clock/search.test.ts +1 -3
- package/src/console/ui/clock/search.ts +2 -6
- package/src/console/ui/clock/timeline.test.ts +1 -3
- package/src/console/ui/clock/waiting-on.test.ts +1 -5
- package/src/console/ui/clock/waiting-on.ts +2 -7
- package/src/console/ui/diff/DiffA11yView.tsx +8 -17
- package/src/console/ui/diff/a11y.test.tsx +2 -5
- package/src/console/ui/diff/group.test.ts +3 -13
- package/src/console/ui/diff/group.ts +2 -8
- package/src/console/ui/diff/index.ts +2 -8
- package/src/console/ui/diff/search.test.ts +1 -5
- package/src/console/ui/diff/search.ts +4 -16
- package/src/console/ui/diff/summary.ts +1 -2
- package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
- package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
- package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
- package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
- package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
- package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
- package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
- package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
- package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
- package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
- package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
- package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
- package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
- package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
- package/src/console/ui/flows/a11y.test.tsx +2 -8
- package/src/console/ui/flows/buffer.test.ts +3 -11
- package/src/console/ui/flows/buffer.ts +4 -11
- package/src/console/ui/flows/confirmation.ts +1 -3
- package/src/console/ui/flows/contract.test.ts +3 -7
- package/src/console/ui/flows/contract.ts +12 -36
- package/src/console/ui/flows/graph.test.ts +3 -11
- package/src/console/ui/flows/graph.ts +5 -15
- package/src/console/ui/flows/index.ts +1 -6
- package/src/console/ui/flows/save-as-test.ts +1 -3
- package/src/console/ui/flows/search.ts +8 -25
- package/src/console/ui/flows/tiers.ts +2 -9
- package/src/console/ui/gates/GatesA11yView.tsx +4 -13
- package/src/console/ui/gates/a11y.test.tsx +2 -5
- package/src/console/ui/gates/audit.ts +1 -3
- package/src/console/ui/gates/denial.test.ts +1 -3
- package/src/console/ui/gates/denial.ts +4 -12
- package/src/console/ui/gates/findings.ts +1 -3
- package/src/console/ui/gates/group.test.ts +3 -3
- package/src/console/ui/gates/group.ts +3 -11
- package/src/console/ui/gates/index.ts +2 -10
- package/src/console/ui/gates/search.ts +3 -10
- package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
- package/src/console/ui/overview/a11y.test.tsx +1 -2
- package/src/console/ui/overview/busiest.ts +1 -3
- package/src/console/ui/overview/compose.ts +1 -13
- package/src/console/ui/overview/cost.ts +34 -38
- package/src/console/ui/overview/fixture.ts +21 -26
- package/src/console/ui/overview/golden.ts +4 -14
- package/src/console/ui/overview/index.ts +2 -9
- package/src/console/ui/overview/rank.test.ts +3 -10
- package/src/console/ui/overview/rank.ts +2 -7
- package/src/console/ui/overview/slo.test.ts +5 -9
- package/src/console/ui/overview/slo.ts +6 -23
- package/src/console/ui/overview/verdict.ts +3 -10
- package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
- package/src/console/ui/plugins/a11y.test.tsx +1 -2
- package/src/console/ui/plugins/fixture.ts +2 -4
- package/src/console/ui/plugins/group.test.ts +1 -3
- package/src/console/ui/plugins/group.ts +1 -6
- package/src/console/ui/plugins/index.ts +3 -13
- package/src/console/ui/plugins/search.ts +7 -19
- package/src/console/ui/runs/RunsA11yView.tsx +5 -20
- package/src/console/ui/runs/a11y.test.tsx +2 -5
- package/src/console/ui/runs/explain.ts +2 -6
- package/src/console/ui/runs/group.ts +3 -12
- package/src/console/ui/runs/histogram.test.ts +2 -11
- package/src/console/ui/runs/histogram.ts +1 -4
- package/src/console/ui/runs/index.ts +4 -18
- package/src/console/ui/runs/project.ts +2 -6
- package/src/console/ui/runs/query.test.ts +1 -3
- package/src/console/ui/runs/query.ts +12 -35
- package/src/console/ui/runs/search.ts +5 -19
- package/src/console/ui/runs/trace-link.test.ts +2 -6
- package/src/console/ui/runs/trace-link.ts +4 -16
- package/src/console/ui/runs/types.ts +1 -3
- package/src/console/ui/shell/App.tsx +2 -10
- package/src/console/ui/shell/client.ts +22 -115
- package/src/console/ui/shell/components/ui.tsx +1 -4
- package/src/console/ui/shell/layout/Shell.tsx +2 -4
- package/src/console/ui/shell/main.tsx +31 -96
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
- package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
- package/src/console/ui/shell/setup/Wizard.tsx +3 -5
- package/src/console/ui/shell/styles.css +1 -2
- package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
- package/src/console/ui/signals/a11y.test.tsx +2 -5
- package/src/console/ui/signals/confirmation.test.ts +1 -5
- package/src/console/ui/signals/confirmation.ts +2 -6
- package/src/console/ui/signals/dry-run.ts +1 -3
- package/src/console/ui/signals/durable.ts +1 -3
- package/src/console/ui/signals/findings.ts +1 -3
- package/src/console/ui/signals/group.test.ts +2 -8
- package/src/console/ui/signals/group.ts +2 -10
- package/src/console/ui/signals/index.ts +1 -4
- package/src/console/ui/signals/monitor.ts +2 -7
- package/src/console/ui/signals/schema-form.test.ts +3 -14
- package/src/console/ui/signals/schema-form.ts +1 -4
- package/src/console/ui/signals/search.ts +4 -13
- package/src/console/ui/store/StoreA11yView.tsx +3 -9
- package/src/console/ui/store/a11y.test.tsx +2 -5
- package/src/console/ui/store/confirmation.test.ts +1 -3
- package/src/console/ui/store/confirmation.ts +1 -4
- package/src/console/ui/store/dry-run.ts +2 -5
- package/src/console/ui/store/fixture.ts +1 -2
- package/src/console/ui/store/group.test.ts +1 -6
- package/src/console/ui/store/group.ts +1 -4
- package/src/console/ui/store/index.ts +1 -5
- package/src/console/ui/store/search.ts +2 -6
- package/src/console/ui/store/will-not-fire.ts +1 -2
- package/src/console/ui/traces/TracesA11yView.tsx +10 -29
- package/src/console/ui/traces/a11y.test.tsx +1 -2
- package/src/console/ui/traces/chain.test.ts +5 -19
- package/src/console/ui/traces/chain.ts +1 -3
- package/src/console/ui/traces/critical-path.test.ts +1 -3
- package/src/console/ui/traces/critical-path.ts +2 -6
- package/src/console/ui/traces/filter.test.ts +2 -6
- package/src/console/ui/traces/filter.ts +5 -13
- package/src/console/ui/traces/fold.test.ts +4 -12
- package/src/console/ui/traces/fold.ts +1 -3
- package/src/console/ui/traces/mini.ts +1 -3
- package/src/console/ui/traces/replay.test.ts +1 -3
- package/src/console/ui/traces/replay.ts +1 -3
- package/src/console/ui/traces/sampling.ts +1 -4
- package/src/console/ui/traces/search.ts +4 -17
- package/src/console/ui/traces/tier.ts +1 -3
- package/src/console/ui/vault/VaultA11yView.tsx +5 -17
- package/src/console/ui/vault/a11y.test.tsx +1 -2
- package/src/console/ui/vault/blast-radius.ts +1 -3
- package/src/console/ui/vault/confirmation.test.ts +1 -5
- package/src/console/ui/vault/confirmation.ts +1 -4
- package/src/console/ui/vault/dormant.test.ts +1 -4
- package/src/console/ui/vault/export-safe.test.ts +1 -5
- package/src/console/ui/vault/export-safe.ts +1 -4
- package/src/console/ui/vault/fixture.ts +3 -3
- package/src/console/ui/vault/group.ts +1 -2
- package/src/console/ui/vault/index.ts +2 -10
- package/src/console/ui/vault/search.ts +2 -6
- package/src/console/ui/vault/types.ts +1 -1
- package/src/console/xss.gate.test.ts +1 -3
- package/src/docker/compose.ts +112 -20
- package/src/docker/derive.ts +5 -19
- package/src/docker/docker.test.ts +15 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +4 -11
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +5 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +6 -1
- package/src/docker/recipes/rustfs.ts +33 -0
- package/src/docker/stack-id.test.ts +33 -0
- package/src/docker/stack-id.ts +25 -13
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/types.ts +13 -4
- package/src/drivers/ai-anthropic.ts +5 -14
- package/src/drivers/ai-mock.ts +2 -5
- package/src/drivers/ai-openai-compatible.ts +4 -10
- package/src/drivers/ai-providers.test.ts +6 -13
- package/src/drivers/bun-native-completeness.test.ts +6 -15
- package/src/drivers/channel-console.ts +6 -7
- package/src/drivers/channel-fcm.ts +20 -30
- package/src/drivers/channel-resend.ts +1 -3
- package/src/drivers/channel-smtp.ts +2 -6
- package/src/drivers/channel-types.ts +2 -12
- package/src/drivers/channel-unifonic.ts +2 -6
- package/src/drivers/channel-wa-cloud.ts +2 -6
- package/src/drivers/channel-webpush.ts +21 -60
- package/src/drivers/conformance.test.ts +2 -10
- package/src/drivers/conformance.ts +8 -21
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -56
- package/src/drivers/memory.ts +14 -41
- package/src/drivers/pgvector.ts +7 -11
- package/src/drivers/postgres.ts +7 -13
- package/src/drivers/redis.ts +13 -37
- package/src/drivers/s3.ts +5 -17
- package/src/drivers/signal-engine.ts +12 -49
- package/src/drivers/signal-memory.ts +2 -8
- package/src/drivers/signal-nats.ts +4 -9
- package/src/drivers/signal-postgres.ts +62 -129
- package/src/drivers/signal-redis.ts +7 -21
- package/src/drivers/signal-types.ts +1 -4
- package/src/drivers/sqlite.ts +3 -12
- package/src/drivers/types.ts +4 -23
- package/src/drivers/vault-env.ts +2 -6
- package/src/drivers/vault-infisical.ts +1 -5
- package/src/drivers/vault-managed.ts +1 -5
- package/src/drivers/vault-memory.ts +1 -5
- package/src/drivers/vault-openbao.ts +1 -5
- package/src/drivers/vault-sops.ts +10 -35
- package/src/drivers/vault-types.ts +1 -7
- package/src/elements/ai/declare.ts +4 -14
- package/src/elements/ai/eval.ts +2 -6
- package/src/elements/ai/pii.ts +1 -3
- package/src/elements/ai/runtime.ts +12 -50
- package/src/elements/ai/schema.ts +4 -15
- package/src/elements/ai.test.ts +13 -24
- package/src/elements/ai.ts +1 -5
- package/src/elements/channel/consent.ts +3 -12
- package/src/elements/channel/costs.ts +4 -15
- package/src/elements/channel/declare.ts +1 -4
- package/src/elements/channel/email-auth.ts +1 -4
- package/src/elements/channel/locale.ts +2 -10
- package/src/elements/channel/mask.ts +1 -3
- package/src/elements/channel/mime.ts +2 -12
- package/src/elements/channel/outcomes.test.ts +1 -5
- package/src/elements/channel/outcomes.ts +5 -15
- package/src/elements/channel/receipts.ts +2 -7
- package/src/elements/channel/runtime.ts +28 -74
- package/src/elements/channel/suppression.ts +8 -14
- package/src/elements/channel.test.ts +8 -31
- package/src/elements/channel.ts +3 -14
- package/src/elements/clock/actions.ts +6 -18
- package/src/elements/clock/declare.ts +1 -3
- package/src/elements/clock/dst.ts +1 -5
- package/src/elements/clock/durable.ts +4 -16
- package/src/elements/clock/health.ts +2 -7
- package/src/elements/clock/leader.ts +2 -9
- package/src/elements/clock/reconcile.ts +4 -15
- package/src/elements/clock/runtime.ts +2 -5
- package/src/elements/clock/schedule.ts +4 -20
- package/src/elements/clock.test.ts +2 -7
- package/src/elements/clock.ts +5 -23
- package/src/elements/gate/permissions.ts +1 -4
- package/src/elements/gate/runtime.ts +7 -28
- package/src/elements/gate.ts +1 -5
- package/src/elements/index.ts +9 -7
- package/src/elements/signal/declare.ts +2 -7
- package/src/elements/signal/reconcile.test.ts +1 -4
- package/src/elements/signal/runtime.ts +1 -3
- package/src/elements/signal.test.ts +3 -15
- package/src/elements/signal.ts +2 -8
- package/src/elements/store/cache.test.ts +46 -0
- package/src/elements/store/cache.ts +3 -11
- package/src/elements/store/classify.ts +5 -22
- package/src/elements/store/declare.ts +8 -17
- package/src/elements/store/domain-ddl.test.ts +86 -0
- package/src/elements/store/emit-drizzle.ts +363 -0
- package/src/elements/store/files-policy.test.ts +1 -5
- package/src/elements/store/files-policy.ts +4 -12
- package/src/elements/store/load-plugin-tables.ts +103 -0
- package/src/elements/store/missing-relation.test.ts +83 -0
- package/src/elements/store/missing-relation.ts +38 -0
- package/src/elements/store/replica.ts +1 -4
- package/src/elements/store/runtime.ts +25 -28
- package/src/elements/store/schema-decl.test.ts +227 -0
- package/src/elements/store/schema-decl.ts +516 -0
- package/src/elements/store/sql-condition.ts +11 -21
- package/src/elements/store/sql-session.test.ts +50 -0
- package/src/elements/store/sql-session.ts +60 -63
- package/src/elements/store/table.ts +35 -19
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +37 -31
- package/src/elements/vault/chain.ts +34 -0
- package/src/elements/vault/declare.ts +22 -32
- package/src/elements/vault/fingerprint.ts +2 -7
- package/src/elements/vault/redact.ts +2 -6
- package/src/elements/vault/runtime.ts +18 -32
- package/src/elements/vault.test.ts +12 -28
- package/src/elements/vault.ts +8 -12
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +34 -94
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.ts +2 -8
- package/src/kernel/boot-bind/clock.ts +2 -6
- package/src/kernel/boot-bind/gate.ts +2 -8
- package/src/kernel/boot-bind/runs.ts +1 -3
- package/src/kernel/boot-bind/signal.ts +3 -10
- package/src/kernel/boot-bind/store.test.ts +17 -17
- package/src/kernel/boot-bind/store.ts +44 -50
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -9
- package/src/kernel/boot.ts +29 -76
- package/src/kernel/budget.test.ts +1 -3
- package/src/kernel/capability.ts +3 -10
- package/src/kernel/dry-run.test.ts +1 -4
- package/src/kernel/dry-run.ts +3 -11
- package/src/kernel/effects.test.ts +1 -5
- package/src/kernel/effects.ts +4 -11
- package/src/kernel/errors.registry.test.ts +2 -8
- package/src/kernel/errors.ts +23 -32
- package/src/kernel/flow.test.ts +12 -25
- package/src/kernel/flow.ts +5 -25
- package/src/kernel/fx.test.ts +15 -44
- package/src/kernel/fx.ts +27 -79
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +10 -10
- package/src/kernel/hooks.ts +3 -12
- package/src/kernel/index.ts +4 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +1 -6
- package/src/kernel/pipeline.test.ts +10 -19
- package/src/kernel/pipeline.ts +5 -17
- package/src/kernel/plug.ts +4 -11
- package/src/kernel/plugin/conflicts.test.ts +13 -25
- package/src/kernel/plugin/decorate.test.ts +8 -13
- package/src/kernel/plugin/scoping.test.ts +4 -11
- package/src/kernel/plugin.ts +48 -24
- package/src/kernel/registry.ts +80 -29
- package/src/kernel/router.test.ts +15 -13
- package/src/kernel/router.ts +9 -29
- package/src/kernel/routing-budget.test.ts +1 -3
- package/src/kernel/run-telemetry.ts +1 -3
- package/src/kernel/triggers.ts +4 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/index.ts +2 -9
- package/src/manifest/types.ts +29 -5
- package/src/manifest/undeclared.test.ts +4 -12
- package/src/manifest/undeclared.ts +1 -2
- package/src/manifest/validate.test.ts +2 -6
- package/src/manifest/validate.ts +4 -14
- package/src/mcp/authorization.ts +8 -27
- package/src/mcp/confirmation.ts +3 -10
- package/src/mcp/data.ts +2 -6
- package/src/mcp/docs-index.ts +4 -7
- package/src/mcp/docs-mcp.test.ts +3 -12
- package/src/mcp/docs-server.ts +7 -27
- package/src/mcp/docs-tools.ts +2 -6
- package/src/mcp/index.ts +1 -6
- package/src/mcp/injection.gate.test.ts +4 -18
- package/src/mcp/mcp.test.ts +18 -49
- package/src/mcp/protocol.ts +3 -10
- package/src/mcp/server.ts +11 -52
- package/src/mcp/session.ts +4 -14
- package/src/mcp/tools.ts +14 -50
- package/src/plugins/catalogue.test.ts +3 -7
- package/src/plugins/catalogue.ts +1 -3
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/supply-chain.ts +5 -17
- package/src/release/exports.ts +3 -8
- package/src/release/measure.exports.test.ts +1 -3
- package/src/release/measure.ts +15 -43
- package/src/runs/bench.test.ts +1 -3
- package/src/runs/collect.ts +8 -25
- package/src/runs/drivers/clickhouse.ts +2 -9
- package/src/runs/drivers/files.ts +9 -31
- package/src/runs/drivers/memory.ts +5 -22
- package/src/runs/drivers/postgres.ts +8 -20
- package/src/runs/duckdb.ts +2 -8
- package/src/runs/index.ts +3 -14
- package/src/runs/outlier.ts +3 -10
- package/src/runs/parquet.ts +8 -26
- package/src/runs/privacy.ts +2 -8
- package/src/runs/runs.test.ts +3 -9
- package/src/runs/runtime.ts +7 -32
- package/src/runs/shred.ts +10 -29
- package/src/runs/types.ts +1 -4
- package/src/runtime/bun.ts +4 -15
- package/src/runtime/cold-start.bench.ts +1 -3
- package/src/runtime/dev-request-log.test.ts +1 -4
- package/src/runtime/dev-request-log.ts +1 -4
- package/src/runtime/index.ts +1 -6
- package/src/runtime/primitives.ts +5 -4
- package/src/runtime/security.ts +3 -13
- package/src/runtime/serve.test.ts +4 -7
- package/src/runtime/types.ts +1 -4
- package/src/runtime/web-standard.ts +3 -15
- package/src/term.test.ts +4 -6
- package/src/term.ts +49 -98
- package/src/test/create-test-app.test.ts +4 -14
- package/src/test/create-test-app.ts +13 -31
- package/src/test/provisions.integration.test.ts +3 -11
- package/src/upgrade/codemods.test.ts +25 -6
- package/src/upgrade/codemods.ts +116 -3
- package/src/validation/standard-schema.test.ts +2 -5
- package/src/validation/standard-schema.ts +13 -33
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
package/src/cli/eval.ts
CHANGED
|
@@ -3,11 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { resolve } from "node:path";
|
|
6
|
-
import {
|
|
7
|
-
parseEvalJsonl,
|
|
8
|
-
runPromptEvals,
|
|
9
|
-
type EvalCase,
|
|
10
|
-
} from "../elements/ai/eval.ts";
|
|
6
|
+
import { parseEvalJsonl, runPromptEvals, type EvalCase } from "../elements/ai/eval.ts";
|
|
11
7
|
import type { Manifest } from "../manifest/types.ts";
|
|
12
8
|
|
|
13
9
|
/** Options for {@link runOkeEval}. */
|
|
@@ -35,9 +31,7 @@ export interface OkeEvalOptions {
|
|
|
35
31
|
* @param options - Manifest + ask wiring
|
|
36
32
|
* @returns Exit code (1 on any failure)
|
|
37
33
|
*/
|
|
38
|
-
export async function runOkeEval(
|
|
39
|
-
options: OkeEvalOptions = {},
|
|
40
|
-
): Promise<number> {
|
|
34
|
+
export async function runOkeEval(options: OkeEvalOptions = {}): Promise<number> {
|
|
41
35
|
const write = options.write ?? ((t) => process.stdout.write(t));
|
|
42
36
|
let manifest = options.manifest;
|
|
43
37
|
if (!manifest) {
|
|
@@ -57,9 +51,7 @@ export async function runOkeEval(
|
|
|
57
51
|
return 0;
|
|
58
52
|
}
|
|
59
53
|
|
|
60
|
-
const load =
|
|
61
|
-
options.loadEvals ??
|
|
62
|
-
(async (p: string) => Bun.file(resolve(p)).text());
|
|
54
|
+
const load = options.loadEvals ?? (async (p: string) => Bun.file(resolve(p)).text());
|
|
63
55
|
|
|
64
56
|
let failed = 0;
|
|
65
57
|
for (const name of names) {
|
|
@@ -69,9 +61,7 @@ export async function runOkeEval(
|
|
|
69
61
|
continue;
|
|
70
62
|
}
|
|
71
63
|
if (!options.ask) {
|
|
72
|
-
console.error(
|
|
73
|
-
`oke eval: ask() not wired — provide a runtime binding for prompt "${name}"`,
|
|
74
|
-
);
|
|
64
|
+
console.error(`oke eval: ask() not wired — provide a runtime binding for prompt "${name}"`);
|
|
75
65
|
return 1;
|
|
76
66
|
}
|
|
77
67
|
let cases: EvalCase[];
|
package/src/cli/gates-list.ts
CHANGED
|
@@ -3,10 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { resolve } from "node:path";
|
|
6
|
-
import {
|
|
7
|
-
deriveModuleActions,
|
|
8
|
-
formatGatesList,
|
|
9
|
-
} from "../elements/gate/permissions.ts";
|
|
6
|
+
import { deriveModuleActions, formatGatesList } from "../elements/gate/permissions.ts";
|
|
10
7
|
import type { Manifest } from "../manifest/types.ts";
|
|
11
8
|
import { wantsJson } from "./args.ts";
|
|
12
9
|
import { EXIT_OK, EXIT_RUNTIME } from "./exit.ts";
|
|
@@ -15,31 +15,29 @@ import {
|
|
|
15
15
|
const SAMPLE: OkeConfig = {
|
|
16
16
|
drivers: {
|
|
17
17
|
store: {
|
|
18
|
-
sql: {
|
|
19
|
-
kv: {
|
|
18
|
+
sql: { local: "sqlite", docker: "postgres", prod: "postgres" },
|
|
19
|
+
kv: { local: "memory", docker: "redis", prod: "redis" },
|
|
20
20
|
},
|
|
21
|
-
signal: {
|
|
22
|
-
clock: {
|
|
23
|
-
vault: {
|
|
21
|
+
signal: { local: "memory", docker: "postgres", prod: "postgres" },
|
|
22
|
+
clock: { local: "memory", docker: "postgres", prod: "postgres" },
|
|
23
|
+
vault: { local: "dotenv", docker: "dotenv", prod: "sops" },
|
|
24
24
|
channel: {
|
|
25
|
-
email: {
|
|
25
|
+
email: { local: "console", docker: "smtp", prod: "smtp" },
|
|
26
26
|
},
|
|
27
|
-
ai: {
|
|
27
|
+
ai: { local: "mock", docker: "mock" },
|
|
28
28
|
},
|
|
29
29
|
};
|
|
30
30
|
|
|
31
31
|
describe("hero-meta", () => {
|
|
32
|
-
test("resolveDevProfile maps
|
|
33
|
-
expect(resolveDevProfile({
|
|
34
|
-
expect(resolveDevProfile({
|
|
35
|
-
expect(resolveDevProfile({
|
|
36
|
-
expect(resolveDevProfile({
|
|
37
|
-
"production",
|
|
38
|
-
);
|
|
32
|
+
test("resolveDevProfile maps docker and NODE_ENV", () => {
|
|
33
|
+
expect(resolveDevProfile({ docker: false })).toBe("local");
|
|
34
|
+
expect(resolveDevProfile({ docker: true })).toBe("docker");
|
|
35
|
+
expect(resolveDevProfile({ docker: false, nodeEnv: "test" })).toBe("test");
|
|
36
|
+
expect(resolveDevProfile({ docker: false, nodeEnv: "production" })).toBe("production");
|
|
39
37
|
});
|
|
40
38
|
|
|
41
39
|
test("resolveHeroElements lists eight elements with drivers", () => {
|
|
42
|
-
const rows = resolveHeroElements(SAMPLE, {
|
|
40
|
+
const rows = resolveHeroElements(SAMPLE, { docker: false });
|
|
43
41
|
expect(rows.map((r) => r.element)).toEqual([
|
|
44
42
|
"flow",
|
|
45
43
|
"signal",
|
|
@@ -54,9 +52,9 @@ describe("hero-meta", () => {
|
|
|
54
52
|
expect(rows.find((r) => r.element === "flow")?.detail).toBe("●");
|
|
55
53
|
});
|
|
56
54
|
|
|
57
|
-
test("
|
|
55
|
+
test("docker profile applies to every element", () => {
|
|
58
56
|
const rows = resolveHeroElements(SAMPLE, {
|
|
59
|
-
|
|
57
|
+
docker: true,
|
|
60
58
|
sqlDriver: "postgres",
|
|
61
59
|
kvDriver: "redis",
|
|
62
60
|
});
|
|
@@ -72,13 +70,13 @@ describe("hero-meta", () => {
|
|
|
72
70
|
test("encode/decode round-trips", () => {
|
|
73
71
|
const snap = buildDevHeroSnapshot({
|
|
74
72
|
config: SAMPLE,
|
|
75
|
-
|
|
73
|
+
docker: true,
|
|
76
74
|
sqlDriver: "postgres",
|
|
77
75
|
kvDriver: "redis",
|
|
78
76
|
version: "0.2.4",
|
|
79
77
|
nodeEnv: "development",
|
|
80
78
|
});
|
|
81
|
-
expect(snap.profile).toBe("
|
|
79
|
+
expect(snap.profile).toBe("docker");
|
|
82
80
|
expect(snap.runtimeEnv).toBe("local");
|
|
83
81
|
expect(decodeHeroSnapshot(encodeHeroSnapshot(snap))).toEqual(snap);
|
|
84
82
|
});
|
package/src/cli/hero-meta.ts
CHANGED
|
@@ -11,11 +11,7 @@ import {
|
|
|
11
11
|
} from "../config/index.ts";
|
|
12
12
|
|
|
13
13
|
/** How the process is running (local laptop → production). */
|
|
14
|
-
export type DevRuntimeProfile =
|
|
15
|
-
| "local"
|
|
16
|
-
| "local-server"
|
|
17
|
-
| "test"
|
|
18
|
-
| "production";
|
|
14
|
+
export type DevRuntimeProfile = "local" | "docker" | "test" | "production";
|
|
19
15
|
|
|
20
16
|
/** Data plane: still on a laptop vs real production. */
|
|
21
17
|
export type DevRuntimeEnv = "local" | "production";
|
|
@@ -61,16 +57,16 @@ export function formatHeroSystemLine(
|
|
|
61
57
|
/**
|
|
62
58
|
* Profile for an `oke dev` session.
|
|
63
59
|
*
|
|
64
|
-
* @param options -
|
|
60
|
+
* @param options - Docker / NODE_ENV hints
|
|
65
61
|
*/
|
|
66
62
|
export function resolveDevProfile(options: {
|
|
67
|
-
readonly
|
|
63
|
+
readonly docker: boolean;
|
|
68
64
|
/** Explicit role — do not infer from ambient `NODE_ENV` (tests set `test`). */
|
|
69
65
|
readonly nodeEnv?: string;
|
|
70
66
|
}): DevRuntimeProfile {
|
|
71
67
|
if (options.nodeEnv === "test") return "test";
|
|
72
68
|
if (options.nodeEnv === "production") return "production";
|
|
73
|
-
return options.
|
|
69
|
+
return options.docker ? "docker" : "local";
|
|
74
70
|
}
|
|
75
71
|
|
|
76
72
|
/**
|
|
@@ -78,9 +74,7 @@ export function resolveDevProfile(options: {
|
|
|
78
74
|
*
|
|
79
75
|
* @param profile - Runtime profile
|
|
80
76
|
*/
|
|
81
|
-
export function resolveDevRuntimeEnv(
|
|
82
|
-
profile: DevRuntimeProfile,
|
|
83
|
-
): DevRuntimeEnv {
|
|
77
|
+
export function resolveDevRuntimeEnv(profile: DevRuntimeProfile): DevRuntimeEnv {
|
|
84
78
|
return profile === "production" ? "production" : "local";
|
|
85
79
|
}
|
|
86
80
|
|
|
@@ -89,7 +83,7 @@ export function resolveDevRuntimeEnv(
|
|
|
89
83
|
*
|
|
90
84
|
* @param map - Env driver map
|
|
91
85
|
* @param env - Config env key
|
|
92
|
-
* @param prefer - Override (
|
|
86
|
+
* @param prefer - Override (docker sql/kv)
|
|
93
87
|
*/
|
|
94
88
|
function driverOr(
|
|
95
89
|
map: Parameters<typeof resolveDriverId>[0],
|
|
@@ -106,10 +100,7 @@ function driverOr(
|
|
|
106
100
|
* @param channel - Channel driver maps
|
|
107
101
|
* @param env - Config env
|
|
108
102
|
*/
|
|
109
|
-
function channelDetail(
|
|
110
|
-
channel: DriversConfig["channel"],
|
|
111
|
-
env: ConfigEnv,
|
|
112
|
-
): string {
|
|
103
|
+
function channelDetail(channel: DriversConfig["channel"], env: ConfigEnv): string {
|
|
113
104
|
if (!channel) return "—";
|
|
114
105
|
const parts: string[] = [];
|
|
115
106
|
for (const medium of ["email", "sms", "whatsapp", "push"] as const) {
|
|
@@ -120,11 +111,11 @@ function channelDetail(
|
|
|
120
111
|
}
|
|
121
112
|
|
|
122
113
|
/**
|
|
123
|
-
* Summarize store facets for the active (or
|
|
114
|
+
* Summarize store facets for the active (or docker-overridden) drivers.
|
|
124
115
|
*
|
|
125
116
|
* @param store - Store driver maps
|
|
126
117
|
* @param env - Config env for non-overridden facets
|
|
127
|
-
* @param overrides -
|
|
118
|
+
* @param overrides - Docker sql/kv ids
|
|
128
119
|
*/
|
|
129
120
|
function storeDetail(
|
|
130
121
|
store: DriversConfig["store"],
|
|
@@ -145,26 +136,25 @@ function storeDetail(
|
|
|
145
136
|
}
|
|
146
137
|
|
|
147
138
|
/**
|
|
148
|
-
* Resolve eight-element rows from `oke.config` +
|
|
139
|
+
* Resolve eight-element rows from `oke.config` + docker overrides.
|
|
149
140
|
*
|
|
150
141
|
* @param config - Loaded config (or null)
|
|
151
|
-
* @param options -
|
|
142
|
+
* @param options - Docker driver overrides; config env for maps
|
|
152
143
|
*/
|
|
153
144
|
export function resolveHeroElements(
|
|
154
145
|
config: OkeConfig | null | undefined,
|
|
155
146
|
options: {
|
|
156
|
-
/** Use
|
|
157
|
-
readonly
|
|
147
|
+
/** Use docker store ids from stack (`oke dev -d`). */
|
|
148
|
+
readonly docker: boolean;
|
|
158
149
|
readonly sqlDriver?: string;
|
|
159
150
|
readonly kvDriver?: string;
|
|
160
|
-
/** Which driver map column to read (default `
|
|
151
|
+
/** Which driver map column to read (default `local`). */
|
|
161
152
|
readonly configEnv?: ConfigEnv;
|
|
162
153
|
},
|
|
163
154
|
): readonly HeroElementRow[] {
|
|
164
155
|
const drivers = config?.drivers;
|
|
165
|
-
// `-
|
|
166
|
-
const configEnv: ConfigEnv =
|
|
167
|
-
options.configEnv ?? (options.stack ? "stack" : "dev");
|
|
156
|
+
// `-d` reads the `docker` profile for every element (not a store-only override).
|
|
157
|
+
const configEnv: ConfigEnv = options.configEnv ?? (options.docker ? "docker" : "local");
|
|
168
158
|
|
|
169
159
|
const byName: Record<string, string> = {
|
|
170
160
|
flow: "●",
|
|
@@ -189,18 +179,18 @@ export function resolveHeroElements(
|
|
|
189
179
|
/**
|
|
190
180
|
* Build the full hero snapshot for banner / soft reload.
|
|
191
181
|
*
|
|
192
|
-
* @param options - Config,
|
|
182
|
+
* @param options - Config, docker, versions
|
|
193
183
|
*/
|
|
194
184
|
export function buildDevHeroSnapshot(options: {
|
|
195
185
|
readonly config?: OkeConfig | null;
|
|
196
|
-
readonly
|
|
186
|
+
readonly docker: boolean;
|
|
197
187
|
readonly sqlDriver?: string;
|
|
198
188
|
readonly kvDriver?: string;
|
|
199
189
|
readonly version?: string;
|
|
200
190
|
readonly nodeEnv?: string;
|
|
201
191
|
}): DevHeroSnapshot {
|
|
202
192
|
const profile = resolveDevProfile({
|
|
203
|
-
|
|
193
|
+
docker: options.docker,
|
|
204
194
|
nodeEnv: options.nodeEnv,
|
|
205
195
|
});
|
|
206
196
|
return {
|
|
@@ -208,7 +198,7 @@ export function buildDevHeroSnapshot(options: {
|
|
|
208
198
|
runtimeEnv: resolveDevRuntimeEnv(profile),
|
|
209
199
|
system: formatHeroSystemLine(),
|
|
210
200
|
elements: resolveHeroElements(options.config, {
|
|
211
|
-
|
|
201
|
+
docker: options.docker,
|
|
212
202
|
sqlDriver: options.sqlDriver,
|
|
213
203
|
kvDriver: options.kvDriver,
|
|
214
204
|
}),
|
package/src/cli/images.ts
CHANGED
|
@@ -54,9 +54,7 @@ export interface ImagesPinOptions {
|
|
|
54
54
|
*
|
|
55
55
|
* @param options - Config / images
|
|
56
56
|
*/
|
|
57
|
-
export async function runImagesList(
|
|
58
|
-
options: ImagesListOptions = {},
|
|
59
|
-
): Promise<number> {
|
|
57
|
+
export async function runImagesList(options: ImagesListOptions = {}): Promise<number> {
|
|
60
58
|
const write = options.write ?? ((t) => process.stdout.write(t));
|
|
61
59
|
const writeErr = options.writeErr ?? ((t) => process.stderr.write(t));
|
|
62
60
|
const json = options.json ?? false;
|
|
@@ -113,8 +111,7 @@ export function buildImagesListRows(
|
|
|
113
111
|
} catch {
|
|
114
112
|
// Unknown image — still list the row; recipe stays "-".
|
|
115
113
|
}
|
|
116
|
-
const digest =
|
|
117
|
-
lock?.images[role]?.digest ?? digestFromRef ?? "-";
|
|
114
|
+
const digest = lock?.images[role]?.digest ?? digestFromRef ?? "-";
|
|
118
115
|
return {
|
|
119
116
|
role,
|
|
120
117
|
recipe,
|
|
@@ -150,9 +147,7 @@ export function formatImagesList(rows: readonly ImagesListRow[]): string {
|
|
|
150
147
|
*
|
|
151
148
|
* @param options - Config / resolver
|
|
152
149
|
*/
|
|
153
|
-
export async function runImagesPin(
|
|
154
|
-
options: ImagesPinOptions = {},
|
|
155
|
-
): Promise<number> {
|
|
150
|
+
export async function runImagesPin(options: ImagesPinOptions = {}): Promise<number> {
|
|
156
151
|
const write = options.write ?? ((t) => process.stdout.write(t));
|
|
157
152
|
const cwd = options.cwd ?? process.cwd();
|
|
158
153
|
let images = options.images;
|
package/src/cli/index.ts
CHANGED
|
@@ -7,6 +7,7 @@ import { branchCli } from "./branch.ts";
|
|
|
7
7
|
import { buildCli } from "./build.ts";
|
|
8
8
|
import { clientAddCli } from "./client-add.ts";
|
|
9
9
|
import { completionCli } from "./completion.ts";
|
|
10
|
+
import { dbCli } from "./db.ts";
|
|
10
11
|
import { devCli } from "./dev.ts";
|
|
11
12
|
import { doctorCli } from "./doctor.ts";
|
|
12
13
|
import { dockerCli } from "./docker.ts";
|
|
@@ -14,6 +15,7 @@ import { evalCli } from "./eval.ts";
|
|
|
14
15
|
import { EXIT_CODE_HELP, EXIT_OK, EXIT_USAGE } from "./exit.ts";
|
|
15
16
|
import { gatesListCli } from "./gates-list.ts";
|
|
16
17
|
import { imagesCli } from "./images.ts";
|
|
18
|
+
import { modeCli } from "./mode.ts";
|
|
17
19
|
import { privacyEraseCli } from "./privacy-erase.ts";
|
|
18
20
|
import { formatOkeHelp } from "./registry.ts";
|
|
19
21
|
import { schemaCli } from "./schema.ts";
|
|
@@ -29,6 +31,10 @@ if (cmd === "dev") {
|
|
|
29
31
|
process.exit(await devCli(sub ? [sub, ...rest] : rest));
|
|
30
32
|
}
|
|
31
33
|
|
|
34
|
+
if (cmd === "mode") {
|
|
35
|
+
process.exit(await modeCli(sub ? [sub, ...rest] : rest));
|
|
36
|
+
}
|
|
37
|
+
|
|
32
38
|
if (cmd === "start") {
|
|
33
39
|
process.exit(await startCli(sub ? [sub, ...rest] : rest));
|
|
34
40
|
}
|
|
@@ -45,6 +51,10 @@ if (cmd === "schema") {
|
|
|
45
51
|
process.exit(await schemaCli(sub ? [sub, ...rest] : rest));
|
|
46
52
|
}
|
|
47
53
|
|
|
54
|
+
if (cmd === "db") {
|
|
55
|
+
process.exit(await dbCli(sub ? [sub, ...rest] : rest));
|
|
56
|
+
}
|
|
57
|
+
|
|
48
58
|
if (cmd === "client" && sub === "add") {
|
|
49
59
|
process.exit(await clientAddCli(rest));
|
|
50
60
|
}
|
|
@@ -91,8 +101,7 @@ if (cmd === "completion") {
|
|
|
91
101
|
|
|
92
102
|
if (cmd === undefined || cmd === "--help" || cmd === "-h" || cmd === "help") {
|
|
93
103
|
// Bare `oke` — commands only. Exit-code table only on explicit --help.
|
|
94
|
-
const help =
|
|
95
|
-
cmd === undefined ? formatOkeHelp() : `${formatOkeHelp()}${EXIT_CODE_HELP}`;
|
|
104
|
+
const help = cmd === undefined ? formatOkeHelp() : `${formatOkeHelp()}${EXIT_CODE_HELP}`;
|
|
96
105
|
console.log(help);
|
|
97
106
|
process.exit(cmd ? EXIT_OK : EXIT_USAGE);
|
|
98
107
|
}
|
|
@@ -6,7 +6,7 @@ import { describe, expect, test } from "bun:test";
|
|
|
6
6
|
import {
|
|
7
7
|
defaultImagesFromConfig,
|
|
8
8
|
resolveImages,
|
|
9
|
-
|
|
9
|
+
dockerDevDriverMismatches,
|
|
10
10
|
} from "./load-config.ts";
|
|
11
11
|
|
|
12
12
|
describe("defaultImagesFromConfig", () => {
|
|
@@ -75,14 +75,14 @@ describe("resolveImages", () => {
|
|
|
75
75
|
});
|
|
76
76
|
});
|
|
77
77
|
|
|
78
|
-
describe("
|
|
79
|
-
test("flags
|
|
80
|
-
const mismatches =
|
|
78
|
+
describe("dockerDevDriverMismatches", () => {
|
|
79
|
+
test("flags docker/prod sqlite/memory when containers are up", () => {
|
|
80
|
+
const mismatches = dockerDevDriverMismatches(
|
|
81
81
|
{
|
|
82
82
|
drivers: {
|
|
83
83
|
store: {
|
|
84
|
-
sql: {
|
|
85
|
-
kv: {
|
|
84
|
+
sql: { local: "sqlite", docker: "sqlite", prod: "sqlite" },
|
|
85
|
+
kv: { local: "memory", docker: "memory", prod: "memory" },
|
|
86
86
|
},
|
|
87
87
|
},
|
|
88
88
|
},
|
|
@@ -94,13 +94,13 @@ describe("stackDevDriverMismatches", () => {
|
|
|
94
94
|
]);
|
|
95
95
|
});
|
|
96
96
|
|
|
97
|
-
test("silent when
|
|
98
|
-
const mismatches =
|
|
97
|
+
test("silent when docker profile matches containers", () => {
|
|
98
|
+
const mismatches = dockerDevDriverMismatches(
|
|
99
99
|
{
|
|
100
100
|
drivers: {
|
|
101
101
|
store: {
|
|
102
|
-
sql: {
|
|
103
|
-
kv: {
|
|
102
|
+
sql: { local: "sqlite", docker: "postgres", prod: "postgres" },
|
|
103
|
+
kv: { local: "memory", docker: "redis", prod: "redis" },
|
|
104
104
|
},
|
|
105
105
|
},
|
|
106
106
|
},
|
|
@@ -109,13 +109,13 @@ describe("stackDevDriverMismatches", () => {
|
|
|
109
109
|
expect(mismatches).toEqual([]);
|
|
110
110
|
});
|
|
111
111
|
|
|
112
|
-
test("silent when only prod is set (
|
|
113
|
-
const mismatches =
|
|
112
|
+
test("silent when only prod is set (docker falls back to prod)", () => {
|
|
113
|
+
const mismatches = dockerDevDriverMismatches(
|
|
114
114
|
{
|
|
115
115
|
drivers: {
|
|
116
116
|
store: {
|
|
117
|
-
sql: {
|
|
118
|
-
kv: {
|
|
117
|
+
sql: { local: "sqlite", prod: "postgres" },
|
|
118
|
+
kv: { local: "memory", prod: "redis" },
|
|
119
119
|
},
|
|
120
120
|
},
|
|
121
121
|
},
|
package/src/cli/load-config.ts
CHANGED
|
@@ -22,33 +22,31 @@ function driverId(ref: DriverRef | undefined): string | undefined {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
* Prefer `
|
|
25
|
+
* Prefer `docker` then `prod` for a driver map (compose infra ≈ production).
|
|
26
26
|
*
|
|
27
27
|
* @param map - Env driver map
|
|
28
28
|
*/
|
|
29
|
-
function
|
|
30
|
-
map: { readonly
|
|
29
|
+
function dockerOrProdId(
|
|
30
|
+
map: { readonly docker?: DriverRef; readonly prod?: DriverRef } | undefined,
|
|
31
31
|
): string | undefined {
|
|
32
|
-
return driverId(map?.
|
|
32
|
+
return driverId(map?.docker) ?? driverId(map?.prod);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
/**
|
|
36
|
-
* Derive default image pins from
|
|
36
|
+
* Derive default image pins from docker/prod driver protocols.
|
|
37
37
|
*
|
|
38
38
|
* Used when `oke.config.ts` omits `images` but declares postgres/redis (etc.)
|
|
39
|
-
* so `oke dev -
|
|
39
|
+
* so `oke dev -d` / `oke stack` / `oke docker` have something to run.
|
|
40
40
|
*
|
|
41
41
|
* @param config - Loaded config
|
|
42
42
|
*/
|
|
43
|
-
export function defaultImagesFromConfig(
|
|
44
|
-
config: OkeConfig,
|
|
45
|
-
): Readonly<Record<string, string>> {
|
|
43
|
+
export function defaultImagesFromConfig(config: OkeConfig): Readonly<Record<string, string>> {
|
|
46
44
|
const out: Record<string, string> = {};
|
|
47
|
-
const sql =
|
|
48
|
-
const index =
|
|
49
|
-
const kv =
|
|
50
|
-
const signal =
|
|
51
|
-
const clock =
|
|
45
|
+
const sql = dockerOrProdId(config.drivers?.store?.sql);
|
|
46
|
+
const index = dockerOrProdId(config.drivers?.store?.index);
|
|
47
|
+
const kv = dockerOrProdId(config.drivers?.store?.kv);
|
|
48
|
+
const signal = dockerOrProdId(config.drivers?.signal);
|
|
49
|
+
const clock = dockerOrProdId(config.drivers?.clock);
|
|
52
50
|
|
|
53
51
|
const needsSql =
|
|
54
52
|
sql === "postgres" ||
|
|
@@ -56,19 +54,14 @@ export function defaultImagesFromConfig(
|
|
|
56
54
|
index === "pgvector" ||
|
|
57
55
|
signal === "postgres" ||
|
|
58
56
|
clock === "postgres" ||
|
|
59
|
-
(config.drivers?.prod ?? []).some(
|
|
60
|
-
(p) => p === "postgres" || p === "pgvector",
|
|
61
|
-
);
|
|
57
|
+
(config.drivers?.prod ?? []).some((p) => p === "postgres" || p === "pgvector");
|
|
62
58
|
|
|
63
59
|
if (needsSql) {
|
|
64
60
|
out["store.sql"] =
|
|
65
|
-
sql === "pgvector" || index === "pgvector"
|
|
66
|
-
? DEFAULT_PGVECTOR_IMAGE
|
|
67
|
-
: DEFAULT_SQL_IMAGE;
|
|
61
|
+
sql === "pgvector" || index === "pgvector" ? DEFAULT_PGVECTOR_IMAGE : DEFAULT_SQL_IMAGE;
|
|
68
62
|
}
|
|
69
63
|
|
|
70
|
-
const needsKv =
|
|
71
|
-
kv === "redis" || (config.drivers?.prod ?? []).includes("redis");
|
|
64
|
+
const needsKv = kv === "redis" || (config.drivers?.prod ?? []).includes("redis");
|
|
72
65
|
if (needsKv) {
|
|
73
66
|
out["store.kv"] = DEFAULT_KV_IMAGE;
|
|
74
67
|
}
|
|
@@ -109,9 +102,7 @@ export async function loadOkeConfig(
|
|
|
109
102
|
}
|
|
110
103
|
return { config: mod.default, path };
|
|
111
104
|
}
|
|
112
|
-
throw new Error(
|
|
113
|
-
`oke: no oke.config.ts found in ${cwd} — create one with defineConfig()`,
|
|
114
|
-
);
|
|
105
|
+
throw new Error(`oke: no oke.config.ts found in ${cwd} — create one with defineConfig()`);
|
|
115
106
|
}
|
|
116
107
|
|
|
117
108
|
/**
|
|
@@ -131,7 +122,7 @@ export async function loadManifest(path: string): Promise<Manifest> {
|
|
|
131
122
|
* Resolve images map from config or Manifest.
|
|
132
123
|
*
|
|
133
124
|
* When neither declares `images`, derive defaults from prod driver protocols
|
|
134
|
-
* so `oke dev -
|
|
125
|
+
* so `oke dev -d` works on scaffolded templates without an explicit pin map.
|
|
135
126
|
*
|
|
136
127
|
* @param config - Optional config
|
|
137
128
|
* @param manifest - Optional manifest
|
|
@@ -150,49 +141,44 @@ export function resolveImages(
|
|
|
150
141
|
export type StackDriverMismatch = {
|
|
151
142
|
/** Short label (`sql`, `kv`). */
|
|
152
143
|
readonly label: string;
|
|
153
|
-
/** Active `drivers.*.
|
|
144
|
+
/** Active `drivers.*.docker` (→ prod) id. */
|
|
154
145
|
readonly using: string;
|
|
155
146
|
/** Driver that would use the container. */
|
|
156
147
|
readonly container: string;
|
|
157
148
|
};
|
|
158
149
|
|
|
159
150
|
/**
|
|
160
|
-
* Detect when `oke dev -
|
|
161
|
-
* `
|
|
151
|
+
* Detect when `oke dev -d` containers will not back the app because the
|
|
152
|
+
* `docker` driver profile still points at local/memory backends.
|
|
162
153
|
*
|
|
163
154
|
* @param config - Loaded config
|
|
164
155
|
* @param stackRoles - Roles being composed
|
|
165
156
|
*/
|
|
166
|
-
export function
|
|
157
|
+
export function dockerDevDriverMismatches(
|
|
167
158
|
config: OkeConfig,
|
|
168
159
|
stackRoles: readonly string[],
|
|
169
160
|
): readonly StackDriverMismatch[] {
|
|
170
161
|
const roles = new Set(stackRoles);
|
|
171
162
|
const out: StackDriverMismatch[] = [];
|
|
172
|
-
const
|
|
173
|
-
driverId(config.drivers?.store?.sql?.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
driverId(config.drivers?.store?.kv?.stack) ??
|
|
177
|
-
driverId(config.drivers?.store?.kv?.prod);
|
|
163
|
+
const sqlDocker =
|
|
164
|
+
driverId(config.drivers?.store?.sql?.docker) ?? driverId(config.drivers?.store?.sql?.prod);
|
|
165
|
+
const kvDocker =
|
|
166
|
+
driverId(config.drivers?.store?.kv?.docker) ?? driverId(config.drivers?.store?.kv?.prod);
|
|
178
167
|
|
|
179
168
|
if (
|
|
180
169
|
roles.has("store.sql") &&
|
|
181
|
-
(
|
|
170
|
+
(sqlDocker === "sqlite" || sqlDocker === "memory" || sqlDocker === undefined)
|
|
182
171
|
) {
|
|
183
172
|
out.push({
|
|
184
173
|
label: "sql",
|
|
185
|
-
using:
|
|
174
|
+
using: sqlDocker ?? "unset",
|
|
186
175
|
container: "postgres",
|
|
187
176
|
});
|
|
188
177
|
}
|
|
189
|
-
if (
|
|
190
|
-
roles.has("store.kv") &&
|
|
191
|
-
(kvStack === "memory" || kvStack === undefined)
|
|
192
|
-
) {
|
|
178
|
+
if (roles.has("store.kv") && (kvDocker === "memory" || kvDocker === undefined)) {
|
|
193
179
|
out.push({
|
|
194
180
|
label: "kv",
|
|
195
|
-
using:
|
|
181
|
+
using: kvDocker ?? "memory",
|
|
196
182
|
container: "redis",
|
|
197
183
|
});
|
|
198
184
|
}
|
|
@@ -200,7 +186,17 @@ export function stackDevDriverMismatches(
|
|
|
200
186
|
}
|
|
201
187
|
|
|
202
188
|
/**
|
|
203
|
-
* @deprecated Use {@link
|
|
189
|
+
* @deprecated Use {@link dockerDevDriverMismatches} — kept for older call sites.
|
|
190
|
+
*/
|
|
191
|
+
export function stackDevDriverMismatches(
|
|
192
|
+
config: OkeConfig,
|
|
193
|
+
stackRoles: readonly string[],
|
|
194
|
+
): readonly StackDriverMismatch[] {
|
|
195
|
+
return dockerDevDriverMismatches(config, stackRoles);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* @deprecated Use {@link dockerDevDriverMismatches} — kept for older call sites.
|
|
204
200
|
* @param config - Loaded config
|
|
205
201
|
* @param stackRoles - Roles being composed
|
|
206
202
|
*/
|
|
@@ -208,7 +204,5 @@ export function stackDevDriverWarnings(
|
|
|
208
204
|
config: OkeConfig,
|
|
209
205
|
stackRoles: readonly string[],
|
|
210
206
|
): readonly string[] {
|
|
211
|
-
return
|
|
212
|
-
(m) => `${m.label}: ${m.using}`,
|
|
213
|
-
);
|
|
207
|
+
return dockerDevDriverMismatches(config, stackRoles).map((m) => `${m.label}: ${m.using}`);
|
|
214
208
|
}
|
|
@@ -4,10 +4,7 @@
|
|
|
4
4
|
* Used by `oke dev` so port 6535 is not a separate mock context.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
createFileDiff,
|
|
9
|
-
emitStructuralDiff,
|
|
10
|
-
} from "../console/server/structural.ts";
|
|
7
|
+
import { createFileDiff, emitStructuralDiff } from "../console/server/structural.ts";
|
|
11
8
|
import type { Manifest } from "../manifest/types.ts";
|
|
12
9
|
import type { WideEvent } from "../runs/types.ts";
|
|
13
10
|
import type { McpContext } from "../mcp/tools.ts";
|
package/src/cli/mode.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `oke mode [local|docker]` — read or set the saved `oke dev` preference.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { parseDevMode, readDevMode, writeDevMode, type DevMode } from "./dev-mode.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* CLI entry for `oke mode`.
|
|
9
|
+
*
|
|
10
|
+
* @param args - Args after `mode`
|
|
11
|
+
*/
|
|
12
|
+
export async function modeCli(args: readonly string[]): Promise<number> {
|
|
13
|
+
const cwd = process.cwd();
|
|
14
|
+
for (const a of args) {
|
|
15
|
+
if (a === "--help" || a === "-h") {
|
|
16
|
+
console.log(`oke mode [local|docker]
|
|
17
|
+
|
|
18
|
+
Get or set the default infrastructure mode for \`oke dev\`
|
|
19
|
+
(saved in .oke/mode). Session flags \`oke dev --local\` /
|
|
20
|
+
\`oke dev --docker\` never change this preference.
|
|
21
|
+
`);
|
|
22
|
+
return 0;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const positional = args.filter((a) => !a.startsWith("-"));
|
|
27
|
+
if (positional.length === 0) {
|
|
28
|
+
const saved = await readDevMode(cwd);
|
|
29
|
+
if (saved === null) {
|
|
30
|
+
console.log("oke mode: unset (default local until chosen)");
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
console.log(saved);
|
|
34
|
+
return 0;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const next = parseDevMode(positional[0]);
|
|
38
|
+
if (next === null) {
|
|
39
|
+
console.error(`oke mode: expected local|docker, got ${JSON.stringify(positional[0])}`);
|
|
40
|
+
return 1;
|
|
41
|
+
}
|
|
42
|
+
await writeDevMode(cwd, next satisfies DevMode);
|
|
43
|
+
console.log(`oke mode: saved ${next}`);
|
|
44
|
+
return 0;
|
|
45
|
+
}
|