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
|
@@ -5,13 +5,7 @@
|
|
|
5
5
|
* the ClickHouse HTTP interface.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type {
|
|
9
|
-
RunsDriver,
|
|
10
|
-
RunsOpenOptions,
|
|
11
|
-
RunsRow,
|
|
12
|
-
RunsStore,
|
|
13
|
-
WideEvent,
|
|
14
|
-
} from "../types.ts";
|
|
8
|
+
import type { RunsDriver, RunsOpenOptions, RunsRow, RunsStore, WideEvent } from "../types.ts";
|
|
15
9
|
|
|
16
10
|
/** Minimal ClickHouse HTTP-like client. */
|
|
17
11
|
export interface RunsClickHouseClient {
|
|
@@ -72,8 +66,7 @@ export const clickhouseRunsDriver: RunsDriver = {
|
|
|
72
66
|
id: "clickhouse",
|
|
73
67
|
async open(options: RunsOpenOptions = {}): Promise<RunsStore> {
|
|
74
68
|
const client =
|
|
75
|
-
(options.client as RunsClickHouseClient | undefined) ??
|
|
76
|
-
createRunsClickHouseFake();
|
|
69
|
+
(options.client as RunsClickHouseClient | undefined) ?? createRunsClickHouseFake();
|
|
77
70
|
const table = options.name ?? "oke_runs";
|
|
78
71
|
|
|
79
72
|
return {
|
|
@@ -20,13 +20,7 @@ import {
|
|
|
20
20
|
wideEventToRow,
|
|
21
21
|
writeParquet,
|
|
22
22
|
} from "../parquet.ts";
|
|
23
|
-
import type {
|
|
24
|
-
RunsDriver,
|
|
25
|
-
RunsOpenOptions,
|
|
26
|
-
RunsRow,
|
|
27
|
-
RunsStore,
|
|
28
|
-
WideEvent,
|
|
29
|
-
} from "../types.ts";
|
|
23
|
+
import type { RunsDriver, RunsOpenOptions, RunsRow, RunsStore, WideEvent } from "../types.ts";
|
|
30
24
|
|
|
31
25
|
/** Default hot window — 7 days. Older writes go to object storage when present. */
|
|
32
26
|
const DEFAULT_HOT_WINDOW_MS = 7 * 24 * 60 * 60 * 1000;
|
|
@@ -40,14 +34,11 @@ export const filesRunsDriver: RunsDriver = {
|
|
|
40
34
|
const hotWindowMs = options.hotWindowMs ?? DEFAULT_HOT_WINDOW_MS;
|
|
41
35
|
const clock = () => Date.now();
|
|
42
36
|
|
|
43
|
-
const localRoot =
|
|
44
|
-
options.localRoot ??
|
|
45
|
-
(await mkdtemp(join(tmpdir(), "oke-runs-")));
|
|
37
|
+
const localRoot = options.localRoot ?? (await mkdtemp(join(tmpdir(), "oke-runs-")));
|
|
46
38
|
const ownsLocalRoot = options.localRoot === undefined && !options.localBucket;
|
|
47
39
|
|
|
48
40
|
const local: FilesBucket =
|
|
49
|
-
options.localBucket ??
|
|
50
|
-
(await fsDriver.open({ name: "runs-local", root: localRoot }));
|
|
41
|
+
options.localBucket ?? (await fsDriver.open({ name: "runs-local", root: localRoot }));
|
|
51
42
|
|
|
52
43
|
const remote = options.remote?.bucket;
|
|
53
44
|
const remotePrefix = options.remote?.prefix ?? "";
|
|
@@ -112,16 +103,12 @@ export const filesRunsDriver: RunsDriver = {
|
|
|
112
103
|
|
|
113
104
|
async function materialiseAllParquet(): Promise<string[]> {
|
|
114
105
|
if (queryScratch) {
|
|
115
|
-
await rm(queryScratch, { recursive: true, force: true }).catch(
|
|
116
|
-
() => undefined,
|
|
117
|
-
);
|
|
106
|
+
await rm(queryScratch, { recursive: true, force: true }).catch(() => undefined);
|
|
118
107
|
}
|
|
119
108
|
queryScratch = await mkdtemp(join(tmpdir(), "oke-runs-q-"));
|
|
120
109
|
const paths: string[] = [];
|
|
121
110
|
|
|
122
|
-
const localKeys = (await local.list("runs/")).filter((k) =>
|
|
123
|
-
k.endsWith(".parquet"),
|
|
124
|
-
);
|
|
111
|
+
const localKeys = (await local.list("runs/")).filter((k) => k.endsWith(".parquet"));
|
|
125
112
|
for (const key of localKeys) {
|
|
126
113
|
const data = await local.get(key);
|
|
127
114
|
if (!data) continue;
|
|
@@ -131,16 +118,11 @@ export const filesRunsDriver: RunsDriver = {
|
|
|
131
118
|
}
|
|
132
119
|
if (remote) {
|
|
133
120
|
const prefix = `${remotePrefix}runs/`;
|
|
134
|
-
const remoteKeys = (await remote.list(prefix)).filter((k) =>
|
|
135
|
-
k.endsWith(".parquet"),
|
|
136
|
-
);
|
|
121
|
+
const remoteKeys = (await remote.list(prefix)).filter((k) => k.endsWith(".parquet"));
|
|
137
122
|
for (const key of remoteKeys) {
|
|
138
123
|
const data = await remote.get(key);
|
|
139
124
|
if (!data) continue;
|
|
140
|
-
const dest = join(
|
|
141
|
-
queryScratch,
|
|
142
|
-
`remote__${key.replaceAll("/", "__")}`,
|
|
143
|
-
);
|
|
125
|
+
const dest = join(queryScratch, `remote__${key.replaceAll("/", "__")}`);
|
|
144
126
|
await writeFile(dest, data);
|
|
145
127
|
paths.push(dest);
|
|
146
128
|
}
|
|
@@ -184,16 +166,12 @@ export const filesRunsDriver: RunsDriver = {
|
|
|
184
166
|
await flushBuffer();
|
|
185
167
|
session.close();
|
|
186
168
|
if (queryScratch) {
|
|
187
|
-
await rm(queryScratch, { recursive: true, force: true }).catch(
|
|
188
|
-
() => undefined,
|
|
189
|
-
);
|
|
169
|
+
await rm(queryScratch, { recursive: true, force: true }).catch(() => undefined);
|
|
190
170
|
}
|
|
191
171
|
await local.close();
|
|
192
172
|
await remote?.close();
|
|
193
173
|
if (ownsLocalRoot) {
|
|
194
|
-
await rm(localRoot, { recursive: true, force: true }).catch(
|
|
195
|
-
() => undefined,
|
|
196
|
-
);
|
|
174
|
+
await rm(localRoot, { recursive: true, force: true }).catch(() => undefined);
|
|
197
175
|
}
|
|
198
176
|
},
|
|
199
177
|
};
|
|
@@ -6,20 +6,9 @@
|
|
|
6
6
|
|
|
7
7
|
import type { DuckDBConnection } from "@duckdb/node-api";
|
|
8
8
|
|
|
9
|
-
import {
|
|
10
|
-
duckLiteral,
|
|
11
|
-
duckQuery,
|
|
12
|
-
openDuckDB,
|
|
13
|
-
type DuckSession,
|
|
14
|
-
} from "../duckdb.ts";
|
|
9
|
+
import { duckLiteral, duckQuery, openDuckDB, type DuckSession } from "../duckdb.ts";
|
|
15
10
|
import { wideEventToRow, type ParquetRow } from "../parquet.ts";
|
|
16
|
-
import type {
|
|
17
|
-
RunsDriver,
|
|
18
|
-
RunsOpenOptions,
|
|
19
|
-
RunsRow,
|
|
20
|
-
RunsStore,
|
|
21
|
-
WideEvent,
|
|
22
|
-
} from "../types.ts";
|
|
11
|
+
import type { RunsDriver, RunsOpenOptions, RunsRow, RunsStore, WideEvent } from "../types.ts";
|
|
23
12
|
|
|
24
13
|
/**
|
|
25
14
|
* Memory runs driver (DuckDB `:memory:`).
|
|
@@ -65,9 +54,7 @@ export async function materialiseRunsTable(
|
|
|
65
54
|
): Promise<void> {
|
|
66
55
|
await conn.run(`DROP TABLE IF EXISTS runs`);
|
|
67
56
|
if (events.length === 0) {
|
|
68
|
-
await conn.run(
|
|
69
|
-
`CREATE TABLE runs AS SELECT * FROM (SELECT 1 AS id WHERE FALSE)`,
|
|
70
|
-
);
|
|
57
|
+
await conn.run(`CREATE TABLE runs AS SELECT * FROM (SELECT 1 AS id WHERE FALSE)`);
|
|
71
58
|
return;
|
|
72
59
|
}
|
|
73
60
|
// JSONL path avoids VALUES type-inference issues for mixed columns.
|
|
@@ -76,13 +63,9 @@ export async function materialiseRunsTable(
|
|
|
76
63
|
// For small test sets, VALUES is fine and keeps the driver dependency-light.
|
|
77
64
|
const colList = cols.map((c) => `"${c.replaceAll('"', '""')}"`).join(", ");
|
|
78
65
|
const values = rows
|
|
79
|
-
.map(
|
|
80
|
-
(r) => `(${cols.map((c) => duckLiteral(r[c] ?? null)).join(", ")})`,
|
|
81
|
-
)
|
|
66
|
+
.map((r) => `(${cols.map((c) => duckLiteral(r[c] ?? null)).join(", ")})`)
|
|
82
67
|
.join(",\n");
|
|
83
|
-
await conn.run(
|
|
84
|
-
`CREATE TABLE runs AS SELECT * FROM (VALUES ${values}) AS t(${colList})`,
|
|
85
|
-
);
|
|
68
|
+
await conn.run(`CREATE TABLE runs AS SELECT * FROM (VALUES ${values}) AS t(${colList})`);
|
|
86
69
|
}
|
|
87
70
|
|
|
88
71
|
function unionKeys(rows: readonly ParquetRow[]): string[] {
|
|
@@ -4,13 +4,7 @@
|
|
|
4
4
|
* Protocol-named. Uses an injected client in tests; production binds Bun.sql.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import type {
|
|
8
|
-
RunsDriver,
|
|
9
|
-
RunsOpenOptions,
|
|
10
|
-
RunsRow,
|
|
11
|
-
RunsStore,
|
|
12
|
-
WideEvent,
|
|
13
|
-
} from "../types.ts";
|
|
7
|
+
import type { RunsDriver, RunsOpenOptions, RunsRow, RunsStore, WideEvent } from "../types.ts";
|
|
14
8
|
|
|
15
9
|
/** Minimal SQL surface used by the postgres runs driver. */
|
|
16
10
|
export interface RunsPostgresClient {
|
|
@@ -71,21 +65,17 @@ export function createRunsPostgresFake(): RunsPostgresClient & {
|
|
|
71
65
|
export const postgresRunsDriver: RunsDriver = {
|
|
72
66
|
id: "postgres",
|
|
73
67
|
async open(options: RunsOpenOptions = {}): Promise<RunsStore> {
|
|
74
|
-
const client =
|
|
75
|
-
(options.client as RunsPostgresClient | undefined) ??
|
|
76
|
-
createRunsPostgresFake();
|
|
68
|
+
const client = (options.client as RunsPostgresClient | undefined) ?? createRunsPostgresFake();
|
|
77
69
|
const table = options.name ?? "oke_runs";
|
|
78
|
-
await client.exec(
|
|
79
|
-
`CREATE TABLE IF NOT EXISTS ${table} (id TEXT PRIMARY KEY, payload JSONB)`,
|
|
80
|
-
);
|
|
70
|
+
await client.exec(`CREATE TABLE IF NOT EXISTS ${table} (id TEXT PRIMARY KEY, payload JSONB)`);
|
|
81
71
|
|
|
82
72
|
return {
|
|
83
73
|
driverId: "postgres",
|
|
84
74
|
async append(event: WideEvent): Promise<void> {
|
|
85
|
-
await client.exec(
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
);
|
|
75
|
+
await client.exec(`INSERT INTO ${table} (id, payload) VALUES ($1, $2::jsonb)`, [
|
|
76
|
+
event.id,
|
|
77
|
+
JSON.stringify(event),
|
|
78
|
+
]);
|
|
89
79
|
},
|
|
90
80
|
async flush(): Promise<void> {
|
|
91
81
|
/* row-level writes are immediate */
|
|
@@ -97,9 +87,7 @@ export const postgresRunsDriver: RunsDriver = {
|
|
|
97
87
|
const result = await client.query(`SELECT payload FROM ${table}`);
|
|
98
88
|
return result.map((r) => {
|
|
99
89
|
const p = r.payload ?? r;
|
|
100
|
-
return typeof p === "string"
|
|
101
|
-
? (JSON.parse(p) as WideEvent)
|
|
102
|
-
: (p as WideEvent);
|
|
90
|
+
return typeof p === "string" ? (JSON.parse(p) as WideEvent) : (p as WideEvent);
|
|
103
91
|
});
|
|
104
92
|
},
|
|
105
93
|
async close(): Promise<void> {
|
package/src/runs/duckdb.ts
CHANGED
|
@@ -2,10 +2,7 @@
|
|
|
2
2
|
* Thin DuckDB adapter — adopted via `@duckdb/node-api`, not reinvented.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import {
|
|
6
|
-
DuckDBInstance,
|
|
7
|
-
type DuckDBConnection,
|
|
8
|
-
} from "@duckdb/node-api";
|
|
5
|
+
import { DuckDBInstance, type DuckDBConnection } from "@duckdb/node-api";
|
|
9
6
|
|
|
10
7
|
import type { RunsRow } from "./types.ts";
|
|
11
8
|
|
|
@@ -47,10 +44,7 @@ export async function openDuckDB(): Promise<DuckSession> {
|
|
|
47
44
|
* @param conn - DuckDB connection
|
|
48
45
|
* @param sql - SQL text
|
|
49
46
|
*/
|
|
50
|
-
export async function duckQuery(
|
|
51
|
-
conn: DuckDBConnection,
|
|
52
|
-
sql: string,
|
|
53
|
-
): Promise<RunsRow[]> {
|
|
47
|
+
export async function duckQuery(conn: DuckDBConnection, sql: string): Promise<RunsRow[]> {
|
|
54
48
|
const reader = await conn.runAndReadAll(sql);
|
|
55
49
|
const rows = reader.getRowObjectsJson() as RunsRow[];
|
|
56
50
|
return rows.map(normalizeRow);
|
package/src/runs/index.ts
CHANGED
|
@@ -19,16 +19,9 @@ export type {
|
|
|
19
19
|
RunsOpenOptions,
|
|
20
20
|
} from "./types.ts";
|
|
21
21
|
|
|
22
|
-
export {
|
|
23
|
-
createRunTelemetry,
|
|
24
|
-
cacheDimensionOf,
|
|
25
|
-
type RunTelemetry,
|
|
26
|
-
} from "./telemetry.ts";
|
|
22
|
+
export { createRunTelemetry, cacheDimensionOf, type RunTelemetry } from "./telemetry.ts";
|
|
27
23
|
|
|
28
|
-
export {
|
|
29
|
-
collectWideEvent,
|
|
30
|
-
type CollectWideEventInput,
|
|
31
|
-
} from "./collect.ts";
|
|
24
|
+
export { collectWideEvent, type CollectWideEventInput } from "./collect.ts";
|
|
32
25
|
|
|
33
26
|
export {
|
|
34
27
|
explainOutliers,
|
|
@@ -73,11 +66,7 @@ export {
|
|
|
73
66
|
type RunsRuntime,
|
|
74
67
|
} from "./runtime.ts";
|
|
75
68
|
|
|
76
|
-
export {
|
|
77
|
-
privacyErase,
|
|
78
|
-
type PrivacyEraseOptions,
|
|
79
|
-
type PrivacyEraseResult,
|
|
80
|
-
} from "./privacy.ts";
|
|
69
|
+
export { privacyErase, type PrivacyEraseOptions, type PrivacyEraseResult } from "./privacy.ts";
|
|
81
70
|
|
|
82
71
|
export { createRunsPostgresFake } from "./drivers/postgres.ts";
|
|
83
72
|
export { createRunsClickHouseFake } from "./drivers/clickhouse.ts";
|
package/src/runs/outlier.ts
CHANGED
|
@@ -69,14 +69,10 @@ export function explainOutliers(
|
|
|
69
69
|
for (const dim of dimNames) {
|
|
70
70
|
const outlierCounts = valueCounts(outliers, dim);
|
|
71
71
|
const baselineCounts = valueCounts(baseline, dim);
|
|
72
|
-
const values = new Set([
|
|
73
|
-
...outlierCounts.keys(),
|
|
74
|
-
...baselineCounts.keys(),
|
|
75
|
-
]);
|
|
72
|
+
const values = new Set([...outlierCounts.keys(), ...baselineCounts.keys()]);
|
|
76
73
|
for (const value of values) {
|
|
77
74
|
const outlierShare = (outlierCounts.get(value) ?? 0) / outliers.length;
|
|
78
|
-
const baselineShare =
|
|
79
|
-
(baselineCounts.get(value) ?? 0) / baseline.length;
|
|
75
|
+
const baselineShare = (baselineCounts.get(value) ?? 0) / baseline.length;
|
|
80
76
|
const lift = outlierShare - baselineShare;
|
|
81
77
|
if (lift < minLift) continue;
|
|
82
78
|
findings.push({
|
|
@@ -154,10 +150,7 @@ export function seedOutlierDataset(opts?: {
|
|
|
154
150
|
return events;
|
|
155
151
|
}
|
|
156
152
|
|
|
157
|
-
function valueCounts(
|
|
158
|
-
events: readonly WideEvent[],
|
|
159
|
-
dim: string,
|
|
160
|
-
): Map<string, number> {
|
|
153
|
+
function valueCounts(events: readonly WideEvent[], dim: string): Map<string, number> {
|
|
161
154
|
const m = new Map<string, number>();
|
|
162
155
|
for (const e of events) {
|
|
163
156
|
const raw = e.dimensions[dim];
|
package/src/runs/parquet.ts
CHANGED
|
@@ -91,26 +91,16 @@ export function rowToWideEvent(row: Record<string, unknown>): WideEvent {
|
|
|
91
91
|
subjectId: row.subject_id != null ? String(row.subject_id) : null,
|
|
92
92
|
gates: parseJsonArray(row.gates) as string[],
|
|
93
93
|
cache: (row.cache as WideEvent["cache"]) ?? "none",
|
|
94
|
-
...(row.replica != null
|
|
95
|
-
|
|
96
|
-
: {}),
|
|
97
|
-
...(row.replica_lag_ms != null
|
|
98
|
-
? { replicaLagMs: Number(row.replica_lag_ms) }
|
|
99
|
-
: {}),
|
|
94
|
+
...(row.replica != null ? { replica: row.replica as "primary" | "replica" } : {}),
|
|
95
|
+
...(row.replica_lag_ms != null ? { replicaLagMs: Number(row.replica_lag_ms) } : {}),
|
|
100
96
|
...(row.cost != null ? { cost: Number(row.cost) } : {}),
|
|
101
|
-
...(row.prompt_version != null
|
|
102
|
-
|
|
103
|
-
: {}),
|
|
104
|
-
...(row.build_version != null
|
|
105
|
-
? { buildVersion: String(row.build_version) }
|
|
106
|
-
: {}),
|
|
97
|
+
...(row.prompt_version != null ? { promptVersion: Number(row.prompt_version) } : {}),
|
|
98
|
+
...(row.build_version != null ? { buildVersion: String(row.build_version) } : {}),
|
|
107
99
|
error:
|
|
108
100
|
errorCode != null
|
|
109
101
|
? {
|
|
110
102
|
code: String(errorCode),
|
|
111
|
-
...(row.error_message != null
|
|
112
|
-
? { message: String(row.error_message) }
|
|
113
|
-
: {}),
|
|
103
|
+
...(row.error_message != null ? { message: String(row.error_message) } : {}),
|
|
114
104
|
}
|
|
115
105
|
: null,
|
|
116
106
|
effects: parseJsonArray(row.effects) as WideEvent["effects"],
|
|
@@ -129,17 +119,11 @@ export function rowToWideEvent(row: Record<string, unknown>): WideEvent {
|
|
|
129
119
|
* @param path - Absolute output path
|
|
130
120
|
* @param rows - Flattened rows
|
|
131
121
|
*/
|
|
132
|
-
export async function writeParquet(
|
|
133
|
-
path: string,
|
|
134
|
-
rows: readonly ParquetRow[],
|
|
135
|
-
): Promise<void> {
|
|
122
|
+
export async function writeParquet(path: string, rows: readonly ParquetRow[]): Promise<void> {
|
|
136
123
|
if (rows.length === 0) return;
|
|
137
124
|
await mkdir(dirname(path), { recursive: true });
|
|
138
125
|
const jsonl = `${path}.jsonl`;
|
|
139
|
-
await writeFile(
|
|
140
|
-
jsonl,
|
|
141
|
-
rows.map((r) => JSON.stringify(r)).join("\n"),
|
|
142
|
-
);
|
|
126
|
+
await writeFile(jsonl, rows.map((r) => JSON.stringify(r)).join("\n"));
|
|
143
127
|
const session = await openDuckDB();
|
|
144
128
|
try {
|
|
145
129
|
await session.conn.run(
|
|
@@ -156,9 +140,7 @@ export async function writeParquet(
|
|
|
156
140
|
*
|
|
157
141
|
* @param paths - Absolute Parquet paths
|
|
158
142
|
*/
|
|
159
|
-
export async function readParquet(
|
|
160
|
-
paths: readonly string[],
|
|
161
|
-
): Promise<ParquetRow[]> {
|
|
143
|
+
export async function readParquet(paths: readonly string[]): Promise<ParquetRow[]> {
|
|
162
144
|
if (paths.length === 0) return [];
|
|
163
145
|
const session = await openDuckDB();
|
|
164
146
|
try {
|
package/src/runs/privacy.ts
CHANGED
|
@@ -3,11 +3,7 @@
|
|
|
3
3
|
* journal / channel receipts). Deletes the Vault key, not the terabytes.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
eraseSubject,
|
|
8
|
-
subjectKeyName,
|
|
9
|
-
type SubjectKeyVault,
|
|
10
|
-
} from "./shred.ts";
|
|
6
|
+
import { eraseSubject, subjectKeyName, type SubjectKeyVault } from "./shred.ts";
|
|
11
7
|
|
|
12
8
|
/** Options for {@link privacyErase}. */
|
|
13
9
|
export interface PrivacyEraseOptions {
|
|
@@ -34,9 +30,7 @@ export interface PrivacyEraseResult {
|
|
|
34
30
|
*
|
|
35
31
|
* @param options - Subject + vault
|
|
36
32
|
*/
|
|
37
|
-
export function privacyErase(
|
|
38
|
-
options: PrivacyEraseOptions,
|
|
39
|
-
): PrivacyEraseResult {
|
|
33
|
+
export function privacyErase(options: PrivacyEraseOptions): PrivacyEraseResult {
|
|
40
34
|
const key = subjectKeyName(options.subjectId);
|
|
41
35
|
const deleted = eraseSubject(options.subjectKeys, options.subjectId);
|
|
42
36
|
const write = options.write ?? ((t) => process.stdout.write(t));
|
package/src/runs/runs.test.ts
CHANGED
|
@@ -184,9 +184,7 @@ describe("locality — local + object storage", () => {
|
|
|
184
184
|
expect(localKeys.some((k) => k.endsWith(".parquet"))).toBe(true);
|
|
185
185
|
expect(remoteKeys.some((k) => k.endsWith(".parquet"))).toBe(true);
|
|
186
186
|
|
|
187
|
-
const rows = await runs.query(
|
|
188
|
-
"SELECT id, dim_locality AS locality FROM runs ORDER BY id",
|
|
189
|
-
);
|
|
187
|
+
const rows = await runs.query("SELECT id, dim_locality AS locality FROM runs ORDER BY id");
|
|
190
188
|
expect(rows.length).toBe(2);
|
|
191
189
|
const ids = rows.map((r) => String(r.id)).sort();
|
|
192
190
|
expect(ids).toEqual(["archived", "recent"]);
|
|
@@ -242,9 +240,7 @@ describe("crypto-shredding erasure", () => {
|
|
|
242
240
|
|
|
243
241
|
// Snapshot partition bytes before erase
|
|
244
242
|
const bucket = await fsDriver.open({ name: "snap", root: root });
|
|
245
|
-
const keysBefore = (await bucket.list("runs/")).filter((k) =>
|
|
246
|
-
k.endsWith(".parquet"),
|
|
247
|
-
);
|
|
243
|
+
const keysBefore = (await bucket.list("runs/")).filter((k) => k.endsWith(".parquet"));
|
|
248
244
|
expect(keysBefore.length).toBeGreaterThan(0);
|
|
249
245
|
const bytesBefore = await bucket.get(keysBefore[0]!);
|
|
250
246
|
expect(bytesBefore).toBeTruthy();
|
|
@@ -262,9 +258,7 @@ describe("crypto-shredding erasure", () => {
|
|
|
262
258
|
expect(bytesAfter).toEqual(bytesBefore);
|
|
263
259
|
|
|
264
260
|
// Query still returns the row (operational dims intact)
|
|
265
|
-
const rows = await runs.query(
|
|
266
|
-
"SELECT id, subject_id FROM runs WHERE id = 'run_erase'",
|
|
267
|
-
);
|
|
261
|
+
const rows = await runs.query("SELECT id, subject_id FROM runs WHERE id = 'run_erase'");
|
|
268
262
|
expect(rows.length).toBe(1);
|
|
269
263
|
expect(rows[0]!.subject_id).toBe(subjectId);
|
|
270
264
|
|
package/src/runs/runtime.ts
CHANGED
|
@@ -7,17 +7,8 @@ import { clickhouseRunsDriver } from "./drivers/clickhouse.ts";
|
|
|
7
7
|
import { filesRunsDriver } from "./drivers/files.ts";
|
|
8
8
|
import { memoryRunsDriver } from "./drivers/memory.ts";
|
|
9
9
|
import { postgresRunsDriver } from "./drivers/postgres.ts";
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
type ExplainOutliersOptions,
|
|
13
|
-
type OutlierFinding,
|
|
14
|
-
} from "./outlier.ts";
|
|
15
|
-
import {
|
|
16
|
-
archiveFields,
|
|
17
|
-
eraseSubject,
|
|
18
|
-
revealArchived,
|
|
19
|
-
type SubjectKeyVault,
|
|
20
|
-
} from "./shred.ts";
|
|
10
|
+
import { explainOutliers, type ExplainOutliersOptions, type OutlierFinding } from "./outlier.ts";
|
|
11
|
+
import { archiveFields, eraseSubject, revealArchived, type SubjectKeyVault } from "./shred.ts";
|
|
21
12
|
import type {
|
|
22
13
|
RunsDriver,
|
|
23
14
|
RunsDriverId,
|
|
@@ -114,9 +105,7 @@ const DRIVER_BY_ID: Record<RunsDriverId, RunsDriver> = {
|
|
|
114
105
|
*
|
|
115
106
|
* @param driver - Id or driver
|
|
116
107
|
*/
|
|
117
|
-
export function resolveRunsDriver(
|
|
118
|
-
driver?: RunsDriverId | RunsDriver,
|
|
119
|
-
): RunsDriver {
|
|
108
|
+
export function resolveRunsDriver(driver?: RunsDriverId | RunsDriver): RunsDriver {
|
|
120
109
|
if (!driver) return filesRunsDriver;
|
|
121
110
|
if (typeof driver === "string") {
|
|
122
111
|
const d = DRIVER_BY_ID[driver];
|
|
@@ -131,9 +120,7 @@ export function resolveRunsDriver(
|
|
|
131
120
|
*
|
|
132
121
|
* @param options - Driver + locality + subject keys
|
|
133
122
|
*/
|
|
134
|
-
export function createRunsRuntime(
|
|
135
|
-
options: CreateRunsRuntimeOptions = {},
|
|
136
|
-
): RunsRuntime {
|
|
123
|
+
export function createRunsRuntime(options: CreateRunsRuntimeOptions = {}): RunsRuntime {
|
|
137
124
|
const driver = resolveRunsDriver(options.driver);
|
|
138
125
|
let store: RunsStore | undefined;
|
|
139
126
|
const subjectKeys = options.subjectKeys;
|
|
@@ -156,21 +143,14 @@ export function createRunsRuntime(
|
|
|
156
143
|
const s = await ensureStore();
|
|
157
144
|
let archived = input.archived;
|
|
158
145
|
const subjectId =
|
|
159
|
-
input.telemetry.subjectId ??
|
|
160
|
-
input.fx.auth.userId ??
|
|
161
|
-
input.fx.tenant.id ??
|
|
162
|
-
null;
|
|
146
|
+
input.telemetry.subjectId ?? input.fx.auth.userId ?? input.fx.tenant.id ?? null;
|
|
163
147
|
if (
|
|
164
148
|
archiveCleartext &&
|
|
165
149
|
subjectId &&
|
|
166
150
|
subjectKeys &&
|
|
167
151
|
Object.keys(archiveCleartext).length > 0
|
|
168
152
|
) {
|
|
169
|
-
archived = await archiveFields(
|
|
170
|
-
subjectKeys,
|
|
171
|
-
subjectId,
|
|
172
|
-
archiveCleartext,
|
|
173
|
-
);
|
|
153
|
+
archived = await archiveFields(subjectKeys, subjectId, archiveCleartext);
|
|
174
154
|
}
|
|
175
155
|
const event = collectWideEvent({
|
|
176
156
|
...input,
|
|
@@ -221,9 +201,4 @@ export function createRunsRuntime(
|
|
|
221
201
|
};
|
|
222
202
|
}
|
|
223
203
|
|
|
224
|
-
export {
|
|
225
|
-
filesRunsDriver,
|
|
226
|
-
memoryRunsDriver,
|
|
227
|
-
postgresRunsDriver,
|
|
228
|
-
clickhouseRunsDriver,
|
|
229
|
-
};
|
|
204
|
+
export { filesRunsDriver, memoryRunsDriver, postgresRunsDriver, clickhouseRunsDriver };
|
package/src/runs/shred.ts
CHANGED
|
@@ -83,9 +83,7 @@ export function subjectKeysFromVault(vault: VaultRuntime): SubjectKeyVault {
|
|
|
83
83
|
/**
|
|
84
84
|
* In-memory subject-key vault (tests / when no Vault element is wired).
|
|
85
85
|
*/
|
|
86
|
-
export function createMemorySubjectKeys(
|
|
87
|
-
seed?: Readonly<Record<string, string>>,
|
|
88
|
-
): SubjectKeyVault {
|
|
86
|
+
export function createMemorySubjectKeys(seed?: Readonly<Record<string, string>>): SubjectKeyVault {
|
|
89
87
|
const map = new Map<string, string>(Object.entries(seed ?? {}));
|
|
90
88
|
return {
|
|
91
89
|
read(name) {
|
|
@@ -181,26 +179,16 @@ export async function revealArchived(
|
|
|
181
179
|
* @param subjectId - Subject id
|
|
182
180
|
* @returns Whether a key was deleted
|
|
183
181
|
*/
|
|
184
|
-
export function eraseSubject(
|
|
185
|
-
keys: SubjectKeyVault,
|
|
186
|
-
subjectId: string,
|
|
187
|
-
): boolean {
|
|
182
|
+
export function eraseSubject(keys: SubjectKeyVault, subjectId: string): boolean {
|
|
188
183
|
return keys.delete(subjectKeyName(subjectId));
|
|
189
184
|
}
|
|
190
185
|
|
|
191
|
-
async function encryptAesGcm(
|
|
192
|
-
plaintext: string,
|
|
193
|
-
keyBytes: Uint8Array,
|
|
194
|
-
): Promise<string> {
|
|
186
|
+
async function encryptAesGcm(plaintext: string, keyBytes: Uint8Array): Promise<string> {
|
|
195
187
|
const iv = crypto.getRandomValues(new Uint8Array(12));
|
|
196
188
|
const keyBuf = toArrayBuffer(keyBytes);
|
|
197
|
-
const cryptoKey = await crypto.subtle.importKey(
|
|
198
|
-
"
|
|
199
|
-
|
|
200
|
-
{ name: "AES-GCM" },
|
|
201
|
-
false,
|
|
202
|
-
["encrypt"],
|
|
203
|
-
);
|
|
189
|
+
const cryptoKey = await crypto.subtle.importKey("raw", keyBuf, { name: "AES-GCM" }, false, [
|
|
190
|
+
"encrypt",
|
|
191
|
+
]);
|
|
204
192
|
const cipher = await crypto.subtle.encrypt(
|
|
205
193
|
{ name: "AES-GCM", iv },
|
|
206
194
|
cryptoKey,
|
|
@@ -212,21 +200,14 @@ async function encryptAesGcm(
|
|
|
212
200
|
return Buffer.from(packed).toString("base64");
|
|
213
201
|
}
|
|
214
202
|
|
|
215
|
-
async function decryptAesGcm(
|
|
216
|
-
blob: string,
|
|
217
|
-
keyBytes: Uint8Array,
|
|
218
|
-
): Promise<string> {
|
|
203
|
+
async function decryptAesGcm(blob: string, keyBytes: Uint8Array): Promise<string> {
|
|
219
204
|
const packed = Buffer.from(blob, "base64");
|
|
220
205
|
const iv = toArrayBuffer(packed.subarray(0, 12));
|
|
221
206
|
const data = toArrayBuffer(packed.subarray(12));
|
|
222
207
|
const keyBuf = toArrayBuffer(keyBytes);
|
|
223
|
-
const cryptoKey = await crypto.subtle.importKey(
|
|
224
|
-
"
|
|
225
|
-
|
|
226
|
-
{ name: "AES-GCM" },
|
|
227
|
-
false,
|
|
228
|
-
["decrypt"],
|
|
229
|
-
);
|
|
208
|
+
const cryptoKey = await crypto.subtle.importKey("raw", keyBuf, { name: "AES-GCM" }, false, [
|
|
209
|
+
"decrypt",
|
|
210
|
+
]);
|
|
230
211
|
const plain = await crypto.subtle.decrypt(
|
|
231
212
|
{ name: "AES-GCM", iv: new Uint8Array(iv) },
|
|
232
213
|
cryptoKey,
|
package/src/runs/types.ts
CHANGED
|
@@ -26,10 +26,7 @@ export interface RunError {
|
|
|
26
26
|
* Declared / observed dimensions available without manual instrumentation.
|
|
27
27
|
* Extra keys are allowed for outlier analysis.
|
|
28
28
|
*/
|
|
29
|
-
export type RunDimensions = Record<
|
|
30
|
-
string,
|
|
31
|
-
string | number | boolean | null | undefined
|
|
32
|
-
>;
|
|
29
|
+
export type RunDimensions = Record<string, string | number | boolean | null | undefined>;
|
|
33
30
|
|
|
34
31
|
/**
|
|
35
32
|
* One wide event — the atomic observability record.
|
package/src/runtime/bun.ts
CHANGED
|
@@ -26,10 +26,7 @@ export interface BunRuntime extends Runtime {
|
|
|
26
26
|
* @param filename - Path, `":memory:"`, or omit for memory
|
|
27
27
|
* @param options - `bun:sqlite` open options
|
|
28
28
|
*/
|
|
29
|
-
sqlite(
|
|
30
|
-
filename?: string,
|
|
31
|
-
options?: ConstructorParameters<typeof Database>[1],
|
|
32
|
-
): Database;
|
|
29
|
+
sqlite(filename?: string, options?: ConstructorParameters<typeof Database>[1]): Database;
|
|
33
30
|
}
|
|
34
31
|
|
|
35
32
|
/**
|
|
@@ -43,9 +40,7 @@ export function createBunRuntime(): BunRuntime {
|
|
|
43
40
|
env: createEnv(),
|
|
44
41
|
files: createFiles(),
|
|
45
42
|
sqlite(filename = ":memory:", options) {
|
|
46
|
-
return options === undefined
|
|
47
|
-
? new Database(filename)
|
|
48
|
-
: new Database(filename, options);
|
|
43
|
+
return options === undefined ? new Database(filename) : new Database(filename, options);
|
|
49
44
|
},
|
|
50
45
|
serve(app, options) {
|
|
51
46
|
return listenBun(app, options);
|
|
@@ -67,9 +62,7 @@ export function isBunNativePath(path: string): boolean {
|
|
|
67
62
|
return true;
|
|
68
63
|
}
|
|
69
64
|
|
|
70
|
-
type MethodHandlers = Partial<
|
|
71
|
-
Record<string, (req: Request) => Response | Promise<Response>>
|
|
72
|
-
>;
|
|
65
|
+
type MethodHandlers = Partial<Record<string, (req: Request) => Response | Promise<Response>>>;
|
|
73
66
|
|
|
74
67
|
/**
|
|
75
68
|
* Build Bun.serve `routes` from app HTTP bindings.
|
|
@@ -99,11 +92,7 @@ export function buildBunRoutes(
|
|
|
99
92
|
function listenBun(app: FetchApp, options?: ServeOptions): ServerHandle {
|
|
100
93
|
const port = options?.port ?? APP_PORT;
|
|
101
94
|
const hostname = options?.hostname ?? "127.0.0.1";
|
|
102
|
-
const fetchHandler = secureFetch(
|
|
103
|
-
(req) => app.fetch(req),
|
|
104
|
-
options,
|
|
105
|
-
hostname,
|
|
106
|
-
);
|
|
95
|
+
const fetchHandler = secureFetch((req) => app.fetch(req), options, hostname);
|
|
107
96
|
const routes = buildBunRoutes(app, fetchHandler);
|
|
108
97
|
|
|
109
98
|
const server = Bun.serve({
|
|
@@ -12,9 +12,7 @@ import { measureColdStartMedianMs } from "../release/measure.ts";
|
|
|
12
12
|
describe("cold start budget", () => {
|
|
13
13
|
test(`Bun adapter ready in < ${COLD_START_BUDGET_MS} ms`, async () => {
|
|
14
14
|
const median = await measureColdStartMedianMs();
|
|
15
|
-
console.log(
|
|
16
|
-
`cold-start median=${median.toFixed(2)} ms budget=${COLD_START_BUDGET_MS}`,
|
|
17
|
-
);
|
|
15
|
+
console.log(`cold-start median=${median.toFixed(2)} ms budget=${COLD_START_BUDGET_MS}`);
|
|
18
16
|
expect(median).toBeLessThan(COLD_START_BUDGET_MS);
|
|
19
17
|
});
|
|
20
18
|
});
|
|
@@ -3,10 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { afterEach, describe, expect, test } from "bun:test";
|
|
6
|
-
import {
|
|
7
|
-
isSilentDevRequest,
|
|
8
|
-
shouldLogDevRequests,
|
|
9
|
-
} from "./dev-request-log.ts";
|
|
6
|
+
import { isSilentDevRequest, shouldLogDevRequests } from "./dev-request-log.ts";
|
|
10
7
|
|
|
11
8
|
describe("dev-request-log", () => {
|
|
12
9
|
const prev = process.env.OKE_DEV_REQUEST_LOG;
|
|
@@ -103,10 +103,7 @@ export async function timedDevFetch(
|
|
|
103
103
|
handle: (request: Request) => Response | Promise<Response>,
|
|
104
104
|
options: {
|
|
105
105
|
readonly surface?: DevLogSurface;
|
|
106
|
-
readonly resolveFlow?: (
|
|
107
|
-
request: Request,
|
|
108
|
-
response: Response,
|
|
109
|
-
) => string | undefined;
|
|
106
|
+
readonly resolveFlow?: (request: Request, response: Response) => string | undefined;
|
|
110
107
|
/** Skip logging for this path/method. */
|
|
111
108
|
readonly silent?: (request: Request) => boolean;
|
|
112
109
|
} = {},
|