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,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* URL search state for the Architecture panel (console §7 · §9.13).
|
|
3
|
+
*
|
|
4
|
+
* Focus, depth, and layer toggles live in the URL so a pasted link
|
|
5
|
+
* reproduces the exact view.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { z } from "zod";
|
|
9
|
+
import {
|
|
10
|
+
DEFAULT_LAYERS,
|
|
11
|
+
ELEMENT_LAYERS,
|
|
12
|
+
type ElementLayer,
|
|
13
|
+
type FocusDepth,
|
|
14
|
+
type LayerFlags,
|
|
15
|
+
} from "./types.ts";
|
|
16
|
+
|
|
17
|
+
const searchBool = z
|
|
18
|
+
.union([z.boolean(), z.literal("true"), z.literal("false")])
|
|
19
|
+
.transform((v) => v === true || v === "true");
|
|
20
|
+
|
|
21
|
+
/** Zod schema for Architecture URL search params. */
|
|
22
|
+
export const ArchitectureSearchSchema = z.object({
|
|
23
|
+
/** Focus node id (`unit:bookings`, `flow:bookings.create`, `sql:bookings`). */
|
|
24
|
+
focus: z.string().optional(),
|
|
25
|
+
/** Neighbourhood depth when focused. */
|
|
26
|
+
depth: z.union([z.literal(1), z.literal(2), z.literal("1"), z.literal("2")])
|
|
27
|
+
.transform((v) => (Number(v) === 2 ? 2 : 1) as FocusDepth)
|
|
28
|
+
.default(1),
|
|
29
|
+
/** Data (Store) layer. */
|
|
30
|
+
data: searchBool.optional(),
|
|
31
|
+
/** Messaging (Signal) layer. */
|
|
32
|
+
messaging: searchBool.optional(),
|
|
33
|
+
/** Time (Clock) layer. */
|
|
34
|
+
time: searchBool.optional(),
|
|
35
|
+
/** External (Channel/AI) layer. */
|
|
36
|
+
external: searchBool.optional(),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
/** Parsed Architecture URL search. */
|
|
40
|
+
export type ArchitectureSearch = {
|
|
41
|
+
readonly focus?: string;
|
|
42
|
+
readonly depth: FocusDepth;
|
|
43
|
+
readonly data?: boolean;
|
|
44
|
+
readonly messaging?: boolean;
|
|
45
|
+
readonly time?: boolean;
|
|
46
|
+
readonly external?: boolean;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Parse Architecture panel search params.
|
|
51
|
+
*
|
|
52
|
+
* @param search - Raw router search
|
|
53
|
+
*/
|
|
54
|
+
export function parseArchitectureSearch(
|
|
55
|
+
search: Record<string, unknown>,
|
|
56
|
+
): ArchitectureSearch {
|
|
57
|
+
const parsed = ArchitectureSearchSchema.safeParse(search);
|
|
58
|
+
if (!parsed.success) {
|
|
59
|
+
return { depth: 1 };
|
|
60
|
+
}
|
|
61
|
+
return parsed.data;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Serialize Architecture search for navigation (omit defaults).
|
|
66
|
+
*
|
|
67
|
+
* @param search - Search state
|
|
68
|
+
*/
|
|
69
|
+
export function serializeArchitectureSearch(
|
|
70
|
+
search: ArchitectureSearch,
|
|
71
|
+
): Record<string, string> {
|
|
72
|
+
const out: Record<string, string> = {};
|
|
73
|
+
if (search.focus) out.focus = search.focus;
|
|
74
|
+
if (search.depth === 2) out.depth = "2";
|
|
75
|
+
for (const layer of ELEMENT_LAYERS) {
|
|
76
|
+
const value = search[layer];
|
|
77
|
+
if (value === false) out[layer] = "false";
|
|
78
|
+
}
|
|
79
|
+
return out;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Resolve layer flags from URL search (absent → on).
|
|
84
|
+
*
|
|
85
|
+
* @param search - Parsed search
|
|
86
|
+
*/
|
|
87
|
+
export function layersOf(search: ArchitectureSearch): LayerFlags {
|
|
88
|
+
return {
|
|
89
|
+
data: search.data ?? DEFAULT_LAYERS.data,
|
|
90
|
+
messaging: search.messaging ?? DEFAULT_LAYERS.messaging,
|
|
91
|
+
time: search.time ?? DEFAULT_LAYERS.time,
|
|
92
|
+
external: search.external ?? DEFAULT_LAYERS.external,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
/**
|
|
97
|
+
* Focus a node (unit / flow / resource).
|
|
98
|
+
*
|
|
99
|
+
* @param search - Current search
|
|
100
|
+
* @param focus - Node id
|
|
101
|
+
*/
|
|
102
|
+
export function focusNode(
|
|
103
|
+
search: ArchitectureSearch,
|
|
104
|
+
focus: string,
|
|
105
|
+
): ArchitectureSearch {
|
|
106
|
+
return { ...search, focus };
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Clear focus — return to unit-cluster overview.
|
|
111
|
+
*
|
|
112
|
+
* @param search - Current search
|
|
113
|
+
*/
|
|
114
|
+
export function clearFocus(search: ArchitectureSearch): ArchitectureSearch {
|
|
115
|
+
const { focus: _f, ...rest } = search;
|
|
116
|
+
return { ...rest, depth: search.depth };
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Set neighbourhood depth.
|
|
121
|
+
*
|
|
122
|
+
* @param search - Current search
|
|
123
|
+
* @param depth - 1 or 2
|
|
124
|
+
*/
|
|
125
|
+
export function setDepth(
|
|
126
|
+
search: ArchitectureSearch,
|
|
127
|
+
depth: FocusDepth,
|
|
128
|
+
): ArchitectureSearch {
|
|
129
|
+
return { ...search, depth };
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
/**
|
|
133
|
+
* Toggle one element layer in URL state.
|
|
134
|
+
*
|
|
135
|
+
* @param search - Current search
|
|
136
|
+
* @param layer - Layer
|
|
137
|
+
* @param on - Desired visibility
|
|
138
|
+
*/
|
|
139
|
+
export function setLayerSearch(
|
|
140
|
+
search: ArchitectureSearch,
|
|
141
|
+
layer: ElementLayer,
|
|
142
|
+
on: boolean,
|
|
143
|
+
): ArchitectureSearch {
|
|
144
|
+
return { ...search, [layer]: on };
|
|
145
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Observed edge traffic from Runs (console §9.13).
|
|
3
|
+
*
|
|
4
|
+
* Edge thickness is real traffic, not declaration. A dashed edge is
|
|
5
|
+
* declared in code and never traversed.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { EffectKind } from "../../../kernel/effects.ts";
|
|
9
|
+
import type { RunRecord } from "../runs/types.ts";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Normalise a recorded effect resource to the causality effect-ref form.
|
|
13
|
+
*
|
|
14
|
+
* @param kind - Effect kind from the run ledger
|
|
15
|
+
* @param resource - Raw resource string on the run
|
|
16
|
+
*/
|
|
17
|
+
export function normalizeTrafficRef(
|
|
18
|
+
kind: EffectKind,
|
|
19
|
+
resource: string,
|
|
20
|
+
): string {
|
|
21
|
+
switch (kind) {
|
|
22
|
+
case "emit":
|
|
23
|
+
return resource.startsWith("signal:") ? resource : `signal:${resource}`;
|
|
24
|
+
case "send":
|
|
25
|
+
return resource.startsWith("channel:")
|
|
26
|
+
? resource
|
|
27
|
+
: `channel:${resource}`;
|
|
28
|
+
case "ask":
|
|
29
|
+
return resource.startsWith("ai:") ? resource : `ai:${resource}`;
|
|
30
|
+
case "secret":
|
|
31
|
+
return resource.startsWith("secret:") ? resource : `secret:${resource}`;
|
|
32
|
+
case "call":
|
|
33
|
+
return resource.startsWith("flow:") ? resource : `flow:${resource}`;
|
|
34
|
+
default:
|
|
35
|
+
return resource;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Stable key for a flow → resource relationship.
|
|
41
|
+
*
|
|
42
|
+
* @param flowId - Flow id
|
|
43
|
+
* @param ref - Normalised effect ref
|
|
44
|
+
*/
|
|
45
|
+
export function trafficEdgeKey(flowId: string, ref: string): string {
|
|
46
|
+
return `${flowId}\0${ref}`;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Count observed traversals of each declared flow→resource edge from Runs.
|
|
51
|
+
*
|
|
52
|
+
* @param runs - Wide-event population
|
|
53
|
+
*/
|
|
54
|
+
export function observeTraffic(
|
|
55
|
+
runs: readonly RunRecord[],
|
|
56
|
+
): ReadonlyMap<string, number> {
|
|
57
|
+
const counts = new Map<string, number>();
|
|
58
|
+
for (const run of runs) {
|
|
59
|
+
for (const effect of run.effects) {
|
|
60
|
+
const ref = normalizeTrafficRef(effect.kind, effect.resource);
|
|
61
|
+
const key = trafficEdgeKey(run.flow, ref);
|
|
62
|
+
counts.set(key, (counts.get(key) ?? 0) + 1);
|
|
63
|
+
}
|
|
64
|
+
// Flow invocation itself counts as traversal of call edges into this flow
|
|
65
|
+
// when a parent exists — parent.flow → flow:run.flow
|
|
66
|
+
if (run.parentId) {
|
|
67
|
+
// Parent resolution is optional; call traffic is also recorded as effects.
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return counts;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Look up traversals for a flow→resource edge.
|
|
75
|
+
*
|
|
76
|
+
* @param traffic - Observed map
|
|
77
|
+
* @param flowId - Flow id
|
|
78
|
+
* @param ref - Effect ref
|
|
79
|
+
*/
|
|
80
|
+
export function traversalsOf(
|
|
81
|
+
traffic: ReadonlyMap<string, number>,
|
|
82
|
+
flowId: string,
|
|
83
|
+
ref: string,
|
|
84
|
+
): number {
|
|
85
|
+
return traffic.get(trafficEdgeKey(flowId, ref)) ?? 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Map absolute traversal counts to stroke thickness 1–8.
|
|
90
|
+
*
|
|
91
|
+
* @param traversals - Observed count
|
|
92
|
+
* @param maxTraversals - Max among visible edges (for relative scale)
|
|
93
|
+
*/
|
|
94
|
+
export function thicknessOf(
|
|
95
|
+
traversals: number,
|
|
96
|
+
maxTraversals: number,
|
|
97
|
+
): number {
|
|
98
|
+
if (traversals <= 0) return 1;
|
|
99
|
+
if (maxTraversals <= 1) return 2;
|
|
100
|
+
const ratio = traversals / maxTraversals;
|
|
101
|
+
return Math.max(1, Math.min(8, Math.ceil(ratio * 8)));
|
|
102
|
+
}
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Architecture panel domain types (console §9.13).
|
|
3
|
+
*
|
|
4
|
+
* Second rendering of the Flows causality graph — shape, not which-one.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
/** Toggleable element layers — edges are typed, not merely grouped. */
|
|
8
|
+
export type ElementLayer = "data" | "messaging" | "time" | "external";
|
|
9
|
+
|
|
10
|
+
/** All toggleable layers in display order. */
|
|
11
|
+
export const ELEMENT_LAYERS: readonly ElementLayer[] = [
|
|
12
|
+
"data",
|
|
13
|
+
"messaging",
|
|
14
|
+
"time",
|
|
15
|
+
"external",
|
|
16
|
+
] as const;
|
|
17
|
+
|
|
18
|
+
/** Human labels for element layers. */
|
|
19
|
+
export const LAYER_LABEL: Readonly<Record<ElementLayer, string>> = {
|
|
20
|
+
data: "Data",
|
|
21
|
+
messaging: "Messaging",
|
|
22
|
+
time: "Time",
|
|
23
|
+
external: "External",
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
/** Node kinds on the architecture diagram. */
|
|
27
|
+
export type ArchitectureNodeKind =
|
|
28
|
+
| "unit"
|
|
29
|
+
| "flow"
|
|
30
|
+
| "resource"
|
|
31
|
+
| "external";
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* One node on the architecture diagram.
|
|
35
|
+
*
|
|
36
|
+
* Default view uses unit clusters; focus expands flows / resources at depth.
|
|
37
|
+
*/
|
|
38
|
+
export interface ArchitectureNode {
|
|
39
|
+
/** Stable id (`unit:bookings`, `flow:bookings.create`, `sql:bookings`). */
|
|
40
|
+
readonly id: string;
|
|
41
|
+
/** Visual / semantic kind. */
|
|
42
|
+
readonly kind: ArchitectureNodeKind;
|
|
43
|
+
/** Human label. */
|
|
44
|
+
readonly label: string;
|
|
45
|
+
/** Owning unit when applicable. */
|
|
46
|
+
readonly unit?: string;
|
|
47
|
+
/** Element layer for resources (typed edges). */
|
|
48
|
+
readonly layer?: ElementLayer;
|
|
49
|
+
/** True when inside the drawn system boundary. */
|
|
50
|
+
readonly insideBoundary: boolean;
|
|
51
|
+
/** Flow count for unit clusters. */
|
|
52
|
+
readonly flowCount?: number;
|
|
53
|
+
/** True when this node is the current focus. */
|
|
54
|
+
readonly focused?: boolean;
|
|
55
|
+
/** Hop distance from focus (0 = focus). */
|
|
56
|
+
readonly depth?: number;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* One declared (and optionally observed) edge.
|
|
61
|
+
*
|
|
62
|
+
* Thickness comes from Runs traffic; dashed means declared but never traversed.
|
|
63
|
+
*/
|
|
64
|
+
export interface ArchitectureEdge {
|
|
65
|
+
/** Stable id. */
|
|
66
|
+
readonly id: string;
|
|
67
|
+
/** Source node id. */
|
|
68
|
+
readonly from: string;
|
|
69
|
+
/** Target node id. */
|
|
70
|
+
readonly to: string;
|
|
71
|
+
/**
|
|
72
|
+
* Element layer, or `call` for structural flow→flow portals
|
|
73
|
+
* (always shown; not behind a layer toggle).
|
|
74
|
+
*/
|
|
75
|
+
readonly layer: ElementLayer | "call";
|
|
76
|
+
/** Declared in the Manifest / causality graph. */
|
|
77
|
+
readonly declared: boolean;
|
|
78
|
+
/** Observed traversals from Runs. */
|
|
79
|
+
readonly traversals: number;
|
|
80
|
+
/** `declared && traversals === 0` — dead relationship. */
|
|
81
|
+
readonly dashed: boolean;
|
|
82
|
+
/** Stroke weight 1–8 from relative traffic. */
|
|
83
|
+
readonly thickness: number;
|
|
84
|
+
/** Aggregated across flows when clustered by unit. */
|
|
85
|
+
readonly aggregated: boolean;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/** Computed pathology kinds (findings list, not decoration). */
|
|
89
|
+
export type PathologyKind =
|
|
90
|
+
| "cycle"
|
|
91
|
+
| "god-node"
|
|
92
|
+
| "orphan-signal"
|
|
93
|
+
| "spof";
|
|
94
|
+
|
|
95
|
+
/** One diagnostic finding from the graph-as-data. */
|
|
96
|
+
export interface ArchitectureFinding {
|
|
97
|
+
/** Pathology class. */
|
|
98
|
+
readonly kind: PathologyKind;
|
|
99
|
+
/** Ranking hint for Overview union. */
|
|
100
|
+
readonly severity: "warning" | "critical";
|
|
101
|
+
/** Short title. */
|
|
102
|
+
readonly title: string;
|
|
103
|
+
/** Plain-language detail. */
|
|
104
|
+
readonly detail: string;
|
|
105
|
+
/** Related node ids. */
|
|
106
|
+
readonly nodeIds: readonly string[];
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Focus depth — neighbourhood hops from the selected node. */
|
|
110
|
+
export type FocusDepth = 1 | 2;
|
|
111
|
+
|
|
112
|
+
/** Layer visibility map. */
|
|
113
|
+
export type LayerFlags = Readonly<Record<ElementLayer, boolean>>;
|
|
114
|
+
|
|
115
|
+
/** Default: every typed layer on. */
|
|
116
|
+
export const DEFAULT_LAYERS: LayerFlags = {
|
|
117
|
+
data: true,
|
|
118
|
+
messaging: true,
|
|
119
|
+
time: true,
|
|
120
|
+
external: true,
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Fully projected architecture view for one Manifest + Runs population.
|
|
125
|
+
*/
|
|
126
|
+
export interface ArchitectureView {
|
|
127
|
+
/** Visible nodes (clustered or focused neighbourhood). */
|
|
128
|
+
readonly nodes: readonly ArchitectureNode[];
|
|
129
|
+
/** Visible edges after layer + focus filters. */
|
|
130
|
+
readonly edges: readonly ArchitectureEdge[];
|
|
131
|
+
/**
|
|
132
|
+
* Distinct Manifest external effects (channel/ai) that flows touch —
|
|
133
|
+
* the boundary-crossing metric (§9.13).
|
|
134
|
+
*/
|
|
135
|
+
readonly boundaryCrossingCount: number;
|
|
136
|
+
/** Computed pathologies. */
|
|
137
|
+
readonly findings: readonly ArchitectureFinding[];
|
|
138
|
+
/** Current focus node id, or null for unit-cluster overview. */
|
|
139
|
+
readonly focus: string | null;
|
|
140
|
+
/** Neighbourhood depth when focused. */
|
|
141
|
+
readonly depth: FocusDepth;
|
|
142
|
+
/** Active element layers. */
|
|
143
|
+
readonly layers: LayerFlags;
|
|
144
|
+
}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Architecture view — cluster default, focus depth, layers, traffic (§9.13).
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { describe, expect, test } from "bun:test";
|
|
6
|
+
import { buildCausalityGraph } from "../flows/graph.ts";
|
|
7
|
+
import { boundaryCrossingCount } from "./boundary.ts";
|
|
8
|
+
import {
|
|
9
|
+
ARCHITECTURE_RUNS_FIXTURE,
|
|
10
|
+
ARCHITECTURE_TEST_MANIFEST,
|
|
11
|
+
} from "./fixture.ts";
|
|
12
|
+
import { computePathologies } from "./pathologies.ts";
|
|
13
|
+
import {
|
|
14
|
+
layersOf,
|
|
15
|
+
parseArchitectureSearch,
|
|
16
|
+
serializeArchitectureSearch,
|
|
17
|
+
} from "./search.ts";
|
|
18
|
+
import { observeTraffic, thicknessOf } from "./traffic.ts";
|
|
19
|
+
import { buildArchitectureView } from "./view.ts";
|
|
20
|
+
|
|
21
|
+
describe("architecture view", () => {
|
|
22
|
+
const graph = buildCausalityGraph(ARCHITECTURE_TEST_MANIFEST);
|
|
23
|
+
|
|
24
|
+
test("reuses Flows causality graph — same flow ids", () => {
|
|
25
|
+
expect(graph.flowById.has("bookings.create")).toBe(true);
|
|
26
|
+
expect(graph.effectByRef.has("sql:bookings")).toBe(true);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
test("default is clustered by unit — never every flow", () => {
|
|
30
|
+
const view = buildArchitectureView(graph, {
|
|
31
|
+
runs: ARCHITECTURE_RUNS_FIXTURE,
|
|
32
|
+
});
|
|
33
|
+
const kinds = new Set(view.nodes.map((n) => n.kind));
|
|
34
|
+
expect(kinds.has("unit")).toBe(true);
|
|
35
|
+
expect(view.nodes.some((n) => n.kind === "flow")).toBe(false);
|
|
36
|
+
expect(view.nodes.some((n) => n.id === "unit:bookings")).toBe(true);
|
|
37
|
+
expect(view.edges.every((e) => e.aggregated)).toBe(true);
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
test("focus expands neighbourhood at depth 1–2", () => {
|
|
41
|
+
const d1 = buildArchitectureView(graph, {
|
|
42
|
+
focus: "unit:bookings",
|
|
43
|
+
depth: 1,
|
|
44
|
+
runs: ARCHITECTURE_RUNS_FIXTURE,
|
|
45
|
+
});
|
|
46
|
+
expect(d1.focus).toBe("unit:bookings");
|
|
47
|
+
expect(d1.nodes.some((n) => n.id === "flow:bookings.create")).toBe(true);
|
|
48
|
+
|
|
49
|
+
const d2 = buildArchitectureView(graph, {
|
|
50
|
+
focus: "unit:bookings",
|
|
51
|
+
depth: 2,
|
|
52
|
+
runs: ARCHITECTURE_RUNS_FIXTURE,
|
|
53
|
+
});
|
|
54
|
+
expect(d2.nodes.length).toBeGreaterThanOrEqual(d1.nodes.length);
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("element layers toggle typed edges", () => {
|
|
58
|
+
const all = buildArchitectureView(graph, {
|
|
59
|
+
layers: {
|
|
60
|
+
data: true,
|
|
61
|
+
messaging: true,
|
|
62
|
+
time: true,
|
|
63
|
+
external: true,
|
|
64
|
+
},
|
|
65
|
+
});
|
|
66
|
+
const noExternal = buildArchitectureView(graph, {
|
|
67
|
+
layers: {
|
|
68
|
+
data: true,
|
|
69
|
+
messaging: true,
|
|
70
|
+
time: true,
|
|
71
|
+
external: false,
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
expect(all.edges.some((e) => e.layer === "external")).toBe(true);
|
|
75
|
+
expect(noExternal.edges.some((e) => e.layer === "external")).toBe(false);
|
|
76
|
+
|
|
77
|
+
const withTime = buildArchitectureView(graph, {
|
|
78
|
+
focus: "flow:ops.nightlyReconcile",
|
|
79
|
+
depth: 1,
|
|
80
|
+
layers: {
|
|
81
|
+
data: false,
|
|
82
|
+
messaging: false,
|
|
83
|
+
time: true,
|
|
84
|
+
external: false,
|
|
85
|
+
},
|
|
86
|
+
});
|
|
87
|
+
expect(withTime.edges.some((e) => e.layer === "time")).toBe(true);
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
test("boundary crossing count comes from Manifest external effects", () => {
|
|
91
|
+
const count = boundaryCrossingCount(graph);
|
|
92
|
+
expect(count).toBe(1); // channel:booking-confirmed
|
|
93
|
+
const view = buildArchitectureView(graph);
|
|
94
|
+
expect(view.boundaryCrossingCount).toBe(count);
|
|
95
|
+
expect(
|
|
96
|
+
view.nodes.some((n) => n.id === "channel:booking-confirmed"),
|
|
97
|
+
).toBe(true);
|
|
98
|
+
expect(
|
|
99
|
+
view.nodes.find((n) => n.id === "channel:booking-confirmed")
|
|
100
|
+
?.insideBoundary,
|
|
101
|
+
).toBe(false);
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
test("edge thickness follows Runs traffic; zero traversals are dashed", () => {
|
|
105
|
+
const view = buildArchitectureView(graph, {
|
|
106
|
+
runs: ARCHITECTURE_RUNS_FIXTURE,
|
|
107
|
+
});
|
|
108
|
+
const withTraffic = view.edges.filter((e) => e.traversals > 0);
|
|
109
|
+
const dashed = view.edges.filter((e) => e.dashed);
|
|
110
|
+
expect(dashed.length).toBeGreaterThan(0);
|
|
111
|
+
expect(dashed.every((e) => e.traversals === 0)).toBe(true);
|
|
112
|
+
if (withTraffic.length > 0) {
|
|
113
|
+
expect(withTraffic.every((e) => !e.dashed)).toBe(true);
|
|
114
|
+
expect(withTraffic.every((e) => e.thickness >= 1)).toBe(true);
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
test("pathologies surface as findings", () => {
|
|
119
|
+
const findings = computePathologies(graph);
|
|
120
|
+
const kinds = new Set(findings.map((f) => f.kind));
|
|
121
|
+
expect(kinds.has("cycle")).toBe(true);
|
|
122
|
+
expect(kinds.has("god-node")).toBe(true);
|
|
123
|
+
expect(kinds.has("orphan-signal")).toBe(true);
|
|
124
|
+
expect(kinds.has("spof")).toBe(true);
|
|
125
|
+
expect(
|
|
126
|
+
findings.some((f) => f.detail.includes("legacy-unused")),
|
|
127
|
+
).toBe(true);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
describe("architecture traffic helpers", () => {
|
|
132
|
+
test("observeTraffic counts flow→resource traversals", () => {
|
|
133
|
+
const traffic = observeTraffic(ARCHITECTURE_RUNS_FIXTURE);
|
|
134
|
+
expect(traffic.size).toBeGreaterThan(0);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test("thickness scales 1–8", () => {
|
|
138
|
+
expect(thicknessOf(0, 100)).toBe(1);
|
|
139
|
+
expect(thicknessOf(100, 100)).toBe(8);
|
|
140
|
+
expect(thicknessOf(50, 100)).toBe(4);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
describe("architecture URL search", () => {
|
|
145
|
+
test("round-trips focus, depth, and layer offs", () => {
|
|
146
|
+
const parsed = parseArchitectureSearch({
|
|
147
|
+
focus: "unit:bookings",
|
|
148
|
+
depth: "2",
|
|
149
|
+
external: "false",
|
|
150
|
+
});
|
|
151
|
+
expect(parsed.focus).toBe("unit:bookings");
|
|
152
|
+
expect(parsed.depth).toBe(2);
|
|
153
|
+
expect(layersOf(parsed).external).toBe(false);
|
|
154
|
+
expect(layersOf(parsed).data).toBe(true);
|
|
155
|
+
const serialized = serializeArchitectureSearch(parsed);
|
|
156
|
+
expect(serialized.focus).toBe("unit:bookings");
|
|
157
|
+
expect(serialized.depth).toBe("2");
|
|
158
|
+
expect(serialized.external).toBe("false");
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
test("invalid search falls back", () => {
|
|
162
|
+
const parsed = parseArchitectureSearch({ depth: "9", focus: 1 });
|
|
163
|
+
expect(parsed.depth).toBe(1);
|
|
164
|
+
});
|
|
165
|
+
});
|