okengine 0.2.5 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +24 -23
- package/README.md +52 -346
- package/docs/spec/console.md +165 -142
- package/docs/spec/example.md +490 -312
- package/docs/spec/four-applications.md +495 -314
- package/docs/spec/unified-theory.md +184 -175
- package/package.json +46 -38
- package/spec/manifest.v1.schema.json +40 -9
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +53 -31
- package/src/auth/invoke-as.ts +1 -3
- package/src/auth/operator.ts +8 -26
- package/src/auth/planes.ts +2 -7
- package/src/auth/plugin.ts +4 -7
- package/src/auth/roles.ts +1 -5
- package/src/auth/sessions.ts +10 -39
- package/src/cli/args.ts +1 -5
- package/src/cli/ask-dev-mode.ts +40 -0
- package/src/cli/build.ts +1 -2
- package/src/cli/client-add.test.ts +8 -15
- package/src/cli/client-add.ts +5 -14
- package/src/cli/completion.test.ts +1 -5
- package/src/cli/completion.ts +4 -17
- package/src/cli/db-auto-push.test.ts +64 -0
- package/src/cli/db-auto-push.ts +72 -0
- package/src/cli/db.test.ts +189 -0
- package/src/cli/db.ts +386 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +163 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev.test.ts +148 -21
- package/src/cli/dev.ts +208 -134
- package/src/cli/doc-drift.test.ts +3 -2
- package/src/cli/doc-drift.ts +21 -50
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +7 -8
- package/src/cli/docker.ts +1 -3
- package/src/cli/doctor-diff-examples.ts +1 -3
- package/src/cli/doctor-diff.test.ts +1 -5
- package/src/cli/doctor-diff.ts +17 -46
- package/src/cli/doctor-pii.ts +2 -7
- package/src/cli/doctor.test.ts +26 -4
- package/src/cli/doctor.ts +35 -11
- package/src/cli/eval.ts +4 -14
- package/src/cli/gates-list.ts +1 -4
- package/src/cli/hero-meta.test.ts +17 -19
- package/src/cli/hero-meta.ts +20 -30
- package/src/cli/images.ts +3 -8
- package/src/cli/index.ts +11 -2
- package/src/cli/load-config.images.test.ts +14 -14
- package/src/cli/load-config.ts +41 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +45 -0
- package/src/cli/ports.test.ts +4 -13
- package/src/cli/ports.ts +1 -3
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +2 -7
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/client/budget-entry.ts +1 -6
- package/src/client/create.test.ts +6 -12
- package/src/client/create.ts +2 -8
- package/src/client/errors.ts +1 -4
- package/src/client/index.ts +1 -6
- package/src/client/notes-contract.test.ts +4 -13
- package/src/client/transport.ts +9 -30
- package/src/client/types.ts +8 -29
- package/src/compiler/aot.test.ts +2 -9
- package/src/compiler/aot.ts +1 -4
- package/src/compiler/differential.test.ts +3 -11
- package/src/compiler/dynamic.ts +1 -4
- package/src/compiler/effects-infer.ts +8 -34
- package/src/compiler/emit.ts +1 -3
- package/src/compiler/extract.test.ts +96 -30
- package/src/compiler/extract.ts +362 -156
- package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
- package/src/compiler/fixtures/skyport.expected.json +24 -83
- package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
- package/src/compiler/http-parse.ts +2 -9
- package/src/compiler/index.ts +1 -5
- package/src/compiler/response.ts +4 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +57 -34
- package/src/config/index.ts +181 -37
- package/src/config/resolve-driver.test.ts +28 -17
- package/src/console/budget.test.ts +1 -4
- package/src/console/index.ts +1 -4
- package/src/console/server/access.test.ts +15 -43
- package/src/console/server/access.ts +19 -49
- package/src/console/server/ai.test.ts +3 -11
- package/src/console/server/ai.ts +23 -46
- package/src/console/server/app.ts +14 -45
- package/src/console/server/auth-rate.test.ts +4 -12
- package/src/console/server/bind.ts +1 -5
- package/src/console/server/channels.test.ts +2 -6
- package/src/console/server/channels.ts +10 -35
- package/src/console/server/claim.ts +2 -8
- package/src/console/server/clock.test.ts +2 -6
- package/src/console/server/clock.ts +8 -26
- package/src/console/server/console.test.ts +1 -3
- package/src/console/server/diff.test.ts +5 -17
- package/src/console/server/diff.ts +10 -31
- package/src/console/server/dry-run.audit.test.ts +2 -8
- package/src/console/server/flows.ts +64 -233
- package/src/console/server/gates.test.ts +14 -50
- package/src/console/server/gates.ts +13 -48
- package/src/console/server/index.ts +2 -9
- package/src/console/server/live.ts +3 -12
- package/src/console/server/operator-db.test.ts +4 -15
- package/src/console/server/operator-db.ts +13 -32
- package/src/console/server/plugin.ts +50 -53
- package/src/console/server/plugins.test.ts +2 -6
- package/src/console/server/plugins.ts +17 -56
- package/src/console/server/runs-pii.ts +2 -7
- package/src/console/server/security.gate.test.ts +18 -40
- package/src/console/server/serve.ts +10 -25
- package/src/console/server/signals.test.ts +1 -3
- package/src/console/server/signals.ts +17 -40
- package/src/console/server/state.ts +21 -59
- package/src/console/server/store.test.ts +20 -22
- package/src/console/server/store.ts +31 -76
- package/src/console/server/vault.test.ts +12 -29
- package/src/console/server/vault.ts +23 -60
- package/src/console/ui/access/AccessA11yView.tsx +6 -21
- package/src/console/ui/access/a11y.test.tsx +3 -12
- package/src/console/ui/access/acknowledgement.test.ts +1 -4
- package/src/console/ui/access/acknowledgement.ts +1 -3
- package/src/console/ui/access/blast-radius.ts +1 -3
- package/src/console/ui/access/confirmation.test.ts +1 -5
- package/src/console/ui/access/confirmation.ts +1 -4
- package/src/console/ui/access/fixture.ts +1 -5
- package/src/console/ui/access/grantable.test.ts +1 -3
- package/src/console/ui/access/grantable.ts +2 -7
- package/src/console/ui/access/index.ts +2 -9
- package/src/console/ui/access/provenance.test.ts +1 -3
- package/src/console/ui/access/provenance.ts +2 -6
- package/src/console/ui/access/search.test.ts +1 -5
- package/src/console/ui/access/search.ts +2 -6
- package/src/console/ui/ai/AiA11yView.tsx +6 -17
- package/src/console/ui/ai/a11y.test.tsx +2 -5
- package/src/console/ui/ai/fixture.ts +2 -7
- package/src/console/ui/ai/format.ts +1 -3
- package/src/console/ui/ai/group.test.ts +1 -3
- package/src/console/ui/ai/group.ts +4 -12
- package/src/console/ui/ai/index.ts +2 -9
- package/src/console/ui/ai/promotion.test.ts +2 -7
- package/src/console/ui/ai/promotion.ts +4 -13
- package/src/console/ui/ai/search.test.ts +2 -11
- package/src/console/ui/ai/search.ts +3 -13
- package/src/console/ui/ai/types.ts +1 -8
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
- package/src/console/ui/architecture/a11y.test.tsx +1 -2
- package/src/console/ui/architecture/declared.ts +1 -5
- package/src/console/ui/architecture/index.ts +7 -35
- package/src/console/ui/architecture/layout.ts +1 -3
- package/src/console/ui/architecture/pathologies.ts +10 -19
- package/src/console/ui/architecture/search.ts +6 -15
- package/src/console/ui/architecture/traffic.ts +4 -14
- package/src/console/ui/architecture/types.ts +2 -10
- package/src/console/ui/architecture/view.test.ts +7 -19
- package/src/console/ui/architecture/view.ts +9 -36
- package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
- package/src/console/ui/channels/a11y.test.tsx +1 -2
- package/src/console/ui/channels/confirmation.test.ts +1 -4
- package/src/console/ui/channels/confirmation.ts +1 -4
- package/src/console/ui/channels/findings.ts +1 -5
- package/src/console/ui/channels/index.ts +2 -8
- package/src/console/ui/channels/locale.test.ts +1 -3
- package/src/console/ui/channels/locale.ts +2 -8
- package/src/console/ui/channels/search.ts +4 -13
- package/src/console/ui/channels/taxonomy.ts +1 -3
- package/src/console/ui/clock/ClockA11yView.tsx +9 -26
- package/src/console/ui/clock/a11y.test.tsx +2 -5
- package/src/console/ui/clock/confirmation.test.ts +1 -3
- package/src/console/ui/clock/confirmation.ts +1 -4
- package/src/console/ui/clock/findings.ts +1 -4
- package/src/console/ui/clock/health.ts +2 -7
- package/src/console/ui/clock/index.ts +2 -10
- package/src/console/ui/clock/search.test.ts +1 -3
- package/src/console/ui/clock/search.ts +2 -6
- package/src/console/ui/clock/timeline.test.ts +1 -3
- package/src/console/ui/clock/waiting-on.test.ts +1 -5
- package/src/console/ui/clock/waiting-on.ts +2 -7
- package/src/console/ui/diff/DiffA11yView.tsx +8 -17
- package/src/console/ui/diff/a11y.test.tsx +2 -5
- package/src/console/ui/diff/group.test.ts +3 -13
- package/src/console/ui/diff/group.ts +2 -8
- package/src/console/ui/diff/index.ts +2 -8
- package/src/console/ui/diff/search.test.ts +1 -5
- package/src/console/ui/diff/search.ts +4 -16
- package/src/console/ui/diff/summary.ts +1 -2
- package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
- package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
- package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
- package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
- package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
- package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
- package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
- package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
- package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
- package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
- package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
- package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
- package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
- package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
- package/src/console/ui/flows/a11y.test.tsx +2 -8
- package/src/console/ui/flows/buffer.test.ts +3 -11
- package/src/console/ui/flows/buffer.ts +4 -11
- package/src/console/ui/flows/confirmation.ts +1 -3
- package/src/console/ui/flows/contract.test.ts +3 -7
- package/src/console/ui/flows/contract.ts +12 -36
- package/src/console/ui/flows/graph.test.ts +3 -11
- package/src/console/ui/flows/graph.ts +5 -15
- package/src/console/ui/flows/index.ts +1 -6
- package/src/console/ui/flows/save-as-test.ts +1 -3
- package/src/console/ui/flows/search.ts +8 -25
- package/src/console/ui/flows/tiers.ts +2 -9
- package/src/console/ui/gates/GatesA11yView.tsx +4 -13
- package/src/console/ui/gates/a11y.test.tsx +2 -5
- package/src/console/ui/gates/audit.ts +1 -3
- package/src/console/ui/gates/denial.test.ts +1 -3
- package/src/console/ui/gates/denial.ts +4 -12
- package/src/console/ui/gates/findings.ts +1 -3
- package/src/console/ui/gates/group.test.ts +3 -3
- package/src/console/ui/gates/group.ts +3 -11
- package/src/console/ui/gates/index.ts +2 -10
- package/src/console/ui/gates/search.ts +3 -10
- package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
- package/src/console/ui/overview/a11y.test.tsx +1 -2
- package/src/console/ui/overview/busiest.ts +1 -3
- package/src/console/ui/overview/compose.ts +1 -13
- package/src/console/ui/overview/cost.ts +34 -38
- package/src/console/ui/overview/fixture.ts +21 -26
- package/src/console/ui/overview/golden.ts +4 -14
- package/src/console/ui/overview/index.ts +2 -9
- package/src/console/ui/overview/rank.test.ts +3 -10
- package/src/console/ui/overview/rank.ts +2 -7
- package/src/console/ui/overview/slo.test.ts +5 -9
- package/src/console/ui/overview/slo.ts +6 -23
- package/src/console/ui/overview/verdict.ts +3 -10
- package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
- package/src/console/ui/plugins/a11y.test.tsx +1 -2
- package/src/console/ui/plugins/fixture.ts +2 -4
- package/src/console/ui/plugins/group.test.ts +1 -3
- package/src/console/ui/plugins/group.ts +1 -6
- package/src/console/ui/plugins/index.ts +3 -13
- package/src/console/ui/plugins/search.ts +7 -19
- package/src/console/ui/runs/RunsA11yView.tsx +5 -20
- package/src/console/ui/runs/a11y.test.tsx +2 -5
- package/src/console/ui/runs/explain.ts +2 -6
- package/src/console/ui/runs/group.ts +3 -12
- package/src/console/ui/runs/histogram.test.ts +2 -11
- package/src/console/ui/runs/histogram.ts +1 -4
- package/src/console/ui/runs/index.ts +4 -18
- package/src/console/ui/runs/project.ts +2 -6
- package/src/console/ui/runs/query.test.ts +1 -3
- package/src/console/ui/runs/query.ts +12 -35
- package/src/console/ui/runs/search.ts +5 -19
- package/src/console/ui/runs/trace-link.test.ts +2 -6
- package/src/console/ui/runs/trace-link.ts +4 -16
- package/src/console/ui/runs/types.ts +1 -3
- package/src/console/ui/shell/App.tsx +2 -10
- package/src/console/ui/shell/client.ts +22 -115
- package/src/console/ui/shell/components/ui.tsx +1 -4
- package/src/console/ui/shell/layout/Shell.tsx +2 -4
- package/src/console/ui/shell/main.tsx +31 -96
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
- package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
- package/src/console/ui/shell/setup/Wizard.tsx +3 -5
- package/src/console/ui/shell/styles.css +1 -2
- package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
- package/src/console/ui/signals/a11y.test.tsx +2 -5
- package/src/console/ui/signals/confirmation.test.ts +1 -5
- package/src/console/ui/signals/confirmation.ts +2 -6
- package/src/console/ui/signals/dry-run.ts +1 -3
- package/src/console/ui/signals/durable.ts +1 -3
- package/src/console/ui/signals/findings.ts +1 -3
- package/src/console/ui/signals/group.test.ts +2 -8
- package/src/console/ui/signals/group.ts +2 -10
- package/src/console/ui/signals/index.ts +1 -4
- package/src/console/ui/signals/monitor.ts +2 -7
- package/src/console/ui/signals/schema-form.test.ts +3 -14
- package/src/console/ui/signals/schema-form.ts +1 -4
- package/src/console/ui/signals/search.ts +4 -13
- package/src/console/ui/store/StoreA11yView.tsx +3 -9
- package/src/console/ui/store/a11y.test.tsx +2 -5
- package/src/console/ui/store/confirmation.test.ts +1 -3
- package/src/console/ui/store/confirmation.ts +1 -4
- package/src/console/ui/store/dry-run.ts +2 -5
- package/src/console/ui/store/fixture.ts +1 -2
- package/src/console/ui/store/group.test.ts +1 -6
- package/src/console/ui/store/group.ts +1 -4
- package/src/console/ui/store/index.ts +1 -5
- package/src/console/ui/store/search.ts +2 -6
- package/src/console/ui/store/will-not-fire.ts +1 -2
- package/src/console/ui/traces/TracesA11yView.tsx +10 -29
- package/src/console/ui/traces/a11y.test.tsx +1 -2
- package/src/console/ui/traces/chain.test.ts +5 -19
- package/src/console/ui/traces/chain.ts +1 -3
- package/src/console/ui/traces/critical-path.test.ts +1 -3
- package/src/console/ui/traces/critical-path.ts +2 -6
- package/src/console/ui/traces/filter.test.ts +2 -6
- package/src/console/ui/traces/filter.ts +5 -13
- package/src/console/ui/traces/fold.test.ts +4 -12
- package/src/console/ui/traces/fold.ts +1 -3
- package/src/console/ui/traces/mini.ts +1 -3
- package/src/console/ui/traces/replay.test.ts +1 -3
- package/src/console/ui/traces/replay.ts +1 -3
- package/src/console/ui/traces/sampling.ts +1 -4
- package/src/console/ui/traces/search.ts +4 -17
- package/src/console/ui/traces/tier.ts +1 -3
- package/src/console/ui/vault/VaultA11yView.tsx +5 -17
- package/src/console/ui/vault/a11y.test.tsx +1 -2
- package/src/console/ui/vault/blast-radius.ts +1 -3
- package/src/console/ui/vault/confirmation.test.ts +1 -5
- package/src/console/ui/vault/confirmation.ts +1 -4
- package/src/console/ui/vault/dormant.test.ts +1 -4
- package/src/console/ui/vault/export-safe.test.ts +1 -5
- package/src/console/ui/vault/export-safe.ts +1 -4
- package/src/console/ui/vault/fixture.ts +3 -3
- package/src/console/ui/vault/group.ts +1 -2
- package/src/console/ui/vault/index.ts +2 -10
- package/src/console/ui/vault/search.ts +2 -6
- package/src/console/ui/vault/types.ts +1 -1
- package/src/console/xss.gate.test.ts +1 -3
- package/src/docker/compose.ts +112 -20
- package/src/docker/derive.ts +5 -19
- package/src/docker/docker.test.ts +15 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +4 -11
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +5 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +6 -1
- package/src/docker/recipes/rustfs.ts +33 -0
- package/src/docker/stack-id.test.ts +33 -0
- package/src/docker/stack-id.ts +25 -13
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/types.ts +13 -4
- package/src/drivers/ai-anthropic.ts +5 -14
- package/src/drivers/ai-mock.ts +2 -5
- package/src/drivers/ai-openai-compatible.ts +4 -10
- package/src/drivers/ai-providers.test.ts +6 -13
- package/src/drivers/bun-native-completeness.test.ts +6 -15
- package/src/drivers/channel-console.ts +6 -7
- package/src/drivers/channel-fcm.ts +20 -30
- package/src/drivers/channel-resend.ts +1 -3
- package/src/drivers/channel-smtp.ts +2 -6
- package/src/drivers/channel-types.ts +2 -12
- package/src/drivers/channel-unifonic.ts +2 -6
- package/src/drivers/channel-wa-cloud.ts +2 -6
- package/src/drivers/channel-webpush.ts +21 -60
- package/src/drivers/conformance.test.ts +2 -10
- package/src/drivers/conformance.ts +8 -21
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -56
- package/src/drivers/memory.ts +14 -41
- package/src/drivers/pgvector.ts +7 -11
- package/src/drivers/postgres.ts +7 -13
- package/src/drivers/redis.ts +13 -37
- package/src/drivers/s3.ts +5 -17
- package/src/drivers/signal-engine.ts +12 -49
- package/src/drivers/signal-memory.ts +2 -8
- package/src/drivers/signal-nats.ts +4 -9
- package/src/drivers/signal-postgres.ts +62 -129
- package/src/drivers/signal-redis.ts +7 -21
- package/src/drivers/signal-types.ts +1 -4
- package/src/drivers/sqlite.ts +3 -12
- package/src/drivers/types.ts +4 -23
- package/src/drivers/vault-env.ts +2 -6
- package/src/drivers/vault-infisical.ts +1 -5
- package/src/drivers/vault-managed.ts +1 -5
- package/src/drivers/vault-memory.ts +1 -5
- package/src/drivers/vault-openbao.ts +1 -5
- package/src/drivers/vault-sops.ts +10 -35
- package/src/drivers/vault-types.ts +1 -7
- package/src/elements/ai/declare.ts +4 -14
- package/src/elements/ai/eval.ts +2 -6
- package/src/elements/ai/pii.ts +1 -3
- package/src/elements/ai/runtime.ts +12 -50
- package/src/elements/ai/schema.ts +4 -15
- package/src/elements/ai.test.ts +13 -24
- package/src/elements/ai.ts +1 -5
- package/src/elements/channel/consent.ts +3 -12
- package/src/elements/channel/costs.ts +4 -15
- package/src/elements/channel/declare.ts +1 -4
- package/src/elements/channel/email-auth.ts +1 -4
- package/src/elements/channel/locale.ts +2 -10
- package/src/elements/channel/mask.ts +1 -3
- package/src/elements/channel/mime.ts +2 -12
- package/src/elements/channel/outcomes.test.ts +1 -5
- package/src/elements/channel/outcomes.ts +5 -15
- package/src/elements/channel/receipts.ts +2 -7
- package/src/elements/channel/runtime.ts +28 -74
- package/src/elements/channel/suppression.ts +8 -14
- package/src/elements/channel.test.ts +8 -31
- package/src/elements/channel.ts +3 -14
- package/src/elements/clock/actions.ts +6 -18
- package/src/elements/clock/declare.ts +1 -3
- package/src/elements/clock/dst.ts +1 -5
- package/src/elements/clock/durable.ts +4 -16
- package/src/elements/clock/health.ts +2 -7
- package/src/elements/clock/leader.ts +2 -9
- package/src/elements/clock/reconcile.ts +4 -15
- package/src/elements/clock/runtime.ts +2 -5
- package/src/elements/clock/schedule.ts +4 -20
- package/src/elements/clock.test.ts +2 -7
- package/src/elements/clock.ts +5 -23
- package/src/elements/gate/permissions.ts +1 -4
- package/src/elements/gate/runtime.ts +7 -28
- package/src/elements/gate.ts +1 -5
- package/src/elements/index.ts +9 -7
- package/src/elements/signal/declare.ts +2 -7
- package/src/elements/signal/reconcile.test.ts +1 -4
- package/src/elements/signal/runtime.ts +1 -3
- package/src/elements/signal.test.ts +3 -15
- package/src/elements/signal.ts +2 -8
- package/src/elements/store/cache.test.ts +46 -0
- package/src/elements/store/cache.ts +3 -11
- package/src/elements/store/classify.ts +5 -22
- package/src/elements/store/declare.ts +8 -17
- package/src/elements/store/domain-ddl.test.ts +86 -0
- package/src/elements/store/emit-drizzle.ts +363 -0
- package/src/elements/store/files-policy.test.ts +1 -5
- package/src/elements/store/files-policy.ts +4 -12
- package/src/elements/store/load-plugin-tables.ts +103 -0
- package/src/elements/store/missing-relation.test.ts +83 -0
- package/src/elements/store/missing-relation.ts +38 -0
- package/src/elements/store/replica.ts +1 -4
- package/src/elements/store/runtime.ts +25 -28
- package/src/elements/store/schema-decl.test.ts +227 -0
- package/src/elements/store/schema-decl.ts +516 -0
- package/src/elements/store/sql-condition.ts +11 -21
- package/src/elements/store/sql-session.test.ts +50 -0
- package/src/elements/store/sql-session.ts +60 -63
- package/src/elements/store/table.ts +35 -19
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +37 -31
- package/src/elements/vault/chain.ts +34 -0
- package/src/elements/vault/declare.ts +22 -32
- package/src/elements/vault/fingerprint.ts +2 -7
- package/src/elements/vault/redact.ts +2 -6
- package/src/elements/vault/runtime.ts +18 -32
- package/src/elements/vault.test.ts +12 -28
- package/src/elements/vault.ts +8 -12
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +34 -94
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.ts +2 -8
- package/src/kernel/boot-bind/clock.ts +2 -6
- package/src/kernel/boot-bind/gate.ts +2 -8
- package/src/kernel/boot-bind/runs.ts +1 -3
- package/src/kernel/boot-bind/signal.ts +3 -10
- package/src/kernel/boot-bind/store.test.ts +17 -17
- package/src/kernel/boot-bind/store.ts +44 -50
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -9
- package/src/kernel/boot.ts +29 -76
- package/src/kernel/budget.test.ts +1 -3
- package/src/kernel/capability.ts +3 -10
- package/src/kernel/dry-run.test.ts +1 -4
- package/src/kernel/dry-run.ts +3 -11
- package/src/kernel/effects.test.ts +1 -5
- package/src/kernel/effects.ts +4 -11
- package/src/kernel/errors.registry.test.ts +2 -8
- package/src/kernel/errors.ts +23 -32
- package/src/kernel/flow.test.ts +12 -25
- package/src/kernel/flow.ts +5 -25
- package/src/kernel/fx.test.ts +15 -44
- package/src/kernel/fx.ts +27 -79
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +10 -10
- package/src/kernel/hooks.ts +3 -12
- package/src/kernel/index.ts +4 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +1 -6
- package/src/kernel/pipeline.test.ts +10 -19
- package/src/kernel/pipeline.ts +5 -17
- package/src/kernel/plug.ts +4 -11
- package/src/kernel/plugin/conflicts.test.ts +13 -25
- package/src/kernel/plugin/decorate.test.ts +8 -13
- package/src/kernel/plugin/scoping.test.ts +4 -11
- package/src/kernel/plugin.ts +48 -24
- package/src/kernel/registry.ts +80 -29
- package/src/kernel/router.test.ts +15 -13
- package/src/kernel/router.ts +9 -29
- package/src/kernel/routing-budget.test.ts +1 -3
- package/src/kernel/run-telemetry.ts +1 -3
- package/src/kernel/triggers.ts +4 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/index.ts +2 -9
- package/src/manifest/types.ts +29 -5
- package/src/manifest/undeclared.test.ts +4 -12
- package/src/manifest/undeclared.ts +1 -2
- package/src/manifest/validate.test.ts +2 -6
- package/src/manifest/validate.ts +4 -14
- package/src/mcp/authorization.ts +8 -27
- package/src/mcp/confirmation.ts +3 -10
- package/src/mcp/data.ts +2 -6
- package/src/mcp/docs-index.ts +4 -7
- package/src/mcp/docs-mcp.test.ts +3 -12
- package/src/mcp/docs-server.ts +7 -27
- package/src/mcp/docs-tools.ts +2 -6
- package/src/mcp/index.ts +1 -6
- package/src/mcp/injection.gate.test.ts +4 -18
- package/src/mcp/mcp.test.ts +18 -49
- package/src/mcp/protocol.ts +3 -10
- package/src/mcp/server.ts +11 -52
- package/src/mcp/session.ts +4 -14
- package/src/mcp/tools.ts +14 -50
- package/src/plugins/catalogue.test.ts +3 -7
- package/src/plugins/catalogue.ts +1 -3
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/supply-chain.ts +5 -17
- package/src/release/exports.ts +3 -8
- package/src/release/measure.exports.test.ts +1 -3
- package/src/release/measure.ts +15 -43
- package/src/runs/bench.test.ts +1 -3
- package/src/runs/collect.ts +8 -25
- package/src/runs/drivers/clickhouse.ts +2 -9
- package/src/runs/drivers/files.ts +9 -31
- package/src/runs/drivers/memory.ts +5 -22
- package/src/runs/drivers/postgres.ts +8 -20
- package/src/runs/duckdb.ts +2 -8
- package/src/runs/index.ts +3 -14
- package/src/runs/outlier.ts +3 -10
- package/src/runs/parquet.ts +8 -26
- package/src/runs/privacy.ts +2 -8
- package/src/runs/runs.test.ts +3 -9
- package/src/runs/runtime.ts +7 -32
- package/src/runs/shred.ts +10 -29
- package/src/runs/types.ts +1 -4
- package/src/runtime/bun.ts +4 -15
- package/src/runtime/cold-start.bench.ts +1 -3
- package/src/runtime/dev-request-log.test.ts +1 -4
- package/src/runtime/dev-request-log.ts +1 -4
- package/src/runtime/index.ts +1 -6
- package/src/runtime/primitives.ts +5 -4
- package/src/runtime/security.ts +3 -13
- package/src/runtime/serve.test.ts +4 -7
- package/src/runtime/types.ts +1 -4
- package/src/runtime/web-standard.ts +3 -15
- package/src/term.test.ts +4 -6
- package/src/term.ts +49 -98
- package/src/test/create-test-app.test.ts +4 -14
- package/src/test/create-test-app.ts +13 -31
- package/src/test/provisions.integration.test.ts +3 -11
- package/src/upgrade/codemods.test.ts +25 -6
- package/src/upgrade/codemods.ts +116 -3
- package/src/validation/standard-schema.test.ts +2 -5
- package/src/validation/standard-schema.ts +13 -33
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
|
@@ -3,11 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
5
|
import { describe, expect, test } from "bun:test";
|
|
6
|
-
import {
|
|
7
|
-
buildCausalChain,
|
|
8
|
-
groupTraceRoots,
|
|
9
|
-
initialFocusSpanId,
|
|
10
|
-
} from "./chain.ts";
|
|
6
|
+
import { buildCausalChain, groupTraceRoots, initialFocusSpanId } from "./chain.ts";
|
|
11
7
|
import { TRACES_FIXTURE } from "./fixture.ts";
|
|
12
8
|
|
|
13
9
|
describe("buildCausalChain", () => {
|
|
@@ -17,10 +13,7 @@ describe("buildCausalChain", () => {
|
|
|
17
13
|
expect(chain?.parents.map((p) => p.id)).toEqual(["run-create-ok"]);
|
|
18
14
|
expect(chain?.current.id).toBe("run-fulfill");
|
|
19
15
|
expect(chain?.children).toEqual([]);
|
|
20
|
-
expect(chain?.connected.map((s) => s.id)).toEqual([
|
|
21
|
-
"run-create-ok",
|
|
22
|
-
"run-fulfill",
|
|
23
|
-
]);
|
|
16
|
+
expect(chain?.connected.map((s) => s.id)).toEqual(["run-create-ok", "run-fulfill"]);
|
|
24
17
|
});
|
|
25
18
|
|
|
26
19
|
test("parents above, children below from root", () => {
|
|
@@ -37,25 +30,18 @@ describe("groupTraceRoots", () => {
|
|
|
37
30
|
expect(roots.map((r) => r.rootId)).toContain("run-create-fail");
|
|
38
31
|
expect(roots.map((r) => r.rootId)).toContain("run-ask");
|
|
39
32
|
const ok = roots.find((r) => r.rootId === "run-create-ok");
|
|
40
|
-
expect(ok?.spans.map((s) => s.id)).toEqual([
|
|
41
|
-
"run-create-ok",
|
|
42
|
-
"run-fulfill",
|
|
43
|
-
]);
|
|
33
|
+
expect(ok?.spans.map((s) => s.id)).toEqual(["run-create-ok", "run-fulfill"]);
|
|
44
34
|
});
|
|
45
35
|
});
|
|
46
36
|
|
|
47
37
|
describe("initialFocusSpanId", () => {
|
|
48
38
|
test("opens on the failing span", () => {
|
|
49
|
-
const failRoot = groupTraceRoots(TRACES_FIXTURE).find(
|
|
50
|
-
(r) => r.rootId === "run-create-fail",
|
|
51
|
-
);
|
|
39
|
+
const failRoot = groupTraceRoots(TRACES_FIXTURE).find((r) => r.rootId === "run-create-fail");
|
|
52
40
|
expect(initialFocusSpanId(failRoot!.spans)).toBe("run-create-fail");
|
|
53
41
|
});
|
|
54
42
|
|
|
55
43
|
test("honours preferred id when present", () => {
|
|
56
|
-
const ok = groupTraceRoots(TRACES_FIXTURE).find(
|
|
57
|
-
(r) => r.rootId === "run-create-ok",
|
|
58
|
-
);
|
|
44
|
+
const ok = groupTraceRoots(TRACES_FIXTURE).find((r) => r.rootId === "run-create-ok");
|
|
59
45
|
expect(initialFocusSpanId(ok!.spans, "run-fulfill")).toBe("run-fulfill");
|
|
60
46
|
});
|
|
61
47
|
});
|
|
@@ -94,9 +94,7 @@ export function buildCausalChain(
|
|
|
94
94
|
*/
|
|
95
95
|
export function groupTraceRoots(spans: readonly TraceSpan[]): TraceRoot[] {
|
|
96
96
|
const { byId, childrenOf } = indexSpans(spans);
|
|
97
|
-
const roots = spans.filter(
|
|
98
|
-
(s) => !s.parentId || !byId.has(s.parentId),
|
|
99
|
-
);
|
|
97
|
+
const roots = spans.filter((s) => !s.parentId || !byId.has(s.parentId));
|
|
100
98
|
roots.sort((a, b) => b.startedAt - a.startedAt);
|
|
101
99
|
return roots.map((root) => ({
|
|
102
100
|
rootId: root.id,
|
|
@@ -8,9 +8,7 @@ import { TRACES_FIXTURE } from "./fixture.ts";
|
|
|
8
8
|
|
|
9
9
|
describe("criticalPathSpanIds", () => {
|
|
10
10
|
test("selects the longer root-to-leaf work path", () => {
|
|
11
|
-
const chain = TRACES_FIXTURE.filter(
|
|
12
|
-
(s) => s.id === "run-create-ok" || s.id === "run-fulfill",
|
|
13
|
-
);
|
|
11
|
+
const chain = TRACES_FIXTURE.filter((s) => s.id === "run-create-ok" || s.id === "run-fulfill");
|
|
14
12
|
const path = criticalPathSpanIds(chain);
|
|
15
13
|
expect(path.has("run-create-ok")).toBe(true);
|
|
16
14
|
expect(path.has("run-fulfill")).toBe(true);
|
|
@@ -13,14 +13,10 @@ import type { TraceSpan } from "./types.ts";
|
|
|
13
13
|
*
|
|
14
14
|
* @param spans - Connected spans (one trace)
|
|
15
15
|
*/
|
|
16
|
-
export function criticalPathSpanIds(
|
|
17
|
-
spans: readonly TraceSpan[],
|
|
18
|
-
): ReadonlySet<string> {
|
|
16
|
+
export function criticalPathSpanIds(spans: readonly TraceSpan[]): ReadonlySet<string> {
|
|
19
17
|
if (spans.length === 0) return new Set();
|
|
20
18
|
const { byId, childrenOf } = indexSpans(spans);
|
|
21
|
-
const roots = spans.filter(
|
|
22
|
-
(s) => !s.parentId || !byId.has(s.parentId),
|
|
23
|
-
);
|
|
19
|
+
const roots = spans.filter((s) => !s.parentId || !byId.has(s.parentId));
|
|
24
20
|
let best: string[] = [];
|
|
25
21
|
let bestCost = -1;
|
|
26
22
|
|
|
@@ -68,11 +68,7 @@ describe("effect filter", () => {
|
|
|
68
68
|
});
|
|
69
69
|
|
|
70
70
|
test("trace-level match when any connected span matches", () => {
|
|
71
|
-
const chain = TRACES_FIXTURE.filter(
|
|
72
|
-
|
|
73
|
-
);
|
|
74
|
-
expect(
|
|
75
|
-
traceMatchesEffectFilter(chain, { kind: "sent" }),
|
|
76
|
-
).toBe(true);
|
|
71
|
+
const chain = TRACES_FIXTURE.filter((s) => s.id === "run-create-ok" || s.id === "run-fulfill");
|
|
72
|
+
expect(traceMatchesEffectFilter(chain, { kind: "sent" })).toBe(true);
|
|
77
73
|
});
|
|
78
74
|
});
|
|
@@ -19,22 +19,18 @@ export function matchesEffectFilter(
|
|
|
19
19
|
if (!filter) return true;
|
|
20
20
|
switch (filter.kind) {
|
|
21
21
|
case "wrote":
|
|
22
|
-
return span.effects.some(
|
|
23
|
-
(e) => e.kind === "write" && e.resource === filter.resource,
|
|
24
|
-
);
|
|
22
|
+
return span.effects.some((e) => e.kind === "write" && e.resource === filter.resource);
|
|
25
23
|
case "asked":
|
|
26
24
|
return span.effects.some((e) => e.kind === "ask");
|
|
27
25
|
case "sent":
|
|
28
26
|
return span.effects.some(
|
|
29
27
|
(e) =>
|
|
30
|
-
e.kind === "send" &&
|
|
31
|
-
(filter.resource === undefined || e.resource === filter.resource),
|
|
28
|
+
e.kind === "send" && (filter.resource === undefined || e.resource === filter.resource),
|
|
32
29
|
);
|
|
33
30
|
case "secret":
|
|
34
31
|
return span.effects.some(
|
|
35
32
|
(e) =>
|
|
36
|
-
e.kind === "secret" &&
|
|
37
|
-
(filter.resource === undefined || e.resource === filter.resource),
|
|
33
|
+
e.kind === "secret" && (filter.resource === undefined || e.resource === filter.resource),
|
|
38
34
|
);
|
|
39
35
|
case "cost":
|
|
40
36
|
return (span.cost ?? 0) > filter.min;
|
|
@@ -63,9 +59,7 @@ export function traceMatchesEffectFilter(
|
|
|
63
59
|
*
|
|
64
60
|
* @param raw - URL value
|
|
65
61
|
*/
|
|
66
|
-
export function parseEffectFilter(
|
|
67
|
-
raw: string | undefined,
|
|
68
|
-
): EffectFilter | null {
|
|
62
|
+
export function parseEffectFilter(raw: string | undefined): EffectFilter | null {
|
|
69
63
|
if (!raw?.trim()) return null;
|
|
70
64
|
const value = raw.trim();
|
|
71
65
|
if (value === "asked") return { kind: "asked" };
|
|
@@ -93,9 +87,7 @@ export function parseEffectFilter(
|
|
|
93
87
|
*
|
|
94
88
|
* @param filter - Filter
|
|
95
89
|
*/
|
|
96
|
-
export function serializeEffectFilter(
|
|
97
|
-
filter: EffectFilter | null | undefined,
|
|
98
|
-
): string | undefined {
|
|
90
|
+
export function serializeEffectFilter(filter: EffectFilter | null | undefined): string | undefined {
|
|
99
91
|
if (!filter) return undefined;
|
|
100
92
|
switch (filter.kind) {
|
|
101
93
|
case "wrote":
|
|
@@ -13,9 +13,7 @@ import {
|
|
|
13
13
|
|
|
14
14
|
describe("foldTimeline", () => {
|
|
15
15
|
test("collapses multi-day idle into one labelled fold", () => {
|
|
16
|
-
const chain = TRACES_FIXTURE.filter(
|
|
17
|
-
(s) => s.id === "run-create-ok" || s.id === "run-fulfill",
|
|
18
|
-
);
|
|
16
|
+
const chain = TRACES_FIXTURE.filter((s) => s.id === "run-create-ok" || s.id === "run-fulfill");
|
|
19
17
|
const folded = foldTimeline(intervalsFromSpans(chain));
|
|
20
18
|
const folds = folded.segments.filter((s) => s.kind === "fold");
|
|
21
19
|
expect(folds.length).toBe(1);
|
|
@@ -29,9 +27,7 @@ describe("foldTimeline", () => {
|
|
|
29
27
|
});
|
|
30
28
|
|
|
31
29
|
test("expanded fold restores proportional display weight", () => {
|
|
32
|
-
const chain = TRACES_FIXTURE.filter(
|
|
33
|
-
(s) => s.id === "run-create-ok" || s.id === "run-fulfill",
|
|
34
|
-
);
|
|
30
|
+
const chain = TRACES_FIXTURE.filter((s) => s.id === "run-create-ok" || s.id === "run-fulfill");
|
|
35
31
|
const intervals = intervalsFromSpans(chain);
|
|
36
32
|
const draft = foldTimeline(intervals);
|
|
37
33
|
const foldId = draft.segments.find((s) => s.kind === "fold")?.id;
|
|
@@ -47,16 +43,12 @@ describe("foldTimeline", () => {
|
|
|
47
43
|
});
|
|
48
44
|
|
|
49
45
|
test("work stays proportional — display sum excludes collapsed dead time", () => {
|
|
50
|
-
const chain = TRACES_FIXTURE.filter(
|
|
51
|
-
(s) => s.id === "run-create-ok" || s.id === "run-fulfill",
|
|
52
|
-
);
|
|
46
|
+
const chain = TRACES_FIXTURE.filter((s) => s.id === "run-create-ok" || s.id === "run-fulfill");
|
|
53
47
|
const folded = foldTimeline(intervalsFromSpans(chain));
|
|
54
48
|
const workDisplay = folded.segments
|
|
55
49
|
.filter((s) => s.kind === "work")
|
|
56
50
|
.reduce((s, seg) => s + seg.displayMs, 0);
|
|
57
|
-
expect(folded.displayDurationMs).toBe(
|
|
58
|
-
workDisplay + COLLAPSED_FOLD_DISPLAY_MS,
|
|
59
|
-
);
|
|
51
|
+
expect(folded.displayDurationMs).toBe(workDisplay + COLLAPSED_FOLD_DISPLAY_MS);
|
|
60
52
|
expect(folded.wallDurationMs).toBeGreaterThan(folded.displayDurationMs);
|
|
61
53
|
});
|
|
62
54
|
|
|
@@ -144,9 +144,7 @@ export function intervalsFromSpans(spans: readonly TraceSpan[]): WorkInterval[]
|
|
|
144
144
|
endMs: e.timestamp + Math.max(1, e.duration),
|
|
145
145
|
tier: tierOfKind(e.kind),
|
|
146
146
|
spanId: span.id,
|
|
147
|
-
failed:
|
|
148
|
-
span.errorCode != null &&
|
|
149
|
-
e === span.effects[span.effects.length - 1],
|
|
147
|
+
failed: span.errorCode != null && e === span.effects[span.effects.length - 1],
|
|
150
148
|
});
|
|
151
149
|
}
|
|
152
150
|
} else {
|
|
@@ -55,9 +55,7 @@ export function miniWaterfall(spans: readonly TraceSpan[]): MiniBar[] {
|
|
|
55
55
|
*
|
|
56
56
|
* @param spans - Connected spans
|
|
57
57
|
*/
|
|
58
|
-
export function rootErrorCode(
|
|
59
|
-
spans: readonly TraceSpan[],
|
|
60
|
-
): string | null {
|
|
58
|
+
export function rootErrorCode(spans: readonly TraceSpan[]): string | null {
|
|
61
59
|
for (const s of spans) {
|
|
62
60
|
if (s.errorCode) return s.errorCode;
|
|
63
61
|
}
|
|
@@ -8,9 +8,7 @@ import { replayDecision } from "./replay.ts";
|
|
|
8
8
|
|
|
9
9
|
describe("replayDecision", () => {
|
|
10
10
|
test("offers dry-run when the trace has an external effect", () => {
|
|
11
|
-
const chain = TRACES_FIXTURE.filter(
|
|
12
|
-
(s) => s.id === "run-create-ok" || s.id === "run-fulfill",
|
|
13
|
-
);
|
|
11
|
+
const chain = TRACES_FIXTURE.filter((s) => s.id === "run-create-ok" || s.id === "run-fulfill");
|
|
14
12
|
const decision = replayDecision(chain);
|
|
15
13
|
expect(decision.mode).toBe("dry-run");
|
|
16
14
|
if (decision.mode !== "dry-run") return;
|
|
@@ -21,9 +21,7 @@ export type ReplayDecision =
|
|
|
21
21
|
*
|
|
22
22
|
* @param spans - Connected spans
|
|
23
23
|
*/
|
|
24
|
-
export function replayDecision(
|
|
25
|
-
spans: readonly TraceSpan[],
|
|
26
|
-
): ReplayDecision {
|
|
24
|
+
export function replayDecision(spans: readonly TraceSpan[]): ReplayDecision {
|
|
27
25
|
if (traceHasExternal(spans)) {
|
|
28
26
|
return {
|
|
29
27
|
mode: "dry-run",
|
|
@@ -25,10 +25,7 @@ export interface FullTraceBoost {
|
|
|
25
25
|
* @param boosts - Active boosts
|
|
26
26
|
* @param now - Clock
|
|
27
27
|
*/
|
|
28
|
-
export function samplingLabel(
|
|
29
|
-
boosts: readonly FullTraceBoost[],
|
|
30
|
-
now: number = Date.now(),
|
|
31
|
-
): string {
|
|
28
|
+
export function samplingLabel(boosts: readonly FullTraceBoost[], now: number = Date.now()): string {
|
|
32
29
|
const live = boosts.filter((b) => b.until > now);
|
|
33
30
|
if (live.length === 0) return DEFAULT_SAMPLING_LABEL;
|
|
34
31
|
const flows = live.map((b) => b.flow).join(", ");
|
|
@@ -6,11 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { z } from "zod";
|
|
9
|
-
import {
|
|
10
|
-
parseEffectFilter,
|
|
11
|
-
serializeEffectFilter,
|
|
12
|
-
type EffectFilter,
|
|
13
|
-
} from "./filter.ts";
|
|
9
|
+
import { parseEffectFilter, serializeEffectFilter, type EffectFilter } from "./filter.ts";
|
|
14
10
|
|
|
15
11
|
/** Zod schema for Traces URL search params. */
|
|
16
12
|
export const TracesSearchSchema = z.object({
|
|
@@ -47,9 +43,7 @@ export function parseTracesSearch(raw: unknown): TracesSearch {
|
|
|
47
43
|
*
|
|
48
44
|
* @param search - Typed search
|
|
49
45
|
*/
|
|
50
|
-
export function serializeTracesSearch(
|
|
51
|
-
search: TracesSearch,
|
|
52
|
-
): Record<string, string> {
|
|
46
|
+
export function serializeTracesSearch(search: TracesSearch): Record<string, string> {
|
|
53
47
|
const out: Record<string, string> = {};
|
|
54
48
|
if (search.trace) out.trace = search.trace;
|
|
55
49
|
if (search.span) out.span = search.span;
|
|
@@ -91,11 +85,7 @@ export function expandedFoldsOf(search: TracesSearch): Set<string> {
|
|
|
91
85
|
* @param rootId - Root span id
|
|
92
86
|
* @param spanId - Optional focus span
|
|
93
87
|
*/
|
|
94
|
-
export function openTrace(
|
|
95
|
-
prev: TracesSearch,
|
|
96
|
-
rootId: string,
|
|
97
|
-
spanId?: string,
|
|
98
|
-
): TracesSearch {
|
|
88
|
+
export function openTrace(prev: TracesSearch, rootId: string, spanId?: string): TracesSearch {
|
|
99
89
|
return {
|
|
100
90
|
...prev,
|
|
101
91
|
trace: rootId,
|
|
@@ -137,10 +127,7 @@ export function toggleFold(prev: TracesSearch, foldId: string): TracesSearch {
|
|
|
137
127
|
* @param prev - Current search
|
|
138
128
|
* @param filter - Effect filter
|
|
139
129
|
*/
|
|
140
|
-
export function setEffectFilter(
|
|
141
|
-
prev: TracesSearch,
|
|
142
|
-
filter: EffectFilter | null,
|
|
143
|
-
): TracesSearch {
|
|
130
|
+
export function setEffectFilter(prev: TracesSearch, filter: EffectFilter | null): TracesSearch {
|
|
144
131
|
return {
|
|
145
132
|
...prev,
|
|
146
133
|
effect: serializeEffectFilter(filter),
|
|
@@ -34,9 +34,7 @@ export function tierOfKind(kind: EffectKind): UiEffectTier {
|
|
|
34
34
|
*
|
|
35
35
|
* @param effects - Span effects
|
|
36
36
|
*/
|
|
37
|
-
export function peakSpanTier(
|
|
38
|
-
effects: readonly TraceEffect[],
|
|
39
|
-
): SpanTier {
|
|
37
|
+
export function peakSpanTier(effects: readonly TraceEffect[]): SpanTier {
|
|
40
38
|
let peak: SpanTier = "none";
|
|
41
39
|
for (const e of effects) {
|
|
42
40
|
const t = tierOfKind(e.kind);
|
|
@@ -51,17 +51,10 @@ export function VaultA11yView(props: VaultA11yViewProps) {
|
|
|
51
51
|
style={{ minHeight: 32, width: "100%" }}
|
|
52
52
|
>
|
|
53
53
|
<span>{s.name}</span>
|
|
54
|
-
{s.sensitive && s.fingerprint ?
|
|
55
|
-
|
|
56
|
-
) : null}
|
|
57
|
-
{!s.sensitive && s.cleartext ? (
|
|
58
|
-
<span> {s.cleartext}</span>
|
|
59
|
-
) : null}
|
|
54
|
+
{s.sensitive && s.fingerprint ? <span> {s.fingerprint}</span> : null}
|
|
55
|
+
{!s.sensitive && s.cleartext ? <span> {s.cleartext}</span> : null}
|
|
60
56
|
{s.blastRadius.count > 0 ? (
|
|
61
|
-
<span role="status">
|
|
62
|
-
{" "}
|
|
63
|
-
blast {s.blastRadius.count}
|
|
64
|
-
</span>
|
|
57
|
+
<span role="status"> blast {s.blastRadius.count}</span>
|
|
65
58
|
) : null}
|
|
66
59
|
{s.sharedFingerprintEnvs.length > 0 ? (
|
|
67
60
|
<span role="status"> shared fingerprint</span>
|
|
@@ -108,11 +101,7 @@ export function VaultA11yView(props: VaultA11yViewProps) {
|
|
|
108
101
|
{open.resolution.map((step) => (
|
|
109
102
|
<li key={step.source}>
|
|
110
103
|
{step.source}
|
|
111
|
-
{step.won
|
|
112
|
-
? " — won"
|
|
113
|
-
: step.present
|
|
114
|
-
? " — present (lost)"
|
|
115
|
-
: " — absent"}
|
|
104
|
+
{step.won ? " — won" : step.present ? " — present (lost)" : " — absent"}
|
|
116
105
|
</li>
|
|
117
106
|
))}
|
|
118
107
|
</ol>
|
|
@@ -122,8 +111,7 @@ export function VaultA11yView(props: VaultA11yViewProps) {
|
|
|
122
111
|
<section aria-label="Readers">
|
|
123
112
|
<h3>Readers</h3>
|
|
124
113
|
<p>
|
|
125
|
-
Flows that declare fx.vault({open.name}):{" "}
|
|
126
|
-
{open.readers.join(", ") || "none"}
|
|
114
|
+
Flows that declare fx.vault({open.name}): {open.readers.join(", ") || "none"}
|
|
127
115
|
</p>
|
|
128
116
|
</section>
|
|
129
117
|
|
|
@@ -16,8 +16,7 @@ describe("Vault 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/vault" });
|
|
22
21
|
Object.defineProperty(globalThis, "window", {
|
|
23
22
|
value: window,
|
|
@@ -25,9 +25,7 @@ export function formatBlastRadius(blast: VaultBlastRadius): BlastRadiusLine {
|
|
|
25
25
|
};
|
|
26
26
|
}
|
|
27
27
|
const remaining =
|
|
28
|
-
blast.longestOutstandingMs != null
|
|
29
|
-
? formatDuration(blast.longestOutstandingMs)
|
|
30
|
-
: null;
|
|
28
|
+
blast.longestOutstandingMs != null ? formatDuration(blast.longestOutstandingMs) : null;
|
|
31
29
|
return {
|
|
32
30
|
summary: `${blast.count} in-flight durable run(s) will wake holding a new key`,
|
|
33
31
|
detail: remaining
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import {
|
|
3
|
-
rotateConfirmation,
|
|
4
|
-
setConfirmation,
|
|
5
|
-
validateTypedConfirm,
|
|
6
|
-
} from "./confirmation.ts";
|
|
2
|
+
import { rotateConfirmation, setConfirmation, validateTypedConfirm } from "./confirmation.ts";
|
|
7
3
|
|
|
8
4
|
describe("vault confirmation", () => {
|
|
9
5
|
test("set requires typed confirm in production", () => {
|
|
@@ -4,10 +4,7 @@
|
|
|
4
4
|
* There is no preview affordance for Vault — set and rotate are real writes.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
type ConfirmationPattern,
|
|
9
|
-
validateTypedConfirm,
|
|
10
|
-
} from "../flows/confirmation.ts";
|
|
7
|
+
import { type ConfirmationPattern, validateTypedConfirm } from "../flows/confirmation.ts";
|
|
11
8
|
|
|
12
9
|
export { validateTypedConfirm };
|
|
13
10
|
export type { ConfirmationPattern };
|
|
@@ -16,10 +16,7 @@ describe("dormantSecrets", () => {
|
|
|
16
16
|
lastReadAt: null,
|
|
17
17
|
readers: [],
|
|
18
18
|
};
|
|
19
|
-
const dormant = dormantSecrets(
|
|
20
|
-
[...VAULT_FIXTURE, neverRead],
|
|
21
|
-
now,
|
|
22
|
-
);
|
|
19
|
+
const dormant = dormantSecrets([...VAULT_FIXTURE, neverRead], now);
|
|
23
20
|
expect(dormant.some((s) => s.name === "LEGACY_WEBHOOK_SECRET")).toBe(true);
|
|
24
21
|
expect(dormant.some((s) => s.kind === "config")).toBe(false);
|
|
25
22
|
});
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import {
|
|
3
|
-
assertExportHasNoSecrets,
|
|
4
|
-
exportSafeList,
|
|
5
|
-
exportSafeRow,
|
|
6
|
-
} from "./export-safe.ts";
|
|
2
|
+
import { assertExportHasNoSecrets, exportSafeList, exportSafeRow } from "./export-safe.ts";
|
|
7
3
|
import { FIXTURE_SECRET_VALUE, VAULT_FIXTURE } from "./fixture.ts";
|
|
8
4
|
|
|
9
5
|
describe("exportSafe", () => {
|
|
@@ -53,10 +53,7 @@ export function exportSafeList(rows: readonly VaultRecord[]): string {
|
|
|
53
53
|
* @param payload - Serialized text
|
|
54
54
|
* @param knownSecrets - Cleartext secrets that must not appear
|
|
55
55
|
*/
|
|
56
|
-
export function assertExportHasNoSecrets(
|
|
57
|
-
payload: string,
|
|
58
|
-
knownSecrets: readonly string[],
|
|
59
|
-
): void {
|
|
56
|
+
export function assertExportHasNoSecrets(payload: string, knownSecrets: readonly string[]): void {
|
|
60
57
|
for (const secret of knownSecrets) {
|
|
61
58
|
if (secret.length > 0 && payload.includes(secret)) {
|
|
62
59
|
throw new Error("vault export leaked a secret value");
|
|
@@ -26,7 +26,7 @@ export const VAULT_FIXTURE: readonly VaultRecord[] = [
|
|
|
26
26
|
resolution: [
|
|
27
27
|
{ source: "process.env", present: false, won: false },
|
|
28
28
|
{ source: ".env.local", present: true, won: true },
|
|
29
|
-
{ source: ".env.
|
|
29
|
+
{ source: ".env.docker", present: false, won: false },
|
|
30
30
|
{ source: "driver", present: false, won: false },
|
|
31
31
|
{ source: "dev-fallback", present: false, won: false },
|
|
32
32
|
],
|
|
@@ -52,7 +52,7 @@ export const VAULT_FIXTURE: readonly VaultRecord[] = [
|
|
|
52
52
|
resolution: [
|
|
53
53
|
{ source: "process.env", present: true, won: true },
|
|
54
54
|
{ source: ".env.local", present: false, won: false },
|
|
55
|
-
{ source: ".env.
|
|
55
|
+
{ source: ".env.docker", present: false, won: false },
|
|
56
56
|
{ source: "driver", present: false, won: false },
|
|
57
57
|
{ source: "dev-fallback", present: false, won: false },
|
|
58
58
|
],
|
|
@@ -71,5 +71,5 @@ export const VAULT_FIXTURE: readonly VaultRecord[] = [
|
|
|
71
71
|
/** List response matching `console.vault.list`. */
|
|
72
72
|
export const VAULT_LIST_FIXTURE: VaultListResponse = {
|
|
73
73
|
secrets: VAULT_FIXTURE,
|
|
74
|
-
env: "
|
|
74
|
+
env: "local",
|
|
75
75
|
};
|
|
@@ -18,8 +18,7 @@ export function groupByKind(
|
|
|
18
18
|
const filtered = q
|
|
19
19
|
? secrets.filter(
|
|
20
20
|
(s) =>
|
|
21
|
-
s.name.toLowerCase().includes(q) ||
|
|
22
|
-
(s.description?.toLowerCase().includes(q) ?? false),
|
|
21
|
+
s.name.toLowerCase().includes(q) || (s.description?.toLowerCase().includes(q) ?? false),
|
|
23
22
|
)
|
|
24
23
|
: secrets;
|
|
25
24
|
|
|
@@ -11,11 +11,7 @@ export type {
|
|
|
11
11
|
VaultResolutionStep,
|
|
12
12
|
} from "./types.ts";
|
|
13
13
|
|
|
14
|
-
export {
|
|
15
|
-
VAULT_FIXTURE,
|
|
16
|
-
VAULT_LIST_FIXTURE,
|
|
17
|
-
FIXTURE_SECRET_VALUE,
|
|
18
|
-
} from "./fixture.ts";
|
|
14
|
+
export { VAULT_FIXTURE, VAULT_LIST_FIXTURE, FIXTURE_SECRET_VALUE } from "./fixture.ts";
|
|
19
15
|
|
|
20
16
|
export {
|
|
21
17
|
parseVaultSearch,
|
|
@@ -38,8 +34,4 @@ export { formatBlastRadius, formatDuration } from "./blast-radius.ts";
|
|
|
38
34
|
|
|
39
35
|
export { dormantSecrets, DORMANT_MS } from "./dormant.ts";
|
|
40
36
|
|
|
41
|
-
export {
|
|
42
|
-
exportSafeRow,
|
|
43
|
-
exportSafeList,
|
|
44
|
-
assertExportHasNoSecrets,
|
|
45
|
-
} from "./export-safe.ts";
|
|
37
|
+
export { exportSafeRow, exportSafeList, assertExportHasNoSecrets } from "./export-safe.ts";
|
|
@@ -19,9 +19,7 @@ export type VaultSearch = z.infer<typeof VaultSearchSchema>;
|
|
|
19
19
|
*
|
|
20
20
|
* @param search - Raw router search
|
|
21
21
|
*/
|
|
22
|
-
export function parseVaultSearch(
|
|
23
|
-
search: Record<string, unknown>,
|
|
24
|
-
): VaultSearch {
|
|
22
|
+
export function parseVaultSearch(search: Record<string, unknown>): VaultSearch {
|
|
25
23
|
const parsed = VaultSearchSchema.safeParse(search);
|
|
26
24
|
return parsed.success ? parsed.data : {};
|
|
27
25
|
}
|
|
@@ -31,9 +29,7 @@ export function parseVaultSearch(
|
|
|
31
29
|
*
|
|
32
30
|
* @param search - Search state
|
|
33
31
|
*/
|
|
34
|
-
export function serializeVaultSearch(
|
|
35
|
-
search: VaultSearch,
|
|
36
|
-
): Record<string, string> {
|
|
32
|
+
export function serializeVaultSearch(search: VaultSearch): Record<string, string> {
|
|
37
33
|
const out: Record<string, string> = {};
|
|
38
34
|
if (search.q) out.q = search.q;
|
|
39
35
|
if (search.name) out.name = search.name;
|
|
@@ -111,8 +111,6 @@ describe("console XSS gate", () => {
|
|
|
111
111
|
test("gate fails a PR that introduces raw HTML", () => {
|
|
112
112
|
const bad = `export function Evil() { return <div dangerouslySetInnerHTML={{ __html: x }} />; }`;
|
|
113
113
|
expect(findXssViolations(bad).length).toBeGreaterThan(0);
|
|
114
|
-
expect(findXssViolations(`el.innerHTML = payload`)).toContain(
|
|
115
|
-
String(/\.innerHTML\s*=/),
|
|
116
|
-
);
|
|
114
|
+
expect(findXssViolations(`el.innerHTML = payload`)).toContain(String(/\.innerHTML\s*=/));
|
|
117
115
|
});
|
|
118
116
|
});
|