okengine 0.2.6 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +33 -30
- package/README.md +74 -340
- package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
- package/package.json +47 -44
- package/site/content/docs/ai/llms-txt.mdx +54 -0
- package/site/content/docs/ai/mcp.mdx +123 -0
- package/site/content/docs/ai/meta.json +5 -0
- package/site/content/docs/ai/skills.mdx +53 -0
- package/site/content/docs/console/access.mdx +29 -0
- package/site/content/docs/console/ai.mdx +35 -0
- package/site/content/docs/console/architecture.mdx +35 -0
- package/site/content/docs/console/channels.mdx +37 -0
- package/site/content/docs/console/clock.mdx +31 -0
- package/site/content/docs/console/flows.mdx +31 -0
- package/site/content/docs/console/gates.mdx +35 -0
- package/site/content/docs/console/manifest-diff.mdx +34 -0
- package/site/content/docs/console/meta.json +23 -0
- package/site/content/docs/console/overview.mdx +40 -0
- package/site/content/docs/console/plugins.mdx +41 -0
- package/site/content/docs/console/privacy.mdx +32 -0
- package/site/content/docs/console/runs.mdx +40 -0
- package/site/content/docs/console/signals.mdx +31 -0
- package/site/content/docs/console/store.mdx +32 -0
- package/site/content/docs/console/tenancy.mdx +32 -0
- package/site/content/docs/console/traces.mdx +34 -0
- package/site/content/docs/console/vault.mdx +37 -0
- package/site/content/docs/elements/ai.mdx +180 -0
- package/site/content/docs/elements/channel.mdx +167 -0
- package/site/content/docs/elements/clock.mdx +182 -0
- package/site/content/docs/elements/flow.mdx +288 -0
- package/site/content/docs/elements/gate.mdx +171 -0
- package/site/content/docs/elements/meta.json +5 -0
- package/site/content/docs/elements/signal.mdx +171 -0
- package/site/content/docs/elements/store.mdx +320 -0
- package/site/content/docs/elements/vault.mdx +263 -0
- package/site/content/docs/get-started/basic-usage.mdx +124 -0
- package/site/content/docs/get-started/comparison.mdx +65 -0
- package/site/content/docs/get-started/installation.mdx +113 -0
- package/site/content/docs/get-started/introduction.mdx +123 -0
- package/site/content/docs/get-started/meta.json +5 -0
- package/site/content/docs/index.mdx +63 -0
- package/site/content/docs/meta.json +5 -0
- package/site/content/docs/plugins/compression.mdx +60 -0
- package/site/content/docs/plugins/cors.mdx +92 -0
- package/site/content/docs/plugins/csrf.mdx +96 -0
- package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
- package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
- package/site/content/docs/plugins/meta.json +15 -0
- package/site/content/docs/plugins/security-headers.mdx +136 -0
- package/site/content/docs/reference/cli.md +101 -0
- package/site/content/docs/reference/configuration.mdx +159 -0
- package/site/content/docs/reference/environment-variables.mdx +87 -0
- package/site/content/docs/reference/errors.mdx +80 -0
- package/site/content/docs/reference/fx.mdx +117 -0
- package/site/content/docs/reference/meta.json +5 -0
- package/site/content/docs/reference/plugins.mdx +249 -0
- package/site/content/docs/reference/security.md +63 -0
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +56 -31
- package/src/auth/invoke-as.ts +1 -3
- package/src/auth/operator.ts +8 -26
- package/src/auth/planes.ts +2 -7
- package/src/auth/plugin.ts +4 -7
- package/src/auth/roles.ts +1 -5
- package/src/auth/sessions.ts +10 -39
- package/src/cli/args.ts +1 -5
- package/src/cli/ask-dev-mode.ts +40 -0
- package/src/cli/build.ts +1 -2
- package/src/cli/client-add.test.ts +8 -15
- package/src/cli/client-add.ts +5 -14
- package/src/cli/completion.test.ts +1 -5
- package/src/cli/completion.ts +4 -17
- package/src/cli/db-auto-push.test.ts +64 -0
- package/src/cli/db-auto-push.ts +72 -0
- package/src/cli/db.test.ts +189 -0
- package/src/cli/db.ts +456 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +193 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev-schema-sync.test.ts +66 -0
- package/src/cli/dev-schema-sync.ts +139 -0
- package/src/cli/dev.test.ts +264 -15
- package/src/cli/dev.ts +355 -139
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +27 -8
- package/src/cli/docker.ts +11 -3
- package/src/cli/doctor-diff.test.ts +1 -5
- package/src/cli/doctor-diff.ts +17 -46
- package/src/cli/doctor-pii.ts +2 -7
- package/src/cli/doctor.test.ts +26 -4
- package/src/cli/doctor.ts +35 -11
- package/src/cli/drizzle-env.test.ts +67 -0
- package/src/cli/drizzle-env.ts +78 -0
- package/src/cli/ensure-drizzle-config.ts +50 -0
- package/src/cli/eval.ts +4 -14
- package/src/cli/gates-list.ts +1 -4
- package/src/cli/hero-meta.test.ts +17 -19
- package/src/cli/hero-meta.ts +20 -30
- package/src/cli/images.ts +3 -8
- package/src/cli/index.ts +11 -2
- package/src/cli/load-config.images.test.ts +14 -14
- package/src/cli/load-config.ts +47 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +65 -0
- package/src/cli/openbao-bootstrap.test.ts +147 -0
- package/src/cli/openbao-bootstrap.ts +280 -0
- package/src/cli/openbao-restart.integration.test.ts +136 -0
- package/src/cli/ports.test.ts +7 -14
- package/src/cli/ports.ts +7 -5
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/resolve-dev-sql-env.test.ts +48 -0
- package/src/cli/resolve-dev-sql-env.ts +42 -0
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +8 -10
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/cli/vault-cmd.ts +63 -0
- package/src/client/budget-entry.ts +1 -6
- package/src/client/create.test.ts +6 -12
- package/src/client/create.ts +2 -8
- package/src/client/errors.ts +1 -4
- package/src/client/index.ts +1 -6
- package/src/client/notes-contract.test.ts +4 -13
- package/src/client/transport.ts +9 -30
- package/src/client/types.ts +15 -30
- package/src/compiler/aot.test.ts +2 -9
- package/src/compiler/aot.ts +1 -4
- package/src/compiler/differential.test.ts +3 -11
- package/src/compiler/dynamic.ts +1 -4
- package/src/compiler/effects-infer.ts +8 -34
- package/src/compiler/emit.ts +1 -3
- package/src/compiler/extract.test.ts +136 -30
- package/src/compiler/extract.ts +485 -157
- package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
- package/src/compiler/fixtures/skyport.expected.json +24 -83
- package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
- package/src/compiler/http-parse.ts +2 -9
- package/src/compiler/index.ts +1 -5
- package/src/compiler/response.ts +16 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +55 -34
- package/src/config/index.ts +177 -46
- package/src/config/resolve-driver.test.ts +28 -17
- package/src/console/budget.test.ts +1 -4
- package/src/console/index.ts +1 -4
- package/src/console/server/access.test.ts +15 -43
- package/src/console/server/access.ts +19 -49
- package/src/console/server/ai.test.ts +3 -11
- package/src/console/server/ai.ts +23 -46
- package/src/console/server/app.ts +16 -45
- package/src/console/server/auth-rate.test.ts +4 -12
- package/src/console/server/bind.ts +1 -5
- package/src/console/server/channels.test.ts +2 -6
- package/src/console/server/channels.ts +10 -35
- package/src/console/server/claim.ts +2 -8
- package/src/console/server/clock.test.ts +2 -6
- package/src/console/server/clock.ts +8 -26
- package/src/console/server/console.test.ts +1 -3
- package/src/console/server/diff.test.ts +5 -17
- package/src/console/server/diff.ts +10 -31
- package/src/console/server/dry-run.audit.test.ts +2 -8
- package/src/console/server/flows.ts +64 -233
- package/src/console/server/gates.test.ts +14 -50
- package/src/console/server/gates.ts +13 -48
- package/src/console/server/index.ts +2 -9
- package/src/console/server/live.ts +3 -12
- package/src/console/server/operator-db.test.ts +4 -15
- package/src/console/server/operator-db.ts +13 -32
- package/src/console/server/plugin.ts +50 -53
- package/src/console/server/plugins.test.ts +2 -6
- package/src/console/server/plugins.ts +17 -56
- package/src/console/server/runs-pii.ts +2 -7
- package/src/console/server/security.gate.test.ts +18 -40
- package/src/console/server/serve.ts +10 -25
- package/src/console/server/signals.test.ts +1 -3
- package/src/console/server/signals.ts +17 -40
- package/src/console/server/state.ts +21 -59
- package/src/console/server/store.test.ts +20 -22
- package/src/console/server/store.ts +31 -76
- package/src/console/server/vault.test.ts +12 -29
- package/src/console/server/vault.ts +44 -66
- package/src/console/ui/access/AccessA11yView.tsx +6 -21
- package/src/console/ui/access/a11y.test.tsx +3 -12
- package/src/console/ui/access/acknowledgement.test.ts +1 -4
- package/src/console/ui/access/acknowledgement.ts +1 -3
- package/src/console/ui/access/blast-radius.ts +1 -3
- package/src/console/ui/access/confirmation.test.ts +1 -5
- package/src/console/ui/access/confirmation.ts +1 -4
- package/src/console/ui/access/fixture.ts +1 -5
- package/src/console/ui/access/grantable.test.ts +1 -3
- package/src/console/ui/access/grantable.ts +2 -7
- package/src/console/ui/access/index.ts +2 -9
- package/src/console/ui/access/provenance.test.ts +1 -3
- package/src/console/ui/access/provenance.ts +2 -6
- package/src/console/ui/access/search.test.ts +1 -5
- package/src/console/ui/access/search.ts +2 -6
- package/src/console/ui/ai/AiA11yView.tsx +6 -17
- package/src/console/ui/ai/a11y.test.tsx +2 -5
- package/src/console/ui/ai/fixture.ts +2 -7
- package/src/console/ui/ai/format.ts +1 -3
- package/src/console/ui/ai/group.test.ts +1 -3
- package/src/console/ui/ai/group.ts +4 -12
- package/src/console/ui/ai/index.ts +2 -9
- package/src/console/ui/ai/promotion.test.ts +2 -7
- package/src/console/ui/ai/promotion.ts +4 -13
- package/src/console/ui/ai/search.test.ts +2 -11
- package/src/console/ui/ai/search.ts +3 -13
- package/src/console/ui/ai/types.ts +1 -8
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
- package/src/console/ui/architecture/a11y.test.tsx +1 -2
- package/src/console/ui/architecture/declared.ts +1 -5
- package/src/console/ui/architecture/index.ts +7 -35
- package/src/console/ui/architecture/layout.ts +1 -3
- package/src/console/ui/architecture/pathologies.ts +10 -19
- package/src/console/ui/architecture/search.ts +6 -15
- package/src/console/ui/architecture/traffic.ts +4 -14
- package/src/console/ui/architecture/types.ts +2 -10
- package/src/console/ui/architecture/view.test.ts +7 -19
- package/src/console/ui/architecture/view.ts +9 -36
- package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
- package/src/console/ui/channels/a11y.test.tsx +1 -2
- package/src/console/ui/channels/confirmation.test.ts +1 -4
- package/src/console/ui/channels/confirmation.ts +1 -4
- package/src/console/ui/channels/findings.ts +1 -5
- package/src/console/ui/channels/index.ts +2 -8
- package/src/console/ui/channels/locale.test.ts +1 -3
- package/src/console/ui/channels/locale.ts +2 -8
- package/src/console/ui/channels/search.ts +4 -13
- package/src/console/ui/channels/taxonomy.ts +1 -3
- package/src/console/ui/clock/ClockA11yView.tsx +9 -26
- package/src/console/ui/clock/a11y.test.tsx +2 -5
- package/src/console/ui/clock/confirmation.test.ts +1 -3
- package/src/console/ui/clock/confirmation.ts +1 -4
- package/src/console/ui/clock/findings.ts +1 -4
- package/src/console/ui/clock/health.ts +2 -7
- package/src/console/ui/clock/index.ts +2 -10
- package/src/console/ui/clock/search.test.ts +1 -3
- package/src/console/ui/clock/search.ts +2 -6
- package/src/console/ui/clock/timeline.test.ts +1 -3
- package/src/console/ui/clock/waiting-on.test.ts +1 -5
- package/src/console/ui/clock/waiting-on.ts +2 -7
- package/src/console/ui/diff/DiffA11yView.tsx +8 -17
- package/src/console/ui/diff/a11y.test.tsx +2 -5
- package/src/console/ui/diff/group.test.ts +3 -13
- package/src/console/ui/diff/group.ts +2 -8
- package/src/console/ui/diff/index.ts +2 -8
- package/src/console/ui/diff/search.test.ts +1 -5
- package/src/console/ui/diff/search.ts +4 -16
- package/src/console/ui/diff/summary.ts +1 -2
- package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
- package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
- package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
- package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
- package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
- package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
- package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
- package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
- package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
- package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
- package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
- package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
- package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
- package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
- package/src/console/ui/flows/a11y.test.tsx +2 -8
- package/src/console/ui/flows/buffer.test.ts +3 -11
- package/src/console/ui/flows/buffer.ts +4 -11
- package/src/console/ui/flows/confirmation.ts +1 -3
- package/src/console/ui/flows/contract.test.ts +3 -7
- package/src/console/ui/flows/contract.ts +12 -36
- package/src/console/ui/flows/graph.test.ts +3 -11
- package/src/console/ui/flows/graph.ts +5 -15
- package/src/console/ui/flows/index.ts +1 -6
- package/src/console/ui/flows/save-as-test.ts +1 -3
- package/src/console/ui/flows/search.ts +8 -25
- package/src/console/ui/flows/tiers.ts +2 -9
- package/src/console/ui/gates/GatesA11yView.tsx +4 -13
- package/src/console/ui/gates/a11y.test.tsx +2 -5
- package/src/console/ui/gates/audit.ts +1 -3
- package/src/console/ui/gates/denial.test.ts +1 -3
- package/src/console/ui/gates/denial.ts +4 -12
- package/src/console/ui/gates/findings.ts +1 -3
- package/src/console/ui/gates/group.test.ts +3 -3
- package/src/console/ui/gates/group.ts +3 -11
- package/src/console/ui/gates/index.ts +2 -10
- package/src/console/ui/gates/search.ts +3 -10
- package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
- package/src/console/ui/overview/a11y.test.tsx +1 -2
- package/src/console/ui/overview/busiest.ts +1 -3
- package/src/console/ui/overview/compose.ts +1 -13
- package/src/console/ui/overview/cost.ts +34 -38
- package/src/console/ui/overview/fixture.ts +21 -26
- package/src/console/ui/overview/golden.ts +4 -14
- package/src/console/ui/overview/index.ts +2 -9
- package/src/console/ui/overview/rank.test.ts +3 -10
- package/src/console/ui/overview/rank.ts +2 -7
- package/src/console/ui/overview/slo.test.ts +5 -9
- package/src/console/ui/overview/slo.ts +6 -23
- package/src/console/ui/overview/verdict.ts +3 -10
- package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
- package/src/console/ui/plugins/a11y.test.tsx +1 -2
- package/src/console/ui/plugins/fixture.ts +2 -4
- package/src/console/ui/plugins/group.test.ts +1 -3
- package/src/console/ui/plugins/group.ts +1 -6
- package/src/console/ui/plugins/index.ts +3 -13
- package/src/console/ui/plugins/search.ts +7 -19
- package/src/console/ui/runs/RunsA11yView.tsx +5 -20
- package/src/console/ui/runs/a11y.test.tsx +2 -5
- package/src/console/ui/runs/explain.ts +2 -6
- package/src/console/ui/runs/group.ts +3 -12
- package/src/console/ui/runs/histogram.test.ts +2 -11
- package/src/console/ui/runs/histogram.ts +1 -4
- package/src/console/ui/runs/index.ts +4 -18
- package/src/console/ui/runs/project.ts +2 -6
- package/src/console/ui/runs/query.test.ts +1 -3
- package/src/console/ui/runs/query.ts +12 -35
- package/src/console/ui/runs/search.ts +5 -19
- package/src/console/ui/runs/trace-link.test.ts +2 -6
- package/src/console/ui/runs/trace-link.ts +4 -16
- package/src/console/ui/runs/types.ts +1 -3
- package/src/console/ui/shell/App.tsx +2 -10
- package/src/console/ui/shell/client.ts +22 -115
- package/src/console/ui/shell/components/ui.tsx +1 -4
- package/src/console/ui/shell/layout/Shell.tsx +2 -4
- package/src/console/ui/shell/main.tsx +31 -96
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
- package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
- package/src/console/ui/shell/setup/Wizard.tsx +3 -5
- package/src/console/ui/shell/styles.css +1 -2
- package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
- package/src/console/ui/signals/a11y.test.tsx +2 -5
- package/src/console/ui/signals/confirmation.test.ts +1 -5
- package/src/console/ui/signals/confirmation.ts +2 -6
- package/src/console/ui/signals/dry-run.ts +1 -3
- package/src/console/ui/signals/durable.ts +1 -3
- package/src/console/ui/signals/findings.ts +1 -3
- package/src/console/ui/signals/group.test.ts +2 -8
- package/src/console/ui/signals/group.ts +2 -10
- package/src/console/ui/signals/index.ts +1 -4
- package/src/console/ui/signals/monitor.ts +2 -7
- package/src/console/ui/signals/schema-form.test.ts +3 -14
- package/src/console/ui/signals/schema-form.ts +1 -4
- package/src/console/ui/signals/search.ts +4 -13
- package/src/console/ui/store/StoreA11yView.tsx +3 -9
- package/src/console/ui/store/a11y.test.tsx +2 -5
- package/src/console/ui/store/confirmation.test.ts +1 -3
- package/src/console/ui/store/confirmation.ts +1 -4
- package/src/console/ui/store/dry-run.ts +2 -5
- package/src/console/ui/store/fixture.ts +1 -2
- package/src/console/ui/store/group.test.ts +1 -6
- package/src/console/ui/store/group.ts +1 -4
- package/src/console/ui/store/index.ts +1 -5
- package/src/console/ui/store/search.ts +2 -6
- package/src/console/ui/store/will-not-fire.ts +1 -2
- package/src/console/ui/traces/TracesA11yView.tsx +10 -29
- package/src/console/ui/traces/a11y.test.tsx +1 -2
- package/src/console/ui/traces/chain.test.ts +5 -19
- package/src/console/ui/traces/chain.ts +1 -3
- package/src/console/ui/traces/critical-path.test.ts +1 -3
- package/src/console/ui/traces/critical-path.ts +2 -6
- package/src/console/ui/traces/filter.test.ts +2 -6
- package/src/console/ui/traces/filter.ts +5 -13
- package/src/console/ui/traces/fold.test.ts +4 -12
- package/src/console/ui/traces/fold.ts +1 -3
- package/src/console/ui/traces/mini.ts +1 -3
- package/src/console/ui/traces/replay.test.ts +1 -3
- package/src/console/ui/traces/replay.ts +1 -3
- package/src/console/ui/traces/sampling.ts +1 -4
- package/src/console/ui/traces/search.ts +4 -17
- package/src/console/ui/traces/tier.ts +1 -3
- package/src/console/ui/vault/VaultA11yView.tsx +5 -17
- package/src/console/ui/vault/a11y.test.tsx +1 -2
- package/src/console/ui/vault/blast-radius.ts +1 -3
- package/src/console/ui/vault/confirmation.test.ts +1 -5
- package/src/console/ui/vault/confirmation.ts +1 -4
- package/src/console/ui/vault/dormant.test.ts +1 -4
- package/src/console/ui/vault/export-safe.test.ts +1 -5
- package/src/console/ui/vault/export-safe.ts +1 -4
- package/src/console/ui/vault/fixture.ts +3 -3
- package/src/console/ui/vault/group.ts +1 -2
- package/src/console/ui/vault/index.ts +2 -10
- package/src/console/ui/vault/search.ts +2 -6
- package/src/console/ui/vault/types.ts +1 -1
- package/src/console/xss.gate.test.ts +1 -3
- package/src/docker/compose.ts +215 -27
- package/src/docker/derive.ts +6 -14
- package/src/docker/docker.test.ts +118 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +9 -6
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +6 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/openbao.ts +47 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +11 -2
- package/src/docker/recipes/rustfs.ts +32 -0
- package/src/docker/stack-id.test.ts +73 -5
- package/src/docker/stack-id.ts +124 -33
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/stack.ts +36 -4
- package/src/docker/types.ts +16 -4
- package/src/docs-origin.ts +4 -4
- package/src/drivers/ai-anthropic.ts +5 -14
- package/src/drivers/ai-mock.ts +2 -5
- package/src/drivers/ai-openai-compatible.ts +4 -10
- package/src/drivers/ai-providers.test.ts +6 -13
- package/src/drivers/bun-native-completeness.test.ts +6 -15
- package/src/drivers/channel-console.ts +6 -7
- package/src/drivers/channel-fcm.ts +20 -30
- package/src/drivers/channel-resend.ts +1 -3
- package/src/drivers/channel-smtp.ts +2 -6
- package/src/drivers/channel-types.ts +2 -12
- package/src/drivers/channel-unifonic.ts +2 -6
- package/src/drivers/channel-wa-cloud.ts +2 -6
- package/src/drivers/channel-webpush.ts +21 -60
- package/src/drivers/conformance.test.ts +2 -10
- package/src/drivers/conformance.ts +8 -21
- package/src/drivers/drizzle-dialect.test.ts +20 -0
- package/src/drivers/drizzle-dialect.ts +37 -0
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -57
- package/src/drivers/memory.ts +287 -75
- package/src/drivers/pgvector.ts +7 -11
- package/src/drivers/postgres.ts +7 -13
- package/src/drivers/redis.ts +13 -37
- package/src/drivers/s3.ts +15 -18
- package/src/drivers/signal-engine.ts +12 -49
- package/src/drivers/signal-memory.ts +2 -8
- package/src/drivers/signal-nats.ts +4 -9
- package/src/drivers/signal-postgres.ts +62 -129
- package/src/drivers/signal-redis.ts +7 -21
- package/src/drivers/signal-types.ts +1 -4
- package/src/drivers/sqlite.ts +3 -12
- package/src/drivers/types.ts +4 -23
- package/src/drivers/vault-driver-removal.test.ts +55 -0
- package/src/drivers/vault-env.ts +2 -6
- package/src/drivers/vault-infisical.ts +1 -5
- package/src/drivers/vault-managed.ts +1 -5
- package/src/drivers/vault-memory.ts +1 -5
- package/src/drivers/vault-openbao.test.ts +97 -0
- package/src/drivers/vault-openbao.ts +103 -40
- package/src/drivers/vault-types.ts +3 -16
- package/src/elements/ai/declare.ts +4 -14
- package/src/elements/ai/eval.ts +2 -6
- package/src/elements/ai/pii.ts +1 -3
- package/src/elements/ai/runtime.ts +12 -50
- package/src/elements/ai/schema.ts +4 -15
- package/src/elements/ai.test.ts +13 -24
- package/src/elements/ai.ts +1 -5
- package/src/elements/channel/consent.ts +3 -12
- package/src/elements/channel/costs.ts +4 -15
- package/src/elements/channel/declare.ts +1 -4
- package/src/elements/channel/email-auth.ts +1 -4
- package/src/elements/channel/locale.ts +2 -10
- package/src/elements/channel/mask.ts +1 -3
- package/src/elements/channel/mime.ts +2 -12
- package/src/elements/channel/outcomes.test.ts +1 -5
- package/src/elements/channel/outcomes.ts +5 -15
- package/src/elements/channel/receipts.ts +2 -7
- package/src/elements/channel/runtime.ts +28 -74
- package/src/elements/channel/suppression.ts +8 -14
- package/src/elements/channel.test.ts +8 -31
- package/src/elements/channel.ts +3 -14
- package/src/elements/clock/actions.ts +6 -18
- package/src/elements/clock/declare.ts +1 -3
- package/src/elements/clock/dst.ts +1 -5
- package/src/elements/clock/durable.ts +4 -16
- package/src/elements/clock/health.ts +2 -7
- package/src/elements/clock/leader.ts +2 -9
- package/src/elements/clock/reconcile.ts +4 -15
- package/src/elements/clock/runtime.ts +2 -5
- package/src/elements/clock/schedule.ts +4 -20
- package/src/elements/clock.test.ts +2 -7
- package/src/elements/clock.ts +5 -23
- package/src/elements/gate/permissions.ts +1 -4
- package/src/elements/gate/runtime.ts +7 -28
- package/src/elements/gate.ts +1 -5
- package/src/elements/index.ts +9 -7
- package/src/elements/signal/declare.ts +2 -7
- package/src/elements/signal/reconcile.test.ts +1 -4
- package/src/elements/signal/runtime.ts +1 -3
- package/src/elements/signal.test.ts +3 -15
- package/src/elements/signal.ts +2 -8
- package/src/elements/store/cache.test.ts +46 -0
- package/src/elements/store/cache.ts +3 -11
- package/src/elements/store/classify.ts +5 -22
- package/src/elements/store/declare.ts +11 -17
- package/src/elements/store/domain-ddl.test.ts +86 -0
- package/src/elements/store/emit-drizzle.ts +363 -0
- package/src/elements/store/files-policy.test.ts +1 -5
- package/src/elements/store/files-policy.ts +4 -12
- package/src/elements/store/load-plugin-tables.ts +103 -0
- package/src/elements/store/missing-relation.test.ts +83 -0
- package/src/elements/store/missing-relation.ts +38 -0
- package/src/elements/store/replica.ts +1 -4
- package/src/elements/store/resource-list-docs.fixture.ts +56 -0
- package/src/elements/store/resource-list-docs.test.ts +79 -0
- package/src/elements/store/resource.test.ts +253 -0
- package/src/elements/store/resource.ts +786 -0
- package/src/elements/store/runtime.ts +25 -28
- package/src/elements/store/schema-decl.test.ts +227 -0
- package/src/elements/store/schema-decl.ts +516 -0
- package/src/elements/store/sql-condition.test.ts +132 -0
- package/src/elements/store/sql-condition.ts +293 -65
- package/src/elements/store/sql-session.test.ts +135 -0
- package/src/elements/store/sql-session.ts +241 -84
- package/src/elements/store/table.ts +69 -23
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +53 -31
- package/src/elements/vault/chain.ts +34 -0
- package/src/elements/vault/declare.ts +22 -32
- package/src/elements/vault/fingerprint.ts +2 -7
- package/src/elements/vault/redact.ts +2 -6
- package/src/elements/vault/runtime.ts +19 -33
- package/src/elements/vault.test.ts +12 -55
- package/src/elements/vault.ts +9 -13
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +92 -118
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.test.ts +60 -0
- package/src/kernel/boot-bind/channel.ts +61 -5
- package/src/kernel/boot-bind/clock.ts +2 -6
- package/src/kernel/boot-bind/gate.ts +2 -8
- package/src/kernel/boot-bind/runs.ts +1 -3
- package/src/kernel/boot-bind/signal.ts +3 -10
- package/src/kernel/boot-bind/store.test.ts +27 -18
- package/src/kernel/boot-bind/store.ts +93 -52
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -10
- package/src/kernel/boot.ts +30 -77
- package/src/kernel/budget.test.ts +1 -3
- package/src/kernel/capability.ts +3 -10
- package/src/kernel/dry-run.test.ts +1 -4
- package/src/kernel/dry-run.ts +3 -11
- package/src/kernel/edge.test.ts +68 -0
- package/src/kernel/effects.test.ts +1 -5
- package/src/kernel/effects.ts +4 -11
- package/src/kernel/errors.registry.test.ts +2 -8
- package/src/kernel/errors.ts +23 -32
- package/src/kernel/flow.test.ts +12 -25
- package/src/kernel/flow.ts +13 -25
- package/src/kernel/fx.test.ts +31 -40
- package/src/kernel/fx.ts +135 -90
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +43 -10
- package/src/kernel/hooks.ts +25 -12
- package/src/kernel/index.ts +11 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +45 -9
- package/src/kernel/pipeline.test.ts +10 -19
- package/src/kernel/pipeline.ts +5 -17
- package/src/kernel/plug.ts +4 -11
- package/src/kernel/plugin/conflicts.test.ts +13 -25
- package/src/kernel/plugin/decorate.test.ts +8 -13
- package/src/kernel/plugin/scoping.test.ts +4 -11
- package/src/kernel/plugin.ts +81 -27
- package/src/kernel/registry-isolation.test.ts +74 -0
- package/src/kernel/registry.ts +102 -30
- package/src/kernel/router.test.ts +15 -13
- package/src/kernel/router.ts +9 -29
- package/src/kernel/routing-budget.test.ts +1 -3
- package/src/kernel/run-telemetry.ts +1 -3
- package/src/kernel/triggers.ts +63 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/fixtures/skyport.excerpt.json +1 -1
- package/src/manifest/fixtures/skyport.manifest.json +1 -1
- package/src/manifest/index.ts +3 -10
- package/src/manifest/types.ts +30 -6
- package/src/manifest/undeclared.test.ts +4 -12
- package/src/manifest/undeclared.ts +1 -2
- package/src/manifest/validate.test.ts +2 -6
- package/src/manifest/validate.ts +5 -15
- package/src/mcp/authorization.ts +8 -27
- package/src/mcp/confirmation.ts +3 -10
- package/src/mcp/data.ts +2 -6
- package/src/mcp/docs-index.ts +4 -7
- package/src/mcp/docs-mcp.test.ts +3 -12
- package/src/mcp/docs-server.ts +7 -27
- package/src/mcp/docs-tools.ts +2 -6
- package/src/mcp/index.ts +1 -6
- package/src/mcp/injection.gate.test.ts +4 -18
- package/src/mcp/mcp.test.ts +18 -49
- package/src/mcp/protocol.ts +3 -10
- package/src/mcp/server.ts +11 -52
- package/src/mcp/session.ts +4 -14
- package/src/mcp/tools.ts +14 -50
- package/src/plugins/catalogue.test.ts +3 -7
- package/src/plugins/catalogue.ts +1 -3
- package/src/plugins/compression.test.ts +127 -0
- package/src/plugins/compression.ts +94 -0
- package/src/plugins/config-source.test.ts +204 -0
- package/src/plugins/config-source.ts +209 -0
- package/src/plugins/cors.test.ts +138 -0
- package/src/plugins/cors.ts +129 -0
- package/src/plugins/csrf.test.ts +102 -0
- package/src/plugins/csrf.ts +86 -0
- package/src/plugins/headers.ts +54 -0
- package/src/plugins/index.ts +26 -0
- package/src/plugins/ip-allowlist.test.ts +105 -0
- package/src/plugins/ip-allowlist.ts +76 -0
- package/src/plugins/maintenance-mode.test.ts +91 -0
- package/src/plugins/maintenance-mode.ts +85 -0
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/security-headers.test.ts +243 -0
- package/src/plugins/security-headers.ts +255 -0
- package/src/plugins/supply-chain.ts +5 -17
- package/src/release/exports.ts +3 -8
- package/src/release/measure.exports.test.ts +1 -3
- package/src/release/measure.ts +16 -45
- package/src/runs/bench.test.ts +1 -3
- package/src/runs/collect.ts +8 -25
- package/src/runs/drivers/clickhouse.ts +2 -9
- package/src/runs/drivers/files.ts +9 -31
- package/src/runs/drivers/memory.ts +5 -22
- package/src/runs/drivers/postgres.ts +8 -20
- package/src/runs/duckdb.ts +2 -8
- package/src/runs/index.ts +3 -14
- package/src/runs/outlier.ts +3 -10
- package/src/runs/parquet.ts +8 -26
- package/src/runs/privacy.ts +2 -8
- package/src/runs/runs.test.ts +3 -9
- package/src/runs/runtime.ts +7 -32
- package/src/runs/shred.ts +10 -29
- package/src/runs/types.ts +1 -4
- package/src/runtime/bun.ts +4 -15
- package/src/runtime/cold-start.bench.ts +1 -3
- package/src/runtime/dev-request-log.test.ts +1 -4
- package/src/runtime/dev-request-log.ts +1 -4
- package/src/runtime/index.ts +1 -6
- package/src/runtime/primitives.ts +5 -4
- package/src/runtime/security.ts +3 -13
- package/src/runtime/serve.test.ts +4 -7
- package/src/runtime/types.ts +1 -4
- package/src/runtime/web-standard.ts +3 -15
- package/src/term.test.ts +4 -6
- package/src/term.ts +49 -98
- package/src/test/create-test-app.test.ts +4 -14
- package/src/test/create-test-app.ts +27 -33
- package/src/test/provisions.integration.test.ts +3 -11
- package/src/upgrade/codemods.test.ts +25 -6
- package/src/upgrade/codemods.ts +116 -3
- package/src/validation/standard-schema.test.ts +2 -5
- package/src/validation/standard-schema.ts +13 -33
- package/docs/spec/console.md +0 -739
- package/docs/spec/example.md +0 -1196
- package/docs/spec/four-applications.md +0 -1195
- package/docs/spec/unified-theory.md +0 -489
- package/src/cli/doc-drift.test.ts +0 -146
- package/src/cli/doc-drift.ts +0 -430
- package/src/cli/doctor-diff-examples.ts +0 -92
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
- package/src/drivers/vault-sops.ts +0 -271
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Security Headers"
|
|
3
|
+
description: "Official plugin — the complete secure-headers set on every HTTP response, failures included. Full helmet.js parity with API-first defaults, a CSP builder with report-only mode, and live DB-driven config."
|
|
4
|
+
icon: "ShieldCheck"
|
|
5
|
+
source: "src/plugins/security-headers.ts"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`securityHeaders()` stamps security headers on **every** HTTP flow response — successes, failures, and short-circuits alike, because it runs at `onResponse`, the last pipeline stage. An explicit value your app already set is never overridden unless you ask for it.
|
|
9
|
+
|
|
10
|
+
## Quick start
|
|
11
|
+
|
|
12
|
+
```typescript title="src/app.ts"
|
|
13
|
+
import { oke } from "okengine";
|
|
14
|
+
import { securityHeaders } from "okengine/plugins";
|
|
15
|
+
|
|
16
|
+
export const app = oke({ name: "shop", env: "dev" }).plug(securityHeaders());
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Every HTTP response now carries:
|
|
20
|
+
|
|
21
|
+
| Header | Value |
|
|
22
|
+
| ----------------------------------- | ------------- |
|
|
23
|
+
| `X-Content-Type-Options` | `nosniff` |
|
|
24
|
+
| `X-Frame-Options` | `DENY` |
|
|
25
|
+
| `Referrer-Policy` | `no-referrer` |
|
|
26
|
+
| `Origin-Agent-Cluster` | `?1` |
|
|
27
|
+
| `X-DNS-Prefetch-Control` | `off` |
|
|
28
|
+
| `X-Download-Options` | `noopen` |
|
|
29
|
+
| `X-Permitted-Cross-Domain-Policies` | `none` |
|
|
30
|
+
| `X-XSS-Protection` | `0` |
|
|
31
|
+
| `X-Powered-By` | removed |
|
|
32
|
+
|
|
33
|
+
## Helmet parity
|
|
34
|
+
|
|
35
|
+
Every [helmet.js](https://helmet.js.org/) middleware maps to an option here — same defaults wherever helmet's default is safe for an API, plus three deliberate deviations marked `opt-in`:
|
|
36
|
+
|
|
37
|
+
| Helmet middleware | This plugin | Default match? |
|
|
38
|
+
| ------------------------------- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------------- |
|
|
39
|
+
| `contentSecurityPolicy` | `contentSecurityPolicy` — string **or** `{ directives, useDefaults, reportOnly }` builder | Same default directives; ours is opt-in like helmet's structure suggests |
|
|
40
|
+
| `crossOriginEmbedderPolicy` | `crossOriginEmbedderPolicy` | Yes — off unless set |
|
|
41
|
+
| `crossOriginOpenerPolicy` | `crossOriginOpenerPolicy` | **opt-in** — helmet's `same-origin` default breaks cross-origin API clients |
|
|
42
|
+
| `crossOriginResourcePolicy` | `crossOriginResourcePolicy` | **opt-in** — same API rationale |
|
|
43
|
+
| `originAgentCluster` | `originAgentCluster` | Yes — `?1` |
|
|
44
|
+
| `referrerPolicy` | `referrerPolicy` | Yes — `no-referrer` |
|
|
45
|
+
| `strictTransportSecurity` | `hsts` | **opt-in** — HSTS is sticky; never on plain-HTTP local dev |
|
|
46
|
+
| `xContentTypeOptions` | always on | Yes — `nosniff` |
|
|
47
|
+
| `xDnsPrefetchControl` | `dnsPrefetchControl` | Yes — `off`; `{ allow: true }` → `on` |
|
|
48
|
+
| `xDownloadOptions` | `downloadOptions` | Yes — `noopen` |
|
|
49
|
+
| `xFrameOptions` | `frameOptions` | Yes — stricter: `DENY` over helmet's `SAMEORIGIN` |
|
|
50
|
+
| `xPermittedCrossDomainPolicies` | `permittedCrossDomainPolicies` | Yes — `none` |
|
|
51
|
+
| `xPoweredBy` | `poweredBy` | Yes — removed; a string sets a decoy value |
|
|
52
|
+
| `xXssProtection` | `xssProtection` | Yes — `0` (disables the legacy buggy auditor) |
|
|
53
|
+
|
|
54
|
+
Beyond parity: headers land on **failures too** (helmet middleware ordering bugs are a classic Express footgun), app-set values win by default, and every option can be driven live from the database (below).
|
|
55
|
+
|
|
56
|
+
## Options
|
|
57
|
+
|
|
58
|
+
| Option | Type | Default | Does |
|
|
59
|
+
| ------------------------------ | ---------------------------------------------------------------- | --------------- | ---------------------------------------------------------------------------------------- |
|
|
60
|
+
| `contentSecurityPolicy` | `string` · `{ directives, useDefaults?, reportOnly? }` | — (omitted) | CSP header; object form merges over helmet's default directives, camelCase or kebab keys |
|
|
61
|
+
| `frameOptions` | `"DENY"` · `"SAMEORIGIN"` | `"DENY"` | `X-Frame-Options` value |
|
|
62
|
+
| `referrerPolicy` | `string` | `"no-referrer"` | `Referrer-Policy` value |
|
|
63
|
+
| `hsts` | `boolean` · `{ maxAge?, includeSubDomains?, preload? }` | `false` | `Strict-Transport-Security` — `true` = one year |
|
|
64
|
+
| `permissionsPolicy` | `string` | — (omitted) | `Permissions-Policy` value |
|
|
65
|
+
| `crossOriginOpenerPolicy` | `"same-origin"` · `"same-origin-allow-popups"` · `"unsafe-none"` | — (omitted) | `Cross-Origin-Opener-Policy` value |
|
|
66
|
+
| `crossOriginResourcePolicy` | `"same-origin"` · `"same-site"` · `"cross-origin"` | — (omitted) | `Cross-Origin-Resource-Policy` value |
|
|
67
|
+
| `crossOriginEmbedderPolicy` | `"require-corp"` · `"credentialless"` | — (omitted) | `Cross-Origin-Embedder-Policy` value |
|
|
68
|
+
| `originAgentCluster` | `boolean` | `true` | `Origin-Agent-Cluster: ?1` — `false` omits |
|
|
69
|
+
| `dnsPrefetchControl` | `boolean` · `{ allow: boolean }` | `true` → `off` | `X-DNS-Prefetch-Control`; `false` omits |
|
|
70
|
+
| `downloadOptions` | `boolean` | `true` | `X-Download-Options: noopen` — `false` omits |
|
|
71
|
+
| `permittedCrossDomainPolicies` | `"none"` · `"master-only"` · `"by-content-type"` · `"all"` | `"none"` | `X-Permitted-Cross-Domain-Policies` value |
|
|
72
|
+
| `poweredBy` | `boolean` · `string` | `true` | `true` removes `X-Powered-By`, a string sets a decoy, `false` keeps the app's |
|
|
73
|
+
| `xssProtection` | `boolean` | `true` | `X-XSS-Protection: 0` — `false` omits |
|
|
74
|
+
| `override` | `boolean` | `false` | Replace values the app set explicitly |
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
.plug(
|
|
78
|
+
securityHeaders({
|
|
79
|
+
contentSecurityPolicy: {
|
|
80
|
+
directives: { scriptSrc: ["'self'", "https://cdn.example.com"] }, // merged over the defaults
|
|
81
|
+
reportOnly: true, // Content-Security-Policy-Report-Only while you tune
|
|
82
|
+
},
|
|
83
|
+
hsts: { maxAge: 63072000, includeSubDomains: true },
|
|
84
|
+
permissionsPolicy: "camera=(), microphone=()",
|
|
85
|
+
}),
|
|
86
|
+
)
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
<Callout type="warn">
|
|
90
|
+
HSTS is off by default because it is **sticky** — once a browser sees it, it insists on HTTPS for
|
|
91
|
+
the whole `max-age`. Enable it only on deployments that already serve HTTPS (never on plain-HTTP
|
|
92
|
+
local dev). The same caution applies to `upgrade-insecure-requests` in the default CSP.
|
|
93
|
+
</Callout>
|
|
94
|
+
|
|
95
|
+
## Runtime configuration
|
|
96
|
+
|
|
97
|
+
Header policy is exactly the config you want to flip without a redeploy — enable HSTS the day HTTPS lands, tighten the CSP after an audit. Pass a `configSource()` and options follow the database within one sync interval:
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
const headers = configSource({
|
|
101
|
+
plugin: "security-headers",
|
|
102
|
+
code: { hsts: false }, // safe floor for local dev
|
|
103
|
+
db: { store: db },
|
|
104
|
+
kv: cache,
|
|
105
|
+
});
|
|
106
|
+
on(every("30s"), headers.sync());
|
|
107
|
+
export const app = oke({ name: "shop", env: "dev" }).plug(securityHeaders(headers));
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
```sql
|
|
111
|
+
INSERT INTO security_headers_config ("key", "value")
|
|
112
|
+
VALUES ('config', '{"hsts": true}');
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
See [Plugins → Runtime configuration](/docs/reference/plugins#runtime-configuration-code-or-db) for the full contract.
|
|
116
|
+
|
|
117
|
+
## Notes
|
|
118
|
+
|
|
119
|
+
| Behavior | Detail |
|
|
120
|
+
| ----------------- | --------------------------------------------------------------------- |
|
|
121
|
+
| Failures included | `onResponse` runs after `onError` — denials get the same headers |
|
|
122
|
+
| App wins | A header set earlier (app hook, flow) is kept unless `override: true` |
|
|
123
|
+
| Non-HTTP triggers | No-op — nothing to stamp outside HTTP |
|
|
124
|
+
| Scope | Flow responses — infra routes (`/_oke/*`, 404s) bypass the pipeline |
|
|
125
|
+
|
|
126
|
+
## Next
|
|
127
|
+
|
|
128
|
+
<Cards>
|
|
129
|
+
<Card title="CORS" description="Cross-origin rules at the edge." href="/docs/plugins/cors" />
|
|
130
|
+
<Card title="CSRF" description="Block cross-site state changes." href="/docs/plugins/csrf" />
|
|
131
|
+
<Card
|
|
132
|
+
title="Plugin API"
|
|
133
|
+
description="Runtime configuration contract."
|
|
134
|
+
href="/docs/reference/plugins"
|
|
135
|
+
/>
|
|
136
|
+
</Cards>
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "CLI Reference"
|
|
3
|
+
description: "oke and create-oke — everyday commands and flags."
|
|
4
|
+
icon: "Terminal"
|
|
5
|
+
source: "docs/cli.md"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
### Commands
|
|
9
|
+
|
|
10
|
+
```bash
|
|
11
|
+
bun add okengine # ONE package
|
|
12
|
+
|
|
13
|
+
oke dev # watch · hot reload · Console :6533 · app :6530 · MCP :6535 · docs MCP :6536
|
|
14
|
+
# → client types + domain schema push on save (local)
|
|
15
|
+
oke dev --local # -l session-only local (in-memory; never writes .oke/mode)
|
|
16
|
+
oke dev --no-db-push # opt out of auto oke db push on schema change
|
|
17
|
+
oke dev --docker # -d infra compose under docker/ (no app container; host Bun)
|
|
18
|
+
oke dev -d store.sql,signal # partial: only these roles get real backends
|
|
19
|
+
oke mode local|docker # get/set default oke dev mode (saved in .oke/mode)
|
|
20
|
+
|
|
21
|
+
oke start # runs exactly what production runs (this is the Docker CMD)
|
|
22
|
+
oke doctor # verify secrets, ports, drivers, tenancy, schema drift
|
|
23
|
+
oke stack # preview resolved images/tags/ports — writes nothing
|
|
24
|
+
|
|
25
|
+
oke schema generate # core + plugin stubs → schema/oke.ts (--check in CI)
|
|
26
|
+
oke db push # domain schema.ts → live local DB (dev; drizzle-kit)
|
|
27
|
+
oke db generate # versioned SQL under drizzle/ (review)
|
|
28
|
+
oke db migrate # apply migrations (explicit; never auto in prod)
|
|
29
|
+
oke vault set STRIPE_KEY # also: list · import .env · key rotate
|
|
30
|
+
oke client add <url> # types for a separate frontend repo
|
|
31
|
+
|
|
32
|
+
oke docker # docker/Dockerfile + docker/compose.<role>.yml · …
|
|
33
|
+
oke docker --prod # healthchecks, volumes, limits, secret refs, deploy.replicas
|
|
34
|
+
oke images pin # tags → digests in oke.images.lock
|
|
35
|
+
|
|
36
|
+
oke build --target edge # < 15 kB kernel profile
|
|
37
|
+
oke eval # run prompt eval sets; fails CI on regression
|
|
38
|
+
oke branch prod --at "yesterday" # fork journaled state into a sandbox
|
|
39
|
+
oke privacy erase --subject <id> # crypto-shredding: deletes the key, not the terabytes
|
|
40
|
+
oke upgrade # run codemods for a breaking change, print the diff
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
In development, app, Console, MCP, and docs MCP prefer the canonical ports and move upward
|
|
44
|
+
when occupied. Docker infrastructure uses stable per-project offsets in disjoint ranges for
|
|
45
|
+
each built-in service, preventing one service's offset port from overlapping another's.
|
|
46
|
+
|
|
47
|
+
### Additional commands
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
oke doctor --diff # CI gate: undeclared Manifest contract breaks
|
|
51
|
+
oke doctor --json # -j JSON on stdout; hints on stderr (agents / MCP)
|
|
52
|
+
oke stack --json # -j
|
|
53
|
+
oke images list # recipe · image · tag · digest · size (--json|-j)
|
|
54
|
+
oke gates list # Module:Action catalogue (--json|-j)
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
### Shell completion
|
|
58
|
+
|
|
59
|
+
Generated from the command registry — not a hand-maintained script:
|
|
60
|
+
|
|
61
|
+
```bash
|
|
62
|
+
eval "$(oke completion bash)"
|
|
63
|
+
eval "$(oke completion zsh)"
|
|
64
|
+
oke completion fish | source
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
### Short flags
|
|
68
|
+
|
|
69
|
+
Long form is canonical in docs; short form is convenience only. Shared letters follow git’s pattern (different meanings on different subcommands — e.g. `-c` is `--check` on `schema generate`, `--config` on `stack` / `docker` / `images`).
|
|
70
|
+
|
|
71
|
+
| Long | Short | Where |
|
|
72
|
+
| -------------------- | ----- | ---------------------------------------------- |
|
|
73
|
+
| `--local` | `-l` | `dev` |
|
|
74
|
+
| `--docker` | `-d` | `dev` |
|
|
75
|
+
| `--no-db-push` | | `dev` |
|
|
76
|
+
| `--prod` | `-p` | `docker` |
|
|
77
|
+
| `--port` | `-p` | `start` |
|
|
78
|
+
| `--check` | `-c` | `schema generate` |
|
|
79
|
+
| `--config` | `-c` | `stack`, `docker`, `images`, `db *` (drizzle) |
|
|
80
|
+
| `--apply` | `-a` | `upgrade` |
|
|
81
|
+
| `--at` | `-a` | `branch` |
|
|
82
|
+
| `--after` | `-a` | `doctor --diff` |
|
|
83
|
+
| `--target` | `-t` | `build` |
|
|
84
|
+
| `--diff` | | `doctor` |
|
|
85
|
+
| `--json` | `-j` | `doctor`, `stack`, `images list`, `gates list` |
|
|
86
|
+
| `--manifest` | `-m` | most Manifest readers |
|
|
87
|
+
| `--entry` | `-e` | `dev`, `start`, `build` |
|
|
88
|
+
| `--out` / `--outdir` | `-o` | writers |
|
|
89
|
+
| `--subject` | `-s` | `privacy erase` |
|
|
90
|
+
| `--before` | `-b` | `doctor --diff` |
|
|
91
|
+
| `--base` | `-B` | `doctor --diff` |
|
|
92
|
+
|
|
93
|
+
### Exit codes
|
|
94
|
+
|
|
95
|
+
| Exit | Meaning |
|
|
96
|
+
| ----- | ------------------------------------- |
|
|
97
|
+
| **0** | success |
|
|
98
|
+
| **1** | usage / validation |
|
|
99
|
+
| **2** | runtime / environment / check failure |
|
|
100
|
+
|
|
101
|
+
`oke help` prints the same flag and exit-code tables.
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Configuration"
|
|
3
|
+
description: "Every option in oke.config.ts — drivers per environment, images, i18n, tenancy, privacy, db sync, topology, ports, and console."
|
|
4
|
+
icon: "Settings2"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
Complete reference for `oke.config.ts`. Every option below is verified against `defineConfig`; the four environment keys everywhere are `local` · `docker` · `test` · `prod`.
|
|
8
|
+
|
|
9
|
+
```typescript title="oke.config.ts"
|
|
10
|
+
import { defineConfig } from "okengine/config";
|
|
11
|
+
|
|
12
|
+
export default defineConfig({
|
|
13
|
+
// options below
|
|
14
|
+
});
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
## drivers
|
|
18
|
+
|
|
19
|
+
Which backend each element talks to, per environment. A value is either a driver id string or a rich object:
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
drivers: {
|
|
23
|
+
store: {
|
|
24
|
+
sql: { local: "sqlite", docker: "postgres", test: "memory", prod: "postgres" },
|
|
25
|
+
kv: { local: "memory", docker: "redis", test: "memory", prod: "redis" },
|
|
26
|
+
files: { local: "fs", docker: "s3", test: "memory", prod: "s3" },
|
|
27
|
+
},
|
|
28
|
+
signal: { local: "memory", docker: "postgres", test: "memory", prod: "postgres" },
|
|
29
|
+
clock: { local: "memory", docker: "postgres", test: "frozen", prod: "postgres" },
|
|
30
|
+
vault: { local: "dotenv", docker: "openbao", test: "memory", prod: "openbao" },
|
|
31
|
+
channel: {
|
|
32
|
+
email: { local: "console", docker: "smtp", test: "console", prod: "smtp" },
|
|
33
|
+
},
|
|
34
|
+
},
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
| Key | Shape | Driver ids (verified) |
|
|
38
|
+
| ------------------ | -------------- | ---------------------------------------------------------------------------- |
|
|
39
|
+
| `store.sql` | env driver map | `sqlite` · `postgres` · `memory` |
|
|
40
|
+
| `store.kv` | env driver map | `memory` · `redis` |
|
|
41
|
+
| `store.files` | env driver map | `memory` · `fs` · `s3` |
|
|
42
|
+
| `store.index` | env driver map | `memory` · `pgvector` |
|
|
43
|
+
| `signal` | env driver map | `memory` · `postgres` · `redis` · `nats` |
|
|
44
|
+
| `clock` | env driver map | `memory` · `postgres` · `frozen` |
|
|
45
|
+
| `vault` | env driver map | `dotenv` · `openbao` · `memory` |
|
|
46
|
+
| `channel.email` | env driver map | `console` · `smtp` · `resend` |
|
|
47
|
+
| `channel.sms` | env driver map | `console` · `unifonic` |
|
|
48
|
+
| `channel.whatsapp` | env driver map | medium declared; drivers added per provider |
|
|
49
|
+
| `channel.push` | env driver map | medium declared; drivers added per provider |
|
|
50
|
+
| `ai` | env driver map | `mock` · `anthropic` · `openai-compatible` · `bedrock` · `vertex` · `ollama` |
|
|
51
|
+
| `runs` | env driver map | runs-store driver (distinct from top-level `runs`) |
|
|
52
|
+
| `prod` | `string[]` | flat protocol list for the Manifest — nested maps are preferred |
|
|
53
|
+
|
|
54
|
+
When `docker` is omitted it inherits the `prod` driver. The rich object form adds connection detail:
|
|
55
|
+
|
|
56
|
+
```typescript
|
|
57
|
+
sql: {
|
|
58
|
+
prod: { driver: "postgres", pool: { max: 20 }, replicas: ["postgres://ro-1/db"] },
|
|
59
|
+
},
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
| Field | Type | Meaning |
|
|
63
|
+
| ---------- | ----------------- | ------------------------------------------- |
|
|
64
|
+
| `url` | connection string | Overrides the env-var resolution |
|
|
65
|
+
| `pool` | `{ max?, min? }` | SQL pool sizing |
|
|
66
|
+
| `replicas` | `string[]` | Read-only routing targets (read flows only) |
|
|
67
|
+
|
|
68
|
+
## images
|
|
69
|
+
|
|
70
|
+
Container image pins keyed by element role — vendor choice lives here, never in driver ids:
|
|
71
|
+
|
|
72
|
+
```typescript
|
|
73
|
+
images: {
|
|
74
|
+
"store.sql": "postgres:18",
|
|
75
|
+
"store.kv": "redis:8",
|
|
76
|
+
"store.files": "rustfs/rustfs:1.0.0-beta.11",
|
|
77
|
+
"channel.email": "axllent/mailpit:v1.22.3",
|
|
78
|
+
vault: "openbao/openbao:2.6.1",
|
|
79
|
+
},
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## i18n
|
|
83
|
+
|
|
84
|
+
| Option | Type | Default | Meaning |
|
|
85
|
+
| --------- | ---------- | ------- | ------------------------------------------- |
|
|
86
|
+
| `locales` | `string[]` | — | Supported locales |
|
|
87
|
+
| `default` | string | — | Fallback locale (channel templates, `fx.t`) |
|
|
88
|
+
| `dir` | record | — | Per-locale direction: `"ltr"` \| `"rtl"` |
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
i18n: { locales: ["en", "ar"], default: "en", dir: { ar: "rtl" } },
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## tenancy
|
|
95
|
+
|
|
96
|
+
Multi-tenant isolation policy.
|
|
97
|
+
|
|
98
|
+
| Option | Type | Meaning |
|
|
99
|
+
| ----------- | --------------------------------- | ---------------------------------------- |
|
|
100
|
+
| `isolation` | `"row" \| "schema" \| "database"` | How tenants are separated in the store |
|
|
101
|
+
| `resolve` | string \| function | Tenant resolver — reads `ctx.auth.orgId` |
|
|
102
|
+
|
|
103
|
+
## privacy
|
|
104
|
+
|
|
105
|
+
Presence of this block turns the CORE privacy tooling on in the Console — masking, classification surfaces. It is not a `.plug()` call.
|
|
106
|
+
|
|
107
|
+
```typescript
|
|
108
|
+
privacy: {},
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## runs
|
|
112
|
+
|
|
113
|
+
Runs retention and redaction at the config surface — **not** the same key as `drivers.runs`.
|
|
114
|
+
|
|
115
|
+
| Option | Type | Meaning |
|
|
116
|
+
| -------- | ------------------------ | ----------------------------------------------------- |
|
|
117
|
+
| `redact` | `Record<string, string>` | Field → retention duration; presence turns privacy on |
|
|
118
|
+
|
|
119
|
+
## db
|
|
120
|
+
|
|
121
|
+
Domain schema sync for `oke db push | generate | migrate` (Drizzle). Unrelated to `oke schema generate`.
|
|
122
|
+
|
|
123
|
+
| Option | Default | Meaning |
|
|
124
|
+
| ----------- | --------------------------- | --------------------------------------------------------------------------- |
|
|
125
|
+
| `autoPush` | `true` (local only) | Auto-run `db push` on schema change in `oke dev`; forced off in docker/prod |
|
|
126
|
+
| `config` | `"drizzle.config.ts"` | Path to the drizzle-kit config |
|
|
127
|
+
| `declare` | `"src/schema.decl.ts"` | Abstract schema module (`store.schema.table` exports) |
|
|
128
|
+
| `generated` | `"src/schema.generated.ts"` | Where `oke db` emits dialect Drizzle |
|
|
129
|
+
| `entry` | `src/app.ts` | App entry for collecting plugin table contributions |
|
|
130
|
+
|
|
131
|
+
## topology
|
|
132
|
+
|
|
133
|
+
| Value | Meaning |
|
|
134
|
+
| ------------ | ------------------------------------------------ |
|
|
135
|
+
| `"monolith"` | One process serves everything (default posture) |
|
|
136
|
+
| `"services"` | Split deployment units derived from the Manifest |
|
|
137
|
+
|
|
138
|
+
## ports
|
|
139
|
+
|
|
140
|
+
| Option | Default | Surface |
|
|
141
|
+
| --------- | ------- | ------- |
|
|
142
|
+
| `app` | `6530` | App |
|
|
143
|
+
| `console` | `6533` | Console |
|
|
144
|
+
| `mcp` | `6535` | MCP |
|
|
145
|
+
|
|
146
|
+
## console
|
|
147
|
+
|
|
148
|
+
Production Console exposure.
|
|
149
|
+
|
|
150
|
+
| Option | Type | Default | Meaning |
|
|
151
|
+
| -------------- | ------------------------------------ | ------- | ------------------------- |
|
|
152
|
+
| `prod.enabled` | boolean | — | Serve the Console in prod |
|
|
153
|
+
| `prod.auth` | `"required" \| "optional" \| "none"` | — | Access requirement |
|
|
154
|
+
|
|
155
|
+
## Learn more
|
|
156
|
+
|
|
157
|
+
- [CLI Reference](/docs/reference/cli) — `oke dev` · `oke db` · `oke docker`
|
|
158
|
+
- [Environment Variables](/docs/reference/environment-variables) — URL and secret resolution
|
|
159
|
+
- [Store](/docs/elements/store) — what the store drivers back
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Environment Variables"
|
|
3
|
+
description: "Every environment variable OKE reads — connection URLs, driver overrides, secrets, and CLI flags, grouped by what they configure."
|
|
4
|
+
icon: "Terminal"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
OKE reads environment variables at boot for connection detail and secrets — never for behavior you could declare in `oke.config.ts`. In docker mode these are written for you into `docker/.env.docker`; this page is the full map.
|
|
8
|
+
|
|
9
|
+
<Callout title="Precedence">
|
|
10
|
+
For anything with both an `OKE_*` variable and a conventional one (like `DATABASE_URL`), the
|
|
11
|
+
conventional variable wins first, then the `OKE_*` form, then the built-in default.
|
|
12
|
+
</Callout>
|
|
13
|
+
|
|
14
|
+
## SQL store
|
|
15
|
+
|
|
16
|
+
| Variable | Used for | Default when unset |
|
|
17
|
+
| ------------------- | ---------------------------------------------------- | ------------------------------- |
|
|
18
|
+
| `DATABASE_URL` | Postgres connection (`postgres` driver, drizzle-kit) | `postgres://localhost:5432/oke` |
|
|
19
|
+
| `OKE_STORE_SQL_URL` | Explicit SQL URL override | — |
|
|
20
|
+
| `OKE_SQLITE_URL` | SQLite file path (`sqlite` driver) | `.oke/app.sqlite` |
|
|
21
|
+
| `OKE_SQL_DRIVER` | Force the sql driver id at boot | config map |
|
|
22
|
+
|
|
23
|
+
## KV store
|
|
24
|
+
|
|
25
|
+
| Variable | Used for | Default when unset |
|
|
26
|
+
| ------------------ | ------------------------ | ------------------ |
|
|
27
|
+
| `REDIS_URL` | Redis connection | driver default |
|
|
28
|
+
| `OKE_STORE_KV_URL` | Explicit KV URL override | — |
|
|
29
|
+
| `OKE_KV_DRIVER` | Force the kv driver id | config map |
|
|
30
|
+
|
|
31
|
+
## Files store
|
|
32
|
+
|
|
33
|
+
| Variable | Used for | Default when unset |
|
|
34
|
+
| ---------------------- | -------------------------------- | ------------------ |
|
|
35
|
+
| `S3_BUCKET` | Bucket name (`s3` driver) | — |
|
|
36
|
+
| `S3_ENDPOINT` | S3-compatible endpoint (RustFS) | — |
|
|
37
|
+
| `S3_ACCESS_KEY_ID` | Access key | — |
|
|
38
|
+
| `S3_SECRET_ACCESS_KEY` | Secret key | — |
|
|
39
|
+
| `S3_REGION` | Region | — |
|
|
40
|
+
| `S3_SESSION_TOKEN` | Session token (temporary creds) | — |
|
|
41
|
+
| `OKE_STORE_FILES_DB` | Explicit files location override | — |
|
|
42
|
+
| `OKE_FILES_DRIVER` | Force the files driver id | config map |
|
|
43
|
+
|
|
44
|
+
## Vault (OpenBao)
|
|
45
|
+
|
|
46
|
+
Written by the first-boot bootstrap; you normally only set these when pointing at an external vault.
|
|
47
|
+
|
|
48
|
+
| Variable | Used for | Default when unset |
|
|
49
|
+
| ----------------- | --------------------------- | ------------------ |
|
|
50
|
+
| `OKE_VAULT_URL` | OpenBao base URL | — |
|
|
51
|
+
| `OKE_VAULT_TOKEN` | App token (least-privilege) | — |
|
|
52
|
+
| `OKE_VAULT_MOUNT` | KV v2 mount path | `"secret"` |
|
|
53
|
+
|
|
54
|
+
## Channel (email)
|
|
55
|
+
|
|
56
|
+
| Variable | Used for |
|
|
57
|
+
| ----------------------- | ----------------------------------------- |
|
|
58
|
+
| `SMTP_URL` | Full SMTP connection string (`smtp://…`) |
|
|
59
|
+
| `SMTP_USER` | Overrides the user embedded in `SMTP_URL` |
|
|
60
|
+
| `SMTP_PASSWORD` | Overrides the password in `SMTP_URL` |
|
|
61
|
+
| `OKE_CHANNEL_EMAIL_URL` | OKE-specific alternative to `SMTP_URL` |
|
|
62
|
+
|
|
63
|
+
## AI providers
|
|
64
|
+
|
|
65
|
+
| Variable | Used for |
|
|
66
|
+
| ------------------- | --------------------------------------- |
|
|
67
|
+
| `ANTHROPIC_API_KEY` | `anthropic` driver credential |
|
|
68
|
+
| `ANTHROPIC_MODEL` | Model override for the anthropic driver |
|
|
69
|
+
| `OPENAI_API_KEY` | `openai-compatible` driver credential |
|
|
70
|
+
|
|
71
|
+
## Framework behavior
|
|
72
|
+
|
|
73
|
+
| Variable | Used for |
|
|
74
|
+
| --------------------- | ------------------------------------------------------------- |
|
|
75
|
+
| `OKE_DOCKER` | `"1"` marks docker mode (set by the CLI, not by you) |
|
|
76
|
+
| `OKE_DB_AUTO_PUSH` | Overrides `db.autoPush` at boot |
|
|
77
|
+
| `OKE_DRIZZLE_DIALECT` | `"sqlite"` \| `"postgresql"` for generated drizzle config |
|
|
78
|
+
| `OKE_DEV_REQUEST_LOG` | `"1"` logs requests during `oke dev` (set by the CLI) |
|
|
79
|
+
| `OKE_CONSOLE_SECRET` | Console session secret — set explicitly in production |
|
|
80
|
+
| `PORT` | App port in production containers (default `6530`) |
|
|
81
|
+
| `NODE_ENV` | `"production"` switches the Console to its production posture |
|
|
82
|
+
|
|
83
|
+
## Learn more
|
|
84
|
+
|
|
85
|
+
- [Configuration](/docs/reference/configuration) — the declarative side of the same knobs
|
|
86
|
+
- [Vault](/docs/elements/vault) — how `OKE_VAULT_*` gets minted on first boot
|
|
87
|
+
- [CLI Reference](/docs/reference/cli) — which commands write these for you
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Errors"
|
|
3
|
+
description: "Every error OKE produces — permanent OKE codes with fixes, gate denials, and subsystem errors, with what to do about each."
|
|
4
|
+
icon: "OctagonAlert"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
OKE has two error families, and confusing them is the most common mistake: **failures are values** a flow returns (`{ data: null, error: { code, data } }` — clients switch on `error.code`), while **framework errors are thrown** for invariant violations and carry a permanent numeric code, a cause, and a fix.
|
|
8
|
+
|
|
9
|
+
```text
|
|
10
|
+
OKE1101 domain table not found — migrations have not been applied.
|
|
11
|
+
→ run `oke db migrate` against this environment.
|
|
12
|
+
https://oke.omqkhafi.dev/e/1101
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Codes are permanent once published — you can match on them safely across upgrades.
|
|
16
|
+
|
|
17
|
+
## OKE numeric codes
|
|
18
|
+
|
|
19
|
+
| Code | Name | Cause | Fix |
|
|
20
|
+
| ------ | ----------------- | ------------------------------------------------ | ----------------------------------------------- |
|
|
21
|
+
| `1001` | undeclared read | Flow reads a resource not in `effects.reads` | Add it to the flow's `effects.reads` |
|
|
22
|
+
| `1002` | undeclared write | Flow writes a resource not in `effects.writes` | Add it to the flow's `effects.writes` |
|
|
23
|
+
| `1003` | undeclared emit | Flow emits a signal not in `effects.emits` | Add it to the flow's `effects.emits` |
|
|
24
|
+
| `1004` | undeclared send | Flow sends a template not in `effects.sends` | Add it to the flow's `effects.sends` |
|
|
25
|
+
| `1005` | undeclared ask | Flow asks a prompt not in `effects.asks` | Add it to the flow's `effects.asks` |
|
|
26
|
+
| `1006` | undeclared secret | Flow reads a secret not in `effects.secrets` | Add it to the flow's `effects.secrets` |
|
|
27
|
+
| `1007` | undeclared call | Flow calls a flow not in `effects.calls` | Add it to the flow's `effects.calls` |
|
|
28
|
+
| `1042` | orphan emit | Emitted signal has no subscriber | Add `on(signal, …)` or declare `optional: true` |
|
|
29
|
+
| `1101` | schema missing | Domain table absent in docker/prod — no auto-DDL | Run `oke db migrate` against this environment |
|
|
30
|
+
|
|
31
|
+
<Callout title="Effects are usually inferred">
|
|
32
|
+
The 1001–1007 family exists for flows that declare effects explicitly. Most apps never write an
|
|
33
|
+
`effects` block — inference covers them — so seeing one of these means an explicit declaration
|
|
34
|
+
drifted from the code.
|
|
35
|
+
</Callout>
|
|
36
|
+
|
|
37
|
+
## Gate denials (typed failures)
|
|
38
|
+
|
|
39
|
+
Returned, not thrown — the request never reached `do`:
|
|
40
|
+
|
|
41
|
+
| Code | When | Payload |
|
|
42
|
+
| -------------- | -------------------------------------------- | ---------------- |
|
|
43
|
+
| `Unauthorized` | Policy denied, request not authenticated | — |
|
|
44
|
+
| `Forbidden` | Policy denied, authenticated but not allowed | `gate`, `reason` |
|
|
45
|
+
| `RateLimited` | Rate gate budget exhausted | `retryAfterMs` |
|
|
46
|
+
|
|
47
|
+
## Framework validation failures
|
|
48
|
+
|
|
49
|
+
| Code | When |
|
|
50
|
+
| ----------------- | ------------------------------------------------------------------------------------------ |
|
|
51
|
+
| `ValidationError` | Input failed the `in` schema, or a list param isn't whitelisted (`unknown list param "x"`) |
|
|
52
|
+
| `NotFound` | A `store.resource` get/update/remove hit a missing row |
|
|
53
|
+
|
|
54
|
+
## Subsystem errors
|
|
55
|
+
|
|
56
|
+
Thrown by specific subsystems — each names its own cause:
|
|
57
|
+
|
|
58
|
+
| Error | Thrown when | What to do |
|
|
59
|
+
| ----------------------------- | ------------------------------------------------------------------ | ------------------------------------------------------- |
|
|
60
|
+
| `VaultBootError` | A vault contract has no value in any resolution layer | Set the missing names — the error lists every gap |
|
|
61
|
+
| `OpenBaoUnavailableError` | Vault driver can't reach OpenBao, or it's sealed, in docker/prod | Restore the vault or unseal it — never silently skipped |
|
|
62
|
+
| `OpenBaoBootstrapError` | First-boot init/unseal failed, or key material is missing/unsafe | Read the message — it names the exact failing step |
|
|
63
|
+
| `AiPiiBuildError` | Build: a flow sends PII fields to a third-party model | Drop the fields or add `allowPii: true` — fields named |
|
|
64
|
+
| `AiSchemaValidationError` | A model response failed the prompt's `out` schema | Fix the prompt or the schema — response didn't conform |
|
|
65
|
+
| `ScheduleNotOverridableError` | Console tried to edit a clock declared without `overridable: true` | Declare it overridable and redeploy |
|
|
66
|
+
| `ClockResourceNotFoundError` | Console action targeted an unknown clock name | Check the name against your `clock()` declarations |
|
|
67
|
+
| `DryRunWriteIsolationError` | A write attempted inside a dry run | Dry runs never write — use a real run |
|
|
68
|
+
| `ManifestValidationError` | The compiled Manifest failed schema validation | Re-run the build; the error names the offending entry |
|
|
69
|
+
| `CrossPlaneError` | A user-plane token was used on the operator plane (or vice versa) | Use the correct principal for the plane |
|
|
70
|
+
| `AttenuationError` | A token was used beyond its attenuated scope | Re-issue with the needed scope |
|
|
71
|
+
| `SessionError` | Session token invalid, expired, or malformed | Re-authenticate |
|
|
72
|
+
| `OperatorError` | Operator-plane operation failed its checks | Error message names the failed check |
|
|
73
|
+
| `AccessGrantError` | Console access grant rejected | Re-request access with a valid grant |
|
|
74
|
+
| `UnsupportedPathError` | A route path shape the router can't compile | Simplify the path pattern |
|
|
75
|
+
|
|
76
|
+
## Learn more
|
|
77
|
+
|
|
78
|
+
- [Flow](/docs/elements/flow) — `fx.fail` and the response envelope
|
|
79
|
+
- [Gate](/docs/elements/gate) — where the three denials come from
|
|
80
|
+
- [CLI Reference](/docs/reference/cli) — `oke db migrate` and friends
|