okengine 0.2.5 → 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 +46 -38
- 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
package/src/mcp/server.ts
CHANGED
|
@@ -8,10 +8,7 @@
|
|
|
8
8
|
* adapters receive structured operator ids.
|
|
9
9
|
*/
|
|
10
10
|
|
|
11
|
-
import {
|
|
12
|
-
logDevRequest,
|
|
13
|
-
shouldLogDevRequests,
|
|
14
|
-
} from "../runtime/dev-request-log.ts";
|
|
11
|
+
import { logDevRequest, shouldLogDevRequests } from "../runtime/dev-request-log.ts";
|
|
15
12
|
import {
|
|
16
13
|
checkRequestSecurity,
|
|
17
14
|
forbiddenResponse,
|
|
@@ -30,11 +27,7 @@ import {
|
|
|
30
27
|
type JsonRpcId,
|
|
31
28
|
type McpInitializeResult,
|
|
32
29
|
} from "./protocol.ts";
|
|
33
|
-
import {
|
|
34
|
-
authenticateMcpRequest,
|
|
35
|
-
extractBearer,
|
|
36
|
-
newMcpTransportSessionId,
|
|
37
|
-
} from "./session.ts";
|
|
30
|
+
import { authenticateMcpRequest, extractBearer, newMcpTransportSessionId } from "./session.ts";
|
|
38
31
|
import { createToolRuntime, type McpContext } from "./tools.ts";
|
|
39
32
|
|
|
40
33
|
/** Options for {@link createMcpServer} / {@link serveMcp}. */
|
|
@@ -118,15 +111,9 @@ export function createMcpServer(options: CreateMcpServerOptions): McpServer {
|
|
|
118
111
|
|
|
119
112
|
let requester;
|
|
120
113
|
try {
|
|
121
|
-
requester = await authenticateMcpRequest(
|
|
122
|
-
options.sessions,
|
|
123
|
-
options.secret,
|
|
124
|
-
bearer,
|
|
125
|
-
now,
|
|
126
|
-
);
|
|
114
|
+
requester = await authenticateMcpRequest(options.sessions, options.secret, bearer, now);
|
|
127
115
|
} catch (err) {
|
|
128
|
-
const message =
|
|
129
|
-
err instanceof SessionError ? err.message : "authentication failed";
|
|
116
|
+
const message = err instanceof SessionError ? err.message : "authentication failed";
|
|
130
117
|
return respond(
|
|
131
118
|
jsonRpcHttp(
|
|
132
119
|
rpcError(
|
|
@@ -148,22 +135,12 @@ export function createMcpServer(options: CreateMcpServerOptions): McpServer {
|
|
|
148
135
|
try {
|
|
149
136
|
body = await request.json();
|
|
150
137
|
} catch {
|
|
151
|
-
return respond(
|
|
152
|
-
jsonRpcHttp(
|
|
153
|
-
rpcError(null, RpcErrorCode.parse, "invalid JSON body"),
|
|
154
|
-
400,
|
|
155
|
-
),
|
|
156
|
-
);
|
|
138
|
+
return respond(jsonRpcHttp(rpcError(null, RpcErrorCode.parse, "invalid JSON body"), 400));
|
|
157
139
|
}
|
|
158
140
|
|
|
159
141
|
const parsed = parseJsonRpcRequest(body);
|
|
160
142
|
if (!parsed.ok) {
|
|
161
|
-
return respond(
|
|
162
|
-
jsonRpcHttp(
|
|
163
|
-
rpcError(null, RpcErrorCode.invalidRequest, parsed.message),
|
|
164
|
-
400,
|
|
165
|
-
),
|
|
166
|
-
);
|
|
143
|
+
return respond(jsonRpcHttp(rpcError(null, RpcErrorCode.invalidRequest, parsed.message), 400));
|
|
167
144
|
}
|
|
168
145
|
|
|
169
146
|
const { request: rpc } = parsed;
|
|
@@ -207,19 +184,10 @@ export function createMcpServer(options: CreateMcpServerOptions): McpServer {
|
|
|
207
184
|
case "tools/call": {
|
|
208
185
|
const call = parseToolsCallParams(rpc.params);
|
|
209
186
|
if (!call.ok) {
|
|
210
|
-
return respond(
|
|
211
|
-
jsonRpcHttp(
|
|
212
|
-
rpcError(id, RpcErrorCode.invalidParams, call.message),
|
|
213
|
-
400,
|
|
214
|
-
),
|
|
215
|
-
);
|
|
187
|
+
return respond(jsonRpcHttp(rpcError(id, RpcErrorCode.invalidParams, call.message), 400));
|
|
216
188
|
}
|
|
217
189
|
flowLabel = call.name;
|
|
218
|
-
const result = await tools.callTool(
|
|
219
|
-
requester,
|
|
220
|
-
call.name,
|
|
221
|
-
call.arguments,
|
|
222
|
-
);
|
|
190
|
+
const result = await tools.callTool(requester, call.name, call.arguments);
|
|
223
191
|
if (!result.ok) {
|
|
224
192
|
const code =
|
|
225
193
|
result.code === "unauthorized"
|
|
@@ -256,11 +224,7 @@ export function createMcpServer(options: CreateMcpServerOptions): McpServer {
|
|
|
256
224
|
default:
|
|
257
225
|
return respond(
|
|
258
226
|
jsonRpcHttp(
|
|
259
|
-
rpcError(
|
|
260
|
-
id,
|
|
261
|
-
RpcErrorCode.methodNotFound,
|
|
262
|
-
`method not found: ${rpc.method}`,
|
|
263
|
-
),
|
|
227
|
+
rpcError(id, RpcErrorCode.methodNotFound, `method not found: ${rpc.method}`),
|
|
264
228
|
404,
|
|
265
229
|
),
|
|
266
230
|
);
|
|
@@ -285,9 +249,7 @@ export interface McpServerHandle extends ServerHandle {
|
|
|
285
249
|
*
|
|
286
250
|
* @param options - Server options
|
|
287
251
|
*/
|
|
288
|
-
export async function serveMcp(
|
|
289
|
-
options: ServeMcpOptions,
|
|
290
|
-
): Promise<McpServerHandle> {
|
|
252
|
+
export async function serveMcp(options: ServeMcpOptions): Promise<McpServerHandle> {
|
|
291
253
|
const hostname = options.hostname ?? "127.0.0.1";
|
|
292
254
|
const port = options.port ?? MCP_PORT;
|
|
293
255
|
const mcp = createMcpServer({ ...options, hostname });
|
|
@@ -311,10 +273,7 @@ export async function serveMcp(
|
|
|
311
273
|
};
|
|
312
274
|
}
|
|
313
275
|
|
|
314
|
-
function jsonRpcHttp(
|
|
315
|
-
body: unknown,
|
|
316
|
-
status = 200,
|
|
317
|
-
): Response {
|
|
276
|
+
function jsonRpcHttp(body: unknown, status = 200): Response {
|
|
318
277
|
return new Response(JSON.stringify(body), {
|
|
319
278
|
status,
|
|
320
279
|
headers: {
|
package/src/mcp/session.ts
CHANGED
|
@@ -21,10 +21,7 @@ import type { AuthPlane } from "../auth/planes.ts";
|
|
|
21
21
|
export const MCP_AUDIENCE = "oke-mcp" as const;
|
|
22
22
|
|
|
23
23
|
/** Other known audiences — rejected by MCP. */
|
|
24
|
-
export const FOREIGN_AUDIENCES = [
|
|
25
|
-
"oke-console",
|
|
26
|
-
"oke-app",
|
|
27
|
-
] as const;
|
|
24
|
+
export const FOREIGN_AUDIENCES = ["oke-console", "oke-app"] as const;
|
|
28
25
|
|
|
29
26
|
/** Verified MCP requester context for one request. */
|
|
30
27
|
export interface McpRequester {
|
|
@@ -49,9 +46,7 @@ export interface MintMcpSessionOptions {
|
|
|
49
46
|
*
|
|
50
47
|
* @param options - Store, secret, principal
|
|
51
48
|
*/
|
|
52
|
-
export async function mintMcpSession(
|
|
53
|
-
options: MintMcpSessionOptions,
|
|
54
|
-
): Promise<IssuedSession> {
|
|
49
|
+
export async function mintMcpSession(options: MintMcpSessionOptions): Promise<IssuedSession> {
|
|
55
50
|
return issueSessionWithScopes(
|
|
56
51
|
options.store,
|
|
57
52
|
{
|
|
@@ -99,13 +94,8 @@ export async function authenticateMcpRequest(
|
|
|
99
94
|
|
|
100
95
|
// Defence in depth: reject known foreign audiences even if verifyAccess
|
|
101
96
|
// somehow ran without the audience option (should be unreachable).
|
|
102
|
-
if (
|
|
103
|
-
|
|
104
|
-
(FOREIGN_AUDIENCES as readonly string[]).includes(claims.aud)
|
|
105
|
-
) {
|
|
106
|
-
throw new SessionError(
|
|
107
|
-
`access token audience mismatch: expected ${MCP_AUDIENCE}`,
|
|
108
|
-
);
|
|
97
|
+
if (claims.aud !== undefined && (FOREIGN_AUDIENCES as readonly string[]).includes(claims.aud)) {
|
|
98
|
+
throw new SessionError(`access token audience mismatch: expected ${MCP_AUDIENCE}`);
|
|
109
99
|
}
|
|
110
100
|
|
|
111
101
|
return {
|
package/src/mcp/tools.ts
CHANGED
|
@@ -7,11 +7,7 @@
|
|
|
7
7
|
|
|
8
8
|
import type { Manifest } from "../manifest/types.ts";
|
|
9
9
|
import type { WideEvent } from "../runs/types.ts";
|
|
10
|
-
import {
|
|
11
|
-
authorizeToolCall,
|
|
12
|
-
MCP_TOOL_POLICIES,
|
|
13
|
-
type McpToolPolicy,
|
|
14
|
-
} from "./authorization.ts";
|
|
10
|
+
import { authorizeToolCall, MCP_TOOL_POLICIES, type McpToolPolicy } from "./authorization.ts";
|
|
15
11
|
import {
|
|
16
12
|
createConfirmationGate,
|
|
17
13
|
MCP_CONFIRM_PHRASE,
|
|
@@ -89,14 +85,10 @@ export function createToolRuntime(
|
|
|
89
85
|
const preflight = authorizeToolCall(name, args, requester.scopes, {
|
|
90
86
|
confirmed: policy?.mutability !== "write",
|
|
91
87
|
});
|
|
92
|
-
if (
|
|
93
|
-
!preflight.ok &&
|
|
94
|
-
preflight.reason !== "confirmation-required"
|
|
95
|
-
) {
|
|
88
|
+
if (!preflight.ok && preflight.reason !== "confirmation-required") {
|
|
96
89
|
return {
|
|
97
90
|
ok: false,
|
|
98
|
-
code:
|
|
99
|
-
preflight.reason === "unknown-tool" ? "not-found" : "forbidden",
|
|
91
|
+
code: preflight.reason === "unknown-tool" ? "not-found" : "forbidden",
|
|
100
92
|
message: preflight.detail ?? preflight.reason,
|
|
101
93
|
data: asData(
|
|
102
94
|
{
|
|
@@ -111,10 +103,8 @@ export function createToolRuntime(
|
|
|
111
103
|
|
|
112
104
|
// Write path: consume a fresh per-call confirmation (no session cache).
|
|
113
105
|
if (policy?.mutability === "write") {
|
|
114
|
-
const token =
|
|
115
|
-
|
|
116
|
-
const phrase =
|
|
117
|
-
typeof args.confirmation === "string" ? args.confirmation : "";
|
|
106
|
+
const token = typeof args.confirmToken === "string" ? args.confirmToken : "";
|
|
107
|
+
const phrase = typeof args.confirmation === "string" ? args.confirmation : "";
|
|
118
108
|
const reason = typeof args.reason === "string" ? args.reason : "";
|
|
119
109
|
const boundArgs = stripConfirmFields(args);
|
|
120
110
|
const consumed = confirm.consume({
|
|
@@ -145,10 +135,7 @@ export function createToolRuntime(
|
|
|
145
135
|
|
|
146
136
|
switch (name) {
|
|
147
137
|
case "oke.manifest.get":
|
|
148
|
-
return okData(
|
|
149
|
-
freezeData({ manifest: ctx.getManifest() }),
|
|
150
|
-
"manifest",
|
|
151
|
-
);
|
|
138
|
+
return okData(freezeData({ manifest: ctx.getManifest() }), "manifest");
|
|
152
139
|
case "oke.schema.get":
|
|
153
140
|
return schemaGet(ctx, args);
|
|
154
141
|
case "oke.effects.get":
|
|
@@ -175,16 +162,11 @@ export function createToolRuntime(
|
|
|
175
162
|
};
|
|
176
163
|
}
|
|
177
164
|
|
|
178
|
-
function okData<T>(
|
|
179
|
-
content: T,
|
|
180
|
-
provenance: Parameters<typeof asData>[1],
|
|
181
|
-
): ToolCallResult {
|
|
165
|
+
function okData<T>(content: T, provenance: Parameters<typeof asData>[1]): ToolCallResult {
|
|
182
166
|
return { ok: true, data: asData(content, provenance) };
|
|
183
167
|
}
|
|
184
168
|
|
|
185
|
-
function stripConfirmFields(
|
|
186
|
-
args: Record<string, unknown>,
|
|
187
|
-
): Record<string, unknown> {
|
|
169
|
+
function stripConfirmFields(args: Record<string, unknown>): Record<string, unknown> {
|
|
188
170
|
const out: Record<string, unknown> = {};
|
|
189
171
|
for (const [k, v] of Object.entries(args)) {
|
|
190
172
|
if (k === "confirmation" || k === "confirmToken" || k === "reason") {
|
|
@@ -195,10 +177,7 @@ function stripConfirmFields(
|
|
|
195
177
|
return out;
|
|
196
178
|
}
|
|
197
179
|
|
|
198
|
-
function schemaGet(
|
|
199
|
-
ctx: McpContext,
|
|
200
|
-
args: Record<string, unknown>,
|
|
201
|
-
): ToolCallResult {
|
|
180
|
+
function schemaGet(ctx: McpContext, args: Record<string, unknown>): ToolCallResult {
|
|
202
181
|
const flowId = String(args.flowId ?? "");
|
|
203
182
|
const manifest = ctx.getManifest();
|
|
204
183
|
const flow = manifest?.flows?.[flowId];
|
|
@@ -221,10 +200,7 @@ function schemaGet(
|
|
|
221
200
|
);
|
|
222
201
|
}
|
|
223
202
|
|
|
224
|
-
function effectsGet(
|
|
225
|
-
ctx: McpContext,
|
|
226
|
-
args: Record<string, unknown>,
|
|
227
|
-
): ToolCallResult {
|
|
203
|
+
function effectsGet(ctx: McpContext, args: Record<string, unknown>): ToolCallResult {
|
|
228
204
|
const flowId = String(args.flowId ?? "");
|
|
229
205
|
const manifest = ctx.getManifest();
|
|
230
206
|
const flow = manifest?.flows?.[flowId];
|
|
@@ -236,34 +212,22 @@ function effectsGet(
|
|
|
236
212
|
data: asData({ flowId }, "error"),
|
|
237
213
|
};
|
|
238
214
|
}
|
|
239
|
-
return okData(
|
|
240
|
-
freezeData({ flowId, effects: flow.effects ?? {} }),
|
|
241
|
-
"effects",
|
|
242
|
-
);
|
|
215
|
+
return okData(freezeData({ flowId, effects: flow.effects ?? {} }), "effects");
|
|
243
216
|
}
|
|
244
217
|
|
|
245
|
-
async function tracesList(
|
|
246
|
-
ctx: McpContext,
|
|
247
|
-
args: Record<string, unknown>,
|
|
248
|
-
): Promise<ToolCallResult> {
|
|
218
|
+
async function tracesList(ctx: McpContext, args: Record<string, unknown>): Promise<ToolCallResult> {
|
|
249
219
|
const limit =
|
|
250
220
|
typeof args.limit === "number" && Number.isFinite(args.limit)
|
|
251
221
|
? Math.min(200, Math.max(1, Math.floor(args.limit)))
|
|
252
222
|
: 50;
|
|
253
|
-
const flowId =
|
|
254
|
-
typeof args.flowId === "string" && args.flowId.length > 0
|
|
255
|
-
? args.flowId
|
|
256
|
-
: null;
|
|
223
|
+
const flowId = typeof args.flowId === "string" && args.flowId.length > 0 ? args.flowId : null;
|
|
257
224
|
const all = await ctx.listRuns();
|
|
258
225
|
const filtered = flowId ? all.filter((r) => r.flow === flowId) : all;
|
|
259
226
|
const runs = filtered.slice(0, limit).map(projectRun);
|
|
260
227
|
return okData(freezeData({ runs }), "trace");
|
|
261
228
|
}
|
|
262
229
|
|
|
263
|
-
async function tracesGet(
|
|
264
|
-
ctx: McpContext,
|
|
265
|
-
args: Record<string, unknown>,
|
|
266
|
-
): Promise<ToolCallResult> {
|
|
230
|
+
async function tracesGet(ctx: McpContext, args: Record<string, unknown>): Promise<ToolCallResult> {
|
|
267
231
|
const runId = String(args.runId ?? "");
|
|
268
232
|
const all = await ctx.listRuns();
|
|
269
233
|
const run = all.find((r) => r.id === runId);
|
|
@@ -29,20 +29,16 @@ describe("CORE catalogue", () => {
|
|
|
29
29
|
});
|
|
30
30
|
|
|
31
31
|
test("tenancy from config or Manifest", () => {
|
|
32
|
-
expect(isTenancyConfigured(null, { tenancy: { isolation: "row" } })).toBe(
|
|
32
|
+
expect(isTenancyConfigured(null, { tenancy: { isolation: "row" } })).toBe(true);
|
|
33
|
+
expect(isTenancyConfigured({ oke: "1.0", app: "x", tenancy: { isolation: "row" } }, null)).toBe(
|
|
33
34
|
true,
|
|
34
35
|
);
|
|
35
|
-
expect(
|
|
36
|
-
isTenancyConfigured({ oke: "1.0", app: "x", tenancy: { isolation: "row" } }, null),
|
|
37
|
-
).toBe(true);
|
|
38
36
|
expect(isTenancyConfigured(null, null)).toBe(false);
|
|
39
37
|
});
|
|
40
38
|
|
|
41
39
|
test("privacy from privacy block or runs.redact", () => {
|
|
42
40
|
expect(isPrivacyConfigured({ privacy: {} })).toBe(true);
|
|
43
|
-
expect(isPrivacyConfigured({ runs: { redact: { email: "7y" } } })).toBe(
|
|
44
|
-
true,
|
|
45
|
-
);
|
|
41
|
+
expect(isPrivacyConfigured({ runs: { redact: { email: "7y" } } })).toBe(true);
|
|
46
42
|
expect(isPrivacyConfigured({})).toBe(false);
|
|
47
43
|
});
|
|
48
44
|
});
|
package/src/plugins/catalogue.ts
CHANGED
|
@@ -104,9 +104,7 @@ export function isTenancyConfigured(
|
|
|
104
104
|
*
|
|
105
105
|
* @param config - Config probe
|
|
106
106
|
*/
|
|
107
|
-
export function isPrivacyConfigured(
|
|
108
|
-
config: PluginConfigProbe | null | undefined,
|
|
109
|
-
): boolean {
|
|
107
|
+
export function isPrivacyConfigured(config: PluginConfigProbe | null | undefined): boolean {
|
|
110
108
|
if (config?.privacy != null) return true;
|
|
111
109
|
if (config?.runs?.redact != null) return true;
|
|
112
110
|
return false;
|
|
@@ -49,9 +49,7 @@ export function scanNodeImportsBypassingFx(
|
|
|
49
49
|
out.push({
|
|
50
50
|
source: file.path,
|
|
51
51
|
specifier,
|
|
52
|
-
line: typeof node.start === "number"
|
|
53
|
-
? lineAt(file.source, node.start)
|
|
54
|
-
: null,
|
|
52
|
+
line: typeof node.start === "number" ? lineAt(file.source, node.start) : null,
|
|
55
53
|
});
|
|
56
54
|
});
|
|
57
55
|
}
|
|
@@ -77,8 +75,7 @@ function importSpecifier(node: AstNode): string | null {
|
|
|
77
75
|
};
|
|
78
76
|
const callee = call.callee;
|
|
79
77
|
const isRequire =
|
|
80
|
-
callee?.type === "Identifier" &&
|
|
81
|
-
(callee as { name?: string }).name === "require";
|
|
78
|
+
callee?.type === "Identifier" && (callee as { name?: string }).name === "require";
|
|
82
79
|
if (!isRequire) return null;
|
|
83
80
|
const arg0 = call.arguments?.[0];
|
|
84
81
|
if (arg0 && (arg0.type === "Literal" || arg0.type === "StringLiteral")) {
|
|
@@ -248,9 +248,7 @@ export function projectSupplyChainSync(
|
|
|
248
248
|
};
|
|
249
249
|
}
|
|
250
250
|
|
|
251
|
-
function projectLifecycle(
|
|
252
|
-
pkg: PackageJsonProbe | null,
|
|
253
|
-
): LifecycleScriptsSignal {
|
|
251
|
+
function projectLifecycle(pkg: PackageJsonProbe | null): LifecycleScriptsSignal {
|
|
254
252
|
if (!pkg) {
|
|
255
253
|
return {
|
|
256
254
|
state: "unknown",
|
|
@@ -335,9 +333,7 @@ function projectNodeScan(
|
|
|
335
333
|
};
|
|
336
334
|
}
|
|
337
335
|
|
|
338
|
-
async function projectProvenance(
|
|
339
|
-
options: ProjectSupplyChainOptions,
|
|
340
|
-
): Promise<NpmProvenanceSignal> {
|
|
336
|
+
async function projectProvenance(options: ProjectSupplyChainOptions): Promise<NpmProvenanceSignal> {
|
|
341
337
|
if (options.provenance === "attested") {
|
|
342
338
|
return { state: "pass", detail: "npm provenance attestation present" };
|
|
343
339
|
}
|
|
@@ -385,10 +381,7 @@ function projectBootConflicts(
|
|
|
385
381
|
};
|
|
386
382
|
}
|
|
387
383
|
|
|
388
|
-
async function readPackageJson(
|
|
389
|
-
cwd: string,
|
|
390
|
-
packageName: string,
|
|
391
|
-
): Promise<PackageJsonProbe | null> {
|
|
384
|
+
async function readPackageJson(cwd: string, packageName: string): Promise<PackageJsonProbe | null> {
|
|
392
385
|
const path = resolve(cwd, "node_modules", ...packageName.split("/"), "package.json");
|
|
393
386
|
try {
|
|
394
387
|
const file = Bun.file(path);
|
|
@@ -422,9 +415,7 @@ async function fetchPublishedAt(
|
|
|
422
415
|
}
|
|
423
416
|
}
|
|
424
417
|
|
|
425
|
-
async function fetchNpmProvenance(
|
|
426
|
-
packageName: string,
|
|
427
|
-
): Promise<NpmProvenanceSignal> {
|
|
418
|
+
async function fetchNpmProvenance(packageName: string): Promise<NpmProvenanceSignal> {
|
|
428
419
|
try {
|
|
429
420
|
const res = await fetch(`https://registry.npmjs.org/${packageName}`, {
|
|
430
421
|
headers: { Accept: "application/json" },
|
|
@@ -437,10 +428,7 @@ async function fetchNpmProvenance(
|
|
|
437
428
|
}
|
|
438
429
|
const body = (await res.json()) as {
|
|
439
430
|
"dist-tags"?: { latest?: string };
|
|
440
|
-
versions?: Record<
|
|
441
|
-
string,
|
|
442
|
-
{ dist?: { attestations?: unknown; signatures?: unknown } }
|
|
443
|
-
>;
|
|
431
|
+
versions?: Record<string, { dist?: { attestations?: unknown; signatures?: unknown } }>;
|
|
444
432
|
};
|
|
445
433
|
const latest = body["dist-tags"]?.latest;
|
|
446
434
|
const dist = latest ? body.versions?.[latest]?.dist : undefined;
|
package/src/release/exports.ts
CHANGED
|
@@ -77,9 +77,7 @@ export function isMeasurableDriverFile(name: string): boolean {
|
|
|
77
77
|
*
|
|
78
78
|
* @param driversDir - Absolute drivers directory
|
|
79
79
|
*/
|
|
80
|
-
export async function listDriverModules(
|
|
81
|
-
driversDir = DRIVERS_DIR,
|
|
82
|
-
): Promise<readonly string[]> {
|
|
80
|
+
export async function listDriverModules(driversDir = DRIVERS_DIR): Promise<readonly string[]> {
|
|
83
81
|
const entries = await readdir(driversDir);
|
|
84
82
|
return entries.filter(isMeasurableDriverFile).sort((a, b) => a.localeCompare(b));
|
|
85
83
|
}
|
|
@@ -96,8 +94,7 @@ export async function resolveExportBudgetTargets(options?: {
|
|
|
96
94
|
}): Promise<readonly ExportBudgetTarget[]> {
|
|
97
95
|
const root = options?.root ?? ROOT;
|
|
98
96
|
const pkg =
|
|
99
|
-
options?.pkg ??
|
|
100
|
-
((await Bun.file(join(root, "package.json")).json()) as PackageExports);
|
|
97
|
+
options?.pkg ?? ((await Bun.file(join(root, "package.json")).json()) as PackageExports);
|
|
101
98
|
const exportsMap = pkg.exports ?? {};
|
|
102
99
|
const driversDir = options?.driversDir ?? join(root, "src/drivers");
|
|
103
100
|
|
|
@@ -106,9 +103,7 @@ export async function resolveExportBudgetTargets(options?: {
|
|
|
106
103
|
for (const [subpath, entryRel] of Object.entries(exportsMap)) {
|
|
107
104
|
if (subpath.endsWith("/*")) {
|
|
108
105
|
if (subpath !== "./drivers/*") {
|
|
109
|
-
throw new Error(
|
|
110
|
-
`unsupported export glob ${subpath}: only ./drivers/* is expanded`,
|
|
111
|
-
);
|
|
106
|
+
throw new Error(`unsupported export glob ${subpath}: only ./drivers/* is expanded`);
|
|
112
107
|
}
|
|
113
108
|
const modules = await listDriverModules(driversDir);
|
|
114
109
|
for (const file of modules) {
|
|
@@ -24,9 +24,7 @@ describe("export gzip budgets", () => {
|
|
|
24
24
|
});
|
|
25
25
|
|
|
26
26
|
test("exportRegressionLimitBytes uses max(floor, 2% of previous)", () => {
|
|
27
|
-
expect(exportRegressionLimitBytes(1000)).toBe(
|
|
28
|
-
1000 + EXPORT_REGRESSION_TOLERANCE_FLOOR_BYTES,
|
|
29
|
-
);
|
|
27
|
+
expect(exportRegressionLimitBytes(1000)).toBe(1000 + EXPORT_REGRESSION_TOLERANCE_FLOOR_BYTES);
|
|
30
28
|
const large = 100_000;
|
|
31
29
|
expect(exportRegressionLimitBytes(large)).toBe(
|
|
32
30
|
large + Math.ceil(large * EXPORT_REGRESSION_TOLERANCE_RATIO),
|
package/src/release/measure.ts
CHANGED
|
@@ -6,10 +6,7 @@ import { mkdtemp, readdir, rm } from "node:fs/promises";
|
|
|
6
6
|
import { tmpdir } from "node:os";
|
|
7
7
|
import { join, resolve } from "node:path";
|
|
8
8
|
import { createRouter } from "../kernel/router.ts";
|
|
9
|
-
import {
|
|
10
|
-
type BudgetGroup,
|
|
11
|
-
resolveExportBudgetTargets,
|
|
12
|
-
} from "./exports.ts";
|
|
9
|
+
import { type BudgetGroup, resolveExportBudgetTargets } from "./exports.ts";
|
|
13
10
|
import {
|
|
14
11
|
CLIENT_BUDGET_BYTES,
|
|
15
12
|
COLD_START_BUDGET_MS,
|
|
@@ -93,9 +90,7 @@ async function gzipBuildOutputs(
|
|
|
93
90
|
label: string,
|
|
94
91
|
): Promise<number> {
|
|
95
92
|
if (!result.success) {
|
|
96
|
-
throw new Error(
|
|
97
|
-
`${label} build failed:\n${result.logs.map(String).join("\n")}`,
|
|
98
|
-
);
|
|
93
|
+
throw new Error(`${label} build failed:\n${result.logs.map(String).join("\n")}`);
|
|
99
94
|
}
|
|
100
95
|
let total = 0;
|
|
101
96
|
for (const artifact of result.outputs) {
|
|
@@ -147,9 +142,7 @@ export async function measureKernelEdgeGzipBytes(): Promise<number> {
|
|
|
147
142
|
external: [...BUILD_EXTERNALS],
|
|
148
143
|
});
|
|
149
144
|
if (!result.success) {
|
|
150
|
-
throw new Error(
|
|
151
|
-
`kernel edge build failed:\n${result.logs.map(String).join("\n")}`,
|
|
152
|
-
);
|
|
145
|
+
throw new Error(`kernel edge build failed:\n${result.logs.map(String).join("\n")}`);
|
|
153
146
|
}
|
|
154
147
|
const artifact = result.outputs[0];
|
|
155
148
|
if (!artifact) throw new Error("kernel edge build produced no output");
|
|
@@ -169,9 +162,7 @@ export async function measureClientGzipBytes(): Promise<number> {
|
|
|
169
162
|
format: "esm",
|
|
170
163
|
});
|
|
171
164
|
if (!result.success) {
|
|
172
|
-
throw new Error(
|
|
173
|
-
`client build failed:\n${result.logs.map(String).join("\n")}`,
|
|
174
|
-
);
|
|
165
|
+
throw new Error(`client build failed:\n${result.logs.map(String).join("\n")}`);
|
|
175
166
|
}
|
|
176
167
|
const artifact = result.outputs[0];
|
|
177
168
|
if (!artifact) throw new Error("client build produced no output");
|
|
@@ -196,11 +187,7 @@ export async function measureExportGzipBytes(entry: string): Promise<number> {
|
|
|
196
187
|
`export function __okeExportBudgetAnchor(){return mod;}\n`,
|
|
197
188
|
);
|
|
198
189
|
try {
|
|
199
|
-
return await measureEntryGzipBytes(
|
|
200
|
-
anchor,
|
|
201
|
-
`export ${entry}`,
|
|
202
|
-
EXPORT_BUILD_EXTERNALS,
|
|
203
|
-
);
|
|
190
|
+
return await measureEntryGzipBytes(anchor, `export ${entry}`, EXPORT_BUILD_EXTERNALS);
|
|
204
191
|
} finally {
|
|
205
192
|
await rm(dir, { recursive: true, force: true });
|
|
206
193
|
}
|
|
@@ -418,12 +405,11 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
|
|
|
418
405
|
// Cold start alone first — parallel gzip work contends for CPU on CI and
|
|
419
406
|
// falsely inflates the wall-clock probe.
|
|
420
407
|
const coldStartMedianMs = await measureColdStartMedianMs();
|
|
421
|
-
const [kernelEdgeGzipBytes, clientGzipBytes, consoleInitialGzipBytes] =
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
]);
|
|
408
|
+
const [kernelEdgeGzipBytes, clientGzipBytes, consoleInitialGzipBytes] = await Promise.all([
|
|
409
|
+
measureKernelEdgeGzipBytes(),
|
|
410
|
+
measureClientGzipBytes(),
|
|
411
|
+
measureConsoleInitialGzipBytes(),
|
|
412
|
+
]);
|
|
427
413
|
const routingP99Ms = measureRoutingP99Ms();
|
|
428
414
|
|
|
429
415
|
const budgets: BudgetSample[] = [
|
|
@@ -482,15 +468,7 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
|
|
|
482
468
|
})),
|
|
483
469
|
);
|
|
484
470
|
for (const { target, bytes } of exportSizes) {
|
|
485
|
-
budgets.push(
|
|
486
|
-
regressionSample(
|
|
487
|
-
target.id,
|
|
488
|
-
target.label,
|
|
489
|
-
target.group,
|
|
490
|
-
bytes,
|
|
491
|
-
previous,
|
|
492
|
-
),
|
|
493
|
-
);
|
|
471
|
+
budgets.push(regressionSample(target.id, target.label, target.group, bytes, previous));
|
|
494
472
|
}
|
|
495
473
|
|
|
496
474
|
return {
|
|
@@ -506,9 +484,7 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
|
|
|
506
484
|
* @param snapshot - Measured budgets
|
|
507
485
|
*/
|
|
508
486
|
export function formatBudgetsReport(snapshot: BudgetsSnapshot): string {
|
|
509
|
-
const lines = [
|
|
510
|
-
`okengine budgets v${snapshot.version} @ ${snapshot.measuredAt}`,
|
|
511
|
-
];
|
|
487
|
+
const lines = [`okengine budgets v${snapshot.version} @ ${snapshot.measuredAt}`];
|
|
512
488
|
const order: readonly BudgetGroup[] = ["core", "exports", "drivers"];
|
|
513
489
|
for (const group of order) {
|
|
514
490
|
const rows = snapshot.budgets.filter((b) => b.group === group);
|
|
@@ -579,8 +555,7 @@ function sample(
|
|
|
579
555
|
gate: BudgetGate,
|
|
580
556
|
group: BudgetGroup,
|
|
581
557
|
): BudgetSample {
|
|
582
|
-
const rounded =
|
|
583
|
-
unit === "bytes" ? Math.round(value) : Math.round(value * 1000) / 1000;
|
|
558
|
+
const rounded = unit === "bytes" ? Math.round(value) : Math.round(value * 1000) / 1000;
|
|
584
559
|
return {
|
|
585
560
|
id,
|
|
586
561
|
label,
|
|
@@ -652,8 +627,7 @@ function formatValue(value: number, unit: BudgetSample["unit"]): string {
|
|
|
652
627
|
*/
|
|
653
628
|
function initialAssetHrefs(html: string): string[] {
|
|
654
629
|
const hrefs: string[] = [];
|
|
655
|
-
const re =
|
|
656
|
-
/(?:src|href)=["'](\/?assets\/[^"']+\.(?:js|css))["']/g;
|
|
630
|
+
const re = /(?:src|href)=["'](\/?assets\/[^"']+\.(?:js|css))["']/g;
|
|
657
631
|
for (const match of html.matchAll(re)) {
|
|
658
632
|
const href = match[1];
|
|
659
633
|
if (href) hrefs.push(href.replace(/^\//, ""));
|
|
@@ -671,9 +645,7 @@ async function gzipFile(path: string): Promise<number> {
|
|
|
671
645
|
*
|
|
672
646
|
* @param dir - Vite outDir
|
|
673
647
|
*/
|
|
674
|
-
export async function consoleBundleBreakdown(
|
|
675
|
-
dir: string,
|
|
676
|
-
): Promise<ConsoleBundleBreakdown> {
|
|
648
|
+
export async function consoleBundleBreakdown(dir: string): Promise<ConsoleBundleBreakdown> {
|
|
677
649
|
const assetsDir = join(dir, "assets");
|
|
678
650
|
const indexPath = join(dir, "index.html");
|
|
679
651
|
const indexFile = Bun.file(indexPath);
|
package/src/runs/bench.test.ts
CHANGED
|
@@ -38,9 +38,7 @@ describe("runs 1M-row query benchmark", () => {
|
|
|
38
38
|
) TO '${duckPath(parquetPath)}' (FORMAT PARQUET, COMPRESSION ZSTD)
|
|
39
39
|
`);
|
|
40
40
|
const genMs = performance.now() - t0;
|
|
41
|
-
console.log(
|
|
42
|
-
`runs-bench generate rows=${ROW_COUNT} parquet_ms=${genMs.toFixed(1)}`,
|
|
43
|
-
);
|
|
41
|
+
console.log(`runs-bench generate rows=${ROW_COUNT} parquet_ms=${genMs.toFixed(1)}`);
|
|
44
42
|
expect(await Bun.file(parquetPath).exists()).toBe(true);
|
|
45
43
|
} finally {
|
|
46
44
|
session.close();
|
package/src/runs/collect.ts
CHANGED
|
@@ -11,10 +11,7 @@ import type { AnyFlowDef } from "../kernel/flow.ts";
|
|
|
11
11
|
import type { Fx } from "../kernel/fx.ts";
|
|
12
12
|
import type { Trigger } from "../kernel/triggers.ts";
|
|
13
13
|
import type { FlowPlane } from "../manifest/types.ts";
|
|
14
|
-
import {
|
|
15
|
-
cacheDimensionOf,
|
|
16
|
-
type RunTelemetry,
|
|
17
|
-
} from "../kernel/run-telemetry.ts";
|
|
14
|
+
import { cacheDimensionOf, type RunTelemetry } from "../kernel/run-telemetry.ts";
|
|
18
15
|
import type { RunError, WideEvent } from "./types.ts";
|
|
19
16
|
|
|
20
17
|
/** Inputs for {@link collectWideEvent}. */
|
|
@@ -57,18 +54,12 @@ export interface CollectWideEventInput {
|
|
|
57
54
|
*/
|
|
58
55
|
export function collectWideEvent(input: CollectWideEventInput): WideEvent {
|
|
59
56
|
const plane: FlowPlane = input.flow.plane ?? "user";
|
|
60
|
-
const principal =
|
|
61
|
-
plane === "operator"
|
|
62
|
-
? input.fx.operator.id
|
|
63
|
-
: input.fx.auth.userId;
|
|
57
|
+
const principal = plane === "operator" ? input.fx.operator.id : input.fx.auth.userId;
|
|
64
58
|
const tenant = input.fx.tenant.id;
|
|
65
|
-
const subjectId =
|
|
66
|
-
input.telemetry.subjectId ?? principal ?? tenant ?? null;
|
|
59
|
+
const subjectId = input.telemetry.subjectId ?? principal ?? tenant ?? null;
|
|
67
60
|
const cache = cacheDimensionOf(input.telemetry);
|
|
68
61
|
const gates =
|
|
69
|
-
input.telemetry.gates.length > 0
|
|
70
|
-
? [...input.telemetry.gates]
|
|
71
|
-
: httpGates(input.trigger);
|
|
62
|
+
input.telemetry.gates.length > 0 ? [...input.telemetry.gates] : httpGates(input.trigger);
|
|
72
63
|
|
|
73
64
|
const error = failureToRunError(input.failure);
|
|
74
65
|
const durationMs = Math.max(0, input.endedAt - input.startedAt);
|
|
@@ -103,9 +94,7 @@ export function collectWideEvent(input: CollectWideEventInput): WideEvent {
|
|
|
103
94
|
subjectId,
|
|
104
95
|
gates,
|
|
105
96
|
cache,
|
|
106
|
-
...(input.telemetry.replica !== undefined
|
|
107
|
-
? { replica: input.telemetry.replica }
|
|
108
|
-
: {}),
|
|
97
|
+
...(input.telemetry.replica !== undefined ? { replica: input.telemetry.replica } : {}),
|
|
109
98
|
...(input.telemetry.replicaLagMs !== undefined
|
|
110
99
|
? { replicaLagMs: input.telemetry.replicaLagMs }
|
|
111
100
|
: {}),
|
|
@@ -113,9 +102,7 @@ export function collectWideEvent(input: CollectWideEventInput): WideEvent {
|
|
|
113
102
|
...(input.telemetry.promptVersion !== undefined
|
|
114
103
|
? { promptVersion: input.telemetry.promptVersion }
|
|
115
104
|
: {}),
|
|
116
|
-
...(input.buildVersion !== undefined
|
|
117
|
-
? { buildVersion: input.buildVersion }
|
|
118
|
-
: {}),
|
|
105
|
+
...(input.buildVersion !== undefined ? { buildVersion: input.buildVersion } : {}),
|
|
119
106
|
error,
|
|
120
107
|
effects: [...input.ledger.entries],
|
|
121
108
|
logs: [...input.telemetry.logs],
|
|
@@ -129,14 +116,10 @@ export function collectWideEvent(input: CollectWideEventInput): WideEvent {
|
|
|
129
116
|
|
|
130
117
|
function httpGates(trigger: Trigger): string[] {
|
|
131
118
|
if (trigger.kind !== "http") return [];
|
|
132
|
-
return trigger.gates.map((g) =>
|
|
133
|
-
typeof g === "string" ? g : g.name,
|
|
134
|
-
);
|
|
119
|
+
return trigger.gates.map((g) => (typeof g === "string" ? g : g.name));
|
|
135
120
|
}
|
|
136
121
|
|
|
137
|
-
function failureToRunError(
|
|
138
|
-
failure: FlowFailure | null | undefined,
|
|
139
|
-
): RunError | null {
|
|
122
|
+
function failureToRunError(failure: FlowFailure | null | undefined): RunError | null {
|
|
140
123
|
if (!failure) return null;
|
|
141
124
|
const code = failure.error?.code ?? "failure";
|
|
142
125
|
const message = failure.error?.message;
|