okengine 0.1.4
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 +91 -0
- package/README.md +327 -0
- package/docs/spec/complete-example.md +1188 -0
- package/docs/spec/console.md +739 -0
- package/docs/spec/four-applications.md +1188 -0
- package/docs/spec/unified-theory.md +489 -0
- package/package.json +152 -0
- package/spec/manifest.v1.schema.json +624 -0
- package/src/auth/api-keys.ts +168 -0
- package/src/auth/attenuation.ts +116 -0
- package/src/auth/auth.test.ts +273 -0
- package/src/auth/cross-plane.ts +98 -0
- package/src/auth/index.ts +112 -0
- package/src/auth/invites.ts +66 -0
- package/src/auth/invoke-as.ts +49 -0
- package/src/auth/operator.ts +178 -0
- package/src/auth/planes.ts +102 -0
- package/src/auth/plugin.ts +44 -0
- package/src/auth/roles.ts +84 -0
- package/src/auth/sessions.ts +418 -0
- package/src/auth/tables.ts +131 -0
- package/src/cli/args.ts +50 -0
- package/src/cli/branch.ts +75 -0
- package/src/cli/build.ts +86 -0
- package/src/cli/client-add.test.ts +140 -0
- package/src/cli/client-add.ts +164 -0
- package/src/cli/completion.test.ts +58 -0
- package/src/cli/completion.ts +296 -0
- package/src/cli/dev-app-runner.ts +77 -0
- package/src/cli/dev.test.ts +435 -0
- package/src/cli/dev.ts +594 -0
- package/src/cli/doc-drift.test.ts +146 -0
- package/src/cli/doc-drift.ts +397 -0
- package/src/cli/docker-cli.test.ts +221 -0
- package/src/cli/docker.ts +127 -0
- package/src/cli/doctor-diff-examples.ts +92 -0
- package/src/cli/doctor-diff.test.ts +91 -0
- package/src/cli/doctor-diff.ts +274 -0
- package/src/cli/doctor-pii.test.ts +98 -0
- package/src/cli/doctor-pii.ts +151 -0
- package/src/cli/doctor.test.ts +150 -0
- package/src/cli/doctor.ts +223 -0
- package/src/cli/eval.ts +122 -0
- package/src/cli/exit.ts +19 -0
- package/src/cli/gates-list.test.ts +47 -0
- package/src/cli/gates-list.ts +84 -0
- package/src/cli/images.ts +277 -0
- package/src/cli/index.ts +99 -0
- package/src/cli/json-out.test.ts +129 -0
- package/src/cli/load-config.ts +71 -0
- package/src/cli/mcp-from-console.ts +50 -0
- package/src/cli/privacy-erase.ts +73 -0
- package/src/cli/registry.ts +455 -0
- package/src/cli/safe-defaults.test.ts +92 -0
- package/src/cli/schema.ts +196 -0
- package/src/cli/stack.ts +82 -0
- package/src/cli/start.ts +106 -0
- package/src/cli/upgrade.ts +105 -0
- package/src/cli/vault-cmd.ts +140 -0
- package/src/client/budget-entry.ts +34 -0
- package/src/client/budget.test.ts +17 -0
- package/src/client/create.test.ts +159 -0
- package/src/client/create.ts +152 -0
- package/src/client/errors.ts +60 -0
- package/src/client/index.ts +35 -0
- package/src/client/notes-contract.test.ts +289 -0
- package/src/client/transport.test.ts +123 -0
- package/src/client/transport.ts +254 -0
- package/src/client/types.ts +282 -0
- package/src/compiler/aot.test.ts +248 -0
- package/src/compiler/aot.ts +182 -0
- package/src/compiler/differential.test.ts +241 -0
- package/src/compiler/dynamic.ts +54 -0
- package/src/compiler/effects-infer.ts +541 -0
- package/src/compiler/emit.ts +40 -0
- package/src/compiler/extract.test.ts +177 -0
- package/src/compiler/extract.ts +1368 -0
- package/src/compiler/fixtures/raw/raw-unannotated.ts +28 -0
- package/src/compiler/fixtures/skyport/oke.config.ts +24 -0
- package/src/compiler/fixtures/skyport/src/ai.ts +15 -0
- package/src/compiler/fixtures/skyport/src/app.ts +10 -0
- package/src/compiler/fixtures/skyport/src/channels.ts +6 -0
- package/src/compiler/fixtures/skyport/src/core.ts +3 -0
- package/src/compiler/fixtures/skyport/src/flows/bookings/index.ts +57 -0
- package/src/compiler/fixtures/skyport/src/flows/bookings/signals.ts +11 -0
- package/src/compiler/fixtures/skyport/src/flows/payments/index.ts +14 -0
- package/src/compiler/fixtures/skyport/src/flows/support/index.ts +20 -0
- package/src/compiler/fixtures/skyport/src/gates.ts +14 -0
- package/src/compiler/fixtures/skyport/src/journeys.ts +9 -0
- package/src/compiler/fixtures/skyport/src/schema.ts +3 -0
- package/src/compiler/fixtures/skyport/src/vault.ts +6 -0
- package/src/compiler/fixtures/skyport.expected.json +241 -0
- package/src/compiler/fixtures/triggers/five-triggers.ts +69 -0
- package/src/compiler/http-parse.ts +214 -0
- package/src/compiler/index.ts +67 -0
- package/src/compiler/response.ts +89 -0
- package/src/compiler/sucrose.ts +238 -0
- package/src/config/index.ts +167 -0
- package/src/console/budget.test.ts +73 -0
- package/src/console/index.ts +30 -0
- package/src/console/server/access.test.ts +370 -0
- package/src/console/server/access.ts +777 -0
- package/src/console/server/ai.test.ts +172 -0
- package/src/console/server/ai.ts +632 -0
- package/src/console/server/app.ts +294 -0
- package/src/console/server/auth-rate.test.ts +81 -0
- package/src/console/server/auth-rate.ts +72 -0
- package/src/console/server/bind.ts +25 -0
- package/src/console/server/channels.test.ts +179 -0
- package/src/console/server/channels.ts +469 -0
- package/src/console/server/claim.test.ts +66 -0
- package/src/console/server/claim.ts +134 -0
- package/src/console/server/clock.test.ts +239 -0
- package/src/console/server/clock.ts +390 -0
- package/src/console/server/console.test.ts +338 -0
- package/src/console/server/diff.test.ts +299 -0
- package/src/console/server/diff.ts +352 -0
- package/src/console/server/dry-run.audit.test.ts +118 -0
- package/src/console/server/flows-invoke.test.ts +148 -0
- package/src/console/server/flows.ts +3633 -0
- package/src/console/server/gates.test.ts +360 -0
- package/src/console/server/gates.ts +869 -0
- package/src/console/server/index.ts +141 -0
- package/src/console/server/live.test.ts +30 -0
- package/src/console/server/live.ts +109 -0
- package/src/console/server/plugin.ts +50 -0
- package/src/console/server/plugins.test.ts +131 -0
- package/src/console/server/plugins.ts +429 -0
- package/src/console/server/runs-pii.ts +98 -0
- package/src/console/server/security-headers.ts +97 -0
- package/src/console/server/security.gate.test.ts +286 -0
- package/src/console/server/serve.ts +319 -0
- package/src/console/server/signals.test.ts +88 -0
- package/src/console/server/signals.ts +282 -0
- package/src/console/server/state.ts +982 -0
- package/src/console/server/store.test.ts +233 -0
- package/src/console/server/store.ts +861 -0
- package/src/console/server/structural.ts +95 -0
- package/src/console/server/vault.test.ts +251 -0
- package/src/console/server/vault.ts +430 -0
- package/src/console/ui/access/AccessA11yView.tsx +237 -0
- package/src/console/ui/access/a11y.test.tsx +122 -0
- package/src/console/ui/access/acknowledgement.test.ts +13 -0
- package/src/console/ui/access/acknowledgement.ts +35 -0
- package/src/console/ui/access/blast-radius.test.ts +26 -0
- package/src/console/ui/access/blast-radius.ts +40 -0
- package/src/console/ui/access/confirmation.test.ts +38 -0
- package/src/console/ui/access/confirmation.ts +36 -0
- package/src/console/ui/access/fixture.ts +203 -0
- package/src/console/ui/access/grantable.test.ts +17 -0
- package/src/console/ui/access/grantable.ts +36 -0
- package/src/console/ui/access/hygiene.test.ts +12 -0
- package/src/console/ui/access/hygiene.ts +39 -0
- package/src/console/ui/access/index.ts +54 -0
- package/src/console/ui/access/provenance.test.ts +12 -0
- package/src/console/ui/access/provenance.ts +29 -0
- package/src/console/ui/access/search.test.ts +17 -0
- package/src/console/ui/access/search.ts +72 -0
- package/src/console/ui/access/types.ts +111 -0
- package/src/console/ui/ai/AiA11yView.tsx +265 -0
- package/src/console/ui/ai/a11y.test.tsx +99 -0
- package/src/console/ui/ai/findings.ts +41 -0
- package/src/console/ui/ai/fixture.ts +182 -0
- package/src/console/ui/ai/format.ts +90 -0
- package/src/console/ui/ai/group.test.ts +37 -0
- package/src/console/ui/ai/group.ts +88 -0
- package/src/console/ui/ai/index.ts +66 -0
- package/src/console/ui/ai/promotion.test.ts +77 -0
- package/src/console/ui/ai/promotion.ts +150 -0
- package/src/console/ui/ai/search.test.ts +40 -0
- package/src/console/ui/ai/search.ts +89 -0
- package/src/console/ui/ai/types.ts +139 -0
- package/src/console/ui/architecture/ArchitectureA11yView.tsx +163 -0
- package/src/console/ui/architecture/a11y.test.tsx +97 -0
- package/src/console/ui/architecture/boundary.ts +42 -0
- package/src/console/ui/architecture/declared.ts +165 -0
- package/src/console/ui/architecture/fixture.ts +74 -0
- package/src/console/ui/architecture/index.ts +84 -0
- package/src/console/ui/architecture/layers.ts +64 -0
- package/src/console/ui/architecture/layout.ts +68 -0
- package/src/console/ui/architecture/pathologies.ts +260 -0
- package/src/console/ui/architecture/search.ts +145 -0
- package/src/console/ui/architecture/traffic.ts +102 -0
- package/src/console/ui/architecture/types.ts +144 -0
- package/src/console/ui/architecture/view.test.ts +165 -0
- package/src/console/ui/architecture/view.ts +516 -0
- package/src/console/ui/channels/ChannelsA11yView.tsx +180 -0
- package/src/console/ui/channels/a11y.test.tsx +96 -0
- package/src/console/ui/channels/confirmation.test.ts +37 -0
- package/src/console/ui/channels/confirmation.ts +27 -0
- package/src/console/ui/channels/fallback.test.ts +15 -0
- package/src/console/ui/channels/fallback.ts +20 -0
- package/src/console/ui/channels/findings.ts +38 -0
- package/src/console/ui/channels/fixture.ts +134 -0
- package/src/console/ui/channels/group.ts +25 -0
- package/src/console/ui/channels/index.ts +57 -0
- package/src/console/ui/channels/locale.test.ts +17 -0
- package/src/console/ui/channels/locale.ts +31 -0
- package/src/console/ui/channels/mask.test.ts +14 -0
- package/src/console/ui/channels/mask.ts +12 -0
- package/src/console/ui/channels/search.ts +58 -0
- package/src/console/ui/channels/taxonomy.test.ts +17 -0
- package/src/console/ui/channels/taxonomy.ts +49 -0
- package/src/console/ui/channels/types.ts +117 -0
- package/src/console/ui/clock/ClockA11yView.tsx +182 -0
- package/src/console/ui/clock/a11y.test.tsx +99 -0
- package/src/console/ui/clock/confirmation.test.ts +32 -0
- package/src/console/ui/clock/confirmation.ts +34 -0
- package/src/console/ui/clock/findings.ts +40 -0
- package/src/console/ui/clock/fixture.ts +111 -0
- package/src/console/ui/clock/health.test.ts +25 -0
- package/src/console/ui/clock/health.ts +61 -0
- package/src/console/ui/clock/index.ts +49 -0
- package/src/console/ui/clock/search.test.ts +39 -0
- package/src/console/ui/clock/search.ts +76 -0
- package/src/console/ui/clock/timeline.test.ts +44 -0
- package/src/console/ui/clock/timeline.ts +41 -0
- package/src/console/ui/clock/types.ts +78 -0
- package/src/console/ui/clock/waiting-on.test.ts +34 -0
- package/src/console/ui/clock/waiting-on.ts +83 -0
- package/src/console/ui/confirmation.unify.test.ts +92 -0
- package/src/console/ui/diff/DiffA11yView.tsx +85 -0
- package/src/console/ui/diff/a11y.test.tsx +99 -0
- package/src/console/ui/diff/fixture.ts +85 -0
- package/src/console/ui/diff/group.test.ts +58 -0
- package/src/console/ui/diff/group.ts +97 -0
- package/src/console/ui/diff/index.ts +38 -0
- package/src/console/ui/diff/search.test.ts +32 -0
- package/src/console/ui/diff/search.ts +75 -0
- package/src/console/ui/diff/summary.ts +74 -0
- package/src/console/ui/diff/types.ts +48 -0
- package/src/console/ui/dist/assets/index-B71Yl_SS.js +10 -0
- package/src/console/ui/dist/assets/panel-access-Dd37LU2c.js +64 -0
- package/src/console/ui/dist/assets/panel-ai-CC7LR6-J.js +1 -0
- package/src/console/ui/dist/assets/panel-architecture-B5b3iKCz.js +1 -0
- package/src/console/ui/dist/assets/panel-channels-CeNjTKXp.js +1 -0
- package/src/console/ui/dist/assets/panel-clock-DgFTLoHV.js +1 -0
- package/src/console/ui/dist/assets/panel-diff-DxehccqB.js +1 -0
- package/src/console/ui/dist/assets/panel-flows-BtrVn-Eg.js +45 -0
- package/src/console/ui/dist/assets/panel-gates-Z9MKRGdH.js +1 -0
- package/src/console/ui/dist/assets/panel-overview-Bd48d9km.js +1 -0
- package/src/console/ui/dist/assets/panel-plugins-DWd0TowH.js +1 -0
- package/src/console/ui/dist/assets/panel-runs-BwsWqKeB.js +1 -0
- package/src/console/ui/dist/assets/panel-signals-9najbZY2.js +1 -0
- package/src/console/ui/dist/assets/panel-store-OHkP2pDp.js +1 -0
- package/src/console/ui/dist/assets/panel-traces-tn2JoY8U.js +1 -0
- package/src/console/ui/dist/assets/panel-vault-BbfWdox0.js +1 -0
- package/src/console/ui/dist/assets/rolldown-runtime-CNC7AqOf.js +1 -0
- package/src/console/ui/dist/assets/style-Cnl7WLya.css +3 -0
- package/src/console/ui/dist/index.html +14 -0
- package/src/console/ui/flows/FlowsA11yView.tsx +155 -0
- package/src/console/ui/flows/a11y.test.tsx +105 -0
- package/src/console/ui/flows/buffer.test.ts +91 -0
- package/src/console/ui/flows/buffer.ts +118 -0
- package/src/console/ui/flows/confirmation.ts +131 -0
- package/src/console/ui/flows/contract.test.ts +89 -0
- package/src/console/ui/flows/contract.ts +353 -0
- package/src/console/ui/flows/fixture.ts +81 -0
- package/src/console/ui/flows/graph.test.ts +101 -0
- package/src/console/ui/flows/graph.ts +549 -0
- package/src/console/ui/flows/index.ts +87 -0
- package/src/console/ui/flows/save-as-test.test.ts +47 -0
- package/src/console/ui/flows/save-as-test.ts +99 -0
- package/src/console/ui/flows/search.ts +255 -0
- package/src/console/ui/flows/tiers.ts +140 -0
- package/src/console/ui/gates/GatesA11yView.tsx +192 -0
- package/src/console/ui/gates/a11y.test.tsx +116 -0
- package/src/console/ui/gates/audit.test.ts +40 -0
- package/src/console/ui/gates/audit.ts +63 -0
- package/src/console/ui/gates/denial.test.ts +36 -0
- package/src/console/ui/gates/denial.ts +51 -0
- package/src/console/ui/gates/findings.ts +19 -0
- package/src/console/ui/gates/fixture.ts +189 -0
- package/src/console/ui/gates/group.test.ts +30 -0
- package/src/console/ui/gates/group.ts +102 -0
- package/src/console/ui/gates/index.ts +47 -0
- package/src/console/ui/gates/search.test.ts +49 -0
- package/src/console/ui/gates/search.ts +115 -0
- package/src/console/ui/gates/types.ts +121 -0
- package/src/console/ui/overview/OverviewA11yView.tsx +152 -0
- package/src/console/ui/overview/a11y.test.tsx +113 -0
- package/src/console/ui/overview/busiest.ts +26 -0
- package/src/console/ui/overview/compose.ts +133 -0
- package/src/console/ui/overview/cost.test.ts +39 -0
- package/src/console/ui/overview/cost.ts +138 -0
- package/src/console/ui/overview/fixture.ts +161 -0
- package/src/console/ui/overview/golden.ts +57 -0
- package/src/console/ui/overview/index.ts +59 -0
- package/src/console/ui/overview/rank.test.ts +136 -0
- package/src/console/ui/overview/rank.ts +210 -0
- package/src/console/ui/overview/slo.test.ts +73 -0
- package/src/console/ui/overview/slo.ts +229 -0
- package/src/console/ui/overview/types.ts +121 -0
- package/src/console/ui/overview/verdict.ts +131 -0
- package/src/console/ui/plugins/PluginsA11yView.tsx +227 -0
- package/src/console/ui/plugins/a11y.test.tsx +97 -0
- package/src/console/ui/plugins/command.test.ts +22 -0
- package/src/console/ui/plugins/command.ts +27 -0
- package/src/console/ui/plugins/findings.ts +39 -0
- package/src/console/ui/plugins/fixture.ts +233 -0
- package/src/console/ui/plugins/group.test.ts +38 -0
- package/src/console/ui/plugins/group.ts +67 -0
- package/src/console/ui/plugins/index.ts +40 -0
- package/src/console/ui/plugins/search.ts +67 -0
- package/src/console/ui/plugins/types.ts +115 -0
- package/src/console/ui/runs/RunsA11yView.tsx +267 -0
- package/src/console/ui/runs/a11y.test.tsx +99 -0
- package/src/console/ui/runs/explain.test.ts +23 -0
- package/src/console/ui/runs/explain.ts +32 -0
- package/src/console/ui/runs/fixture.ts +189 -0
- package/src/console/ui/runs/group.test.ts +24 -0
- package/src/console/ui/runs/group.ts +85 -0
- package/src/console/ui/runs/histogram.test.ts +31 -0
- package/src/console/ui/runs/histogram.ts +85 -0
- package/src/console/ui/runs/index.ts +75 -0
- package/src/console/ui/runs/project.ts +122 -0
- package/src/console/ui/runs/query.test.ts +50 -0
- package/src/console/ui/runs/query.ts +283 -0
- package/src/console/ui/runs/search.test.ts +45 -0
- package/src/console/ui/runs/search.ts +141 -0
- package/src/console/ui/runs/trace-link.test.ts +30 -0
- package/src/console/ui/runs/trace-link.ts +99 -0
- package/src/console/ui/runs/types.ts +137 -0
- package/src/console/ui/shell/App.tsx +56 -0
- package/src/console/ui/shell/client.ts +1715 -0
- package/src/console/ui/shell/components/ui.tsx +110 -0
- package/src/console/ui/shell/index.html +12 -0
- package/src/console/ui/shell/layout/Shell.tsx +95 -0
- package/src/console/ui/shell/main.tsx +281 -0
- package/src/console/ui/shell/panels/Access.tsx +5 -0
- package/src/console/ui/shell/panels/Ai.tsx +5 -0
- package/src/console/ui/shell/panels/Architecture.tsx +5 -0
- package/src/console/ui/shell/panels/Channels.tsx +5 -0
- package/src/console/ui/shell/panels/Clock.tsx +5 -0
- package/src/console/ui/shell/panels/Diff.tsx +5 -0
- package/src/console/ui/shell/panels/Flows.tsx +5 -0
- package/src/console/ui/shell/panels/Gates.tsx +5 -0
- package/src/console/ui/shell/panels/Overview.tsx +6 -0
- package/src/console/ui/shell/panels/Plugins.tsx +5 -0
- package/src/console/ui/shell/panels/Runs.tsx +5 -0
- package/src/console/ui/shell/panels/Signals.tsx +5 -0
- package/src/console/ui/shell/panels/Store.tsx +5 -0
- package/src/console/ui/shell/panels/Traces.tsx +5 -0
- package/src/console/ui/shell/panels/Vault.tsx +5 -0
- package/src/console/ui/shell/panels/access/AccessPanel.tsx +813 -0
- package/src/console/ui/shell/panels/ai/AiPanel.tsx +563 -0
- package/src/console/ui/shell/panels/architecture/ArchitecturePanel.tsx +377 -0
- package/src/console/ui/shell/panels/channels/ChannelsPanel.tsx +454 -0
- package/src/console/ui/shell/panels/clock/ClockPanel.tsx +479 -0
- package/src/console/ui/shell/panels/diff/DiffPanel.tsx +275 -0
- package/src/console/ui/shell/panels/flows/ContractEditor.tsx +301 -0
- package/src/console/ui/shell/panels/flows/FlowDrawer.tsx +350 -0
- package/src/console/ui/shell/panels/flows/FlowsPanel.tsx +502 -0
- package/src/console/ui/shell/panels/gates/GatesPanel.tsx +482 -0
- package/src/console/ui/shell/panels/overview/OverviewPanel.tsx +428 -0
- package/src/console/ui/shell/panels/plugins/PluginsPanel.tsx +413 -0
- package/src/console/ui/shell/panels/runs/RunsPanel.tsx +649 -0
- package/src/console/ui/shell/panels/signals/SignalsPanel.tsx +840 -0
- package/src/console/ui/shell/panels/store/StorePanel.tsx +787 -0
- package/src/console/ui/shell/panels/traces/TracesPanel.tsx +539 -0
- package/src/console/ui/shell/panels/vault/VaultPanel.tsx +449 -0
- package/src/console/ui/shell/plugin/Sandbox.tsx +29 -0
- package/src/console/ui/shell/setup/Wizard.tsx +189 -0
- package/src/console/ui/shell/styles.css +75 -0
- package/src/console/ui/signals/SignalsA11yView.tsx +276 -0
- package/src/console/ui/signals/a11y.test.tsx +99 -0
- package/src/console/ui/signals/confirmation.test.ts +39 -0
- package/src/console/ui/signals/confirmation.ts +63 -0
- package/src/console/ui/signals/dry-run.test.ts +18 -0
- package/src/console/ui/signals/dry-run.ts +36 -0
- package/src/console/ui/signals/durable.test.ts +22 -0
- package/src/console/ui/signals/durable.ts +41 -0
- package/src/console/ui/signals/findings.ts +33 -0
- package/src/console/ui/signals/fixture.ts +242 -0
- package/src/console/ui/signals/group.test.ts +32 -0
- package/src/console/ui/signals/group.ts +49 -0
- package/src/console/ui/signals/index.ts +52 -0
- package/src/console/ui/signals/monitor.test.ts +30 -0
- package/src/console/ui/signals/monitor.ts +79 -0
- package/src/console/ui/signals/schema-form.test.ts +34 -0
- package/src/console/ui/signals/schema-form.ts +112 -0
- package/src/console/ui/signals/search.ts +102 -0
- package/src/console/ui/signals/types.ts +71 -0
- package/src/console/ui/store/StoreA11yView.tsx +199 -0
- package/src/console/ui/store/a11y.test.tsx +99 -0
- package/src/console/ui/store/cache-view.test.ts +13 -0
- package/src/console/ui/store/cache-view.ts +36 -0
- package/src/console/ui/store/confirmation.test.ts +38 -0
- package/src/console/ui/store/confirmation.ts +55 -0
- package/src/console/ui/store/dry-run.test.ts +15 -0
- package/src/console/ui/store/dry-run.ts +29 -0
- package/src/console/ui/store/fixture.ts +163 -0
- package/src/console/ui/store/group.test.ts +21 -0
- package/src/console/ui/store/group.ts +41 -0
- package/src/console/ui/store/index.ts +40 -0
- package/src/console/ui/store/search.ts +78 -0
- package/src/console/ui/store/types.ts +65 -0
- package/src/console/ui/store/will-not-fire.test.ts +19 -0
- package/src/console/ui/store/will-not-fire.ts +40 -0
- package/src/console/ui/traces/TracesA11yView.tsx +200 -0
- package/src/console/ui/traces/a11y.test.tsx +97 -0
- package/src/console/ui/traces/chain.test.ts +61 -0
- package/src/console/ui/traces/chain.ts +144 -0
- package/src/console/ui/traces/critical-path.test.ts +24 -0
- package/src/console/ui/traces/critical-path.ts +59 -0
- package/src/console/ui/traces/filter.test.ts +78 -0
- package/src/console/ui/traces/filter.ts +112 -0
- package/src/console/ui/traces/fixture.ts +126 -0
- package/src/console/ui/traces/fold.test.ts +67 -0
- package/src/console/ui/traces/fold.ts +170 -0
- package/src/console/ui/traces/index.ts +64 -0
- package/src/console/ui/traces/mini.ts +65 -0
- package/src/console/ui/traces/replay.test.ts +24 -0
- package/src/console/ui/traces/replay.ts +35 -0
- package/src/console/ui/traces/sampling.test.ts +26 -0
- package/src/console/ui/traces/sampling.ts +66 -0
- package/src/console/ui/traces/search.ts +148 -0
- package/src/console/ui/traces/tier.ts +72 -0
- package/src/console/ui/traces/types.ts +125 -0
- package/src/console/ui/tsconfig.json +20 -0
- package/src/console/ui/vault/VaultA11yView.tsx +177 -0
- package/src/console/ui/vault/a11y.test.tsx +97 -0
- package/src/console/ui/vault/blast-radius.test.ts +35 -0
- package/src/console/ui/vault/blast-radius.ts +55 -0
- package/src/console/ui/vault/confirmation.test.ts +41 -0
- package/src/console/ui/vault/confirmation.ts +39 -0
- package/src/console/ui/vault/dormant.test.ts +37 -0
- package/src/console/ui/vault/dormant.ts +28 -0
- package/src/console/ui/vault/export-safe.test.ts +30 -0
- package/src/console/ui/vault/export-safe.ts +65 -0
- package/src/console/ui/vault/fixture.ts +75 -0
- package/src/console/ui/vault/group.test.ts +25 -0
- package/src/console/ui/vault/group.ts +50 -0
- package/src/console/ui/vault/index.ts +45 -0
- package/src/console/ui/vault/search.ts +62 -0
- package/src/console/ui/vault/types.ts +57 -0
- package/src/console/ui/vite.config.ts +84 -0
- package/src/console/xss.gate.test.ts +118 -0
- package/src/docker/compose.ts +226 -0
- package/src/docker/credentials.ts +25 -0
- package/src/docker/derive.ts +83 -0
- package/src/docker/docker.test.ts +185 -0
- package/src/docker/dockerfile.integration.test.ts +170 -0
- package/src/docker/dockerfile.ts +39 -0
- package/src/docker/helpers.ts +103 -0
- package/src/docker/index.ts +52 -0
- package/src/docker/pin.ts +90 -0
- package/src/docker/recipes/index.ts +33 -0
- package/src/docker/recipes/postgres.ts +18 -0
- package/src/docker/recipes/redis.ts +18 -0
- package/src/docker/stack.integration.test.ts +140 -0
- package/src/docker/stack.ts +62 -0
- package/src/docker/types.ts +134 -0
- package/src/drivers/ai-anthropic.ts +128 -0
- package/src/drivers/ai-mock.ts +82 -0
- package/src/drivers/ai-openai-compatible.ts +139 -0
- package/src/drivers/ai-providers.test.ts +163 -0
- package/src/drivers/ai-types.ts +83 -0
- package/src/drivers/bun-native-completeness.test.ts +155 -0
- package/src/drivers/channel-console.ts +118 -0
- package/src/drivers/channel-fcm.ts +96 -0
- package/src/drivers/channel-resend.ts +27 -0
- package/src/drivers/channel-smtp.ts +33 -0
- package/src/drivers/channel-types.ts +160 -0
- package/src/drivers/channel-unifonic.ts +79 -0
- package/src/drivers/channel-wa-cloud.ts +84 -0
- package/src/drivers/channel-webpush.ts +317 -0
- package/src/drivers/conformance.test.ts +89 -0
- package/src/drivers/conformance.ts +162 -0
- package/src/drivers/fs.ts +73 -0
- package/src/drivers/index.ts +194 -0
- package/src/drivers/kv-lua.ts +222 -0
- package/src/drivers/memory.ts +472 -0
- package/src/drivers/pgvector.ts +130 -0
- package/src/drivers/postgres.ts +221 -0
- package/src/drivers/redis.ts +254 -0
- package/src/drivers/s3.ts +129 -0
- package/src/drivers/signal-engine.ts +690 -0
- package/src/drivers/signal-memory.ts +27 -0
- package/src/drivers/signal-nats.ts +131 -0
- package/src/drivers/signal-postgres.ts +1089 -0
- package/src/drivers/signal-redis.ts +275 -0
- package/src/drivers/signal-types.ts +328 -0
- package/src/drivers/sqlite.ts +53 -0
- package/src/drivers/types.ts +334 -0
- package/src/drivers/vault-dotenv-parse.ts +56 -0
- package/src/drivers/vault-env.ts +101 -0
- package/src/drivers/vault-infisical.ts +61 -0
- package/src/drivers/vault-managed.ts +42 -0
- package/src/drivers/vault-memory.ts +38 -0
- package/src/drivers/vault-openbao.ts +80 -0
- package/src/drivers/vault-sops.ts +252 -0
- package/src/drivers/vault-types.ts +84 -0
- package/src/elements/ai/declare.ts +206 -0
- package/src/elements/ai/eval.ts +113 -0
- package/src/elements/ai/pii.ts +108 -0
- package/src/elements/ai/runtime.ts +540 -0
- package/src/elements/ai/schema.ts +194 -0
- package/src/elements/ai.test.ts +393 -0
- package/src/elements/ai.ts +56 -0
- package/src/elements/channel/consent.ts +81 -0
- package/src/elements/channel/costs.test.ts +62 -0
- package/src/elements/channel/costs.ts +130 -0
- package/src/elements/channel/declare.ts +141 -0
- package/src/elements/channel/email-auth.test.ts +47 -0
- package/src/elements/channel/email-auth.ts +109 -0
- package/src/elements/channel/locale.ts +97 -0
- package/src/elements/channel/mask.test.ts +19 -0
- package/src/elements/channel/mask.ts +60 -0
- package/src/elements/channel/mime.ts +23 -0
- package/src/elements/channel/outcomes.test.ts +40 -0
- package/src/elements/channel/outcomes.ts +126 -0
- package/src/elements/channel/receipts.ts +121 -0
- package/src/elements/channel/runtime.ts +500 -0
- package/src/elements/channel/suppression.ts +136 -0
- package/src/elements/channel.test.ts +232 -0
- package/src/elements/channel.ts +109 -0
- package/src/elements/clock/actions.ts +170 -0
- package/src/elements/clock/declare.ts +58 -0
- package/src/elements/clock/dst.ts +197 -0
- package/src/elements/clock/durable.ts +140 -0
- package/src/elements/clock/duration.ts +29 -0
- package/src/elements/clock/health.test.ts +103 -0
- package/src/elements/clock/health.ts +112 -0
- package/src/elements/clock/leader.ts +127 -0
- package/src/elements/clock/reconcile.ts +241 -0
- package/src/elements/clock/runtime.ts +243 -0
- package/src/elements/clock/schedule.ts +262 -0
- package/src/elements/clock/time-travel.ts +53 -0
- package/src/elements/clock.test.ts +365 -0
- package/src/elements/clock.ts +80 -0
- package/src/elements/gate/declare.ts +134 -0
- package/src/elements/gate/permissions.ts +104 -0
- package/src/elements/gate/runtime.ts +177 -0
- package/src/elements/gate/strategies.ts +388 -0
- package/src/elements/gate.test.ts +145 -0
- package/src/elements/gate.ts +41 -0
- package/src/elements/index.ts +169 -0
- package/src/elements/signal/chaos-child.ts +47 -0
- package/src/elements/signal/declare.ts +77 -0
- package/src/elements/signal/dry-run-replay.test.ts +95 -0
- package/src/elements/signal/dry-run-write-isolation.test.ts +94 -0
- package/src/elements/signal/reconcile.test.ts +23 -0
- package/src/elements/signal/reconcile.ts +122 -0
- package/src/elements/signal/runtime.ts +94 -0
- package/src/elements/signal.test.ts +457 -0
- package/src/elements/signal.ts +26 -0
- package/src/elements/store/cache.ts +197 -0
- package/src/elements/store/classify.ts +125 -0
- package/src/elements/store/declare.ts +200 -0
- package/src/elements/store/files-policy.test.ts +31 -0
- package/src/elements/store/files-policy.ts +70 -0
- package/src/elements/store/replica.ts +68 -0
- package/src/elements/store/runtime.ts +393 -0
- package/src/elements/store/sql-condition.ts +205 -0
- package/src/elements/store/sql-session.ts +579 -0
- package/src/elements/store/table.ts +282 -0
- package/src/elements/store.test.ts +370 -0
- package/src/elements/store.ts +99 -0
- package/src/elements/vault/declare.ts +143 -0
- package/src/elements/vault/fingerprint.ts +30 -0
- package/src/elements/vault/redact.ts +52 -0
- package/src/elements/vault/runtime.ts +461 -0
- package/src/elements/vault.test.ts +296 -0
- package/src/elements/vault.ts +44 -0
- package/src/index.ts +183 -0
- package/src/kernel/adopt-routes.ts +194 -0
- package/src/kernel/app.ts +1068 -0
- package/src/kernel/auth-resolve.ts +93 -0
- package/src/kernel/boot.test.ts +173 -0
- package/src/kernel/boot.ts +439 -0
- package/src/kernel/budget-entry.ts +55 -0
- package/src/kernel/budget.test.ts +19 -0
- package/src/kernel/call.test.ts +83 -0
- package/src/kernel/capability.ts +113 -0
- package/src/kernel/dry-run.test.ts +64 -0
- package/src/kernel/dry-run.ts +171 -0
- package/src/kernel/effects.test.ts +89 -0
- package/src/kernel/effects.ts +140 -0
- package/src/kernel/errors.registry.test.ts +39 -0
- package/src/kernel/errors.ts +225 -0
- package/src/kernel/flow.test.ts +154 -0
- package/src/kernel/flow.ts +290 -0
- package/src/kernel/fx.test.ts +245 -0
- package/src/kernel/fx.ts +996 -0
- package/src/kernel/hook-timing.test.ts +72 -0
- package/src/kernel/hook-timing.ts +190 -0
- package/src/kernel/hooks.test.ts +181 -0
- package/src/kernel/hooks.ts +275 -0
- package/src/kernel/index.ts +278 -0
- package/src/kernel/journal.ts +405 -0
- package/src/kernel/journey.ts +75 -0
- package/src/kernel/on.ts +74 -0
- package/src/kernel/pipeline.test.ts +349 -0
- package/src/kernel/pipeline.ts +245 -0
- package/src/kernel/plug.ts +82 -0
- package/src/kernel/plugin/capabilities.test.ts +84 -0
- package/src/kernel/plugin/conflicts.test.ts +106 -0
- package/src/kernel/plugin/decorate.test.ts +111 -0
- package/src/kernel/plugin/scoping.test.ts +138 -0
- package/src/kernel/plugin.ts +485 -0
- package/src/kernel/rate-limit.ts +25 -0
- package/src/kernel/registry.ts +398 -0
- package/src/kernel/router.test.ts +114 -0
- package/src/kernel/router.ts +556 -0
- package/src/kernel/routing-budget.test.ts +19 -0
- package/src/kernel/run-telemetry.ts +70 -0
- package/src/kernel/triggers.ts +324 -0
- package/src/kernel/unit.ts +88 -0
- package/src/manifest/diff.test.ts +866 -0
- package/src/manifest/diff.ts +1670 -0
- package/src/manifest/fixtures/base.manifest.json +112 -0
- package/src/manifest/fixtures/skyport.excerpt.json +51 -0
- package/src/manifest/fixtures/skyport.manifest.json +153 -0
- package/src/manifest/index.ts +27 -0
- package/src/manifest/types.ts +358 -0
- package/src/manifest/undeclared.test.ts +82 -0
- package/src/manifest/undeclared.ts +65 -0
- package/src/manifest/validate.test.ts +105 -0
- package/src/manifest/validate.ts +174 -0
- package/src/mcp/authorization.ts +340 -0
- package/src/mcp/confirmation.ts +174 -0
- package/src/mcp/data.ts +90 -0
- package/src/mcp/index.ts +80 -0
- package/src/mcp/injection.gate.test.ts +176 -0
- package/src/mcp/mcp.test.ts +348 -0
- package/src/mcp/protocol.ts +172 -0
- package/src/mcp/server.ts +283 -0
- package/src/mcp/session.ts +139 -0
- package/src/mcp/tools.ts +391 -0
- package/src/plugins/catalogue.test.ts +48 -0
- package/src/plugins/catalogue.ts +113 -0
- package/src/plugins/node-import-scan.test.ts +28 -0
- package/src/plugins/node-import-scan.ts +98 -0
- package/src/plugins/supply-chain.test.ts +48 -0
- package/src/plugins/supply-chain.ts +460 -0
- package/src/release/index.ts +30 -0
- package/src/release/limits.ts +20 -0
- package/src/release/measure.ts +443 -0
- package/src/release/publish.ts +56 -0
- package/src/runs/bench.test.ts +93 -0
- package/src/runs/collect.ts +144 -0
- package/src/runs/drivers/clickhouse.ts +108 -0
- package/src/runs/drivers/files.ts +201 -0
- package/src/runs/drivers/memory.ts +94 -0
- package/src/runs/drivers/postgres.ts +110 -0
- package/src/runs/duckdb.ts +99 -0
- package/src/runs/index.ts +82 -0
- package/src/runs/outlier.ts +180 -0
- package/src/runs/parquet.ts +210 -0
- package/src/runs/privacy.ts +49 -0
- package/src/runs/runs.test.ts +324 -0
- package/src/runs/runtime.ts +229 -0
- package/src/runs/shred.ts +243 -0
- package/src/runs/telemetry.ts +10 -0
- package/src/runs/types.ts +179 -0
- package/src/runtime/bun.ts +140 -0
- package/src/runtime/cold-start.bench.ts +20 -0
- package/src/runtime/index.ts +46 -0
- package/src/runtime/primitives.ts +242 -0
- package/src/runtime/security.test.ts +170 -0
- package/src/runtime/security.ts +168 -0
- package/src/runtime/serve.test.ts +223 -0
- package/src/runtime/types.ts +217 -0
- package/src/runtime/web-standard.ts +77 -0
- package/src/test/create-test-app.test.ts +161 -0
- package/src/test/create-test-app.ts +533 -0
- package/src/test/index.ts +21 -0
- package/src/test/provisions.integration.test.ts +174 -0
- package/src/upgrade/codemods.test.ts +58 -0
- package/src/upgrade/codemods.ts +83 -0
- package/src/validation/index.ts +23 -0
- package/src/validation/standard-schema.test.ts +96 -0
- package/src/validation/standard-schema.ts +316 -0
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Overview panel domain types (console §9.16).
|
|
3
|
+
*
|
|
4
|
+
* Pure aggregator — every finding originates in another panel.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { DiffCategory } from "../diff/types.ts";
|
|
8
|
+
|
|
9
|
+
/** Panel that produced a finding. */
|
|
10
|
+
export type FindingSource =
|
|
11
|
+
| "gates"
|
|
12
|
+
| "signals"
|
|
13
|
+
| "clock"
|
|
14
|
+
| "vault"
|
|
15
|
+
| "channels"
|
|
16
|
+
| "architecture"
|
|
17
|
+
| "plugins"
|
|
18
|
+
| "ai"
|
|
19
|
+
| "access";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* One ranked finding in the Overview union.
|
|
23
|
+
*
|
|
24
|
+
* Ranking keys: user harm → irreversibility → trend (higher = worse).
|
|
25
|
+
*/
|
|
26
|
+
export interface OverviewFinding {
|
|
27
|
+
readonly id: string;
|
|
28
|
+
readonly source: FindingSource;
|
|
29
|
+
readonly title: string;
|
|
30
|
+
readonly detail: string;
|
|
31
|
+
readonly href: string;
|
|
32
|
+
readonly userHarm: number;
|
|
33
|
+
readonly irreversibility: number;
|
|
34
|
+
readonly trend: number;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Flow- or journey-level SLO with live burn. */
|
|
38
|
+
export interface SloBurn {
|
|
39
|
+
readonly id: string;
|
|
40
|
+
readonly kind: "flow" | "journey";
|
|
41
|
+
readonly name: string;
|
|
42
|
+
/** Declared availability string from the Manifest (e.g. `99.9%`). */
|
|
43
|
+
readonly availability: string;
|
|
44
|
+
/** Tolerable error rate derived from availability (never invented). */
|
|
45
|
+
readonly tolerableErrorRate: number;
|
|
46
|
+
/** Current error rate from real Runs. */
|
|
47
|
+
readonly currentErrorRate: number;
|
|
48
|
+
/** `currentErrorRate / tolerableErrorRate`. */
|
|
49
|
+
readonly burnRate: number;
|
|
50
|
+
/** Remaining error-budget fraction in the long window (0–1). */
|
|
51
|
+
readonly remainingBudgetFraction: number;
|
|
52
|
+
/** Projected ms until budget exhaustion, or null when not burning. */
|
|
53
|
+
readonly timeToExhaustionMs: number | null;
|
|
54
|
+
/** True when burn rate never reached 1× in the last 90 days. */
|
|
55
|
+
readonly ceremonial: boolean;
|
|
56
|
+
/** Last epoch-ms when burn rate ≥ 1, or null. */
|
|
57
|
+
readonly lastBurnAt: number | null;
|
|
58
|
+
readonly sampleCount: number;
|
|
59
|
+
readonly errorCount: number;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Cost budget in the same visual model as the error budget. */
|
|
63
|
+
export interface CostBudget {
|
|
64
|
+
readonly id: string;
|
|
65
|
+
readonly name: string;
|
|
66
|
+
readonly kind: "flow" | "ai-prompt" | "ai-agent";
|
|
67
|
+
/** Declared budget (USD) for the window. */
|
|
68
|
+
readonly declaredBudget: number;
|
|
69
|
+
/** Actual spend in the window from Runs / AI. */
|
|
70
|
+
readonly spent: number;
|
|
71
|
+
/** Spend rate ÷ budget rate (1 = on pace to exhaust exactly at window end). */
|
|
72
|
+
readonly burnRate: number;
|
|
73
|
+
readonly remainingFraction: number;
|
|
74
|
+
readonly timeToExhaustionMs: number | null;
|
|
75
|
+
readonly windowMs: number;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Classic golden signals from the Runs store. */
|
|
79
|
+
export interface GoldenSignals {
|
|
80
|
+
readonly latencyP99Ms: number;
|
|
81
|
+
readonly trafficPerMin: number;
|
|
82
|
+
readonly errorRate: number;
|
|
83
|
+
/** Fraction of recent runs with elevated replica lag or cache miss pressure. */
|
|
84
|
+
readonly saturation: number;
|
|
85
|
+
readonly sampleCount: number;
|
|
86
|
+
readonly windowMs: number;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Linked Manifest Diff summary — not recomputed. */
|
|
90
|
+
export interface WhatChanged {
|
|
91
|
+
readonly hasBaseline: boolean;
|
|
92
|
+
readonly severity: DiffCategory | null;
|
|
93
|
+
readonly changeCount: number;
|
|
94
|
+
readonly line: string;
|
|
95
|
+
readonly href: string;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Day-one invitation when no SLOs are declared. */
|
|
99
|
+
export interface FirstSloInvite {
|
|
100
|
+
readonly busiestFlow: string;
|
|
101
|
+
readonly runCount: number;
|
|
102
|
+
readonly href: string;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** One-line plain-language health verdict. */
|
|
106
|
+
export interface OverviewVerdict {
|
|
107
|
+
readonly line: string;
|
|
108
|
+
readonly tone: "ok" | "warn" | "critical" | "empty";
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/** Fully composed Overview projection. */
|
|
112
|
+
export interface OverviewView {
|
|
113
|
+
readonly verdict: OverviewVerdict;
|
|
114
|
+
readonly slos: readonly SloBurn[];
|
|
115
|
+
readonly costBudgets: readonly CostBudget[];
|
|
116
|
+
readonly whatChanged: WhatChanged;
|
|
117
|
+
readonly findings: readonly OverviewFinding[];
|
|
118
|
+
readonly golden: GoldenSignals;
|
|
119
|
+
readonly firstSloInvite: FirstSloInvite | null;
|
|
120
|
+
readonly hasDeclaredSlos: boolean;
|
|
121
|
+
}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One-line plain-language Overview verdict (console §9.16).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type {
|
|
6
|
+
CostBudget,
|
|
7
|
+
OverviewFinding,
|
|
8
|
+
OverviewVerdict,
|
|
9
|
+
SloBurn,
|
|
10
|
+
} from "./types.ts";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Build the top verdict from SLO burn, cost budgets, and ranked findings.
|
|
14
|
+
*
|
|
15
|
+
* @param options - Live burn + findings
|
|
16
|
+
*/
|
|
17
|
+
export function composeVerdict(options: {
|
|
18
|
+
readonly hasDeclaredSlos: boolean;
|
|
19
|
+
readonly slos: readonly SloBurn[];
|
|
20
|
+
readonly costBudgets: readonly CostBudget[];
|
|
21
|
+
readonly findings: readonly OverviewFinding[];
|
|
22
|
+
}): OverviewVerdict {
|
|
23
|
+
const { hasDeclaredSlos, slos, costBudgets, findings } = options;
|
|
24
|
+
|
|
25
|
+
const burning = slos
|
|
26
|
+
.filter((s) => s.burnRate >= 1 && !s.ceremonial)
|
|
27
|
+
.sort(
|
|
28
|
+
(a, b) =>
|
|
29
|
+
b.burnRate - a.burnRate ||
|
|
30
|
+
(a.timeToExhaustionMs ?? Infinity) -
|
|
31
|
+
(b.timeToExhaustionMs ?? Infinity),
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
if (burning.length > 0) {
|
|
35
|
+
const top = burning[0]!;
|
|
36
|
+
const tte = formatExhaustion(top.timeToExhaustionMs);
|
|
37
|
+
const plural =
|
|
38
|
+
burning.length === 1
|
|
39
|
+
? "one objective is burning fast"
|
|
40
|
+
: `${burning.length} objectives are burning`;
|
|
41
|
+
return {
|
|
42
|
+
tone: top.burnRate >= 6 ? "critical" : "warn",
|
|
43
|
+
line: `${plural} — ${top.name} will exhaust its budget ${tte}`,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const costBurning = costBudgets
|
|
48
|
+
.filter((c) => c.burnRate >= 1)
|
|
49
|
+
.sort(
|
|
50
|
+
(a, b) =>
|
|
51
|
+
b.burnRate - a.burnRate ||
|
|
52
|
+
(a.timeToExhaustionMs ?? Infinity) -
|
|
53
|
+
(b.timeToExhaustionMs ?? Infinity),
|
|
54
|
+
);
|
|
55
|
+
if (costBurning.length > 0) {
|
|
56
|
+
const top = costBurning[0]!;
|
|
57
|
+
return {
|
|
58
|
+
tone: "warn",
|
|
59
|
+
line: `cost budget burning — ${top.name} will exhaust ${formatExhaustion(top.timeToExhaustionMs)}`,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
if (findings.length > 0) {
|
|
64
|
+
const top = findings[0]!;
|
|
65
|
+
return {
|
|
66
|
+
tone: top.userHarm >= 90 ? "critical" : "warn",
|
|
67
|
+
line: `${top.title.toLowerCase()}: ${top.detail}`,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
if (!hasDeclaredSlos) {
|
|
72
|
+
return {
|
|
73
|
+
tone: "empty",
|
|
74
|
+
line: "no objectives declared yet — findings and golden signals below; declare a first SLO on your busiest flow",
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const ceremonial = slos.filter((s) => s.ceremonial);
|
|
79
|
+
if (ceremonial.length === slos.length && slos.length > 0) {
|
|
80
|
+
return {
|
|
81
|
+
tone: "ok",
|
|
82
|
+
line: `all ${slos.length} objective${slos.length === 1 ? "" : "s"} within budget — ${ceremonial.length} marked ceremonial (no burn in 90 days)`,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return {
|
|
87
|
+
tone: "ok",
|
|
88
|
+
line: "all objectives within budget — no burning SLOs",
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Format time-to-exhaustion for the verdict line.
|
|
94
|
+
*
|
|
95
|
+
* @param ms - Milliseconds, or null
|
|
96
|
+
*/
|
|
97
|
+
export function formatExhaustion(ms: number | null): string {
|
|
98
|
+
if (ms == null) return "if the current burn continues";
|
|
99
|
+
if (ms <= 0) return "now";
|
|
100
|
+
const days = ms / 86_400_000;
|
|
101
|
+
if (days >= 2) return `in ${Math.round(days)} days`;
|
|
102
|
+
if (days >= 1) return "in 1 day";
|
|
103
|
+
const hours = ms / 3_600_000;
|
|
104
|
+
if (hours >= 2) return `in ${Math.round(hours)} hours`;
|
|
105
|
+
if (hours >= 1) return "in 1 hour";
|
|
106
|
+
const mins = Math.max(1, Math.round(ms / 60_000));
|
|
107
|
+
return `in ${mins} minute${mins === 1 ? "" : "s"}`;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Format a burn rate for display (e.g. `2.4×`).
|
|
112
|
+
*
|
|
113
|
+
* @param burnRate - Ratio
|
|
114
|
+
*/
|
|
115
|
+
export function formatBurnRate(burnRate: number): string {
|
|
116
|
+
if (!Number.isFinite(burnRate)) return "∞×";
|
|
117
|
+
if (burnRate >= 10) return `${burnRate.toFixed(0)}×`;
|
|
118
|
+
if (burnRate >= 1) return `${burnRate.toFixed(1)}×`;
|
|
119
|
+
return `${burnRate.toFixed(2)}×`;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Format a duration for budget strips.
|
|
124
|
+
*
|
|
125
|
+
* @param ms - Milliseconds, or null
|
|
126
|
+
*/
|
|
127
|
+
export function formatBudgetDuration(ms: number | null): string {
|
|
128
|
+
if (ms == null) return "—";
|
|
129
|
+
if (ms <= 0) return "exhausted";
|
|
130
|
+
return formatExhaustion(ms).replace(/^in /, "");
|
|
131
|
+
}
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Static Plugins markup for the axe gate — same landmarks / roles as the
|
|
3
|
+
* live panel (console §9.15).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { copyCommandLabel, copyableCommand } from "./command.ts";
|
|
7
|
+
import { PLUGINS_LIST_FIXTURE } from "./fixture.ts";
|
|
8
|
+
import { groupPlugins } from "./group.ts";
|
|
9
|
+
|
|
10
|
+
/** Props for {@link PluginsA11yView}. */
|
|
11
|
+
export interface PluginsA11yViewProps {
|
|
12
|
+
/** Plugin to open in detail. */
|
|
13
|
+
readonly openPlugin?: string;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Accessible Plugins list + detail for CI.
|
|
18
|
+
*
|
|
19
|
+
* @param props - Open plugin
|
|
20
|
+
*/
|
|
21
|
+
export function PluginsA11yView(props: PluginsA11yViewProps) {
|
|
22
|
+
const list = PLUGINS_LIST_FIXTURE;
|
|
23
|
+
const openId = props.openPlugin ?? "auth";
|
|
24
|
+
const open = list.plugins.find((p) => p.id === openId) ?? list.plugins[0]!;
|
|
25
|
+
const groups = groupPlugins(list.plugins, {});
|
|
26
|
+
const command = copyableCommand(open);
|
|
27
|
+
|
|
28
|
+
return (
|
|
29
|
+
<div className="plugins-a11y">
|
|
30
|
+
<a href="#plugins-main">Skip to main content</a>
|
|
31
|
+
<header>
|
|
32
|
+
<h1>Plugins</h1>
|
|
33
|
+
<p>
|
|
34
|
+
Origin × state — CORE stays listed when off; local/community only when
|
|
35
|
+
plugged. Read-only; git review is the approval.
|
|
36
|
+
</p>
|
|
37
|
+
<label>
|
|
38
|
+
Filter plugins
|
|
39
|
+
<input aria-label="Filter plugins" defaultValue="" />
|
|
40
|
+
</label>
|
|
41
|
+
<fieldset>
|
|
42
|
+
<legend>Origin</legend>
|
|
43
|
+
<label>
|
|
44
|
+
<input type="radio" name="origin" value="" defaultChecked /> All
|
|
45
|
+
</label>
|
|
46
|
+
<label>
|
|
47
|
+
<input type="radio" name="origin" value="core" /> Core
|
|
48
|
+
</label>
|
|
49
|
+
<label>
|
|
50
|
+
<input type="radio" name="origin" value="local" /> Local
|
|
51
|
+
</label>
|
|
52
|
+
<label>
|
|
53
|
+
<input type="radio" name="origin" value="community" /> Community
|
|
54
|
+
</label>
|
|
55
|
+
</fieldset>
|
|
56
|
+
<fieldset>
|
|
57
|
+
<legend>State</legend>
|
|
58
|
+
<label>
|
|
59
|
+
<input type="radio" name="state" value="" defaultChecked /> All
|
|
60
|
+
</label>
|
|
61
|
+
<label>
|
|
62
|
+
<input type="radio" name="state" value="on" /> On
|
|
63
|
+
</label>
|
|
64
|
+
<label>
|
|
65
|
+
<input type="radio" name="state" value="off" /> Off
|
|
66
|
+
</label>
|
|
67
|
+
</fieldset>
|
|
68
|
+
</header>
|
|
69
|
+
<main id="plugins-main">
|
|
70
|
+
<section aria-label="Plugins by origin">
|
|
71
|
+
<h2>Catalogue</h2>
|
|
72
|
+
{groups.map((g) => (
|
|
73
|
+
<section key={g.id} aria-label={g.label}>
|
|
74
|
+
<h3>{g.label}</h3>
|
|
75
|
+
<ul>
|
|
76
|
+
{g.items.map((p) => (
|
|
77
|
+
<li key={p.id}>
|
|
78
|
+
<button
|
|
79
|
+
type="button"
|
|
80
|
+
aria-pressed={p.id === open.id}
|
|
81
|
+
style={{ minHeight: 32, width: "100%" }}
|
|
82
|
+
>
|
|
83
|
+
<span>{p.id}</span>
|
|
84
|
+
<span> {p.state}</span>
|
|
85
|
+
<span> {p.origin}</span>
|
|
86
|
+
</button>
|
|
87
|
+
</li>
|
|
88
|
+
))}
|
|
89
|
+
</ul>
|
|
90
|
+
</section>
|
|
91
|
+
))}
|
|
92
|
+
</section>
|
|
93
|
+
|
|
94
|
+
<section aria-label="Plugin detail" aria-live="polite">
|
|
95
|
+
<h2>
|
|
96
|
+
{open.id}{" "}
|
|
97
|
+
<span>
|
|
98
|
+
({open.origin} · {open.state})
|
|
99
|
+
</span>
|
|
100
|
+
</h2>
|
|
101
|
+
{open.summary ? <p>{open.summary}</p> : null}
|
|
102
|
+
{open.version ? <p>Version {open.version}</p> : null}
|
|
103
|
+
|
|
104
|
+
<section aria-label="Declares">
|
|
105
|
+
<h3>Declares</h3>
|
|
106
|
+
<p>Boot-time — schema, elements, drivers, panels, CLI</p>
|
|
107
|
+
{open.declares.length === 0 ? (
|
|
108
|
+
<p>None</p>
|
|
109
|
+
) : (
|
|
110
|
+
<ul>
|
|
111
|
+
{open.declares.map((d) => (
|
|
112
|
+
<li key={d}>{d}</li>
|
|
113
|
+
))}
|
|
114
|
+
</ul>
|
|
115
|
+
)}
|
|
116
|
+
</section>
|
|
117
|
+
|
|
118
|
+
<section aria-label="Intercepts">
|
|
119
|
+
<h3>Intercepts</h3>
|
|
120
|
+
<p>Per-request hooks with measured cost</p>
|
|
121
|
+
{open.intercepts.length === 0 ? (
|
|
122
|
+
<p>None</p>
|
|
123
|
+
) : (
|
|
124
|
+
<table>
|
|
125
|
+
<caption>Hook stages and measured mean cost</caption>
|
|
126
|
+
<thead>
|
|
127
|
+
<tr>
|
|
128
|
+
<th scope="col">Stage</th>
|
|
129
|
+
<th scope="col">Mean ms</th>
|
|
130
|
+
<th scope="col">Samples</th>
|
|
131
|
+
</tr>
|
|
132
|
+
</thead>
|
|
133
|
+
<tbody>
|
|
134
|
+
{open.intercepts.map((i) => (
|
|
135
|
+
<tr key={i.stage}>
|
|
136
|
+
<th scope="row">{i.stage}</th>
|
|
137
|
+
<td>
|
|
138
|
+
{i.meanMs === null ? "—" : i.meanMs.toFixed(2)}
|
|
139
|
+
</td>
|
|
140
|
+
<td>{i.count}</td>
|
|
141
|
+
</tr>
|
|
142
|
+
))}
|
|
143
|
+
</tbody>
|
|
144
|
+
</table>
|
|
145
|
+
)}
|
|
146
|
+
{open.hookCost ? (
|
|
147
|
+
<p role="status">
|
|
148
|
+
p50 {open.hookCost.p50Ms.toFixed(2)} ms · p95{" "}
|
|
149
|
+
{open.hookCost.p95Ms.toFixed(2)} ms · n={open.hookCost.count}
|
|
150
|
+
</p>
|
|
151
|
+
) : null}
|
|
152
|
+
</section>
|
|
153
|
+
|
|
154
|
+
<section aria-label="Supply chain">
|
|
155
|
+
<h3>Supply chain</h3>
|
|
156
|
+
<ul>
|
|
157
|
+
<li>
|
|
158
|
+
Lifecycle scripts: {open.supplyChain.lifecycleScripts.state} —{" "}
|
|
159
|
+
{open.supplyChain.lifecycleScripts.detail}
|
|
160
|
+
</li>
|
|
161
|
+
<li>
|
|
162
|
+
Release cooldown: {open.supplyChain.releaseCooldown.state} —{" "}
|
|
163
|
+
{open.supplyChain.releaseCooldown.detail}
|
|
164
|
+
</li>
|
|
165
|
+
<li>
|
|
166
|
+
node: scan: {open.supplyChain.nodeImportScan.state} —{" "}
|
|
167
|
+
{open.supplyChain.nodeImportScan.detail}
|
|
168
|
+
</li>
|
|
169
|
+
<li>
|
|
170
|
+
npm provenance: {open.supplyChain.npmProvenance.state} —{" "}
|
|
171
|
+
{open.supplyChain.npmProvenance.detail}
|
|
172
|
+
</li>
|
|
173
|
+
<li>
|
|
174
|
+
Boot conflicts: {open.supplyChain.bootConflicts.state} —{" "}
|
|
175
|
+
{open.supplyChain.bootConflicts.detail}
|
|
176
|
+
</li>
|
|
177
|
+
</ul>
|
|
178
|
+
</section>
|
|
179
|
+
|
|
180
|
+
<section aria-label="Capability diff">
|
|
181
|
+
<h3>Capability diff</h3>
|
|
182
|
+
<p>
|
|
183
|
+
From git merge-base via <code>diffManifest</code> (same as{" "}
|
|
184
|
+
<code>oke doctor --diff</code>)
|
|
185
|
+
</p>
|
|
186
|
+
{open.capabilityDiff.length === 0 ? (
|
|
187
|
+
<p>No pending capability changes for this plugin</p>
|
|
188
|
+
) : (
|
|
189
|
+
<ul>
|
|
190
|
+
{open.capabilityDiff.map((c) => (
|
|
191
|
+
<li key={c.path}>
|
|
192
|
+
<a href={`/manifest-diff?path=${encodeURIComponent(c.path)}`}>
|
|
193
|
+
{c.summary}
|
|
194
|
+
</a>
|
|
195
|
+
</li>
|
|
196
|
+
))}
|
|
197
|
+
</ul>
|
|
198
|
+
)}
|
|
199
|
+
</section>
|
|
200
|
+
|
|
201
|
+
<section aria-label="Install command">
|
|
202
|
+
<h3>Command</h3>
|
|
203
|
+
{command ? (
|
|
204
|
+
<>
|
|
205
|
+
<pre>
|
|
206
|
+
<code>{command}</code>
|
|
207
|
+
</pre>
|
|
208
|
+
<button type="button" style={{ minHeight: 32 }}>
|
|
209
|
+
{copyCommandLabel(open)}
|
|
210
|
+
</button>
|
|
211
|
+
<p>
|
|
212
|
+
The Console never installs. Git review is the approval — run
|
|
213
|
+
this yourself.
|
|
214
|
+
</p>
|
|
215
|
+
</>
|
|
216
|
+
) : (
|
|
217
|
+
<p>
|
|
218
|
+
No install command — toggle off by removing the code line, not
|
|
219
|
+
from this UI.
|
|
220
|
+
</p>
|
|
221
|
+
)}
|
|
222
|
+
</section>
|
|
223
|
+
</section>
|
|
224
|
+
</main>
|
|
225
|
+
</div>
|
|
226
|
+
);
|
|
227
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Accessibility gate — axe reports zero violations at WCAG 2.2 AA
|
|
3
|
+
* (console §7.5 · §9.15).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
7
|
+
import axe from "axe-core";
|
|
8
|
+
import { Window } from "happy-dom";
|
|
9
|
+
import { createRoot, type Root } from "react-dom/client";
|
|
10
|
+
import { act } from "react";
|
|
11
|
+
import { PluginsA11yView } from "./PluginsA11yView.tsx";
|
|
12
|
+
|
|
13
|
+
describe("Plugins panel accessibility", () => {
|
|
14
|
+
let window: Window;
|
|
15
|
+
let root: Root;
|
|
16
|
+
let container: HTMLElement;
|
|
17
|
+
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT =
|
|
20
|
+
true;
|
|
21
|
+
window = new Window({ url: "http://console.test/plugins" });
|
|
22
|
+
Object.defineProperty(globalThis, "window", {
|
|
23
|
+
value: window,
|
|
24
|
+
configurable: true,
|
|
25
|
+
writable: true,
|
|
26
|
+
});
|
|
27
|
+
Object.defineProperty(globalThis, "document", {
|
|
28
|
+
value: window.document,
|
|
29
|
+
configurable: true,
|
|
30
|
+
writable: true,
|
|
31
|
+
});
|
|
32
|
+
Object.defineProperty(globalThis, "HTMLElement", {
|
|
33
|
+
value: window.HTMLElement,
|
|
34
|
+
configurable: true,
|
|
35
|
+
writable: true,
|
|
36
|
+
});
|
|
37
|
+
Object.defineProperty(globalThis, "Node", {
|
|
38
|
+
value: window.Node,
|
|
39
|
+
configurable: true,
|
|
40
|
+
writable: true,
|
|
41
|
+
});
|
|
42
|
+
Object.defineProperty(globalThis, "navigator", {
|
|
43
|
+
value: window.navigator,
|
|
44
|
+
configurable: true,
|
|
45
|
+
writable: true,
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(globalThis, "getComputedStyle", {
|
|
48
|
+
value: window.getComputedStyle.bind(window),
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
});
|
|
52
|
+
Object.defineProperty(globalThis, "requestAnimationFrame", {
|
|
53
|
+
value: (cb: FrameRequestCallback) => window.setTimeout(cb, 0),
|
|
54
|
+
configurable: true,
|
|
55
|
+
writable: true,
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
container = document.createElement("div");
|
|
59
|
+
document.body.appendChild(container);
|
|
60
|
+
root = createRoot(container);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
afterEach(() => {
|
|
64
|
+
act(() => {
|
|
65
|
+
root.unmount();
|
|
66
|
+
});
|
|
67
|
+
container.remove();
|
|
68
|
+
window.close();
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("axe reports zero violations at WCAG 2.2 AA", async () => {
|
|
72
|
+
await act(async () => {
|
|
73
|
+
root.render(<PluginsA11yView openPlugin="auth" />);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
await new Promise((r) => setTimeout(r, 10));
|
|
77
|
+
|
|
78
|
+
const results = await axe.run(container, {
|
|
79
|
+
runOnly: {
|
|
80
|
+
type: "tag",
|
|
81
|
+
values: ["wcag2a", "wcag2aa", "wcag22aa"],
|
|
82
|
+
},
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
if (results.violations.length > 0) {
|
|
86
|
+
const summary = results.violations
|
|
87
|
+
.map(
|
|
88
|
+
(v) =>
|
|
89
|
+
`${v.id}: ${v.help} (${v.nodes.length} nodes) — ${v.nodes.map((n) => n.html).join("; ")}`,
|
|
90
|
+
)
|
|
91
|
+
.join("\n");
|
|
92
|
+
console.error(summary);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
expect(results.violations).toEqual([]);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyable command — never an install button affordance.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, expect, test } from "bun:test";
|
|
6
|
+
import { copyCommandLabel, copyableCommand } from "./command.ts";
|
|
7
|
+
import { PLUGINS_LIST_FIXTURE } from "./fixture.ts";
|
|
8
|
+
|
|
9
|
+
describe("copyableCommand", () => {
|
|
10
|
+
test("community hands bun add; core off hands enable hint", () => {
|
|
11
|
+
const community = PLUGINS_LIST_FIXTURE.plugins.find((p) => p.id === "oke-slack")!;
|
|
12
|
+
expect(copyableCommand(community)).toBe("bun add oke-slack");
|
|
13
|
+
expect(copyCommandLabel(community)).toBe("Copy bun add command");
|
|
14
|
+
|
|
15
|
+
const rate = PLUGINS_LIST_FIXTURE.plugins.find((p) => p.id === "rate-limit")!;
|
|
16
|
+
expect(copyableCommand(rate)).toContain("rateLimit");
|
|
17
|
+
expect(copyCommandLabel(rate)).toBe("Copy enable hint");
|
|
18
|
+
|
|
19
|
+
const auth = PLUGINS_LIST_FIXTURE.plugins.find((p) => p.id === "auth")!;
|
|
20
|
+
expect(copyableCommand(auth)).toBeNull();
|
|
21
|
+
});
|
|
22
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyable install / enable commands — Console never installs (console §9.15).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import type { PluginRecord } from "./types.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Command or hint to show for a plugin (copy only — no approve/install).
|
|
9
|
+
*
|
|
10
|
+
* @param plugin - Row
|
|
11
|
+
*/
|
|
12
|
+
export function copyableCommand(plugin: PluginRecord): string | null {
|
|
13
|
+
if (plugin.installCommand) return plugin.installCommand;
|
|
14
|
+
if (plugin.enableHint) return plugin.enableHint;
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Label for the copy control.
|
|
20
|
+
*
|
|
21
|
+
* @param plugin - Row
|
|
22
|
+
*/
|
|
23
|
+
export function copyCommandLabel(plugin: PluginRecord): string {
|
|
24
|
+
if (plugin.installCommand) return "Copy bun add command";
|
|
25
|
+
if (plugin.enableHint) return "Copy enable hint";
|
|
26
|
+
return "No command";
|
|
27
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Plugin capability-widening findings (console §9.15 · §9.16).
|
|
3
|
+
*
|
|
4
|
+
* Classification comes from Manifest Diff (`diffManifest` → permission-widening
|
|
5
|
+
* on `/plugins/…`). This module only selects those rows — no re-derivation.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { DiffChangeRecord } from "../diff/types.ts";
|
|
9
|
+
|
|
10
|
+
/** One plugin capability widening from Diff. */
|
|
11
|
+
export interface PluginCapabilityFinding {
|
|
12
|
+
readonly path: string;
|
|
13
|
+
readonly summary: string;
|
|
14
|
+
readonly kind: DiffChangeRecord["kind"];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Plugin capability widenings from a Manifest Diff projection.
|
|
19
|
+
*
|
|
20
|
+
* @param changes - Diff panel change rows (already classified)
|
|
21
|
+
*/
|
|
22
|
+
export function pluginCapabilityFindings(
|
|
23
|
+
changes: readonly DiffChangeRecord[],
|
|
24
|
+
): readonly PluginCapabilityFinding[] {
|
|
25
|
+
return changes
|
|
26
|
+
.filter(
|
|
27
|
+
(c) =>
|
|
28
|
+
c.category === "permission-widening" &&
|
|
29
|
+
(c.path.startsWith("/plugins/") ||
|
|
30
|
+
c.path.startsWith("/plugins") ||
|
|
31
|
+
c.summary.toLowerCase().includes("plugin")),
|
|
32
|
+
)
|
|
33
|
+
.map((c) => ({
|
|
34
|
+
path: c.path,
|
|
35
|
+
summary: c.summary,
|
|
36
|
+
kind: c.kind,
|
|
37
|
+
}))
|
|
38
|
+
.sort((a, b) => a.path.localeCompare(b.path));
|
|
39
|
+
}
|