okengine 0.2.6 → 0.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +33 -30
- package/README.md +74 -340
- package/{spec/manifest.v1.schema.json → manifest.v1.schema.json} +40 -9
- package/package.json +47 -44
- package/site/content/docs/ai/llms-txt.mdx +54 -0
- package/site/content/docs/ai/mcp.mdx +123 -0
- package/site/content/docs/ai/meta.json +5 -0
- package/site/content/docs/ai/skills.mdx +53 -0
- package/site/content/docs/console/access.mdx +29 -0
- package/site/content/docs/console/ai.mdx +35 -0
- package/site/content/docs/console/architecture.mdx +35 -0
- package/site/content/docs/console/channels.mdx +37 -0
- package/site/content/docs/console/clock.mdx +31 -0
- package/site/content/docs/console/flows.mdx +31 -0
- package/site/content/docs/console/gates.mdx +35 -0
- package/site/content/docs/console/manifest-diff.mdx +34 -0
- package/site/content/docs/console/meta.json +23 -0
- package/site/content/docs/console/overview.mdx +40 -0
- package/site/content/docs/console/plugins.mdx +41 -0
- package/site/content/docs/console/privacy.mdx +32 -0
- package/site/content/docs/console/runs.mdx +40 -0
- package/site/content/docs/console/signals.mdx +31 -0
- package/site/content/docs/console/store.mdx +32 -0
- package/site/content/docs/console/tenancy.mdx +32 -0
- package/site/content/docs/console/traces.mdx +34 -0
- package/site/content/docs/console/vault.mdx +37 -0
- package/site/content/docs/elements/ai.mdx +180 -0
- package/site/content/docs/elements/channel.mdx +167 -0
- package/site/content/docs/elements/clock.mdx +182 -0
- package/site/content/docs/elements/flow.mdx +288 -0
- package/site/content/docs/elements/gate.mdx +171 -0
- package/site/content/docs/elements/meta.json +5 -0
- package/site/content/docs/elements/signal.mdx +171 -0
- package/site/content/docs/elements/store.mdx +320 -0
- package/site/content/docs/elements/vault.mdx +263 -0
- package/site/content/docs/get-started/basic-usage.mdx +124 -0
- package/site/content/docs/get-started/comparison.mdx +65 -0
- package/site/content/docs/get-started/installation.mdx +113 -0
- package/site/content/docs/get-started/introduction.mdx +123 -0
- package/site/content/docs/get-started/meta.json +5 -0
- package/site/content/docs/index.mdx +63 -0
- package/site/content/docs/meta.json +5 -0
- package/site/content/docs/plugins/compression.mdx +60 -0
- package/site/content/docs/plugins/cors.mdx +92 -0
- package/site/content/docs/plugins/csrf.mdx +96 -0
- package/site/content/docs/plugins/ip-allowlist.mdx +92 -0
- package/site/content/docs/plugins/maintenance-mode.mdx +101 -0
- package/site/content/docs/plugins/meta.json +15 -0
- package/site/content/docs/plugins/security-headers.mdx +136 -0
- package/site/content/docs/reference/cli.md +101 -0
- package/site/content/docs/reference/configuration.mdx +159 -0
- package/site/content/docs/reference/environment-variables.mdx +87 -0
- package/site/content/docs/reference/errors.mdx +80 -0
- package/site/content/docs/reference/fx.mdx +117 -0
- package/site/content/docs/reference/meta.json +5 -0
- package/site/content/docs/reference/plugins.mdx +249 -0
- package/site/content/docs/reference/security.md +63 -0
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +56 -31
- package/src/auth/invoke-as.ts +1 -3
- package/src/auth/operator.ts +8 -26
- package/src/auth/planes.ts +2 -7
- package/src/auth/plugin.ts +4 -7
- package/src/auth/roles.ts +1 -5
- package/src/auth/sessions.ts +10 -39
- package/src/cli/args.ts +1 -5
- package/src/cli/ask-dev-mode.ts +40 -0
- package/src/cli/build.ts +1 -2
- package/src/cli/client-add.test.ts +8 -15
- package/src/cli/client-add.ts +5 -14
- package/src/cli/completion.test.ts +1 -5
- package/src/cli/completion.ts +4 -17
- package/src/cli/db-auto-push.test.ts +64 -0
- package/src/cli/db-auto-push.ts +72 -0
- package/src/cli/db.test.ts +189 -0
- package/src/cli/db.ts +456 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +193 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev-schema-sync.test.ts +66 -0
- package/src/cli/dev-schema-sync.ts +139 -0
- package/src/cli/dev.test.ts +264 -15
- package/src/cli/dev.ts +355 -139
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +27 -8
- package/src/cli/docker.ts +11 -3
- package/src/cli/doctor-diff.test.ts +1 -5
- package/src/cli/doctor-diff.ts +17 -46
- package/src/cli/doctor-pii.ts +2 -7
- package/src/cli/doctor.test.ts +26 -4
- package/src/cli/doctor.ts +35 -11
- package/src/cli/drizzle-env.test.ts +67 -0
- package/src/cli/drizzle-env.ts +78 -0
- package/src/cli/ensure-drizzle-config.ts +50 -0
- package/src/cli/eval.ts +4 -14
- package/src/cli/gates-list.ts +1 -4
- package/src/cli/hero-meta.test.ts +17 -19
- package/src/cli/hero-meta.ts +20 -30
- package/src/cli/images.ts +3 -8
- package/src/cli/index.ts +11 -2
- package/src/cli/load-config.images.test.ts +14 -14
- package/src/cli/load-config.ts +47 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +65 -0
- package/src/cli/openbao-bootstrap.test.ts +147 -0
- package/src/cli/openbao-bootstrap.ts +280 -0
- package/src/cli/openbao-restart.integration.test.ts +136 -0
- package/src/cli/ports.test.ts +7 -14
- package/src/cli/ports.ts +7 -5
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/resolve-dev-sql-env.test.ts +48 -0
- package/src/cli/resolve-dev-sql-env.ts +42 -0
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +8 -10
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/cli/vault-cmd.ts +63 -0
- package/src/client/budget-entry.ts +1 -6
- package/src/client/create.test.ts +6 -12
- package/src/client/create.ts +2 -8
- package/src/client/errors.ts +1 -4
- package/src/client/index.ts +1 -6
- package/src/client/notes-contract.test.ts +4 -13
- package/src/client/transport.ts +9 -30
- package/src/client/types.ts +15 -30
- package/src/compiler/aot.test.ts +2 -9
- package/src/compiler/aot.ts +1 -4
- package/src/compiler/differential.test.ts +3 -11
- package/src/compiler/dynamic.ts +1 -4
- package/src/compiler/effects-infer.ts +8 -34
- package/src/compiler/emit.ts +1 -3
- package/src/compiler/extract.test.ts +136 -30
- package/src/compiler/extract.ts +485 -157
- package/src/compiler/fixtures/skyport/oke.config.ts +3 -3
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
- package/src/compiler/fixtures/skyport.expected.json +24 -83
- package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
- package/src/compiler/http-parse.ts +2 -9
- package/src/compiler/index.ts +1 -5
- package/src/compiler/response.ts +16 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +55 -34
- package/src/config/index.ts +177 -46
- package/src/config/resolve-driver.test.ts +28 -17
- package/src/console/budget.test.ts +1 -4
- package/src/console/index.ts +1 -4
- package/src/console/server/access.test.ts +15 -43
- package/src/console/server/access.ts +19 -49
- package/src/console/server/ai.test.ts +3 -11
- package/src/console/server/ai.ts +23 -46
- package/src/console/server/app.ts +16 -45
- package/src/console/server/auth-rate.test.ts +4 -12
- package/src/console/server/bind.ts +1 -5
- package/src/console/server/channels.test.ts +2 -6
- package/src/console/server/channels.ts +10 -35
- package/src/console/server/claim.ts +2 -8
- package/src/console/server/clock.test.ts +2 -6
- package/src/console/server/clock.ts +8 -26
- package/src/console/server/console.test.ts +1 -3
- package/src/console/server/diff.test.ts +5 -17
- package/src/console/server/diff.ts +10 -31
- package/src/console/server/dry-run.audit.test.ts +2 -8
- package/src/console/server/flows.ts +64 -233
- package/src/console/server/gates.test.ts +14 -50
- package/src/console/server/gates.ts +13 -48
- package/src/console/server/index.ts +2 -9
- package/src/console/server/live.ts +3 -12
- package/src/console/server/operator-db.test.ts +4 -15
- package/src/console/server/operator-db.ts +13 -32
- package/src/console/server/plugin.ts +50 -53
- package/src/console/server/plugins.test.ts +2 -6
- package/src/console/server/plugins.ts +17 -56
- package/src/console/server/runs-pii.ts +2 -7
- package/src/console/server/security.gate.test.ts +18 -40
- package/src/console/server/serve.ts +10 -25
- package/src/console/server/signals.test.ts +1 -3
- package/src/console/server/signals.ts +17 -40
- package/src/console/server/state.ts +21 -59
- package/src/console/server/store.test.ts +20 -22
- package/src/console/server/store.ts +31 -76
- package/src/console/server/vault.test.ts +12 -29
- package/src/console/server/vault.ts +44 -66
- package/src/console/ui/access/AccessA11yView.tsx +6 -21
- package/src/console/ui/access/a11y.test.tsx +3 -12
- package/src/console/ui/access/acknowledgement.test.ts +1 -4
- package/src/console/ui/access/acknowledgement.ts +1 -3
- package/src/console/ui/access/blast-radius.ts +1 -3
- package/src/console/ui/access/confirmation.test.ts +1 -5
- package/src/console/ui/access/confirmation.ts +1 -4
- package/src/console/ui/access/fixture.ts +1 -5
- package/src/console/ui/access/grantable.test.ts +1 -3
- package/src/console/ui/access/grantable.ts +2 -7
- package/src/console/ui/access/index.ts +2 -9
- package/src/console/ui/access/provenance.test.ts +1 -3
- package/src/console/ui/access/provenance.ts +2 -6
- package/src/console/ui/access/search.test.ts +1 -5
- package/src/console/ui/access/search.ts +2 -6
- package/src/console/ui/ai/AiA11yView.tsx +6 -17
- package/src/console/ui/ai/a11y.test.tsx +2 -5
- package/src/console/ui/ai/fixture.ts +2 -7
- package/src/console/ui/ai/format.ts +1 -3
- package/src/console/ui/ai/group.test.ts +1 -3
- package/src/console/ui/ai/group.ts +4 -12
- package/src/console/ui/ai/index.ts +2 -9
- package/src/console/ui/ai/promotion.test.ts +2 -7
- package/src/console/ui/ai/promotion.ts +4 -13
- package/src/console/ui/ai/search.test.ts +2 -11
- package/src/console/ui/ai/search.ts +3 -13
- package/src/console/ui/ai/types.ts +1 -8
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
- package/src/console/ui/architecture/a11y.test.tsx +1 -2
- package/src/console/ui/architecture/declared.ts +1 -5
- package/src/console/ui/architecture/index.ts +7 -35
- package/src/console/ui/architecture/layout.ts +1 -3
- package/src/console/ui/architecture/pathologies.ts +10 -19
- package/src/console/ui/architecture/search.ts +6 -15
- package/src/console/ui/architecture/traffic.ts +4 -14
- package/src/console/ui/architecture/types.ts +2 -10
- package/src/console/ui/architecture/view.test.ts +7 -19
- package/src/console/ui/architecture/view.ts +9 -36
- package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
- package/src/console/ui/channels/a11y.test.tsx +1 -2
- package/src/console/ui/channels/confirmation.test.ts +1 -4
- package/src/console/ui/channels/confirmation.ts +1 -4
- package/src/console/ui/channels/findings.ts +1 -5
- package/src/console/ui/channels/index.ts +2 -8
- package/src/console/ui/channels/locale.test.ts +1 -3
- package/src/console/ui/channels/locale.ts +2 -8
- package/src/console/ui/channels/search.ts +4 -13
- package/src/console/ui/channels/taxonomy.ts +1 -3
- package/src/console/ui/clock/ClockA11yView.tsx +9 -26
- package/src/console/ui/clock/a11y.test.tsx +2 -5
- package/src/console/ui/clock/confirmation.test.ts +1 -3
- package/src/console/ui/clock/confirmation.ts +1 -4
- package/src/console/ui/clock/findings.ts +1 -4
- package/src/console/ui/clock/health.ts +2 -7
- package/src/console/ui/clock/index.ts +2 -10
- package/src/console/ui/clock/search.test.ts +1 -3
- package/src/console/ui/clock/search.ts +2 -6
- package/src/console/ui/clock/timeline.test.ts +1 -3
- package/src/console/ui/clock/waiting-on.test.ts +1 -5
- package/src/console/ui/clock/waiting-on.ts +2 -7
- package/src/console/ui/diff/DiffA11yView.tsx +8 -17
- package/src/console/ui/diff/a11y.test.tsx +2 -5
- package/src/console/ui/diff/group.test.ts +3 -13
- package/src/console/ui/diff/group.ts +2 -8
- package/src/console/ui/diff/index.ts +2 -8
- package/src/console/ui/diff/search.test.ts +1 -5
- package/src/console/ui/diff/search.ts +4 -16
- package/src/console/ui/diff/summary.ts +1 -2
- package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
- package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
- package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
- package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
- package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
- package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
- package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
- package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
- package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
- package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
- package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
- package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
- package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
- package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
- package/src/console/ui/flows/a11y.test.tsx +2 -8
- package/src/console/ui/flows/buffer.test.ts +3 -11
- package/src/console/ui/flows/buffer.ts +4 -11
- package/src/console/ui/flows/confirmation.ts +1 -3
- package/src/console/ui/flows/contract.test.ts +3 -7
- package/src/console/ui/flows/contract.ts +12 -36
- package/src/console/ui/flows/graph.test.ts +3 -11
- package/src/console/ui/flows/graph.ts +5 -15
- package/src/console/ui/flows/index.ts +1 -6
- package/src/console/ui/flows/save-as-test.ts +1 -3
- package/src/console/ui/flows/search.ts +8 -25
- package/src/console/ui/flows/tiers.ts +2 -9
- package/src/console/ui/gates/GatesA11yView.tsx +4 -13
- package/src/console/ui/gates/a11y.test.tsx +2 -5
- package/src/console/ui/gates/audit.ts +1 -3
- package/src/console/ui/gates/denial.test.ts +1 -3
- package/src/console/ui/gates/denial.ts +4 -12
- package/src/console/ui/gates/findings.ts +1 -3
- package/src/console/ui/gates/group.test.ts +3 -3
- package/src/console/ui/gates/group.ts +3 -11
- package/src/console/ui/gates/index.ts +2 -10
- package/src/console/ui/gates/search.ts +3 -10
- package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
- package/src/console/ui/overview/a11y.test.tsx +1 -2
- package/src/console/ui/overview/busiest.ts +1 -3
- package/src/console/ui/overview/compose.ts +1 -13
- package/src/console/ui/overview/cost.ts +34 -38
- package/src/console/ui/overview/fixture.ts +21 -26
- package/src/console/ui/overview/golden.ts +4 -14
- package/src/console/ui/overview/index.ts +2 -9
- package/src/console/ui/overview/rank.test.ts +3 -10
- package/src/console/ui/overview/rank.ts +2 -7
- package/src/console/ui/overview/slo.test.ts +5 -9
- package/src/console/ui/overview/slo.ts +6 -23
- package/src/console/ui/overview/verdict.ts +3 -10
- package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
- package/src/console/ui/plugins/a11y.test.tsx +1 -2
- package/src/console/ui/plugins/fixture.ts +2 -4
- package/src/console/ui/plugins/group.test.ts +1 -3
- package/src/console/ui/plugins/group.ts +1 -6
- package/src/console/ui/plugins/index.ts +3 -13
- package/src/console/ui/plugins/search.ts +7 -19
- package/src/console/ui/runs/RunsA11yView.tsx +5 -20
- package/src/console/ui/runs/a11y.test.tsx +2 -5
- package/src/console/ui/runs/explain.ts +2 -6
- package/src/console/ui/runs/group.ts +3 -12
- package/src/console/ui/runs/histogram.test.ts +2 -11
- package/src/console/ui/runs/histogram.ts +1 -4
- package/src/console/ui/runs/index.ts +4 -18
- package/src/console/ui/runs/project.ts +2 -6
- package/src/console/ui/runs/query.test.ts +1 -3
- package/src/console/ui/runs/query.ts +12 -35
- package/src/console/ui/runs/search.ts +5 -19
- package/src/console/ui/runs/trace-link.test.ts +2 -6
- package/src/console/ui/runs/trace-link.ts +4 -16
- package/src/console/ui/runs/types.ts +1 -3
- package/src/console/ui/shell/App.tsx +2 -10
- package/src/console/ui/shell/client.ts +22 -115
- package/src/console/ui/shell/components/ui.tsx +1 -4
- package/src/console/ui/shell/layout/Shell.tsx +2 -4
- package/src/console/ui/shell/main.tsx +31 -96
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
- package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
- package/src/console/ui/shell/setup/Wizard.tsx +3 -5
- package/src/console/ui/shell/styles.css +1 -2
- package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
- package/src/console/ui/signals/a11y.test.tsx +2 -5
- package/src/console/ui/signals/confirmation.test.ts +1 -5
- package/src/console/ui/signals/confirmation.ts +2 -6
- package/src/console/ui/signals/dry-run.ts +1 -3
- package/src/console/ui/signals/durable.ts +1 -3
- package/src/console/ui/signals/findings.ts +1 -3
- package/src/console/ui/signals/group.test.ts +2 -8
- package/src/console/ui/signals/group.ts +2 -10
- package/src/console/ui/signals/index.ts +1 -4
- package/src/console/ui/signals/monitor.ts +2 -7
- package/src/console/ui/signals/schema-form.test.ts +3 -14
- package/src/console/ui/signals/schema-form.ts +1 -4
- package/src/console/ui/signals/search.ts +4 -13
- package/src/console/ui/store/StoreA11yView.tsx +3 -9
- package/src/console/ui/store/a11y.test.tsx +2 -5
- package/src/console/ui/store/confirmation.test.ts +1 -3
- package/src/console/ui/store/confirmation.ts +1 -4
- package/src/console/ui/store/dry-run.ts +2 -5
- package/src/console/ui/store/fixture.ts +1 -2
- package/src/console/ui/store/group.test.ts +1 -6
- package/src/console/ui/store/group.ts +1 -4
- package/src/console/ui/store/index.ts +1 -5
- package/src/console/ui/store/search.ts +2 -6
- package/src/console/ui/store/will-not-fire.ts +1 -2
- package/src/console/ui/traces/TracesA11yView.tsx +10 -29
- package/src/console/ui/traces/a11y.test.tsx +1 -2
- package/src/console/ui/traces/chain.test.ts +5 -19
- package/src/console/ui/traces/chain.ts +1 -3
- package/src/console/ui/traces/critical-path.test.ts +1 -3
- package/src/console/ui/traces/critical-path.ts +2 -6
- package/src/console/ui/traces/filter.test.ts +2 -6
- package/src/console/ui/traces/filter.ts +5 -13
- package/src/console/ui/traces/fold.test.ts +4 -12
- package/src/console/ui/traces/fold.ts +1 -3
- package/src/console/ui/traces/mini.ts +1 -3
- package/src/console/ui/traces/replay.test.ts +1 -3
- package/src/console/ui/traces/replay.ts +1 -3
- package/src/console/ui/traces/sampling.ts +1 -4
- package/src/console/ui/traces/search.ts +4 -17
- package/src/console/ui/traces/tier.ts +1 -3
- package/src/console/ui/vault/VaultA11yView.tsx +5 -17
- package/src/console/ui/vault/a11y.test.tsx +1 -2
- package/src/console/ui/vault/blast-radius.ts +1 -3
- package/src/console/ui/vault/confirmation.test.ts +1 -5
- package/src/console/ui/vault/confirmation.ts +1 -4
- package/src/console/ui/vault/dormant.test.ts +1 -4
- package/src/console/ui/vault/export-safe.test.ts +1 -5
- package/src/console/ui/vault/export-safe.ts +1 -4
- package/src/console/ui/vault/fixture.ts +3 -3
- package/src/console/ui/vault/group.ts +1 -2
- package/src/console/ui/vault/index.ts +2 -10
- package/src/console/ui/vault/search.ts +2 -6
- package/src/console/ui/vault/types.ts +1 -1
- package/src/console/xss.gate.test.ts +1 -3
- package/src/docker/compose.ts +215 -27
- package/src/docker/derive.ts +6 -14
- package/src/docker/docker.test.ts +118 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +9 -6
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +6 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/openbao.ts +47 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +11 -2
- package/src/docker/recipes/rustfs.ts +32 -0
- package/src/docker/stack-id.test.ts +73 -5
- package/src/docker/stack-id.ts +124 -33
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/stack.ts +36 -4
- package/src/docker/types.ts +16 -4
- package/src/docs-origin.ts +4 -4
- package/src/drivers/ai-anthropic.ts +5 -14
- package/src/drivers/ai-mock.ts +2 -5
- package/src/drivers/ai-openai-compatible.ts +4 -10
- package/src/drivers/ai-providers.test.ts +6 -13
- package/src/drivers/bun-native-completeness.test.ts +6 -15
- package/src/drivers/channel-console.ts +6 -7
- package/src/drivers/channel-fcm.ts +20 -30
- package/src/drivers/channel-resend.ts +1 -3
- package/src/drivers/channel-smtp.ts +2 -6
- package/src/drivers/channel-types.ts +2 -12
- package/src/drivers/channel-unifonic.ts +2 -6
- package/src/drivers/channel-wa-cloud.ts +2 -6
- package/src/drivers/channel-webpush.ts +21 -60
- package/src/drivers/conformance.test.ts +2 -10
- package/src/drivers/conformance.ts +8 -21
- package/src/drivers/drizzle-dialect.test.ts +20 -0
- package/src/drivers/drizzle-dialect.ts +37 -0
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -57
- package/src/drivers/memory.ts +287 -75
- package/src/drivers/pgvector.ts +7 -11
- package/src/drivers/postgres.ts +7 -13
- package/src/drivers/redis.ts +13 -37
- package/src/drivers/s3.ts +15 -18
- package/src/drivers/signal-engine.ts +12 -49
- package/src/drivers/signal-memory.ts +2 -8
- package/src/drivers/signal-nats.ts +4 -9
- package/src/drivers/signal-postgres.ts +62 -129
- package/src/drivers/signal-redis.ts +7 -21
- package/src/drivers/signal-types.ts +1 -4
- package/src/drivers/sqlite.ts +3 -12
- package/src/drivers/types.ts +4 -23
- package/src/drivers/vault-driver-removal.test.ts +55 -0
- package/src/drivers/vault-env.ts +2 -6
- package/src/drivers/vault-infisical.ts +1 -5
- package/src/drivers/vault-managed.ts +1 -5
- package/src/drivers/vault-memory.ts +1 -5
- package/src/drivers/vault-openbao.test.ts +97 -0
- package/src/drivers/vault-openbao.ts +103 -40
- package/src/drivers/vault-types.ts +3 -16
- package/src/elements/ai/declare.ts +4 -14
- package/src/elements/ai/eval.ts +2 -6
- package/src/elements/ai/pii.ts +1 -3
- package/src/elements/ai/runtime.ts +12 -50
- package/src/elements/ai/schema.ts +4 -15
- package/src/elements/ai.test.ts +13 -24
- package/src/elements/ai.ts +1 -5
- package/src/elements/channel/consent.ts +3 -12
- package/src/elements/channel/costs.ts +4 -15
- package/src/elements/channel/declare.ts +1 -4
- package/src/elements/channel/email-auth.ts +1 -4
- package/src/elements/channel/locale.ts +2 -10
- package/src/elements/channel/mask.ts +1 -3
- package/src/elements/channel/mime.ts +2 -12
- package/src/elements/channel/outcomes.test.ts +1 -5
- package/src/elements/channel/outcomes.ts +5 -15
- package/src/elements/channel/receipts.ts +2 -7
- package/src/elements/channel/runtime.ts +28 -74
- package/src/elements/channel/suppression.ts +8 -14
- package/src/elements/channel.test.ts +8 -31
- package/src/elements/channel.ts +3 -14
- package/src/elements/clock/actions.ts +6 -18
- package/src/elements/clock/declare.ts +1 -3
- package/src/elements/clock/dst.ts +1 -5
- package/src/elements/clock/durable.ts +4 -16
- package/src/elements/clock/health.ts +2 -7
- package/src/elements/clock/leader.ts +2 -9
- package/src/elements/clock/reconcile.ts +4 -15
- package/src/elements/clock/runtime.ts +2 -5
- package/src/elements/clock/schedule.ts +4 -20
- package/src/elements/clock.test.ts +2 -7
- package/src/elements/clock.ts +5 -23
- package/src/elements/gate/permissions.ts +1 -4
- package/src/elements/gate/runtime.ts +7 -28
- package/src/elements/gate.ts +1 -5
- package/src/elements/index.ts +9 -7
- package/src/elements/signal/declare.ts +2 -7
- package/src/elements/signal/reconcile.test.ts +1 -4
- package/src/elements/signal/runtime.ts +1 -3
- package/src/elements/signal.test.ts +3 -15
- package/src/elements/signal.ts +2 -8
- package/src/elements/store/cache.test.ts +46 -0
- package/src/elements/store/cache.ts +3 -11
- package/src/elements/store/classify.ts +5 -22
- package/src/elements/store/declare.ts +11 -17
- package/src/elements/store/domain-ddl.test.ts +86 -0
- package/src/elements/store/emit-drizzle.ts +363 -0
- package/src/elements/store/files-policy.test.ts +1 -5
- package/src/elements/store/files-policy.ts +4 -12
- package/src/elements/store/load-plugin-tables.ts +103 -0
- package/src/elements/store/missing-relation.test.ts +83 -0
- package/src/elements/store/missing-relation.ts +38 -0
- package/src/elements/store/replica.ts +1 -4
- package/src/elements/store/resource-list-docs.fixture.ts +56 -0
- package/src/elements/store/resource-list-docs.test.ts +79 -0
- package/src/elements/store/resource.test.ts +253 -0
- package/src/elements/store/resource.ts +786 -0
- package/src/elements/store/runtime.ts +25 -28
- package/src/elements/store/schema-decl.test.ts +227 -0
- package/src/elements/store/schema-decl.ts +516 -0
- package/src/elements/store/sql-condition.test.ts +132 -0
- package/src/elements/store/sql-condition.ts +293 -65
- package/src/elements/store/sql-session.test.ts +135 -0
- package/src/elements/store/sql-session.ts +241 -84
- package/src/elements/store/table.ts +69 -23
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +53 -31
- package/src/elements/vault/chain.ts +34 -0
- package/src/elements/vault/declare.ts +22 -32
- package/src/elements/vault/fingerprint.ts +2 -7
- package/src/elements/vault/redact.ts +2 -6
- package/src/elements/vault/runtime.ts +19 -33
- package/src/elements/vault.test.ts +12 -55
- package/src/elements/vault.ts +9 -13
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +92 -118
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.test.ts +60 -0
- package/src/kernel/boot-bind/channel.ts +61 -5
- package/src/kernel/boot-bind/clock.ts +2 -6
- package/src/kernel/boot-bind/gate.ts +2 -8
- package/src/kernel/boot-bind/runs.ts +1 -3
- package/src/kernel/boot-bind/signal.ts +3 -10
- package/src/kernel/boot-bind/store.test.ts +27 -18
- package/src/kernel/boot-bind/store.ts +93 -52
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -10
- package/src/kernel/boot.ts +30 -77
- package/src/kernel/budget.test.ts +1 -3
- package/src/kernel/capability.ts +3 -10
- package/src/kernel/dry-run.test.ts +1 -4
- package/src/kernel/dry-run.ts +3 -11
- package/src/kernel/edge.test.ts +68 -0
- package/src/kernel/effects.test.ts +1 -5
- package/src/kernel/effects.ts +4 -11
- package/src/kernel/errors.registry.test.ts +2 -8
- package/src/kernel/errors.ts +23 -32
- package/src/kernel/flow.test.ts +12 -25
- package/src/kernel/flow.ts +13 -25
- package/src/kernel/fx.test.ts +31 -40
- package/src/kernel/fx.ts +135 -90
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +43 -10
- package/src/kernel/hooks.ts +25 -12
- package/src/kernel/index.ts +11 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +45 -9
- package/src/kernel/pipeline.test.ts +10 -19
- package/src/kernel/pipeline.ts +5 -17
- package/src/kernel/plug.ts +4 -11
- package/src/kernel/plugin/conflicts.test.ts +13 -25
- package/src/kernel/plugin/decorate.test.ts +8 -13
- package/src/kernel/plugin/scoping.test.ts +4 -11
- package/src/kernel/plugin.ts +81 -27
- package/src/kernel/registry-isolation.test.ts +74 -0
- package/src/kernel/registry.ts +102 -30
- package/src/kernel/router.test.ts +15 -13
- package/src/kernel/router.ts +9 -29
- package/src/kernel/routing-budget.test.ts +1 -3
- package/src/kernel/run-telemetry.ts +1 -3
- package/src/kernel/triggers.ts +63 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/fixtures/skyport.excerpt.json +1 -1
- package/src/manifest/fixtures/skyport.manifest.json +1 -1
- package/src/manifest/index.ts +3 -10
- package/src/manifest/types.ts +30 -6
- package/src/manifest/undeclared.test.ts +4 -12
- package/src/manifest/undeclared.ts +1 -2
- package/src/manifest/validate.test.ts +2 -6
- package/src/manifest/validate.ts +5 -15
- package/src/mcp/authorization.ts +8 -27
- package/src/mcp/confirmation.ts +3 -10
- package/src/mcp/data.ts +2 -6
- package/src/mcp/docs-index.ts +4 -7
- package/src/mcp/docs-mcp.test.ts +3 -12
- package/src/mcp/docs-server.ts +7 -27
- package/src/mcp/docs-tools.ts +2 -6
- package/src/mcp/index.ts +1 -6
- package/src/mcp/injection.gate.test.ts +4 -18
- package/src/mcp/mcp.test.ts +18 -49
- package/src/mcp/protocol.ts +3 -10
- package/src/mcp/server.ts +11 -52
- package/src/mcp/session.ts +4 -14
- package/src/mcp/tools.ts +14 -50
- package/src/plugins/catalogue.test.ts +3 -7
- package/src/plugins/catalogue.ts +1 -3
- package/src/plugins/compression.test.ts +127 -0
- package/src/plugins/compression.ts +94 -0
- package/src/plugins/config-source.test.ts +204 -0
- package/src/plugins/config-source.ts +209 -0
- package/src/plugins/cors.test.ts +138 -0
- package/src/plugins/cors.ts +129 -0
- package/src/plugins/csrf.test.ts +102 -0
- package/src/plugins/csrf.ts +86 -0
- package/src/plugins/headers.ts +54 -0
- package/src/plugins/index.ts +26 -0
- package/src/plugins/ip-allowlist.test.ts +105 -0
- package/src/plugins/ip-allowlist.ts +76 -0
- package/src/plugins/maintenance-mode.test.ts +91 -0
- package/src/plugins/maintenance-mode.ts +85 -0
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/security-headers.test.ts +243 -0
- package/src/plugins/security-headers.ts +255 -0
- package/src/plugins/supply-chain.ts +5 -17
- package/src/release/exports.ts +3 -8
- package/src/release/measure.exports.test.ts +1 -3
- package/src/release/measure.ts +16 -45
- package/src/runs/bench.test.ts +1 -3
- package/src/runs/collect.ts +8 -25
- package/src/runs/drivers/clickhouse.ts +2 -9
- package/src/runs/drivers/files.ts +9 -31
- package/src/runs/drivers/memory.ts +5 -22
- package/src/runs/drivers/postgres.ts +8 -20
- package/src/runs/duckdb.ts +2 -8
- package/src/runs/index.ts +3 -14
- package/src/runs/outlier.ts +3 -10
- package/src/runs/parquet.ts +8 -26
- package/src/runs/privacy.ts +2 -8
- package/src/runs/runs.test.ts +3 -9
- package/src/runs/runtime.ts +7 -32
- package/src/runs/shred.ts +10 -29
- package/src/runs/types.ts +1 -4
- package/src/runtime/bun.ts +4 -15
- package/src/runtime/cold-start.bench.ts +1 -3
- package/src/runtime/dev-request-log.test.ts +1 -4
- package/src/runtime/dev-request-log.ts +1 -4
- package/src/runtime/index.ts +1 -6
- package/src/runtime/primitives.ts +5 -4
- package/src/runtime/security.ts +3 -13
- package/src/runtime/serve.test.ts +4 -7
- package/src/runtime/types.ts +1 -4
- package/src/runtime/web-standard.ts +3 -15
- package/src/term.test.ts +4 -6
- package/src/term.ts +49 -98
- package/src/test/create-test-app.test.ts +4 -14
- package/src/test/create-test-app.ts +27 -33
- package/src/test/provisions.integration.test.ts +3 -11
- package/src/upgrade/codemods.test.ts +25 -6
- package/src/upgrade/codemods.ts +116 -3
- package/src/validation/standard-schema.test.ts +2 -5
- package/src/validation/standard-schema.ts +13 -33
- package/docs/spec/console.md +0 -739
- package/docs/spec/example.md +0 -1196
- package/docs/spec/four-applications.md +0 -1195
- package/docs/spec/unified-theory.md +0 -489
- package/src/cli/doc-drift.test.ts +0 -146
- package/src/cli/doc-drift.ts +0 -430
- package/src/cli/doctor-diff-examples.ts +0 -92
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
- package/src/drivers/vault-sops.ts +0 -271
package/src/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,
|
|
@@ -32,7 +29,6 @@ const BUILD_EXTERNALS = ["@duckdb/node-api", "@duckdb/*"] as const;
|
|
|
32
29
|
/** Heavy optional / peer packages — not counted in export:* gzip samples. */
|
|
33
30
|
const EXPORT_BUILD_EXTERNALS = [
|
|
34
31
|
...BUILD_EXTERNALS,
|
|
35
|
-
"age-encryption",
|
|
36
32
|
"sently",
|
|
37
33
|
"sently/*",
|
|
38
34
|
"ajv",
|
|
@@ -93,9 +89,7 @@ async function gzipBuildOutputs(
|
|
|
93
89
|
label: string,
|
|
94
90
|
): Promise<number> {
|
|
95
91
|
if (!result.success) {
|
|
96
|
-
throw new Error(
|
|
97
|
-
`${label} build failed:\n${result.logs.map(String).join("\n")}`,
|
|
98
|
-
);
|
|
92
|
+
throw new Error(`${label} build failed:\n${result.logs.map(String).join("\n")}`);
|
|
99
93
|
}
|
|
100
94
|
let total = 0;
|
|
101
95
|
for (const artifact of result.outputs) {
|
|
@@ -147,9 +141,7 @@ export async function measureKernelEdgeGzipBytes(): Promise<number> {
|
|
|
147
141
|
external: [...BUILD_EXTERNALS],
|
|
148
142
|
});
|
|
149
143
|
if (!result.success) {
|
|
150
|
-
throw new Error(
|
|
151
|
-
`kernel edge build failed:\n${result.logs.map(String).join("\n")}`,
|
|
152
|
-
);
|
|
144
|
+
throw new Error(`kernel edge build failed:\n${result.logs.map(String).join("\n")}`);
|
|
153
145
|
}
|
|
154
146
|
const artifact = result.outputs[0];
|
|
155
147
|
if (!artifact) throw new Error("kernel edge build produced no output");
|
|
@@ -169,9 +161,7 @@ export async function measureClientGzipBytes(): Promise<number> {
|
|
|
169
161
|
format: "esm",
|
|
170
162
|
});
|
|
171
163
|
if (!result.success) {
|
|
172
|
-
throw new Error(
|
|
173
|
-
`client build failed:\n${result.logs.map(String).join("\n")}`,
|
|
174
|
-
);
|
|
164
|
+
throw new Error(`client build failed:\n${result.logs.map(String).join("\n")}`);
|
|
175
165
|
}
|
|
176
166
|
const artifact = result.outputs[0];
|
|
177
167
|
if (!artifact) throw new Error("client build produced no output");
|
|
@@ -196,11 +186,7 @@ export async function measureExportGzipBytes(entry: string): Promise<number> {
|
|
|
196
186
|
`export function __okeExportBudgetAnchor(){return mod;}\n`,
|
|
197
187
|
);
|
|
198
188
|
try {
|
|
199
|
-
return await measureEntryGzipBytes(
|
|
200
|
-
anchor,
|
|
201
|
-
`export ${entry}`,
|
|
202
|
-
EXPORT_BUILD_EXTERNALS,
|
|
203
|
-
);
|
|
189
|
+
return await measureEntryGzipBytes(anchor, `export ${entry}`, EXPORT_BUILD_EXTERNALS);
|
|
204
190
|
} finally {
|
|
205
191
|
await rm(dir, { recursive: true, force: true });
|
|
206
192
|
}
|
|
@@ -418,12 +404,11 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
|
|
|
418
404
|
// Cold start alone first — parallel gzip work contends for CPU on CI and
|
|
419
405
|
// falsely inflates the wall-clock probe.
|
|
420
406
|
const coldStartMedianMs = await measureColdStartMedianMs();
|
|
421
|
-
const [kernelEdgeGzipBytes, clientGzipBytes, consoleInitialGzipBytes] =
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
]);
|
|
407
|
+
const [kernelEdgeGzipBytes, clientGzipBytes, consoleInitialGzipBytes] = await Promise.all([
|
|
408
|
+
measureKernelEdgeGzipBytes(),
|
|
409
|
+
measureClientGzipBytes(),
|
|
410
|
+
measureConsoleInitialGzipBytes(),
|
|
411
|
+
]);
|
|
427
412
|
const routingP99Ms = measureRoutingP99Ms();
|
|
428
413
|
|
|
429
414
|
const budgets: BudgetSample[] = [
|
|
@@ -482,15 +467,7 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
|
|
|
482
467
|
})),
|
|
483
468
|
);
|
|
484
469
|
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
|
-
);
|
|
470
|
+
budgets.push(regressionSample(target.id, target.label, target.group, bytes, previous));
|
|
494
471
|
}
|
|
495
472
|
|
|
496
473
|
return {
|
|
@@ -506,9 +483,7 @@ export async function measureAllBudgets(): Promise<BudgetsSnapshot> {
|
|
|
506
483
|
* @param snapshot - Measured budgets
|
|
507
484
|
*/
|
|
508
485
|
export function formatBudgetsReport(snapshot: BudgetsSnapshot): string {
|
|
509
|
-
const lines = [
|
|
510
|
-
`okengine budgets v${snapshot.version} @ ${snapshot.measuredAt}`,
|
|
511
|
-
];
|
|
486
|
+
const lines = [`okengine budgets v${snapshot.version} @ ${snapshot.measuredAt}`];
|
|
512
487
|
const order: readonly BudgetGroup[] = ["core", "exports", "drivers"];
|
|
513
488
|
for (const group of order) {
|
|
514
489
|
const rows = snapshot.budgets.filter((b) => b.group === group);
|
|
@@ -539,7 +514,7 @@ export function formatBudgetsMarkdown(snapshot: BudgetsSnapshot): string {
|
|
|
539
514
|
"",
|
|
540
515
|
`_okengine v${snapshot.version} · measured ${snapshot.measuredAt}_`,
|
|
541
516
|
"",
|
|
542
|
-
"Core rows are absolute AGENTS caps. Exports and Drivers fail on regression vs the prior [`budgets.json`](budgets.json) (max +256 B or +2%). Export gzip excludes peers/optionals (`zod`, `
|
|
517
|
+
"Core rows are absolute AGENTS caps. Exports and Drivers fail on regression vs the prior [`budgets.json`](budgets.json) (max +256 B or +2%). Export gzip excludes peers/optionals (`zod`, `sently`, `oxc-parser`, `ajv`).",
|
|
543
518
|
];
|
|
544
519
|
const order: readonly BudgetGroup[] = ["core", "exports", "drivers"];
|
|
545
520
|
for (const group of order) {
|
|
@@ -579,8 +554,7 @@ function sample(
|
|
|
579
554
|
gate: BudgetGate,
|
|
580
555
|
group: BudgetGroup,
|
|
581
556
|
): BudgetSample {
|
|
582
|
-
const rounded =
|
|
583
|
-
unit === "bytes" ? Math.round(value) : Math.round(value * 1000) / 1000;
|
|
557
|
+
const rounded = unit === "bytes" ? Math.round(value) : Math.round(value * 1000) / 1000;
|
|
584
558
|
return {
|
|
585
559
|
id,
|
|
586
560
|
label,
|
|
@@ -652,8 +626,7 @@ function formatValue(value: number, unit: BudgetSample["unit"]): string {
|
|
|
652
626
|
*/
|
|
653
627
|
function initialAssetHrefs(html: string): string[] {
|
|
654
628
|
const hrefs: string[] = [];
|
|
655
|
-
const re =
|
|
656
|
-
/(?:src|href)=["'](\/?assets\/[^"']+\.(?:js|css))["']/g;
|
|
629
|
+
const re = /(?:src|href)=["'](\/?assets\/[^"']+\.(?:js|css))["']/g;
|
|
657
630
|
for (const match of html.matchAll(re)) {
|
|
658
631
|
const href = match[1];
|
|
659
632
|
if (href) hrefs.push(href.replace(/^\//, ""));
|
|
@@ -671,9 +644,7 @@ async function gzipFile(path: string): Promise<number> {
|
|
|
671
644
|
*
|
|
672
645
|
* @param dir - Vite outDir
|
|
673
646
|
*/
|
|
674
|
-
export async function consoleBundleBreakdown(
|
|
675
|
-
dir: string,
|
|
676
|
-
): Promise<ConsoleBundleBreakdown> {
|
|
647
|
+
export async function consoleBundleBreakdown(dir: string): Promise<ConsoleBundleBreakdown> {
|
|
677
648
|
const assetsDir = join(dir, "assets");
|
|
678
649
|
const indexPath = join(dir, "index.html");
|
|
679
650
|
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;
|
|
@@ -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));
|