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
|
@@ -99,9 +99,7 @@ export function computeSloBurns(options: {
|
|
|
99
99
|
readonly now: number;
|
|
100
100
|
}): readonly SloBurn[] {
|
|
101
101
|
const objectives = declaredSlos(options.manifest);
|
|
102
|
-
return objectives.map((obj) =>
|
|
103
|
-
burnForObjective(obj, options.runs, options.now),
|
|
104
|
-
);
|
|
102
|
+
return objectives.map((obj) => burnForObjective(obj, options.runs, options.now));
|
|
105
103
|
}
|
|
106
104
|
|
|
107
105
|
/**
|
|
@@ -113,11 +111,7 @@ export function hasDeclaredSlos(manifest: Manifest | null): boolean {
|
|
|
113
111
|
return declaredSlos(manifest).length > 0;
|
|
114
112
|
}
|
|
115
113
|
|
|
116
|
-
function burnForObjective(
|
|
117
|
-
obj: DeclaredSlo,
|
|
118
|
-
runs: readonly RunRecord[],
|
|
119
|
-
now: number,
|
|
120
|
-
): SloBurn {
|
|
114
|
+
function burnForObjective(obj: DeclaredSlo, runs: readonly RunRecord[], now: number): SloBurn {
|
|
121
115
|
const short = windowStats(runs, obj.flowIds, now - BURN_SHORT_WINDOW_MS, now);
|
|
122
116
|
const long = windowStats(runs, obj.flowIds, now - BURN_LONG_WINDOW_MS, now);
|
|
123
117
|
const currentErrorRate = short.errorRate;
|
|
@@ -130,8 +124,7 @@ function burnForObjective(
|
|
|
130
124
|
|
|
131
125
|
const budget = long.total * obj.tolerableErrorRate;
|
|
132
126
|
const remaining = Math.max(0, budget - long.errors);
|
|
133
|
-
const remainingBudgetFraction =
|
|
134
|
-
budget <= 0 ? (long.errors > 0 ? 0 : 1) : remaining / budget;
|
|
127
|
+
const remainingBudgetFraction = budget <= 0 ? (long.errors > 0 ? 0 : 1) : remaining / budget;
|
|
135
128
|
|
|
136
129
|
const excessRate = currentErrorRate - obj.tolerableErrorRate;
|
|
137
130
|
let timeToExhaustionMs: number | null = null;
|
|
@@ -143,14 +136,8 @@ function burnForObjective(
|
|
|
143
136
|
}
|
|
144
137
|
}
|
|
145
138
|
|
|
146
|
-
const lastBurnAt = lastBurnTimestamp(
|
|
147
|
-
|
|
148
|
-
obj.flowIds,
|
|
149
|
-
obj.tolerableErrorRate,
|
|
150
|
-
now,
|
|
151
|
-
);
|
|
152
|
-
const ceremonial =
|
|
153
|
-
lastBurnAt == null || now - lastBurnAt >= CEREMONIAL_LOOKBACK_MS;
|
|
139
|
+
const lastBurnAt = lastBurnTimestamp(runs, obj.flowIds, obj.tolerableErrorRate, now);
|
|
140
|
+
const ceremonial = lastBurnAt == null || now - lastBurnAt >= CEREMONIAL_LOOKBACK_MS;
|
|
154
141
|
|
|
155
142
|
return {
|
|
156
143
|
id: obj.id,
|
|
@@ -203,11 +190,7 @@ function lastBurnTimestamp(
|
|
|
203
190
|
if (tolerable <= 0) return null;
|
|
204
191
|
const start = now - CEREMONIAL_LOOKBACK_MS;
|
|
205
192
|
let last: number | null = null;
|
|
206
|
-
for (
|
|
207
|
-
let bucketStart = start;
|
|
208
|
-
bucketStart < now;
|
|
209
|
-
bucketStart += BURN_HISTORY_BUCKET_MS
|
|
210
|
-
) {
|
|
193
|
+
for (let bucketStart = start; bucketStart < now; bucketStart += BURN_HISTORY_BUCKET_MS) {
|
|
211
194
|
const bucketEnd = Math.min(now, bucketStart + BURN_HISTORY_BUCKET_MS);
|
|
212
195
|
const stats = windowStats(runs, flowIds, bucketStart, bucketEnd);
|
|
213
196
|
if (stats.total === 0) continue;
|
|
@@ -2,12 +2,7 @@
|
|
|
2
2
|
* One-line plain-language Overview verdict (console §9.16).
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type {
|
|
6
|
-
CostBudget,
|
|
7
|
-
OverviewFinding,
|
|
8
|
-
OverviewVerdict,
|
|
9
|
-
SloBurn,
|
|
10
|
-
} from "./types.ts";
|
|
5
|
+
import type { CostBudget, OverviewFinding, OverviewVerdict, SloBurn } from "./types.ts";
|
|
11
6
|
|
|
12
7
|
/**
|
|
13
8
|
* Build the top verdict from SLO burn, cost budgets, and ranked findings.
|
|
@@ -27,8 +22,7 @@ export function composeVerdict(options: {
|
|
|
27
22
|
.sort(
|
|
28
23
|
(a, b) =>
|
|
29
24
|
b.burnRate - a.burnRate ||
|
|
30
|
-
(a.timeToExhaustionMs ?? Infinity) -
|
|
31
|
-
(b.timeToExhaustionMs ?? Infinity),
|
|
25
|
+
(a.timeToExhaustionMs ?? Infinity) - (b.timeToExhaustionMs ?? Infinity),
|
|
32
26
|
);
|
|
33
27
|
|
|
34
28
|
if (burning.length > 0) {
|
|
@@ -49,8 +43,7 @@ export function composeVerdict(options: {
|
|
|
49
43
|
.sort(
|
|
50
44
|
(a, b) =>
|
|
51
45
|
b.burnRate - a.burnRate ||
|
|
52
|
-
(a.timeToExhaustionMs ?? Infinity) -
|
|
53
|
-
(b.timeToExhaustionMs ?? Infinity),
|
|
46
|
+
(a.timeToExhaustionMs ?? Infinity) - (b.timeToExhaustionMs ?? Infinity),
|
|
54
47
|
);
|
|
55
48
|
if (costBurning.length > 0) {
|
|
56
49
|
const top = costBurning[0]!;
|
|
@@ -31,8 +31,8 @@ export function PluginsA11yView(props: PluginsA11yViewProps) {
|
|
|
31
31
|
<header>
|
|
32
32
|
<h1>Plugins</h1>
|
|
33
33
|
<p>
|
|
34
|
-
Origin × state — CORE stays listed when off; local/community only when
|
|
35
|
-
|
|
34
|
+
Origin × state — CORE stays listed when off; local/community only when plugged. Read-only;
|
|
35
|
+
git review is the approval.
|
|
36
36
|
</p>
|
|
37
37
|
<label>
|
|
38
38
|
Filter plugins
|
|
@@ -134,9 +134,7 @@ export function PluginsA11yView(props: PluginsA11yViewProps) {
|
|
|
134
134
|
{open.intercepts.map((i) => (
|
|
135
135
|
<tr key={i.stage}>
|
|
136
136
|
<th scope="row">{i.stage}</th>
|
|
137
|
-
<td>
|
|
138
|
-
{i.meanMs === null ? "—" : i.meanMs.toFixed(2)}
|
|
139
|
-
</td>
|
|
137
|
+
<td>{i.meanMs === null ? "—" : i.meanMs.toFixed(2)}</td>
|
|
140
138
|
<td>{i.count}</td>
|
|
141
139
|
</tr>
|
|
142
140
|
))}
|
|
@@ -145,8 +143,8 @@ export function PluginsA11yView(props: PluginsA11yViewProps) {
|
|
|
145
143
|
)}
|
|
146
144
|
{open.hookCost ? (
|
|
147
145
|
<p role="status">
|
|
148
|
-
p50 {open.hookCost.p50Ms.toFixed(2)} ms · p95{
|
|
149
|
-
|
|
146
|
+
p50 {open.hookCost.p50Ms.toFixed(2)} ms · p95 {open.hookCost.p95Ms.toFixed(2)} ms ·
|
|
147
|
+
n={open.hookCost.count}
|
|
150
148
|
</p>
|
|
151
149
|
) : null}
|
|
152
150
|
</section>
|
|
@@ -189,9 +187,7 @@ export function PluginsA11yView(props: PluginsA11yViewProps) {
|
|
|
189
187
|
<ul>
|
|
190
188
|
{open.capabilityDiff.map((c) => (
|
|
191
189
|
<li key={c.path}>
|
|
192
|
-
<a href={`/manifest-diff?path=${encodeURIComponent(c.path)}`}>
|
|
193
|
-
{c.summary}
|
|
194
|
-
</a>
|
|
190
|
+
<a href={`/manifest-diff?path=${encodeURIComponent(c.path)}`}>{c.summary}</a>
|
|
195
191
|
</li>
|
|
196
192
|
))}
|
|
197
193
|
</ul>
|
|
@@ -208,16 +204,10 @@ export function PluginsA11yView(props: PluginsA11yViewProps) {
|
|
|
208
204
|
<button type="button" style={{ minHeight: 32 }}>
|
|
209
205
|
{copyCommandLabel(open)}
|
|
210
206
|
</button>
|
|
211
|
-
<p>
|
|
212
|
-
The Console never installs. Git review is the approval — run
|
|
213
|
-
this yourself.
|
|
214
|
-
</p>
|
|
207
|
+
<p>The Console never installs. Git review is the approval — run this yourself.</p>
|
|
215
208
|
</>
|
|
216
209
|
) : (
|
|
217
|
-
<p>
|
|
218
|
-
No install command — toggle off by removing the code line, not
|
|
219
|
-
from this UI.
|
|
220
|
-
</p>
|
|
210
|
+
<p>No install command — toggle off by removing the code line, not from this UI.</p>
|
|
221
211
|
)}
|
|
222
212
|
</section>
|
|
223
213
|
</section>
|
|
@@ -16,8 +16,7 @@ describe("Plugins panel accessibility", () => {
|
|
|
16
16
|
let container: HTMLElement;
|
|
17
17
|
|
|
18
18
|
beforeEach(() => {
|
|
19
|
-
(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =
|
|
20
|
-
true;
|
|
19
|
+
(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
|
|
21
20
|
window = new Window({ url: "http://console.test/plugins" });
|
|
22
21
|
Object.defineProperty(globalThis, "window", {
|
|
23
22
|
value: window,
|
|
@@ -192,13 +192,11 @@ export const PLUGINS_LIST_FIXTURE: PluginsListResponse = {
|
|
|
192
192
|
state: "not-applicable",
|
|
193
193
|
publishedAt: null,
|
|
194
194
|
holdUntil: null,
|
|
195
|
-
detail:
|
|
196
|
-
"Release cooldown applies to community registry packages only (local)",
|
|
195
|
+
detail: "Release cooldown applies to community registry packages only (local)",
|
|
197
196
|
},
|
|
198
197
|
npmProvenance: {
|
|
199
198
|
state: "not-applicable",
|
|
200
|
-
detail:
|
|
201
|
-
"npm provenance applies to community registry packages only (local)",
|
|
199
|
+
detail: "npm provenance applies to community registry packages only (local)",
|
|
202
200
|
},
|
|
203
201
|
},
|
|
204
202
|
capabilityDiff: [
|
|
@@ -16,9 +16,7 @@ describe("groupPlugins", () => {
|
|
|
16
16
|
expect(ids).toContain("rate-limit");
|
|
17
17
|
expect(ids).toContain("tenancy");
|
|
18
18
|
expect(ids).toContain("privacy");
|
|
19
|
-
expect(core!.items.some((p) => p.id === "rate-limit" && p.state === "off")).toBe(
|
|
20
|
-
true,
|
|
21
|
-
);
|
|
19
|
+
expect(core!.items.some((p) => p.id === "rate-limit" && p.state === "off")).toBe(true);
|
|
22
20
|
|
|
23
21
|
const local = groups.find((g) => g.id === "local");
|
|
24
22
|
expect(local?.items.map((p) => p.id)).toEqual(["audit"]);
|
|
@@ -3,12 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import type { PluginsSearch } from "./search.ts";
|
|
6
|
-
import type {
|
|
7
|
-
PluginOrigin,
|
|
8
|
-
PluginRecord,
|
|
9
|
-
PluginState,
|
|
10
|
-
PluginsListGroup,
|
|
11
|
-
} from "./types.ts";
|
|
6
|
+
import type { PluginOrigin, PluginRecord, PluginState, PluginsListGroup } from "./types.ts";
|
|
12
7
|
|
|
13
8
|
const ORIGIN_LABEL: Record<PluginOrigin, string> = {
|
|
14
9
|
core: "Core",
|
|
@@ -2,14 +2,8 @@
|
|
|
2
2
|
* Plugins panel pure modules (console §9.15).
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
export {
|
|
6
|
-
|
|
7
|
-
type PluginCapabilityFinding,
|
|
8
|
-
} from "./findings.ts";
|
|
9
|
-
export {
|
|
10
|
-
copyCommandLabel,
|
|
11
|
-
copyableCommand,
|
|
12
|
-
} from "./command.ts";
|
|
5
|
+
export { pluginCapabilityFindings, type PluginCapabilityFinding } from "./findings.ts";
|
|
6
|
+
export { copyCommandLabel, copyableCommand } from "./command.ts";
|
|
13
7
|
export { groupPlugins } from "./group.ts";
|
|
14
8
|
export {
|
|
15
9
|
openPlugin,
|
|
@@ -17,11 +11,7 @@ export {
|
|
|
17
11
|
serializePluginsSearch,
|
|
18
12
|
type PluginsSearch,
|
|
19
13
|
} from "./search.ts";
|
|
20
|
-
export {
|
|
21
|
-
PLUGINS_LIST_FIXTURE,
|
|
22
|
-
SUPPLY_CHAIN_COMMUNITY,
|
|
23
|
-
SUPPLY_CHAIN_CORE_NA,
|
|
24
|
-
} from "./fixture.ts";
|
|
14
|
+
export { PLUGINS_LIST_FIXTURE, SUPPLY_CHAIN_COMMUNITY, SUPPLY_CHAIN_CORE_NA } from "./fixture.ts";
|
|
25
15
|
export type {
|
|
26
16
|
BootConflictSignal,
|
|
27
17
|
LifecycleScriptsSignal,
|
|
@@ -17,19 +17,12 @@ export interface PluginsSearch {
|
|
|
17
17
|
*
|
|
18
18
|
* @param search - Raw search
|
|
19
19
|
*/
|
|
20
|
-
export function parsePluginsSearch(
|
|
21
|
-
search
|
|
22
|
-
): PluginsSearch {
|
|
23
|
-
const q = typeof search.q === "string" && search.q.length > 0
|
|
24
|
-
? search.q
|
|
25
|
-
: undefined;
|
|
20
|
+
export function parsePluginsSearch(search: Record<string, unknown>): PluginsSearch {
|
|
21
|
+
const q = typeof search.q === "string" && search.q.length > 0 ? search.q : undefined;
|
|
26
22
|
const origin = isOrigin(search.origin) ? search.origin : undefined;
|
|
27
|
-
const state = search.state === "on" || search.state === "off"
|
|
28
|
-
|
|
29
|
-
: undefined;
|
|
30
|
-
const plugin = typeof search.plugin === "string" && search.plugin.length > 0
|
|
31
|
-
? search.plugin
|
|
32
|
-
: undefined;
|
|
23
|
+
const state = search.state === "on" || search.state === "off" ? search.state : undefined;
|
|
24
|
+
const plugin =
|
|
25
|
+
typeof search.plugin === "string" && search.plugin.length > 0 ? search.plugin : undefined;
|
|
33
26
|
return { q, origin, state, plugin };
|
|
34
27
|
}
|
|
35
28
|
|
|
@@ -38,9 +31,7 @@ export function parsePluginsSearch(
|
|
|
38
31
|
*
|
|
39
32
|
* @param search - Typed search
|
|
40
33
|
*/
|
|
41
|
-
export function serializePluginsSearch(
|
|
42
|
-
search: PluginsSearch,
|
|
43
|
-
): Record<string, string> {
|
|
34
|
+
export function serializePluginsSearch(search: PluginsSearch): Record<string, string> {
|
|
44
35
|
const out: Record<string, string> = {};
|
|
45
36
|
if (search.q) out.q = search.q;
|
|
46
37
|
if (search.origin) out.origin = search.origin;
|
|
@@ -55,10 +46,7 @@ export function serializePluginsSearch(
|
|
|
55
46
|
* @param search - Current search
|
|
56
47
|
* @param pluginId - Plugin to open
|
|
57
48
|
*/
|
|
58
|
-
export function openPlugin(
|
|
59
|
-
search: PluginsSearch,
|
|
60
|
-
pluginId: string,
|
|
61
|
-
): PluginsSearch {
|
|
49
|
+
export function openPlugin(search: PluginsSearch, pluginId: string): PluginsSearch {
|
|
62
50
|
return { ...search, plugin: pluginId };
|
|
63
51
|
}
|
|
64
52
|
|
|
@@ -6,15 +6,9 @@
|
|
|
6
6
|
import { explainDurationOutliers } from "./explain.ts";
|
|
7
7
|
import { RUNS_CHAIN_FIXTURE, runsOutlierFixture } from "./fixture.ts";
|
|
8
8
|
import { groupByDimension } from "./group.ts";
|
|
9
|
-
import {
|
|
10
|
-
durationHistogram,
|
|
11
|
-
formatDurationMs,
|
|
12
|
-
} from "./histogram.ts";
|
|
9
|
+
import { durationHistogram, formatDurationMs } from "./histogram.ts";
|
|
13
10
|
import { filterRuns, parseDimensionQuery } from "./query.ts";
|
|
14
|
-
import {
|
|
15
|
-
shouldOfferTracesLink,
|
|
16
|
-
tracesHrefForRun,
|
|
17
|
-
} from "./trace-link.ts";
|
|
11
|
+
import { shouldOfferTracesLink, tracesHrefForRun } from "./trace-link.ts";
|
|
18
12
|
|
|
19
13
|
/** Props for {@link RunsA11yView}. */
|
|
20
14
|
export interface RunsA11yViewProps {
|
|
@@ -103,8 +97,7 @@ export function RunsA11yView(props: RunsA11yViewProps) {
|
|
|
103
97
|
}}
|
|
104
98
|
>
|
|
105
99
|
{buckets.map((b, i) => {
|
|
106
|
-
const selected =
|
|
107
|
-
b.minMs <= range.maxMs && b.maxMs >= range.minMs;
|
|
100
|
+
const selected = b.minMs <= range.maxMs && b.maxMs >= range.minMs;
|
|
108
101
|
return (
|
|
109
102
|
<button
|
|
110
103
|
key={i}
|
|
@@ -224,13 +217,7 @@ export function RunsA11yView(props: RunsA11yViewProps) {
|
|
|
224
217
|
</div>
|
|
225
218
|
<div>
|
|
226
219
|
<dt>error</dt>
|
|
227
|
-
<dd>
|
|
228
|
-
{open.error ? (
|
|
229
|
-
<span role="status">{open.error}</span>
|
|
230
|
-
) : (
|
|
231
|
-
"—"
|
|
232
|
-
)}
|
|
233
|
-
</dd>
|
|
220
|
+
<dd>{open.error ? <span role="status">{open.error}</span> : "—"}</dd>
|
|
234
221
|
</div>
|
|
235
222
|
</dl>
|
|
236
223
|
<h3>Effects</h3>
|
|
@@ -252,9 +239,7 @@ export function RunsA11yView(props: RunsA11yViewProps) {
|
|
|
252
239
|
</ul>
|
|
253
240
|
</details>
|
|
254
241
|
{shouldOfferTracesLink(population, open.id) ? (
|
|
255
|
-
<a href={tracesHrefForRun(population, open.id)}>
|
|
256
|
-
Open in Traces
|
|
257
|
-
</a>
|
|
242
|
+
<a href={tracesHrefForRun(population, open.id)}>Open in Traces</a>
|
|
258
243
|
) : null}
|
|
259
244
|
<button type="button" style={{ minHeight: 32, minWidth: 24 }}>
|
|
260
245
|
Close
|
|
@@ -16,8 +16,7 @@ describe("Runs panel accessibility", () => {
|
|
|
16
16
|
let container: HTMLElement;
|
|
17
17
|
|
|
18
18
|
beforeEach(() => {
|
|
19
|
-
(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =
|
|
20
|
-
true;
|
|
19
|
+
(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
|
|
21
20
|
window = new Window({ url: "http://console.test/runs" });
|
|
22
21
|
Object.defineProperty(globalThis, "window", {
|
|
23
22
|
value: window,
|
|
@@ -70,9 +69,7 @@ describe("Runs panel accessibility", () => {
|
|
|
70
69
|
|
|
71
70
|
test("axe reports zero violations at WCAG 2.2 AA", async () => {
|
|
72
71
|
await act(async () => {
|
|
73
|
-
root.render(
|
|
74
|
-
<RunsA11yView openRunId="run-create-ok" withOutliers />,
|
|
75
|
-
);
|
|
72
|
+
root.render(<RunsA11yView openRunId="run-create-ok" withOutliers />);
|
|
76
73
|
});
|
|
77
74
|
|
|
78
75
|
await new Promise((r) => setTimeout(r, 10));
|
|
@@ -3,10 +3,7 @@
|
|
|
3
3
|
* (console §9.11 · §14), never a reimplementation.
|
|
4
4
|
*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
explainOutliers,
|
|
8
|
-
type OutlierFinding,
|
|
9
|
-
} from "../../../runs/outlier.ts";
|
|
6
|
+
import { explainOutliers, type OutlierFinding } from "../../../runs/outlier.ts";
|
|
10
7
|
import { runToWideEvent } from "./project.ts";
|
|
11
8
|
import type { DurationRange, RunRecord } from "./types.ts";
|
|
12
9
|
|
|
@@ -24,8 +21,7 @@ export function explainDurationOutliers(
|
|
|
24
21
|
): OutlierFinding[] {
|
|
25
22
|
const events = runs.map(runToWideEvent);
|
|
26
23
|
return explainOutliers(events, {
|
|
27
|
-
select: (e) =>
|
|
28
|
-
e.durationMs >= range.minMs && e.durationMs <= range.maxMs,
|
|
24
|
+
select: (e) => e.durationMs >= range.minMs && e.durationMs <= range.maxMs,
|
|
29
25
|
minLift: 0.15,
|
|
30
26
|
ignore: ["duration_ms", "duration", "flow"],
|
|
31
27
|
});
|
|
@@ -11,17 +11,11 @@ import type { GroupAggregate, RunRecord } from "./types.ts";
|
|
|
11
11
|
* @param runs - Filtered population
|
|
12
12
|
* @param dimension - Dimension to group by
|
|
13
13
|
*/
|
|
14
|
-
export function groupByDimension(
|
|
15
|
-
runs: readonly RunRecord[],
|
|
16
|
-
dimension: string,
|
|
17
|
-
): GroupAggregate[] {
|
|
14
|
+
export function groupByDimension(runs: readonly RunRecord[], dimension: string): GroupAggregate[] {
|
|
18
15
|
const buckets = new Map<string, RunRecord[]>();
|
|
19
16
|
for (const run of runs) {
|
|
20
17
|
const raw = dimensionValue(run, dimension);
|
|
21
|
-
const key =
|
|
22
|
-
raw === undefined || raw === null || raw === ""
|
|
23
|
-
? "(empty)"
|
|
24
|
-
: String(raw);
|
|
18
|
+
const key = raw === undefined || raw === null || raw === "" ? "(empty)" : String(raw);
|
|
25
19
|
const list = buckets.get(key) ?? [];
|
|
26
20
|
list.push(run);
|
|
27
21
|
buckets.set(key, list);
|
|
@@ -77,9 +71,6 @@ export function discoverDimensions(runs: readonly RunRecord[]): string[] {
|
|
|
77
71
|
function percentile(sorted: readonly number[], p: number): number {
|
|
78
72
|
if (sorted.length === 0) return 0;
|
|
79
73
|
if (sorted.length === 1) return sorted[0]!;
|
|
80
|
-
const idx = Math.min(
|
|
81
|
-
sorted.length - 1,
|
|
82
|
-
Math.max(0, Math.ceil(p * sorted.length) - 1),
|
|
83
|
-
);
|
|
74
|
+
const idx = Math.min(sorted.length - 1, Math.max(0, Math.ceil(p * sorted.length) - 1));
|
|
84
75
|
return sorted[idx]!;
|
|
85
76
|
}
|
|
@@ -4,11 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
import { describe, expect, test } from "bun:test";
|
|
6
6
|
import { runsOutlierFixture } from "./fixture.ts";
|
|
7
|
-
import {
|
|
8
|
-
durationHistogram,
|
|
9
|
-
inDurationRange,
|
|
10
|
-
normalizeRange,
|
|
11
|
-
} from "./histogram.ts";
|
|
7
|
+
import { durationHistogram, inDurationRange, normalizeRange } from "./histogram.ts";
|
|
12
8
|
|
|
13
9
|
describe("duration histogram", () => {
|
|
14
10
|
test("buckets cover the population", () => {
|
|
@@ -21,11 +17,6 @@ describe("duration histogram", () => {
|
|
|
21
17
|
|
|
22
18
|
test("range helpers", () => {
|
|
23
19
|
expect(normalizeRange(2000, 40)).toEqual({ minMs: 40, maxMs: 2000 });
|
|
24
|
-
expect(
|
|
25
|
-
inDurationRange(
|
|
26
|
-
{ durationMs: 2000 } as never,
|
|
27
|
-
{ minMs: 1000, maxMs: 3000 },
|
|
28
|
-
),
|
|
29
|
-
).toBe(true);
|
|
20
|
+
expect(inDurationRange({ durationMs: 2000 } as never, { minMs: 1000, maxMs: 3000 })).toBe(true);
|
|
30
21
|
});
|
|
31
22
|
});
|
|
@@ -55,10 +55,7 @@ export function durationHistogram(
|
|
|
55
55
|
* @param run - Run
|
|
56
56
|
* @param range - Selected region
|
|
57
57
|
*/
|
|
58
|
-
export function inDurationRange(
|
|
59
|
-
run: RunRecord,
|
|
60
|
-
range: DurationRange,
|
|
61
|
-
): boolean {
|
|
58
|
+
export function inDurationRange(run: RunRecord, range: DurationRange): boolean {
|
|
62
59
|
return run.durationMs >= range.minMs && run.durationMs <= range.maxMs;
|
|
63
60
|
}
|
|
64
61
|
|
|
@@ -5,19 +5,9 @@
|
|
|
5
5
|
* without mounting the full SPA.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
export {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
} from "./explain.ts";
|
|
12
|
-
export {
|
|
13
|
-
RUNS_CHAIN_FIXTURE,
|
|
14
|
-
RUNS_FIXTURE_T0,
|
|
15
|
-
runsOutlierFixture,
|
|
16
|
-
} from "./fixture.ts";
|
|
17
|
-
export {
|
|
18
|
-
discoverDimensions,
|
|
19
|
-
groupByDimension,
|
|
20
|
-
} from "./group.ts";
|
|
8
|
+
export { explainDurationOutliers, type OutlierFinding } from "./explain.ts";
|
|
9
|
+
export { RUNS_CHAIN_FIXTURE, RUNS_FIXTURE_T0, runsOutlierFixture } from "./fixture.ts";
|
|
10
|
+
export { discoverDimensions, groupByDimension } from "./group.ts";
|
|
21
11
|
export {
|
|
22
12
|
DEFAULT_BUCKET_COUNT,
|
|
23
13
|
durationHistogram,
|
|
@@ -25,11 +15,7 @@ export {
|
|
|
25
15
|
inDurationRange,
|
|
26
16
|
normalizeRange,
|
|
27
17
|
} from "./histogram.ts";
|
|
28
|
-
export {
|
|
29
|
-
rowToRun,
|
|
30
|
-
runToWideEvent,
|
|
31
|
-
type RunsListRow,
|
|
32
|
-
} from "./project.ts";
|
|
18
|
+
export { rowToRun, runToWideEvent, type RunsListRow } from "./project.ts";
|
|
33
19
|
export {
|
|
34
20
|
BUILDER_DIMENSIONS,
|
|
35
21
|
dimensionValue,
|
|
@@ -28,9 +28,7 @@ export interface RunsListRow {
|
|
|
28
28
|
readonly error?: string | null;
|
|
29
29
|
readonly effects?: RunRecord["effects"];
|
|
30
30
|
readonly logs?: RunRecord["logs"];
|
|
31
|
-
readonly dimensions?: Readonly<
|
|
32
|
-
Record<string, string | number | boolean | null>
|
|
33
|
-
>;
|
|
31
|
+
readonly dimensions?: Readonly<Record<string, string | number | boolean | null>>;
|
|
34
32
|
}
|
|
35
33
|
|
|
36
34
|
/**
|
|
@@ -107,9 +105,7 @@ export function runToWideEvent(run: RunRecord): WideEvent {
|
|
|
107
105
|
...(run.replica ? { replica: run.replica } : {}),
|
|
108
106
|
...(run.replicaLagMs != null ? { replicaLagMs: run.replicaLagMs } : {}),
|
|
109
107
|
...(run.cost != null ? { cost: run.cost } : {}),
|
|
110
|
-
...(run.promptVersion != null
|
|
111
|
-
? { promptVersion: run.promptVersion }
|
|
112
|
-
: {}),
|
|
108
|
+
...(run.promptVersion != null ? { promptVersion: run.promptVersion } : {}),
|
|
113
109
|
...(run.buildVersion ? { buildVersion: run.buildVersion } : {}),
|
|
114
110
|
error: run.error ? { code: run.error } : null,
|
|
115
111
|
effects: run.effects as WideEvent["effects"],
|
|
@@ -15,9 +15,7 @@ import {
|
|
|
15
15
|
|
|
16
16
|
describe("dimension query", () => {
|
|
17
17
|
test("parses flow = X AND cache = miss AND duration > 1s", () => {
|
|
18
|
-
const q = parseDimensionQuery(
|
|
19
|
-
"flow = bookings.create AND cache = miss AND duration > 1s",
|
|
20
|
-
);
|
|
18
|
+
const q = parseDimensionQuery("flow = bookings.create AND cache = miss AND duration > 1s");
|
|
21
19
|
expect(q.clauses).toEqual([
|
|
22
20
|
{ dimension: "flow", op: "=", value: "bookings.create" },
|
|
23
21
|
{ dimension: "cache", op: "=", value: "miss" },
|
|
@@ -5,12 +5,7 @@
|
|
|
5
5
|
* — analysis by dimension, not free-text search.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import type {
|
|
9
|
-
DimensionQuery,
|
|
10
|
-
QueryClause,
|
|
11
|
-
QueryOp,
|
|
12
|
-
RunRecord,
|
|
13
|
-
} from "./types.ts";
|
|
8
|
+
import type { DimensionQuery, QueryClause, QueryOp, RunRecord } from "./types.ts";
|
|
14
9
|
|
|
15
10
|
const OPS: readonly QueryOp[] = ["!=", ">=", "<=", "=", ">", "<"];
|
|
16
11
|
|
|
@@ -22,7 +17,10 @@ const OPS: readonly QueryOp[] = ["!=", ">=", "<=", "=", ">", "<"];
|
|
|
22
17
|
*/
|
|
23
18
|
export function parseDimensionQuery(expr: string | undefined | null): DimensionQuery {
|
|
24
19
|
if (!expr || !expr.trim()) return { clauses: [] };
|
|
25
|
-
const parts = expr
|
|
20
|
+
const parts = expr
|
|
21
|
+
.split(/\s+AND\s+/i)
|
|
22
|
+
.map((p) => p.trim())
|
|
23
|
+
.filter(Boolean);
|
|
26
24
|
const clauses: QueryClause[] = [];
|
|
27
25
|
for (const part of parts) {
|
|
28
26
|
const clause = parseClause(part);
|
|
@@ -46,10 +44,7 @@ export function serializeDimensionQuery(query: DimensionQuery): string {
|
|
|
46
44
|
* @param query - Current query
|
|
47
45
|
* @param clause - Clause to add
|
|
48
46
|
*/
|
|
49
|
-
export function upsertClause(
|
|
50
|
-
query: DimensionQuery,
|
|
51
|
-
clause: QueryClause,
|
|
52
|
-
): DimensionQuery {
|
|
47
|
+
export function upsertClause(query: DimensionQuery, clause: QueryClause): DimensionQuery {
|
|
53
48
|
const rest = query.clauses.filter((c) => c.dimension !== clause.dimension);
|
|
54
49
|
return { clauses: [...rest, clause] };
|
|
55
50
|
}
|
|
@@ -60,10 +55,7 @@ export function upsertClause(
|
|
|
60
55
|
* @param query - Current query
|
|
61
56
|
* @param dimension - Dimension name
|
|
62
57
|
*/
|
|
63
|
-
export function removeClause(
|
|
64
|
-
query: DimensionQuery,
|
|
65
|
-
dimension: string,
|
|
66
|
-
): DimensionQuery {
|
|
58
|
+
export function removeClause(query: DimensionQuery, dimension: string): DimensionQuery {
|
|
67
59
|
return {
|
|
68
60
|
clauses: query.clauses.filter((c) => c.dimension !== dimension),
|
|
69
61
|
};
|
|
@@ -75,10 +67,7 @@ export function removeClause(
|
|
|
75
67
|
* @param run - Wide-event projection
|
|
76
68
|
* @param query - Dimension query
|
|
77
69
|
*/
|
|
78
|
-
export function matchesDimensionQuery(
|
|
79
|
-
run: RunRecord,
|
|
80
|
-
query: DimensionQuery,
|
|
81
|
-
): boolean {
|
|
70
|
+
export function matchesDimensionQuery(run: RunRecord, query: DimensionQuery): boolean {
|
|
82
71
|
for (const clause of query.clauses) {
|
|
83
72
|
if (!matchClause(run, clause)) return false;
|
|
84
73
|
}
|
|
@@ -91,10 +80,7 @@ export function matchesDimensionQuery(
|
|
|
91
80
|
* @param runs - All runs
|
|
92
81
|
* @param query - Dimension query
|
|
93
82
|
*/
|
|
94
|
-
export function filterRuns(
|
|
95
|
-
runs: readonly RunRecord[],
|
|
96
|
-
query: DimensionQuery,
|
|
97
|
-
): RunRecord[] {
|
|
83
|
+
export function filterRuns(runs: readonly RunRecord[], query: DimensionQuery): RunRecord[] {
|
|
98
84
|
if (query.clauses.length === 0) return [...runs];
|
|
99
85
|
return runs.filter((r) => matchesDimensionQuery(r, query));
|
|
100
86
|
}
|
|
@@ -147,19 +133,13 @@ function parseClause(raw: string): QueryClause | null {
|
|
|
147
133
|
return { dimension, op, value };
|
|
148
134
|
}
|
|
149
135
|
|
|
150
|
-
function parseValue(
|
|
151
|
-
dimension: string,
|
|
152
|
-
raw: string,
|
|
153
|
-
): string | number | boolean | undefined {
|
|
136
|
+
function parseValue(dimension: string, raw: string): string | number | boolean | undefined {
|
|
154
137
|
if (dimension === "duration" || dimension === "duration_ms") {
|
|
155
138
|
return parseDurationMs(raw);
|
|
156
139
|
}
|
|
157
140
|
if (raw === "true") return true;
|
|
158
141
|
if (raw === "false") return false;
|
|
159
|
-
if (
|
|
160
|
-
(raw.startsWith('"') && raw.endsWith('"')) ||
|
|
161
|
-
(raw.startsWith("'") && raw.endsWith("'"))
|
|
162
|
-
) {
|
|
142
|
+
if ((raw.startsWith('"') && raw.endsWith('"')) || (raw.startsWith("'") && raw.endsWith("'"))) {
|
|
163
143
|
return raw.slice(1, -1);
|
|
164
144
|
}
|
|
165
145
|
if (/^-?\d+(\.\d+)?$/.test(raw)) return Number(raw);
|
|
@@ -263,10 +243,7 @@ export function dimensionValue(
|
|
|
263
243
|
}
|
|
264
244
|
}
|
|
265
245
|
|
|
266
|
-
function compareEq(
|
|
267
|
-
left: string | number | boolean,
|
|
268
|
-
right: string | number | boolean,
|
|
269
|
-
): boolean {
|
|
246
|
+
function compareEq(left: string | number | boolean, right: string | number | boolean): boolean {
|
|
270
247
|
if (typeof left === "number" || typeof right === "number") {
|
|
271
248
|
const ln = toNumber(left);
|
|
272
249
|
const rn = toNumber(right);
|