okengine 0.2.6 → 0.2.8
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 +24 -23
- package/README.md +52 -346
- package/docs/spec/console.md +165 -142
- package/docs/spec/example.md +490 -312
- package/docs/spec/four-applications.md +495 -314
- package/docs/spec/unified-theory.md +184 -175
- package/package.json +45 -37
- package/spec/manifest.v1.schema.json +40 -9
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +53 -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 +386 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +163 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev.test.ts +148 -21
- package/src/cli/dev.ts +208 -134
- package/src/cli/doc-drift.test.ts +3 -2
- package/src/cli/doc-drift.ts +21 -50
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +7 -8
- package/src/cli/docker.ts +1 -3
- package/src/cli/doctor-diff-examples.ts +1 -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/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 +41 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +45 -0
- package/src/cli/ports.test.ts +4 -13
- package/src/cli/ports.ts +1 -3
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +2 -7
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- 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 +8 -29
- 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 +96 -30
- package/src/compiler/extract.ts +362 -156
- package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
- 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 +4 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +57 -34
- package/src/config/index.ts +181 -37
- 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 +14 -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 +23 -60
- 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 +112 -20
- package/src/docker/derive.ts +5 -19
- package/src/docker/docker.test.ts +15 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +4 -11
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +5 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +6 -1
- package/src/docker/recipes/rustfs.ts +33 -0
- package/src/docker/stack-id.test.ts +33 -0
- package/src/docker/stack-id.ts +25 -13
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/types.ts +13 -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/fs.ts +2 -8
- package/src/drivers/index.ts +12 -56
- package/src/drivers/memory.ts +14 -41
- 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 +5 -17
- 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-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.ts +1 -5
- package/src/drivers/vault-sops.ts +10 -35
- package/src/drivers/vault-types.ts +1 -7
- 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 +8 -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/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.ts +11 -21
- package/src/elements/store/sql-session.test.ts +50 -0
- package/src/elements/store/sql-session.ts +60 -63
- package/src/elements/store/table.ts +35 -19
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +37 -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 +18 -32
- package/src/elements/vault.test.ts +12 -28
- package/src/elements/vault.ts +8 -12
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +34 -94
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.ts +2 -8
- 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 +17 -17
- package/src/kernel/boot-bind/store.ts +44 -50
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -9
- package/src/kernel/boot.ts +29 -76
- 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/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 +5 -25
- package/src/kernel/fx.test.ts +15 -44
- package/src/kernel/fx.ts +27 -79
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +10 -10
- package/src/kernel/hooks.ts +3 -12
- package/src/kernel/index.ts +4 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +1 -6
- 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 +48 -24
- package/src/kernel/registry.ts +80 -29
- 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 +4 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/index.ts +2 -9
- package/src/manifest/types.ts +29 -5
- 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 +4 -14
- 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/node-import-scan.ts +2 -5
- 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 +15 -43
- 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 +13 -31
- 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/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
|
@@ -2,48 +2,39 @@
|
|
|
2
2
|
* Lazy store binder — loaded only when Store is declared.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
resolveDriverId,
|
|
7
|
-
type ConfigEnv,
|
|
8
|
-
} from "../../config/index.ts";
|
|
5
|
+
import { resolveDomainDdlMode, resolveDriverId, type ConfigEnv } from "../../config/index.ts";
|
|
9
6
|
import { memoryDrivers } from "../../drivers/memory.ts";
|
|
10
7
|
import { postgresDriver } from "../../drivers/postgres.ts";
|
|
11
8
|
import { redisDriver } from "../../drivers/redis.ts";
|
|
12
9
|
import { sqliteDriver } from "../../drivers/sqlite.ts";
|
|
13
10
|
import type { KvDriver, SqlDriver } from "../../drivers/types.ts";
|
|
14
|
-
import {
|
|
15
|
-
createStoreRuntime,
|
|
16
|
-
type StoreRuntime,
|
|
17
|
-
} from "../../elements/store.ts";
|
|
11
|
+
import { createStoreRuntime, type StoreRuntime } from "../../elements/store.ts";
|
|
18
12
|
import type { StoreDecl } from "../../elements/store/declare.ts";
|
|
19
13
|
import type { BootOptions } from "../boot.ts"; // type-only — no cycle at runtime
|
|
20
14
|
|
|
21
15
|
/**
|
|
22
16
|
* Construct a Store runtime and register facet declarations.
|
|
23
17
|
*
|
|
24
|
-
* In
|
|
25
|
-
* `
|
|
18
|
+
* In docker mode (`env === "docker"` / `OKE_DOCKER=1`), SQL/KV resolve from the
|
|
19
|
+
* `docker` driver map (falling back to `prod`) and URLs from `docker/.env.docker`.
|
|
26
20
|
*
|
|
27
21
|
* @param options - Boot options
|
|
28
22
|
* @param env - Active environment
|
|
29
23
|
* @param now - Clock
|
|
30
|
-
* @param
|
|
24
|
+
* @param docker - Prefer compose URLs when opening postgres/redis
|
|
31
25
|
*/
|
|
32
26
|
export function bindStore(
|
|
33
27
|
options: BootOptions,
|
|
34
28
|
env: ConfigEnv,
|
|
35
29
|
now: () => number,
|
|
36
|
-
|
|
30
|
+
docker = false,
|
|
37
31
|
): StoreRuntime {
|
|
38
|
-
const sqlId = resolveSqlDriverId(options, env,
|
|
39
|
-
const kvId = resolveKvDriverId(options, env,
|
|
40
|
-
const sqlUrl = sqlUrlFor(sqlId,
|
|
41
|
-
const kvUrl = kvUrlFor(kvId,
|
|
32
|
+
const sqlId = resolveSqlDriverId(options, env, docker);
|
|
33
|
+
const kvId = resolveKvDriverId(options, env, docker);
|
|
34
|
+
const sqlUrl = sqlUrlFor(sqlId, docker);
|
|
35
|
+
const kvUrl = kvUrlFor(kvId, docker);
|
|
42
36
|
|
|
43
|
-
const sqlBindings: Record<
|
|
44
|
-
string,
|
|
45
|
-
{ name: string; primary: { url: string } }
|
|
46
|
-
> = {};
|
|
37
|
+
const sqlBindings: Record<string, { name: string; primary: { url: string } }> = {};
|
|
47
38
|
const kvBindings: Record<string, { url?: string }> = {};
|
|
48
39
|
|
|
49
40
|
for (const decl of options.stores ?? []) {
|
|
@@ -57,6 +48,9 @@ export function bindStore(
|
|
|
57
48
|
}
|
|
58
49
|
}
|
|
59
50
|
|
|
51
|
+
const autoPush = resolveAutoPush(options);
|
|
52
|
+
const domainDdl = resolveDomainDdlMode(env, autoPush);
|
|
53
|
+
|
|
60
54
|
const store = createStoreRuntime({
|
|
61
55
|
drivers: {
|
|
62
56
|
sql: sqlDriverFor(sqlId),
|
|
@@ -67,6 +61,7 @@ export function bindStore(
|
|
|
67
61
|
sql: sqlBindings,
|
|
68
62
|
kv: kvBindings,
|
|
69
63
|
now,
|
|
64
|
+
domainDdl,
|
|
70
65
|
});
|
|
71
66
|
for (const decl of options.stores ?? []) {
|
|
72
67
|
store.register?.(decl);
|
|
@@ -74,38 +69,42 @@ export function bindStore(
|
|
|
74
69
|
return store;
|
|
75
70
|
}
|
|
76
71
|
|
|
72
|
+
/**
|
|
73
|
+
* Effective `db.autoPush` — config default true; `OKE_DB_AUTO_PUSH=0` opts out.
|
|
74
|
+
*
|
|
75
|
+
* @param options - Boot options
|
|
76
|
+
*/
|
|
77
|
+
function resolveAutoPush(options: BootOptions): boolean {
|
|
78
|
+
const fromEnv = process.env.OKE_DB_AUTO_PUSH?.trim();
|
|
79
|
+
if (fromEnv === "0" || fromEnv === "false") return false;
|
|
80
|
+
if (fromEnv === "1" || fromEnv === "true") return true;
|
|
81
|
+
return options.config?.db?.autoPush !== false;
|
|
82
|
+
}
|
|
83
|
+
|
|
77
84
|
/**
|
|
78
85
|
* @param options - Boot options
|
|
79
86
|
* @param env - Active env
|
|
80
|
-
* @param
|
|
87
|
+
* @param docker - Docker mode
|
|
81
88
|
*/
|
|
82
|
-
export function resolveSqlDriverId(
|
|
83
|
-
options: BootOptions,
|
|
84
|
-
env: ConfigEnv,
|
|
85
|
-
stack: boolean,
|
|
86
|
-
): string {
|
|
89
|
+
export function resolveSqlDriverId(options: BootOptions, env: ConfigEnv, docker: boolean): string {
|
|
87
90
|
const fromEnv = process.env.OKE_SQL_DRIVER?.trim();
|
|
88
|
-
if (
|
|
91
|
+
if (docker && fromEnv) return fromEnv;
|
|
89
92
|
const resolved = resolveDriverId(options.config?.drivers?.store?.sql, env);
|
|
90
93
|
if (resolved) return resolved;
|
|
91
|
-
return
|
|
94
|
+
return docker ? "postgres" : "memory";
|
|
92
95
|
}
|
|
93
96
|
|
|
94
97
|
/**
|
|
95
98
|
* @param options - Boot options
|
|
96
99
|
* @param env - Active env
|
|
97
|
-
* @param
|
|
100
|
+
* @param docker - Docker mode
|
|
98
101
|
*/
|
|
99
|
-
export function resolveKvDriverId(
|
|
100
|
-
options: BootOptions,
|
|
101
|
-
env: ConfigEnv,
|
|
102
|
-
stack: boolean,
|
|
103
|
-
): string {
|
|
102
|
+
export function resolveKvDriverId(options: BootOptions, env: ConfigEnv, docker: boolean): string {
|
|
104
103
|
const fromEnv = process.env.OKE_KV_DRIVER?.trim();
|
|
105
|
-
if (
|
|
104
|
+
if (docker && fromEnv) return fromEnv;
|
|
106
105
|
const resolved = resolveDriverId(options.config?.drivers?.store?.kv, env);
|
|
107
106
|
if (resolved) return resolved;
|
|
108
|
-
return
|
|
107
|
+
return docker ? "redis" : "memory";
|
|
109
108
|
}
|
|
110
109
|
|
|
111
110
|
function sqlDriverFor(id: string): SqlDriver {
|
|
@@ -132,14 +131,13 @@ function kvDriverFor(id: string): KvDriver {
|
|
|
132
131
|
}
|
|
133
132
|
}
|
|
134
133
|
|
|
135
|
-
function sqlUrlFor(sqlId: string,
|
|
134
|
+
function sqlUrlFor(sqlId: string, docker: boolean): string {
|
|
136
135
|
if (sqlId === "postgres") {
|
|
137
|
-
const url =
|
|
138
|
-
process.env.DATABASE_URL ?? process.env.OKE_STORE_SQL_URL ?? undefined;
|
|
136
|
+
const url = process.env.DATABASE_URL ?? process.env.OKE_STORE_SQL_URL ?? undefined;
|
|
139
137
|
if (!url) {
|
|
140
138
|
throw new Error(
|
|
141
|
-
|
|
142
|
-
? "oke boot: postgres driver needs DATABASE_URL (did `oke dev -
|
|
139
|
+
docker
|
|
140
|
+
? "oke boot: postgres driver needs DATABASE_URL (did `oke dev -d` write docker/.env.docker?)"
|
|
143
141
|
: "oke boot: postgres driver needs DATABASE_URL",
|
|
144
142
|
);
|
|
145
143
|
}
|
|
@@ -151,27 +149,23 @@ function sqlUrlFor(sqlId: string, stack: boolean): string {
|
|
|
151
149
|
return ":memory:";
|
|
152
150
|
}
|
|
153
151
|
|
|
154
|
-
function kvUrlFor(kvId: string,
|
|
152
|
+
function kvUrlFor(kvId: string, docker: boolean): string | undefined {
|
|
155
153
|
if (kvId !== "redis") return undefined;
|
|
156
154
|
const url = process.env.REDIS_URL ?? process.env.OKE_STORE_KV_URL ?? undefined;
|
|
157
155
|
if (!url) {
|
|
158
156
|
throw new Error(
|
|
159
|
-
|
|
160
|
-
? "oke boot: redis driver needs REDIS_URL (did `oke dev -
|
|
157
|
+
docker
|
|
158
|
+
? "oke boot: redis driver needs REDIS_URL (did `oke dev -d` write docker/.env.docker?)"
|
|
161
159
|
: "oke boot: redis driver needs REDIS_URL",
|
|
162
160
|
);
|
|
163
161
|
}
|
|
164
162
|
return url;
|
|
165
163
|
}
|
|
166
164
|
|
|
167
|
-
function isSqlDecl(
|
|
168
|
-
decl: StoreDecl,
|
|
169
|
-
): decl is Extract<StoreDecl, { facet: "sql" }> {
|
|
165
|
+
function isSqlDecl(decl: StoreDecl): decl is Extract<StoreDecl, { facet: "sql" }> {
|
|
170
166
|
return decl.facet === "sql";
|
|
171
167
|
}
|
|
172
168
|
|
|
173
|
-
function isKvDecl(
|
|
174
|
-
decl: StoreDecl,
|
|
175
|
-
): decl is Extract<StoreDecl, { facet: "kv" }> {
|
|
169
|
+
function isKvDecl(decl: StoreDecl): decl is Extract<StoreDecl, { facet: "kv" }> {
|
|
176
170
|
return decl.facet === "kv";
|
|
177
171
|
}
|
|
@@ -3,10 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { memoryVaultDriver } from "../../drivers/vault-memory.ts";
|
|
6
|
-
import {
|
|
7
|
-
createVaultRuntime,
|
|
8
|
-
type VaultRuntime,
|
|
9
|
-
} from "../../elements/vault.ts";
|
|
6
|
+
import { createVaultRuntime, type VaultRuntime } from "../../elements/vault.ts";
|
|
10
7
|
import type { ConfigEnv } from "../../config/index.ts";
|
|
11
8
|
import type { BootOptions } from "../boot.ts";
|
|
12
9
|
|
|
@@ -16,10 +13,7 @@ import type { BootOptions } from "../boot.ts";
|
|
|
16
13
|
* @param options - Boot options
|
|
17
14
|
* @param env - Active environment
|
|
18
15
|
*/
|
|
19
|
-
export async function bindVault(
|
|
20
|
-
options: BootOptions,
|
|
21
|
-
env: ConfigEnv,
|
|
22
|
-
): Promise<VaultRuntime> {
|
|
16
|
+
export async function bindVault(options: BootOptions, env: ConfigEnv): Promise<VaultRuntime> {
|
|
23
17
|
const vaultSecrets = options.vault?.secrets ?? options.secrets ?? [];
|
|
24
18
|
const vault = createVaultRuntime({
|
|
25
19
|
secrets: vaultSecrets,
|
package/src/kernel/boot.test.ts
CHANGED
|
@@ -38,10 +38,7 @@ describe("boot — vault gaps", () => {
|
|
|
38
38
|
} catch (err) {
|
|
39
39
|
expect(err).toBeInstanceOf(VaultBootError);
|
|
40
40
|
const boot = err as VaultBootError;
|
|
41
|
-
expect(boot.gaps.map((g) => g.name).sort()).toEqual([
|
|
42
|
-
"DATABASE_URL",
|
|
43
|
-
"STRIPE_KEY",
|
|
44
|
-
]);
|
|
41
|
+
expect(boot.gaps.map((g) => g.name).sort()).toEqual(["DATABASE_URL", "STRIPE_KEY"]);
|
|
45
42
|
expect(boot.message).toContain("STRIPE_KEY");
|
|
46
43
|
expect(boot.message).toContain("DATABASE_URL");
|
|
47
44
|
}
|
|
@@ -206,9 +203,7 @@ describe("boot — HTTP gate wiring lives behind boot", () => {
|
|
|
206
203
|
}),
|
|
207
204
|
);
|
|
208
205
|
const app = oke({ name: "legacy" });
|
|
209
|
-
const res = await app.fetch(
|
|
210
|
-
new Request("http://localhost/ping", { method: "GET" }),
|
|
211
|
-
);
|
|
206
|
+
const res = await app.fetch(new Request("http://localhost/ping", { method: "GET" }));
|
|
212
207
|
expect(res.status).toBe(200);
|
|
213
208
|
});
|
|
214
209
|
});
|
|
@@ -234,10 +229,10 @@ describe("boot — cron autostart via real timer loop", () => {
|
|
|
234
229
|
}),
|
|
235
230
|
);
|
|
236
231
|
|
|
237
|
-
// env: "
|
|
232
|
+
// env: "local" → startScheduler defaults ON. No createTestApp / advance.
|
|
238
233
|
const app = oke({
|
|
239
234
|
name: "cron-autostart",
|
|
240
|
-
env: "
|
|
235
|
+
env: "local",
|
|
241
236
|
schedulerIntervalMs: 1000,
|
|
242
237
|
});
|
|
243
238
|
await app.boot();
|
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);
|
|
@@ -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
|
|
|
@@ -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://okengine.vercel.app/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("→");
|