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,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Documentation"
|
|
3
|
+
description: "One law. Eight elements. Ten exports."
|
|
4
|
+
icon: "BookOpen"
|
|
5
|
+
source: "docs/spec/unified-theory.md"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
Welcome to the okengine handbook. Pick a section below — or start with Get Started if you are new.
|
|
9
|
+
|
|
10
|
+
<Callout title="The one law">
|
|
11
|
+
Every backend behavior is a Flow: `on(Trigger) → Effects`. One species; triggers are typed values.
|
|
12
|
+
</Callout>
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
on(http.post("/bookings"), createBooking);
|
|
16
|
+
on(every("10m"), expireStale);
|
|
17
|
+
on(orderPlaced, sendReceipt);
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Browse by section
|
|
21
|
+
|
|
22
|
+
<Cards>
|
|
23
|
+
<Card
|
|
24
|
+
title="Get Started"
|
|
25
|
+
description="One law → install → first flows."
|
|
26
|
+
href="/docs/get-started/introduction"
|
|
27
|
+
/>
|
|
28
|
+
<Card
|
|
29
|
+
title="Basic Usage"
|
|
30
|
+
description="Build from the standard starter."
|
|
31
|
+
href="/docs/get-started/basic-usage"
|
|
32
|
+
/>
|
|
33
|
+
<Card
|
|
34
|
+
title="Elements"
|
|
35
|
+
description="Flow → AI reference, one page each."
|
|
36
|
+
href="/docs/elements/flow"
|
|
37
|
+
/>
|
|
38
|
+
<Card
|
|
39
|
+
title="Console"
|
|
40
|
+
description="Seventeen Manifest-derived panels."
|
|
41
|
+
href="/docs/console/overview"
|
|
42
|
+
/>
|
|
43
|
+
<Card
|
|
44
|
+
title="Plugins"
|
|
45
|
+
description="Official extensions — security headers, CORS, CSRF, compression, maintenance, IP rules."
|
|
46
|
+
href="/docs/plugins/security-headers"
|
|
47
|
+
/>
|
|
48
|
+
<Card
|
|
49
|
+
title="CLI Reference"
|
|
50
|
+
description="`oke` and `create-oke` everyday commands."
|
|
51
|
+
href="/docs/reference/cli"
|
|
52
|
+
/>
|
|
53
|
+
<Card
|
|
54
|
+
title="Security"
|
|
55
|
+
description="Console security posture — Host, Origin, MCP."
|
|
56
|
+
href="/docs/reference/security"
|
|
57
|
+
/>
|
|
58
|
+
<Card
|
|
59
|
+
title="AI Resources"
|
|
60
|
+
description="AGENTS.md, MCP `:6535`, `/llms.txt`."
|
|
61
|
+
href="/docs/ai/mcp"
|
|
62
|
+
/>
|
|
63
|
+
</Cards>
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Compression"
|
|
3
|
+
description: "Official plugin — gzip response bodies for clients that send Accept-Encoding: gzip, with a size threshold and content-type matcher. Bun.serve does not compress on its own."
|
|
4
|
+
icon: "Shrink"
|
|
5
|
+
source: "src/plugins/compression.ts"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`compression()` gzips HTTP response bodies with the native `Bun.gzipSync` binding when the client advertises `Accept-Encoding: gzip`. `Bun.serve` never compresses on its own — without this plugin every byte goes over the wire raw, no matter how large the JSON.
|
|
9
|
+
|
|
10
|
+
## Quick start
|
|
11
|
+
|
|
12
|
+
```typescript title="src/app.ts"
|
|
13
|
+
import { oke } from "okengine";
|
|
14
|
+
import { compression } from "okengine/plugins";
|
|
15
|
+
|
|
16
|
+
export const app = oke({ name: "shop", env: "dev" }).plug(compression());
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
A client sending `Accept-Encoding: gzip` now receives `Content-Encoding: gzip` with a `Vary: Accept-Encoding` marker; a client that does not ask gets the untouched body.
|
|
20
|
+
|
|
21
|
+
## Options
|
|
22
|
+
|
|
23
|
+
| Option | Type | Default | Does |
|
|
24
|
+
| --------- | -------- | -------------------------------------------- | ----------------------------------------------------------------------- |
|
|
25
|
+
| `minSize` | `number` | `1024` | Bodies smaller than this pass through raw (gzip can grow tiny payloads) |
|
|
26
|
+
| `match` | `RegExp` | JSON · `+json` · javascript · xml · `text/*` | Which `Content-Type`s are compressible |
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
.plug(compression({ minSize: 0 })) // compress even tiny bodies (tests, debugging)
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## Notes
|
|
33
|
+
|
|
34
|
+
| Behavior | Detail |
|
|
35
|
+
| ----------------- | ---------------------------------------------------------------------- |
|
|
36
|
+
| Negotiation | Runs only when `Accept-Encoding` allows gzip — `gzip;q=0` is respected |
|
|
37
|
+
| Already encoded | Skips responses that already carry `Content-Encoding` |
|
|
38
|
+
| `no-transform` | Skips responses whose `Cache-Control` forbids transformation |
|
|
39
|
+
| Content-Length | Deleted after compression — stale lengths would corrupt the response |
|
|
40
|
+
| Non-HTTP triggers | No-op — nothing to compress outside HTTP |
|
|
41
|
+
|
|
42
|
+
## Runtime configuration
|
|
43
|
+
|
|
44
|
+
Thresholds and matchers can follow the database like every other official plugin — pass a `configSource()` as the options. See [Plugins → Runtime configuration](/docs/reference/plugins#runtime-configuration-code-or-db) for the full contract.
|
|
45
|
+
|
|
46
|
+
## Next
|
|
47
|
+
|
|
48
|
+
<Cards>
|
|
49
|
+
<Card
|
|
50
|
+
title="Security Headers"
|
|
51
|
+
description="The full secure-headers set on every response."
|
|
52
|
+
href="/docs/plugins/security-headers"
|
|
53
|
+
/>
|
|
54
|
+
<Card
|
|
55
|
+
title="IP Allowlist"
|
|
56
|
+
description="Allow/deny rules by client IP."
|
|
57
|
+
href="/docs/plugins/ip-allowlist"
|
|
58
|
+
/>
|
|
59
|
+
<Card title="Plugin API" description="Build your own plugin." href="/docs/reference/plugins" />
|
|
60
|
+
</Cards>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "CORS"
|
|
3
|
+
description: "Official plugin — cross-origin rules at the edge: preflight OPTIONS answered even for paths bound to other methods, plus CORS headers on matched responses. Closed by default."
|
|
4
|
+
icon: "Globe"
|
|
5
|
+
source: "src/plugins/cors.ts"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`cors()` decides which websites may call your app from a browser. It answers preflight `OPTIONS` requests itself — even for paths bound to other methods, which would otherwise 404 before any middleware could run — and stamps `Access-Control-*` headers on matched responses.
|
|
9
|
+
|
|
10
|
+
## Quick start
|
|
11
|
+
|
|
12
|
+
```typescript title="src/app.ts"
|
|
13
|
+
import { oke } from "okengine";
|
|
14
|
+
import { cors } from "okengine/plugins";
|
|
15
|
+
|
|
16
|
+
export const app = oke({ name: "shop", env: "dev" }).plug(
|
|
17
|
+
cors({ origin: "https://app.example.com" }),
|
|
18
|
+
);
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Browsers on `https://app.example.com` can now call every flow; every other origin gets a quiet `204` on preflight with **no** CORS headers, so the browser blocks it. Same-origin traffic never needs this plugin — browsers only enforce CORS across origins.
|
|
22
|
+
|
|
23
|
+
<Callout title="Closed by default">
|
|
24
|
+
`cors()` with no `origin` opens nothing. Cross-origin access is a deliberate decision — pass
|
|
25
|
+
`"*"`, one origin, or an exact-match list when you mean it.
|
|
26
|
+
</Callout>
|
|
27
|
+
|
|
28
|
+
## Options
|
|
29
|
+
|
|
30
|
+
| Option | Type | Default | Does |
|
|
31
|
+
| ---------------- | ----------------------------- | ------------------------------------------------------ | --------------------------------------------------------------------------- |
|
|
32
|
+
| `origin` | `"*"` · `string` · `string[]` | none (closed) | Origins allowed cross-origin; lists are exact matches |
|
|
33
|
+
| `methods` | `string[]` | GET · HEAD · POST · PUT · PATCH · DELETE · OPTIONS | Methods answered on preflight |
|
|
34
|
+
| `allowedHeaders` | `string[]` | reflect the request's `Access-Control-Request-Headers` | `Access-Control-Allow-Headers` on preflight |
|
|
35
|
+
| `exposedHeaders` | `string[]` | omit | `Access-Control-Expose-Headers` on actual responses |
|
|
36
|
+
| `credentials` | `boolean` | `false` | Send `Access-Control-Allow-Credentials`; `"*"` is then reflected per-origin |
|
|
37
|
+
| `maxAge` | `number` | omit | `Access-Control-Max-Age` seconds on preflight |
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
.plug(cors({
|
|
41
|
+
origin: ["https://app.example.com", "https://admin.example.com"],
|
|
42
|
+
credentials: true,
|
|
43
|
+
maxAge: 600,
|
|
44
|
+
}))
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
## Notes
|
|
48
|
+
|
|
49
|
+
| Behavior | Detail |
|
|
50
|
+
| ----------------- | ------------------------------------------------------------------------------------------ |
|
|
51
|
+
| Preflight | Answered by the plugin's **edge handler** — runs even when no flow matches the path/method |
|
|
52
|
+
| Denied preflight | `204` with no CORS headers — the correct, quiet failure; the browser blocks it |
|
|
53
|
+
| Credentials + `*` | Browsers reject that pair, so the plugin reflects the request origin instead |
|
|
54
|
+
| `Vary` | `Origin` (plus request-method/headers on preflight) is appended, never duplicated |
|
|
55
|
+
| Non-HTTP triggers | No-op |
|
|
56
|
+
|
|
57
|
+
## Runtime configuration
|
|
58
|
+
|
|
59
|
+
Origin lists belong to the class of config you want to change without a redeploy — an emergency integration, a partner cutover. Pass a `configSource()` instead of static options and the origin rule follows the database:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
const origins = configSource({
|
|
63
|
+
plugin: "cors",
|
|
64
|
+
code: { origin: "https://app.example.com" },
|
|
65
|
+
db: { store: db },
|
|
66
|
+
kv: cache,
|
|
67
|
+
});
|
|
68
|
+
on(every("30s"), origins.sync());
|
|
69
|
+
export const app = oke({ name: "shop", env: "dev" }).plug(cors(origins));
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
See [Plugins → Runtime configuration](/docs/reference/plugins#runtime-configuration-code-or-db) for the full contract.
|
|
73
|
+
|
|
74
|
+
## Next
|
|
75
|
+
|
|
76
|
+
<Cards>
|
|
77
|
+
<Card
|
|
78
|
+
title="CSRF"
|
|
79
|
+
description="Block cross-site state changes with fetch metadata."
|
|
80
|
+
href="/docs/plugins/csrf"
|
|
81
|
+
/>
|
|
82
|
+
<Card
|
|
83
|
+
title="Security Headers"
|
|
84
|
+
description="The full secure-headers set on every response."
|
|
85
|
+
href="/docs/plugins/security-headers"
|
|
86
|
+
/>
|
|
87
|
+
<Card
|
|
88
|
+
title="Plugin API"
|
|
89
|
+
description="Edge handlers and runtime configuration."
|
|
90
|
+
href="/docs/reference/plugins"
|
|
91
|
+
/>
|
|
92
|
+
</Cards>
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "CSRF"
|
|
3
|
+
description: "Official plugin — cross-site request forgery defense using fetch metadata (Sec-Fetch-Site) with an Origin fallback. Stateless: no tokens, no cookies, no session reads."
|
|
4
|
+
icon: "ShieldAlert"
|
|
5
|
+
source: "src/plugins/csrf.ts"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`csrf()` blocks browsers on other sites from mutating your state. It runs at `onAuth` — before gate policies and the flow body — using the fetch-metadata headers every modern browser sends, with an `Origin` check as the fallback. No tokens to mint, no cookies to double-submit, no session reads: the defense is stateless.
|
|
9
|
+
|
|
10
|
+
## Quick start
|
|
11
|
+
|
|
12
|
+
```typescript title="src/app.ts"
|
|
13
|
+
import { oke } from "okengine";
|
|
14
|
+
import { csrf } from "okengine/plugins";
|
|
15
|
+
|
|
16
|
+
export const app = oke({ name: "shop", env: "dev" }).plug(csrf());
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
`GET`/`HEAD`/`OPTIONS` always pass. A `POST` with `Sec-Fetch-Site: cross-site` now gets the gate element's typed `Forbidden` — unless its `Origin` is yours or allow-listed.
|
|
20
|
+
|
|
21
|
+
## How it decides
|
|
22
|
+
|
|
23
|
+
<Steps>
|
|
24
|
+
|
|
25
|
+
<Step>
|
|
26
|
+
### Fetch metadata first
|
|
27
|
+
|
|
28
|
+
`Sec-Fetch-Site: same-origin` and `none` pass. `same-site` passes by default (your subdomains) — set `allowSameSite: false` when subdomains host untrusted content. `cross-site` falls through to the Origin check.
|
|
29
|
+
|
|
30
|
+
</Step>
|
|
31
|
+
|
|
32
|
+
<Step>
|
|
33
|
+
### Origin fallback
|
|
34
|
+
|
|
35
|
+
With `cross-site` (or no metadata at all — older browsers), the `Origin` header must be the app's own origin or an entry in `allowOrigins`; anything else is `Forbidden`.
|
|
36
|
+
|
|
37
|
+
</Step>
|
|
38
|
+
|
|
39
|
+
<Step>
|
|
40
|
+
### Headerless clients
|
|
41
|
+
|
|
42
|
+
Requests carrying neither header — curl, server-to-server calls, webhooks — are not browser CSRF vectors, so they pass by default. Set `allowNoHeader: false` to fail closed when your auth is purely cookie-based.
|
|
43
|
+
|
|
44
|
+
</Step>
|
|
45
|
+
|
|
46
|
+
</Steps>
|
|
47
|
+
|
|
48
|
+
## Options
|
|
49
|
+
|
|
50
|
+
| Option | Type | Default | Does |
|
|
51
|
+
| --------------- | ---------- | ------- | ------------------------------------------------------------------------------ |
|
|
52
|
+
| `allowOrigins` | `string[]` | none | Absolute origins allowed to mutate cross-site (e.g. a separately-hosted admin) |
|
|
53
|
+
| `allowSameSite` | `boolean` | `true` | Allow `Sec-Fetch-Site: same-site` (your subdomains) |
|
|
54
|
+
| `allowNoHeader` | `boolean` | `true` | Allow mutating requests with neither metadata nor `Origin` |
|
|
55
|
+
|
|
56
|
+
## Notes
|
|
57
|
+
|
|
58
|
+
| Behavior | Detail |
|
|
59
|
+
| ----------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
60
|
+
| Denial shape | The gate element's typed `Forbidden` (`error.data.reason: "csrf"`) — same as any gate denial |
|
|
61
|
+
| Legacy browsers | No fetch metadata → the `Origin` check carries the defense |
|
|
62
|
+
| Token patterns | Double-submit tokens can layer on later for defense-in-depth; fetch metadata alone covers current browsers |
|
|
63
|
+
| Non-HTTP triggers | No-op — clock and signal flows are never browser-driven |
|
|
64
|
+
|
|
65
|
+
## Runtime configuration
|
|
66
|
+
|
|
67
|
+
Allow-listed origins are exactly the config you want to change live. Pass a `configSource()` and the rules follow the database within one sync interval:
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
const rules = configSource({
|
|
71
|
+
plugin: "csrf",
|
|
72
|
+
code: { allowOrigins: ["https://admin.example.com"] },
|
|
73
|
+
db: { store: db },
|
|
74
|
+
kv: cache,
|
|
75
|
+
});
|
|
76
|
+
on(every("30s"), rules.sync());
|
|
77
|
+
export const app = oke({ name: "shop", env: "dev" }).plug(csrf(rules));
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
See [Plugins → Runtime configuration](/docs/reference/plugins#runtime-configuration-code-or-db) for the full contract.
|
|
81
|
+
|
|
82
|
+
## Next
|
|
83
|
+
|
|
84
|
+
<Cards>
|
|
85
|
+
<Card title="CORS" description="Cross-origin rules at the edge." href="/docs/plugins/cors" />
|
|
86
|
+
<Card
|
|
87
|
+
title="Gate"
|
|
88
|
+
description="The element behind the typed denials."
|
|
89
|
+
href="/docs/elements/gate"
|
|
90
|
+
/>
|
|
91
|
+
<Card
|
|
92
|
+
title="Security Headers"
|
|
93
|
+
description="The full secure-headers set on every response."
|
|
94
|
+
href="/docs/plugins/security-headers"
|
|
95
|
+
/>
|
|
96
|
+
</Cards>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "IP Allowlist"
|
|
3
|
+
description: "Official plugin — allow/deny rules by client IP at the edge of the pipeline, with the same typed Forbidden denial the gate element produces."
|
|
4
|
+
icon: "ListChecks"
|
|
5
|
+
source: "src/plugins/ip-allowlist.ts"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`ipAllowlist()` enforces IP rules at `onAuth`, before any gate policy or flow body runs. Internal admin surfaces, staging environments, and webhook endpoints stop unknown clients at the edge with the same typed `Forbidden` denial the [gate element](/docs/elements/gate) produces.
|
|
9
|
+
|
|
10
|
+
## Quick start
|
|
11
|
+
|
|
12
|
+
```typescript title="src/app.ts"
|
|
13
|
+
import { oke } from "okengine";
|
|
14
|
+
import { ipAllowlist } from "okengine/plugins";
|
|
15
|
+
|
|
16
|
+
export const app = oke({ name: "shop", env: "dev" }).plug(
|
|
17
|
+
ipAllowlist({ allow: ["203.0.113.7", "2001:db8::42"] }),
|
|
18
|
+
);
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
A client whose IP is not on the list receives `403` with a typed denial:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"data": null,
|
|
26
|
+
"error": {
|
|
27
|
+
"code": "Forbidden",
|
|
28
|
+
"data": { "reason": "ip_not_allowed", "ip": "198.51.100.9" }
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Options
|
|
34
|
+
|
|
35
|
+
| Option | Type | Default | Does |
|
|
36
|
+
| -------- | ---------- | ------------------- | ---------------------------------------------------------- |
|
|
37
|
+
| `allow` | `string[]` | — (everyone passes) | Exact IPs permitted — every other client is denied |
|
|
38
|
+
| `deny` | `string[]` | — (nobody blocked) | Exact IPs blocked — checked first, so deny wins on overlap |
|
|
39
|
+
| `header` | `string` | `"x-forwarded-for"` | Header carrying the client IP (first hop wins) |
|
|
40
|
+
|
|
41
|
+
```typescript
|
|
42
|
+
.plug(ipAllowlist({ deny: ["198.51.100.9"], header: "x-real-ip" }))
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
<Callout type="warn">
|
|
46
|
+
The IP header is only trustworthy behind a proxy that **sets or overwrites** it (your load
|
|
47
|
+
balancer, reverse proxy, or platform edge). A client connecting directly can send any
|
|
48
|
+
`x-forwarded-for` value it likes — an allowlist is a strong boundary only when the proxy owns the
|
|
49
|
+
header.
|
|
50
|
+
</Callout>
|
|
51
|
+
|
|
52
|
+
## Notes
|
|
53
|
+
|
|
54
|
+
| Behavior | Detail |
|
|
55
|
+
| ----------------- | ---------------------------------------------------------------------------------- |
|
|
56
|
+
| XFF parsing | First comma-separated hop is the client; proxy-appended tails are ignored |
|
|
57
|
+
| Missing header | Denied when `allow` is set (unknown is not allowed); permitted for deny-only rules |
|
|
58
|
+
| Deny wins | An IP in both lists is blocked |
|
|
59
|
+
| Non-HTTP triggers | No-op — there is no client IP outside HTTP |
|
|
60
|
+
|
|
61
|
+
## Runtime configuration
|
|
62
|
+
|
|
63
|
+
Block an abusive IP from the database and every instance picks it up on the next sync:
|
|
64
|
+
|
|
65
|
+
```typescript
|
|
66
|
+
const rules = configSource({
|
|
67
|
+
plugin: "ip-allowlist",
|
|
68
|
+
code: { deny: [] },
|
|
69
|
+
db: { store: db },
|
|
70
|
+
kv: cache,
|
|
71
|
+
});
|
|
72
|
+
on(every("30s"), rules.sync());
|
|
73
|
+
export const app = oke({ name: "shop", env: "dev" }).plug(ipAllowlist(rules));
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
See [Plugins → Runtime configuration](/docs/reference/plugins#runtime-configuration-code-or-db) for the full contract.
|
|
77
|
+
|
|
78
|
+
## Next
|
|
79
|
+
|
|
80
|
+
<Cards>
|
|
81
|
+
<Card
|
|
82
|
+
title="Maintenance Mode"
|
|
83
|
+
description="Drain traffic with one flag."
|
|
84
|
+
href="/docs/plugins/maintenance-mode"
|
|
85
|
+
/>
|
|
86
|
+
<Card
|
|
87
|
+
title="Gate"
|
|
88
|
+
description="Policies and rate limits after the IP edge."
|
|
89
|
+
href="/docs/elements/gate"
|
|
90
|
+
/>
|
|
91
|
+
<Card title="Plugin API" description="Build your own plugin." href="/docs/reference/plugins" />
|
|
92
|
+
</Cards>
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Maintenance Mode"
|
|
3
|
+
description: "Official plugin — drain HTTP traffic with one flag: every flow returns a 503 ServiceUnavailable envelope with an optional Retry-After, while allow-listed paths and an operator bypass header stay alive."
|
|
4
|
+
icon: "Construction"
|
|
5
|
+
source: "src/plugins/maintenance-mode.ts"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`maintenanceMode()` short-circuits every HTTP invocation at `onRequest` — the earliest pipeline stage — with a typed `503 ServiceUnavailable` envelope. Deploys, migrations, and incidents stop traffic with one flag instead of a deploy-time firewall rule.
|
|
9
|
+
|
|
10
|
+
## Quick start
|
|
11
|
+
|
|
12
|
+
```typescript title="src/app.ts"
|
|
13
|
+
import { oke } from "okengine";
|
|
14
|
+
import { maintenanceMode } from "okengine/plugins";
|
|
15
|
+
|
|
16
|
+
export const app = oke({ name: "shop", env: "dev" }).plug(
|
|
17
|
+
maintenanceMode({ enabled: process.env.MAINTENANCE_MODE === "1" }),
|
|
18
|
+
);
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
With `MAINTENANCE_MODE=1` in the environment, every HTTP flow answers:
|
|
22
|
+
|
|
23
|
+
```json
|
|
24
|
+
{
|
|
25
|
+
"data": null,
|
|
26
|
+
"error": {
|
|
27
|
+
"code": "ServiceUnavailable",
|
|
28
|
+
"data": { "retryAfter": 300 },
|
|
29
|
+
"message": "Service is under maintenance."
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## Options
|
|
35
|
+
|
|
36
|
+
| Option | Type | Default | Does |
|
|
37
|
+
| -------------- | ---------- | --------------------------------- | ---------------------------------------------------- |
|
|
38
|
+
| `enabled` | `boolean` | `true` | Master switch — drive it from the environment |
|
|
39
|
+
| `retryAfter` | `number` | — (omitted) | `Retry-After` seconds on the 503 |
|
|
40
|
+
| `allowPaths` | `string[]` | — (none) | Path prefixes that keep serving (e.g. `["/health"]`) |
|
|
41
|
+
| `bypassHeader` | `string` | — (none) | Header whose non-empty value lets a request through |
|
|
42
|
+
| `message` | `string` | `"Service is under maintenance."` | Failure message in the envelope |
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
.plug(
|
|
46
|
+
maintenanceMode({
|
|
47
|
+
enabled: process.env.MAINTENANCE_MODE === "1",
|
|
48
|
+
retryAfter: 300,
|
|
49
|
+
allowPaths: ["/health"], // load-balancer checks stay green
|
|
50
|
+
bypassHeader: "x-ops-token", // operators keep working
|
|
51
|
+
}),
|
|
52
|
+
)
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
<Callout type="info">
|
|
56
|
+
The bypass header is presence-based — an ops convenience, not authentication. Anyone who learns
|
|
57
|
+
the header name passes through, so treat its value as a light secret and never as a security
|
|
58
|
+
boundary.
|
|
59
|
+
</Callout>
|
|
60
|
+
|
|
61
|
+
## Notes
|
|
62
|
+
|
|
63
|
+
| Behavior | Detail |
|
|
64
|
+
| ----------------- | ----------------------------------------------------------------------------------- |
|
|
65
|
+
| Pipeline position | `onRequest` — flows never parse, authenticate, or execute |
|
|
66
|
+
| Still shaped | The 503 flows through `onResponse`, so Security Headers and Compression apply to it |
|
|
67
|
+
| Non-HTTP triggers | No-op — clock flows and signal subscribers keep running |
|
|
68
|
+
| Infra routes | `/_oke/*` bypass the pipeline entirely and stay up |
|
|
69
|
+
|
|
70
|
+
## Runtime configuration
|
|
71
|
+
|
|
72
|
+
The flagship `configSource()` use case — flip `enabled` from the database and drain traffic without a redeploy:
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
const maintenance = configSource({
|
|
76
|
+
plugin: "maintenance-mode",
|
|
77
|
+
code: { enabled: false },
|
|
78
|
+
db: { store: db },
|
|
79
|
+
kv: cache,
|
|
80
|
+
});
|
|
81
|
+
on(every("30s"), maintenance.sync());
|
|
82
|
+
export const app = oke({ name: "shop", env: "dev" }).plug(maintenanceMode(maintenance));
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
See [Plugins → Runtime configuration](/docs/reference/plugins#runtime-configuration-code-or-db) for the full contract.
|
|
86
|
+
|
|
87
|
+
## Next
|
|
88
|
+
|
|
89
|
+
<Cards>
|
|
90
|
+
<Card
|
|
91
|
+
title="IP Allowlist"
|
|
92
|
+
description="Allow/deny rules by client IP."
|
|
93
|
+
href="/docs/plugins/ip-allowlist"
|
|
94
|
+
/>
|
|
95
|
+
<Card
|
|
96
|
+
title="Security Headers"
|
|
97
|
+
description="The full secure-headers set on every response."
|
|
98
|
+
href="/docs/plugins/security-headers"
|
|
99
|
+
/>
|
|
100
|
+
<Card title="Plugin API" description="Build your own plugin." href="/docs/reference/plugins" />
|
|
101
|
+
</Cards>
|