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,429 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console Plugins panel projection (console §9.15).
|
|
3
|
+
*
|
|
4
|
+
* Read-only: origin × state, declares vs intercepts (with measured hook cost),
|
|
5
|
+
* supply-chain signals, capability diff via doctor merge-base `diffManifest`.
|
|
6
|
+
* Never installs — hands a `bun add …` command for community packages.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { runDoctorDiff } from "../../cli/doctor-diff.ts";
|
|
10
|
+
import {
|
|
11
|
+
allHookCostSummaries,
|
|
12
|
+
type HookCostSummary,
|
|
13
|
+
} from "../../kernel/hook-timing.ts";
|
|
14
|
+
import type { PluginRegistry } from "../../kernel/registry.ts";
|
|
15
|
+
import type {
|
|
16
|
+
Manifest,
|
|
17
|
+
ManifestChange,
|
|
18
|
+
Plugin,
|
|
19
|
+
PluginOrigin,
|
|
20
|
+
} from "../../manifest/types.ts";
|
|
21
|
+
import {
|
|
22
|
+
CORE_PLUGINS,
|
|
23
|
+
isCorePluginOn,
|
|
24
|
+
type PluginConfigProbe,
|
|
25
|
+
} from "../../plugins/catalogue.ts";
|
|
26
|
+
import {
|
|
27
|
+
projectSupplyChain,
|
|
28
|
+
projectSupplyChainSync,
|
|
29
|
+
type PackageJsonProbe,
|
|
30
|
+
type SupplyChainSignals,
|
|
31
|
+
} from "../../plugins/supply-chain.ts";
|
|
32
|
+
import type { ScanSourceFile } from "../../plugins/node-import-scan.ts";
|
|
33
|
+
|
|
34
|
+
/** Plugin on/off — derived, never a config flag. */
|
|
35
|
+
export type PluginState = "on" | "off";
|
|
36
|
+
|
|
37
|
+
/** Attachment scope summary. */
|
|
38
|
+
export interface PluginScopeView {
|
|
39
|
+
readonly kind: "app" | "unit" | "flow";
|
|
40
|
+
readonly name?: string;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** One intercept stage with measured cost. */
|
|
44
|
+
export interface PluginInterceptView {
|
|
45
|
+
readonly stage: string;
|
|
46
|
+
readonly meanMs: number | null;
|
|
47
|
+
readonly count: number;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Capability diff line (from `diffManifest`, not recomputed). */
|
|
51
|
+
export interface PluginCapabilityChange {
|
|
52
|
+
readonly path: string;
|
|
53
|
+
readonly category: string;
|
|
54
|
+
readonly kind: string;
|
|
55
|
+
readonly summary: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** One plugin row in the panel. */
|
|
59
|
+
export interface ConsolePluginRow {
|
|
60
|
+
readonly id: string;
|
|
61
|
+
readonly origin: PluginOrigin;
|
|
62
|
+
readonly state: PluginState;
|
|
63
|
+
readonly version: string | null;
|
|
64
|
+
readonly summary: string | null;
|
|
65
|
+
readonly scopes: readonly PluginScopeView[];
|
|
66
|
+
readonly declares: readonly string[];
|
|
67
|
+
readonly intercepts: readonly PluginInterceptView[];
|
|
68
|
+
readonly hookCost: {
|
|
69
|
+
readonly count: number;
|
|
70
|
+
readonly meanMs: number;
|
|
71
|
+
readonly p50Ms: number;
|
|
72
|
+
readonly p95Ms: number;
|
|
73
|
+
readonly lastMs: number | null;
|
|
74
|
+
} | null;
|
|
75
|
+
readonly supplyChain: SupplyChainSignals;
|
|
76
|
+
readonly capabilityDiff: readonly PluginCapabilityChange[];
|
|
77
|
+
/** Copyable install command — community only; null otherwise. */
|
|
78
|
+
readonly installCommand: string | null;
|
|
79
|
+
/** How to turn a CORE plugin on (code / config) — never a Console action. */
|
|
80
|
+
readonly enableHint: string | null;
|
|
81
|
+
readonly packageName: string | null;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** Full Plugins panel projection. */
|
|
85
|
+
export interface ConsolePluginsList {
|
|
86
|
+
readonly plugins: readonly ConsolePluginRow[];
|
|
87
|
+
/** Derivation rule documented for operators / four-applications alignment. */
|
|
88
|
+
readonly stateDerivation: string;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Options for {@link projectPluginsList}. */
|
|
92
|
+
export interface ProjectPluginsOptions {
|
|
93
|
+
readonly manifest: Manifest | null;
|
|
94
|
+
readonly config?: PluginConfigProbe | null;
|
|
95
|
+
readonly registry?: PluginRegistry | null;
|
|
96
|
+
readonly cwd: string;
|
|
97
|
+
readonly now: () => number;
|
|
98
|
+
/** Injected capability-diff changes keyed by plugin id (tests). */
|
|
99
|
+
readonly capabilityDiffByPlugin?: Readonly<
|
|
100
|
+
Record<string, readonly ManifestChange[]>
|
|
101
|
+
>;
|
|
102
|
+
/** When true, run doctor merge-base diff (default true). */
|
|
103
|
+
readonly resolveCapabilityDiff?: boolean;
|
|
104
|
+
/** Injected hook cost summaries (tests). */
|
|
105
|
+
readonly hookCosts?: Readonly<Record<string, HookCostSummary>>;
|
|
106
|
+
/** Per-plugin sources for oxc scan. */
|
|
107
|
+
readonly sourcesByPlugin?: Readonly<
|
|
108
|
+
Record<string, readonly ScanSourceFile[]>
|
|
109
|
+
>;
|
|
110
|
+
/** Per-plugin package.json injections (tests). */
|
|
111
|
+
readonly packageJsonByPlugin?: Readonly<
|
|
112
|
+
Record<string, PackageJsonProbe | null>
|
|
113
|
+
>;
|
|
114
|
+
/** Per-plugin boot conflicts. */
|
|
115
|
+
readonly bootConflictsByPlugin?: Readonly<Record<string, readonly string[]>>;
|
|
116
|
+
/** Skip npm network. */
|
|
117
|
+
readonly fetchNpm?: boolean;
|
|
118
|
+
/** Use sync supply-chain (tests). */
|
|
119
|
+
readonly syncSupplyChain?: boolean;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** Documented state derivation (panel + four-applications). */
|
|
123
|
+
export const PLUGIN_STATE_DERIVATION = [
|
|
124
|
+
"CORE auth/console/rate-limit: on iff `.plug()`-ed (Manifest/registry).",
|
|
125
|
+
"CORE tenancy: on iff oke.config.ts has `tenancy: {…}` (or Manifest.tenancy).",
|
|
126
|
+
"CORE privacy: on iff oke.config.ts has `privacy` or top-level `runs.redact`.",
|
|
127
|
+
"local/community: listed only when present via `.plug()` / Manifest.plugins.",
|
|
128
|
+
].join(" ");
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Project the Plugins panel from Manifest, config, registry, and real signals.
|
|
132
|
+
*
|
|
133
|
+
* @param options - Inputs
|
|
134
|
+
*/
|
|
135
|
+
export async function projectPluginsList(
|
|
136
|
+
options: ProjectPluginsOptions,
|
|
137
|
+
): Promise<ConsolePluginsList> {
|
|
138
|
+
const plugged = collectPlugged(options.manifest, options.registry);
|
|
139
|
+
const costs = options.hookCosts ?? allHookCostSummaries();
|
|
140
|
+
const capabilityAll =
|
|
141
|
+
options.capabilityDiffByPlugin ??
|
|
142
|
+
(options.resolveCapabilityDiff === false
|
|
143
|
+
? {}
|
|
144
|
+
: await loadCapabilityDiffByPlugin(options.cwd, options.manifest));
|
|
145
|
+
|
|
146
|
+
const rows: ConsolePluginRow[] = [];
|
|
147
|
+
|
|
148
|
+
for (const spec of CORE_PLUGINS) {
|
|
149
|
+
const on = isCorePluginOn(
|
|
150
|
+
spec.id,
|
|
151
|
+
options.manifest,
|
|
152
|
+
options.config,
|
|
153
|
+
new Set(plugged.keys()),
|
|
154
|
+
);
|
|
155
|
+
const meta = plugged.get(spec.id);
|
|
156
|
+
const manifestPlugin = options.manifest?.plugins?.[spec.id];
|
|
157
|
+
rows.push(
|
|
158
|
+
await buildRow({
|
|
159
|
+
id: spec.id,
|
|
160
|
+
origin: "core",
|
|
161
|
+
state: on ? "on" : "off",
|
|
162
|
+
version: meta?.version ?? manifestPlugin?.version ?? null,
|
|
163
|
+
summary: spec.summary,
|
|
164
|
+
declares: meta?.declares ?? manifestPlugin?.declares ?? [],
|
|
165
|
+
interceptStages: meta?.intercepts ?? manifestPlugin?.intercepts ?? [],
|
|
166
|
+
scopes: meta?.scopes ?? [],
|
|
167
|
+
costs,
|
|
168
|
+
capabilityDiff: capabilityAll[spec.id] ?? [],
|
|
169
|
+
options,
|
|
170
|
+
enableHint: enableHintForCore(spec.id, on),
|
|
171
|
+
}),
|
|
172
|
+
);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
for (const [id, meta] of plugged) {
|
|
176
|
+
if (CORE_PLUGINS.some((c) => c.id === id)) continue;
|
|
177
|
+
const origin = resolveOrigin(id, options.manifest?.plugins?.[id]);
|
|
178
|
+
if (origin === "core") continue; // already listed
|
|
179
|
+
rows.push(
|
|
180
|
+
await buildRow({
|
|
181
|
+
id,
|
|
182
|
+
origin,
|
|
183
|
+
state: "on",
|
|
184
|
+
version: meta.version,
|
|
185
|
+
summary: null,
|
|
186
|
+
declares: meta.declares,
|
|
187
|
+
interceptStages: meta.intercepts,
|
|
188
|
+
scopes: meta.scopes,
|
|
189
|
+
costs,
|
|
190
|
+
capabilityDiff: capabilityAll[id] ?? [],
|
|
191
|
+
options,
|
|
192
|
+
enableHint: null,
|
|
193
|
+
}),
|
|
194
|
+
);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
rows.sort((a, b) => {
|
|
198
|
+
const originOrder = { core: 0, local: 1, community: 2 } as const;
|
|
199
|
+
if (originOrder[a.origin] !== originOrder[b.origin]) {
|
|
200
|
+
return originOrder[a.origin] - originOrder[b.origin];
|
|
201
|
+
}
|
|
202
|
+
if (a.state !== b.state) return a.state === "on" ? -1 : 1;
|
|
203
|
+
return a.id.localeCompare(b.id);
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
return {
|
|
207
|
+
plugins: rows,
|
|
208
|
+
stateDerivation: PLUGIN_STATE_DERIVATION,
|
|
209
|
+
};
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
interface PluggedMeta {
|
|
213
|
+
readonly version: string | null;
|
|
214
|
+
readonly declares: readonly string[];
|
|
215
|
+
readonly intercepts: readonly string[];
|
|
216
|
+
readonly scopes: readonly PluginScopeView[];
|
|
217
|
+
readonly origin?: PluginOrigin;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function collectPlugged(
|
|
221
|
+
manifest: Manifest | null,
|
|
222
|
+
registry: PluginRegistry | null | undefined,
|
|
223
|
+
): Map<string, PluggedMeta> {
|
|
224
|
+
const out = new Map<string, PluggedMeta>();
|
|
225
|
+
if (manifest?.plugins) {
|
|
226
|
+
for (const [id, p] of Object.entries(manifest.plugins)) {
|
|
227
|
+
out.set(id, {
|
|
228
|
+
version: p.version ?? null,
|
|
229
|
+
declares: p.declares ?? [],
|
|
230
|
+
intercepts: p.intercepts ?? [],
|
|
231
|
+
scopes: [],
|
|
232
|
+
origin: p.origin,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
if (registry) {
|
|
237
|
+
for (const entry of registry.installed) {
|
|
238
|
+
const id = entry.plugin.name;
|
|
239
|
+
const caps = entry.registration.capabilities;
|
|
240
|
+
const prev = out.get(id);
|
|
241
|
+
const scope: PluginScopeView =
|
|
242
|
+
entry.scope.kind === "app"
|
|
243
|
+
? { kind: "app" }
|
|
244
|
+
: { kind: entry.scope.kind, name: entry.scope.name };
|
|
245
|
+
const scopes = [...(prev?.scopes ?? []), scope];
|
|
246
|
+
out.set(id, {
|
|
247
|
+
version: caps.version ?? prev?.version ?? null,
|
|
248
|
+
declares: caps.declares.length
|
|
249
|
+
? [...caps.declares]
|
|
250
|
+
: (prev?.declares ?? []),
|
|
251
|
+
intercepts: caps.intercepts.length
|
|
252
|
+
? [...caps.intercepts]
|
|
253
|
+
: (prev?.intercepts ?? []),
|
|
254
|
+
scopes,
|
|
255
|
+
origin: prev?.origin,
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return out;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function resolveOrigin(id: string, plugin: Plugin | undefined): PluginOrigin {
|
|
263
|
+
if (plugin?.origin) return plugin.origin;
|
|
264
|
+
if (CORE_PLUGINS.some((c) => c.id === id)) return "core";
|
|
265
|
+
// Heuristic: path-like / relative → local; else community.
|
|
266
|
+
if (id.startsWith(".") || id.startsWith("/") || id.includes("/src/")) {
|
|
267
|
+
return "local";
|
|
268
|
+
}
|
|
269
|
+
return plugin ? "local" : "community";
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
async function buildRow(input: {
|
|
273
|
+
readonly id: string;
|
|
274
|
+
readonly origin: PluginOrigin;
|
|
275
|
+
readonly state: PluginState;
|
|
276
|
+
readonly version: string | null;
|
|
277
|
+
readonly summary: string | null;
|
|
278
|
+
readonly declares: readonly string[];
|
|
279
|
+
readonly interceptStages: readonly string[];
|
|
280
|
+
readonly scopes: readonly PluginScopeView[];
|
|
281
|
+
readonly costs: Readonly<Record<string, HookCostSummary>>;
|
|
282
|
+
readonly capabilityDiff: readonly ManifestChange[];
|
|
283
|
+
readonly options: ProjectPluginsOptions;
|
|
284
|
+
readonly enableHint: string | null;
|
|
285
|
+
}): Promise<ConsolePluginRow> {
|
|
286
|
+
const packageName =
|
|
287
|
+
input.origin === "community" ? communityPackageName(input.id) : null;
|
|
288
|
+
const cost = input.costs[input.id] ?? null;
|
|
289
|
+
const intercepts = input.interceptStages.map((stage) => {
|
|
290
|
+
const stageCost = cost?.byStage[
|
|
291
|
+
stage as keyof NonNullable<typeof cost>["byStage"]
|
|
292
|
+
];
|
|
293
|
+
return {
|
|
294
|
+
stage,
|
|
295
|
+
meanMs: stageCost?.meanMs ?? null,
|
|
296
|
+
count: stageCost?.count ?? 0,
|
|
297
|
+
};
|
|
298
|
+
});
|
|
299
|
+
|
|
300
|
+
const supplyOpts = {
|
|
301
|
+
origin: input.origin,
|
|
302
|
+
packageName,
|
|
303
|
+
cwd: input.options.cwd,
|
|
304
|
+
now: input.options.now(),
|
|
305
|
+
packageJson: input.options.packageJsonByPlugin?.[input.id],
|
|
306
|
+
sources: input.options.sourcesByPlugin?.[input.id] ?? null,
|
|
307
|
+
bootConflicts: input.options.bootConflictsByPlugin?.[input.id] ?? [],
|
|
308
|
+
fetchNpm: input.options.fetchNpm,
|
|
309
|
+
};
|
|
310
|
+
|
|
311
|
+
const supplyChain = input.options.syncSupplyChain
|
|
312
|
+
? projectSupplyChainSync(supplyOpts)
|
|
313
|
+
: await projectSupplyChain(supplyOpts);
|
|
314
|
+
|
|
315
|
+
return {
|
|
316
|
+
id: input.id,
|
|
317
|
+
origin: input.origin,
|
|
318
|
+
state: input.state,
|
|
319
|
+
version: input.version,
|
|
320
|
+
summary: input.summary,
|
|
321
|
+
scopes: input.scopes,
|
|
322
|
+
declares: [...input.declares],
|
|
323
|
+
intercepts,
|
|
324
|
+
hookCost: cost
|
|
325
|
+
? {
|
|
326
|
+
count: cost.count,
|
|
327
|
+
meanMs: cost.meanMs,
|
|
328
|
+
p50Ms: cost.p50Ms,
|
|
329
|
+
p95Ms: cost.p95Ms,
|
|
330
|
+
lastMs: cost.lastMs,
|
|
331
|
+
}
|
|
332
|
+
: null,
|
|
333
|
+
supplyChain,
|
|
334
|
+
capabilityDiff: input.capabilityDiff.map((c) => ({
|
|
335
|
+
path: c.path,
|
|
336
|
+
category: c.category,
|
|
337
|
+
kind: c.kind,
|
|
338
|
+
summary: c.summary,
|
|
339
|
+
})),
|
|
340
|
+
installCommand:
|
|
341
|
+
input.origin === "community" && packageName
|
|
342
|
+
? `bun add ${packageName}`
|
|
343
|
+
: null,
|
|
344
|
+
enableHint: input.enableHint,
|
|
345
|
+
packageName,
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Filter doctor `--diff` / merge-base changes to one plugin path.
|
|
351
|
+
*
|
|
352
|
+
* @param cwd - Repo root
|
|
353
|
+
* @param manifest - Working-tree after Manifest (optional injection via doctor)
|
|
354
|
+
*/
|
|
355
|
+
export async function loadCapabilityDiffByPlugin(
|
|
356
|
+
cwd: string,
|
|
357
|
+
manifest: Manifest | null,
|
|
358
|
+
): Promise<Readonly<Record<string, readonly ManifestChange[]>>> {
|
|
359
|
+
try {
|
|
360
|
+
const result = await runDoctorDiff({
|
|
361
|
+
cwd,
|
|
362
|
+
...(manifest ? { after: manifest } : {}),
|
|
363
|
+
write: () => {},
|
|
364
|
+
});
|
|
365
|
+
return groupPluginChanges(result.allChanges);
|
|
366
|
+
} catch {
|
|
367
|
+
return {};
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/**
|
|
372
|
+
* Group Manifest changes under `/plugins/{id}`.
|
|
373
|
+
*
|
|
374
|
+
* @param changes - Full `diffManifest` result
|
|
375
|
+
*/
|
|
376
|
+
export function groupPluginChanges(
|
|
377
|
+
changes: readonly ManifestChange[],
|
|
378
|
+
): Readonly<Record<string, readonly ManifestChange[]>> {
|
|
379
|
+
const out: Record<string, ManifestChange[]> = {};
|
|
380
|
+
for (const c of changes) {
|
|
381
|
+
const m = /^\/plugins\/([^/]+)/.exec(c.path);
|
|
382
|
+
if (!m) continue;
|
|
383
|
+
const id = m[1]!;
|
|
384
|
+
const list = out[id] ?? [];
|
|
385
|
+
list.push(c);
|
|
386
|
+
out[id] = list;
|
|
387
|
+
}
|
|
388
|
+
return out;
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* Filter precomputed changes to one plugin (UI helper; no recompute).
|
|
393
|
+
*
|
|
394
|
+
* @param changes - Diff changes
|
|
395
|
+
* @param pluginId - Plugin id
|
|
396
|
+
*/
|
|
397
|
+
export function filterCapabilityDiffForPlugin(
|
|
398
|
+
changes: readonly ManifestChange[],
|
|
399
|
+
pluginId: string,
|
|
400
|
+
): readonly ManifestChange[] {
|
|
401
|
+
const prefix = `/plugins/${pluginId}`;
|
|
402
|
+
return changes.filter(
|
|
403
|
+
(c) => c.path === prefix || c.path.startsWith(`${prefix}/`),
|
|
404
|
+
);
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
function communityPackageName(id: string): string {
|
|
408
|
+
if (id.startsWith("@")) return id;
|
|
409
|
+
if (id.startsWith("oke-") || id.startsWith("okengine-")) return id;
|
|
410
|
+
return id;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
function enableHintForCore(id: string, on: boolean): string | null {
|
|
414
|
+
if (on) return null;
|
|
415
|
+
switch (id) {
|
|
416
|
+
case "auth":
|
|
417
|
+
return "app.plug(auth())";
|
|
418
|
+
case "console":
|
|
419
|
+
return "app.plug(consolePlugin())";
|
|
420
|
+
case "rate-limit":
|
|
421
|
+
return "app.plug(rateLimit({ max: 30 })) // or unit.plug / flow.plug";
|
|
422
|
+
case "tenancy":
|
|
423
|
+
return "oke.config.ts → tenancy: { isolation: \"row\", resolve: … }";
|
|
424
|
+
case "privacy":
|
|
425
|
+
return "oke.config.ts → privacy: { … } // or runs: { redact: { … } }";
|
|
426
|
+
default:
|
|
427
|
+
return null;
|
|
428
|
+
}
|
|
429
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Mask PII-classified fields on the shared Runs / Traces / Overview projection.
|
|
3
|
+
*
|
|
4
|
+
* Store masks by schema classification at the driver boundary. Wide events
|
|
5
|
+
* carry the same field names as dimensions and `fx.log` data — without a
|
|
6
|
+
* central mask here, a classified `email` that lands in a run dimension would
|
|
7
|
+
* leak in every panel that reads `console.runs.list` (console §6 · §9.5 · §9.11).
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { PII_MASK } from "../../elements/store/classify.ts";
|
|
11
|
+
import type { Manifest } from "../../manifest/types.ts";
|
|
12
|
+
import type { WideEvent } from "../../runs/types.ts";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Collect PII field names from Manifest store classifications.
|
|
16
|
+
*
|
|
17
|
+
* Keys are bare column / field names (`email`), not `table.column`, so a
|
|
18
|
+
* dimension or log key matching a classified column is masked regardless of
|
|
19
|
+
* which store table it came from — same survival rule as Store's raw SQL path.
|
|
20
|
+
*
|
|
21
|
+
* @param manifest - Live Manifest snapshot
|
|
22
|
+
*/
|
|
23
|
+
export function piiFieldNamesFromManifest(
|
|
24
|
+
manifest: Manifest | null | undefined,
|
|
25
|
+
): ReadonlySet<string> {
|
|
26
|
+
const names = new Set<string>();
|
|
27
|
+
if (!manifest?.stores) return names;
|
|
28
|
+
for (const store of Object.values(manifest.stores)) {
|
|
29
|
+
for (const table of Object.values(store.tables ?? {})) {
|
|
30
|
+
for (const [col, tags] of Object.entries(table.columns ?? {})) {
|
|
31
|
+
if (tags?.pii) names.add(col);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
for (const [key, tags] of Object.entries(store.classifications ?? {})) {
|
|
35
|
+
if (
|
|
36
|
+
tags &&
|
|
37
|
+
typeof tags === "object" &&
|
|
38
|
+
!Array.isArray(tags) &&
|
|
39
|
+
"pii" in tags &&
|
|
40
|
+
(tags as { pii?: boolean }).pii
|
|
41
|
+
) {
|
|
42
|
+
const col = key.includes(".")
|
|
43
|
+
? key.slice(key.lastIndexOf(".") + 1)
|
|
44
|
+
: key;
|
|
45
|
+
names.add(col);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return names;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Mask a record's values whose keys are PII-classified field names.
|
|
54
|
+
*
|
|
55
|
+
* @param record - Dimensions or log data
|
|
56
|
+
* @param piiFields - Classified field names
|
|
57
|
+
* @param mask - Mask token
|
|
58
|
+
*/
|
|
59
|
+
export function maskPiiRecord<T extends Record<string, unknown>>(
|
|
60
|
+
record: T,
|
|
61
|
+
piiFields: ReadonlySet<string>,
|
|
62
|
+
mask: string = PII_MASK,
|
|
63
|
+
): T {
|
|
64
|
+
if (piiFields.size === 0) return { ...record };
|
|
65
|
+
const out: Record<string, unknown> = {};
|
|
66
|
+
for (const [key, value] of Object.entries(record)) {
|
|
67
|
+
out[key] = piiFields.has(key) ? mask : value;
|
|
68
|
+
}
|
|
69
|
+
return out as T;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Apply schema-classification PII masking to a wide event for Console projection.
|
|
74
|
+
*
|
|
75
|
+
* @param event - Stored wide event
|
|
76
|
+
* @param piiFields - Classified field names from the Manifest
|
|
77
|
+
*/
|
|
78
|
+
export function maskWideEventForConsole(
|
|
79
|
+
event: WideEvent,
|
|
80
|
+
piiFields: ReadonlySet<string>,
|
|
81
|
+
): WideEvent {
|
|
82
|
+
if (piiFields.size === 0) return event;
|
|
83
|
+
const dimensions = maskPiiRecord(
|
|
84
|
+
{ ...event.dimensions } as Record<string, unknown>,
|
|
85
|
+
piiFields,
|
|
86
|
+
) as WideEvent["dimensions"];
|
|
87
|
+
const logs = event.logs.map((line) => {
|
|
88
|
+
if (line.data === undefined) return line;
|
|
89
|
+
return {
|
|
90
|
+
...line,
|
|
91
|
+
data: maskPiiRecord(
|
|
92
|
+
line.data as Record<string, unknown>,
|
|
93
|
+
piiFields,
|
|
94
|
+
),
|
|
95
|
+
};
|
|
96
|
+
});
|
|
97
|
+
return { ...event, dimensions, logs };
|
|
98
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Console security headers — CSP, framing, cookies (console §10).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
/** Strict Content-Security-Policy for the Console document. */
|
|
6
|
+
export const CONSOLE_CSP: string = [
|
|
7
|
+
"default-src 'self'",
|
|
8
|
+
"script-src 'self'",
|
|
9
|
+
"style-src 'self' 'unsafe-inline'",
|
|
10
|
+
"img-src 'self' data:",
|
|
11
|
+
"font-src 'self'",
|
|
12
|
+
"connect-src 'self' ws: wss:",
|
|
13
|
+
"object-src 'none'",
|
|
14
|
+
"base-uri 'self'",
|
|
15
|
+
"form-action 'self'",
|
|
16
|
+
"frame-ancestors 'none'",
|
|
17
|
+
"frame-src 'self'",
|
|
18
|
+
].join("; ");
|
|
19
|
+
|
|
20
|
+
/** CSP for sandboxed plugin panel iframes (no operator session reach). */
|
|
21
|
+
export const PLUGIN_FRAME_CSP: string = [
|
|
22
|
+
"default-src 'none'",
|
|
23
|
+
"script-src 'self'",
|
|
24
|
+
"style-src 'self' 'unsafe-inline'",
|
|
25
|
+
"connect-src 'self'",
|
|
26
|
+
"img-src 'self' data:",
|
|
27
|
+
"object-src 'none'",
|
|
28
|
+
"base-uri 'none'",
|
|
29
|
+
"form-action 'none'",
|
|
30
|
+
"frame-ancestors 'self'",
|
|
31
|
+
].join("; ");
|
|
32
|
+
|
|
33
|
+
/** Sandbox attribute for plugin panels — no `allow-same-origin`. */
|
|
34
|
+
export const PLUGIN_IFRAME_SANDBOX: string = "allow-scripts allow-forms";
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Apply Console security headers to a response.
|
|
38
|
+
*
|
|
39
|
+
* @param response - Downstream response
|
|
40
|
+
* @param opts - Extra header overrides
|
|
41
|
+
*/
|
|
42
|
+
export function withConsoleSecurityHeaders(
|
|
43
|
+
response: Response,
|
|
44
|
+
opts?: { readonly contentType?: string },
|
|
45
|
+
): Response {
|
|
46
|
+
const headers = new Headers(response.headers);
|
|
47
|
+
headers.set("Content-Security-Policy", CONSOLE_CSP);
|
|
48
|
+
headers.set("X-Content-Type-Options", "nosniff");
|
|
49
|
+
headers.set("X-Frame-Options", "DENY");
|
|
50
|
+
headers.set("Referrer-Policy", "no-referrer");
|
|
51
|
+
headers.set("Permissions-Policy", "interest-cohort=()");
|
|
52
|
+
if (opts?.contentType) {
|
|
53
|
+
headers.set("Content-Type", opts.contentType);
|
|
54
|
+
}
|
|
55
|
+
return new Response(response.body, {
|
|
56
|
+
status: response.status,
|
|
57
|
+
statusText: response.statusText,
|
|
58
|
+
headers,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Build a `Set-Cookie` value with `SameSite=Strict`.
|
|
64
|
+
*
|
|
65
|
+
* @param name - Cookie name
|
|
66
|
+
* @param value - Cookie value
|
|
67
|
+
* @param opts - Max-age / path / clear
|
|
68
|
+
*/
|
|
69
|
+
export function consoleSessionCookie(
|
|
70
|
+
name: string,
|
|
71
|
+
value: string,
|
|
72
|
+
opts?: {
|
|
73
|
+
readonly maxAgeSec?: number;
|
|
74
|
+
readonly clear?: boolean;
|
|
75
|
+
},
|
|
76
|
+
): string {
|
|
77
|
+
const parts = [
|
|
78
|
+
`${name}=${opts?.clear ? "" : encodeURIComponent(value)}`,
|
|
79
|
+
"Path=/",
|
|
80
|
+
"HttpOnly",
|
|
81
|
+
"SameSite=Strict",
|
|
82
|
+
// Secure when not on plain localhost loopback in production — callers
|
|
83
|
+
// may append; we always set SameSite=Strict from the first commit.
|
|
84
|
+
];
|
|
85
|
+
if (opts?.clear) {
|
|
86
|
+
parts.push("Max-Age=0");
|
|
87
|
+
} else if (opts?.maxAgeSec !== undefined) {
|
|
88
|
+
parts.push(`Max-Age=${opts.maxAgeSec}`);
|
|
89
|
+
}
|
|
90
|
+
return parts.join("; ");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/** Cookie names used by the Console. */
|
|
94
|
+
export const CONSOLE_COOKIES = {
|
|
95
|
+
access: "oke_console_at",
|
|
96
|
+
refresh: "oke_console_rt",
|
|
97
|
+
} as const;
|