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
package/src/runs/runs.test.ts
CHANGED
|
@@ -184,9 +184,7 @@ describe("locality — local + object storage", () => {
|
|
|
184
184
|
expect(localKeys.some((k) => k.endsWith(".parquet"))).toBe(true);
|
|
185
185
|
expect(remoteKeys.some((k) => k.endsWith(".parquet"))).toBe(true);
|
|
186
186
|
|
|
187
|
-
const rows = await runs.query(
|
|
188
|
-
"SELECT id, dim_locality AS locality FROM runs ORDER BY id",
|
|
189
|
-
);
|
|
187
|
+
const rows = await runs.query("SELECT id, dim_locality AS locality FROM runs ORDER BY id");
|
|
190
188
|
expect(rows.length).toBe(2);
|
|
191
189
|
const ids = rows.map((r) => String(r.id)).sort();
|
|
192
190
|
expect(ids).toEqual(["archived", "recent"]);
|
|
@@ -242,9 +240,7 @@ describe("crypto-shredding erasure", () => {
|
|
|
242
240
|
|
|
243
241
|
// Snapshot partition bytes before erase
|
|
244
242
|
const bucket = await fsDriver.open({ name: "snap", root: root });
|
|
245
|
-
const keysBefore = (await bucket.list("runs/")).filter((k) =>
|
|
246
|
-
k.endsWith(".parquet"),
|
|
247
|
-
);
|
|
243
|
+
const keysBefore = (await bucket.list("runs/")).filter((k) => k.endsWith(".parquet"));
|
|
248
244
|
expect(keysBefore.length).toBeGreaterThan(0);
|
|
249
245
|
const bytesBefore = await bucket.get(keysBefore[0]!);
|
|
250
246
|
expect(bytesBefore).toBeTruthy();
|
|
@@ -262,9 +258,7 @@ describe("crypto-shredding erasure", () => {
|
|
|
262
258
|
expect(bytesAfter).toEqual(bytesBefore);
|
|
263
259
|
|
|
264
260
|
// Query still returns the row (operational dims intact)
|
|
265
|
-
const rows = await runs.query(
|
|
266
|
-
"SELECT id, subject_id FROM runs WHERE id = 'run_erase'",
|
|
267
|
-
);
|
|
261
|
+
const rows = await runs.query("SELECT id, subject_id FROM runs WHERE id = 'run_erase'");
|
|
268
262
|
expect(rows.length).toBe(1);
|
|
269
263
|
expect(rows[0]!.subject_id).toBe(subjectId);
|
|
270
264
|
|
package/src/runs/runtime.ts
CHANGED
|
@@ -7,17 +7,8 @@ import { clickhouseRunsDriver } from "./drivers/clickhouse.ts";
|
|
|
7
7
|
import { filesRunsDriver } from "./drivers/files.ts";
|
|
8
8
|
import { memoryRunsDriver } from "./drivers/memory.ts";
|
|
9
9
|
import { postgresRunsDriver } from "./drivers/postgres.ts";
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
type ExplainOutliersOptions,
|
|
13
|
-
type OutlierFinding,
|
|
14
|
-
} from "./outlier.ts";
|
|
15
|
-
import {
|
|
16
|
-
archiveFields,
|
|
17
|
-
eraseSubject,
|
|
18
|
-
revealArchived,
|
|
19
|
-
type SubjectKeyVault,
|
|
20
|
-
} from "./shred.ts";
|
|
10
|
+
import { explainOutliers, type ExplainOutliersOptions, type OutlierFinding } from "./outlier.ts";
|
|
11
|
+
import { archiveFields, eraseSubject, revealArchived, type SubjectKeyVault } from "./shred.ts";
|
|
21
12
|
import type {
|
|
22
13
|
RunsDriver,
|
|
23
14
|
RunsDriverId,
|
|
@@ -114,9 +105,7 @@ const DRIVER_BY_ID: Record<RunsDriverId, RunsDriver> = {
|
|
|
114
105
|
*
|
|
115
106
|
* @param driver - Id or driver
|
|
116
107
|
*/
|
|
117
|
-
export function resolveRunsDriver(
|
|
118
|
-
driver?: RunsDriverId | RunsDriver,
|
|
119
|
-
): RunsDriver {
|
|
108
|
+
export function resolveRunsDriver(driver?: RunsDriverId | RunsDriver): RunsDriver {
|
|
120
109
|
if (!driver) return filesRunsDriver;
|
|
121
110
|
if (typeof driver === "string") {
|
|
122
111
|
const d = DRIVER_BY_ID[driver];
|
|
@@ -131,9 +120,7 @@ export function resolveRunsDriver(
|
|
|
131
120
|
*
|
|
132
121
|
* @param options - Driver + locality + subject keys
|
|
133
122
|
*/
|
|
134
|
-
export function createRunsRuntime(
|
|
135
|
-
options: CreateRunsRuntimeOptions = {},
|
|
136
|
-
): RunsRuntime {
|
|
123
|
+
export function createRunsRuntime(options: CreateRunsRuntimeOptions = {}): RunsRuntime {
|
|
137
124
|
const driver = resolveRunsDriver(options.driver);
|
|
138
125
|
let store: RunsStore | undefined;
|
|
139
126
|
const subjectKeys = options.subjectKeys;
|
|
@@ -156,21 +143,14 @@ export function createRunsRuntime(
|
|
|
156
143
|
const s = await ensureStore();
|
|
157
144
|
let archived = input.archived;
|
|
158
145
|
const subjectId =
|
|
159
|
-
input.telemetry.subjectId ??
|
|
160
|
-
input.fx.auth.userId ??
|
|
161
|
-
input.fx.tenant.id ??
|
|
162
|
-
null;
|
|
146
|
+
input.telemetry.subjectId ?? input.fx.auth.userId ?? input.fx.tenant.id ?? null;
|
|
163
147
|
if (
|
|
164
148
|
archiveCleartext &&
|
|
165
149
|
subjectId &&
|
|
166
150
|
subjectKeys &&
|
|
167
151
|
Object.keys(archiveCleartext).length > 0
|
|
168
152
|
) {
|
|
169
|
-
archived = await archiveFields(
|
|
170
|
-
subjectKeys,
|
|
171
|
-
subjectId,
|
|
172
|
-
archiveCleartext,
|
|
173
|
-
);
|
|
153
|
+
archived = await archiveFields(subjectKeys, subjectId, archiveCleartext);
|
|
174
154
|
}
|
|
175
155
|
const event = collectWideEvent({
|
|
176
156
|
...input,
|
|
@@ -221,9 +201,4 @@ export function createRunsRuntime(
|
|
|
221
201
|
};
|
|
222
202
|
}
|
|
223
203
|
|
|
224
|
-
export {
|
|
225
|
-
filesRunsDriver,
|
|
226
|
-
memoryRunsDriver,
|
|
227
|
-
postgresRunsDriver,
|
|
228
|
-
clickhouseRunsDriver,
|
|
229
|
-
};
|
|
204
|
+
export { filesRunsDriver, memoryRunsDriver, postgresRunsDriver, clickhouseRunsDriver };
|
package/src/runs/shred.ts
CHANGED
|
@@ -83,9 +83,7 @@ export function subjectKeysFromVault(vault: VaultRuntime): SubjectKeyVault {
|
|
|
83
83
|
/**
|
|
84
84
|
* In-memory subject-key vault (tests / when no Vault element is wired).
|
|
85
85
|
*/
|
|
86
|
-
export function createMemorySubjectKeys(
|
|
87
|
-
seed?: Readonly<Record<string, string>>,
|
|
88
|
-
): SubjectKeyVault {
|
|
86
|
+
export function createMemorySubjectKeys(seed?: Readonly<Record<string, string>>): SubjectKeyVault {
|
|
89
87
|
const map = new Map<string, string>(Object.entries(seed ?? {}));
|
|
90
88
|
return {
|
|
91
89
|
read(name) {
|
|
@@ -181,26 +179,16 @@ export async function revealArchived(
|
|
|
181
179
|
* @param subjectId - Subject id
|
|
182
180
|
* @returns Whether a key was deleted
|
|
183
181
|
*/
|
|
184
|
-
export function eraseSubject(
|
|
185
|
-
keys: SubjectKeyVault,
|
|
186
|
-
subjectId: string,
|
|
187
|
-
): boolean {
|
|
182
|
+
export function eraseSubject(keys: SubjectKeyVault, subjectId: string): boolean {
|
|
188
183
|
return keys.delete(subjectKeyName(subjectId));
|
|
189
184
|
}
|
|
190
185
|
|
|
191
|
-
async function encryptAesGcm(
|
|
192
|
-
plaintext: string,
|
|
193
|
-
keyBytes: Uint8Array,
|
|
194
|
-
): Promise<string> {
|
|
186
|
+
async function encryptAesGcm(plaintext: string, keyBytes: Uint8Array): Promise<string> {
|
|
195
187
|
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
196
188
|
const keyBuf = toArrayBuffer(keyBytes);
|
|
197
|
-
const cryptoKey = await crypto.subtle.importKey(
|
|
198
|
-
"
|
|
199
|
-
|
|
200
|
-
{ name: "AES-GCM" },
|
|
201
|
-
false,
|
|
202
|
-
["encrypt"],
|
|
203
|
-
);
|
|
189
|
+
const cryptoKey = await crypto.subtle.importKey("raw", keyBuf, { name: "AES-GCM" }, false, [
|
|
190
|
+
"encrypt",
|
|
191
|
+
]);
|
|
204
192
|
const cipher = await crypto.subtle.encrypt(
|
|
205
193
|
{ name: "AES-GCM", iv },
|
|
206
194
|
cryptoKey,
|
|
@@ -212,21 +200,14 @@ async function encryptAesGcm(
|
|
|
212
200
|
return Buffer.from(packed).toString("base64");
|
|
213
201
|
}
|
|
214
202
|
|
|
215
|
-
async function decryptAesGcm(
|
|
216
|
-
blob: string,
|
|
217
|
-
keyBytes: Uint8Array,
|
|
218
|
-
): Promise<string> {
|
|
203
|
+
async function decryptAesGcm(blob: string, keyBytes: Uint8Array): Promise<string> {
|
|
219
204
|
const packed = Buffer.from(blob, "base64");
|
|
220
205
|
const iv = toArrayBuffer(packed.subarray(0, 12));
|
|
221
206
|
const data = toArrayBuffer(packed.subarray(12));
|
|
222
207
|
const keyBuf = toArrayBuffer(keyBytes);
|
|
223
|
-
const cryptoKey = await crypto.subtle.importKey(
|
|
224
|
-
"
|
|
225
|
-
|
|
226
|
-
{ name: "AES-GCM" },
|
|
227
|
-
false,
|
|
228
|
-
["decrypt"],
|
|
229
|
-
);
|
|
208
|
+
const cryptoKey = await crypto.subtle.importKey("raw", keyBuf, { name: "AES-GCM" }, false, [
|
|
209
|
+
"decrypt",
|
|
210
|
+
]);
|
|
230
211
|
const plain = await crypto.subtle.decrypt(
|
|
231
212
|
{ name: "AES-GCM", iv: new Uint8Array(iv) },
|
|
232
213
|
cryptoKey,
|
package/src/runs/types.ts
CHANGED
|
@@ -26,10 +26,7 @@ export interface RunError {
|
|
|
26
26
|
* Declared / observed dimensions available without manual instrumentation.
|
|
27
27
|
* Extra keys are allowed for outlier analysis.
|
|
28
28
|
*/
|
|
29
|
-
export type RunDimensions = Record<
|
|
30
|
-
string,
|
|
31
|
-
string | number | boolean | null | undefined
|
|
32
|
-
>;
|
|
29
|
+
export type RunDimensions = Record<string, string | number | boolean | null | undefined>;
|
|
33
30
|
|
|
34
31
|
/**
|
|
35
32
|
* One wide event — the atomic observability record.
|
package/src/runtime/bun.ts
CHANGED
|
@@ -26,10 +26,7 @@ export interface BunRuntime extends Runtime {
|
|
|
26
26
|
* @param filename - Path, `":memory:"`, or omit for memory
|
|
27
27
|
* @param options - `bun:sqlite` open options
|
|
28
28
|
*/
|
|
29
|
-
sqlite(
|
|
30
|
-
filename?: string,
|
|
31
|
-
options?: ConstructorParameters<typeof Database>[1],
|
|
32
|
-
): Database;
|
|
29
|
+
sqlite(filename?: string, options?: ConstructorParameters<typeof Database>[1]): Database;
|
|
33
30
|
}
|
|
34
31
|
|
|
35
32
|
/**
|
|
@@ -43,9 +40,7 @@ export function createBunRuntime(): BunRuntime {
|
|
|
43
40
|
env: createEnv(),
|
|
44
41
|
files: createFiles(),
|
|
45
42
|
sqlite(filename = ":memory:", options) {
|
|
46
|
-
return options === undefined
|
|
47
|
-
? new Database(filename)
|
|
48
|
-
: new Database(filename, options);
|
|
43
|
+
return options === undefined ? new Database(filename) : new Database(filename, options);
|
|
49
44
|
},
|
|
50
45
|
serve(app, options) {
|
|
51
46
|
return listenBun(app, options);
|
|
@@ -67,9 +62,7 @@ export function isBunNativePath(path: string): boolean {
|
|
|
67
62
|
return true;
|
|
68
63
|
}
|
|
69
64
|
|
|
70
|
-
type MethodHandlers = Partial<
|
|
71
|
-
Record<string, (req: Request) => Response | Promise<Response>>
|
|
72
|
-
>;
|
|
65
|
+
type MethodHandlers = Partial<Record<string, (req: Request) => Response | Promise<Response>>>;
|
|
73
66
|
|
|
74
67
|
/**
|
|
75
68
|
* Build Bun.serve `routes` from app HTTP bindings.
|
|
@@ -99,11 +92,7 @@ export function buildBunRoutes(
|
|
|
99
92
|
function listenBun(app: FetchApp, options?: ServeOptions): ServerHandle {
|
|
100
93
|
const port = options?.port ?? APP_PORT;
|
|
101
94
|
const hostname = options?.hostname ?? "127.0.0.1";
|
|
102
|
-
const fetchHandler = secureFetch(
|
|
103
|
-
(req) => app.fetch(req),
|
|
104
|
-
options,
|
|
105
|
-
hostname,
|
|
106
|
-
);
|
|
95
|
+
const fetchHandler = secureFetch((req) => app.fetch(req), options, hostname);
|
|
107
96
|
const routes = buildBunRoutes(app, fetchHandler);
|
|
108
97
|
|
|
109
98
|
const server = Bun.serve({
|
|
@@ -12,9 +12,7 @@ import { measureColdStartMedianMs } from "../release/measure.ts";
|
|
|
12
12
|
describe("cold start budget", () => {
|
|
13
13
|
test(`Bun adapter ready in < ${COLD_START_BUDGET_MS} ms`, async () => {
|
|
14
14
|
const median = await measureColdStartMedianMs();
|
|
15
|
-
console.log(
|
|
16
|
-
`cold-start median=${median.toFixed(2)} ms budget=${COLD_START_BUDGET_MS}`,
|
|
17
|
-
);
|
|
15
|
+
console.log(`cold-start median=${median.toFixed(2)} ms budget=${COLD_START_BUDGET_MS}`);
|
|
18
16
|
expect(median).toBeLessThan(COLD_START_BUDGET_MS);
|
|
19
17
|
});
|
|
20
18
|
});
|
|
@@ -3,10 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { afterEach, describe, expect, test } from "bun:test";
|
|
6
|
-
import {
|
|
7
|
-
isSilentDevRequest,
|
|
8
|
-
shouldLogDevRequests,
|
|
9
|
-
} from "./dev-request-log.ts";
|
|
6
|
+
import { isSilentDevRequest, shouldLogDevRequests } from "./dev-request-log.ts";
|
|
10
7
|
|
|
11
8
|
describe("dev-request-log", () => {
|
|
12
9
|
const prev = process.env.OKE_DEV_REQUEST_LOG;
|
|
@@ -103,10 +103,7 @@ export async function timedDevFetch(
|
|
|
103
103
|
handle: (request: Request) => Response | Promise<Response>,
|
|
104
104
|
options: {
|
|
105
105
|
readonly surface?: DevLogSurface;
|
|
106
|
-
readonly resolveFlow?: (
|
|
107
|
-
request: Request,
|
|
108
|
-
response: Response,
|
|
109
|
-
) => string | undefined;
|
|
106
|
+
readonly resolveFlow?: (request: Request, response: Response) => string | undefined;
|
|
110
107
|
/** Skip logging for this path/method. */
|
|
111
108
|
readonly silent?: (request: Request) => boolean;
|
|
112
109
|
} = {},
|
package/src/runtime/index.ts
CHANGED
|
@@ -2,12 +2,7 @@
|
|
|
2
2
|
* Runtime adapters: Bun (primary) · Web Standards (Node / Deno / edge).
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
export {
|
|
6
|
-
createBunRuntime,
|
|
7
|
-
buildBunRoutes,
|
|
8
|
-
isBunNativePath,
|
|
9
|
-
type BunRuntime,
|
|
10
|
-
} from "./bun.ts";
|
|
5
|
+
export { createBunRuntime, buildBunRoutes, isBunNativePath, type BunRuntime } from "./bun.ts";
|
|
11
6
|
|
|
12
7
|
export {
|
|
13
8
|
createEnv,
|
|
@@ -44,8 +44,8 @@ export function createTimers(): RuntimeTimers {
|
|
|
44
44
|
export function createEnv(): RuntimeEnv {
|
|
45
45
|
return {
|
|
46
46
|
get(key) {
|
|
47
|
-
const bunEnv = (globalThis as { Bun?: { env?: Record<string, string | undefined> } })
|
|
48
|
-
|
|
47
|
+
const bunEnv = (globalThis as { Bun?: { env?: Record<string, string | undefined> } }).Bun
|
|
48
|
+
?.env;
|
|
49
49
|
if (bunEnv && key in bunEnv) return bunEnv[key];
|
|
50
50
|
const proc = (globalThis as { process?: { env?: Record<string, string | undefined> } })
|
|
51
51
|
.process?.env;
|
|
@@ -70,8 +70,9 @@ export function createEnv(): RuntimeEnv {
|
|
|
70
70
|
export function createFiles(): RuntimeFiles {
|
|
71
71
|
return {
|
|
72
72
|
async read(path) {
|
|
73
|
-
const bun = (
|
|
74
|
-
|
|
73
|
+
const bun = (
|
|
74
|
+
globalThis as { Bun?: { file?(p: string): { arrayBuffer(): Promise<ArrayBuffer> } } }
|
|
75
|
+
).Bun;
|
|
75
76
|
if (bun?.file) {
|
|
76
77
|
return new Uint8Array(await bun.file(path).arrayBuffer());
|
|
77
78
|
}
|
package/src/runtime/security.ts
CHANGED
|
@@ -10,12 +10,7 @@
|
|
|
10
10
|
import type { ServeOptions } from "./types.ts";
|
|
11
11
|
|
|
12
12
|
/** Loopback names always accepted alongside the listen hostname. */
|
|
13
|
-
const LOOPBACK_HOSTS: readonly string[] = [
|
|
14
|
-
"localhost",
|
|
15
|
-
"127.0.0.1",
|
|
16
|
-
"::1",
|
|
17
|
-
"[::1]",
|
|
18
|
-
];
|
|
13
|
+
const LOOPBACK_HOSTS: readonly string[] = ["localhost", "127.0.0.1", "::1", "[::1]"];
|
|
19
14
|
|
|
20
15
|
/**
|
|
21
16
|
* Build the effective allow-list: loopback + listen hostname + user extras.
|
|
@@ -76,10 +71,7 @@ export function normalizeHost(raw: string): string {
|
|
|
76
71
|
* @param host - Normalized host
|
|
77
72
|
* @param allowed - Allow-list
|
|
78
73
|
*/
|
|
79
|
-
export function isHostAllowed(
|
|
80
|
-
host: string,
|
|
81
|
-
allowed: ReadonlySet<string>,
|
|
82
|
-
): boolean {
|
|
74
|
+
export function isHostAllowed(host: string, allowed: ReadonlySet<string>): boolean {
|
|
83
75
|
if (host.length === 0) return false;
|
|
84
76
|
if (allowed.has(host)) return true;
|
|
85
77
|
// Bracketed IPv6 sibling
|
|
@@ -138,9 +130,7 @@ export function checkRequestSecurity(
|
|
|
138
130
|
/** 403 body for a failed Host / Origin check. */
|
|
139
131
|
export function forbiddenResponse(reason: "host" | "origin"): Response {
|
|
140
132
|
const message =
|
|
141
|
-
reason === "host"
|
|
142
|
-
? "Forbidden: unexpected Host header"
|
|
143
|
-
: "Forbidden: unexpected Origin header";
|
|
133
|
+
reason === "host" ? "Forbidden: unexpected Host header" : "Forbidden: unexpected Origin header";
|
|
144
134
|
return new Response(message, {
|
|
145
135
|
status: 403,
|
|
146
136
|
headers: { "content-type": "text/plain; charset=utf-8" },
|
|
@@ -107,13 +107,10 @@ describe("Bun.serve — real HTTP", () => {
|
|
|
107
107
|
expect(await direct.text()).toContain("Host");
|
|
108
108
|
|
|
109
109
|
// On the wire — the DNS-rebinding shape (CVE-2025-66414 class).
|
|
110
|
-
const wire = await rawHttp(
|
|
111
|
-
|
|
112
|
-
"Host: attacker.com",
|
|
113
|
-
|
|
114
|
-
"",
|
|
115
|
-
"",
|
|
116
|
-
].join("\r\n"));
|
|
110
|
+
const wire = await rawHttp(
|
|
111
|
+
handle.port,
|
|
112
|
+
["GET /ping HTTP/1.1", "Host: attacker.com", "Connection: close", "", ""].join("\r\n"),
|
|
113
|
+
);
|
|
117
114
|
expect(wire).toContain("403");
|
|
118
115
|
expect(wire).toContain("Host");
|
|
119
116
|
});
|
package/src/runtime/types.ts
CHANGED
|
@@ -151,10 +151,7 @@ export interface RuntimeCrypto {
|
|
|
151
151
|
* @param password - Plaintext
|
|
152
152
|
* @param algorithm - Hash algorithm (Bun default `argon2id`)
|
|
153
153
|
*/
|
|
154
|
-
hashPassword(
|
|
155
|
-
password: string,
|
|
156
|
-
algorithm?: PasswordAlgorithm,
|
|
157
|
-
): Promise<string>;
|
|
154
|
+
hashPassword(password: string, algorithm?: PasswordAlgorithm): Promise<string>;
|
|
158
155
|
/**
|
|
159
156
|
* Verify a password against a hash from {@link RuntimeCrypto.hashPassword}.
|
|
160
157
|
*
|
|
@@ -13,12 +13,7 @@
|
|
|
13
13
|
* Host / Origin validation is identical to the Bun adapter (console §10.1).
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
-
import {
|
|
17
|
-
createEnv,
|
|
18
|
-
createFiles,
|
|
19
|
-
createTimers,
|
|
20
|
-
createWebCrypto,
|
|
21
|
-
} from "./primitives.ts";
|
|
16
|
+
import { createEnv, createFiles, createTimers, createWebCrypto } from "./primitives.ts";
|
|
22
17
|
import { secureFetch } from "./security.ts";
|
|
23
18
|
import {
|
|
24
19
|
APP_PORT,
|
|
@@ -50,17 +45,10 @@ export function createWebStandardRuntime(): Runtime {
|
|
|
50
45
|
* @param app - Application
|
|
51
46
|
* @param options - Port/hostname metadata + `allowedHosts`
|
|
52
47
|
*/
|
|
53
|
-
function createFetchHandle(
|
|
54
|
-
app: FetchApp,
|
|
55
|
-
options?: ServeOptions,
|
|
56
|
-
): ServerHandle {
|
|
48
|
+
function createFetchHandle(app: FetchApp, options?: ServeOptions): ServerHandle {
|
|
57
49
|
const port = options?.port ?? APP_PORT;
|
|
58
50
|
const hostname = options?.hostname ?? "127.0.0.1";
|
|
59
|
-
const fetchHandler = secureFetch(
|
|
60
|
-
(req) => app.fetch(req),
|
|
61
|
-
options,
|
|
62
|
-
hostname,
|
|
63
|
-
);
|
|
51
|
+
const fetchHandler = secureFetch((req) => app.fetch(req), options, hostname);
|
|
64
52
|
const url = new URL(
|
|
65
53
|
`http://${hostname.includes(":") && !hostname.startsWith("[") ? `[${hostname}]` : hostname}:${port}/`,
|
|
66
54
|
);
|
package/src/term.test.ts
CHANGED
|
@@ -34,7 +34,7 @@ describe("term", () => {
|
|
|
34
34
|
const out = formatDevBanner({
|
|
35
35
|
color: false,
|
|
36
36
|
version: "0.2.4",
|
|
37
|
-
profile: "
|
|
37
|
+
profile: "docker",
|
|
38
38
|
runtimeEnv: "local",
|
|
39
39
|
system: "darwin 25.4.0 · bun 1.3.14",
|
|
40
40
|
elements: [
|
|
@@ -45,7 +45,7 @@ describe("term", () => {
|
|
|
45
45
|
});
|
|
46
46
|
expect(out).toContain("oke dev v0.2.4");
|
|
47
47
|
expect(out).toContain("profile");
|
|
48
|
-
expect(out).toContain("
|
|
48
|
+
expect(out).toContain("docker");
|
|
49
49
|
expect(out).toContain("env");
|
|
50
50
|
expect(out).toContain("local");
|
|
51
51
|
expect(out).toContain("system");
|
|
@@ -62,9 +62,7 @@ describe("term", () => {
|
|
|
62
62
|
expect(formatServiceLine("Console", "http://127.0.0.1:6533", false)).toContain(
|
|
63
63
|
"http://127.0.0.1:6533",
|
|
64
64
|
);
|
|
65
|
-
expect(formatAppReadyLine("http://127.0.0.1:6530", false)).toContain(
|
|
66
|
-
"http://127.0.0.1:6530",
|
|
67
|
-
);
|
|
65
|
+
expect(formatAppReadyLine("http://127.0.0.1:6530", false)).toContain("http://127.0.0.1:6530");
|
|
68
66
|
});
|
|
69
67
|
|
|
70
68
|
test("formatDevHero keeps App Console MCP URLs", () => {
|
|
@@ -137,7 +135,7 @@ describe("term", () => {
|
|
|
137
135
|
appDrivers: ["postgres", "redis"],
|
|
138
136
|
color: false,
|
|
139
137
|
});
|
|
140
|
-
expect(out).toContain("
|
|
138
|
+
expect(out).toContain("Docker");
|
|
141
139
|
expect(out).toContain(":15975");
|
|
142
140
|
expect(out).not.toMatch(/\u001b\[/);
|
|
143
141
|
});
|