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
|
@@ -59,14 +59,9 @@ export function StorePanel() {
|
|
|
59
59
|
const tenancyDeclared = listQuery.data?.tenancyDeclared ?? false;
|
|
60
60
|
const tenants = listQuery.data?.tenants ?? [];
|
|
61
61
|
const stores = listQuery.data?.stores ?? [];
|
|
62
|
-
const groups = useMemo(
|
|
63
|
-
() => groupByFacet(stores, search.q ?? ""),
|
|
64
|
-
[stores, search.q],
|
|
65
|
-
);
|
|
62
|
+
const groups = useMemo(() => groupByFacet(stores, search.q ?? ""), [stores, search.q]);
|
|
66
63
|
const open = stores.find((s) => s.ref === search.ref);
|
|
67
|
-
const child =
|
|
68
|
-
open?.children.find((c) => c.name === search.child) ??
|
|
69
|
-
open?.children[0];
|
|
64
|
+
const child = open?.children.find((c) => c.name === search.child) ?? open?.children[0];
|
|
70
65
|
const view = search.view ?? "browse";
|
|
71
66
|
const editConfirm = editConfirmation({ production: true });
|
|
72
67
|
const delConfirm = deleteConfirmation({ production: true });
|
|
@@ -85,11 +80,7 @@ export function StorePanel() {
|
|
|
85
80
|
view,
|
|
86
81
|
probeVector,
|
|
87
82
|
],
|
|
88
|
-
enabled:
|
|
89
|
-
!!open &&
|
|
90
|
-
!!child &&
|
|
91
|
-
view === "browse" &&
|
|
92
|
-
(!tenancyDeclared || !!search.tenant),
|
|
83
|
+
enabled: !!open && !!child && view === "browse" && (!tenancyDeclared || !!search.tenant),
|
|
93
84
|
queryFn: async () => {
|
|
94
85
|
if (!open || !child) return null;
|
|
95
86
|
const vector =
|
|
@@ -143,9 +134,7 @@ export function StorePanel() {
|
|
|
143
134
|
});
|
|
144
135
|
if (res.error) throw new Error(res.error.code);
|
|
145
136
|
const data = res.data!;
|
|
146
|
-
setWillNotPreview(
|
|
147
|
-
formatWillNotFire(data.willNotFire).lines as string[],
|
|
148
|
-
);
|
|
137
|
+
setWillNotPreview(formatWillNotFire(data.willNotFire).lines as string[]);
|
|
149
138
|
return data;
|
|
150
139
|
},
|
|
151
140
|
});
|
|
@@ -299,9 +288,7 @@ export function StorePanel() {
|
|
|
299
288
|
aria-label="Filter stores"
|
|
300
289
|
className="min-h-8 border border-[var(--oke-line)] bg-transparent px-2"
|
|
301
290
|
value={search.q ?? ""}
|
|
302
|
-
onChange={(e) =>
|
|
303
|
-
setSearch({ ...search, q: e.target.value || undefined })
|
|
304
|
-
}
|
|
291
|
+
onChange={(e) => setSearch({ ...search, q: e.target.value || undefined })}
|
|
305
292
|
/>
|
|
306
293
|
</label>
|
|
307
294
|
</header>
|
|
@@ -336,13 +323,9 @@ export function StorePanel() {
|
|
|
336
323
|
<span>{s.name}</span>
|
|
337
324
|
<span className="text-xs text-[var(--oke-muted)]">
|
|
338
325
|
{s.children.length} resource(s)
|
|
339
|
-
{s.replicaLagMs != null
|
|
340
|
-
? ` · lag ${s.replicaLagMs}ms`
|
|
341
|
-
: ""}
|
|
326
|
+
{s.replicaLagMs != null ? ` · lag ${s.replicaLagMs}ms` : ""}
|
|
342
327
|
{s.migrationDrift?.drifted ? " · drift" : ""}
|
|
343
|
-
{s.warnings.length > 0
|
|
344
|
-
? ` · ${s.warnings.length} warn`
|
|
345
|
-
: ""}
|
|
328
|
+
{s.warnings.length > 0 ? ` · ${s.warnings.length} warn` : ""}
|
|
346
329
|
</span>
|
|
347
330
|
</button>
|
|
348
331
|
</li>
|
|
@@ -359,13 +342,12 @@ export function StorePanel() {
|
|
|
359
342
|
>
|
|
360
343
|
{!open ? (
|
|
361
344
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
362
|
-
Select a store. Tenant selector appears only when tenancy is
|
|
363
|
-
declared on the Manifest.
|
|
345
|
+
Select a store. Tenant selector appears only when tenancy is declared on the Manifest.
|
|
364
346
|
</p>
|
|
365
347
|
) : tenancyDeclared && !search.tenant ? (
|
|
366
348
|
<p role="status" className="text-sm">
|
|
367
|
-
Select a tenant in the header before browsing — compliance
|
|
368
|
-
|
|
349
|
+
Select a tenant in the header before browsing — compliance boundary, not a display
|
|
350
|
+
filter.
|
|
369
351
|
</p>
|
|
370
352
|
) : (
|
|
371
353
|
<StoreDetail
|
|
@@ -419,9 +401,7 @@ function StoreDetail(props: {
|
|
|
419
401
|
readonly view: "browse" | "cache" | "sql" | "probe";
|
|
420
402
|
readonly search: StoreSearch;
|
|
421
403
|
readonly setSearch: (s: StoreSearch) => void;
|
|
422
|
-
readonly browse: Awaited<
|
|
423
|
-
ReturnType<typeof consoleCalls.storeQuery>
|
|
424
|
-
>["data"];
|
|
404
|
+
readonly browse: Awaited<ReturnType<typeof consoleCalls.storeQuery>>["data"];
|
|
425
405
|
readonly browseLoading: boolean;
|
|
426
406
|
readonly cache: ReturnType<typeof explainCache> | null;
|
|
427
407
|
readonly willNot: ReturnType<typeof formatWillNotFire> | null;
|
|
@@ -503,8 +483,8 @@ function StoreDetail(props: {
|
|
|
503
483
|
[
|
|
504
484
|
["browse", "Browse"],
|
|
505
485
|
["cache", "Cache"],
|
|
506
|
-
...(open.facet === "sql" ? [["sql", "SQL"]] as const : []),
|
|
507
|
-
...(open.facet === "index" ? [["probe", "Probe"]] as const : []),
|
|
486
|
+
...(open.facet === "sql" ? ([["sql", "SQL"]] as const) : []),
|
|
487
|
+
...(open.facet === "index" ? ([["probe", "Probe"]] as const) : []),
|
|
508
488
|
] as const
|
|
509
489
|
).map(([id, label]) => (
|
|
510
490
|
<button
|
|
@@ -514,9 +494,7 @@ function StoreDetail(props: {
|
|
|
514
494
|
aria-selected={view === id}
|
|
515
495
|
className={clsx(
|
|
516
496
|
"min-h-8 px-2 text-sm",
|
|
517
|
-
view === id
|
|
518
|
-
? "text-[var(--oke-fg)] underline"
|
|
519
|
-
: "text-[var(--oke-muted)]",
|
|
497
|
+
view === id ? "text-[var(--oke-fg)] underline" : "text-[var(--oke-muted)]",
|
|
520
498
|
)}
|
|
521
499
|
onClick={() => setSearch({ ...search, view: id })}
|
|
522
500
|
>
|
|
@@ -531,9 +509,7 @@ function StoreDetail(props: {
|
|
|
531
509
|
aria-label="Store resource"
|
|
532
510
|
className="min-h-8 max-w-xs border border-[var(--oke-line)] bg-transparent px-2"
|
|
533
511
|
value={childName ?? ""}
|
|
534
|
-
onChange={(e) =>
|
|
535
|
-
setSearch(openChild(search, e.target.value))
|
|
536
|
-
}
|
|
512
|
+
onChange={(e) => setSearch(openChild(search, e.target.value))}
|
|
537
513
|
>
|
|
538
514
|
{open.children.map((c) => (
|
|
539
515
|
<option key={c.name} value={c.name}>
|
|
@@ -547,21 +523,14 @@ function StoreDetail(props: {
|
|
|
547
523
|
<p className="text-sm" role="status">
|
|
548
524
|
Writers:{" "}
|
|
549
525
|
{child.writers.map((f) => (
|
|
550
|
-
<Link
|
|
551
|
-
key={f}
|
|
552
|
-
to="/flows"
|
|
553
|
-
search={{ flow: f } as never}
|
|
554
|
-
className="mr-2 underline"
|
|
555
|
-
>
|
|
526
|
+
<Link key={f} to="/flows" search={{ flow: f } as never} className="mr-2 underline">
|
|
556
527
|
{f}
|
|
557
528
|
</Link>
|
|
558
529
|
))}
|
|
559
530
|
{child.writers.length === 0 ? "none" : null}
|
|
560
531
|
{" · "}
|
|
561
532
|
Readers: {child.readers.join(", ") || "none"}
|
|
562
|
-
{child.piiColumns.length > 0
|
|
563
|
-
? ` · PII columns: ${child.piiColumns.join(", ")}`
|
|
564
|
-
: ""}
|
|
533
|
+
{child.piiColumns.length > 0 ? ` · PII columns: ${child.piiColumns.join(", ")}` : ""}
|
|
565
534
|
</p>
|
|
566
535
|
) : null}
|
|
567
536
|
|
|
@@ -592,8 +561,7 @@ function StoreDetail(props: {
|
|
|
592
561
|
{cache.summary}
|
|
593
562
|
</p>
|
|
594
563
|
<p className="text-xs text-[var(--oke-muted)]">
|
|
595
|
-
Invalidating flows:{" "}
|
|
596
|
-
{cache.invalidatingFlows.join(", ") || "none"}
|
|
564
|
+
Invalidating flows: {cache.invalidatingFlows.join(", ") || "none"}
|
|
597
565
|
</p>
|
|
598
566
|
<Button type="button" onClick={onPurge}>
|
|
599
567
|
Purge cache namespace
|
|
@@ -635,9 +603,7 @@ function StoreDetail(props: {
|
|
|
635
603
|
/>
|
|
636
604
|
</label>
|
|
637
605
|
) : null}
|
|
638
|
-
{browseLoading ? (
|
|
639
|
-
<p className="text-sm text-[var(--oke-muted)]">Loading…</p>
|
|
640
|
-
) : null}
|
|
606
|
+
{browseLoading ? <p className="text-sm text-[var(--oke-muted)]">Loading…</p> : null}
|
|
641
607
|
{browse?.rows ? (
|
|
642
608
|
<table className="w-full text-left text-sm">
|
|
643
609
|
<thead>
|
|
@@ -663,9 +629,7 @@ function StoreDetail(props: {
|
|
|
663
629
|
type="button"
|
|
664
630
|
className="ml-2 underline"
|
|
665
631
|
style={{ minHeight: 32 }}
|
|
666
|
-
onClick={() =>
|
|
667
|
-
onReveal(String(row.id ?? ""), col)
|
|
668
|
-
}
|
|
632
|
+
onClick={() => onReveal(String(row.id ?? ""), col)}
|
|
669
633
|
>
|
|
670
634
|
Reveal
|
|
671
635
|
</button>
|
|
@@ -673,10 +637,7 @@ function StoreDetail(props: {
|
|
|
673
637
|
</td>
|
|
674
638
|
))}
|
|
675
639
|
<td className="border-b px-2 py-1">
|
|
676
|
-
<Button
|
|
677
|
-
type="button"
|
|
678
|
-
onClick={() => onDelete([String(row.id ?? "")])}
|
|
679
|
-
>
|
|
640
|
+
<Button type="button" onClick={() => onDelete([String(row.id ?? "")])}>
|
|
680
641
|
Delete
|
|
681
642
|
</Button>
|
|
682
643
|
</td>
|
|
@@ -691,9 +652,7 @@ function StoreDetail(props: {
|
|
|
691
652
|
<li key={k.key} className="flex min-h-8 items-center gap-2">
|
|
692
653
|
<span className="font-mono">{k.key}</span>
|
|
693
654
|
{k.value !== undefined ? (
|
|
694
|
-
<span className="text-[var(--oke-muted)]">
|
|
695
|
-
{JSON.stringify(k.value)}
|
|
696
|
-
</span>
|
|
655
|
+
<span className="text-[var(--oke-muted)]">{JSON.stringify(k.value)}</span>
|
|
697
656
|
) : null}
|
|
698
657
|
{k.warnings?.map((w) => (
|
|
699
658
|
<span key={w.code} role="status" className="text-xs">
|
|
@@ -724,11 +683,13 @@ function StoreDetail(props: {
|
|
|
724
683
|
</section>
|
|
725
684
|
)}
|
|
726
685
|
|
|
727
|
-
<section
|
|
686
|
+
<section
|
|
687
|
+
aria-label="Direct edit"
|
|
688
|
+
className="flex flex-col gap-2 border-t border-[var(--oke-line)] pt-4"
|
|
689
|
+
>
|
|
728
690
|
<h3 className="text-sm font-medium">Direct edit</h3>
|
|
729
691
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
730
|
-
Not a flow execution. Before saving, preview names what will not
|
|
731
|
-
fire.
|
|
692
|
+
Not a flow execution. Before saving, preview names what will not fire.
|
|
732
693
|
</p>
|
|
733
694
|
{willNot && !willNot.empty ? (
|
|
734
695
|
<ul className="text-sm">
|
|
@@ -7,20 +7,10 @@ import { Link, useNavigate, useSearch } from "@tanstack/react-router";
|
|
|
7
7
|
import { clsx } from "clsx";
|
|
8
8
|
import { useEffect, useMemo, useState } from "react";
|
|
9
9
|
import { createRowBuffer, matchesQuery } from "../../../flows/buffer.ts";
|
|
10
|
-
import {
|
|
11
|
-
buildCausalChain,
|
|
12
|
-
groupTraceRoots,
|
|
13
|
-
initialFocusSpanId,
|
|
14
|
-
} from "../../../traces/chain.ts";
|
|
10
|
+
import { buildCausalChain, groupTraceRoots, initialFocusSpanId } from "../../../traces/chain.ts";
|
|
15
11
|
import { criticalPathSpanIds } from "../../../traces/critical-path.ts";
|
|
16
|
-
import {
|
|
17
|
-
|
|
18
|
-
traceMatchesEffectFilter,
|
|
19
|
-
} from "../../../traces/filter.ts";
|
|
20
|
-
import {
|
|
21
|
-
foldTimeline,
|
|
22
|
-
intervalsFromSpans,
|
|
23
|
-
} from "../../../traces/fold.ts";
|
|
12
|
+
import { parseEffectFilter, traceMatchesEffectFilter } from "../../../traces/filter.ts";
|
|
13
|
+
import { foldTimeline, intervalsFromSpans } from "../../../traces/fold.ts";
|
|
24
14
|
import { miniWaterfall, rootErrorCode } from "../../../traces/mini.ts";
|
|
25
15
|
import { replayDecision } from "../../../traces/replay.ts";
|
|
26
16
|
import {
|
|
@@ -95,10 +85,7 @@ export function TracesPanel() {
|
|
|
95
85
|
refetchInterval: 5_000,
|
|
96
86
|
});
|
|
97
87
|
|
|
98
|
-
const spans = useMemo(
|
|
99
|
-
() => (runsQuery.data ?? []).map(rowToSpan),
|
|
100
|
-
[runsQuery.data],
|
|
101
|
-
);
|
|
88
|
+
const spans = useMemo(() => (runsQuery.data ?? []).map(rowToSpan), [runsQuery.data]);
|
|
102
89
|
|
|
103
90
|
// Seed / update buffer without moving the ground (console §7.2).
|
|
104
91
|
useEffect(() => {
|
|
@@ -144,15 +131,9 @@ export function TracesPanel() {
|
|
|
144
131
|
(search.trace
|
|
145
132
|
? groupTraceRoots(visibleSpans).find((r) => r.rootId === search.trace)
|
|
146
133
|
: undefined);
|
|
147
|
-
const focusId = openRoot
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
const chain = focusId
|
|
151
|
-
? buildCausalChain(visibleSpans, focusId)
|
|
152
|
-
: null;
|
|
153
|
-
const critical = chain
|
|
154
|
-
? criticalPathSpanIds(chain.connected)
|
|
155
|
-
: new Set<string>();
|
|
134
|
+
const focusId = openRoot ? initialFocusSpanId(openRoot.spans, search.span) : undefined;
|
|
135
|
+
const chain = focusId ? buildCausalChain(visibleSpans, focusId) : null;
|
|
136
|
+
const critical = chain ? criticalPathSpanIds(chain.connected) : new Set<string>();
|
|
156
137
|
const folded = chain
|
|
157
138
|
? foldTimeline(
|
|
158
139
|
intervalsFromSpans(chain.connected),
|
|
@@ -183,15 +164,9 @@ export function TracesPanel() {
|
|
|
183
164
|
<div className="flex h-full min-h-0 flex-col">
|
|
184
165
|
<header className="flex shrink-0 flex-wrap items-end gap-4 border-b border-[var(--oke-line)] px-6 py-4">
|
|
185
166
|
<div className="flex flex-col gap-1">
|
|
186
|
-
<p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">
|
|
187
|
-
|
|
188
|
-
</p>
|
|
189
|
-
<h1 className="text-xl font-semibold tracking-tight">
|
|
190
|
-
Causal chain
|
|
191
|
-
</h1>
|
|
192
|
-
<p className="text-xs text-[var(--oke-muted)]">
|
|
193
|
-
Sampling: {samplingLabel(liveBoosts)}
|
|
194
|
-
</p>
|
|
167
|
+
<p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">Traces</p>
|
|
168
|
+
<h1 className="text-xl font-semibold tracking-tight">Causal chain</h1>
|
|
169
|
+
<p className="text-xs text-[var(--oke-muted)]">Sampling: {samplingLabel(liveBoosts)}</p>
|
|
195
170
|
</div>
|
|
196
171
|
<label className="flex flex-col gap-1 text-sm">
|
|
197
172
|
<span className="text-[var(--oke-muted)]">Filter by effect</span>
|
|
@@ -201,9 +176,7 @@ export function TracesPanel() {
|
|
|
201
176
|
value={search.effect ?? ""}
|
|
202
177
|
onChange={(e) => {
|
|
203
178
|
const v = e.target.value;
|
|
204
|
-
setSearch(
|
|
205
|
-
setEffectFilter(search, v ? parseEffectFilter(v) : null),
|
|
206
|
-
);
|
|
179
|
+
setSearch(setEffectFilter(search, v ? parseEffectFilter(v) : null));
|
|
207
180
|
}}
|
|
208
181
|
>
|
|
209
182
|
<option value="">All effects</option>
|
|
@@ -219,10 +192,7 @@ export function TracesPanel() {
|
|
|
219
192
|
type="button"
|
|
220
193
|
variant="ghost"
|
|
221
194
|
onClick={() => {
|
|
222
|
-
const flow =
|
|
223
|
-
openRoot?.root.flow ??
|
|
224
|
-
roots[0]?.root.flow ??
|
|
225
|
-
"bookings.create";
|
|
195
|
+
const flow = openRoot?.root.flow ?? roots[0]?.root.flow ?? "bookings.create";
|
|
226
196
|
setBoosts((b) => boostFlowFully(b, flow));
|
|
227
197
|
}}
|
|
228
198
|
>
|
|
@@ -245,9 +215,7 @@ export function TracesPanel() {
|
|
|
245
215
|
className="min-h-0 overflow-auto border-r border-[var(--oke-line)]"
|
|
246
216
|
>
|
|
247
217
|
{runsQuery.isLoading ? (
|
|
248
|
-
<p className="px-6 py-8 text-sm text-[var(--oke-muted)]">
|
|
249
|
-
Loading traces…
|
|
250
|
-
</p>
|
|
218
|
+
<p className="px-6 py-8 text-sm text-[var(--oke-muted)]">Loading traces…</p>
|
|
251
219
|
) : roots.length === 0 ? (
|
|
252
220
|
<p className="px-6 py-8 text-sm text-[var(--oke-muted)]">
|
|
253
221
|
No traces yet. Invoke a flow or wait for traffic.
|
|
@@ -311,14 +279,11 @@ export function TracesPanel() {
|
|
|
311
279
|
<div className="flex flex-col gap-6">
|
|
312
280
|
<div className="flex flex-wrap items-start justify-between gap-3">
|
|
313
281
|
<div>
|
|
314
|
-
<h2 className="text-lg font-semibold">
|
|
315
|
-
{chain.current.flow}
|
|
316
|
-
</h2>
|
|
282
|
+
<h2 className="text-lg font-semibold">{chain.current.flow}</h2>
|
|
317
283
|
<p className="text-xs text-[var(--oke-muted)]">
|
|
318
284
|
{chain.connected.length} span
|
|
319
|
-
{chain.connected.length === 1 ? "" : "s"} · wall{
|
|
320
|
-
{folded.
|
|
321
|
-
{Math.round(folded.displayDurationMs)}ms
|
|
285
|
+
{chain.connected.length === 1 ? "" : "s"} · wall {folded.wallDurationMs}ms ·
|
|
286
|
+
display scale {Math.round(folded.displayDurationMs)}ms
|
|
322
287
|
</p>
|
|
323
288
|
</div>
|
|
324
289
|
<div className="flex flex-wrap gap-2">
|
|
@@ -331,20 +296,14 @@ export function TracesPanel() {
|
|
|
331
296
|
</Link>
|
|
332
297
|
<Button
|
|
333
298
|
type="button"
|
|
334
|
-
variant={
|
|
335
|
-
decision?.mode === "dry-run" ? "external" : "primary"
|
|
336
|
-
}
|
|
299
|
+
variant={decision?.mode === "dry-run" ? "external" : "primary"}
|
|
337
300
|
disabled={replay.isPending}
|
|
338
301
|
title={
|
|
339
|
-
decision?.mode === "dry-run"
|
|
340
|
-
? decision.reason
|
|
341
|
-
: "Replay from the journal"
|
|
302
|
+
decision?.mode === "dry-run" ? decision.reason : "Replay from the journal"
|
|
342
303
|
}
|
|
343
304
|
onClick={() => replay.mutate()}
|
|
344
305
|
>
|
|
345
|
-
{decision?.mode === "dry-run"
|
|
346
|
-
? "Dry-run replay"
|
|
347
|
-
: "Replay"}
|
|
306
|
+
{decision?.mode === "dry-run" ? "Dry-run replay" : "Replay"}
|
|
348
307
|
</Button>
|
|
349
308
|
<Button
|
|
350
309
|
type="button"
|
|
@@ -357,10 +316,7 @@ export function TracesPanel() {
|
|
|
357
316
|
</div>
|
|
358
317
|
|
|
359
318
|
{decision?.mode === "dry-run" ? (
|
|
360
|
-
<p
|
|
361
|
-
role="note"
|
|
362
|
-
className="text-sm text-[var(--oke-external)]"
|
|
363
|
-
>
|
|
319
|
+
<p role="note" className="text-sm text-[var(--oke-external)]">
|
|
364
320
|
{decision.reason}
|
|
365
321
|
</p>
|
|
366
322
|
) : null}
|
|
@@ -373,18 +329,14 @@ export function TracesPanel() {
|
|
|
373
329
|
<button
|
|
374
330
|
type="button"
|
|
375
331
|
className="min-h-8 text-sm text-[var(--oke-muted)]"
|
|
376
|
-
onClick={() =>
|
|
377
|
-
setSearch({ ...search, span: p.id })
|
|
378
|
-
}
|
|
332
|
+
onClick={() => setSearch({ ...search, span: p.id })}
|
|
379
333
|
>
|
|
380
334
|
{p.flow}
|
|
381
335
|
</button>
|
|
382
336
|
</li>
|
|
383
337
|
))}
|
|
384
338
|
<li aria-current="true">
|
|
385
|
-
<span className="text-sm font-medium">
|
|
386
|
-
{chain.current.flow}
|
|
387
|
-
</span>
|
|
339
|
+
<span className="text-sm font-medium">{chain.current.flow}</span>
|
|
388
340
|
{chain.current.errorCode ? (
|
|
389
341
|
<span
|
|
390
342
|
role="status"
|
|
@@ -402,9 +354,7 @@ export function TracesPanel() {
|
|
|
402
354
|
<button
|
|
403
355
|
type="button"
|
|
404
356
|
className="min-h-8 text-sm text-[var(--oke-muted)]"
|
|
405
|
-
onClick={() =>
|
|
406
|
-
setSearch({ ...search, span: c.id })
|
|
407
|
-
}
|
|
357
|
+
onClick={() => setSearch({ ...search, span: c.id })}
|
|
408
358
|
>
|
|
409
359
|
{c.flow}
|
|
410
360
|
{peakSpanTier(c.effects) === "external" ? (
|
|
@@ -417,10 +367,7 @@ export function TracesPanel() {
|
|
|
417
367
|
</div>
|
|
418
368
|
|
|
419
369
|
<div>
|
|
420
|
-
<h3
|
|
421
|
-
id="waterfall-heading"
|
|
422
|
-
className="mb-2 text-sm font-medium"
|
|
423
|
-
>
|
|
370
|
+
<h3 id="waterfall-heading" className="mb-2 text-sm font-medium">
|
|
424
371
|
Waterfall
|
|
425
372
|
</h3>
|
|
426
373
|
<ul
|
|
@@ -441,9 +388,7 @@ export function TracesPanel() {
|
|
|
441
388
|
type="button"
|
|
442
389
|
aria-expanded={seg.expanded}
|
|
443
390
|
className="h-full min-h-10 w-full border border-dashed border-[var(--oke-line)] px-1 font-mono text-[10px] text-[var(--oke-muted)]"
|
|
444
|
-
onClick={() =>
|
|
445
|
-
setSearch(toggleFold(search, seg.id))
|
|
446
|
-
}
|
|
391
|
+
onClick={() => setSearch(toggleFold(search, seg.id))}
|
|
447
392
|
>
|
|
448
393
|
{seg.label}
|
|
449
394
|
</button>
|
|
@@ -459,8 +404,7 @@ export function TracesPanel() {
|
|
|
459
404
|
seg.tier === "external"
|
|
460
405
|
? "bg-[var(--oke-external)] text-black"
|
|
461
406
|
: "bg-[color-mix(in_oklab,var(--oke-accent)_55%,transparent)]",
|
|
462
|
-
seg.failed &&
|
|
463
|
-
"outline outline-2 outline-[var(--oke-danger)]",
|
|
407
|
+
seg.failed && "outline outline-2 outline-[var(--oke-danger)]",
|
|
464
408
|
)}
|
|
465
409
|
style={{
|
|
466
410
|
flex: `${seg.displayMs} 1 0`,
|
|
@@ -478,8 +422,7 @@ export function TracesPanel() {
|
|
|
478
422
|
})}
|
|
479
423
|
</ul>
|
|
480
424
|
<p className="mt-2 text-xs text-[var(--oke-muted)]">
|
|
481
|
-
Critical path at full opacity · dead time folded into
|
|
482
|
-
expandable bars
|
|
425
|
+
Critical path at full opacity · dead time folded into expandable bars
|
|
483
426
|
</p>
|
|
484
427
|
</div>
|
|
485
428
|
</div>
|
|
@@ -507,11 +450,7 @@ function rowToSpan(row: RunsListRow): TraceSpan {
|
|
|
507
450
|
};
|
|
508
451
|
}
|
|
509
452
|
|
|
510
|
-
function MiniWaterfall({
|
|
511
|
-
bars,
|
|
512
|
-
}: {
|
|
513
|
-
readonly bars: ReturnType<typeof miniWaterfall>;
|
|
514
|
-
}) {
|
|
453
|
+
function MiniWaterfall({ bars }: { readonly bars: ReturnType<typeof miniWaterfall> }) {
|
|
515
454
|
return (
|
|
516
455
|
<div
|
|
517
456
|
aria-hidden="true"
|
|
@@ -53,11 +53,8 @@ export function VaultPanel() {
|
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
const secrets = listQuery.data?.secrets ?? [];
|
|
56
|
-
const env = listQuery.data?.env ?? "
|
|
57
|
-
const groups = useMemo(
|
|
58
|
-
() => groupByKind(secrets, search.q ?? ""),
|
|
59
|
-
[secrets, search.q],
|
|
60
|
-
);
|
|
56
|
+
const env = listQuery.data?.env ?? "local";
|
|
57
|
+
const groups = useMemo(() => groupByKind(secrets, search.q ?? ""), [secrets, search.q]);
|
|
61
58
|
const open = secrets.find((s) => s.name === search.name);
|
|
62
59
|
const blast = open ? formatBlastRadius(open.blastRadius) : null;
|
|
63
60
|
const setConfirm = setConfirmation({ production: true });
|
|
@@ -144,9 +141,7 @@ export function VaultPanel() {
|
|
|
144
141
|
<Input
|
|
145
142
|
aria-label="Filter vault"
|
|
146
143
|
value={search.q ?? ""}
|
|
147
|
-
onChange={(e) =>
|
|
148
|
-
setSearch({ ...search, q: e.currentTarget.value || undefined })
|
|
149
|
-
}
|
|
144
|
+
onChange={(e) => setSearch({ ...search, q: e.currentTarget.value || undefined })}
|
|
150
145
|
/>
|
|
151
146
|
</label>
|
|
152
147
|
<Button
|
|
@@ -198,9 +193,7 @@ export function VaultPanel() {
|
|
|
198
193
|
>
|
|
199
194
|
<span className="font-mono">{s.name}</span>
|
|
200
195
|
<span className="truncate text-xs">
|
|
201
|
-
{s.sensitive
|
|
202
|
-
? (s.fingerprint ?? "unset")
|
|
203
|
-
: (s.cleartext ?? "unset")}
|
|
196
|
+
{s.sensitive ? (s.fingerprint ?? "unset") : (s.cleartext ?? "unset")}
|
|
204
197
|
</span>
|
|
205
198
|
{s.blastRadius.count > 0 ? (
|
|
206
199
|
<span role="status" className="text-xs text-[var(--oke-danger)]">
|
|
@@ -227,24 +220,17 @@ export function VaultPanel() {
|
|
|
227
220
|
>
|
|
228
221
|
{!open ? (
|
|
229
222
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
230
|
-
Select a contract to inspect fingerprints, resolution, and
|
|
231
|
-
readers.
|
|
223
|
+
Select a contract to inspect fingerprints, resolution, and readers.
|
|
232
224
|
</p>
|
|
233
225
|
) : (
|
|
234
226
|
<div className="flex max-w-2xl flex-col gap-6">
|
|
235
227
|
<div>
|
|
236
|
-
<h2 className="font-mono text-lg text-[var(--oke-fg)]">
|
|
237
|
-
{open.name}
|
|
238
|
-
</h2>
|
|
228
|
+
<h2 className="font-mono text-lg text-[var(--oke-fg)]">{open.name}</h2>
|
|
239
229
|
{open.description ? (
|
|
240
|
-
<p className="text-sm text-[var(--oke-muted)]">
|
|
241
|
-
{open.description}
|
|
242
|
-
</p>
|
|
230
|
+
<p className="text-sm text-[var(--oke-muted)]">{open.description}</p>
|
|
243
231
|
) : null}
|
|
244
232
|
{open.rotate ? (
|
|
245
|
-
<p className="text-sm text-[var(--oke-muted)]">
|
|
246
|
-
Rotate hint: {open.rotate}
|
|
247
|
-
</p>
|
|
233
|
+
<p className="text-sm text-[var(--oke-muted)]">Rotate hint: {open.rotate}</p>
|
|
248
234
|
) : null}
|
|
249
235
|
</div>
|
|
250
236
|
|
|
@@ -254,10 +240,12 @@ export function VaultPanel() {
|
|
|
254
240
|
<ul className="space-y-1 font-mono text-sm">
|
|
255
241
|
{Object.entries(open.fingerprints).map(([e, fp]) => (
|
|
256
242
|
<li key={e}>
|
|
257
|
-
<span className="text-[var(--oke-muted)]">{e}:</span>{
|
|
258
|
-
{fp}
|
|
243
|
+
<span className="text-[var(--oke-muted)]">{e}:</span> {fp}
|
|
259
244
|
{open.sharedFingerprintEnvs.includes(e) ? (
|
|
260
|
-
<span
|
|
245
|
+
<span
|
|
246
|
+
role="status"
|
|
247
|
+
className="ml-2 text-[var(--oke-warn,var(--oke-muted))]"
|
|
248
|
+
>
|
|
261
249
|
(matches {env} — warning, may be deliberate)
|
|
262
250
|
</span>
|
|
263
251
|
) : null}
|
|
@@ -280,32 +268,22 @@ export function VaultPanel() {
|
|
|
280
268
|
{open.resolution.map((step) => (
|
|
281
269
|
<li
|
|
282
270
|
key={step.source}
|
|
283
|
-
className={
|
|
284
|
-
step.won
|
|
285
|
-
? "text-[var(--oke-fg)]"
|
|
286
|
-
: "text-[var(--oke-muted)]"
|
|
287
|
-
}
|
|
271
|
+
className={step.won ? "text-[var(--oke-fg)]" : "text-[var(--oke-muted)]"}
|
|
288
272
|
>
|
|
289
273
|
<span className="font-mono">{step.source}</span>
|
|
290
|
-
{step.won
|
|
291
|
-
? " — won"
|
|
292
|
-
: step.present
|
|
293
|
-
? " — present (lost)"
|
|
294
|
-
: " — absent"}
|
|
274
|
+
{step.won ? " — won" : step.present ? " — present (lost)" : " — absent"}
|
|
295
275
|
</li>
|
|
296
276
|
))}
|
|
297
277
|
</ol>
|
|
298
278
|
<p className="mt-2 text-sm" role="status">
|
|
299
|
-
Winner:{
|
|
300
|
-
<span className="font-mono">{open.winner ?? "none"}</span>
|
|
279
|
+
Winner: <span className="font-mono">{open.winner ?? "none"}</span>
|
|
301
280
|
</p>
|
|
302
281
|
</section>
|
|
303
282
|
|
|
304
283
|
<section aria-label="Readers">
|
|
305
284
|
<h3 className="mb-2 text-sm font-medium">Readers</h3>
|
|
306
285
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
307
|
-
Flows that declare
|
|
308
|
-
<code className="font-mono">fx.vault({open.name})</code>
|
|
286
|
+
Flows that declare <code className="font-mono">fx.vault({open.name})</code>
|
|
309
287
|
</p>
|
|
310
288
|
<ul className="mt-1 list-disc pl-5 font-mono text-sm">
|
|
311
289
|
{open.readers.length === 0 ? (
|
|
@@ -317,21 +295,14 @@ export function VaultPanel() {
|
|
|
317
295
|
</section>
|
|
318
296
|
|
|
319
297
|
<section aria-label="Rotation blast radius">
|
|
320
|
-
<h3 className="mb-2 text-sm font-medium">
|
|
321
|
-
Rotation blast radius
|
|
322
|
-
</h3>
|
|
298
|
+
<h3 className="mb-2 text-sm font-medium">Rotation blast radius</h3>
|
|
323
299
|
{blast ? (
|
|
324
300
|
<>
|
|
325
|
-
<p
|
|
326
|
-
className="text-sm"
|
|
327
|
-
role={blast.warn ? "alert" : "status"}
|
|
328
|
-
>
|
|
301
|
+
<p className="text-sm" role={blast.warn ? "alert" : "status"}>
|
|
329
302
|
{blast.summary}
|
|
330
303
|
</p>
|
|
331
304
|
{blast.detail ? (
|
|
332
|
-
<p className="text-sm text-[var(--oke-muted)]">
|
|
333
|
-
{blast.detail}
|
|
334
|
-
</p>
|
|
305
|
+
<p className="text-sm text-[var(--oke-muted)]">{blast.detail}</p>
|
|
335
306
|
) : null}
|
|
336
307
|
{open.blastRadius.runIds.length > 0 ? (
|
|
337
308
|
<p className="mt-1 font-mono text-xs text-[var(--oke-muted)]">
|
|
@@ -354,8 +325,7 @@ export function VaultPanel() {
|
|
|
354
325
|
<section aria-label="Set or rotate" className="space-y-3">
|
|
355
326
|
<h3 className="text-sm font-medium">Set / rotate</h3>
|
|
356
327
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
357
|
-
Write-only. Values are never revealed after submit. No
|
|
358
|
-
preview.
|
|
328
|
+
Write-only. Values are never revealed after submit. No preview.
|
|
359
329
|
</p>
|
|
360
330
|
<div className="flex gap-2">
|
|
361
331
|
<Button
|
|
@@ -422,8 +392,7 @@ export function VaultPanel() {
|
|
|
422
392
|
type="button"
|
|
423
393
|
variant={action === "rotate" ? "danger" : "primary"}
|
|
424
394
|
disabled={
|
|
425
|
-
!value ||
|
|
426
|
-
(action === "set" ? setMut.isPending : rotateMut.isPending)
|
|
395
|
+
!value || (action === "set" ? setMut.isPending : rotateMut.isPending)
|
|
427
396
|
}
|
|
428
397
|
onClick={() => {
|
|
429
398
|
if (action === "set") setMut.mutate();
|
|
@@ -76,13 +76,11 @@ export function SetupWizard() {
|
|
|
76
76
|
<section className="mx-auto flex max-w-md flex-col gap-6 px-6 py-16">
|
|
77
77
|
<header className="flex flex-col gap-2">
|
|
78
78
|
<OkeLogo className="h-7 w-auto text-[var(--oke-fg)]" />
|
|
79
|
-
<p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">
|
|
80
|
-
First admin
|
|
81
|
-
</p>
|
|
79
|
+
<p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">First admin</p>
|
|
82
80
|
<h1 className="text-3xl font-semibold tracking-tight">Console</h1>
|
|
83
81
|
<p className="text-[var(--oke-muted)]">
|
|
84
|
-
Enter the claim code printed once to the boot log. This wizard closes
|
|
85
|
-
|
|
82
|
+
Enter the claim code printed once to the boot log. This wizard closes permanently after
|
|
83
|
+
the first operator.
|
|
86
84
|
</p>
|
|
87
85
|
</header>
|
|
88
86
|
<form className="flex flex-col gap-4" onSubmit={onSubmit} autoComplete="off">
|
|
@@ -33,8 +33,7 @@ body {
|
|
|
33
33
|
font-family: var(--oke-font);
|
|
34
34
|
background:
|
|
35
35
|
radial-gradient(1200px 600px at 10% -10%, #1a2433 0%, transparent 55%),
|
|
36
|
-
radial-gradient(900px 500px at 100% 0%, #13201a 0%, transparent 50%),
|
|
37
|
-
var(--oke-bg);
|
|
36
|
+
radial-gradient(900px 500px at 100% 0%, #13201a 0%, transparent 50%), var(--oke-bg);
|
|
38
37
|
color: var(--oke-fg);
|
|
39
38
|
font-variant-numeric: tabular-nums;
|
|
40
39
|
}
|