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/auth/operator.ts
CHANGED
|
@@ -8,11 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
|
|
10
10
|
import { createBunCrypto } from "../runtime/primitives.ts";
|
|
11
|
-
import type {
|
|
12
|
-
OperatorCredentialRow,
|
|
13
|
-
OperatorRow,
|
|
14
|
-
OperatorSsoLinkRow,
|
|
15
|
-
} from "./tables.ts";
|
|
11
|
+
import type { OperatorCredentialRow, OperatorRow, OperatorSsoLinkRow } from "./tables.ts";
|
|
16
12
|
|
|
17
13
|
/** Operator-plane store. */
|
|
18
14
|
export interface OperatorStore {
|
|
@@ -82,15 +78,10 @@ export async function createOperator(
|
|
|
82
78
|
* @param store - Operator store
|
|
83
79
|
* @param operatorId - Operator id
|
|
84
80
|
*/
|
|
85
|
-
export function removeOperatorCredential(
|
|
86
|
-
store: OperatorStore,
|
|
87
|
-
operatorId: string,
|
|
88
|
-
): never {
|
|
81
|
+
export function removeOperatorCredential(store: OperatorStore, operatorId: string): never {
|
|
89
82
|
void store;
|
|
90
83
|
void operatorId;
|
|
91
|
-
throw new OperatorError(
|
|
92
|
-
"operator local credential cannot be removed; SSO is additive only",
|
|
93
|
-
);
|
|
84
|
+
throw new OperatorError("operator local credential cannot be removed; SSO is additive only");
|
|
94
85
|
}
|
|
95
86
|
|
|
96
87
|
/**
|
|
@@ -111,9 +102,7 @@ export function linkOperatorSso(
|
|
|
111
102
|
throw new OperatorError(`unknown operator: ${operatorId}`);
|
|
112
103
|
}
|
|
113
104
|
if (!store.credentials.has(operatorId)) {
|
|
114
|
-
throw new OperatorError(
|
|
115
|
-
"operator is missing local credential — invariant violated",
|
|
116
|
-
);
|
|
105
|
+
throw new OperatorError("operator is missing local credential — invariant violated");
|
|
117
106
|
}
|
|
118
107
|
const link: OperatorSsoLinkRow = { operatorId, provider, subject };
|
|
119
108
|
const list = store.ssoLinks.get(operatorId) ?? [];
|
|
@@ -128,14 +117,9 @@ export function linkOperatorSso(
|
|
|
128
117
|
*/
|
|
129
118
|
let dummyPasswordHash: string | null = null;
|
|
130
119
|
|
|
131
|
-
async function dummyHash(
|
|
132
|
-
crypto: ReturnType<typeof createBunCrypto>,
|
|
133
|
-
): Promise<string> {
|
|
120
|
+
async function dummyHash(crypto: ReturnType<typeof createBunCrypto>): Promise<string> {
|
|
134
121
|
if (dummyPasswordHash === null) {
|
|
135
|
-
dummyPasswordHash = await crypto.hashPassword(
|
|
136
|
-
"oke-operator-timing-dummy",
|
|
137
|
-
"argon2id",
|
|
138
|
-
);
|
|
122
|
+
dummyPasswordHash = await crypto.hashPassword("oke-operator-timing-dummy", "argon2id");
|
|
139
123
|
}
|
|
140
124
|
return dummyPasswordHash;
|
|
141
125
|
}
|
|
@@ -157,10 +141,8 @@ export async function authenticateOperator(
|
|
|
157
141
|
): Promise<OperatorRow | null> {
|
|
158
142
|
const crypto = createBunCrypto();
|
|
159
143
|
const op = [...store.operators.values()].find((o) => o.email === email);
|
|
160
|
-
const cred =
|
|
161
|
-
|
|
162
|
-
const hash =
|
|
163
|
-
cred && cred.loginEnabled ? cred.passwordHash : await dummyHash(crypto);
|
|
144
|
+
const cred = op && op.status === "active" ? store.credentials.get(op.id) : undefined;
|
|
145
|
+
const hash = cred && cred.loginEnabled ? cred.passwordHash : await dummyHash(crypto);
|
|
164
146
|
const ok = await crypto.verifyPassword(password, hash);
|
|
165
147
|
if (!ok || !op || !cred || !cred.loginEnabled || op.status !== "active") {
|
|
166
148
|
return null;
|
package/src/auth/planes.ts
CHANGED
|
@@ -81,14 +81,9 @@ export function operatorPrincipal(fields: {
|
|
|
81
81
|
* @param principal - Acting principal
|
|
82
82
|
* @param flowPlane - Target flow plane
|
|
83
83
|
*/
|
|
84
|
-
export function assertPlaneAccess(
|
|
85
|
-
principal: Principal,
|
|
86
|
-
flowPlane: AuthPlane,
|
|
87
|
-
): void {
|
|
84
|
+
export function assertPlaneAccess(principal: Principal, flowPlane: AuthPlane): void {
|
|
88
85
|
if (principal.plane === "user" && flowPlane === "operator") {
|
|
89
|
-
throw new CrossPlaneError(
|
|
90
|
-
"application principal cannot reach a console (operator) flow",
|
|
91
|
-
);
|
|
86
|
+
throw new CrossPlaneError("application principal cannot reach a console (operator) flow");
|
|
92
87
|
}
|
|
93
88
|
}
|
|
94
89
|
|
package/src/auth/plugin.ts
CHANGED
|
@@ -23,15 +23,12 @@ export interface AuthPluginOptions {
|
|
|
23
23
|
* @param options - Session crypto options
|
|
24
24
|
*/
|
|
25
25
|
export function auth(options: AuthPluginOptions = {}): PluginDef {
|
|
26
|
-
let builder = plugin("auth", { version: "0.0.1", config: options }).hook(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
/* principals resolved by session / API key middleware at runtime */
|
|
30
|
-
},
|
|
31
|
-
);
|
|
26
|
+
let builder = plugin("auth", { version: "0.0.1", config: options }).hook("onAuth", (_ctx) => {
|
|
27
|
+
/* principals resolved by session / API key middleware at runtime */
|
|
28
|
+
});
|
|
32
29
|
|
|
33
30
|
for (const name of Object.values(AUTH_TABLES)) {
|
|
34
|
-
builder = builder.table(name, {
|
|
31
|
+
builder = builder.table(name, undefined, {
|
|
35
32
|
plane: name.includes("operator")
|
|
36
33
|
? "operator"
|
|
37
34
|
: name.includes("identit") || name === AUTH_TABLES.credentials
|
package/src/auth/roles.ts
CHANGED
|
@@ -38,11 +38,7 @@ export function upsertRole(store: RoleStore, role: RoleRow): void {
|
|
|
38
38
|
* @param roleId - Role id
|
|
39
39
|
* @param actions - Module:Action pairs
|
|
40
40
|
*/
|
|
41
|
-
export function setRoleGrants(
|
|
42
|
-
store: RoleStore,
|
|
43
|
-
roleId: string,
|
|
44
|
-
actions: readonly string[],
|
|
45
|
-
): void {
|
|
41
|
+
export function setRoleGrants(store: RoleStore, roleId: string, actions: readonly string[]): void {
|
|
46
42
|
if (!store.roles.has(roleId)) {
|
|
47
43
|
throw new Error(`unknown role: ${roleId}`);
|
|
48
44
|
}
|
package/src/auth/sessions.ts
CHANGED
|
@@ -229,10 +229,7 @@ const sessionAudiences = new Map<string, string>();
|
|
|
229
229
|
* @param sessionId - Session id
|
|
230
230
|
* @param scopes - Scopes
|
|
231
231
|
*/
|
|
232
|
-
export function bindSessionScopes(
|
|
233
|
-
sessionId: string,
|
|
234
|
-
scopes: Iterable<string>,
|
|
235
|
-
): void {
|
|
232
|
+
export function bindSessionScopes(sessionId: string, scopes: Iterable<string>): void {
|
|
236
233
|
sessionScopes.set(sessionId, [...scopes]);
|
|
237
234
|
}
|
|
238
235
|
|
|
@@ -242,10 +239,7 @@ export function bindSessionScopes(
|
|
|
242
239
|
* @param sessionId - Session id
|
|
243
240
|
* @param audience - Audience claim
|
|
244
241
|
*/
|
|
245
|
-
export function bindSessionAudience(
|
|
246
|
-
sessionId: string,
|
|
247
|
-
audience: string,
|
|
248
|
-
): void {
|
|
242
|
+
export function bindSessionAudience(sessionId: string, audience: string): void {
|
|
249
243
|
sessionAudiences.set(sessionId, audience);
|
|
250
244
|
}
|
|
251
245
|
|
|
@@ -292,9 +286,7 @@ export async function verifyAccess(
|
|
|
292
286
|
nowOrOptions: (() => number) | VerifyAccessOptions = () => Date.now(),
|
|
293
287
|
): Promise<AccessClaims> {
|
|
294
288
|
const options: VerifyAccessOptions =
|
|
295
|
-
typeof nowOrOptions === "function"
|
|
296
|
-
? { now: nowOrOptions }
|
|
297
|
-
: nowOrOptions;
|
|
289
|
+
typeof nowOrOptions === "function" ? { now: nowOrOptions } : nowOrOptions;
|
|
298
290
|
const now = options.now ?? (() => Date.now());
|
|
299
291
|
const claims = await verifyAccessSignature(secret, token);
|
|
300
292
|
if (claims.exp <= now()) {
|
|
@@ -302,9 +294,7 @@ export async function verifyAccess(
|
|
|
302
294
|
}
|
|
303
295
|
if (options.audience !== undefined) {
|
|
304
296
|
if (claims.aud !== options.audience) {
|
|
305
|
-
throw new SessionError(
|
|
306
|
-
`access token audience mismatch: expected ${options.audience}`,
|
|
307
|
-
);
|
|
297
|
+
throw new SessionError(`access token audience mismatch: expected ${options.audience}`);
|
|
308
298
|
}
|
|
309
299
|
}
|
|
310
300
|
const session = store.sessions.get(claims.sid);
|
|
@@ -325,11 +315,7 @@ export async function verifyAccess(
|
|
|
325
315
|
* @param familyId - Family id
|
|
326
316
|
* @param at - Timestamp
|
|
327
317
|
*/
|
|
328
|
-
export function revokeFamily(
|
|
329
|
-
store: SessionStore,
|
|
330
|
-
familyId: string,
|
|
331
|
-
at: number = Date.now(),
|
|
332
|
-
): void {
|
|
318
|
+
export function revokeFamily(store: SessionStore, familyId: string, at: number = Date.now()): void {
|
|
333
319
|
for (const session of store.sessions.values()) {
|
|
334
320
|
if (session.familyId === familyId) session.revokedAt = at;
|
|
335
321
|
}
|
|
@@ -348,23 +334,15 @@ export class SessionError extends Error {
|
|
|
348
334
|
}
|
|
349
335
|
|
|
350
336
|
async function hashToken(raw: string): Promise<string> {
|
|
351
|
-
const digest = await crypto.subtle.digest(
|
|
352
|
-
|
|
353
|
-
new TextEncoder().encode(raw),
|
|
354
|
-
);
|
|
355
|
-
return [...new Uint8Array(digest)]
|
|
356
|
-
.map((b) => b.toString(16).padStart(2, "0"))
|
|
357
|
-
.join("");
|
|
337
|
+
const digest = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(raw));
|
|
338
|
+
return [...new Uint8Array(digest)].map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
358
339
|
}
|
|
359
340
|
|
|
360
341
|
function cryptoRandomId(): string {
|
|
361
342
|
return crypto.randomUUID().replace(/-/g, "");
|
|
362
343
|
}
|
|
363
344
|
|
|
364
|
-
async function signAccess(
|
|
365
|
-
secret: string,
|
|
366
|
-
claims: AccessClaims,
|
|
367
|
-
): Promise<string> {
|
|
345
|
+
async function signAccess(secret: string, claims: AccessClaims): Promise<string> {
|
|
368
346
|
const header = b64url(JSON.stringify({ alg: "HS256", typ: "JWT" }));
|
|
369
347
|
const payload = b64url(JSON.stringify(claims));
|
|
370
348
|
const data = `${header}.${payload}`;
|
|
@@ -372,10 +350,7 @@ async function signAccess(
|
|
|
372
350
|
return `${data}.${sig}`;
|
|
373
351
|
}
|
|
374
352
|
|
|
375
|
-
async function verifyAccessSignature(
|
|
376
|
-
secret: string,
|
|
377
|
-
token: string,
|
|
378
|
-
): Promise<AccessClaims> {
|
|
353
|
+
async function verifyAccessSignature(secret: string, token: string): Promise<AccessClaims> {
|
|
379
354
|
const parts = token.split(".");
|
|
380
355
|
if (parts.length !== 3) throw new SessionError("malformed access token");
|
|
381
356
|
const [header, payload, sig] = parts as [string, string, string];
|
|
@@ -393,11 +368,7 @@ async function hmac(secret: string, data: string): Promise<string> {
|
|
|
393
368
|
false,
|
|
394
369
|
["sign"],
|
|
395
370
|
);
|
|
396
|
-
const sig = await crypto.subtle.sign(
|
|
397
|
-
"HMAC",
|
|
398
|
-
key,
|
|
399
|
-
new TextEncoder().encode(data),
|
|
400
|
-
);
|
|
371
|
+
const sig = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(data));
|
|
401
372
|
return b64urlBytes(new Uint8Array(sig));
|
|
402
373
|
}
|
|
403
374
|
|
package/src/cli/args.ts
CHANGED
|
@@ -41,10 +41,6 @@ export function flagValue(
|
|
|
41
41
|
* @param long - Long flag
|
|
42
42
|
* @param short - Optional short flag
|
|
43
43
|
*/
|
|
44
|
-
export function hasFlag(
|
|
45
|
-
args: readonly string[],
|
|
46
|
-
long: string,
|
|
47
|
-
short?: string,
|
|
48
|
-
): boolean {
|
|
44
|
+
export function hasFlag(args: readonly string[], long: string, short?: string): boolean {
|
|
49
45
|
return args.includes(long) || (short !== undefined && args.includes(short));
|
|
50
46
|
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-time interactive `oke dev` mode choice via `@clack/prompts`.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { isCancel, select } from "@clack/prompts";
|
|
6
|
+
import type { DevMode } from "./dev-mode.ts";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Injectable ask step — production uses {@link askDevMode}.
|
|
10
|
+
*
|
|
11
|
+
* @returns Chosen mode, or `null` if the user cancelled
|
|
12
|
+
*/
|
|
13
|
+
export type AskDevModeFn = () => Promise<DevMode | null>;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Prompt once: local vs docker.
|
|
17
|
+
*
|
|
18
|
+
* @returns Chosen mode, or `null` on cancel
|
|
19
|
+
*/
|
|
20
|
+
export async function askDevMode(): Promise<DevMode | null> {
|
|
21
|
+
const value = await select({
|
|
22
|
+
message: "Run against",
|
|
23
|
+
options: [
|
|
24
|
+
{
|
|
25
|
+
value: "local",
|
|
26
|
+
label: "local",
|
|
27
|
+
hint: "sqlite file, instant, no Docker needed",
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
value: "docker",
|
|
31
|
+
label: "docker",
|
|
32
|
+
hint: "real Postgres/Redis via compose, closer to production",
|
|
33
|
+
},
|
|
34
|
+
],
|
|
35
|
+
initialValue: "local",
|
|
36
|
+
});
|
|
37
|
+
if (isCancel(value)) return null;
|
|
38
|
+
if (value === "local" || value === "docker") return value;
|
|
39
|
+
return null;
|
|
40
|
+
}
|
package/src/cli/build.ts
CHANGED
|
@@ -26,8 +26,7 @@ export async function runBuild(options: BuildOptions = {}): Promise<number> {
|
|
|
26
26
|
const target = options.target ?? "bun";
|
|
27
27
|
const entry = options.entry ?? "src/app.ts";
|
|
28
28
|
const outdir = options.outdir ?? "dist";
|
|
29
|
-
const bunTarget =
|
|
30
|
-
target === "edge" ? "browser" : target === "node" ? "node" : "bun";
|
|
29
|
+
const bunTarget = target === "edge" ? "browser" : target === "node" ? "node" : "bun";
|
|
31
30
|
|
|
32
31
|
const bundle =
|
|
33
32
|
options.bundle ??
|
|
@@ -6,10 +6,7 @@ import { describe, expect, test } from "bun:test";
|
|
|
6
6
|
import { mkdtemp } from "node:fs/promises";
|
|
7
7
|
import { tmpdir } from "node:os";
|
|
8
8
|
import { join } from "node:path";
|
|
9
|
-
import {
|
|
10
|
-
clientAdd,
|
|
11
|
-
emitAmbient,
|
|
12
|
-
} from "./client-add.ts";
|
|
9
|
+
import { clientAdd, emitAmbient } from "./client-add.ts";
|
|
13
10
|
import type { ClientDescriptor } from "../client/types.ts";
|
|
14
11
|
|
|
15
12
|
const fixture: ClientDescriptor = {
|
|
@@ -72,10 +69,7 @@ void seats;
|
|
|
72
69
|
// Minimal stub so `import type { Register }` resolves.
|
|
73
70
|
const stubDir = join(dir, "node_modules/okengine");
|
|
74
71
|
await Bun.$`mkdir -p ${stubDir}`.quiet();
|
|
75
|
-
await Bun.write(
|
|
76
|
-
join(stubDir, "client.d.ts"),
|
|
77
|
-
`export interface Register {}\n`,
|
|
78
|
-
);
|
|
72
|
+
await Bun.write(join(stubDir, "client.d.ts"), `export interface Register {}\n`);
|
|
79
73
|
await Bun.write(
|
|
80
74
|
join(stubDir, "package.json"),
|
|
81
75
|
JSON.stringify({
|
|
@@ -102,10 +96,11 @@ void seats;
|
|
|
102
96
|
}),
|
|
103
97
|
);
|
|
104
98
|
|
|
105
|
-
const proc = Bun.spawn(
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
99
|
+
const proc = Bun.spawn(["bunx", "tsc", "--project", tsconfig], {
|
|
100
|
+
cwd: dir,
|
|
101
|
+
stdout: "pipe",
|
|
102
|
+
stderr: "pipe",
|
|
103
|
+
});
|
|
109
104
|
const [stdout, stderr, code] = await Promise.all([
|
|
110
105
|
new Response(proc.stdout).text(),
|
|
111
106
|
new Response(proc.stderr).text(),
|
|
@@ -113,9 +108,7 @@ void seats;
|
|
|
113
108
|
]);
|
|
114
109
|
|
|
115
110
|
if (code !== 0) {
|
|
116
|
-
throw new Error(
|
|
117
|
-
`tsc failed (${code})\n${stdout}\n${stderr}\n--- d.ts ---\n${result.source}`,
|
|
118
|
-
);
|
|
111
|
+
throw new Error(`tsc failed (${code})\n${stdout}\n${stderr}\n--- d.ts ---\n${result.source}`);
|
|
119
112
|
}
|
|
120
113
|
});
|
|
121
114
|
|
package/src/cli/client-add.ts
CHANGED
|
@@ -32,12 +32,9 @@ export interface ClientAddResult {
|
|
|
32
32
|
*
|
|
33
33
|
* @param options - URL / out / test overrides
|
|
34
34
|
*/
|
|
35
|
-
export async function clientAdd(
|
|
36
|
-
options: ClientAddOptions,
|
|
37
|
-
): Promise<ClientAddResult> {
|
|
35
|
+
export async function clientAdd(options: ClientAddOptions): Promise<ClientAddResult> {
|
|
38
36
|
const out = options.out ?? "oke-client.d.ts";
|
|
39
|
-
const descriptor =
|
|
40
|
-
options.descriptor ?? (await fetchDescriptor(options.url, options.fetch));
|
|
37
|
+
const descriptor = options.descriptor ?? (await fetchDescriptor(options.url, options.fetch));
|
|
41
38
|
const source = emitAmbient(descriptor);
|
|
42
39
|
await Bun.write(out, source);
|
|
43
40
|
return { out, source };
|
|
@@ -102,12 +99,8 @@ export function emitAmbient(descriptor: ClientDescriptor): string {
|
|
|
102
99
|
` in: ${c.in ?? "unknown"};`,
|
|
103
100
|
` out: ${c.out ?? "unknown"};`,
|
|
104
101
|
errorBlock,
|
|
105
|
-
c.method
|
|
106
|
-
|
|
107
|
-
: undefined,
|
|
108
|
-
c.path
|
|
109
|
-
? ` path: ${JSON.stringify(c.path)};`
|
|
110
|
-
: undefined,
|
|
102
|
+
c.method ? ` method: ${JSON.stringify(c.method)};` : undefined,
|
|
103
|
+
c.path ? ` path: ${JSON.stringify(c.path)};` : undefined,
|
|
111
104
|
` }`,
|
|
112
105
|
]
|
|
113
106
|
.filter((line): line is string => line !== undefined)
|
|
@@ -147,9 +140,7 @@ async function fetchDescriptor(
|
|
|
147
140
|
const base = url.replace(/\/+$/, "");
|
|
148
141
|
const res = await fetchFn(`${base}/_oke/client.json`);
|
|
149
142
|
if (!res.ok) {
|
|
150
|
-
throw new Error(
|
|
151
|
-
`Failed to fetch ${base}/_oke/client.json (${res.status})`,
|
|
152
|
-
);
|
|
143
|
+
throw new Error(`Failed to fetch ${base}/_oke/client.json (${res.status})`);
|
|
153
144
|
}
|
|
154
145
|
const json: unknown = await res.json();
|
|
155
146
|
if (
|
|
@@ -4,11 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { describe, expect, test } from "bun:test";
|
|
6
6
|
import { generateCompletion } from "./completion.ts";
|
|
7
|
-
import {
|
|
8
|
-
OKE_COMMANDS,
|
|
9
|
-
commandNames,
|
|
10
|
-
type CliCommand,
|
|
11
|
-
} from "./registry.ts";
|
|
7
|
+
import { OKE_COMMANDS, commandNames, type CliCommand } from "./registry.ts";
|
|
12
8
|
|
|
13
9
|
describe("oke completion", () => {
|
|
14
10
|
test("bash script lists every registry command", () => {
|
package/src/cli/completion.ts
CHANGED
|
@@ -3,12 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { EXIT_OK, EXIT_USAGE } from "./exit.ts";
|
|
6
|
-
import {
|
|
7
|
-
OKE_COMMANDS,
|
|
8
|
-
commandNames,
|
|
9
|
-
type CliCommand,
|
|
10
|
-
type CliFlag,
|
|
11
|
-
} from "./registry.ts";
|
|
6
|
+
import { OKE_COMMANDS, commandNames, type CliCommand, type CliFlag } from "./registry.ts";
|
|
12
7
|
|
|
13
8
|
/** Supported completion shells. */
|
|
14
9
|
export const COMPLETION_SHELLS = ["bash", "zsh", "fish"] as const;
|
|
@@ -63,9 +58,7 @@ Install:
|
|
|
63
58
|
|
|
64
59
|
const shell = args[0];
|
|
65
60
|
if (!shell || !isCompletionShell(shell)) {
|
|
66
|
-
console.error(
|
|
67
|
-
"oke completion: require bash, zsh, or fish — e.g. oke completion zsh",
|
|
68
|
-
);
|
|
61
|
+
console.error("oke completion: require bash, zsh, or fish — e.g. oke completion zsh");
|
|
69
62
|
return EXIT_USAGE;
|
|
70
63
|
}
|
|
71
64
|
|
|
@@ -223,9 +216,7 @@ function fishScript(commands: readonly CliCommand[]): string {
|
|
|
223
216
|
`complete -c oke -f -n "not __fish_seen_subcommand_from ${names}" -a "${cmd.name}" -d ${fishQuote(cmd.summary)}`,
|
|
224
217
|
);
|
|
225
218
|
}
|
|
226
|
-
rebuilt.push(
|
|
227
|
-
`complete -c oke -f -n "__fish_seen_subcommand_from completion" -a "bash zsh fish"`,
|
|
228
|
-
);
|
|
219
|
+
rebuilt.push(`complete -c oke -f -n "__fish_seen_subcommand_from completion" -a "bash zsh fish"`);
|
|
229
220
|
for (const cmd of commands) {
|
|
230
221
|
const subs = cmd.subcommands ?? [];
|
|
231
222
|
if (subs.length === 0) {
|
|
@@ -248,11 +239,7 @@ function fishScript(commands: readonly CliCommand[]): string {
|
|
|
248
239
|
return `${rebuilt.join("\n")}\n`;
|
|
249
240
|
}
|
|
250
241
|
|
|
251
|
-
function fishFlagLine(
|
|
252
|
-
command: string,
|
|
253
|
-
sub: string | undefined,
|
|
254
|
-
flag: CliFlag,
|
|
255
|
-
): string {
|
|
242
|
+
function fishFlagLine(command: string, sub: string | undefined, flag: CliFlag): string {
|
|
256
243
|
const seen = sub
|
|
257
244
|
? `__fish_seen_subcommand_from ${command}; and __fish_seen_subcommand_from ${sub}`
|
|
258
245
|
: `__fish_seen_subcommand_from ${command}`;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Domain schema watch-path + auto-push policy.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, expect, test } from "bun:test";
|
|
6
|
+
import {
|
|
7
|
+
createDebouncedRunner,
|
|
8
|
+
isDomainSchemaWatchPath,
|
|
9
|
+
resolveDevAutoPush,
|
|
10
|
+
} from "./db-auto-push.ts";
|
|
11
|
+
|
|
12
|
+
describe("isDomainSchemaWatchPath", () => {
|
|
13
|
+
test("matches schema.ts and drizzle.config.ts", () => {
|
|
14
|
+
expect(isDomainSchemaWatchPath("schema.ts")).toBe(true);
|
|
15
|
+
expect(isDomainSchemaWatchPath("drizzle.config.ts")).toBe(true);
|
|
16
|
+
expect(isDomainSchemaWatchPath("flows/notes/schema.ts")).toBe(true);
|
|
17
|
+
expect(isDomainSchemaWatchPath("src/schema.decl.ts")).toBe(true);
|
|
18
|
+
expect(isDomainSchemaWatchPath("src/schema.generated.ts")).toBe(true);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
test("ignores unrelated files", () => {
|
|
22
|
+
expect(isDomainSchemaWatchPath("flows/notes/index.ts")).toBe(false);
|
|
23
|
+
expect(isDomainSchemaWatchPath(undefined)).toBe(false);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
test("matches app entry (plugin .table contributions)", () => {
|
|
27
|
+
expect(isDomainSchemaWatchPath("app.ts")).toBe(true);
|
|
28
|
+
expect(isDomainSchemaWatchPath("src/app.ts")).toBe(true);
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
describe("resolveDevAutoPush", () => {
|
|
33
|
+
test("default on for local", () => {
|
|
34
|
+
expect(resolveDevAutoPush({})).toBe(true);
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("off for docker", () => {
|
|
38
|
+
expect(resolveDevAutoPush({ docker: true })).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("off for --no-db-push", () => {
|
|
42
|
+
expect(resolveDevAutoPush({ noDbPush: true })).toBe(false);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("off when config.db.autoPush is false", () => {
|
|
46
|
+
expect(resolveDevAutoPush({ configAutoPush: false })).toBe(false);
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
describe("createDebouncedRunner", () => {
|
|
51
|
+
test("coalesces rapid triggers", async () => {
|
|
52
|
+
let count = 0;
|
|
53
|
+
const runner = createDebouncedRunner(() => {
|
|
54
|
+
count++;
|
|
55
|
+
}, 40);
|
|
56
|
+
runner.trigger();
|
|
57
|
+
runner.trigger();
|
|
58
|
+
runner.trigger();
|
|
59
|
+
expect(count).toBe(0);
|
|
60
|
+
await Bun.sleep(80);
|
|
61
|
+
expect(count).toBe(1);
|
|
62
|
+
runner.cancel();
|
|
63
|
+
});
|
|
64
|
+
});
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debounced domain-schema auto-push for `oke dev` (local mode).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { basename } from "node:path";
|
|
6
|
+
|
|
7
|
+
/** Default debounce for schema-change → push. */
|
|
8
|
+
export const DB_AUTO_PUSH_DEBOUNCE_MS = 300;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Whether a watched path should trigger `oke db push`.
|
|
12
|
+
*
|
|
13
|
+
* @param filename - Relative path from the watcher (may be undefined)
|
|
14
|
+
*/
|
|
15
|
+
export function isDomainSchemaWatchPath(filename: string | null | undefined): boolean {
|
|
16
|
+
if (!filename) return false;
|
|
17
|
+
const normalized = filename.replace(/\\/g, "/");
|
|
18
|
+
const base = basename(normalized);
|
|
19
|
+
if (base === "schema.ts" || base === "schema.tsx") return true;
|
|
20
|
+
if (base === "schema.decl.ts" || base === "schema.decl.tsx") return true;
|
|
21
|
+
if (base === "schema.generated.ts" || base === "schema.generated.tsx") return true;
|
|
22
|
+
if (base === "drizzle.config.ts" || base === "drizzle.config.js") return true;
|
|
23
|
+
// App entry / plugins — `.plug()` table contributions feed emit.
|
|
24
|
+
if (base === "app.ts" || base === "app.tsx") return true;
|
|
25
|
+
// Nested domain schemas commonly live under src/**/schema.ts
|
|
26
|
+
if (/(^|\/)schema(\.decl|\.generated)?\.tsx?$/.test(normalized)) return true;
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Resolve whether auto-push is enabled for this `oke dev` session.
|
|
32
|
+
*
|
|
33
|
+
* @param options - Explicit CLI opt-out, config, docker mode
|
|
34
|
+
*/
|
|
35
|
+
export function resolveDevAutoPush(options: {
|
|
36
|
+
readonly noDbPush?: boolean;
|
|
37
|
+
readonly docker?: boolean;
|
|
38
|
+
readonly configAutoPush?: boolean;
|
|
39
|
+
}): boolean {
|
|
40
|
+
if (options.docker) return false;
|
|
41
|
+
if (options.noDbPush) return false;
|
|
42
|
+
return options.configAutoPush !== false;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Create a debounced callback runner.
|
|
47
|
+
*
|
|
48
|
+
* @param fn - Async work
|
|
49
|
+
* @param ms - Debounce window
|
|
50
|
+
*/
|
|
51
|
+
export function createDebouncedRunner(
|
|
52
|
+
fn: () => void | Promise<void>,
|
|
53
|
+
ms = DB_AUTO_PUSH_DEBOUNCE_MS,
|
|
54
|
+
): {
|
|
55
|
+
readonly trigger: () => void;
|
|
56
|
+
readonly cancel: () => void;
|
|
57
|
+
} {
|
|
58
|
+
let timer: ReturnType<typeof setTimeout> | null = null;
|
|
59
|
+
return {
|
|
60
|
+
trigger() {
|
|
61
|
+
if (timer) clearTimeout(timer);
|
|
62
|
+
timer = setTimeout(() => {
|
|
63
|
+
timer = null;
|
|
64
|
+
void fn();
|
|
65
|
+
}, ms);
|
|
66
|
+
},
|
|
67
|
+
cancel() {
|
|
68
|
+
if (timer) clearTimeout(timer);
|
|
69
|
+
timer = null;
|
|
70
|
+
},
|
|
71
|
+
};
|
|
72
|
+
}
|