okengine 0.2.6 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +24 -23
- package/README.md +52 -346
- package/docs/spec/console.md +165 -142
- package/docs/spec/example.md +490 -312
- package/docs/spec/four-applications.md +495 -314
- package/docs/spec/unified-theory.md +184 -175
- package/package.json +45 -37
- package/spec/manifest.v1.schema.json +40 -9
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +53 -31
- package/src/auth/invoke-as.ts +1 -3
- package/src/auth/operator.ts +8 -26
- package/src/auth/planes.ts +2 -7
- package/src/auth/plugin.ts +4 -7
- package/src/auth/roles.ts +1 -5
- package/src/auth/sessions.ts +10 -39
- package/src/cli/args.ts +1 -5
- package/src/cli/ask-dev-mode.ts +40 -0
- package/src/cli/build.ts +1 -2
- package/src/cli/client-add.test.ts +8 -15
- package/src/cli/client-add.ts +5 -14
- package/src/cli/completion.test.ts +1 -5
- package/src/cli/completion.ts +4 -17
- package/src/cli/db-auto-push.test.ts +64 -0
- package/src/cli/db-auto-push.ts +72 -0
- package/src/cli/db.test.ts +189 -0
- package/src/cli/db.ts +386 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +163 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev.test.ts +148 -21
- package/src/cli/dev.ts +208 -134
- package/src/cli/doc-drift.test.ts +3 -2
- package/src/cli/doc-drift.ts +21 -50
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +7 -8
- package/src/cli/docker.ts +1 -3
- package/src/cli/doctor-diff-examples.ts +1 -3
- package/src/cli/doctor-diff.test.ts +1 -5
- package/src/cli/doctor-diff.ts +17 -46
- package/src/cli/doctor-pii.ts +2 -7
- package/src/cli/doctor.test.ts +26 -4
- package/src/cli/doctor.ts +35 -11
- package/src/cli/eval.ts +4 -14
- package/src/cli/gates-list.ts +1 -4
- package/src/cli/hero-meta.test.ts +17 -19
- package/src/cli/hero-meta.ts +20 -30
- package/src/cli/images.ts +3 -8
- package/src/cli/index.ts +11 -2
- package/src/cli/load-config.images.test.ts +14 -14
- package/src/cli/load-config.ts +41 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +45 -0
- package/src/cli/ports.test.ts +4 -13
- package/src/cli/ports.ts +1 -3
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +2 -7
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/client/budget-entry.ts +1 -6
- package/src/client/create.test.ts +6 -12
- package/src/client/create.ts +2 -8
- package/src/client/errors.ts +1 -4
- package/src/client/index.ts +1 -6
- package/src/client/notes-contract.test.ts +4 -13
- package/src/client/transport.ts +9 -30
- package/src/client/types.ts +8 -29
- package/src/compiler/aot.test.ts +2 -9
- package/src/compiler/aot.ts +1 -4
- package/src/compiler/differential.test.ts +3 -11
- package/src/compiler/dynamic.ts +1 -4
- package/src/compiler/effects-infer.ts +8 -34
- package/src/compiler/emit.ts +1 -3
- package/src/compiler/extract.test.ts +96 -30
- package/src/compiler/extract.ts +362 -156
- package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
- package/src/compiler/fixtures/skyport.expected.json +24 -83
- package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
- package/src/compiler/http-parse.ts +2 -9
- package/src/compiler/index.ts +1 -5
- package/src/compiler/response.ts +4 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +57 -34
- package/src/config/index.ts +181 -37
- package/src/config/resolve-driver.test.ts +28 -17
- package/src/console/budget.test.ts +1 -4
- package/src/console/index.ts +1 -4
- package/src/console/server/access.test.ts +15 -43
- package/src/console/server/access.ts +19 -49
- package/src/console/server/ai.test.ts +3 -11
- package/src/console/server/ai.ts +23 -46
- package/src/console/server/app.ts +14 -45
- package/src/console/server/auth-rate.test.ts +4 -12
- package/src/console/server/bind.ts +1 -5
- package/src/console/server/channels.test.ts +2 -6
- package/src/console/server/channels.ts +10 -35
- package/src/console/server/claim.ts +2 -8
- package/src/console/server/clock.test.ts +2 -6
- package/src/console/server/clock.ts +8 -26
- package/src/console/server/console.test.ts +1 -3
- package/src/console/server/diff.test.ts +5 -17
- package/src/console/server/diff.ts +10 -31
- package/src/console/server/dry-run.audit.test.ts +2 -8
- package/src/console/server/flows.ts +64 -233
- package/src/console/server/gates.test.ts +14 -50
- package/src/console/server/gates.ts +13 -48
- package/src/console/server/index.ts +2 -9
- package/src/console/server/live.ts +3 -12
- package/src/console/server/operator-db.test.ts +4 -15
- package/src/console/server/operator-db.ts +13 -32
- package/src/console/server/plugin.ts +50 -53
- package/src/console/server/plugins.test.ts +2 -6
- package/src/console/server/plugins.ts +17 -56
- package/src/console/server/runs-pii.ts +2 -7
- package/src/console/server/security.gate.test.ts +18 -40
- package/src/console/server/serve.ts +10 -25
- package/src/console/server/signals.test.ts +1 -3
- package/src/console/server/signals.ts +17 -40
- package/src/console/server/state.ts +21 -59
- package/src/console/server/store.test.ts +20 -22
- package/src/console/server/store.ts +31 -76
- package/src/console/server/vault.test.ts +12 -29
- package/src/console/server/vault.ts +23 -60
- package/src/console/ui/access/AccessA11yView.tsx +6 -21
- package/src/console/ui/access/a11y.test.tsx +3 -12
- package/src/console/ui/access/acknowledgement.test.ts +1 -4
- package/src/console/ui/access/acknowledgement.ts +1 -3
- package/src/console/ui/access/blast-radius.ts +1 -3
- package/src/console/ui/access/confirmation.test.ts +1 -5
- package/src/console/ui/access/confirmation.ts +1 -4
- package/src/console/ui/access/fixture.ts +1 -5
- package/src/console/ui/access/grantable.test.ts +1 -3
- package/src/console/ui/access/grantable.ts +2 -7
- package/src/console/ui/access/index.ts +2 -9
- package/src/console/ui/access/provenance.test.ts +1 -3
- package/src/console/ui/access/provenance.ts +2 -6
- package/src/console/ui/access/search.test.ts +1 -5
- package/src/console/ui/access/search.ts +2 -6
- package/src/console/ui/ai/AiA11yView.tsx +6 -17
- package/src/console/ui/ai/a11y.test.tsx +2 -5
- package/src/console/ui/ai/fixture.ts +2 -7
- package/src/console/ui/ai/format.ts +1 -3
- package/src/console/ui/ai/group.test.ts +1 -3
- package/src/console/ui/ai/group.ts +4 -12
- package/src/console/ui/ai/index.ts +2 -9
- package/src/console/ui/ai/promotion.test.ts +2 -7
- package/src/console/ui/ai/promotion.ts +4 -13
- package/src/console/ui/ai/search.test.ts +2 -11
- package/src/console/ui/ai/search.ts +3 -13
- package/src/console/ui/ai/types.ts +1 -8
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
- package/src/console/ui/architecture/a11y.test.tsx +1 -2
- package/src/console/ui/architecture/declared.ts +1 -5
- package/src/console/ui/architecture/index.ts +7 -35
- package/src/console/ui/architecture/layout.ts +1 -3
- package/src/console/ui/architecture/pathologies.ts +10 -19
- package/src/console/ui/architecture/search.ts +6 -15
- package/src/console/ui/architecture/traffic.ts +4 -14
- package/src/console/ui/architecture/types.ts +2 -10
- package/src/console/ui/architecture/view.test.ts +7 -19
- package/src/console/ui/architecture/view.ts +9 -36
- package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
- package/src/console/ui/channels/a11y.test.tsx +1 -2
- package/src/console/ui/channels/confirmation.test.ts +1 -4
- package/src/console/ui/channels/confirmation.ts +1 -4
- package/src/console/ui/channels/findings.ts +1 -5
- package/src/console/ui/channels/index.ts +2 -8
- package/src/console/ui/channels/locale.test.ts +1 -3
- package/src/console/ui/channels/locale.ts +2 -8
- package/src/console/ui/channels/search.ts +4 -13
- package/src/console/ui/channels/taxonomy.ts +1 -3
- package/src/console/ui/clock/ClockA11yView.tsx +9 -26
- package/src/console/ui/clock/a11y.test.tsx +2 -5
- package/src/console/ui/clock/confirmation.test.ts +1 -3
- package/src/console/ui/clock/confirmation.ts +1 -4
- package/src/console/ui/clock/findings.ts +1 -4
- package/src/console/ui/clock/health.ts +2 -7
- package/src/console/ui/clock/index.ts +2 -10
- package/src/console/ui/clock/search.test.ts +1 -3
- package/src/console/ui/clock/search.ts +2 -6
- package/src/console/ui/clock/timeline.test.ts +1 -3
- package/src/console/ui/clock/waiting-on.test.ts +1 -5
- package/src/console/ui/clock/waiting-on.ts +2 -7
- package/src/console/ui/diff/DiffA11yView.tsx +8 -17
- package/src/console/ui/diff/a11y.test.tsx +2 -5
- package/src/console/ui/diff/group.test.ts +3 -13
- package/src/console/ui/diff/group.ts +2 -8
- package/src/console/ui/diff/index.ts +2 -8
- package/src/console/ui/diff/search.test.ts +1 -5
- package/src/console/ui/diff/search.ts +4 -16
- package/src/console/ui/diff/summary.ts +1 -2
- package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
- package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
- package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
- package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
- package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
- package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
- package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
- package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
- package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
- package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
- package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
- package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
- package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
- package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
- package/src/console/ui/flows/a11y.test.tsx +2 -8
- package/src/console/ui/flows/buffer.test.ts +3 -11
- package/src/console/ui/flows/buffer.ts +4 -11
- package/src/console/ui/flows/confirmation.ts +1 -3
- package/src/console/ui/flows/contract.test.ts +3 -7
- package/src/console/ui/flows/contract.ts +12 -36
- package/src/console/ui/flows/graph.test.ts +3 -11
- package/src/console/ui/flows/graph.ts +5 -15
- package/src/console/ui/flows/index.ts +1 -6
- package/src/console/ui/flows/save-as-test.ts +1 -3
- package/src/console/ui/flows/search.ts +8 -25
- package/src/console/ui/flows/tiers.ts +2 -9
- package/src/console/ui/gates/GatesA11yView.tsx +4 -13
- package/src/console/ui/gates/a11y.test.tsx +2 -5
- package/src/console/ui/gates/audit.ts +1 -3
- package/src/console/ui/gates/denial.test.ts +1 -3
- package/src/console/ui/gates/denial.ts +4 -12
- package/src/console/ui/gates/findings.ts +1 -3
- package/src/console/ui/gates/group.test.ts +3 -3
- package/src/console/ui/gates/group.ts +3 -11
- package/src/console/ui/gates/index.ts +2 -10
- package/src/console/ui/gates/search.ts +3 -10
- package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
- package/src/console/ui/overview/a11y.test.tsx +1 -2
- package/src/console/ui/overview/busiest.ts +1 -3
- package/src/console/ui/overview/compose.ts +1 -13
- package/src/console/ui/overview/cost.ts +34 -38
- package/src/console/ui/overview/fixture.ts +21 -26
- package/src/console/ui/overview/golden.ts +4 -14
- package/src/console/ui/overview/index.ts +2 -9
- package/src/console/ui/overview/rank.test.ts +3 -10
- package/src/console/ui/overview/rank.ts +2 -7
- package/src/console/ui/overview/slo.test.ts +5 -9
- package/src/console/ui/overview/slo.ts +6 -23
- package/src/console/ui/overview/verdict.ts +3 -10
- package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
- package/src/console/ui/plugins/a11y.test.tsx +1 -2
- package/src/console/ui/plugins/fixture.ts +2 -4
- package/src/console/ui/plugins/group.test.ts +1 -3
- package/src/console/ui/plugins/group.ts +1 -6
- package/src/console/ui/plugins/index.ts +3 -13
- package/src/console/ui/plugins/search.ts +7 -19
- package/src/console/ui/runs/RunsA11yView.tsx +5 -20
- package/src/console/ui/runs/a11y.test.tsx +2 -5
- package/src/console/ui/runs/explain.ts +2 -6
- package/src/console/ui/runs/group.ts +3 -12
- package/src/console/ui/runs/histogram.test.ts +2 -11
- package/src/console/ui/runs/histogram.ts +1 -4
- package/src/console/ui/runs/index.ts +4 -18
- package/src/console/ui/runs/project.ts +2 -6
- package/src/console/ui/runs/query.test.ts +1 -3
- package/src/console/ui/runs/query.ts +12 -35
- package/src/console/ui/runs/search.ts +5 -19
- package/src/console/ui/runs/trace-link.test.ts +2 -6
- package/src/console/ui/runs/trace-link.ts +4 -16
- package/src/console/ui/runs/types.ts +1 -3
- package/src/console/ui/shell/App.tsx +2 -10
- package/src/console/ui/shell/client.ts +22 -115
- package/src/console/ui/shell/components/ui.tsx +1 -4
- package/src/console/ui/shell/layout/Shell.tsx +2 -4
- package/src/console/ui/shell/main.tsx +31 -96
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
- package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
- package/src/console/ui/shell/setup/Wizard.tsx +3 -5
- package/src/console/ui/shell/styles.css +1 -2
- package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
- package/src/console/ui/signals/a11y.test.tsx +2 -5
- package/src/console/ui/signals/confirmation.test.ts +1 -5
- package/src/console/ui/signals/confirmation.ts +2 -6
- package/src/console/ui/signals/dry-run.ts +1 -3
- package/src/console/ui/signals/durable.ts +1 -3
- package/src/console/ui/signals/findings.ts +1 -3
- package/src/console/ui/signals/group.test.ts +2 -8
- package/src/console/ui/signals/group.ts +2 -10
- package/src/console/ui/signals/index.ts +1 -4
- package/src/console/ui/signals/monitor.ts +2 -7
- package/src/console/ui/signals/schema-form.test.ts +3 -14
- package/src/console/ui/signals/schema-form.ts +1 -4
- package/src/console/ui/signals/search.ts +4 -13
- package/src/console/ui/store/StoreA11yView.tsx +3 -9
- package/src/console/ui/store/a11y.test.tsx +2 -5
- package/src/console/ui/store/confirmation.test.ts +1 -3
- package/src/console/ui/store/confirmation.ts +1 -4
- package/src/console/ui/store/dry-run.ts +2 -5
- package/src/console/ui/store/fixture.ts +1 -2
- package/src/console/ui/store/group.test.ts +1 -6
- package/src/console/ui/store/group.ts +1 -4
- package/src/console/ui/store/index.ts +1 -5
- package/src/console/ui/store/search.ts +2 -6
- package/src/console/ui/store/will-not-fire.ts +1 -2
- package/src/console/ui/traces/TracesA11yView.tsx +10 -29
- package/src/console/ui/traces/a11y.test.tsx +1 -2
- package/src/console/ui/traces/chain.test.ts +5 -19
- package/src/console/ui/traces/chain.ts +1 -3
- package/src/console/ui/traces/critical-path.test.ts +1 -3
- package/src/console/ui/traces/critical-path.ts +2 -6
- package/src/console/ui/traces/filter.test.ts +2 -6
- package/src/console/ui/traces/filter.ts +5 -13
- package/src/console/ui/traces/fold.test.ts +4 -12
- package/src/console/ui/traces/fold.ts +1 -3
- package/src/console/ui/traces/mini.ts +1 -3
- package/src/console/ui/traces/replay.test.ts +1 -3
- package/src/console/ui/traces/replay.ts +1 -3
- package/src/console/ui/traces/sampling.ts +1 -4
- package/src/console/ui/traces/search.ts +4 -17
- package/src/console/ui/traces/tier.ts +1 -3
- package/src/console/ui/vault/VaultA11yView.tsx +5 -17
- package/src/console/ui/vault/a11y.test.tsx +1 -2
- package/src/console/ui/vault/blast-radius.ts +1 -3
- package/src/console/ui/vault/confirmation.test.ts +1 -5
- package/src/console/ui/vault/confirmation.ts +1 -4
- package/src/console/ui/vault/dormant.test.ts +1 -4
- package/src/console/ui/vault/export-safe.test.ts +1 -5
- package/src/console/ui/vault/export-safe.ts +1 -4
- package/src/console/ui/vault/fixture.ts +3 -3
- package/src/console/ui/vault/group.ts +1 -2
- package/src/console/ui/vault/index.ts +2 -10
- package/src/console/ui/vault/search.ts +2 -6
- package/src/console/ui/vault/types.ts +1 -1
- package/src/console/xss.gate.test.ts +1 -3
- package/src/docker/compose.ts +112 -20
- package/src/docker/derive.ts +5 -19
- package/src/docker/docker.test.ts +15 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +4 -11
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +5 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +6 -1
- package/src/docker/recipes/rustfs.ts +33 -0
- package/src/docker/stack-id.test.ts +33 -0
- package/src/docker/stack-id.ts +25 -13
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/types.ts +13 -4
- package/src/drivers/ai-anthropic.ts +5 -14
- package/src/drivers/ai-mock.ts +2 -5
- package/src/drivers/ai-openai-compatible.ts +4 -10
- package/src/drivers/ai-providers.test.ts +6 -13
- package/src/drivers/bun-native-completeness.test.ts +6 -15
- package/src/drivers/channel-console.ts +6 -7
- package/src/drivers/channel-fcm.ts +20 -30
- package/src/drivers/channel-resend.ts +1 -3
- package/src/drivers/channel-smtp.ts +2 -6
- package/src/drivers/channel-types.ts +2 -12
- package/src/drivers/channel-unifonic.ts +2 -6
- package/src/drivers/channel-wa-cloud.ts +2 -6
- package/src/drivers/channel-webpush.ts +21 -60
- package/src/drivers/conformance.test.ts +2 -10
- package/src/drivers/conformance.ts +8 -21
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -56
- package/src/drivers/memory.ts +14 -41
- package/src/drivers/pgvector.ts +7 -11
- package/src/drivers/postgres.ts +7 -13
- package/src/drivers/redis.ts +13 -37
- package/src/drivers/s3.ts +5 -17
- package/src/drivers/signal-engine.ts +12 -49
- package/src/drivers/signal-memory.ts +2 -8
- package/src/drivers/signal-nats.ts +4 -9
- package/src/drivers/signal-postgres.ts +62 -129
- package/src/drivers/signal-redis.ts +7 -21
- package/src/drivers/signal-types.ts +1 -4
- package/src/drivers/sqlite.ts +3 -12
- package/src/drivers/types.ts +4 -23
- package/src/drivers/vault-env.ts +2 -6
- package/src/drivers/vault-infisical.ts +1 -5
- package/src/drivers/vault-managed.ts +1 -5
- package/src/drivers/vault-memory.ts +1 -5
- package/src/drivers/vault-openbao.ts +1 -5
- package/src/drivers/vault-sops.ts +10 -35
- package/src/drivers/vault-types.ts +1 -7
- package/src/elements/ai/declare.ts +4 -14
- package/src/elements/ai/eval.ts +2 -6
- package/src/elements/ai/pii.ts +1 -3
- package/src/elements/ai/runtime.ts +12 -50
- package/src/elements/ai/schema.ts +4 -15
- package/src/elements/ai.test.ts +13 -24
- package/src/elements/ai.ts +1 -5
- package/src/elements/channel/consent.ts +3 -12
- package/src/elements/channel/costs.ts +4 -15
- package/src/elements/channel/declare.ts +1 -4
- package/src/elements/channel/email-auth.ts +1 -4
- package/src/elements/channel/locale.ts +2 -10
- package/src/elements/channel/mask.ts +1 -3
- package/src/elements/channel/mime.ts +2 -12
- package/src/elements/channel/outcomes.test.ts +1 -5
- package/src/elements/channel/outcomes.ts +5 -15
- package/src/elements/channel/receipts.ts +2 -7
- package/src/elements/channel/runtime.ts +28 -74
- package/src/elements/channel/suppression.ts +8 -14
- package/src/elements/channel.test.ts +8 -31
- package/src/elements/channel.ts +3 -14
- package/src/elements/clock/actions.ts +6 -18
- package/src/elements/clock/declare.ts +1 -3
- package/src/elements/clock/dst.ts +1 -5
- package/src/elements/clock/durable.ts +4 -16
- package/src/elements/clock/health.ts +2 -7
- package/src/elements/clock/leader.ts +2 -9
- package/src/elements/clock/reconcile.ts +4 -15
- package/src/elements/clock/runtime.ts +2 -5
- package/src/elements/clock/schedule.ts +4 -20
- package/src/elements/clock.test.ts +2 -7
- package/src/elements/clock.ts +5 -23
- package/src/elements/gate/permissions.ts +1 -4
- package/src/elements/gate/runtime.ts +7 -28
- package/src/elements/gate.ts +1 -5
- package/src/elements/index.ts +9 -7
- package/src/elements/signal/declare.ts +2 -7
- package/src/elements/signal/reconcile.test.ts +1 -4
- package/src/elements/signal/runtime.ts +1 -3
- package/src/elements/signal.test.ts +3 -15
- package/src/elements/signal.ts +2 -8
- package/src/elements/store/cache.test.ts +46 -0
- package/src/elements/store/cache.ts +3 -11
- package/src/elements/store/classify.ts +5 -22
- package/src/elements/store/declare.ts +8 -17
- package/src/elements/store/domain-ddl.test.ts +86 -0
- package/src/elements/store/emit-drizzle.ts +363 -0
- package/src/elements/store/files-policy.test.ts +1 -5
- package/src/elements/store/files-policy.ts +4 -12
- package/src/elements/store/load-plugin-tables.ts +103 -0
- package/src/elements/store/missing-relation.test.ts +83 -0
- package/src/elements/store/missing-relation.ts +38 -0
- package/src/elements/store/replica.ts +1 -4
- package/src/elements/store/runtime.ts +25 -28
- package/src/elements/store/schema-decl.test.ts +227 -0
- package/src/elements/store/schema-decl.ts +516 -0
- package/src/elements/store/sql-condition.ts +11 -21
- package/src/elements/store/sql-session.test.ts +50 -0
- package/src/elements/store/sql-session.ts +60 -63
- package/src/elements/store/table.ts +35 -19
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +37 -31
- package/src/elements/vault/chain.ts +34 -0
- package/src/elements/vault/declare.ts +22 -32
- package/src/elements/vault/fingerprint.ts +2 -7
- package/src/elements/vault/redact.ts +2 -6
- package/src/elements/vault/runtime.ts +18 -32
- package/src/elements/vault.test.ts +12 -28
- package/src/elements/vault.ts +8 -12
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +34 -94
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.ts +2 -8
- package/src/kernel/boot-bind/clock.ts +2 -6
- package/src/kernel/boot-bind/gate.ts +2 -8
- package/src/kernel/boot-bind/runs.ts +1 -3
- package/src/kernel/boot-bind/signal.ts +3 -10
- package/src/kernel/boot-bind/store.test.ts +17 -17
- package/src/kernel/boot-bind/store.ts +44 -50
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -9
- package/src/kernel/boot.ts +29 -76
- package/src/kernel/budget.test.ts +1 -3
- package/src/kernel/capability.ts +3 -10
- package/src/kernel/dry-run.test.ts +1 -4
- package/src/kernel/dry-run.ts +3 -11
- package/src/kernel/effects.test.ts +1 -5
- package/src/kernel/effects.ts +4 -11
- package/src/kernel/errors.registry.test.ts +2 -8
- package/src/kernel/errors.ts +23 -32
- package/src/kernel/flow.test.ts +12 -25
- package/src/kernel/flow.ts +5 -25
- package/src/kernel/fx.test.ts +15 -44
- package/src/kernel/fx.ts +27 -79
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +10 -10
- package/src/kernel/hooks.ts +3 -12
- package/src/kernel/index.ts +4 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +1 -6
- package/src/kernel/pipeline.test.ts +10 -19
- package/src/kernel/pipeline.ts +5 -17
- package/src/kernel/plug.ts +4 -11
- package/src/kernel/plugin/conflicts.test.ts +13 -25
- package/src/kernel/plugin/decorate.test.ts +8 -13
- package/src/kernel/plugin/scoping.test.ts +4 -11
- package/src/kernel/plugin.ts +48 -24
- package/src/kernel/registry.ts +80 -29
- package/src/kernel/router.test.ts +15 -13
- package/src/kernel/router.ts +9 -29
- package/src/kernel/routing-budget.test.ts +1 -3
- package/src/kernel/run-telemetry.ts +1 -3
- package/src/kernel/triggers.ts +4 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/index.ts +2 -9
- package/src/manifest/types.ts +29 -5
- package/src/manifest/undeclared.test.ts +4 -12
- package/src/manifest/undeclared.ts +1 -2
- package/src/manifest/validate.test.ts +2 -6
- package/src/manifest/validate.ts +4 -14
- package/src/mcp/authorization.ts +8 -27
- package/src/mcp/confirmation.ts +3 -10
- package/src/mcp/data.ts +2 -6
- package/src/mcp/docs-index.ts +4 -7
- package/src/mcp/docs-mcp.test.ts +3 -12
- package/src/mcp/docs-server.ts +7 -27
- package/src/mcp/docs-tools.ts +2 -6
- package/src/mcp/index.ts +1 -6
- package/src/mcp/injection.gate.test.ts +4 -18
- package/src/mcp/mcp.test.ts +18 -49
- package/src/mcp/protocol.ts +3 -10
- package/src/mcp/server.ts +11 -52
- package/src/mcp/session.ts +4 -14
- package/src/mcp/tools.ts +14 -50
- package/src/plugins/catalogue.test.ts +3 -7
- package/src/plugins/catalogue.ts +1 -3
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/supply-chain.ts +5 -17
- package/src/release/exports.ts +3 -8
- package/src/release/measure.exports.test.ts +1 -3
- package/src/release/measure.ts +15 -43
- package/src/runs/bench.test.ts +1 -3
- package/src/runs/collect.ts +8 -25
- package/src/runs/drivers/clickhouse.ts +2 -9
- package/src/runs/drivers/files.ts +9 -31
- package/src/runs/drivers/memory.ts +5 -22
- package/src/runs/drivers/postgres.ts +8 -20
- package/src/runs/duckdb.ts +2 -8
- package/src/runs/index.ts +3 -14
- package/src/runs/outlier.ts +3 -10
- package/src/runs/parquet.ts +8 -26
- package/src/runs/privacy.ts +2 -8
- package/src/runs/runs.test.ts +3 -9
- package/src/runs/runtime.ts +7 -32
- package/src/runs/shred.ts +10 -29
- package/src/runs/types.ts +1 -4
- package/src/runtime/bun.ts +4 -15
- package/src/runtime/cold-start.bench.ts +1 -3
- package/src/runtime/dev-request-log.test.ts +1 -4
- package/src/runtime/dev-request-log.ts +1 -4
- package/src/runtime/index.ts +1 -6
- package/src/runtime/primitives.ts +5 -4
- package/src/runtime/security.ts +3 -13
- package/src/runtime/serve.test.ts +4 -7
- package/src/runtime/types.ts +1 -4
- package/src/runtime/web-standard.ts +3 -15
- package/src/term.test.ts +4 -6
- package/src/term.ts +49 -98
- package/src/test/create-test-app.test.ts +4 -14
- package/src/test/create-test-app.ts +13 -31
- package/src/test/provisions.integration.test.ts +3 -11
- package/src/upgrade/codemods.test.ts +25 -6
- package/src/upgrade/codemods.ts +116 -3
- package/src/validation/standard-schema.test.ts +2 -5
- package/src/validation/standard-schema.ts +13 -33
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
|
@@ -6,10 +6,7 @@
|
|
|
6
6
|
import { durableLine } from "./durable.ts";
|
|
7
7
|
import { SIGNALS_FIXTURE } from "./fixture.ts";
|
|
8
8
|
import { groupByPhysics } from "./group.ts";
|
|
9
|
-
import {
|
|
10
|
-
fieldsFromSchema,
|
|
11
|
-
payloadToFormValues,
|
|
12
|
-
} from "./schema-form.ts";
|
|
9
|
+
import { fieldsFromSchema, payloadToFormValues } from "./schema-form.ts";
|
|
13
10
|
|
|
14
11
|
/** Props for {@link SignalsA11yView}. */
|
|
15
12
|
export interface SignalsA11yViewProps {
|
|
@@ -49,10 +46,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
|
|
|
49
46
|
<section aria-label="Signal list">
|
|
50
47
|
<h2>Signals</h2>
|
|
51
48
|
{groups.map((group) => (
|
|
52
|
-
<section
|
|
53
|
-
key={group.delivery}
|
|
54
|
-
aria-label={group.label}
|
|
55
|
-
>
|
|
49
|
+
<section key={group.delivery} aria-label={group.label}>
|
|
56
50
|
<h3>{group.label}</h3>
|
|
57
51
|
<ul>
|
|
58
52
|
{group.signals.map((s) => (
|
|
@@ -63,12 +57,8 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
|
|
|
63
57
|
style={{ minHeight: 32, width: "100%" }}
|
|
64
58
|
>
|
|
65
59
|
<span>{s.name}</span>
|
|
66
|
-
{s.orphaned ?
|
|
67
|
-
|
|
68
|
-
) : null}
|
|
69
|
-
{s.dead > 0 ? (
|
|
70
|
-
<span role="status"> DLQ {s.dead}</span>
|
|
71
|
-
) : null}
|
|
60
|
+
{s.orphaned ? <span role="status"> orphaned</span> : null}
|
|
61
|
+
{s.dead > 0 ? <span role="status"> DLQ {s.dead}</span> : null}
|
|
72
62
|
{s.outboxLagMs !== null && s.outboxLagMs > 0 ? (
|
|
73
63
|
<span> outbox {s.outboxLagMs}ms</span>
|
|
74
64
|
) : null}
|
|
@@ -168,9 +158,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
|
|
|
168
158
|
{open.dead > 0 ? (
|
|
169
159
|
<section aria-label="Dead letters">
|
|
170
160
|
<h3>Dead letters</h3>
|
|
171
|
-
<p>
|
|
172
|
-
Bulk repair: dry run first, then replay at a controlled rate.
|
|
173
|
-
</p>
|
|
161
|
+
<p>Bulk repair: dry run first, then replay at a controlled rate.</p>
|
|
174
162
|
<label>
|
|
175
163
|
Replay rate (per second)
|
|
176
164
|
<input
|
|
@@ -190,11 +178,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
|
|
|
190
178
|
<ul>
|
|
191
179
|
{open.deadLetters.map((d) => (
|
|
192
180
|
<li key={d.id}>
|
|
193
|
-
<button
|
|
194
|
-
type="button"
|
|
195
|
-
aria-pressed={d.id === dlqId}
|
|
196
|
-
style={{ minHeight: 32 }}
|
|
197
|
-
>
|
|
181
|
+
<button type="button" aria-pressed={d.id === dlqId} style={{ minHeight: 32 }}>
|
|
198
182
|
{d.id} · {d.failures[d.failures.length - 1]?.code}
|
|
199
183
|
</button>
|
|
200
184
|
</li>
|
|
@@ -213,10 +197,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
|
|
|
213
197
|
<label key={f.key}>
|
|
214
198
|
{f.key}
|
|
215
199
|
{f.enumValues ? (
|
|
216
|
-
<select
|
|
217
|
-
aria-label={f.key}
|
|
218
|
-
defaultValue={formValues[f.key] ?? ""}
|
|
219
|
-
>
|
|
200
|
+
<select aria-label={f.key} defaultValue={formValues[f.key] ?? ""}>
|
|
220
201
|
{f.enumValues.map((v) => (
|
|
221
202
|
<option key={v} value={v}>
|
|
222
203
|
{v}
|
|
@@ -224,10 +205,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
|
|
|
224
205
|
))}
|
|
225
206
|
</select>
|
|
226
207
|
) : (
|
|
227
|
-
<input
|
|
228
|
-
aria-label={f.key}
|
|
229
|
-
defaultValue={formValues[f.key] ?? ""}
|
|
230
|
-
/>
|
|
208
|
+
<input aria-label={f.key} defaultValue={formValues[f.key] ?? ""} />
|
|
231
209
|
)}
|
|
232
210
|
</label>
|
|
233
211
|
))
|
|
@@ -253,9 +231,7 @@ export function SignalsA11yView(props: SignalsA11yViewProps) {
|
|
|
253
231
|
{dlq.causeRunId ? (
|
|
254
232
|
<p>
|
|
255
233
|
Causal chain:{" "}
|
|
256
|
-
<a
|
|
257
|
-
href={`/traces?trace=${encodeURIComponent(dlq.causeRunId)}`}
|
|
258
|
-
>
|
|
234
|
+
<a href={`/traces?trace=${encodeURIComponent(dlq.causeRunId)}`}>
|
|
259
235
|
{dlq.causeFlow ?? dlq.causeRunId}
|
|
260
236
|
</a>
|
|
261
237
|
</p>
|
|
@@ -16,8 +16,7 @@ describe("Signals 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/signals" });
|
|
22
21
|
Object.defineProperty(globalThis, "window", {
|
|
23
22
|
value: window,
|
|
@@ -70,9 +69,7 @@ describe("Signals 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
|
-
<SignalsA11yView openSignal="order-placed" openDlq="dlq-1" />,
|
|
75
|
-
);
|
|
72
|
+
root.render(<SignalsA11yView openSignal="order-placed" openDlq="dlq-1" />);
|
|
76
73
|
});
|
|
77
74
|
|
|
78
75
|
await new Promise((r) => setTimeout(r, 10));
|
|
@@ -1,9 +1,5 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import {
|
|
3
|
-
discardConfirmation,
|
|
4
|
-
replayConfirmation,
|
|
5
|
-
validateTypedConfirm,
|
|
6
|
-
} from "./confirmation.ts";
|
|
2
|
+
import { discardConfirmation, replayConfirmation, validateTypedConfirm } from "./confirmation.ts";
|
|
7
3
|
import { SIGNALS_FIXTURE } from "./fixture.ts";
|
|
8
4
|
|
|
9
5
|
describe("signal confirmation", () => {
|
|
@@ -5,10 +5,7 @@
|
|
|
5
5
|
* - Replay that re-triggers an external effect → typed confirmation + reason.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
9
|
-
UNDO_WINDOW_MS,
|
|
10
|
-
type ConfirmationPattern,
|
|
11
|
-
} from "../flows/confirmation.ts";
|
|
8
|
+
import { UNDO_WINDOW_MS, type ConfirmationPattern } from "../flows/confirmation.ts";
|
|
12
9
|
import type { SignalRecord } from "./types.ts";
|
|
13
10
|
|
|
14
11
|
export { UNDO_WINDOW_MS, validateTypedConfirm } from "../flows/confirmation.ts";
|
|
@@ -50,8 +47,7 @@ export function discardConfirmation(
|
|
|
50
47
|
): ConfirmationPattern {
|
|
51
48
|
const irreversible =
|
|
52
49
|
options.production &&
|
|
53
|
-
(signal.consumers.some((c) => c.external || !c.durable) ||
|
|
54
|
-
signal.dead > 0);
|
|
50
|
+
(signal.consumers.some((c) => c.external || !c.durable) || signal.dead > 0);
|
|
55
51
|
if (irreversible) {
|
|
56
52
|
return {
|
|
57
53
|
kind: "typed",
|
|
@@ -8,9 +8,7 @@
|
|
|
8
8
|
import type { SignalRecord } from "./types.ts";
|
|
9
9
|
|
|
10
10
|
/** Whether the panel may offer dry-run for this signal. */
|
|
11
|
-
export type DryRunOffer =
|
|
12
|
-
| { readonly ok: true }
|
|
13
|
-
| { readonly ok: false; readonly reason: string };
|
|
11
|
+
export type DryRunOffer = { readonly ok: true } | { readonly ok: false; readonly reason: string };
|
|
14
12
|
|
|
15
13
|
/**
|
|
16
14
|
* Decide whether dry-run is offered — same refusal spirit as Traces.
|
|
@@ -17,9 +17,7 @@ export interface DurableLine {
|
|
|
17
17
|
*
|
|
18
18
|
* @param consumersDurable - From Manifest (`flow.durable` on every consumer)
|
|
19
19
|
*/
|
|
20
|
-
export function durableLine(
|
|
21
|
-
consumersDurable: boolean | null,
|
|
22
|
-
): DurableLine {
|
|
20
|
+
export function durableLine(consumersDurable: boolean | null): DurableLine {
|
|
23
21
|
if (consumersDurable === true) {
|
|
24
22
|
return {
|
|
25
23
|
durable: true,
|
|
@@ -19,9 +19,7 @@ export interface DeadLetterFinding {
|
|
|
19
19
|
*
|
|
20
20
|
* @param signals - Signals panel rows
|
|
21
21
|
*/
|
|
22
|
-
export function deadLetterFindings(
|
|
23
|
-
signals: readonly SignalRecord[],
|
|
24
|
-
): readonly DeadLetterFinding[] {
|
|
22
|
+
export function deadLetterFindings(signals: readonly SignalRecord[]): readonly DeadLetterFinding[] {
|
|
25
23
|
return signals
|
|
26
24
|
.filter((s) => s.dead > 0)
|
|
27
25
|
.map((s) => ({
|
|
@@ -5,11 +5,7 @@ import { groupByPhysics } from "./group.ts";
|
|
|
5
5
|
describe("groupByPhysics", () => {
|
|
6
6
|
test("one list grouped by delivery — not three tabs", () => {
|
|
7
7
|
const groups = groupByPhysics(SIGNALS_FIXTURE);
|
|
8
|
-
expect(groups.map((g) => g.delivery)).toEqual([
|
|
9
|
-
"once",
|
|
10
|
-
"broadcast",
|
|
11
|
-
"live",
|
|
12
|
-
]);
|
|
8
|
+
expect(groups.map((g) => g.delivery)).toEqual(["once", "broadcast", "live"]);
|
|
13
9
|
expect(groups.find((g) => g.delivery === "once")?.signals.length).toBe(2);
|
|
14
10
|
expect(groups.find((g) => g.delivery === "broadcast")?.signals[0]?.name).toBe(
|
|
15
11
|
"inventory-changed",
|
|
@@ -19,9 +15,7 @@ describe("groupByPhysics", () => {
|
|
|
19
15
|
test("retains orphaned signals in the list", () => {
|
|
20
16
|
const groups = groupByPhysics(SIGNALS_FIXTURE);
|
|
21
17
|
const once = groups.find((g) => g.delivery === "once");
|
|
22
|
-
expect(once?.signals.some((s) => s.name === "legacy-shipped" && s.orphaned)).toBe(
|
|
23
|
-
true,
|
|
24
|
-
);
|
|
18
|
+
expect(once?.signals.some((s) => s.name === "legacy-shipped" && s.orphaned)).toBe(true);
|
|
25
19
|
});
|
|
26
20
|
|
|
27
21
|
test("free-text filter dims across name and endpoints", () => {
|
|
@@ -2,17 +2,9 @@
|
|
|
2
2
|
* Group signals by delivery physics — one list, not three tabs (console §9.4).
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
-
import type {
|
|
6
|
-
SignalDelivery,
|
|
7
|
-
SignalPhysicsGroup,
|
|
8
|
-
SignalRecord,
|
|
9
|
-
} from "./types.ts";
|
|
5
|
+
import type { SignalDelivery, SignalPhysicsGroup, SignalRecord } from "./types.ts";
|
|
10
6
|
|
|
11
|
-
const PHYSICS_ORDER: readonly SignalDelivery[] = [
|
|
12
|
-
"once",
|
|
13
|
-
"broadcast",
|
|
14
|
-
"live",
|
|
15
|
-
];
|
|
7
|
+
const PHYSICS_ORDER: readonly SignalDelivery[] = ["once", "broadcast", "live"];
|
|
16
8
|
|
|
17
9
|
const LABELS: Record<SignalDelivery, string> = {
|
|
18
10
|
once: "Once — competing consumers",
|
|
@@ -46,7 +46,4 @@ export {
|
|
|
46
46
|
} from "./monitor.ts";
|
|
47
47
|
export { SIGNALS_FIXTURE } from "./fixture.ts";
|
|
48
48
|
export { dryRunOffer, type DryRunOffer } from "./dry-run.ts";
|
|
49
|
-
export {
|
|
50
|
-
deadLetterFindings,
|
|
51
|
-
type DeadLetterFinding,
|
|
52
|
-
} from "./findings.ts";
|
|
49
|
+
export { deadLetterFindings, type DeadLetterFinding } from "./findings.ts";
|
|
@@ -33,10 +33,7 @@ export function appendLivePayload(
|
|
|
33
33
|
* @param state - Current
|
|
34
34
|
* @param paused - Desired
|
|
35
35
|
*/
|
|
36
|
-
export function setPaused(
|
|
37
|
-
state: LiveMonitorState,
|
|
38
|
-
paused: boolean,
|
|
39
|
-
): LiveMonitorState {
|
|
36
|
+
export function setPaused(state: LiveMonitorState, paused: boolean): LiveMonitorState {
|
|
40
37
|
return {
|
|
41
38
|
...state,
|
|
42
39
|
paused,
|
|
@@ -68,9 +65,7 @@ export function exportLivePayloads(payloads: readonly unknown[]): string {
|
|
|
68
65
|
*
|
|
69
66
|
* @param seed - Optional initial payloads
|
|
70
67
|
*/
|
|
71
|
-
export function createLiveMonitor(
|
|
72
|
-
seed: readonly unknown[] = [],
|
|
73
|
-
): LiveMonitorState {
|
|
68
|
+
export function createLiveMonitor(seed: readonly unknown[] = []): LiveMonitorState {
|
|
74
69
|
return {
|
|
75
70
|
paused: false,
|
|
76
71
|
autoPausedByScroll: false,
|
|
@@ -1,24 +1,13 @@
|
|
|
1
1
|
import { describe, expect, test } from "bun:test";
|
|
2
|
-
import {
|
|
3
|
-
fieldsFromSchema,
|
|
4
|
-
formValuesToPayload,
|
|
5
|
-
payloadToFormValues,
|
|
6
|
-
} from "./schema-form.ts";
|
|
2
|
+
import { fieldsFromSchema, formValuesToPayload, payloadToFormValues } from "./schema-form.ts";
|
|
7
3
|
import { SIGNALS_FIXTURE } from "./fixture.ts";
|
|
8
4
|
|
|
9
5
|
describe("schema-form", () => {
|
|
10
6
|
test("builds editable fields from declared schema", () => {
|
|
11
7
|
const order = SIGNALS_FIXTURE.find((s) => s.name === "order-placed")!;
|
|
12
8
|
const fields = fieldsFromSchema(order.schema);
|
|
13
|
-
expect(fields.map((f) => f.key)).toEqual([
|
|
14
|
-
|
|
15
|
-
"amount",
|
|
16
|
-
"currency",
|
|
17
|
-
]);
|
|
18
|
-
expect(fields.find((f) => f.key === "currency")?.enumValues).toEqual([
|
|
19
|
-
"USD",
|
|
20
|
-
"EUR",
|
|
21
|
-
]);
|
|
9
|
+
expect(fields.map((f) => f.key)).toEqual(["orderId", "amount", "currency"]);
|
|
10
|
+
expect(fields.find((f) => f.key === "currency")?.enumValues).toEqual(["USD", "EUR"]);
|
|
22
11
|
});
|
|
23
12
|
|
|
24
13
|
test("round-trips payload through form values", () => {
|
|
@@ -39,10 +39,7 @@ export function fieldsFromSchema(schema: unknown): readonly SchemaField[] {
|
|
|
39
39
|
? d.enum.filter((v): v is string => typeof v === "string")
|
|
40
40
|
: undefined;
|
|
41
41
|
const type =
|
|
42
|
-
d.type === "string" ||
|
|
43
|
-
d.type === "number" ||
|
|
44
|
-
d.type === "boolean" ||
|
|
45
|
-
d.type === "integer"
|
|
42
|
+
d.type === "string" || d.type === "number" || d.type === "boolean" || d.type === "integer"
|
|
46
43
|
? d.type
|
|
47
44
|
: "unknown";
|
|
48
45
|
return {
|
|
@@ -16,9 +16,7 @@ export const SignalsSearchSchema = z.object({
|
|
|
16
16
|
paused: z
|
|
17
17
|
.union([z.boolean(), z.literal("true"), z.literal("false")])
|
|
18
18
|
.optional()
|
|
19
|
-
.transform((v) =>
|
|
20
|
-
v === undefined ? undefined : v === true || v === "true",
|
|
21
|
-
),
|
|
19
|
+
.transform((v) => (v === undefined ? undefined : v === true || v === "true")),
|
|
22
20
|
/** Bulk repair rate (messages/sec). */
|
|
23
21
|
rate: z.coerce.number().min(1).max(1_000).optional(),
|
|
24
22
|
/** Broadcast subscriber target for replay. */
|
|
@@ -33,9 +31,7 @@ export type SignalsSearch = z.infer<typeof SignalsSearchSchema>;
|
|
|
33
31
|
*
|
|
34
32
|
* @param search - Raw router search
|
|
35
33
|
*/
|
|
36
|
-
export function parseSignalsSearch(
|
|
37
|
-
search: Record<string, unknown>,
|
|
38
|
-
): SignalsSearch {
|
|
34
|
+
export function parseSignalsSearch(search: Record<string, unknown>): SignalsSearch {
|
|
39
35
|
const parsed = SignalsSearchSchema.safeParse(search);
|
|
40
36
|
return parsed.success ? parsed.data : {};
|
|
41
37
|
}
|
|
@@ -45,9 +41,7 @@ export function parseSignalsSearch(
|
|
|
45
41
|
*
|
|
46
42
|
* @param search - Current state
|
|
47
43
|
*/
|
|
48
|
-
export function serializeSignalsSearch(
|
|
49
|
-
search: SignalsSearch,
|
|
50
|
-
): Record<string, unknown> {
|
|
44
|
+
export function serializeSignalsSearch(search: SignalsSearch): Record<string, unknown> {
|
|
51
45
|
const out: Record<string, unknown> = {};
|
|
52
46
|
if (search.q) out.q = search.q;
|
|
53
47
|
if (search.signal) out.signal = search.signal;
|
|
@@ -84,10 +78,7 @@ export function closeSignal(search: SignalsSearch): SignalsSearch {
|
|
|
84
78
|
* @param search - Current
|
|
85
79
|
* @param id - Message id
|
|
86
80
|
*/
|
|
87
|
-
export function openDeadLetter(
|
|
88
|
-
search: SignalsSearch,
|
|
89
|
-
id: string,
|
|
90
|
-
): SignalsSearch {
|
|
81
|
+
export function openDeadLetter(search: SignalsSearch, id: string): SignalsSearch {
|
|
91
82
|
return { ...search, dlq: id };
|
|
92
83
|
}
|
|
93
84
|
|
|
@@ -23,8 +23,7 @@ export interface StoreA11yViewProps {
|
|
|
23
23
|
* @param props - Open store / child
|
|
24
24
|
*/
|
|
25
25
|
export function StoreA11yView(props: StoreA11yViewProps) {
|
|
26
|
-
const tenancy =
|
|
27
|
-
props.tenancyDeclared ?? STORE_LIST_FIXTURE.tenancyDeclared;
|
|
26
|
+
const tenancy = props.tenancyDeclared ?? STORE_LIST_FIXTURE.tenancyDeclared;
|
|
28
27
|
const groups = groupByFacet(STORE_LIST_FIXTURE.stores);
|
|
29
28
|
const openRef = props.openRef ?? "sql:db";
|
|
30
29
|
const open = STORE_LIST_FIXTURE.stores.find((s) => s.ref === openRef);
|
|
@@ -74,14 +73,9 @@ export function StoreA11yView(props: StoreA11yViewProps) {
|
|
|
74
73
|
{s.replicaLagMs != null && s.replicaLagMs > 0 ? (
|
|
75
74
|
<span role="status"> lag {s.replicaLagMs}ms</span>
|
|
76
75
|
) : null}
|
|
77
|
-
{s.migrationDrift?.drifted ?
|
|
78
|
-
<span role="status"> drift</span>
|
|
79
|
-
) : null}
|
|
76
|
+
{s.migrationDrift?.drifted ? <span role="status"> drift</span> : null}
|
|
80
77
|
{s.warnings.length > 0 ? (
|
|
81
|
-
<span role="status">
|
|
82
|
-
{" "}
|
|
83
|
-
{s.warnings.length} warning(s)
|
|
84
|
-
</span>
|
|
78
|
+
<span role="status"> {s.warnings.length} warning(s)</span>
|
|
85
79
|
) : null}
|
|
86
80
|
</button>
|
|
87
81
|
</li>
|
|
@@ -16,8 +16,7 @@ describe("Store 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/store" });
|
|
22
21
|
Object.defineProperty(globalThis, "window", {
|
|
23
22
|
value: window,
|
|
@@ -70,9 +69,7 @@ describe("Store 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
|
-
<StoreA11yView openRef="sql:db" openChild="bookings" />,
|
|
75
|
-
);
|
|
72
|
+
root.render(<StoreA11yView openRef="sql:db" openChild="bookings" />);
|
|
76
73
|
});
|
|
77
74
|
|
|
78
75
|
await new Promise((r) => setTimeout(r, 10));
|
|
@@ -31,8 +31,6 @@ describe("store confirmation", () => {
|
|
|
31
31
|
phrase: "EDIT",
|
|
32
32
|
}),
|
|
33
33
|
).toBeNull();
|
|
34
|
-
expect(
|
|
35
|
-
validateTypedConfirm({ typed: "x", reason: "ab", phrase: "EDIT" }),
|
|
36
|
-
).not.toBeNull();
|
|
34
|
+
expect(validateTypedConfirm({ typed: "x", reason: "ab", phrase: "EDIT" })).not.toBeNull();
|
|
37
35
|
});
|
|
38
36
|
});
|
|
@@ -4,10 +4,7 @@
|
|
|
4
4
|
* Direct edit / delete / purge are irreversible in production — typed confirm.
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import {
|
|
8
|
-
UNDO_WINDOW_MS,
|
|
9
|
-
type ConfirmationPattern,
|
|
10
|
-
} from "../flows/confirmation.ts";
|
|
7
|
+
import { UNDO_WINDOW_MS, type ConfirmationPattern } from "../flows/confirmation.ts";
|
|
11
8
|
|
|
12
9
|
export { UNDO_WINDOW_MS, validateTypedConfirm } from "../flows/confirmation.ts";
|
|
13
10
|
export type { ConfirmationPattern } from "../flows/confirmation.ts";
|
|
@@ -8,9 +8,7 @@
|
|
|
8
8
|
import type { StoreRecord } from "./types.ts";
|
|
9
9
|
|
|
10
10
|
/** Whether the panel may offer a mutation preview. */
|
|
11
|
-
export type PreviewOffer =
|
|
12
|
-
| { readonly ok: true }
|
|
13
|
-
| { readonly ok: false; readonly reason: string };
|
|
11
|
+
export type PreviewOffer = { readonly ok: true } | { readonly ok: false; readonly reason: string };
|
|
14
12
|
|
|
15
13
|
/**
|
|
16
14
|
* Decide whether preview is offered for this store.
|
|
@@ -21,8 +19,7 @@ export function previewOffer(store: StoreRecord): PreviewOffer {
|
|
|
21
19
|
if (store.facet === "index") {
|
|
22
20
|
return {
|
|
23
21
|
ok: false,
|
|
24
|
-
reason:
|
|
25
|
-
"Index facet has no bulk-update preview — similarity probe is read-only.",
|
|
22
|
+
reason: "Index facet has no bulk-update preview — similarity probe is read-only.",
|
|
26
23
|
};
|
|
27
24
|
}
|
|
28
25
|
return { ok: true };
|
|
@@ -112,8 +112,7 @@ export const STORE_FIXTURE: readonly StoreRecord[] = [
|
|
|
112
112
|
warnings: [
|
|
113
113
|
{
|
|
114
114
|
code: "non_ascii_key",
|
|
115
|
-
message:
|
|
116
|
-
"Non-ASCII object key — signed URL encoding may break on S3-compatible stores.",
|
|
115
|
+
message: "Non-ASCII object key — signed URL encoding may break on S3-compatible stores.",
|
|
117
116
|
key: "фото/id.jpg",
|
|
118
117
|
},
|
|
119
118
|
],
|
|
@@ -5,12 +5,7 @@ import { groupByFacet } from "./group.ts";
|
|
|
5
5
|
describe("groupByFacet", () => {
|
|
6
6
|
test("groups into sql / kv / files / index", () => {
|
|
7
7
|
const groups = groupByFacet(STORE_FIXTURE);
|
|
8
|
-
expect(groups.map((g) => g.facet)).toEqual([
|
|
9
|
-
"sql",
|
|
10
|
-
"kv",
|
|
11
|
-
"files",
|
|
12
|
-
"index",
|
|
13
|
-
]);
|
|
8
|
+
expect(groups.map((g) => g.facet)).toEqual(["sql", "kv", "files", "index"]);
|
|
14
9
|
});
|
|
15
10
|
|
|
16
11
|
test("filters by name", () => {
|
|
@@ -19,10 +19,7 @@ const FACET_LABELS: Record<StoreFacet, string> = {
|
|
|
19
19
|
* @param stores - Projected rows
|
|
20
20
|
* @param q - Optional filter
|
|
21
21
|
*/
|
|
22
|
-
export function groupByFacet(
|
|
23
|
-
stores: readonly StoreRecord[],
|
|
24
|
-
q = "",
|
|
25
|
-
): readonly StoreFacetGroup[] {
|
|
22
|
+
export function groupByFacet(stores: readonly StoreRecord[], q = ""): readonly StoreFacetGroup[] {
|
|
26
23
|
const needle = q.trim().toLowerCase();
|
|
27
24
|
const filtered = needle
|
|
28
25
|
? stores.filter(
|
|
@@ -33,8 +33,4 @@ export {
|
|
|
33
33
|
export { formatWillNotFire, type WillNotFireLines } from "./will-not-fire.ts";
|
|
34
34
|
export { previewOffer, type PreviewOffer } from "./dry-run.ts";
|
|
35
35
|
export { explainCache, type CacheExplanation } from "./cache-view.ts";
|
|
36
|
-
export {
|
|
37
|
-
STORE_FIXTURE,
|
|
38
|
-
STORE_LIST_FIXTURE,
|
|
39
|
-
STORE_LIST_NO_TENANCY,
|
|
40
|
-
} from "./fixture.ts";
|
|
36
|
+
export { STORE_FIXTURE, STORE_LIST_FIXTURE, STORE_LIST_NO_TENANCY } from "./fixture.ts";
|
|
@@ -22,9 +22,7 @@ export type StoreSearch = z.infer<typeof StoreSearchSchema>;
|
|
|
22
22
|
*
|
|
23
23
|
* @param search - Raw router search
|
|
24
24
|
*/
|
|
25
|
-
export function parseStoreSearch(
|
|
26
|
-
search: Record<string, unknown>,
|
|
27
|
-
): StoreSearch {
|
|
25
|
+
export function parseStoreSearch(search: Record<string, unknown>): StoreSearch {
|
|
28
26
|
const parsed = StoreSearchSchema.safeParse(search);
|
|
29
27
|
return parsed.success ? parsed.data : {};
|
|
30
28
|
}
|
|
@@ -34,9 +32,7 @@ export function parseStoreSearch(
|
|
|
34
32
|
*
|
|
35
33
|
* @param search - Search state
|
|
36
34
|
*/
|
|
37
|
-
export function serializeStoreSearch(
|
|
38
|
-
search: StoreSearch,
|
|
39
|
-
): Record<string, string> {
|
|
35
|
+
export function serializeStoreSearch(search: StoreSearch): Record<string, string> {
|
|
40
36
|
const out: Record<string, string> = {};
|
|
41
37
|
if (search.q) out.q = search.q;
|
|
42
38
|
if (search.ref) out.ref = search.ref;
|
|
@@ -32,8 +32,7 @@ export function formatWillNotFire(willNotFire: WillNotFire): WillNotFireLines {
|
|
|
32
32
|
);
|
|
33
33
|
}
|
|
34
34
|
return {
|
|
35
|
-
headline:
|
|
36
|
-
"Direct edit is not a flow execution — the following will NOT happen:",
|
|
35
|
+
headline: "Direct edit is not a flow execution — the following will NOT happen:",
|
|
37
36
|
lines,
|
|
38
37
|
empty: lines.length === 0,
|
|
39
38
|
};
|
|
@@ -27,18 +27,10 @@ export function TracesA11yView(props: TracesA11yViewProps) {
|
|
|
27
27
|
const roots = groupTraceRoots(TRACES_FIXTURE);
|
|
28
28
|
const openRootId = props.openRootId ?? "run-create-ok";
|
|
29
29
|
const open = roots.find((r) => r.rootId === openRootId);
|
|
30
|
-
const focusId = open
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const
|
|
34
|
-
? buildCausalChain(TRACES_FIXTURE, focusId)
|
|
35
|
-
: null;
|
|
36
|
-
const critical = chain
|
|
37
|
-
? criticalPathSpanIds(chain.connected)
|
|
38
|
-
: new Set<string>();
|
|
39
|
-
const folded = chain
|
|
40
|
-
? foldTimeline(intervalsFromSpans(chain.connected), {}, critical)
|
|
41
|
-
: null;
|
|
30
|
+
const focusId = open ? initialFocusSpanId(open.spans) : undefined;
|
|
31
|
+
const chain = focusId ? buildCausalChain(TRACES_FIXTURE, focusId) : null;
|
|
32
|
+
const critical = chain ? criticalPathSpanIds(chain.connected) : new Set<string>();
|
|
33
|
+
const folded = chain ? foldTimeline(intervalsFromSpans(chain.connected), {}, critical) : null;
|
|
42
34
|
const decision = chain ? replayDecision(chain.connected) : null;
|
|
43
35
|
|
|
44
36
|
return (
|
|
@@ -83,10 +75,7 @@ export function TracesA11yView(props: TracesA11yViewProps) {
|
|
|
83
75
|
{err}
|
|
84
76
|
</span>
|
|
85
77
|
) : null}
|
|
86
|
-
<span aria-hidden="true">
|
|
87
|
-
{" "}
|
|
88
|
-
[{bars.length} bars]
|
|
89
|
-
</span>
|
|
78
|
+
<span aria-hidden="true"> [{bars.length} bars]</span>
|
|
90
79
|
</button>
|
|
91
80
|
</li>
|
|
92
81
|
);
|
|
@@ -135,10 +124,7 @@ export function TracesA11yView(props: TracesA11yViewProps) {
|
|
|
135
124
|
{folded.segments.map((seg) => {
|
|
136
125
|
if (seg.kind === "fold") {
|
|
137
126
|
return (
|
|
138
|
-
<li
|
|
139
|
-
key={seg.id}
|
|
140
|
-
style={{ flex: `${seg.displayMs} 0 0` }}
|
|
141
|
-
>
|
|
127
|
+
<li key={seg.id} style={{ flex: `${seg.displayMs} 0 0` }}>
|
|
142
128
|
<button
|
|
143
129
|
type="button"
|
|
144
130
|
aria-expanded={seg.expanded}
|
|
@@ -151,10 +137,8 @@ export function TracesA11yView(props: TracesA11yViewProps) {
|
|
|
151
137
|
}
|
|
152
138
|
const dim = !seg.critical;
|
|
153
139
|
const external =
|
|
154
|
-
peakSpanTier(
|
|
155
|
-
|
|
156
|
-
?.effects ?? [],
|
|
157
|
-
) === "external";
|
|
140
|
+
peakSpanTier(chain.connected.find((s) => s.id === seg.spanId)?.effects ?? []) ===
|
|
141
|
+
"external";
|
|
158
142
|
return (
|
|
159
143
|
<li
|
|
160
144
|
key={seg.id}
|
|
@@ -162,8 +146,7 @@ export function TracesA11yView(props: TracesA11yViewProps) {
|
|
|
162
146
|
minHeight: 32,
|
|
163
147
|
flex: `${seg.displayMs} 0 0`,
|
|
164
148
|
opacity: dim ? 0.38 : 1,
|
|
165
|
-
background:
|
|
166
|
-
seg.tier === "external" ? "#d97706" : "#3d9a6a",
|
|
149
|
+
background: seg.tier === "external" ? "#d97706" : "#3d9a6a",
|
|
167
150
|
outline: seg.failed ? "2px solid #c44b4b" : undefined,
|
|
168
151
|
}}
|
|
169
152
|
>
|
|
@@ -180,9 +163,7 @@ export function TracesA11yView(props: TracesA11yViewProps) {
|
|
|
180
163
|
<button
|
|
181
164
|
type="button"
|
|
182
165
|
style={{ minHeight: 32, minWidth: 24 }}
|
|
183
|
-
title={
|
|
184
|
-
decision?.mode === "dry-run" ? decision.reason : undefined
|
|
185
|
-
}
|
|
166
|
+
title={decision?.mode === "dry-run" ? decision.reason : undefined}
|
|
186
167
|
>
|
|
187
168
|
{decision?.mode === "dry-run" ? "Dry-run replay" : "Replay"}
|
|
188
169
|
</button>
|
|
@@ -16,8 +16,7 @@ describe("Traces 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/traces" });
|
|
22
21
|
Object.defineProperty(globalThis, "window", {
|
|
23
22
|
value: window,
|