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/kernel/boot.ts
CHANGED
|
@@ -22,43 +22,19 @@
|
|
|
22
22
|
*/
|
|
23
23
|
|
|
24
24
|
import type { ConfigEnv, OkeConfig } from "../config/index.ts";
|
|
25
|
-
import type {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
} from "../elements/
|
|
29
|
-
import type {
|
|
30
|
-
|
|
31
|
-
CreateChannelRuntimeOptions,
|
|
32
|
-
} from "../elements/channel.ts";
|
|
33
|
-
import type {
|
|
34
|
-
ClockDecl,
|
|
35
|
-
ClockRuntime,
|
|
36
|
-
} from "../elements/clock.ts";
|
|
37
|
-
import type {
|
|
38
|
-
GateDecl,
|
|
39
|
-
GateRuntime,
|
|
40
|
-
} from "../elements/gate.ts";
|
|
41
|
-
import type {
|
|
42
|
-
SignalDecl,
|
|
43
|
-
SignalRuntime,
|
|
44
|
-
} from "../elements/signal.ts";
|
|
45
|
-
import type {
|
|
46
|
-
StoreDecl,
|
|
47
|
-
StoreRuntime,
|
|
48
|
-
} from "../elements/store.ts";
|
|
25
|
+
import type { AiRuntime, CreateAiRuntimeOptions } from "../elements/ai.ts";
|
|
26
|
+
import type { ChannelRuntime, CreateChannelRuntimeOptions } from "../elements/channel.ts";
|
|
27
|
+
import type { ClockDecl, ClockRuntime } from "../elements/clock.ts";
|
|
28
|
+
import type { GateDecl, GateRuntime } from "../elements/gate.ts";
|
|
29
|
+
import type { SignalDecl, SignalRuntime } from "../elements/signal.ts";
|
|
30
|
+
import type { StoreDecl, StoreRuntime } from "../elements/store.ts";
|
|
49
31
|
import type {
|
|
50
32
|
CreateVaultRuntimeOptions,
|
|
51
33
|
VaultRuntime,
|
|
52
34
|
VaultSecretDecl,
|
|
53
35
|
} from "../elements/vault.ts";
|
|
54
|
-
import type {
|
|
55
|
-
|
|
56
|
-
RunsRuntime,
|
|
57
|
-
} from "../runs/index.ts";
|
|
58
|
-
import {
|
|
59
|
-
createCapabilityToken,
|
|
60
|
-
type CapabilityToken,
|
|
61
|
-
} from "./capability.ts";
|
|
36
|
+
import type { CreateRunsRuntimeOptions, RunsRuntime } from "../runs/index.ts";
|
|
37
|
+
import { createCapabilityToken, type CapabilityToken } from "./capability.ts";
|
|
62
38
|
import type { AnyFlowDef } from "./flow.ts";
|
|
63
39
|
import type { Binding } from "./on.ts";
|
|
64
40
|
|
|
@@ -77,16 +53,16 @@ export interface ElementRuntimes {
|
|
|
77
53
|
/** Declarations + options consumed by {@link bootApplication}. */
|
|
78
54
|
export interface BootOptions {
|
|
79
55
|
/**
|
|
80
|
-
* Active environment (defaults to `
|
|
81
|
-
* {@link
|
|
56
|
+
* Active environment (defaults to `local`, or `docker` when
|
|
57
|
+
* {@link docker} / `OKE_DOCKER=1`).
|
|
82
58
|
*/
|
|
83
59
|
readonly env?: ConfigEnv;
|
|
84
60
|
/**
|
|
85
|
-
*
|
|
86
|
-
* `
|
|
87
|
-
* When unset, derived from `process.env.
|
|
61
|
+
* Docker mode (`oke dev -d` / `OKE_DOCKER=1`): force driver maps to the
|
|
62
|
+
* `docker` profile and prefer compose URLs (`docker/.env.docker`).
|
|
63
|
+
* When unset, derived from `process.env.OKE_DOCKER`.
|
|
88
64
|
*/
|
|
89
|
-
readonly
|
|
65
|
+
readonly docker?: boolean;
|
|
90
66
|
/** Optional `oke.config.ts` document. */
|
|
91
67
|
readonly config?: OkeConfig;
|
|
92
68
|
/** Pre-built runtimes (skip construction when present). */
|
|
@@ -127,10 +103,7 @@ export interface BootOptions {
|
|
|
127
103
|
* @param signal - Signal name
|
|
128
104
|
* @param payload - Payload
|
|
129
105
|
*/
|
|
130
|
-
readonly onSignal?: (
|
|
131
|
-
signal: string,
|
|
132
|
-
payload: unknown,
|
|
133
|
-
) => void | Promise<void>;
|
|
106
|
+
readonly onSignal?: (signal: string, payload: unknown) => void | Promise<void>;
|
|
134
107
|
/** Injectable clock for test / frozen harnesses. */
|
|
135
108
|
readonly now?: () => number;
|
|
136
109
|
/** Instance id for leader election. */
|
|
@@ -185,8 +158,7 @@ export interface ElementNeeds {
|
|
|
185
158
|
export function resolveElementNeeds(options: BootOptions): ElementNeeds {
|
|
186
159
|
const pre = options.elements ?? {};
|
|
187
160
|
let vault =
|
|
188
|
-
pre.vault !== undefined ||
|
|
189
|
-
(options.vault?.secrets ?? options.secrets ?? []).length > 0;
|
|
161
|
+
pre.vault !== undefined || (options.vault?.secrets ?? options.secrets ?? []).length > 0;
|
|
190
162
|
let store = pre.store !== undefined || (options.stores?.length ?? 0) > 0;
|
|
191
163
|
let signal = pre.signal !== undefined || (options.signals?.length ?? 0) > 0;
|
|
192
164
|
let clock = pre.clock !== undefined || (options.clocks?.length ?? 0) > 0;
|
|
@@ -224,10 +196,7 @@ export function resolveElementNeeds(options: BootOptions): ElementNeeds {
|
|
|
224
196
|
|
|
225
197
|
// AI agents share the gate runtime for tool checks.
|
|
226
198
|
if (ai) gate = true;
|
|
227
|
-
if (
|
|
228
|
-
options.onSignal &&
|
|
229
|
-
(options.bindings ?? []).some((b) => b.trigger.kind === "signal")
|
|
230
|
-
) {
|
|
199
|
+
if (options.onSignal && (options.bindings ?? []).some((b) => b.trigger.kind === "signal")) {
|
|
231
200
|
signal = true;
|
|
232
201
|
}
|
|
233
202
|
|
|
@@ -251,15 +220,12 @@ async function loadBind<T>(name: string): Promise<T> {
|
|
|
251
220
|
*
|
|
252
221
|
* @param options - Declarations, config, pre-built runtimes
|
|
253
222
|
*/
|
|
254
|
-
export async function bootApplication(
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
input.stack === true ||
|
|
259
|
-
(input.stack !== false && process.env.OKE_STACK === "1");
|
|
260
|
-
// `-s` always selects the `stack` driver profile — not a mix of test/dev +
|
|
223
|
+
export async function bootApplication(input: BootOptions = {}): Promise<BootResult> {
|
|
224
|
+
const docker =
|
|
225
|
+
input.docker === true || (input.docker !== false && process.env.OKE_DOCKER === "1");
|
|
226
|
+
// `-d` always selects the `docker` driver profile — not a mix of test/local +
|
|
261
227
|
// prod store overrides (templates often pin `env: "test"` for harnesses).
|
|
262
|
-
const env: ConfigEnv =
|
|
228
|
+
const env: ConfigEnv = docker ? "docker" : (input.env ?? "local");
|
|
263
229
|
let config = input.config;
|
|
264
230
|
if (config === undefined) {
|
|
265
231
|
try {
|
|
@@ -269,7 +235,7 @@ export async function bootApplication(
|
|
|
269
235
|
config = undefined;
|
|
270
236
|
}
|
|
271
237
|
}
|
|
272
|
-
const options: BootOptions = { ...input, config, env,
|
|
238
|
+
const options: BootOptions = { ...input, config, env, docker };
|
|
273
239
|
const pre = options.elements ?? {};
|
|
274
240
|
const now = options.now ?? (() => Date.now());
|
|
275
241
|
const needs = resolveElementNeeds(options);
|
|
@@ -278,9 +244,7 @@ export async function bootApplication(
|
|
|
278
244
|
let vault = pre.vault;
|
|
279
245
|
if (needs.vault) {
|
|
280
246
|
if (!vault) {
|
|
281
|
-
const { bindVault } = await loadBind<
|
|
282
|
-
typeof import("./boot-bind/vault.ts")
|
|
283
|
-
>("vault");
|
|
247
|
+
const { bindVault } = await loadBind<typeof import("./boot-bind/vault.ts")>("vault");
|
|
284
248
|
vault = await bindVault(options, env);
|
|
285
249
|
} else if (!vault.booted) {
|
|
286
250
|
await vault.boot();
|
|
@@ -347,11 +311,7 @@ export async function bootApplication(
|
|
|
347
311
|
}),
|
|
348
312
|
);
|
|
349
313
|
}
|
|
350
|
-
if (
|
|
351
|
-
needs.runs &&
|
|
352
|
-
!pre.runs &&
|
|
353
|
-
!(options.runs && isRunsRuntime(options.runs))
|
|
354
|
-
) {
|
|
314
|
+
if (needs.runs && !pre.runs && !(options.runs && isRunsRuntime(options.runs))) {
|
|
355
315
|
binderLoads.push(
|
|
356
316
|
loadBind<RunsBind>("runs").then((m) => {
|
|
357
317
|
runsBind = m;
|
|
@@ -364,7 +324,7 @@ export async function bootApplication(
|
|
|
364
324
|
let store = pre.store;
|
|
365
325
|
if (needs.store) {
|
|
366
326
|
if (!store) {
|
|
367
|
-
store = storeBind!.bindStore(options, env, now,
|
|
327
|
+
store = storeBind!.bindStore(options, env, now, docker);
|
|
368
328
|
} else {
|
|
369
329
|
for (const decl of options.stores ?? []) {
|
|
370
330
|
store.register?.(decl);
|
|
@@ -414,7 +374,7 @@ export async function bootApplication(
|
|
|
414
374
|
// 5. Channel
|
|
415
375
|
let channel = pre.channel;
|
|
416
376
|
if (needs.channel && !channel) {
|
|
417
|
-
channel = channelBind!.bindChannel(options, now);
|
|
377
|
+
channel = channelBind!.bindChannel(options, env, now, docker);
|
|
418
378
|
}
|
|
419
379
|
|
|
420
380
|
// 6. AI
|
|
@@ -431,10 +391,7 @@ export async function bootApplication(
|
|
|
431
391
|
runs = options.runs;
|
|
432
392
|
if (!runs.store) await runs.open();
|
|
433
393
|
} else {
|
|
434
|
-
const runsOpts =
|
|
435
|
-
options.runs && !isRunsRuntime(options.runs)
|
|
436
|
-
? options.runs
|
|
437
|
-
: undefined;
|
|
394
|
+
const runsOpts = options.runs && !isRunsRuntime(options.runs) ? options.runs : undefined;
|
|
438
395
|
runs = await runsBind!.bindRuns(runsOpts);
|
|
439
396
|
}
|
|
440
397
|
} else if (!runs.store) {
|
|
@@ -479,9 +436,7 @@ export async function bootApplication(
|
|
|
479
436
|
*
|
|
480
437
|
* @param flows - Adopted flows
|
|
481
438
|
*/
|
|
482
|
-
export function mintCapabilities(
|
|
483
|
-
flows: readonly AnyFlowDef[],
|
|
484
|
-
): Map<string, CapabilityToken> {
|
|
439
|
+
export function mintCapabilities(flows: readonly AnyFlowDef[]): Map<string, CapabilityToken> {
|
|
485
440
|
const map = new Map<string, CapabilityToken>();
|
|
486
441
|
for (const f of flows) {
|
|
487
442
|
map.set(f.name, createCapabilityToken(f.name, f.effects));
|
|
@@ -489,9 +444,7 @@ export function mintCapabilities(
|
|
|
489
444
|
return map;
|
|
490
445
|
}
|
|
491
446
|
|
|
492
|
-
function isRunsRuntime(
|
|
493
|
-
value: RunsRuntime | CreateRunsRuntimeOptions,
|
|
494
|
-
): value is RunsRuntime {
|
|
447
|
+
function isRunsRuntime(value: RunsRuntime | CreateRunsRuntimeOptions): value is RunsRuntime {
|
|
495
448
|
return (
|
|
496
449
|
typeof value === "object" &&
|
|
497
450
|
value !== null &&
|
|
@@ -10,9 +10,7 @@ import { measureKernelEdgeGzipBytes } from "../release/measure.ts";
|
|
|
10
10
|
describe("kernel edge bundle budget", () => {
|
|
11
11
|
test(`edge profile < ${KERNEL_EDGE_BUDGET_BYTES} bytes gzipped`, async () => {
|
|
12
12
|
const size = await measureKernelEdgeGzipBytes();
|
|
13
|
-
console.log(
|
|
14
|
-
`kernel edge gzip=${size} budget=${KERNEL_EDGE_BUDGET_BYTES}`,
|
|
15
|
-
);
|
|
13
|
+
console.log(`kernel edge gzip=${size} budget=${KERNEL_EDGE_BUDGET_BYTES}`);
|
|
16
14
|
expect(size).toBeGreaterThan(0);
|
|
17
15
|
expect(size).toBeLessThan(KERNEL_EDGE_BUDGET_BYTES);
|
|
18
16
|
});
|
package/src/kernel/capability.ts
CHANGED
|
@@ -11,9 +11,7 @@ import type { EffectKind } from "./effects.ts";
|
|
|
11
11
|
import { OKE_ERRORS, throwOke } from "./errors.ts";
|
|
12
12
|
|
|
13
13
|
/** Maps effect kind → the undeclared-access registry key. */
|
|
14
|
-
const UNDECLARED_KEY: Readonly<
|
|
15
|
-
Record<EffectKind, keyof typeof OKE_ERRORS>
|
|
16
|
-
> = {
|
|
14
|
+
const UNDECLARED_KEY: Readonly<Record<EffectKind, keyof typeof OKE_ERRORS>> = {
|
|
17
15
|
read: "UNDECLARED_READ",
|
|
18
16
|
write: "UNDECLARED_WRITE",
|
|
19
17
|
emit: "UNDECLARED_EMIT",
|
|
@@ -24,9 +22,7 @@ const UNDECLARED_KEY: Readonly<
|
|
|
24
22
|
};
|
|
25
23
|
|
|
26
24
|
/** Maps effect kind → the corresponding `Effects` field. */
|
|
27
|
-
const EFFECTS_FIELD: Readonly<
|
|
28
|
-
Record<EffectKind, keyof Effects>
|
|
29
|
-
> = {
|
|
25
|
+
const EFFECTS_FIELD: Readonly<Record<EffectKind, keyof Effects>> = {
|
|
30
26
|
read: "reads",
|
|
31
27
|
write: "writes",
|
|
32
28
|
emit: "emits",
|
|
@@ -72,10 +68,7 @@ export interface CapabilityToken {
|
|
|
72
68
|
* @param flow - Flow id (used in error messages)
|
|
73
69
|
* @param declared - Declared effect surface, or `undefined` for open
|
|
74
70
|
*/
|
|
75
|
-
export function createCapabilityToken(
|
|
76
|
-
flow: string,
|
|
77
|
-
declared?: Effects,
|
|
78
|
-
): CapabilityToken {
|
|
71
|
+
export function createCapabilityToken(flow: string, declared?: Effects): CapabilityToken {
|
|
79
72
|
const open = declared === undefined;
|
|
80
73
|
const effects = declared ?? {};
|
|
81
74
|
const sets: Record<EffectKind, ReadonlySet<string>> = {
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
2
|
import type { ChannelRuntime } from "../elements/channel/runtime.ts";
|
|
3
|
-
import {
|
|
4
|
-
isDryRun,
|
|
5
|
-
withDryRun,
|
|
6
|
-
} from "./dry-run.ts";
|
|
3
|
+
import { isDryRun, withDryRun } from "./dry-run.ts";
|
|
7
4
|
import { createFx, type FxStubStoreHandle } from "./fx.ts";
|
|
8
5
|
|
|
9
6
|
describe("fx dry-run stubbing", () => {
|
package/src/kernel/dry-run.ts
CHANGED
|
@@ -94,10 +94,7 @@ export function setDryRunMessageId(messageId: string): void {
|
|
|
94
94
|
* @param kind - Irreversible kind
|
|
95
95
|
* @param resource - Template / prompt name
|
|
96
96
|
*/
|
|
97
|
-
export function recordWouldHaveFired(
|
|
98
|
-
kind: "send" | "ask",
|
|
99
|
-
resource: string,
|
|
100
|
-
): void {
|
|
97
|
+
export function recordWouldHaveFired(kind: "send" | "ask", resource: string): void {
|
|
101
98
|
const ctx = storage.getStore();
|
|
102
99
|
if (!ctx) return;
|
|
103
100
|
ctx.wouldHaveFired.push({
|
|
@@ -115,19 +112,14 @@ export function recordWouldHaveFired(
|
|
|
115
112
|
* @param ref - Store resource ref (`sql:inventory`, …)
|
|
116
113
|
* @param table - Live in-memory table Map
|
|
117
114
|
*/
|
|
118
|
-
export function touchDryRunStore(
|
|
119
|
-
ref: string,
|
|
120
|
-
table: Map<string, unknown>,
|
|
121
|
-
): void {
|
|
115
|
+
export function touchDryRunStore(ref: string, table: Map<string, unknown>): void {
|
|
122
116
|
const ctx = storage.getStore();
|
|
123
117
|
if (!ctx) return;
|
|
124
118
|
if (ctx.storeSnapshots.has(ref)) return;
|
|
125
119
|
ctx.storeRefs.set(ref, table);
|
|
126
120
|
ctx.storeSnapshots.set(
|
|
127
121
|
ref,
|
|
128
|
-
new Map(
|
|
129
|
-
[...table.entries()].map(([k, v]) => [k, structuredClone(v)]),
|
|
130
|
-
),
|
|
122
|
+
new Map([...table.entries()].map(([k, v]) => [k, structuredClone(v)])),
|
|
131
123
|
);
|
|
132
124
|
}
|
|
133
125
|
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin edge handlers — the contribution that answers HTTP requests no
|
|
3
|
+
* flow owns (CORS preflight being the prime example), with the plain 404
|
|
4
|
+
* preserved as the floor.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { beforeEach, describe, expect, test } from "bun:test";
|
|
8
|
+
import { oke } from "./app.ts";
|
|
9
|
+
import { flow, resetFlowSeq } from "./flow.ts";
|
|
10
|
+
import { on, resetBindings } from "./on.ts";
|
|
11
|
+
import { plugin } from "./plugin.ts";
|
|
12
|
+
import { createPluginRegistry } from "./registry.ts";
|
|
13
|
+
import { http } from "./triggers.ts";
|
|
14
|
+
|
|
15
|
+
beforeEach(() => {
|
|
16
|
+
resetBindings();
|
|
17
|
+
resetFlowSeq();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
describe("plugin edge handlers", () => {
|
|
21
|
+
test("an edge handler answers an unmatched request; the flow still owns matched ones", async () => {
|
|
22
|
+
on(http.get("/x"), flow({ name: "x.get", do: () => ({ ok: true }) }));
|
|
23
|
+
const edge = plugin("edge-test", { version: "0.0.1" }).edge((_request, info) => {
|
|
24
|
+
if (info.method === "OPTIONS") {
|
|
25
|
+
return new Response(null, { status: 204, headers: { "x-edge": "yes" } });
|
|
26
|
+
}
|
|
27
|
+
return undefined;
|
|
28
|
+
});
|
|
29
|
+
const app = oke({ name: "edge" }).plug(edge);
|
|
30
|
+
|
|
31
|
+
const preflight = await app.fetch(new Request("http://localhost/x", { method: "OPTIONS" }));
|
|
32
|
+
expect(preflight.status).toBe(204);
|
|
33
|
+
expect(preflight.headers.get("x-edge")).toBe("yes");
|
|
34
|
+
|
|
35
|
+
const matched = await app.fetch(new Request("http://localhost/x"));
|
|
36
|
+
expect(matched.status).toBe(200);
|
|
37
|
+
expect(matched.headers.get("x-edge")).toBeNull();
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("returning undefined falls through to the next handler, then the plain 404", async () => {
|
|
41
|
+
const pass = plugin("edge-pass", { version: "0.0.1" }).edge(() => undefined);
|
|
42
|
+
const answer = plugin("edge-answer", { version: "0.0.1" }).edge(
|
|
43
|
+
() => new Response("answered", { status: 418 }),
|
|
44
|
+
);
|
|
45
|
+
const app = oke({ name: "edge-order" }).plug(pass).plug(answer);
|
|
46
|
+
|
|
47
|
+
const res = await app.fetch(new Request("http://localhost/nowhere", { method: "OPTIONS" }));
|
|
48
|
+
expect(res.status).toBe(418);
|
|
49
|
+
expect(await res.text()).toBe("answered");
|
|
50
|
+
|
|
51
|
+
const noPlugins = oke({ name: "edge-none" });
|
|
52
|
+
const missing = await noPlugins.fetch(
|
|
53
|
+
new Request("http://localhost/nowhere", { method: "OPTIONS" }),
|
|
54
|
+
);
|
|
55
|
+
expect(missing.status).toBe(404);
|
|
56
|
+
expect(await missing.text()).toBe("Not Found");
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
test("edge is recorded as an intercept capability", () => {
|
|
60
|
+
const registry = createPluginRegistry();
|
|
61
|
+
const registration = registry.plug(
|
|
62
|
+
plugin("edge-cap", { version: "0.0.1" }).edge(() => undefined),
|
|
63
|
+
{ kind: "app" },
|
|
64
|
+
);
|
|
65
|
+
expect(registration?.capabilities.intercepts).toContain("edge");
|
|
66
|
+
expect(registry.edgeHandlers()).toHaveLength(1);
|
|
67
|
+
});
|
|
68
|
+
});
|
|
@@ -46,11 +46,7 @@ describe("effects — ledger", () => {
|
|
|
46
46
|
});
|
|
47
47
|
|
|
48
48
|
expect(ledger.entries).toHaveLength(3);
|
|
49
|
-
expect(ledger.entries.map((e) => e.kind)).toEqual([
|
|
50
|
-
"read",
|
|
51
|
-
"write",
|
|
52
|
-
"emit",
|
|
53
|
-
]);
|
|
49
|
+
expect(ledger.entries.map((e) => e.kind)).toEqual(["read", "write", "emit"]);
|
|
54
50
|
expect(ledger.entries[0]).toMatchObject({
|
|
55
51
|
kind: "read",
|
|
56
52
|
resource: "sql:bookings",
|
package/src/kernel/effects.ts
CHANGED
|
@@ -6,14 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
/** The seven load-bearing effect kinds (manifest `effects` keys, singular). */
|
|
9
|
-
export type EffectKind =
|
|
10
|
-
| "read"
|
|
11
|
-
| "write"
|
|
12
|
-
| "emit"
|
|
13
|
-
| "send"
|
|
14
|
-
| "ask"
|
|
15
|
-
| "secret"
|
|
16
|
-
| "call";
|
|
9
|
+
export type EffectKind = "read" | "write" | "emit" | "send" | "ask" | "secret" | "call";
|
|
17
10
|
|
|
18
11
|
/**
|
|
19
12
|
* Reversibility tier — console §9.1 ranking, applied to all seven kinds.
|
|
@@ -135,6 +128,6 @@ export async function recordEffect<T>(
|
|
|
135
128
|
export const EFFECT_KIND_TIERS: ReadonlyArray<{
|
|
136
129
|
kind: EffectKind;
|
|
137
130
|
reversibility: ReversibilityTier;
|
|
138
|
-
}> = (
|
|
139
|
-
|
|
140
|
-
)
|
|
131
|
+
}> = (Object.entries(TIER_BY_KIND) as Array<[EffectKind, ReversibilityTier]>).map(
|
|
132
|
+
([kind, reversibility]) => ({ kind, reversibility }),
|
|
133
|
+
);
|
|
@@ -6,11 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { describe, expect, test } from "bun:test";
|
|
9
|
-
import {
|
|
10
|
-
OKE_ERRORS,
|
|
11
|
-
OkeError,
|
|
12
|
-
type OkeErrorDefinition,
|
|
13
|
-
} from "./errors.ts";
|
|
9
|
+
import { OKE_ERRORS, OkeError, type OkeErrorDefinition } from "./errors.ts";
|
|
14
10
|
|
|
15
11
|
describe("OKE error-code registry", () => {
|
|
16
12
|
test("every code is unique", () => {
|
|
@@ -30,9 +26,7 @@ describe("OKE error-code registry", () => {
|
|
|
30
26
|
test("OkeError docsUrl matches docs origin /e/{code}", () => {
|
|
31
27
|
for (const def of Object.values(OKE_ERRORS) as OkeErrorDefinition[]) {
|
|
32
28
|
const err = new OkeError(def);
|
|
33
|
-
expect(err.docsUrl).toBe(
|
|
34
|
-
`https://okengine.vercel.app/e/${def.code}`,
|
|
35
|
-
);
|
|
29
|
+
expect(err.docsUrl).toBe(`https://oke.omqkhafi.dev/e/${def.code}`);
|
|
36
30
|
expect(err.message).toContain(err.docsUrl);
|
|
37
31
|
expect(err.message).toContain(`OKE${def.code}`);
|
|
38
32
|
expect(err.message).toContain("→");
|
package/src/kernel/errors.ts
CHANGED
|
@@ -99,50 +99,43 @@ export const OKE_ERRORS = {
|
|
|
99
99
|
/** Flow reads a store resource not listed in `effects.reads`. */
|
|
100
100
|
UNDECLARED_READ: {
|
|
101
101
|
code: 1001,
|
|
102
|
-
cause:
|
|
103
|
-
'Flow "{flow}" reads "{resource}" without declaring it.',
|
|
102
|
+
cause: 'Flow "{flow}" reads "{resource}" without declaring it.',
|
|
104
103
|
fix: 'Add "{resource}" to this flow\'s effects.reads.',
|
|
105
104
|
},
|
|
106
105
|
/** Flow writes a store resource not listed in `effects.writes`. */
|
|
107
106
|
UNDECLARED_WRITE: {
|
|
108
107
|
code: 1002,
|
|
109
|
-
cause:
|
|
110
|
-
'Flow "{flow}" writes "{resource}" without declaring it.',
|
|
108
|
+
cause: 'Flow "{flow}" writes "{resource}" without declaring it.',
|
|
111
109
|
fix: 'Add "{resource}" to this flow\'s effects.writes.',
|
|
112
110
|
},
|
|
113
111
|
/** Flow emits a signal not listed in `effects.emits`. */
|
|
114
112
|
UNDECLARED_EMIT: {
|
|
115
113
|
code: 1003,
|
|
116
|
-
cause:
|
|
117
|
-
'Flow "{flow}" emits "{resource}" without declaring it.',
|
|
114
|
+
cause: 'Flow "{flow}" emits "{resource}" without declaring it.',
|
|
118
115
|
fix: 'Add "{resource}" to this flow\'s effects.emits.',
|
|
119
116
|
},
|
|
120
117
|
/** Flow sends a channel template not listed in `effects.sends`. */
|
|
121
118
|
UNDECLARED_SEND: {
|
|
122
119
|
code: 1004,
|
|
123
|
-
cause:
|
|
124
|
-
'Flow "{flow}" sends "{resource}" without declaring it.',
|
|
120
|
+
cause: 'Flow "{flow}" sends "{resource}" without declaring it.',
|
|
125
121
|
fix: 'Add "{resource}" to this flow\'s effects.sends.',
|
|
126
122
|
},
|
|
127
123
|
/** Flow asks a prompt not listed in `effects.asks`. */
|
|
128
124
|
UNDECLARED_ASK: {
|
|
129
125
|
code: 1005,
|
|
130
|
-
cause:
|
|
131
|
-
'Flow "{flow}" asks "{resource}" without declaring it.',
|
|
126
|
+
cause: 'Flow "{flow}" asks "{resource}" without declaring it.',
|
|
132
127
|
fix: 'Add "{resource}" to this flow\'s effects.asks.',
|
|
133
128
|
},
|
|
134
129
|
/** Flow reads a secret not listed in `effects.secrets`. */
|
|
135
130
|
UNDECLARED_SECRET: {
|
|
136
131
|
code: 1006,
|
|
137
|
-
cause:
|
|
138
|
-
'Flow "{flow}" reads secret "{resource}" without declaring it.',
|
|
132
|
+
cause: 'Flow "{flow}" reads secret "{resource}" without declaring it.',
|
|
139
133
|
fix: 'Add "{resource}" to this flow\'s effects.secrets.',
|
|
140
134
|
},
|
|
141
135
|
/** Flow calls another flow not listed in `effects.calls`. */
|
|
142
136
|
UNDECLARED_CALL: {
|
|
143
137
|
code: 1007,
|
|
144
|
-
cause:
|
|
145
|
-
'Flow "{flow}" calls "{resource}" without declaring it.',
|
|
138
|
+
cause: 'Flow "{flow}" calls "{resource}" without declaring it.',
|
|
146
139
|
fix: 'Add "{resource}" to this flow\'s effects.calls.',
|
|
147
140
|
},
|
|
148
141
|
/**
|
|
@@ -151,9 +144,17 @@ export const OKE_ERRORS = {
|
|
|
151
144
|
*/
|
|
152
145
|
ORPHAN_EMIT: {
|
|
153
146
|
code: 1042,
|
|
154
|
-
cause:
|
|
155
|
-
|
|
156
|
-
|
|
147
|
+
cause: 'Flow "{flow}" emits signal "{resource}" with no subscriber.',
|
|
148
|
+
fix: "Add `on({resource}, …)` or mark the signal `{ optional: true }`.",
|
|
149
|
+
},
|
|
150
|
+
/**
|
|
151
|
+
* Domain table/column missing under docker/prod (migrations not applied).
|
|
152
|
+
* Store/DDL band starts at 1100.
|
|
153
|
+
*/
|
|
154
|
+
DOMAIN_SCHEMA_MISSING: {
|
|
155
|
+
code: 1101,
|
|
156
|
+
cause: "domain table not found — migrations have not been applied.",
|
|
157
|
+
fix: "run `oke db migrate` against this environment.",
|
|
157
158
|
},
|
|
158
159
|
} as const satisfies Record<string, OkeErrorDefinition>;
|
|
159
160
|
|
|
@@ -164,10 +165,7 @@ export const OKE_ERRORS = {
|
|
|
164
165
|
* @param params - Interpolation params
|
|
165
166
|
* @returns Never
|
|
166
167
|
*/
|
|
167
|
-
export function throwOke(
|
|
168
|
-
key: keyof typeof OKE_ERRORS,
|
|
169
|
-
params: OkeErrorParams = {},
|
|
170
|
-
): never {
|
|
168
|
+
export function throwOke(key: keyof typeof OKE_ERRORS, params: OkeErrorParams = {}): never {
|
|
171
169
|
throw new OkeError(OKE_ERRORS[key], params);
|
|
172
170
|
}
|
|
173
171
|
|
|
@@ -176,9 +174,7 @@ export function throwOke(
|
|
|
176
174
|
*
|
|
177
175
|
* @param code - Permanent numeric code
|
|
178
176
|
*/
|
|
179
|
-
export function lookupOkeError(
|
|
180
|
-
code: OkeErrorCode,
|
|
181
|
-
): OkeErrorDefinition | undefined {
|
|
177
|
+
export function lookupOkeError(code: OkeErrorCode): OkeErrorDefinition | undefined {
|
|
182
178
|
for (const def of Object.values(OKE_ERRORS)) {
|
|
183
179
|
if (def.code === code) return def;
|
|
184
180
|
}
|
|
@@ -192,14 +188,9 @@ export function lookupOkeError(
|
|
|
192
188
|
* @param data - Error payload
|
|
193
189
|
* @param opts - Optional message override
|
|
194
190
|
*/
|
|
195
|
-
export function fail<E>(
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
opts?: FailOptions,
|
|
199
|
-
): FlowFailure<E> {
|
|
200
|
-
const error: FlowErrorValue<E> = opts?.message !== undefined
|
|
201
|
-
? { code, data, message: opts.message }
|
|
202
|
-
: { code, data };
|
|
191
|
+
export function fail<E>(code: string, data: E, opts?: FailOptions): FlowFailure<E> {
|
|
192
|
+
const error: FlowErrorValue<E> =
|
|
193
|
+
opts?.message !== undefined ? { code, data, message: opts.message } : { code, data };
|
|
203
194
|
return { data: null, error };
|
|
204
195
|
}
|
|
205
196
|
|
package/src/kernel/flow.test.ts
CHANGED
|
@@ -2,12 +2,7 @@ import { describe, expect, test, beforeEach } from "bun:test";
|
|
|
2
2
|
import { oke } from "./app.ts";
|
|
3
3
|
import { flow, isFlow, resetFlowSeq } from "./flow.ts";
|
|
4
4
|
import { on, resetBindings } from "./on.ts";
|
|
5
|
-
import {
|
|
6
|
-
every,
|
|
7
|
-
http,
|
|
8
|
-
internal,
|
|
9
|
-
table,
|
|
10
|
-
} from "./triggers.ts";
|
|
5
|
+
import { every, http, internal, table } from "./triggers.ts";
|
|
11
6
|
|
|
12
7
|
beforeEach(() => {
|
|
13
8
|
resetBindings();
|
|
@@ -55,11 +50,7 @@ describe("flow — one species", () => {
|
|
|
55
50
|
expect(app.bindings[0]?.flow).toBe(shared);
|
|
56
51
|
expect(app.bindings[1]?.flow).toBe(shared);
|
|
57
52
|
|
|
58
|
-
const httpResult = await app.execute(
|
|
59
|
-
shared,
|
|
60
|
-
{ n: 3 },
|
|
61
|
-
shared.triggers[0]!,
|
|
62
|
-
);
|
|
53
|
+
const httpResult = await app.execute(shared, { n: 3 }, shared.triggers[0]!);
|
|
63
54
|
const signalResults = await app.dispatchSignal("order-placed", { n: 4 });
|
|
64
55
|
|
|
65
56
|
expect(httpResult.output).toEqual({ n: 6 });
|
|
@@ -126,29 +117,25 @@ describe("five trigger kinds", () => {
|
|
|
126
117
|
|
|
127
118
|
const app = oke({ name: "five" });
|
|
128
119
|
|
|
129
|
-
const res = await app.fetch(
|
|
130
|
-
new Request("http://localhost/abc", { method: "GET" }),
|
|
131
|
-
);
|
|
120
|
+
const res = await app.fetch(new Request("http://localhost/abc", { method: "GET" }));
|
|
132
121
|
expect(res.status).toBe(200);
|
|
133
122
|
expect(await res.json()).toEqual({ data: { code: "abc" }, error: null });
|
|
134
123
|
|
|
135
124
|
await app.dispatchEvery("1h");
|
|
136
125
|
await app.dispatchSignal("link-clicked", { code: "sa" });
|
|
137
|
-
await app.dispatchCdc(
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
126
|
+
await app.dispatchCdc(
|
|
127
|
+
"orders",
|
|
128
|
+
{
|
|
129
|
+
before: { status: "open" },
|
|
130
|
+
after: { status: "paid" },
|
|
131
|
+
},
|
|
132
|
+
"status",
|
|
133
|
+
);
|
|
141
134
|
|
|
142
135
|
const internalResult = await app.call("t.internal");
|
|
143
136
|
expect(internalResult).toEqual({ ok: true });
|
|
144
137
|
|
|
145
|
-
expect(seen).toEqual([
|
|
146
|
-
"http:abc",
|
|
147
|
-
"every",
|
|
148
|
-
"signal:sa",
|
|
149
|
-
"cdc:open->paid",
|
|
150
|
-
"internal",
|
|
151
|
-
]);
|
|
138
|
+
expect(seen).toEqual(["http:abc", "every", "signal:sa", "cdc:open->paid", "internal"]);
|
|
152
139
|
expect(httpFlow.triggers[0]?.kind).toBe("http");
|
|
153
140
|
});
|
|
154
141
|
});
|