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/elements/vault.ts
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Vault element — protected knowledge.
|
|
3
3
|
*
|
|
4
4
|
* Physics: secrets · config · environment.
|
|
5
|
-
* Drivers: `
|
|
5
|
+
* Drivers: `env` · `openbao` · `infisical` · `managed`.
|
|
6
6
|
*
|
|
7
7
|
* A declaration is a contract, never a value. Boot validates every contract
|
|
8
8
|
* and lists all gaps at once. Logs/traces receive fingerprints and redaction
|
|
@@ -12,15 +12,12 @@
|
|
|
12
12
|
|
|
13
13
|
export {
|
|
14
14
|
vault,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
} from "./vault/declare.ts";
|
|
20
|
-
export type {
|
|
21
|
-
VaultSecretDecl,
|
|
22
|
-
VaultSecretOptions,
|
|
15
|
+
fromDocker,
|
|
16
|
+
FROM_DOCKER_PREFIX,
|
|
17
|
+
isFromDocker,
|
|
18
|
+
fromDockerRole,
|
|
23
19
|
} from "./vault/declare.ts";
|
|
20
|
+
export type { VaultSecretDecl, VaultSecretOptions } from "./vault/declare.ts";
|
|
24
21
|
|
|
25
22
|
export {
|
|
26
23
|
createVaultRuntime,
|
|
@@ -37,9 +34,8 @@ export type {
|
|
|
37
34
|
VaultRuntime,
|
|
38
35
|
} from "./vault/runtime.ts";
|
|
39
36
|
|
|
40
|
-
export {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
} from "./vault/fingerprint.ts";
|
|
37
|
+
export { COMPOSE_ENV_REL, resolveComposeEnvPath } from "./vault/chain.ts";
|
|
38
|
+
|
|
39
|
+
export { fingerprintSecret, fingerprintSecretSync } from "./vault/fingerprint.ts";
|
|
44
40
|
|
|
45
41
|
export { createSecretRedactor } from "./vault/redact.ts";
|
package/src/index.ts
CHANGED
|
@@ -56,11 +56,14 @@ export {
|
|
|
56
56
|
id,
|
|
57
57
|
now,
|
|
58
58
|
defineTable,
|
|
59
|
+
field,
|
|
59
60
|
createStoreRuntime,
|
|
60
61
|
type StoreDecl,
|
|
61
62
|
type StoreRuntime,
|
|
62
63
|
type SqlStoreHandle,
|
|
63
64
|
type TableHandle,
|
|
65
|
+
type SchemaTableDecl,
|
|
66
|
+
type SchemaColumnDecl,
|
|
64
67
|
} from "./elements/store.ts";
|
|
65
68
|
|
|
66
69
|
export {
|
|
@@ -98,8 +101,8 @@ export {
|
|
|
98
101
|
|
|
99
102
|
export {
|
|
100
103
|
vault,
|
|
101
|
-
|
|
102
|
-
|
|
104
|
+
fromDocker,
|
|
105
|
+
FROM_DOCKER_PREFIX,
|
|
103
106
|
createVaultRuntime,
|
|
104
107
|
VaultBootError,
|
|
105
108
|
SECRET_MASK,
|
|
@@ -68,17 +68,12 @@ export type ErrorDataOf<E extends FlowErrorMap> = {
|
|
|
68
68
|
*
|
|
69
69
|
* @typeParam F - Flow definition
|
|
70
70
|
*/
|
|
71
|
-
export type RouteFromFlow<F> =
|
|
72
|
-
infer I,
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
>
|
|
78
|
-
? [T] extends [HttpTrigger<infer M, infer P>]
|
|
79
|
-
? AppFlowRoute<I, O, ErrorDataOf<E>, M, P>
|
|
80
|
-
: AppFlowRoute<I, O, ErrorDataOf<E>>
|
|
81
|
-
: never;
|
|
71
|
+
export type RouteFromFlow<F> =
|
|
72
|
+
F extends FlowDef<infer I, infer O, infer E, any, infer T>
|
|
73
|
+
? [T] extends [HttpTrigger<infer M, infer P>]
|
|
74
|
+
? AppFlowRoute<I, O, ErrorDataOf<E>, M, P>
|
|
75
|
+
: AppFlowRoute<I, O, ErrorDataOf<E>>
|
|
76
|
+
: never;
|
|
82
77
|
|
|
83
78
|
/**
|
|
84
79
|
* Map a flow namespace (`{ create, get, … }`) to a unit route table.
|
|
@@ -115,12 +110,11 @@ export type RoutesFromAdoptArg<A> = A extends AnyFlowDef
|
|
|
115
110
|
*
|
|
116
111
|
* @typeParam Args - Adopt argument tuple
|
|
117
112
|
*/
|
|
118
|
-
export type RoutesFromAdoptArgs<Args extends readonly unknown[]> =
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
: {};
|
|
113
|
+
export type RoutesFromAdoptArgs<Args extends readonly unknown[]> = Args extends readonly []
|
|
114
|
+
? {}
|
|
115
|
+
: Args extends readonly [infer H, ...infer T]
|
|
116
|
+
? RoutesFromAdoptArg<H> & RoutesFromAdoptArgs<T>
|
|
117
|
+
: {};
|
|
124
118
|
|
|
125
119
|
/** Runtime leaf: method/path when the flow has an HTTP trigger. */
|
|
126
120
|
export interface RuntimeFlowRoute {
|
|
@@ -141,8 +135,7 @@ export type RuntimeRouteMap = {
|
|
|
141
135
|
* @param flowDef - Flow definition
|
|
142
136
|
*/
|
|
143
137
|
export function runtimeRouteFromFlow(flowDef: AnyFlowDef): RuntimeFlowRoute {
|
|
144
|
-
const trigger: Trigger | undefined =
|
|
145
|
-
flowDef.$trigger ?? flowDef.triggers[0];
|
|
138
|
+
const trigger: Trigger | undefined = flowDef.$trigger ?? flowDef.triggers[0];
|
|
146
139
|
if (trigger?.kind === "http") {
|
|
147
140
|
return { method: trigger.method, path: trigger.path };
|
|
148
141
|
}
|
|
@@ -156,10 +149,7 @@ export function runtimeRouteFromFlow(flowDef: AnyFlowDef): RuntimeFlowRoute {
|
|
|
156
149
|
* @param into - Mutable route map to extend
|
|
157
150
|
* @returns Flows discovered (for `fx.call` registration)
|
|
158
151
|
*/
|
|
159
|
-
export function accumulateAdoptArgs(
|
|
160
|
-
args: readonly unknown[],
|
|
161
|
-
into: RuntimeRouteMap,
|
|
162
|
-
): AnyFlowDef[] {
|
|
152
|
+
export function accumulateAdoptArgs(args: readonly unknown[], into: RuntimeRouteMap): AnyFlowDef[] {
|
|
163
153
|
const found: AnyFlowDef[] = [];
|
|
164
154
|
|
|
165
155
|
for (const arg of args) {
|
|
@@ -169,9 +159,7 @@ export function accumulateAdoptArgs(
|
|
|
169
159
|
}
|
|
170
160
|
if (typeof arg !== "object" || arg === null) continue;
|
|
171
161
|
|
|
172
|
-
for (const [unit, value] of Object.entries(
|
|
173
|
-
arg as Record<string, unknown>,
|
|
174
|
-
)) {
|
|
162
|
+
for (const [unit, value] of Object.entries(arg as Record<string, unknown>)) {
|
|
175
163
|
if (isFlow(value)) {
|
|
176
164
|
// Flat `{ create: flow }` without a unit wrapper — skip client map
|
|
177
165
|
found.push(value);
|
|
@@ -180,9 +168,7 @@ export function accumulateAdoptArgs(
|
|
|
180
168
|
if (typeof value !== "object" || value === null) continue;
|
|
181
169
|
|
|
182
170
|
const unitBag = into[unit] ?? (into[unit] = {});
|
|
183
|
-
for (const [flowName, flowDef] of Object.entries(
|
|
184
|
-
value as Record<string, unknown>,
|
|
185
|
-
)) {
|
|
171
|
+
for (const [flowName, flowDef] of Object.entries(value as Record<string, unknown>)) {
|
|
186
172
|
if (!isFlow(flowDef)) continue;
|
|
187
173
|
found.push(flowDef);
|
|
188
174
|
unitBag[flowName] = runtimeRouteFromFlow(flowDef);
|
package/src/kernel/app.ts
CHANGED
|
@@ -32,10 +32,7 @@ import {
|
|
|
32
32
|
type CreateAppAuthBindingOptions,
|
|
33
33
|
} from "./auth-resolve.ts";
|
|
34
34
|
import { runDurable } from "../elements/clock/durable.ts";
|
|
35
|
-
import {
|
|
36
|
-
isFlow,
|
|
37
|
-
type AnyFlowDef,
|
|
38
|
-
} from "./flow.ts";
|
|
35
|
+
import { isFlow, type AnyFlowDef } from "./flow.ts";
|
|
39
36
|
import {
|
|
40
37
|
createFxContext,
|
|
41
38
|
resolveName,
|
|
@@ -65,7 +62,7 @@ import {
|
|
|
65
62
|
isJournalSuspend,
|
|
66
63
|
type JournalSession,
|
|
67
64
|
} from "./journal.ts";
|
|
68
|
-
import { listBindings, type Binding } from "./on.ts";
|
|
65
|
+
import { listBindings, resetBindings, type Binding } from "./on.ts";
|
|
69
66
|
import {
|
|
70
67
|
applyPrincipal,
|
|
71
68
|
createElementPipelineHooks,
|
|
@@ -80,16 +77,8 @@ import {
|
|
|
80
77
|
type AccumulateDecorations,
|
|
81
78
|
} from "./plug.ts";
|
|
82
79
|
import type { PluginCapabilities, PluginDef } from "./plugin.ts";
|
|
83
|
-
import {
|
|
84
|
-
|
|
85
|
-
type PluginRegistry,
|
|
86
|
-
} from "./registry.ts";
|
|
87
|
-
import {
|
|
88
|
-
createRouter,
|
|
89
|
-
type Router,
|
|
90
|
-
type RouterPreset,
|
|
91
|
-
type SmartRouter,
|
|
92
|
-
} from "./router.ts";
|
|
80
|
+
import { createPluginRegistry, type PluginRegistry } from "./registry.ts";
|
|
81
|
+
import { createRouter, type Router, type RouterPreset, type SmartRouter } from "./router.ts";
|
|
93
82
|
import type {
|
|
94
83
|
CdcTrigger,
|
|
95
84
|
EveryTrigger,
|
|
@@ -113,8 +102,23 @@ export interface OkeOptions {
|
|
|
113
102
|
* Default `true`.
|
|
114
103
|
*/
|
|
115
104
|
readonly aot?: boolean;
|
|
116
|
-
/**
|
|
105
|
+
/**
|
|
106
|
+
* Extra bindings. Combined with the global {@link on} registry unless
|
|
107
|
+
* {@link OkeOptions.registry} is `"ignore"` — then this is the only source.
|
|
108
|
+
*/
|
|
117
109
|
readonly bindings?: readonly Binding[];
|
|
110
|
+
/**
|
|
111
|
+
* How the global {@link on} registry is treated at construction.
|
|
112
|
+
*
|
|
113
|
+
* - `"consume"` (default) — adopt registered bindings, then clear the
|
|
114
|
+
* registry so a later {@link oke} in the same process cannot inherit
|
|
115
|
+
* this app's flows.
|
|
116
|
+
* - `"keep"` — adopt registered bindings and leave the registry intact
|
|
117
|
+
* (legacy behavior).
|
|
118
|
+
* - `"ignore"` — adopt only {@link OkeOptions.bindings}; the registry is
|
|
119
|
+
* neither read nor cleared (embedding / Console).
|
|
120
|
+
*/
|
|
121
|
+
readonly registry?: "consume" | "keep" | "ignore";
|
|
118
122
|
/** Base fx options applied to every invocation. */
|
|
119
123
|
readonly fx?: Omit<CreateFxOptions, "flow" | "effects" | "capability">;
|
|
120
124
|
/**
|
|
@@ -129,13 +133,13 @@ export interface OkeOptions {
|
|
|
129
133
|
* subject key.
|
|
130
134
|
*/
|
|
131
135
|
readonly archiveInputFields?: readonly string[];
|
|
132
|
-
/** Active environment for {@link OkeApp.boot} (defaults to `
|
|
136
|
+
/** Active environment for {@link OkeApp.boot} (defaults to `local`). */
|
|
133
137
|
readonly env?: BootOptions["env"];
|
|
134
138
|
/**
|
|
135
|
-
*
|
|
139
|
+
* Docker mode (`oke dev -d` / `OKE_DOCKER=1`) — force the `docker`
|
|
136
140
|
* driver profile at boot.
|
|
137
141
|
*/
|
|
138
|
-
readonly
|
|
142
|
+
readonly docker?: BootOptions["docker"];
|
|
139
143
|
/** Optional `oke.config.ts` document consumed at boot. */
|
|
140
144
|
readonly config?: BootOptions["config"];
|
|
141
145
|
/** Pre-built element runtimes (skip construction at boot when present). */
|
|
@@ -209,9 +213,7 @@ export interface UnitHooks<D extends Record<string, unknown> = {}> {
|
|
|
209
213
|
*
|
|
210
214
|
* @param pluginDef - Plugin from {@link plugin}
|
|
211
215
|
*/
|
|
212
|
-
plug<P extends PluginDef>(
|
|
213
|
-
pluginDef: P,
|
|
214
|
-
): UnitHooks<AccumulateDecorations<D, P>>;
|
|
216
|
+
plug<P extends PluginDef>(pluginDef: P): UnitHooks<AccumulateDecorations<D, P>>;
|
|
215
217
|
}
|
|
216
218
|
|
|
217
219
|
/**
|
|
@@ -220,10 +222,7 @@ export interface UnitHooks<D extends Record<string, unknown> = {}> {
|
|
|
220
222
|
* @typeParam D - Accumulated decoration types from app `.plug()`
|
|
221
223
|
* @typeParam R - Accumulated client route map from `.adopt({ unit })`
|
|
222
224
|
*/
|
|
223
|
-
export interface OkeApp<
|
|
224
|
-
D extends Record<string, unknown> = {},
|
|
225
|
-
R extends AppRouteMap = {},
|
|
226
|
-
> {
|
|
225
|
+
export interface OkeApp<D extends Record<string, unknown> = {}, R extends AppRouteMap = {}> {
|
|
227
226
|
/** App name. */
|
|
228
227
|
readonly name: string;
|
|
229
228
|
/** Whether AoT compilation is enabled. */
|
|
@@ -269,9 +268,7 @@ export interface OkeApp<
|
|
|
269
268
|
*
|
|
270
269
|
* @param pluginDef - Plugin from {@link plugin}
|
|
271
270
|
*/
|
|
272
|
-
plug<P extends PluginDef>(
|
|
273
|
-
pluginDef: P,
|
|
274
|
-
): OkeApp<AccumulateDecorations<D, P>, R>;
|
|
271
|
+
plug<P extends PluginDef>(pluginDef: P): OkeApp<AccumulateDecorations<D, P>, R>;
|
|
275
272
|
/**
|
|
276
273
|
* Captured plugin capabilities for the Manifest.
|
|
277
274
|
*/
|
|
@@ -357,10 +354,7 @@ export interface OkeApp<
|
|
|
357
354
|
* @param signal - Signal name or handle
|
|
358
355
|
* @param payload - Payload
|
|
359
356
|
*/
|
|
360
|
-
dispatchSignal(
|
|
361
|
-
signal: NamedRef,
|
|
362
|
-
payload?: unknown,
|
|
363
|
-
): Promise<ExecuteResult[]>;
|
|
357
|
+
dispatchSignal(signal: NamedRef, payload?: unknown): Promise<ExecuteResult[]>;
|
|
364
358
|
/**
|
|
365
359
|
* Invoke all flows bound to an `every` interval.
|
|
366
360
|
*
|
|
@@ -374,11 +368,7 @@ export interface OkeApp<
|
|
|
374
368
|
* @param payload - before/after
|
|
375
369
|
* @param column - Optional column filter
|
|
376
370
|
*/
|
|
377
|
-
dispatchCdc(
|
|
378
|
-
tableName: string,
|
|
379
|
-
payload: CdcPayload,
|
|
380
|
-
column?: string,
|
|
381
|
-
): Promise<ExecuteResult[]>;
|
|
371
|
+
dispatchCdc(tableName: string, payload: CdcPayload, column?: string): Promise<ExecuteResult[]>;
|
|
382
372
|
/**
|
|
383
373
|
* Call a flow by name/handle (same path as `fx.call`).
|
|
384
374
|
*
|
|
@@ -408,10 +398,12 @@ export interface OkeApp<
|
|
|
408
398
|
*/
|
|
409
399
|
export function oke(options: OkeOptions): OkeApp {
|
|
410
400
|
const aot = options.aot !== false;
|
|
411
|
-
const
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
401
|
+
const registry = options.registry ?? "consume";
|
|
402
|
+
const adopted: Binding[] =
|
|
403
|
+
registry === "ignore"
|
|
404
|
+
? [...(options.bindings ?? [])]
|
|
405
|
+
: [...listBindings(), ...(options.bindings ?? [])];
|
|
406
|
+
if (registry === "consume") resetBindings();
|
|
415
407
|
/** Retained for test harness / boot merges. */
|
|
416
408
|
const $options = options;
|
|
417
409
|
|
|
@@ -459,7 +451,7 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
459
451
|
// --- boot (vault → store → signal → clock → channel → AI → runs → caps) ---
|
|
460
452
|
let bootResult: BootResult | undefined;
|
|
461
453
|
let bootPromise: Promise<BootResult> | undefined;
|
|
462
|
-
let bootEnv: BootOptions["env"] = options.env ?? "
|
|
454
|
+
let bootEnv: BootOptions["env"] = options.env ?? "local";
|
|
463
455
|
let authBinding: AppAuthBinding | undefined =
|
|
464
456
|
options.auth !== undefined
|
|
465
457
|
? createAppAuthBinding({
|
|
@@ -490,10 +482,10 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
490
482
|
|
|
491
483
|
async function doBoot(overrides?: Partial<BootOptions>): Promise<BootResult> {
|
|
492
484
|
const { bootApplication } = await import("./boot.ts");
|
|
493
|
-
bootEnv = overrides?.env ?? options.env ?? "
|
|
485
|
+
bootEnv = overrides?.env ?? options.env ?? "local";
|
|
494
486
|
const merged: BootOptions = {
|
|
495
487
|
env: bootEnv,
|
|
496
|
-
|
|
488
|
+
docker: overrides?.docker ?? options.docker,
|
|
497
489
|
config: overrides?.config ?? options.config,
|
|
498
490
|
elements: overrides?.elements ?? options.elements,
|
|
499
491
|
secrets: overrides?.secrets ?? options.secrets,
|
|
@@ -508,8 +500,7 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
508
500
|
now: overrides?.now ?? options.fx?.now,
|
|
509
501
|
instanceId: overrides?.instanceId,
|
|
510
502
|
startScheduler: overrides?.startScheduler ?? options.startScheduler,
|
|
511
|
-
schedulerIntervalMs:
|
|
512
|
-
overrides?.schedulerIntervalMs ?? options.schedulerIntervalMs,
|
|
503
|
+
schedulerIntervalMs: overrides?.schedulerIntervalMs ?? options.schedulerIntervalMs,
|
|
513
504
|
bindings: adopted,
|
|
514
505
|
flows: [...flowsByName.values()],
|
|
515
506
|
onCronFire: overrides?.onCronFire ?? handleCronFire,
|
|
@@ -542,9 +533,7 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
542
533
|
return bootPromise;
|
|
543
534
|
}
|
|
544
535
|
|
|
545
|
-
function isRunsRuntimeLike(
|
|
546
|
-
value: OkeOptions["runs"],
|
|
547
|
-
): value is RunsRuntime {
|
|
536
|
+
function isRunsRuntimeLike(value: OkeOptions["runs"]): value is RunsRuntime {
|
|
548
537
|
return (
|
|
549
538
|
typeof value === "object" &&
|
|
550
539
|
value !== null &&
|
|
@@ -570,20 +559,11 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
570
559
|
|
|
571
560
|
const booted = await ensureBoot();
|
|
572
561
|
|
|
573
|
-
const unitBag =
|
|
574
|
-
flowDef.unit !== undefined ? unitHooks.get(flowDef.unit) : undefined;
|
|
562
|
+
const unitBag = flowDef.unit !== undefined ? unitHooks.get(flowDef.unit) : undefined;
|
|
575
563
|
// app (hooks + plugs) → unit (hooks + plugs) → flow (hooks + plugs)
|
|
576
564
|
const composedHooks = mergeHooks(
|
|
577
|
-
mergeHooks(
|
|
578
|
-
|
|
579
|
-
pluginRegistry.hooksAt("app", flowDef.unit, flowDef.name),
|
|
580
|
-
undefined,
|
|
581
|
-
),
|
|
582
|
-
mergeHooks(
|
|
583
|
-
unitBag,
|
|
584
|
-
pluginRegistry.hooksAt("unit", flowDef.unit, flowDef.name),
|
|
585
|
-
undefined,
|
|
586
|
-
),
|
|
565
|
+
mergeHooks(appHooks, pluginRegistry.hooksAt("app", flowDef.unit, flowDef.name), undefined),
|
|
566
|
+
mergeHooks(unitBag, pluginRegistry.hooksAt("unit", flowDef.unit, flowDef.name), undefined),
|
|
587
567
|
mergeHooks(
|
|
588
568
|
flowDef.hooks as HookMap,
|
|
589
569
|
pluginRegistry.hooksAt("flow", flowDef.unit, flowDef.name),
|
|
@@ -591,10 +571,7 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
591
571
|
),
|
|
592
572
|
);
|
|
593
573
|
|
|
594
|
-
const decorations = pluginRegistry.decorationsFor(
|
|
595
|
-
flowDef.unit,
|
|
596
|
-
flowDef.name,
|
|
597
|
-
);
|
|
574
|
+
const decorations = pluginRegistry.decorationsFor(flowDef.unit, flowDef.name);
|
|
598
575
|
|
|
599
576
|
const ctx: InvocationContext = {
|
|
600
577
|
trigger,
|
|
@@ -631,10 +608,7 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
631
608
|
// a real HTTP request in production mode.
|
|
632
609
|
const testMode = bootEnv === "test";
|
|
633
610
|
if (testMode) {
|
|
634
|
-
applyPrincipal(
|
|
635
|
-
principals,
|
|
636
|
-
extras?.auth as ResolvedPrincipal | undefined,
|
|
637
|
-
);
|
|
611
|
+
applyPrincipal(principals, extras?.auth as ResolvedPrincipal | undefined);
|
|
638
612
|
applyPrincipal(principals, extras?.principal);
|
|
639
613
|
if (extras?.operator) principals.operator.id = extras.operator.id;
|
|
640
614
|
}
|
|
@@ -645,9 +619,7 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
645
619
|
principals,
|
|
646
620
|
telemetry,
|
|
647
621
|
allowTestPrincipals: testMode,
|
|
648
|
-
verifyBearer: binding
|
|
649
|
-
? (token) => verifyBearerToken(binding, token)
|
|
650
|
-
: undefined,
|
|
622
|
+
verifyBearer: binding ? (token) => verifyBearerToken(binding, token) : undefined,
|
|
651
623
|
});
|
|
652
624
|
|
|
653
625
|
// Element hooks run first in the app-level onAuth/beforeHandle chain —
|
|
@@ -675,9 +647,7 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
675
647
|
effects: flowDef.effects,
|
|
676
648
|
runTelemetry: telemetry,
|
|
677
649
|
now,
|
|
678
|
-
...(principals
|
|
679
|
-
? { auth: principals.auth as FxAuth, operator: principals.operator }
|
|
680
|
-
: {}),
|
|
650
|
+
...(principals ? { auth: principals.auth as FxAuth, operator: principals.operator } : {}),
|
|
681
651
|
...(capability ? { capability } : {}),
|
|
682
652
|
...(booted
|
|
683
653
|
? {
|
|
@@ -704,29 +674,37 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
704
674
|
|
|
705
675
|
const alreadyValidated = extras?.validated === true;
|
|
706
676
|
|
|
707
|
-
const result = await runPipeline(
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
677
|
+
const result = await runPipeline(
|
|
678
|
+
ctx,
|
|
679
|
+
fx,
|
|
680
|
+
hooks,
|
|
681
|
+
async () => {
|
|
682
|
+
try {
|
|
683
|
+
if (!alreadyValidated) {
|
|
684
|
+
const parsed = await validate(flowDef.in, ctx.input);
|
|
685
|
+
if (!parsed.ok) return parsed.failure;
|
|
686
|
+
ctx.input = parsed.value;
|
|
687
|
+
return await flowDef.do(parsed.value as never, fx);
|
|
688
|
+
}
|
|
689
|
+
return await flowDef.do(ctx.input as never, fx);
|
|
690
|
+
} catch (err) {
|
|
691
|
+
// A durable sleep that has not yet elapsed suspends the run — this
|
|
692
|
+
// is a park, not a pipeline failure, so it must not throw upward.
|
|
693
|
+
if (flowDef.durable && journalSession && isJournalSuspend(err)) {
|
|
694
|
+
ctx.state.sleeping = {
|
|
695
|
+
wakeAt: err.wakeAt,
|
|
696
|
+
label: err.label,
|
|
697
|
+
runId: journalSession.runId,
|
|
698
|
+
};
|
|
699
|
+
return undefined;
|
|
700
|
+
}
|
|
701
|
+
throw err;
|
|
726
702
|
}
|
|
727
|
-
|
|
728
|
-
|
|
729
|
-
|
|
703
|
+
},
|
|
704
|
+
// HTTP flows serialize before `onResponse` so the last stage can see
|
|
705
|
+
// and replace the final response (plugin header/middleware surfaces).
|
|
706
|
+
trigger.kind === "http" ? encodeExecuteResult : undefined,
|
|
707
|
+
);
|
|
730
708
|
|
|
731
709
|
const endedAt = now();
|
|
732
710
|
|
|
@@ -750,13 +728,9 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
750
728
|
}
|
|
751
729
|
|
|
752
730
|
const runsRuntime =
|
|
753
|
-
booted?.runs ??
|
|
754
|
-
(isRunsRuntimeLike(options.runs) ? options.runs : undefined);
|
|
731
|
+
booted?.runs ?? (isRunsRuntimeLike(options.runs) ? options.runs : undefined);
|
|
755
732
|
if (runsRuntime) {
|
|
756
|
-
const archiveCleartext = archiveFromInput(
|
|
757
|
-
ctx.input,
|
|
758
|
-
options.archiveInputFields,
|
|
759
|
-
);
|
|
733
|
+
const archiveCleartext = archiveFromInput(ctx.input, options.archiveInputFields);
|
|
760
734
|
await runsRuntime.record(
|
|
761
735
|
{
|
|
762
736
|
flow: flowDef,
|
|
@@ -936,8 +910,7 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
936
910
|
if (parts.length >= 2) {
|
|
937
911
|
const [unit, ...flowParts] = parts;
|
|
938
912
|
const flowName = flowParts.join("/");
|
|
939
|
-
const target =
|
|
940
|
-
flowsByName.get(`${unit}.${flowName}`) ?? flowsByName.get(flowName);
|
|
913
|
+
const target = flowsByName.get(`${unit}.${flowName}`) ?? flowsByName.get(flowName);
|
|
941
914
|
if (!target) {
|
|
942
915
|
return respond(new Response("Not Found", { status: 404 }));
|
|
943
916
|
}
|
|
@@ -960,6 +933,12 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
960
933
|
|
|
961
934
|
const matched = router.match(method, url.pathname);
|
|
962
935
|
if (!matched) {
|
|
936
|
+
// Plugin edge handlers answer requests no flow owns (e.g. CORS
|
|
937
|
+
// preflight for a path bound to another method) — first Response wins.
|
|
938
|
+
for (const handle of pluginRegistry.edgeHandlers()) {
|
|
939
|
+
const edgeResponse = await handle(request, { method, path: url.pathname });
|
|
940
|
+
if (edgeResponse !== undefined) return respond(edgeResponse);
|
|
941
|
+
}
|
|
963
942
|
return respond(new Response("Not Found", { status: 404 }));
|
|
964
943
|
}
|
|
965
944
|
const { value: binding, params } = matched;
|
|
@@ -986,12 +965,11 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
986
965
|
input = undefined;
|
|
987
966
|
}
|
|
988
967
|
|
|
989
|
-
const result = await execute(
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
994
|
-
);
|
|
968
|
+
const result = await execute(binding.flow, input, binding.trigger, {
|
|
969
|
+
request,
|
|
970
|
+
params,
|
|
971
|
+
validated,
|
|
972
|
+
});
|
|
995
973
|
|
|
996
974
|
return respond(encodeExecuteResult(result));
|
|
997
975
|
},
|
|
@@ -1000,9 +978,7 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
1000
978
|
const results: ExecuteResult[] = [];
|
|
1001
979
|
for (const b of adopted) {
|
|
1002
980
|
if (b.trigger.kind === "signal" && b.trigger.name === name) {
|
|
1003
|
-
results.push(
|
|
1004
|
-
await execute(b.flow, payload, b.trigger as SignalAsTrigger),
|
|
1005
|
-
);
|
|
981
|
+
results.push(await execute(b.flow, payload, b.trigger as SignalAsTrigger));
|
|
1006
982
|
}
|
|
1007
983
|
}
|
|
1008
984
|
return results;
|
|
@@ -1011,9 +987,7 @@ export function oke(options: OkeOptions): OkeApp {
|
|
|
1011
987
|
const results: ExecuteResult[] = [];
|
|
1012
988
|
for (const b of adopted) {
|
|
1013
989
|
if (b.trigger.kind === "every" && b.trigger.interval === interval) {
|
|
1014
|
-
results.push(
|
|
1015
|
-
await execute(b.flow, undefined, b.trigger as EveryTrigger),
|
|
1016
|
-
);
|
|
990
|
+
results.push(await execute(b.flow, undefined, b.trigger as EveryTrigger));
|
|
1017
991
|
}
|
|
1018
992
|
}
|
|
1019
993
|
return results;
|
|
@@ -36,9 +36,7 @@ export interface CreateAppAuthBindingOptions {
|
|
|
36
36
|
*
|
|
37
37
|
* @param options - Secret + optional session store / clock
|
|
38
38
|
*/
|
|
39
|
-
export function createAppAuthBinding(
|
|
40
|
-
options: CreateAppAuthBindingOptions,
|
|
41
|
-
): AppAuthBinding {
|
|
39
|
+
export function createAppAuthBinding(options: CreateAppAuthBindingOptions): AppAuthBinding {
|
|
42
40
|
return {
|
|
43
41
|
secret: options.secret,
|
|
44
42
|
sessions: options.sessions ?? createSessionStore(),
|
|
@@ -57,12 +55,7 @@ export async function verifyBearerToken(
|
|
|
57
55
|
auth: AppAuthBinding,
|
|
58
56
|
token: string,
|
|
59
57
|
): Promise<ResolvedPrincipal> {
|
|
60
|
-
const claims = await verifyAccess(
|
|
61
|
-
auth.sessions,
|
|
62
|
-
auth.secret,
|
|
63
|
-
token,
|
|
64
|
-
auth.now,
|
|
65
|
-
);
|
|
58
|
+
const claims = await verifyAccess(auth.sessions, auth.secret, token, auth.now);
|
|
66
59
|
return claimsToPrincipal(claims);
|
|
67
60
|
}
|
|
68
61
|
|
|
@@ -3,10 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { mockAiDriver } from "../../drivers/ai-mock.ts";
|
|
6
|
-
import {
|
|
7
|
-
createAiRuntime,
|
|
8
|
-
type AiRuntime,
|
|
9
|
-
} from "../../elements/ai.ts";
|
|
6
|
+
import { createAiRuntime, type AiRuntime } from "../../elements/ai.ts";
|
|
10
7
|
import type { GateRuntime } from "../../elements/gate.ts";
|
|
11
8
|
import type { BootOptions } from "../boot.ts";
|
|
12
9
|
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel binder — profile selection + SMTP env parsing.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { afterEach, describe, expect, test } from "bun:test";
|
|
6
|
+
import { resolveEmailDriverId, smtpOptionsFromEnv } from "./channel.ts";
|
|
7
|
+
|
|
8
|
+
const previous = {
|
|
9
|
+
url: process.env.SMTP_URL,
|
|
10
|
+
user: process.env.SMTP_USER,
|
|
11
|
+
password: process.env.SMTP_PASSWORD,
|
|
12
|
+
okeUrl: process.env.OKE_CHANNEL_EMAIL_URL,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
afterEach(() => {
|
|
16
|
+
restoreEnv("SMTP_URL", previous.url);
|
|
17
|
+
restoreEnv("SMTP_USER", previous.user);
|
|
18
|
+
restoreEnv("SMTP_PASSWORD", previous.password);
|
|
19
|
+
restoreEnv("OKE_CHANNEL_EMAIL_URL", previous.okeUrl);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
describe("bindChannel driver resolution", () => {
|
|
23
|
+
const options = {
|
|
24
|
+
config: {
|
|
25
|
+
drivers: {
|
|
26
|
+
channel: {
|
|
27
|
+
email: { local: "console", docker: "smtp", test: "console", prod: "smtp" },
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
test("uses console locally and smtp in docker", () => {
|
|
34
|
+
expect(resolveEmailDriverId(options, "local", false)).toBe("console");
|
|
35
|
+
expect(resolveEmailDriverId(options, "docker", true)).toBe("smtp");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("parses SMTP_URL and optional auth overrides", () => {
|
|
39
|
+
process.env.SMTP_URL = "smtp://url-user:url-pass@127.0.0.1:20975";
|
|
40
|
+
process.env.SMTP_USER = "override-user";
|
|
41
|
+
process.env.SMTP_PASSWORD = "override-pass";
|
|
42
|
+
expect(smtpOptionsFromEnv(true)).toEqual({
|
|
43
|
+
host: "127.0.0.1",
|
|
44
|
+
port: 20975,
|
|
45
|
+
user: "override-user",
|
|
46
|
+
pass: "override-pass",
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("missing SMTP_URL includes docker recovery hint", () => {
|
|
51
|
+
delete process.env.SMTP_URL;
|
|
52
|
+
delete process.env.OKE_CHANNEL_EMAIL_URL;
|
|
53
|
+
expect(() => smtpOptionsFromEnv(true)).toThrow("docker/.env.docker");
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
function restoreEnv(key: string, value: string | undefined): void {
|
|
58
|
+
if (value === undefined) delete process.env[key];
|
|
59
|
+
else process.env[key] = value;
|
|
60
|
+
}
|