okengine 0.2.5 → 0.2.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +24 -23
- package/README.md +52 -346
- package/docs/spec/console.md +165 -142
- package/docs/spec/example.md +490 -312
- package/docs/spec/four-applications.md +495 -314
- package/docs/spec/unified-theory.md +184 -175
- package/package.json +46 -38
- package/spec/manifest.v1.schema.json +40 -9
- package/src/auth/api-keys.ts +2 -5
- package/src/auth/attenuation.ts +2 -6
- package/src/auth/auth.test.ts +53 -31
- package/src/auth/invoke-as.ts +1 -3
- package/src/auth/operator.ts +8 -26
- package/src/auth/planes.ts +2 -7
- package/src/auth/plugin.ts +4 -7
- package/src/auth/roles.ts +1 -5
- package/src/auth/sessions.ts +10 -39
- package/src/cli/args.ts +1 -5
- package/src/cli/ask-dev-mode.ts +40 -0
- package/src/cli/build.ts +1 -2
- package/src/cli/client-add.test.ts +8 -15
- package/src/cli/client-add.ts +5 -14
- package/src/cli/completion.test.ts +1 -5
- package/src/cli/completion.ts +4 -17
- package/src/cli/db-auto-push.test.ts +64 -0
- package/src/cli/db-auto-push.ts +72 -0
- package/src/cli/db.test.ts +189 -0
- package/src/cli/db.ts +386 -0
- package/src/cli/dev-app-runner.ts +2 -8
- package/src/cli/dev-db-push.test.ts +163 -0
- package/src/cli/dev-mode.test.ts +45 -0
- package/src/cli/dev-mode.ts +78 -0
- package/src/cli/dev.test.ts +148 -21
- package/src/cli/dev.ts +208 -134
- package/src/cli/doc-drift.test.ts +3 -2
- package/src/cli/doc-drift.ts +21 -50
- package/src/cli/doc-staleness.test.ts +69 -0
- package/src/cli/docker-cli.test.ts +7 -8
- package/src/cli/docker.ts +1 -3
- package/src/cli/doctor-diff-examples.ts +1 -3
- package/src/cli/doctor-diff.test.ts +1 -5
- package/src/cli/doctor-diff.ts +17 -46
- package/src/cli/doctor-pii.ts +2 -7
- package/src/cli/doctor.test.ts +26 -4
- package/src/cli/doctor.ts +35 -11
- package/src/cli/eval.ts +4 -14
- package/src/cli/gates-list.ts +1 -4
- package/src/cli/hero-meta.test.ts +17 -19
- package/src/cli/hero-meta.ts +20 -30
- package/src/cli/images.ts +3 -8
- package/src/cli/index.ts +11 -2
- package/src/cli/load-config.images.test.ts +14 -14
- package/src/cli/load-config.ts +41 -47
- package/src/cli/mcp-from-console.ts +1 -4
- package/src/cli/mode.ts +45 -0
- package/src/cli/ports.test.ts +4 -13
- package/src/cli/ports.ts +1 -3
- package/src/cli/privacy-erase.ts +1 -3
- package/src/cli/registry.ts +75 -25
- package/src/cli/schema.ts +3 -10
- package/src/cli/stack.ts +2 -7
- package/src/cli/start.ts +4 -15
- package/src/cli/upgrade.ts +1 -4
- package/src/client/budget-entry.ts +1 -6
- package/src/client/create.test.ts +6 -12
- package/src/client/create.ts +2 -8
- package/src/client/errors.ts +1 -4
- package/src/client/index.ts +1 -6
- package/src/client/notes-contract.test.ts +4 -13
- package/src/client/transport.ts +9 -30
- package/src/client/types.ts +8 -29
- package/src/compiler/aot.test.ts +2 -9
- package/src/compiler/aot.ts +1 -4
- package/src/compiler/differential.test.ts +3 -11
- package/src/compiler/dynamic.ts +1 -4
- package/src/compiler/effects-infer.ts +8 -34
- package/src/compiler/emit.ts +1 -3
- package/src/compiler/extract.test.ts +96 -30
- package/src/compiler/extract.ts +362 -156
- package/src/compiler/fixtures/skyport/oke.config.ts +1 -1
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +7 -3
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +1 -3
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +4 -1
- package/src/compiler/fixtures/skyport.expected.json +24 -83
- package/src/compiler/fixtures/triggers/five-triggers.ts +1 -2
- package/src/compiler/http-parse.ts +2 -9
- package/src/compiler/index.ts +1 -5
- package/src/compiler/response.ts +4 -7
- package/src/compiler/sucrose.ts +11 -31
- package/src/config/define-config.test.ts +57 -34
- package/src/config/index.ts +181 -37
- package/src/config/resolve-driver.test.ts +28 -17
- package/src/console/budget.test.ts +1 -4
- package/src/console/index.ts +1 -4
- package/src/console/server/access.test.ts +15 -43
- package/src/console/server/access.ts +19 -49
- package/src/console/server/ai.test.ts +3 -11
- package/src/console/server/ai.ts +23 -46
- package/src/console/server/app.ts +14 -45
- package/src/console/server/auth-rate.test.ts +4 -12
- package/src/console/server/bind.ts +1 -5
- package/src/console/server/channels.test.ts +2 -6
- package/src/console/server/channels.ts +10 -35
- package/src/console/server/claim.ts +2 -8
- package/src/console/server/clock.test.ts +2 -6
- package/src/console/server/clock.ts +8 -26
- package/src/console/server/console.test.ts +1 -3
- package/src/console/server/diff.test.ts +5 -17
- package/src/console/server/diff.ts +10 -31
- package/src/console/server/dry-run.audit.test.ts +2 -8
- package/src/console/server/flows.ts +64 -233
- package/src/console/server/gates.test.ts +14 -50
- package/src/console/server/gates.ts +13 -48
- package/src/console/server/index.ts +2 -9
- package/src/console/server/live.ts +3 -12
- package/src/console/server/operator-db.test.ts +4 -15
- package/src/console/server/operator-db.ts +13 -32
- package/src/console/server/plugin.ts +50 -53
- package/src/console/server/plugins.test.ts +2 -6
- package/src/console/server/plugins.ts +17 -56
- package/src/console/server/runs-pii.ts +2 -7
- package/src/console/server/security.gate.test.ts +18 -40
- package/src/console/server/serve.ts +10 -25
- package/src/console/server/signals.test.ts +1 -3
- package/src/console/server/signals.ts +17 -40
- package/src/console/server/state.ts +21 -59
- package/src/console/server/store.test.ts +20 -22
- package/src/console/server/store.ts +31 -76
- package/src/console/server/vault.test.ts +12 -29
- package/src/console/server/vault.ts +23 -60
- package/src/console/ui/access/AccessA11yView.tsx +6 -21
- package/src/console/ui/access/a11y.test.tsx +3 -12
- package/src/console/ui/access/acknowledgement.test.ts +1 -4
- package/src/console/ui/access/acknowledgement.ts +1 -3
- package/src/console/ui/access/blast-radius.ts +1 -3
- package/src/console/ui/access/confirmation.test.ts +1 -5
- package/src/console/ui/access/confirmation.ts +1 -4
- package/src/console/ui/access/fixture.ts +1 -5
- package/src/console/ui/access/grantable.test.ts +1 -3
- package/src/console/ui/access/grantable.ts +2 -7
- package/src/console/ui/access/index.ts +2 -9
- package/src/console/ui/access/provenance.test.ts +1 -3
- package/src/console/ui/access/provenance.ts +2 -6
- package/src/console/ui/access/search.test.ts +1 -5
- package/src/console/ui/access/search.ts +2 -6
- package/src/console/ui/ai/AiA11yView.tsx +6 -17
- package/src/console/ui/ai/a11y.test.tsx +2 -5
- package/src/console/ui/ai/fixture.ts +2 -7
- package/src/console/ui/ai/format.ts +1 -3
- package/src/console/ui/ai/group.test.ts +1 -3
- package/src/console/ui/ai/group.ts +4 -12
- package/src/console/ui/ai/index.ts +2 -9
- package/src/console/ui/ai/promotion.test.ts +2 -7
- package/src/console/ui/ai/promotion.ts +4 -13
- package/src/console/ui/ai/search.test.ts +2 -11
- package/src/console/ui/ai/search.ts +3 -13
- package/src/console/ui/ai/types.ts +1 -8
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +8 -29
- package/src/console/ui/architecture/a11y.test.tsx +1 -2
- package/src/console/ui/architecture/declared.ts +1 -5
- package/src/console/ui/architecture/index.ts +7 -35
- package/src/console/ui/architecture/layout.ts +1 -3
- package/src/console/ui/architecture/pathologies.ts +10 -19
- package/src/console/ui/architecture/search.ts +6 -15
- package/src/console/ui/architecture/traffic.ts +4 -14
- package/src/console/ui/architecture/types.ts +2 -10
- package/src/console/ui/architecture/view.test.ts +7 -19
- package/src/console/ui/architecture/view.ts +9 -36
- package/src/console/ui/channels/ChannelsA11yView.tsx +4 -13
- package/src/console/ui/channels/a11y.test.tsx +1 -2
- package/src/console/ui/channels/confirmation.test.ts +1 -4
- package/src/console/ui/channels/confirmation.ts +1 -4
- package/src/console/ui/channels/findings.ts +1 -5
- package/src/console/ui/channels/index.ts +2 -8
- package/src/console/ui/channels/locale.test.ts +1 -3
- package/src/console/ui/channels/locale.ts +2 -8
- package/src/console/ui/channels/search.ts +4 -13
- package/src/console/ui/channels/taxonomy.ts +1 -3
- package/src/console/ui/clock/ClockA11yView.tsx +9 -26
- package/src/console/ui/clock/a11y.test.tsx +2 -5
- package/src/console/ui/clock/confirmation.test.ts +1 -3
- package/src/console/ui/clock/confirmation.ts +1 -4
- package/src/console/ui/clock/findings.ts +1 -4
- package/src/console/ui/clock/health.ts +2 -7
- package/src/console/ui/clock/index.ts +2 -10
- package/src/console/ui/clock/search.test.ts +1 -3
- package/src/console/ui/clock/search.ts +2 -6
- package/src/console/ui/clock/timeline.test.ts +1 -3
- package/src/console/ui/clock/waiting-on.test.ts +1 -5
- package/src/console/ui/clock/waiting-on.ts +2 -7
- package/src/console/ui/diff/DiffA11yView.tsx +8 -17
- package/src/console/ui/diff/a11y.test.tsx +2 -5
- package/src/console/ui/diff/group.test.ts +3 -13
- package/src/console/ui/diff/group.ts +2 -8
- package/src/console/ui/diff/index.ts +2 -8
- package/src/console/ui/diff/search.test.ts +1 -5
- package/src/console/ui/diff/search.ts +4 -16
- package/src/console/ui/diff/summary.ts +1 -2
- package/src/console/ui/dist/assets/{index-Dy4jht9P.js → index-BWo8R7NR.js} +2 -2
- package/src/console/ui/dist/assets/{panel-access-Dd37LU2c.js → panel-access-C0J2D-a2.js} +1 -1
- package/src/console/ui/dist/assets/{panel-ai-CC7LR6-J.js → panel-ai-D_m6WQI8.js} +1 -1
- package/src/console/ui/dist/assets/{panel-architecture-B5b3iKCz.js → panel-architecture-CKnXFyUx.js} +1 -1
- package/src/console/ui/dist/assets/{panel-channels-CeNjTKXp.js → panel-channels-BOmQ-onL.js} +1 -1
- package/src/console/ui/dist/assets/{panel-clock-DgFTLoHV.js → panel-clock-giAq0Ccv.js} +1 -1
- package/src/console/ui/dist/assets/{panel-diff-DxehccqB.js → panel-diff-cdonmH8c.js} +1 -1
- package/src/console/ui/dist/assets/{panel-flows-BtrVn-Eg.js → panel-flows-DlCU5zjA.js} +2 -2
- package/src/console/ui/dist/assets/{panel-gates-Z9MKRGdH.js → panel-gates-XclZxWD5.js} +1 -1
- package/src/console/ui/dist/assets/{panel-overview-Dt_AeXgd.js → panel-overview-BznEOTnb.js} +1 -1
- package/src/console/ui/dist/assets/{panel-plugins-DWd0TowH.js → panel-plugins-CcGM1g64.js} +1 -1
- package/src/console/ui/dist/assets/{panel-runs-DGstFHeq.js → panel-runs-CGWNHLR4.js} +1 -1
- package/src/console/ui/dist/assets/{panel-signals-DzEa2Fnt.js → panel-signals-CNywkdak.js} +1 -1
- package/src/console/ui/dist/assets/{panel-store-BJkbNgxx.js → panel-store-KmTbFHMH.js} +1 -1
- package/src/console/ui/dist/assets/{panel-traces-BaRVO3gM.js → panel-traces-DBLx2ilD.js} +1 -1
- package/src/console/ui/dist/assets/panel-vault-CEnFc0dk.js +1 -0
- package/src/console/ui/dist/index.html +1 -1
- package/src/console/ui/flows/FlowsA11yView.tsx +7 -22
- package/src/console/ui/flows/a11y.test.tsx +2 -8
- package/src/console/ui/flows/buffer.test.ts +3 -11
- package/src/console/ui/flows/buffer.ts +4 -11
- package/src/console/ui/flows/confirmation.ts +1 -3
- package/src/console/ui/flows/contract.test.ts +3 -7
- package/src/console/ui/flows/contract.ts +12 -36
- package/src/console/ui/flows/graph.test.ts +3 -11
- package/src/console/ui/flows/graph.ts +5 -15
- package/src/console/ui/flows/index.ts +1 -6
- package/src/console/ui/flows/save-as-test.ts +1 -3
- package/src/console/ui/flows/search.ts +8 -25
- package/src/console/ui/flows/tiers.ts +2 -9
- package/src/console/ui/gates/GatesA11yView.tsx +4 -13
- package/src/console/ui/gates/a11y.test.tsx +2 -5
- package/src/console/ui/gates/audit.ts +1 -3
- package/src/console/ui/gates/denial.test.ts +1 -3
- package/src/console/ui/gates/denial.ts +4 -12
- package/src/console/ui/gates/findings.ts +1 -3
- package/src/console/ui/gates/group.test.ts +3 -3
- package/src/console/ui/gates/group.ts +3 -11
- package/src/console/ui/gates/index.ts +2 -10
- package/src/console/ui/gates/search.ts +3 -10
- package/src/console/ui/overview/OverviewA11yView.tsx +9 -27
- package/src/console/ui/overview/a11y.test.tsx +1 -2
- package/src/console/ui/overview/busiest.ts +1 -3
- package/src/console/ui/overview/compose.ts +1 -13
- package/src/console/ui/overview/cost.ts +34 -38
- package/src/console/ui/overview/fixture.ts +21 -26
- package/src/console/ui/overview/golden.ts +4 -14
- package/src/console/ui/overview/index.ts +2 -9
- package/src/console/ui/overview/rank.test.ts +3 -10
- package/src/console/ui/overview/rank.ts +2 -7
- package/src/console/ui/overview/slo.test.ts +5 -9
- package/src/console/ui/overview/slo.ts +6 -23
- package/src/console/ui/overview/verdict.ts +3 -10
- package/src/console/ui/plugins/PluginsA11yView.tsx +8 -18
- package/src/console/ui/plugins/a11y.test.tsx +1 -2
- package/src/console/ui/plugins/fixture.ts +2 -4
- package/src/console/ui/plugins/group.test.ts +1 -3
- package/src/console/ui/plugins/group.ts +1 -6
- package/src/console/ui/plugins/index.ts +3 -13
- package/src/console/ui/plugins/search.ts +7 -19
- package/src/console/ui/runs/RunsA11yView.tsx +5 -20
- package/src/console/ui/runs/a11y.test.tsx +2 -5
- package/src/console/ui/runs/explain.ts +2 -6
- package/src/console/ui/runs/group.ts +3 -12
- package/src/console/ui/runs/histogram.test.ts +2 -11
- package/src/console/ui/runs/histogram.ts +1 -4
- package/src/console/ui/runs/index.ts +4 -18
- package/src/console/ui/runs/project.ts +2 -6
- package/src/console/ui/runs/query.test.ts +1 -3
- package/src/console/ui/runs/query.ts +12 -35
- package/src/console/ui/runs/search.ts +5 -19
- package/src/console/ui/runs/trace-link.test.ts +2 -6
- package/src/console/ui/runs/trace-link.ts +4 -16
- package/src/console/ui/runs/types.ts +1 -3
- package/src/console/ui/shell/App.tsx +2 -10
- package/src/console/ui/shell/client.ts +22 -115
- package/src/console/ui/shell/components/ui.tsx +1 -4
- package/src/console/ui/shell/layout/Shell.tsx +2 -4
- package/src/console/ui/shell/main.tsx +31 -96
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +34 -98
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +35 -106
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +18 -66
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +20 -57
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +22 -54
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +20 -61
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +6 -23
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +13 -28
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +9 -29
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +24 -80
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +20 -58
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +16 -41
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +31 -99
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +38 -101
- package/src/console/ui/shell/panels/store/StorePanel.tsx +27 -66
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +28 -89
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +22 -53
- package/src/console/ui/shell/setup/Wizard.tsx +3 -5
- package/src/console/ui/shell/styles.css +1 -2
- package/src/console/ui/signals/SignalsA11yView.tsx +9 -33
- package/src/console/ui/signals/a11y.test.tsx +2 -5
- package/src/console/ui/signals/confirmation.test.ts +1 -5
- package/src/console/ui/signals/confirmation.ts +2 -6
- package/src/console/ui/signals/dry-run.ts +1 -3
- package/src/console/ui/signals/durable.ts +1 -3
- package/src/console/ui/signals/findings.ts +1 -3
- package/src/console/ui/signals/group.test.ts +2 -8
- package/src/console/ui/signals/group.ts +2 -10
- package/src/console/ui/signals/index.ts +1 -4
- package/src/console/ui/signals/monitor.ts +2 -7
- package/src/console/ui/signals/schema-form.test.ts +3 -14
- package/src/console/ui/signals/schema-form.ts +1 -4
- package/src/console/ui/signals/search.ts +4 -13
- package/src/console/ui/store/StoreA11yView.tsx +3 -9
- package/src/console/ui/store/a11y.test.tsx +2 -5
- package/src/console/ui/store/confirmation.test.ts +1 -3
- package/src/console/ui/store/confirmation.ts +1 -4
- package/src/console/ui/store/dry-run.ts +2 -5
- package/src/console/ui/store/fixture.ts +1 -2
- package/src/console/ui/store/group.test.ts +1 -6
- package/src/console/ui/store/group.ts +1 -4
- package/src/console/ui/store/index.ts +1 -5
- package/src/console/ui/store/search.ts +2 -6
- package/src/console/ui/store/will-not-fire.ts +1 -2
- package/src/console/ui/traces/TracesA11yView.tsx +10 -29
- package/src/console/ui/traces/a11y.test.tsx +1 -2
- package/src/console/ui/traces/chain.test.ts +5 -19
- package/src/console/ui/traces/chain.ts +1 -3
- package/src/console/ui/traces/critical-path.test.ts +1 -3
- package/src/console/ui/traces/critical-path.ts +2 -6
- package/src/console/ui/traces/filter.test.ts +2 -6
- package/src/console/ui/traces/filter.ts +5 -13
- package/src/console/ui/traces/fold.test.ts +4 -12
- package/src/console/ui/traces/fold.ts +1 -3
- package/src/console/ui/traces/mini.ts +1 -3
- package/src/console/ui/traces/replay.test.ts +1 -3
- package/src/console/ui/traces/replay.ts +1 -3
- package/src/console/ui/traces/sampling.ts +1 -4
- package/src/console/ui/traces/search.ts +4 -17
- package/src/console/ui/traces/tier.ts +1 -3
- package/src/console/ui/vault/VaultA11yView.tsx +5 -17
- package/src/console/ui/vault/a11y.test.tsx +1 -2
- package/src/console/ui/vault/blast-radius.ts +1 -3
- package/src/console/ui/vault/confirmation.test.ts +1 -5
- package/src/console/ui/vault/confirmation.ts +1 -4
- package/src/console/ui/vault/dormant.test.ts +1 -4
- package/src/console/ui/vault/export-safe.test.ts +1 -5
- package/src/console/ui/vault/export-safe.ts +1 -4
- package/src/console/ui/vault/fixture.ts +3 -3
- package/src/console/ui/vault/group.ts +1 -2
- package/src/console/ui/vault/index.ts +2 -10
- package/src/console/ui/vault/search.ts +2 -6
- package/src/console/ui/vault/types.ts +1 -1
- package/src/console/xss.gate.test.ts +1 -3
- package/src/docker/compose.ts +112 -20
- package/src/docker/derive.ts +5 -19
- package/src/docker/docker.test.ts +15 -15
- package/src/docker/dockerfile.integration.test.ts +12 -21
- package/src/docker/helpers.ts +5 -4
- package/src/docker/index.ts +4 -11
- package/src/docker/pin.ts +1 -9
- package/src/docker/recipes/index.ts +5 -6
- package/src/docker/recipes/mailpit.ts +22 -0
- package/src/docker/recipes/postgres.ts +17 -6
- package/src/docker/recipes/redis.ts +6 -1
- package/src/docker/recipes/rustfs.ts +33 -0
- package/src/docker/stack-id.test.ts +33 -0
- package/src/docker/stack-id.ts +25 -13
- package/src/docker/stack.integration.test.ts +6 -21
- package/src/docker/types.ts +13 -4
- package/src/drivers/ai-anthropic.ts +5 -14
- package/src/drivers/ai-mock.ts +2 -5
- package/src/drivers/ai-openai-compatible.ts +4 -10
- package/src/drivers/ai-providers.test.ts +6 -13
- package/src/drivers/bun-native-completeness.test.ts +6 -15
- package/src/drivers/channel-console.ts +6 -7
- package/src/drivers/channel-fcm.ts +20 -30
- package/src/drivers/channel-resend.ts +1 -3
- package/src/drivers/channel-smtp.ts +2 -6
- package/src/drivers/channel-types.ts +2 -12
- package/src/drivers/channel-unifonic.ts +2 -6
- package/src/drivers/channel-wa-cloud.ts +2 -6
- package/src/drivers/channel-webpush.ts +21 -60
- package/src/drivers/conformance.test.ts +2 -10
- package/src/drivers/conformance.ts +8 -21
- package/src/drivers/fs.ts +2 -8
- package/src/drivers/index.ts +12 -56
- package/src/drivers/memory.ts +14 -41
- package/src/drivers/pgvector.ts +7 -11
- package/src/drivers/postgres.ts +7 -13
- package/src/drivers/redis.ts +13 -37
- package/src/drivers/s3.ts +5 -17
- package/src/drivers/signal-engine.ts +12 -49
- package/src/drivers/signal-memory.ts +2 -8
- package/src/drivers/signal-nats.ts +4 -9
- package/src/drivers/signal-postgres.ts +62 -129
- package/src/drivers/signal-redis.ts +7 -21
- package/src/drivers/signal-types.ts +1 -4
- package/src/drivers/sqlite.ts +3 -12
- package/src/drivers/types.ts +4 -23
- package/src/drivers/vault-env.ts +2 -6
- package/src/drivers/vault-infisical.ts +1 -5
- package/src/drivers/vault-managed.ts +1 -5
- package/src/drivers/vault-memory.ts +1 -5
- package/src/drivers/vault-openbao.ts +1 -5
- package/src/drivers/vault-sops.ts +10 -35
- package/src/drivers/vault-types.ts +1 -7
- package/src/elements/ai/declare.ts +4 -14
- package/src/elements/ai/eval.ts +2 -6
- package/src/elements/ai/pii.ts +1 -3
- package/src/elements/ai/runtime.ts +12 -50
- package/src/elements/ai/schema.ts +4 -15
- package/src/elements/ai.test.ts +13 -24
- package/src/elements/ai.ts +1 -5
- package/src/elements/channel/consent.ts +3 -12
- package/src/elements/channel/costs.ts +4 -15
- package/src/elements/channel/declare.ts +1 -4
- package/src/elements/channel/email-auth.ts +1 -4
- package/src/elements/channel/locale.ts +2 -10
- package/src/elements/channel/mask.ts +1 -3
- package/src/elements/channel/mime.ts +2 -12
- package/src/elements/channel/outcomes.test.ts +1 -5
- package/src/elements/channel/outcomes.ts +5 -15
- package/src/elements/channel/receipts.ts +2 -7
- package/src/elements/channel/runtime.ts +28 -74
- package/src/elements/channel/suppression.ts +8 -14
- package/src/elements/channel.test.ts +8 -31
- package/src/elements/channel.ts +3 -14
- package/src/elements/clock/actions.ts +6 -18
- package/src/elements/clock/declare.ts +1 -3
- package/src/elements/clock/dst.ts +1 -5
- package/src/elements/clock/durable.ts +4 -16
- package/src/elements/clock/health.ts +2 -7
- package/src/elements/clock/leader.ts +2 -9
- package/src/elements/clock/reconcile.ts +4 -15
- package/src/elements/clock/runtime.ts +2 -5
- package/src/elements/clock/schedule.ts +4 -20
- package/src/elements/clock.test.ts +2 -7
- package/src/elements/clock.ts +5 -23
- package/src/elements/gate/permissions.ts +1 -4
- package/src/elements/gate/runtime.ts +7 -28
- package/src/elements/gate.ts +1 -5
- package/src/elements/index.ts +9 -7
- package/src/elements/signal/declare.ts +2 -7
- package/src/elements/signal/reconcile.test.ts +1 -4
- package/src/elements/signal/runtime.ts +1 -3
- package/src/elements/signal.test.ts +3 -15
- package/src/elements/signal.ts +2 -8
- package/src/elements/store/cache.test.ts +46 -0
- package/src/elements/store/cache.ts +3 -11
- package/src/elements/store/classify.ts +5 -22
- package/src/elements/store/declare.ts +8 -17
- package/src/elements/store/domain-ddl.test.ts +86 -0
- package/src/elements/store/emit-drizzle.ts +363 -0
- package/src/elements/store/files-policy.test.ts +1 -5
- package/src/elements/store/files-policy.ts +4 -12
- package/src/elements/store/load-plugin-tables.ts +103 -0
- package/src/elements/store/missing-relation.test.ts +83 -0
- package/src/elements/store/missing-relation.ts +38 -0
- package/src/elements/store/replica.ts +1 -4
- package/src/elements/store/runtime.ts +25 -28
- package/src/elements/store/schema-decl.test.ts +227 -0
- package/src/elements/store/schema-decl.ts +516 -0
- package/src/elements/store/sql-condition.ts +11 -21
- package/src/elements/store/sql-session.test.ts +50 -0
- package/src/elements/store/sql-session.ts +60 -63
- package/src/elements/store/table.ts +35 -19
- package/src/elements/store.test.ts +17 -39
- package/src/elements/store.ts +37 -31
- package/src/elements/vault/chain.ts +34 -0
- package/src/elements/vault/declare.ts +22 -32
- package/src/elements/vault/fingerprint.ts +2 -7
- package/src/elements/vault/redact.ts +2 -6
- package/src/elements/vault/runtime.ts +18 -32
- package/src/elements/vault.test.ts +12 -28
- package/src/elements/vault.ts +8 -12
- package/src/index.ts +5 -2
- package/src/kernel/adopt-routes.ts +15 -29
- package/src/kernel/app.ts +34 -94
- package/src/kernel/auth-resolve.ts +2 -9
- package/src/kernel/boot-bind/ai.ts +1 -4
- package/src/kernel/boot-bind/channel.ts +2 -8
- package/src/kernel/boot-bind/clock.ts +2 -6
- package/src/kernel/boot-bind/gate.ts +2 -8
- package/src/kernel/boot-bind/runs.ts +1 -3
- package/src/kernel/boot-bind/signal.ts +3 -10
- package/src/kernel/boot-bind/store.test.ts +17 -17
- package/src/kernel/boot-bind/store.ts +44 -50
- package/src/kernel/boot-bind/vault.ts +2 -8
- package/src/kernel/boot.test.ts +4 -9
- package/src/kernel/boot.ts +29 -76
- package/src/kernel/budget.test.ts +1 -3
- package/src/kernel/capability.ts +3 -10
- package/src/kernel/dry-run.test.ts +1 -4
- package/src/kernel/dry-run.ts +3 -11
- package/src/kernel/effects.test.ts +1 -5
- package/src/kernel/effects.ts +4 -11
- package/src/kernel/errors.registry.test.ts +2 -8
- package/src/kernel/errors.ts +23 -32
- package/src/kernel/flow.test.ts +12 -25
- package/src/kernel/flow.ts +5 -25
- package/src/kernel/fx.test.ts +15 -44
- package/src/kernel/fx.ts +27 -79
- package/src/kernel/hook-timing.test.ts +3 -6
- package/src/kernel/hook-timing.ts +5 -14
- package/src/kernel/hooks.test.ts +10 -10
- package/src/kernel/hooks.ts +3 -12
- package/src/kernel/index.ts +4 -17
- package/src/kernel/journal.ts +7 -31
- package/src/kernel/on.ts +1 -6
- package/src/kernel/pipeline.test.ts +10 -19
- package/src/kernel/pipeline.ts +5 -17
- package/src/kernel/plug.ts +4 -11
- package/src/kernel/plugin/conflicts.test.ts +13 -25
- package/src/kernel/plugin/decorate.test.ts +8 -13
- package/src/kernel/plugin/scoping.test.ts +4 -11
- package/src/kernel/plugin.ts +48 -24
- package/src/kernel/registry.ts +80 -29
- package/src/kernel/router.test.ts +15 -13
- package/src/kernel/router.ts +9 -29
- package/src/kernel/routing-budget.test.ts +1 -3
- package/src/kernel/run-telemetry.ts +1 -3
- package/src/kernel/triggers.ts +4 -21
- package/src/manifest/diff.test.ts +26 -91
- package/src/manifest/diff.ts +95 -225
- package/src/manifest/index.ts +2 -9
- package/src/manifest/types.ts +29 -5
- package/src/manifest/undeclared.test.ts +4 -12
- package/src/manifest/undeclared.ts +1 -2
- package/src/manifest/validate.test.ts +2 -6
- package/src/manifest/validate.ts +4 -14
- package/src/mcp/authorization.ts +8 -27
- package/src/mcp/confirmation.ts +3 -10
- package/src/mcp/data.ts +2 -6
- package/src/mcp/docs-index.ts +4 -7
- package/src/mcp/docs-mcp.test.ts +3 -12
- package/src/mcp/docs-server.ts +7 -27
- package/src/mcp/docs-tools.ts +2 -6
- package/src/mcp/index.ts +1 -6
- package/src/mcp/injection.gate.test.ts +4 -18
- package/src/mcp/mcp.test.ts +18 -49
- package/src/mcp/protocol.ts +3 -10
- package/src/mcp/server.ts +11 -52
- package/src/mcp/session.ts +4 -14
- package/src/mcp/tools.ts +14 -50
- package/src/plugins/catalogue.test.ts +3 -7
- package/src/plugins/catalogue.ts +1 -3
- package/src/plugins/node-import-scan.ts +2 -5
- package/src/plugins/supply-chain.ts +5 -17
- package/src/release/exports.ts +3 -8
- package/src/release/measure.exports.test.ts +1 -3
- package/src/release/measure.ts +15 -43
- package/src/runs/bench.test.ts +1 -3
- package/src/runs/collect.ts +8 -25
- package/src/runs/drivers/clickhouse.ts +2 -9
- package/src/runs/drivers/files.ts +9 -31
- package/src/runs/drivers/memory.ts +5 -22
- package/src/runs/drivers/postgres.ts +8 -20
- package/src/runs/duckdb.ts +2 -8
- package/src/runs/index.ts +3 -14
- package/src/runs/outlier.ts +3 -10
- package/src/runs/parquet.ts +8 -26
- package/src/runs/privacy.ts +2 -8
- package/src/runs/runs.test.ts +3 -9
- package/src/runs/runtime.ts +7 -32
- package/src/runs/shred.ts +10 -29
- package/src/runs/types.ts +1 -4
- package/src/runtime/bun.ts +4 -15
- package/src/runtime/cold-start.bench.ts +1 -3
- package/src/runtime/dev-request-log.test.ts +1 -4
- package/src/runtime/dev-request-log.ts +1 -4
- package/src/runtime/index.ts +1 -6
- package/src/runtime/primitives.ts +5 -4
- package/src/runtime/security.ts +3 -13
- package/src/runtime/serve.test.ts +4 -7
- package/src/runtime/types.ts +1 -4
- package/src/runtime/web-standard.ts +3 -15
- package/src/term.test.ts +4 -6
- package/src/term.ts +49 -98
- package/src/test/create-test-app.test.ts +4 -14
- package/src/test/create-test-app.ts +13 -31
- package/src/test/provisions.integration.test.ts +3 -11
- package/src/upgrade/codemods.test.ts +25 -6
- package/src/upgrade/codemods.ts +116 -3
- package/src/validation/standard-schema.test.ts +2 -5
- package/src/validation/standard-schema.ts +13 -33
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +0 -1
|
@@ -76,10 +76,7 @@ export function GatesPanel() {
|
|
|
76
76
|
|
|
77
77
|
const selectedPrincipal = decodePrincipal(search.principal);
|
|
78
78
|
const openPrincipalRow = selectedPrincipal
|
|
79
|
-
? principals.find(
|
|
80
|
-
(p) =>
|
|
81
|
-
p.kind === selectedPrincipal.kind && p.id === selectedPrincipal.id,
|
|
82
|
-
)
|
|
79
|
+
? principals.find((p) => p.kind === selectedPrincipal.kind && p.id === selectedPrincipal.id)
|
|
83
80
|
: undefined;
|
|
84
81
|
const openFlowRow = flows.find((f) => f.flowId === search.flow);
|
|
85
82
|
|
|
@@ -132,11 +129,7 @@ export function GatesPanel() {
|
|
|
132
129
|
What can this principal do · what guards this flow
|
|
133
130
|
</p>
|
|
134
131
|
</div>
|
|
135
|
-
<div
|
|
136
|
-
role="group"
|
|
137
|
-
aria-label="Inquiry direction"
|
|
138
|
-
className="flex gap-1"
|
|
139
|
-
>
|
|
132
|
+
<div role="group" aria-label="Inquiry direction" className="flex gap-1">
|
|
140
133
|
<Button
|
|
141
134
|
type="button"
|
|
142
135
|
variant={from === "principal" ? "primary" : "ghost"}
|
|
@@ -171,9 +164,7 @@ export function GatesPanel() {
|
|
|
171
164
|
<Input
|
|
172
165
|
aria-label="Filter gates"
|
|
173
166
|
value={search.q ?? ""}
|
|
174
|
-
onChange={(e) =>
|
|
175
|
-
setSearch({ ...search, q: e.currentTarget.value || undefined })
|
|
176
|
-
}
|
|
167
|
+
onChange={(e) => setSearch({ ...search, q: e.currentTarget.value || undefined })}
|
|
177
168
|
/>
|
|
178
169
|
</label>
|
|
179
170
|
</header>
|
|
@@ -199,9 +190,7 @@ export function GatesPanel() {
|
|
|
199
190
|
className="border-b border-[var(--oke-line)] bg-[var(--oke-danger)]/10 px-4 py-2"
|
|
200
191
|
role="alert"
|
|
201
192
|
>
|
|
202
|
-
<h2 className="text-sm font-medium text-[var(--oke-danger)]">
|
|
203
|
-
Two-plane violations
|
|
204
|
-
</h2>
|
|
193
|
+
<h2 className="text-sm font-medium text-[var(--oke-danger)]">Two-plane violations</h2>
|
|
205
194
|
<ul className="mt-1 text-sm text-[var(--oke-fg)]">
|
|
206
195
|
{violations.map((v) => (
|
|
207
196
|
<li key={v.operatorId}>{formatViolation(v)}</li>
|
|
@@ -215,9 +204,7 @@ export function GatesPanel() {
|
|
|
215
204
|
aria-label={from === "principal" ? "Principal list" : "Flow list"}
|
|
216
205
|
className="w-80 shrink-0 overflow-y-auto border-r border-[var(--oke-line)]"
|
|
217
206
|
>
|
|
218
|
-
<h2 className="sr-only">
|
|
219
|
-
{from === "principal" ? "Principals" : "Flows"}
|
|
220
|
-
</h2>
|
|
207
|
+
<h2 className="sr-only">{from === "principal" ? "Principals" : "Flows"}</h2>
|
|
221
208
|
{listQuery.isLoading ? (
|
|
222
209
|
<p className="p-4 text-sm text-[var(--oke-muted)]">Loading…</p>
|
|
223
210
|
) : null}
|
|
@@ -229,9 +216,7 @@ export function GatesPanel() {
|
|
|
229
216
|
<ul>
|
|
230
217
|
{group.items.map((item) => {
|
|
231
218
|
const pressed =
|
|
232
|
-
from === "flow"
|
|
233
|
-
? item.id === search.flow
|
|
234
|
-
: item.id === search.principal;
|
|
219
|
+
from === "flow" ? item.id === search.flow : item.id === search.principal;
|
|
235
220
|
return (
|
|
236
221
|
<li key={item.id}>
|
|
237
222
|
<button
|
|
@@ -251,25 +236,14 @@ export function GatesPanel() {
|
|
|
251
236
|
} else {
|
|
252
237
|
const decoded = decodePrincipal(item.id);
|
|
253
238
|
if (!decoded) return;
|
|
254
|
-
setSearch(
|
|
255
|
-
openPrincipal(
|
|
256
|
-
search,
|
|
257
|
-
decoded.kind,
|
|
258
|
-
decoded.id,
|
|
259
|
-
),
|
|
260
|
-
);
|
|
239
|
+
setSearch(openPrincipal(search, decoded.kind, decoded.id));
|
|
261
240
|
}
|
|
262
241
|
}}
|
|
263
242
|
>
|
|
264
243
|
<span className="font-mono">{item.label}</span>
|
|
265
|
-
{item.meta ?
|
|
266
|
-
<span className="truncate text-xs">{item.meta}</span>
|
|
267
|
-
) : null}
|
|
244
|
+
{item.meta ? <span className="truncate text-xs">{item.meta}</span> : null}
|
|
268
245
|
{item.flag ? (
|
|
269
|
-
<span
|
|
270
|
-
role="status"
|
|
271
|
-
className="text-xs text-[var(--oke-danger)]"
|
|
272
|
-
>
|
|
246
|
+
<span role="status" className="text-xs text-[var(--oke-danger)]">
|
|
273
247
|
{item.flag}
|
|
274
248
|
</span>
|
|
275
249
|
) : null}
|
|
@@ -295,17 +269,13 @@ export function GatesPanel() {
|
|
|
295
269
|
<div className="flex max-w-2xl flex-col gap-6">
|
|
296
270
|
{from === "flow" && openFlowRow ? (
|
|
297
271
|
<div>
|
|
298
|
-
<h2 className="font-mono text-lg text-[var(--oke-fg)]">
|
|
299
|
-
{openFlowRow.flowId}
|
|
300
|
-
</h2>
|
|
272
|
+
<h2 className="font-mono text-lg text-[var(--oke-fg)]">{openFlowRow.flowId}</h2>
|
|
301
273
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
302
274
|
What guards this — registration order
|
|
303
275
|
</p>
|
|
304
276
|
{openFlowRow.gates.length === 0 ? (
|
|
305
277
|
<p className="mt-2 text-sm" role="status">
|
|
306
|
-
{openFlowRow.unguarded
|
|
307
|
-
? "Unguarded — public on the user plane"
|
|
308
|
-
: "No gates"}
|
|
278
|
+
{openFlowRow.unguarded ? "Unguarded — public on the user plane" : "No gates"}
|
|
309
279
|
</p>
|
|
310
280
|
) : (
|
|
311
281
|
<ol
|
|
@@ -329,15 +299,10 @@ export function GatesPanel() {
|
|
|
329
299
|
</h2>
|
|
330
300
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
331
301
|
{openPrincipalRow.kind} · {openPrincipalRow.plane} plane
|
|
332
|
-
{openPrincipalRow.email
|
|
333
|
-
? ` · ${openPrincipalRow.email}`
|
|
334
|
-
: ""}
|
|
302
|
+
{openPrincipalRow.email ? ` · ${openPrincipalRow.email}` : ""}
|
|
335
303
|
</p>
|
|
336
304
|
<h3 className="mt-4 text-sm font-medium">Scopes</h3>
|
|
337
|
-
<ul
|
|
338
|
-
aria-label="Scopes"
|
|
339
|
-
className="mt-1 flex flex-wrap gap-2 text-sm"
|
|
340
|
-
>
|
|
305
|
+
<ul aria-label="Scopes" className="mt-1 flex flex-wrap gap-2 text-sm">
|
|
341
306
|
{openPrincipalRow.scopes.map((s) => (
|
|
342
307
|
<li key={s}>
|
|
343
308
|
<code className="font-mono">{s}</code>
|
|
@@ -355,13 +320,10 @@ export function GatesPanel() {
|
|
|
355
320
|
{powers ? (
|
|
356
321
|
<div className="mt-3 text-sm">
|
|
357
322
|
<p role="status">
|
|
358
|
-
{powers.allowedFlowIds.length} flows allowed ·{" "}
|
|
359
|
-
|
|
323
|
+
{powers.allowedFlowIds.length} flows allowed · {powers.deniedFlowIds.length}{" "}
|
|
324
|
+
denied
|
|
360
325
|
</p>
|
|
361
|
-
<ul
|
|
362
|
-
aria-label="Allowed flows"
|
|
363
|
-
className="mt-2 list-disc pl-5"
|
|
364
|
-
>
|
|
326
|
+
<ul aria-label="Allowed flows" className="mt-2 list-disc pl-5">
|
|
365
327
|
{powers.allowedFlowIds.map((id) => (
|
|
366
328
|
<li key={id}>
|
|
367
329
|
<code className="font-mono">{id}</code>
|
|
@@ -373,21 +335,14 @@ export function GatesPanel() {
|
|
|
373
335
|
</div>
|
|
374
336
|
) : null}
|
|
375
337
|
|
|
376
|
-
<section
|
|
377
|
-
|
|
378
|
-
className="border-t border-[var(--oke-line)] pt-4"
|
|
379
|
-
>
|
|
380
|
-
<h3 className="text-sm font-medium text-[var(--oke-fg)]">
|
|
381
|
-
Simulator
|
|
382
|
-
</h3>
|
|
338
|
+
<section aria-label="Simulator" className="border-t border-[var(--oke-line)] pt-4">
|
|
339
|
+
<h3 className="text-sm font-medium text-[var(--oke-fg)]">Simulator</h3>
|
|
383
340
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
384
341
|
Evaluates the real gate chain only — never runs the handler
|
|
385
342
|
</p>
|
|
386
343
|
<label className="mt-3 flex max-w-md flex-col gap-1 text-sm">
|
|
387
344
|
<span className="text-[var(--oke-muted)]">
|
|
388
|
-
{from === "flow"
|
|
389
|
-
? "Simulate as principal"
|
|
390
|
-
: "Simulate against flow"}
|
|
345
|
+
{from === "flow" ? "Simulate as principal" : "Simulate against flow"}
|
|
391
346
|
</span>
|
|
392
347
|
<select
|
|
393
348
|
aria-label="Companion selection"
|
|
@@ -405,10 +360,7 @@ export function GatesPanel() {
|
|
|
405
360
|
<option value="">Select…</option>
|
|
406
361
|
{from === "flow"
|
|
407
362
|
? principals.map((p) => (
|
|
408
|
-
<option
|
|
409
|
-
key={`${p.kind}:${p.id}`}
|
|
410
|
-
value={`${p.kind}:${p.id}`}
|
|
411
|
-
>
|
|
363
|
+
<option key={`${p.kind}:${p.id}`} value={`${p.kind}:${p.id}`}>
|
|
412
364
|
{p.kind}: {p.name}
|
|
413
365
|
</option>
|
|
414
366
|
))
|
|
@@ -431,9 +383,7 @@ export function GatesPanel() {
|
|
|
431
383
|
</Button>
|
|
432
384
|
{simulate.isError ? (
|
|
433
385
|
<p role="alert" className="mt-2 text-sm text-[var(--oke-danger)]">
|
|
434
|
-
{simulate.error instanceof Error
|
|
435
|
-
? simulate.error.message
|
|
436
|
-
: "Simulate failed"}
|
|
386
|
+
{simulate.error instanceof Error ? simulate.error.message : "Simulate failed"}
|
|
437
387
|
</p>
|
|
438
388
|
) : null}
|
|
439
389
|
{simResult ? (
|
|
@@ -443,9 +393,7 @@ export function GatesPanel() {
|
|
|
443
393
|
className="list-decimal space-y-1 pl-5 text-sm"
|
|
444
394
|
>
|
|
445
395
|
{simResult.evaluations.map((e, i) => (
|
|
446
|
-
<li key={`${e.name}-${i}`}>
|
|
447
|
-
{formatEvaluationStep(e, i)}
|
|
448
|
-
</li>
|
|
396
|
+
<li key={`${e.name}-${i}`}>{formatEvaluationStep(e, i)}</li>
|
|
449
397
|
))}
|
|
450
398
|
</ol>
|
|
451
399
|
<p
|
|
@@ -453,9 +401,7 @@ export function GatesPanel() {
|
|
|
453
401
|
className="mt-3 text-sm"
|
|
454
402
|
data-denial={simResult.denial?.code ?? "allowed"}
|
|
455
403
|
>
|
|
456
|
-
{simResult.denial
|
|
457
|
-
? formatDenial(simResult.denial)
|
|
458
|
-
: "Allowed — chain passed"}
|
|
404
|
+
{simResult.denial ? formatDenial(simResult.denial) : "Allowed — chain passed"}
|
|
459
405
|
</p>
|
|
460
406
|
</div>
|
|
461
407
|
) : null}
|
|
@@ -463,9 +409,7 @@ export function GatesPanel() {
|
|
|
463
409
|
|
|
464
410
|
{widenings.length > 0 ? (
|
|
465
411
|
<section aria-label="Permission widenings">
|
|
466
|
-
<h3 className="text-sm font-medium text-[var(--oke-danger)]">
|
|
467
|
-
Deploy widenings
|
|
468
|
-
</h3>
|
|
412
|
+
<h3 className="text-sm font-medium text-[var(--oke-danger)]">Deploy widenings</h3>
|
|
469
413
|
<ul className="mt-2 list-disc pl-5 text-sm">
|
|
470
414
|
{widenings.map((w) => (
|
|
471
415
|
<li key={`${w.path}:${w.summary}`}>{w.summary}</li>
|
|
@@ -158,17 +158,12 @@ export function OverviewPanel() {
|
|
|
158
158
|
accessQuery.data,
|
|
159
159
|
]);
|
|
160
160
|
|
|
161
|
-
const loading =
|
|
162
|
-
manifestQuery.isLoading ||
|
|
163
|
-
runsQuery.isLoading ||
|
|
164
|
-
gatesQuery.isLoading;
|
|
161
|
+
const loading = manifestQuery.isLoading || runsQuery.isLoading || gatesQuery.isLoading;
|
|
165
162
|
|
|
166
163
|
return (
|
|
167
164
|
<div className="flex h-full min-h-0 flex-col overflow-y-auto">
|
|
168
165
|
<header className="shrink-0 border-b border-[var(--oke-line)] px-6 py-5">
|
|
169
|
-
<p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">
|
|
170
|
-
Overview
|
|
171
|
-
</p>
|
|
166
|
+
<p className="text-xs uppercase tracking-[0.2em] text-[var(--oke-muted)]">Overview</p>
|
|
172
167
|
<h1 className="mt-1 text-xl font-semibold tracking-tight text-[var(--oke-fg)]">
|
|
173
168
|
Is the system healthy right now?
|
|
174
169
|
</h1>
|
|
@@ -191,8 +186,8 @@ export function OverviewPanel() {
|
|
|
191
186
|
{!loading && !manifestQuery.data ? (
|
|
192
187
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
193
188
|
No Manifest yet — save a Flow under{" "}
|
|
194
|
-
<code className="font-mono text-[var(--oke-fg)]">src/</code> and
|
|
195
|
-
|
|
189
|
+
<code className="font-mono text-[var(--oke-fg)]">src/</code> and the Console will
|
|
190
|
+
refresh.
|
|
196
191
|
</p>
|
|
197
192
|
) : null}
|
|
198
193
|
|
|
@@ -228,9 +223,7 @@ export function OverviewPanel() {
|
|
|
228
223
|
/>
|
|
229
224
|
|
|
230
225
|
<section aria-label="What changed" className="flex flex-col gap-2">
|
|
231
|
-
<h2 className="text-sm font-medium text-[var(--oke-fg)]">
|
|
232
|
-
What changed
|
|
233
|
-
</h2>
|
|
226
|
+
<h2 className="text-sm font-medium text-[var(--oke-fg)]">What changed</h2>
|
|
234
227
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
235
228
|
<a
|
|
236
229
|
href={view.whatChanged.href}
|
|
@@ -250,9 +243,7 @@ export function OverviewPanel() {
|
|
|
250
243
|
aria-label="Declare first SLO"
|
|
251
244
|
className="flex flex-col gap-2 border border-[var(--oke-line)] px-4 py-3"
|
|
252
245
|
>
|
|
253
|
-
<h2 className="text-sm font-medium text-[var(--oke-fg)]">
|
|
254
|
-
Declare a first objective
|
|
255
|
-
</h2>
|
|
246
|
+
<h2 className="text-sm font-medium text-[var(--oke-fg)]">Declare a first objective</h2>
|
|
256
247
|
<p className="text-sm text-[var(--oke-muted)]">
|
|
257
248
|
Your busiest flow is{" "}
|
|
258
249
|
<a
|
|
@@ -261,8 +252,7 @@ export function OverviewPanel() {
|
|
|
261
252
|
>
|
|
262
253
|
{view.firstSloInvite.busiestFlow}
|
|
263
254
|
</a>{" "}
|
|
264
|
-
({view.firstSloInvite.runCount.toLocaleString("en-US")} runs).
|
|
265
|
-
Add{" "}
|
|
255
|
+
({view.firstSloInvite.runCount.toLocaleString("en-US")} runs). Add{" "}
|
|
266
256
|
<code className="font-mono text-[13px] text-[var(--oke-fg)]">
|
|
267
257
|
{'slo: { availability: "99.9%" }'}
|
|
268
258
|
</code>{" "}
|
|
@@ -291,13 +281,9 @@ function BudgetStrip(props: {
|
|
|
291
281
|
}) {
|
|
292
282
|
return (
|
|
293
283
|
<section aria-label={props.ariaLabel} className="flex flex-col gap-3">
|
|
294
|
-
<h2 className="text-sm font-medium text-[var(--oke-fg)]">
|
|
295
|
-
{props.label}
|
|
296
|
-
</h2>
|
|
284
|
+
<h2 className="text-sm font-medium text-[var(--oke-fg)]">{props.label}</h2>
|
|
297
285
|
{props.items.length === 0 ? (
|
|
298
|
-
<p className="text-sm text-[var(--oke-muted)]">
|
|
299
|
-
{props.empty ?? "None."}
|
|
300
|
-
</p>
|
|
286
|
+
<p className="text-sm text-[var(--oke-muted)]">{props.empty ?? "None."}</p>
|
|
301
287
|
) : (
|
|
302
288
|
<ul className="divide-y divide-[var(--oke-line)] border-y border-[var(--oke-line)]">
|
|
303
289
|
{props.items.map((item) => (
|
|
@@ -306,23 +292,16 @@ function BudgetStrip(props: {
|
|
|
306
292
|
className="flex min-h-10 flex-wrap items-center justify-between gap-3 py-2 text-sm"
|
|
307
293
|
>
|
|
308
294
|
<div className="flex min-w-0 flex-col gap-0.5">
|
|
309
|
-
<span className="font-mono text-[13px] text-[var(--oke-fg)]">
|
|
310
|
-
{item.title}
|
|
311
|
-
</span>
|
|
295
|
+
<span className="font-mono text-[13px] text-[var(--oke-fg)]">{item.title}</span>
|
|
312
296
|
<span className="text-[var(--oke-muted)]">{item.meta}</span>
|
|
313
297
|
</div>
|
|
314
298
|
<div className="flex flex-wrap items-center gap-3 text-[var(--oke-muted)]">
|
|
315
299
|
<span>
|
|
316
|
-
burn
|
|
317
|
-
<span className="text-[var(--oke-fg)]">
|
|
318
|
-
{formatBurnRate(item.burn)}
|
|
319
|
-
</span>
|
|
300
|
+
burn <span className="text-[var(--oke-fg)]">{formatBurnRate(item.burn)}</span>
|
|
320
301
|
</span>
|
|
321
302
|
<span>
|
|
322
303
|
exhausts{" "}
|
|
323
|
-
<span className="text-[var(--oke-fg)]">
|
|
324
|
-
{formatBudgetDuration(item.exhaust)}
|
|
325
|
-
</span>
|
|
304
|
+
<span className="text-[var(--oke-fg)]">{formatBudgetDuration(item.exhaust)}</span>
|
|
326
305
|
</span>
|
|
327
306
|
<span
|
|
328
307
|
aria-hidden
|
|
@@ -358,9 +337,7 @@ function FindingsList({ view }: { readonly view: OverviewView }) {
|
|
|
358
337
|
<section aria-label="Findings" aria-live="polite" className="flex flex-col gap-3">
|
|
359
338
|
<h2 className="text-sm font-medium text-[var(--oke-fg)]">Findings</h2>
|
|
360
339
|
{view.findings.length === 0 ? (
|
|
361
|
-
<p className="text-sm text-[var(--oke-muted)]">
|
|
362
|
-
No findings from other panels.
|
|
363
|
-
</p>
|
|
340
|
+
<p className="text-sm text-[var(--oke-muted)]">No findings from other panels.</p>
|
|
364
341
|
) : (
|
|
365
342
|
<ol className="divide-y divide-[var(--oke-line)] border-y border-[var(--oke-line)]">
|
|
366
343
|
{view.findings.map((f, i) => (
|
|
@@ -369,15 +346,10 @@ function FindingsList({ view }: { readonly view: OverviewView }) {
|
|
|
369
346
|
href={f.href}
|
|
370
347
|
className="flex min-h-8 items-start gap-3 hover:text-[var(--oke-fg)]"
|
|
371
348
|
>
|
|
372
|
-
<span className="w-5 shrink-0 text-[var(--oke-muted)]">
|
|
373
|
-
{i + 1}.
|
|
374
|
-
</span>
|
|
349
|
+
<span className="w-5 shrink-0 text-[var(--oke-muted)]">{i + 1}.</span>
|
|
375
350
|
<span>
|
|
376
351
|
<span className="text-[var(--oke-fg)]">{f.title}</span>
|
|
377
|
-
<span className="text-[var(--oke-muted)]">
|
|
378
|
-
{" "}
|
|
379
|
-
· {f.detail}
|
|
380
|
-
</span>
|
|
352
|
+
<span className="text-[var(--oke-muted)]"> · {f.detail}</span>
|
|
381
353
|
<span className="ml-2 text-xs uppercase tracking-wider text-[var(--oke-muted)]">
|
|
382
354
|
{f.source}
|
|
383
355
|
</span>
|
|
@@ -394,38 +366,28 @@ function FindingsList({ view }: { readonly view: OverviewView }) {
|
|
|
394
366
|
function GoldenStrip({ view }: { readonly view: OverviewView }) {
|
|
395
367
|
return (
|
|
396
368
|
<section aria-label="Golden signals" className="flex flex-col gap-3">
|
|
397
|
-
<h2 className="text-sm font-medium text-[var(--oke-fg)]">
|
|
398
|
-
Golden signals
|
|
399
|
-
</h2>
|
|
369
|
+
<h2 className="text-sm font-medium text-[var(--oke-fg)]">Golden signals</h2>
|
|
400
370
|
<dl className="grid grid-cols-2 gap-4 sm:grid-cols-4">
|
|
401
371
|
<div>
|
|
402
|
-
<dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">
|
|
403
|
-
Latency p99
|
|
404
|
-
</dt>
|
|
372
|
+
<dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">Latency p99</dt>
|
|
405
373
|
<dd className="mt-1 text-sm text-[var(--oke-fg)]">
|
|
406
374
|
{Math.round(view.golden.latencyP99Ms)} ms
|
|
407
375
|
</dd>
|
|
408
376
|
</div>
|
|
409
377
|
<div>
|
|
410
|
-
<dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">
|
|
411
|
-
Traffic
|
|
412
|
-
</dt>
|
|
378
|
+
<dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">Traffic</dt>
|
|
413
379
|
<dd className="mt-1 text-sm text-[var(--oke-fg)]">
|
|
414
380
|
{view.golden.trafficPerMin.toFixed(1)} / min
|
|
415
381
|
</dd>
|
|
416
382
|
</div>
|
|
417
383
|
<div>
|
|
418
|
-
<dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">
|
|
419
|
-
Errors
|
|
420
|
-
</dt>
|
|
384
|
+
<dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">Errors</dt>
|
|
421
385
|
<dd className="mt-1 text-sm text-[var(--oke-fg)]">
|
|
422
386
|
{(view.golden.errorRate * 100).toFixed(2)}%
|
|
423
387
|
</dd>
|
|
424
388
|
</div>
|
|
425
389
|
<div>
|
|
426
|
-
<dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">
|
|
427
|
-
Saturation
|
|
428
|
-
</dt>
|
|
390
|
+
<dt className="text-xs uppercase tracking-wider text-[var(--oke-muted)]">Saturation</dt>
|
|
429
391
|
<dd className="mt-1 text-sm text-[var(--oke-fg)]">
|
|
430
392
|
{(view.golden.saturation * 100).toFixed(1)}%
|
|
431
393
|
</dd>
|
|
@@ -48,14 +48,8 @@ export function PluginsPanel() {
|
|
|
48
48
|
});
|
|
49
49
|
|
|
50
50
|
const list = listQuery.data;
|
|
51
|
-
const groups = useMemo(
|
|
52
|
-
|
|
53
|
-
[list?.plugins, search],
|
|
54
|
-
);
|
|
55
|
-
const open =
|
|
56
|
-
list?.plugins.find((p) => p.id === search.plugin) ??
|
|
57
|
-
list?.plugins[0] ??
|
|
58
|
-
null;
|
|
51
|
+
const groups = useMemo(() => groupPlugins(list?.plugins ?? [], search), [list?.plugins, search]);
|
|
52
|
+
const open = list?.plugins.find((p) => p.id === search.plugin) ?? list?.plugins[0] ?? null;
|
|
59
53
|
const command = open ? copyableCommand(open) : null;
|
|
60
54
|
|
|
61
55
|
const copy = async () => {
|
|
@@ -70,8 +64,8 @@ export function PluginsPanel() {
|
|
|
70
64
|
<header className="shrink-0 border-b border-[var(--oke-line)] px-4 py-3">
|
|
71
65
|
<h1 className="text-lg text-[var(--oke-fg)]">Plugins</h1>
|
|
72
66
|
<p className="mt-1 text-sm text-[var(--oke-muted)]">
|
|
73
|
-
Origin × state — CORE stays listed when off; local/community only when
|
|
74
|
-
|
|
67
|
+
Origin × state — CORE stays listed when off; local/community only when plugged. Read-only;
|
|
68
|
+
git review is the approval.
|
|
75
69
|
</p>
|
|
76
70
|
<div className="mt-3 flex flex-wrap items-end gap-3">
|
|
77
71
|
<label className="flex flex-col gap-1 text-xs text-[var(--oke-muted)]">
|
|
@@ -79,9 +73,7 @@ export function PluginsPanel() {
|
|
|
79
73
|
<Input
|
|
80
74
|
aria-label="Filter plugins"
|
|
81
75
|
value={search.q ?? ""}
|
|
82
|
-
onChange={(e) =>
|
|
83
|
-
setSearch({ ...search, q: e.target.value || undefined })
|
|
84
|
-
}
|
|
76
|
+
onChange={(e) => setSearch({ ...search, q: e.target.value || undefined })}
|
|
85
77
|
className="min-h-8 w-56"
|
|
86
78
|
/>
|
|
87
79
|
</label>
|
|
@@ -89,10 +81,7 @@ export function PluginsPanel() {
|
|
|
89
81
|
value={search.origin}
|
|
90
82
|
onChange={(origin) => setSearch({ ...search, origin })}
|
|
91
83
|
/>
|
|
92
|
-
<StateFilter
|
|
93
|
-
value={search.state}
|
|
94
|
-
onChange={(state) => setSearch({ ...search, state })}
|
|
95
|
-
/>
|
|
84
|
+
<StateFilter value={search.state} onChange={(state) => setSearch({ ...search, state })} />
|
|
96
85
|
</div>
|
|
97
86
|
</header>
|
|
98
87
|
|
|
@@ -142,9 +131,7 @@ export function PluginsPanel() {
|
|
|
142
131
|
className="min-h-0 flex-1 overflow-y-auto px-4 py-3"
|
|
143
132
|
>
|
|
144
133
|
{!open ? (
|
|
145
|
-
<p className="text-sm text-[var(--oke-muted)]">
|
|
146
|
-
Select a plugin
|
|
147
|
-
</p>
|
|
134
|
+
<p className="text-sm text-[var(--oke-muted)]">Select a plugin</p>
|
|
148
135
|
) : (
|
|
149
136
|
<PluginDetail
|
|
150
137
|
plugin={open}
|
|
@@ -175,13 +162,9 @@ function PluginDetail(props: {
|
|
|
175
162
|
({p.origin} · {p.state})
|
|
176
163
|
</span>
|
|
177
164
|
</h2>
|
|
178
|
-
{p.summary ? (
|
|
179
|
-
<p className="mt-1 text-sm text-[var(--oke-muted)]">{p.summary}</p>
|
|
180
|
-
) : null}
|
|
165
|
+
{p.summary ? <p className="mt-1 text-sm text-[var(--oke-muted)]">{p.summary}</p> : null}
|
|
181
166
|
{p.version ? (
|
|
182
|
-
<p className="mt-1 text-xs text-[var(--oke-muted)]">
|
|
183
|
-
Version {p.version}
|
|
184
|
-
</p>
|
|
167
|
+
<p className="mt-1 text-xs text-[var(--oke-muted)]">Version {p.version}</p>
|
|
185
168
|
) : null}
|
|
186
169
|
</div>
|
|
187
170
|
|
|
@@ -210,9 +193,7 @@ function PluginDetail(props: {
|
|
|
210
193
|
<p className="mt-2 text-sm text-[var(--oke-muted)]">None</p>
|
|
211
194
|
) : (
|
|
212
195
|
<table className="mt-2 w-full text-left text-sm">
|
|
213
|
-
<caption className="sr-only">
|
|
214
|
-
Hook stages and measured mean cost
|
|
215
|
-
</caption>
|
|
196
|
+
<caption className="sr-only">Hook stages and measured mean cost</caption>
|
|
216
197
|
<thead>
|
|
217
198
|
<tr className="text-xs text-[var(--oke-muted)]">
|
|
218
199
|
<th scope="col" className="py-1 pr-3 font-normal">
|
|
@@ -232,9 +213,7 @@ function PluginDetail(props: {
|
|
|
232
213
|
<th scope="row" className="py-1 pr-3 font-mono font-normal">
|
|
233
214
|
{i.stage}
|
|
234
215
|
</th>
|
|
235
|
-
<td className="py-1 pr-3">
|
|
236
|
-
{i.meanMs === null ? "—" : i.meanMs.toFixed(2)}
|
|
237
|
-
</td>
|
|
216
|
+
<td className="py-1 pr-3">{i.meanMs === null ? "—" : i.meanMs.toFixed(2)}</td>
|
|
238
217
|
<td className="py-1">{i.count}</td>
|
|
239
218
|
</tr>
|
|
240
219
|
))}
|
|
@@ -243,8 +222,8 @@ function PluginDetail(props: {
|
|
|
243
222
|
)}
|
|
244
223
|
{p.hookCost ? (
|
|
245
224
|
<p className="mt-2 text-xs text-[var(--oke-muted)]" role="status">
|
|
246
|
-
p50 {p.hookCost.p50Ms.toFixed(2)} ms · p95{
|
|
247
|
-
{p.hookCost.
|
|
225
|
+
p50 {p.hookCost.p50Ms.toFixed(2)} ms · p95 {p.hookCost.p95Ms.toFixed(2)} ms · n=
|
|
226
|
+
{p.hookCost.count}
|
|
248
227
|
</p>
|
|
249
228
|
) : null}
|
|
250
229
|
</section>
|
|
@@ -299,9 +278,7 @@ function PluginDetail(props: {
|
|
|
299
278
|
>
|
|
300
279
|
{c.summary}
|
|
301
280
|
</a>
|
|
302
|
-
<span className="ml-2 text-xs text-[var(--oke-muted)]">
|
|
303
|
-
{c.category}
|
|
304
|
-
</span>
|
|
281
|
+
<span className="ml-2 text-xs text-[var(--oke-muted)]">{c.category}</span>
|
|
305
282
|
</li>
|
|
306
283
|
))}
|
|
307
284
|
</ul>
|
|
@@ -326,14 +303,12 @@ function PluginDetail(props: {
|
|
|
326
303
|
) : null}
|
|
327
304
|
</div>
|
|
328
305
|
<p className="text-xs text-[var(--oke-muted)]">
|
|
329
|
-
The Console never installs. Git review is the approval — run this
|
|
330
|
-
yourself.
|
|
306
|
+
The Console never installs. Git review is the approval — run this yourself.
|
|
331
307
|
</p>
|
|
332
308
|
</div>
|
|
333
309
|
) : (
|
|
334
310
|
<p className="mt-2 text-sm text-[var(--oke-muted)]">
|
|
335
|
-
No install command — turn off by removing the code line, not from
|
|
336
|
-
this UI.
|
|
311
|
+
No install command — turn off by removing the code line, not from this UI.
|
|
337
312
|
</p>
|
|
338
313
|
)}
|
|
339
314
|
</section>
|