@ashlr/hub 3.4.0 → 3.5.1
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/CHANGELOG.md +107 -1
- package/README.md +3 -0
- package/dist/build-identity.json +2 -2
- package/dist/cli/index.js +11 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/local-runtime.js +40 -9
- package/dist/cli/local-runtime.js.map +1 -1
- package/dist/core/fleet/external-skill-audit.js +1 -1
- package/dist/core/fleet/external-skill-audit.js.map +1 -1
- package/dist/core/local-eval/classify.d.ts +57 -0
- package/dist/core/local-eval/classify.js +121 -0
- package/dist/core/local-eval/classify.js.map +1 -0
- package/dist/core/local-eval/configuration.d.ts +37 -0
- package/dist/core/local-eval/configuration.js +171 -0
- package/dist/core/local-eval/configuration.js.map +1 -0
- package/dist/core/local-eval/index.d.ts +15 -0
- package/dist/core/local-eval/index.js +16 -0
- package/dist/core/local-eval/index.js.map +1 -0
- package/dist/core/local-eval/main.d.ts +31 -0
- package/dist/core/local-eval/main.js +174 -0
- package/dist/core/local-eval/main.js.map +1 -0
- package/dist/core/local-eval/report.d.ts +25 -0
- package/dist/core/local-eval/report.js +157 -0
- package/dist/core/local-eval/report.js.map +1 -0
- package/dist/core/local-eval/runner.d.ts +55 -0
- package/dist/core/local-eval/runner.js +290 -0
- package/dist/core/local-eval/runner.js.map +1 -0
- package/dist/core/local-eval/tasks.d.ts +22 -0
- package/dist/core/local-eval/tasks.js +303 -0
- package/dist/core/local-eval/tasks.js.map +1 -0
- package/dist/core/local-eval/trace.d.ts +67 -0
- package/dist/core/local-eval/trace.js +309 -0
- package/dist/core/local-eval/trace.js.map +1 -0
- package/dist/core/local-eval/types.d.ts +262 -0
- package/dist/core/local-eval/types.js +23 -0
- package/dist/core/local-eval/types.js.map +1 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-host.d.ts +68 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-host.js +120 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-host.js.map +1 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-process.d.ts +15 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-process.js +21 -0
- package/dist/core/local-runtime/llama/anthropic-proxy-process.js.map +1 -0
- package/dist/core/local-runtime/llama/anthropic-proxy.d.ts +2 -1
- package/dist/core/local-runtime/llama/anthropic-proxy.js +14 -6
- package/dist/core/local-runtime/llama/anthropic-proxy.js.map +1 -1
- package/dist/core/local-runtime/llama/anthropic-shim.d.ts +33 -0
- package/dist/core/local-runtime/llama/anthropic-shim.js +59 -0
- package/dist/core/local-runtime/llama/anthropic-shim.js.map +1 -1
- package/dist/core/local-runtime/llama/config.d.ts +123 -6
- package/dist/core/local-runtime/llama/config.js +196 -6
- package/dist/core/local-runtime/llama/config.js.map +1 -1
- package/dist/core/local-runtime/llama/index.d.ts +15 -0
- package/dist/core/local-runtime/llama/index.js +13 -0
- package/dist/core/local-runtime/llama/index.js.map +1 -1
- package/dist/core/local-runtime/llama/paths.d.ts +17 -0
- package/dist/core/local-runtime/llama/paths.js +25 -0
- package/dist/core/local-runtime/llama/paths.js.map +1 -1
- package/dist/core/local-runtime/llama/proxy-invocation.d.ts +101 -0
- package/dist/core/local-runtime/llama/proxy-invocation.js +134 -0
- package/dist/core/local-runtime/llama/proxy-invocation.js.map +1 -0
- package/dist/core/local-runtime/llama/proxy-launchd.d.ts +83 -0
- package/dist/core/local-runtime/llama/proxy-launchd.js +216 -0
- package/dist/core/local-runtime/llama/proxy-launchd.js.map +1 -0
- package/dist/core/local-runtime/llama/shapes.d.ts +2 -1
- package/dist/core/local-runtime/llama/shapes.js +2 -1
- package/dist/core/local-runtime/llama/shapes.js.map +1 -1
- package/dist/core/verse/adapters/claude.js +16 -0
- package/dist/core/verse/adapters/claude.js.map +1 -1
- package/dist/core/verse/adapters/codex.js +60 -2
- package/dist/core/verse/adapters/codex.js.map +1 -1
- package/dist/core/verse/adapters/grok.js +13 -0
- package/dist/core/verse/adapters/grok.js.map +1 -1
- package/dist/core/verse/control-api.d.ts +8 -9
- package/dist/core/verse/control-api.js +14 -114
- package/dist/core/verse/control-api.js.map +1 -1
- package/dist/core/verse/github-api.d.ts +50 -0
- package/dist/core/verse/github-api.js +211 -0
- package/dist/core/verse/github-api.js.map +1 -0
- package/dist/core/verse/github-proposal.d.ts +64 -0
- package/dist/core/verse/github-proposal.js +186 -0
- package/dist/core/verse/github-proposal.js.map +1 -0
- package/dist/core/verse/github-repo.d.ts +104 -0
- package/dist/core/verse/github-repo.js +476 -0
- package/dist/core/verse/github-repo.js.map +1 -0
- package/dist/core/verse/github-types.d.ts +174 -0
- package/dist/core/verse/github-types.js +31 -0
- package/dist/core/verse/github-types.js.map +1 -0
- package/dist/core/verse/mcp-cli-health.d.ts +149 -0
- package/dist/core/verse/mcp-cli-health.js +227 -0
- package/dist/core/verse/mcp-cli-health.js.map +1 -0
- package/dist/core/verse/mcp-control-api.d.ts +68 -0
- package/dist/core/verse/mcp-control-api.js +322 -0
- package/dist/core/verse/mcp-control-api.js.map +1 -0
- package/dist/core/verse/mcp-mutation.d.ts +187 -0
- package/dist/core/verse/mcp-mutation.js +471 -0
- package/dist/core/verse/mcp-mutation.js.map +1 -0
- package/dist/core/verse/mcp-scope.d.ts +114 -0
- package/dist/core/verse/mcp-scope.js +149 -0
- package/dist/core/verse/mcp-scope.js.map +1 -0
- package/dist/core/verse/mcp-seat-view.d.ts +197 -0
- package/dist/core/verse/mcp-seat-view.js +322 -0
- package/dist/core/verse/mcp-seat-view.js.map +1 -0
- package/dist/core/verse/path-guard.d.ts +115 -0
- package/dist/core/verse/path-guard.js +171 -0
- package/dist/core/verse/path-guard.js.map +1 -0
- package/dist/core/verse/seats.js +30 -2
- package/dist/core/verse/seats.js.map +1 -1
- package/dist/core/verse/session-engine.js +60 -1
- package/dist/core/verse/session-engine.js.map +1 -1
- package/dist/core/verse/session-store.js +20 -0
- package/dist/core/verse/session-store.js.map +1 -1
- package/dist/core/verse/types.d.ts +225 -1
- package/dist/core/verse/types.js +26 -0
- package/dist/core/verse/types.js.map +1 -1
- package/dist/core/verse/verse-api.d.ts +16 -1
- package/dist/core/verse/verse-api.js +338 -16
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/verse/workspaces.d.ts +130 -0
- package/dist/core/verse/workspaces.js +501 -0
- package/dist/core/verse/workspaces.js.map +1 -0
- package/dist/core/web/api.js +23 -0
- package/dist/core/web/api.js.map +1 -1
- package/dist/core/web/public/next/assets/App-BbVoUCIi.js +7 -0
- package/dist/core/web/public/next/assets/App-BbVoUCIi.js.map +1 -0
- package/dist/core/web/public/next/assets/App-Cgi6j1Gk.css +1 -0
- package/dist/core/web/public/next/assets/ApprovalsSection-BW9iVjUa.js +2 -0
- package/dist/core/web/public/next/assets/ApprovalsSection-BW9iVjUa.js.map +1 -0
- package/dist/core/web/public/next/assets/ApprovalsSection-Su-NUTis.css +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-CRqHUhED.js +2 -0
- package/dist/core/web/public/next/assets/AutonomySection-CRqHUhED.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-Cpk_oEhc.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-5irrh6Jw.js +80 -0
- package/dist/core/web/public/next/assets/ChatSection-5irrh6Jw.js.map +1 -0
- package/dist/core/web/public/next/assets/ChatSection-LQiAn6Eu.css +1 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CXevY3Au.js +2 -0
- package/dist/core/web/public/next/assets/ConfirmDialog-CXevY3Au.js.map +1 -0
- package/dist/core/web/public/next/assets/{ConfirmDialog-cYuivhCX.css → ConfirmDialog-Dx15x0Ho.css} +1 -1
- package/dist/core/web/public/next/assets/Dialog-Bn0CgEGz.js +2 -0
- package/dist/core/web/public/next/assets/Dialog-Bn0CgEGz.js.map +1 -0
- package/dist/core/web/public/next/assets/Dialog-tQ8kFulD.css +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-C8HHTnVE.css +1 -0
- package/dist/core/web/public/next/assets/DiffViewer-QKyisN2L.js +7 -0
- package/dist/core/web/public/next/assets/DiffViewer-QKyisN2L.js.map +1 -0
- package/dist/core/web/public/next/assets/{MutationTokenDialog-jWLLCxWn.css → MutationTokenDialog-CrfJ0PdD.css} +1 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-DbSHPy3w.js +2 -0
- package/dist/core/web/public/next/assets/MutationTokenDialog-DbSHPy3w.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-C-PCgCzo.js +7 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-C-PCgCzo.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CM_8pJs6.css +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-Dw8ZjmkS.js +2 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-Dw8ZjmkS.js.map +1 -0
- package/dist/core/web/public/next/assets/RouteErrorBoundary-ekyMXAK8.css +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-BII7TTSD.css +1 -0
- package/dist/core/web/public/next/assets/SettingsSection-CWxtTNlD.js +2 -0
- package/dist/core/web/public/next/assets/SettingsSection-CWxtTNlD.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-Bk5HipM0.js +2 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-Bk5HipM0.js.map +1 -0
- package/dist/core/web/public/next/assets/UniverseConsoleApp-Dh7A-hLD.css +1 -0
- package/dist/core/web/public/next/assets/UniverseView-Bqa8DH57.css +1 -0
- package/dist/core/web/public/next/assets/UniverseView-D8k9q0ce.js +9 -0
- package/dist/core/web/public/next/assets/UniverseView-D8k9q0ce.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-B2E06ZH1.js +2 -0
- package/dist/core/web/public/next/assets/UsageSection-B2E06ZH1.js.map +1 -0
- package/dist/core/web/public/next/assets/UsageSection-DwgNOYvi.css +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CRfZUV-T.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CRfZUV-T.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-D2E3mU9a.css +1 -0
- package/dist/core/web/public/next/assets/charts-CsrtT4rk.css +1 -0
- package/dist/core/web/public/next/assets/charts-DSUpczxG.js +2 -0
- package/dist/core/web/public/next/assets/charts-DSUpczxG.js.map +1 -0
- package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js +2 -0
- package/dist/core/web/public/next/assets/fleet-model-ClBbQ0Uj.js.map +1 -0
- package/dist/core/web/public/next/assets/format-BNYWGJat.js +2 -0
- package/dist/core/web/public/next/assets/format-BNYWGJat.js.map +1 -0
- package/dist/core/web/public/next/assets/global-C4jfYHrj.js +2 -0
- package/dist/core/web/public/next/assets/global-C4jfYHrj.js.map +1 -0
- package/dist/core/web/public/next/assets/global-D463gG1X.css +1 -0
- package/dist/core/web/public/next/assets/icons-BxOX8-XB.js +2 -0
- package/dist/core/web/public/next/assets/icons-BxOX8-XB.js.map +1 -0
- package/dist/core/web/public/next/assets/index-BMRIET7F.js +11 -0
- package/dist/core/web/public/next/assets/index-BMRIET7F.js.map +1 -0
- package/dist/core/web/public/next/assets/queries-AxnVa02h.js +2 -0
- package/dist/core/web/public/next/assets/queries-AxnVa02h.js.map +1 -0
- package/dist/core/web/public/next/assets/use-guarded-action-BO6c94Wp.js +2 -0
- package/dist/core/web/public/next/assets/use-guarded-action-BO6c94Wp.js.map +1 -0
- package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js +2 -0
- package/dist/core/web/public/next/assets/verse-model-CvtK6vP6.js.map +1 -0
- package/dist/core/web/public/next/assets/workspace-model-cE4LkKpE.js +2 -0
- package/dist/core/web/public/next/assets/workspace-model-cE4LkKpE.js.map +1 -0
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/docs/README.md +4 -0
- package/node_modules/marked/README.md +8 -0
- package/node_modules/marked/bin/main.js +12 -11
- package/node_modules/marked/lib/marked.d.ts +88 -25
- package/node_modules/marked/lib/marked.esm.js +50 -44
- package/node_modules/marked/lib/marked.esm.js.map +3 -3
- package/node_modules/marked/lib/marked.umd.js +50 -44
- package/node_modules/marked/lib/marked.umd.js.map +3 -3
- package/node_modules/marked/man/marked.1 +1 -1
- package/node_modules/marked/package.json +21 -21
- package/package.json +13 -8
- package/dist/cli/activation.d.ts +0 -41
- package/dist/cli/activation.js +0 -485
- package/dist/cli/activation.js.map +0 -1
- package/dist/core/fleet/generated-repair-resolution.d.ts +0 -36
- package/dist/core/fleet/generated-repair-resolution.js +0 -245
- package/dist/core/fleet/generated-repair-resolution.js.map +0 -1
- package/dist/core/local-runtime/llama/port.d.ts +0 -17
- package/dist/core/local-runtime/llama/port.js +0 -47
- package/dist/core/local-runtime/llama/port.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-host.d.ts +0 -54
- package/dist/core/local-runtime/llama/proxy-host.js +0 -159
- package/dist/core/local-runtime/llama/proxy-host.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-process.d.ts +0 -148
- package/dist/core/local-runtime/llama/proxy-process.js +0 -250
- package/dist/core/local-runtime/llama/proxy-process.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-record.d.ts +0 -40
- package/dist/core/local-runtime/llama/proxy-record.js +0 -133
- package/dist/core/local-runtime/llama/proxy-record.js.map +0 -1
- package/dist/core/local-runtime/llama/proxy-supervisor.d.ts +0 -118
- package/dist/core/local-runtime/llama/proxy-supervisor.js +0 -511
- package/dist/core/local-runtime/llama/proxy-supervisor.js.map +0 -1
- package/dist/core/web/public/next/assets/App-BCKqSppK.css +0 -1
- package/dist/core/web/public/next/assets/App-LuILXjWG.js +0 -16
- package/dist/core/web/public/next/assets/App-LuILXjWG.js.map +0 -1
- package/dist/core/web/public/next/assets/ApprovalsSection-B_Xor8JH.js +0 -2
- package/dist/core/web/public/next/assets/ApprovalsSection-B_Xor8JH.js.map +0 -1
- package/dist/core/web/public/next/assets/ApprovalsSection-CRP59wSb.css +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-BB8RD-tv.css +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-BEwITtPJ.js +0 -2
- package/dist/core/web/public/next/assets/AutonomySection-BEwITtPJ.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-DrxqhBPK.css +0 -1
- package/dist/core/web/public/next/assets/ChatSection-bRAzlMth.js +0 -77
- package/dist/core/web/public/next/assets/ChatSection-bRAzlMth.js.map +0 -1
- package/dist/core/web/public/next/assets/ConfirmDialog-BqkZdPs_.js +0 -2
- package/dist/core/web/public/next/assets/ConfirmDialog-BqkZdPs_.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-CPmedg4S.js +0 -2
- package/dist/core/web/public/next/assets/Dialog-CPmedg4S.js.map +0 -1
- package/dist/core/web/public/next/assets/Dialog-DxN7RgB5.css +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-DmPJbeM_.js +0 -7
- package/dist/core/web/public/next/assets/DiffViewer-DmPJbeM_.js.map +0 -1
- package/dist/core/web/public/next/assets/DiffViewer-hN7X6wGT.css +0 -1
- package/dist/core/web/public/next/assets/Epistemic-DiyMyeaN.css +0 -1
- package/dist/core/web/public/next/assets/Epistemic-M3SxLHjq.js +0 -2
- package/dist/core/web/public/next/assets/Epistemic-M3SxLHjq.js.map +0 -1
- package/dist/core/web/public/next/assets/Meter-CGBsbXUX.css +0 -1
- package/dist/core/web/public/next/assets/Meter-D_X7c9U3.js +0 -2
- package/dist/core/web/public/next/assets/Meter-D_X7c9U3.js.map +0 -1
- package/dist/core/web/public/next/assets/MutationTokenDialog-Ba5ZHu-8.js +0 -2
- package/dist/core/web/public/next/assets/MutationTokenDialog-Ba5ZHu-8.js.map +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-O7jUBOmX.css +0 -1
- package/dist/core/web/public/next/assets/RefreshIndicator-vHGpmyzb.js +0 -2
- package/dist/core/web/public/next/assets/RefreshIndicator-vHGpmyzb.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-B5g6JEVk.js +0 -7
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-B5g6JEVk.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-DLl4DbGG.css +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-BIpdnxp-.css +0 -1
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CroxuKoi.js +0 -2
- package/dist/core/web/public/next/assets/RouteErrorBoundary-CroxuKoi.js.map +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-DGJMdUh2.css +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-p-7FCGfn.js +0 -2
- package/dist/core/web/public/next/assets/SettingsSection-p-7FCGfn.js.map +0 -1
- package/dist/core/web/public/next/assets/Skeleton-4qq4HuJO.js +0 -2
- package/dist/core/web/public/next/assets/Skeleton-4qq4HuJO.js.map +0 -1
- package/dist/core/web/public/next/assets/Skeleton-D2JaTXyv.css +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-BbEdqEGn.js +0 -2
- package/dist/core/web/public/next/assets/StatusBadge-BbEdqEGn.js.map +0 -1
- package/dist/core/web/public/next/assets/StatusBadge-TpDqZf6K.css +0 -1
- package/dist/core/web/public/next/assets/TableView-R6Yeztp1.css +0 -1
- package/dist/core/web/public/next/assets/TableView-nyYs7Sv1.js +0 -2
- package/dist/core/web/public/next/assets/TableView-nyYs7Sv1.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-CiZZxRPV.css +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-DjTpQUrA.js +0 -2
- package/dist/core/web/public/next/assets/UniverseConsoleApp-DjTpQUrA.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-BtApwayT.js +0 -9
- package/dist/core/web/public/next/assets/UniverseView-BtApwayT.js.map +0 -1
- package/dist/core/web/public/next/assets/UniverseView-gBxl6yum.css +0 -1
- package/dist/core/web/public/next/assets/UsageSection-Db99N6ao.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-Db99N6ao.js.map +0 -1
- package/dist/core/web/public/next/assets/UsageSection-UUYDidOg.css +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-COa3J2dO.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-COa3J2dO.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-mOAXvWa6.css +0 -1
- package/dist/core/web/public/next/assets/fleet-model-DXCfVtNW.js +0 -2
- package/dist/core/web/public/next/assets/fleet-model-DXCfVtNW.js.map +0 -1
- package/dist/core/web/public/next/assets/format-fggwu_Rs.js +0 -2
- package/dist/core/web/public/next/assets/format-fggwu_Rs.js.map +0 -1
- package/dist/core/web/public/next/assets/global-BeRYd1Bu.css +0 -1
- package/dist/core/web/public/next/assets/global-CNVapoV1.js +0 -2
- package/dist/core/web/public/next/assets/global-CNVapoV1.js.map +0 -1
- package/dist/core/web/public/next/assets/index-BkUlX2Se.js +0 -51
- package/dist/core/web/public/next/assets/index-BkUlX2Se.js.map +0 -1
- package/dist/core/web/public/next/assets/index-YNTgDG2b.js +0 -2
- package/dist/core/web/public/next/assets/index-YNTgDG2b.js.map +0 -1
- package/dist/core/web/public/next/assets/queries-C9XS4SYq.js +0 -2
- package/dist/core/web/public/next/assets/queries-C9XS4SYq.js.map +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-Bqa2v0a-.css +0 -1
- package/dist/core/web/public/next/assets/use-guarded-action-Bql1nA-z.js +0 -2
- package/dist/core/web/public/next/assets/use-guarded-action-Bql1nA-z.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-IrNQKtER.js +0 -2
- package/dist/core/web/public/next/assets/verse-model-IrNQKtER.js.map +0 -1
- package/node_modules/which/CHANGELOG.md +0 -166
- /package/node_modules/marked/{LICENSE.md → LICENSE} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--chart-series-1: var(--status-success-solid);--chart-series-2: var(--phase-2);--chart-series-3: var(--phase-5);--chart-series-4: var(--status-danger-solid);--chart-series-5: var(--phase-1);--chart-series-6: var(--phase-4);--chart-series-7: var(--phase-3);--chart-neutral: var(--status-neutral-solid);--chart-sequential: var(--accent-500);--chart-sequential-soft: var(--accent-300);--chart-diverging-pos: var(--accent-500);--chart-diverging-neg: var(--status-danger-solid);--chart-diverging-mid: var(--border-strong);--chart-grid: var(--border-subtle);--chart-axis: var(--border-strong);--chart-surface: var(--bg-surface);--chart-tooltip-bg: var(--bg-surface-raised);--chart-tooltip-border: var(--border-default)}._figure_1si9v_1{margin:0;border:1px solid var(--border-subtle);border-radius:var(--radius-lg);background:var(--bg-surface);padding:var(--space-4)}._caption_1si9v_12{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-3);margin-bottom:var(--space-3)}._title_1si9v_20{font-size:var(--text-sm-size);font-weight:var(--font-weight-semibold);color:var(--text-primary)}._description_1si9v_26{font-size:var(--text-xs-size);color:var(--text-tertiary)}._plot_1si9v_31{width:100%;overflow-x:auto}._tableDisclosure_1si9v_36{margin-top:var(--space-3);border-top:1px solid var(--border-subtle);padding-top:var(--space-2)}._tableDisclosure_1si9v_36>summary{cursor:pointer;font-size:var(--text-xs-size);color:var(--text-secondary);list-style:none}._tableDisclosure_1si9v_36>summary::-webkit-details-marker{display:none}._tableDisclosure_1si9v_36>summary:before{content:"▸ "}._tableDisclosure_1si9v_36[open]>summary:before{content:"▾ "}._tableBody_1si9v_61{margin-top:var(--space-2)}._caveat_1si9v_65{margin:0 0 var(--space-3);padding:var(--space-2) var(--space-3);border-radius:var(--radius-md);background:var(--status-unknown-bg);color:var(--status-unknown-fg);font-size:var(--text-xs-size);line-height:var(--text-sm-line)}._empty_1si9v_75{color:var(--text-tertiary);font-size:var(--text-sm-size);padding:var(--space-6) 0;text-align:center}._legend_4pgvn_1{display:flex;flex-wrap:wrap;gap:var(--space-1) var(--space-4);margin:var(--space-2) 0 0;padding:0;list-style:none}._item_4pgvn_10{display:inline-flex;align-items:center;gap:var(--space-2);font-size:var(--text-xs-size);color:var(--text-secondary)}._swatch_4pgvn_18{width:10px;height:10px;border-radius:var(--radius-full);flex:none}._swatchLine_4pgvn_25{width:14px;height:2px;border-radius:var(--radius-full);flex:none}._svg_djmd1_1{display:block;width:100%;height:auto}._gridline_djmd1_7{stroke:var(--chart-grid);stroke-width:1}._axis_djmd1_12{stroke:var(--chart-axis);stroke-width:1}._axisLabel_djmd1_17{font-size:var(--text-xs-size);fill:var(--text-tertiary);font-family:var(--font-ui)}._line_djmd1_23{fill:none;stroke-width:2;stroke-linecap:round;stroke-linejoin:round}._area_djmd1_30{opacity:.1;stroke:none}._marker_djmd1_35{stroke:var(--chart-surface);stroke-width:2}._endLabel_djmd1_40{font-size:var(--text-xs-size);font-family:var(--font-ui);font-weight:var(--font-weight-medium)}._crosshairLine_djmd1_46{stroke:var(--chart-axis);stroke-width:1;pointer-events:none}._overlay_djmd1_52{fill:transparent;cursor:crosshair}._wrap_djmd1_57{position:relative}._tooltip_djmd1_61{position:absolute;pointer-events:none;background:var(--chart-tooltip-bg);border:1px solid var(--chart-tooltip-border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);padding:var(--space-2);font-size:var(--text-xs-size);color:var(--text-primary);white-space:nowrap;z-index:var(--z-dropdown);transform:translate(-50%,-100%);margin-top:-10px}._tooltipDate_djmd1_77{color:var(--text-tertiary);margin-bottom:var(--space-1)}._tooltipRow_djmd1_82{display:flex;align-items:center;gap:var(--space-1)}._tooltipKey_djmd1_88{width:12px;height:2px;flex:none}._tooltipValue_djmd1_94{font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}._tooltipGap_djmd1_99{color:var(--text-tertiary);font-style:italic}._svg_o4jfa_1{display:block;overflow:visible}._bar_o4jfa_6{transition:opacity var(--duration-fast) var(--ease-standard)}._bar_o4jfa_6:hover,._bar_o4jfa_6:focus-visible{opacity:.82}._baseline_o4jfa_15{stroke:var(--chart-axis);stroke-width:1}._gridline_o4jfa_20{stroke:var(--chart-grid);stroke-width:1}._axisLabel_o4jfa_25{font-size:10px;fill:var(--text-tertiary);font-family:var(--font-ui)}._valueLabel_o4jfa_31{font-size:10px;fill:var(--text-secondary);font-family:var(--font-ui);font-variant-numeric:tabular-nums}._categoryLabel_o4jfa_38{font-size:10px;fill:var(--text-secondary);font-family:var(--font-ui)}._hitArea_o4jfa_44{fill:transparent;cursor:pointer}._tooltip_o4jfa_49{position:absolute;pointer-events:none;background:var(--chart-tooltip-bg);border:1px solid var(--chart-tooltip-border);border-radius:var(--radius-sm);box-shadow:var(--shadow-md);padding:var(--space-1) var(--space-2);font-size:var(--text-xs-size);color:var(--text-primary);white-space:nowrap;z-index:var(--z-dropdown)}._tooltipValue_o4jfa_63{font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums}._tooltipLabel_o4jfa_68{color:var(--text-tertiary);margin-left:var(--space-1)}._wrap_o4jfa_73{position:relative}._sparkline_gomyo_1{display:block;overflow:visible}._line_gomyo_6{fill:none;stroke:var(--text-tertiary);stroke-width:1.5;stroke-linecap:round;stroke-linejoin:round}._dot_gomyo_14{fill:var(--chart-sequential)}._tile_rp7c9_1{display:flex;flex-direction:column;gap:var(--space-1);padding:var(--space-4);border-radius:var(--radius-lg);border:1px solid var(--border-subtle);background:var(--bg-surface)}._label_rp7c9_11{font-size:var(--text-xs-size);color:var(--text-tertiary);text-transform:uppercase;letter-spacing:.04em}._row_rp7c9_18{display:flex;align-items:baseline;justify-content:space-between;gap:var(--space-2)}._value_rp7c9_25{font-size:var(--text-2xl-size);font-weight:var(--font-weight-semibold);color:var(--text-primary)}._trendRow_rp7c9_31{display:flex;align-items:center;justify-content:space-between;gap:var(--space-2)}._delta_rp7c9_38{font-size:var(--text-xs-size);font-variant-numeric:tabular-nums}._deltaGood_rp7c9_43{color:var(--status-success-fg)}._deltaBad_rp7c9_47{color:var(--status-danger-fg)}._deltaNeutral_rp7c9_51{color:var(--text-tertiary)}._caption_rp7c9_55{font-size:var(--text-xs-size);color:var(--text-tertiary)}._table_1ggl4_1{width:100%;border-collapse:collapse;font-size:var(--text-xs-size)}._table_1ggl4_1 th,._table_1ggl4_1 td{text-align:left;padding:var(--space-1) var(--space-2);border-bottom:1px solid var(--border-subtle)}._table_1ggl4_1 th{color:var(--text-tertiary);font-weight:var(--font-weight-medium);text-transform:uppercase;letter-spacing:.04em;font-size:var(--text-xs-size)}._numeric_1ggl4_22{text-align:right;font-variant-numeric:tabular-nums}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,r as O}from"./index-BkUlX2Se.js";const ie="_figure_1si9v_1",re="_caption_1si9v_12",ue="_title_1si9v_20",de="_description_1si9v_26",xe="_plot_1si9v_31",_e="_tableDisclosure_1si9v_36",me="_tableBody_1si9v_61",he="_caveat_1si9v_65",pe="_empty_1si9v_75",W={figure:ie,caption:re,title:ue,description:de,plot:xe,tableDisclosure:_e,tableBody:me,caveat:he,empty:pe};function ft({title:t,description:l,caveat:n,children:o,table:c,empty:b,emptyMessage:x="No data for this window."}){return e.jsxs("figure",{className:W.figure,children:[e.jsxs("figcaption",{className:W.caption,children:[e.jsx("span",{className:W.title,children:t}),l?e.jsx("span",{className:W.description,children:l}):null]}),n?e.jsx("p",{className:W.caveat,role:"note",children:n}):null,b?e.jsx("p",{className:W.empty,children:x}):e.jsx("div",{className:W.plot,children:o}),c?e.jsxs("details",{className:W.tableDisclosure,children:[e.jsx("summary",{children:"View as table"}),e.jsx("div",{className:W.tableBody,children:c})]}):null]})}const je="_legend_4pgvn_1",ge="_item_4pgvn_10",ve="_swatch_4pgvn_18",be="_swatchLine_4pgvn_25",Y={legend:je,item:ge,swatch:ve,swatchLine:be};function fe({items:t}){return t.length<2?null:e.jsx("ul",{className:Y.legend,children:t.map(l=>e.jsxs("li",{className:Y.item,children:[e.jsx("span",{className:l.kind==="line"?Y.swatchLine:Y.swatch,style:{background:l.color},"aria-hidden":"true"}),l.label]},l.label))})}const te=7;function q(t){return`var(--chart-series-${(t%te+te)%te+1})`}const ye="var(--chart-sequential)",se="var(--chart-grid)",ne="var(--chart-axis)",Ne="_svg_djmd1_1",Le="_gridline_djmd1_7",$e="_axis_djmd1_12",we="_axisLabel_djmd1_17",Ae="_line_djmd1_23",Me="_area_djmd1_30",Be="_marker_djmd1_35",Se="_endLabel_djmd1_40",ke="_crosshairLine_djmd1_46",De="_overlay_djmd1_52",Ee="_wrap_djmd1_57",Re="_tooltip_djmd1_61",Pe="_tooltipDate_djmd1_77",We="_tooltipRow_djmd1_82",Te="_tooltipKey_djmd1_88",Fe="_tooltipValue_djmd1_94",Ce="_tooltipGap_djmd1_99",p={svg:Ne,gridline:Le,axis:$e,axisLabel:we,line:Ae,area:Me,marker:Be,endLabel:Se,crosshairLine:ke,overlay:De,wrap:Ee,tooltip:Re,tooltipDate:Pe,tooltipRow:We,tooltipKey:Te,tooltipValue:Fe,tooltipGap:Ce},U=640,X=44,Ie=12,Q=12,J=24,He=4,Ge=6.4,oe=4,Xe=150;function Ve(t){const l=[];let n=[];for(const o of t){if(o.y===null){n.length&&l.push(n),n=[];continue}n.push({x:o.x,y:o.y})}return n.length&&l.push(n),l}function Ke(t,l,n){if(l<=t)return[t];const o=(l-t)/n;return Array.from({length:n+1},(c,b)=>t+o*b)}function yt({series:t,height:l=200,area:n=!1,formatX:o=x=>String(x),formatY:c=x=>String(x),ariaLabel:b}){const x=O.useRef(null),[r,f]=O.useState(null),[S,F]=O.useState(null),g=t.flatMap(s=>s.points.map(a=>a.x)),M=t.flatMap(s=>s.points.map(a=>a.y)).filter(s=>s!==null);if(g.length===0)return e.jsx("p",{children:"No data."});const k=Math.min(...g),i=Math.max(...g),L=Math.min(0,...M),C=Math.max(1e-4,...M),D=i-k||1,V=C-L||1,K=t.length>=1&&t.length<=4,E=K?Math.max(...t.map(s=>s.label.length))*Ge:0,u=K&&E<=Xe,$=Ie+(u?oe+E:0),_=t.length>=2,R=U-X-$,B=l-Q-J,m=s=>X+(s-k)/D*R,d=s=>Q+B-(s-L)/V*B,T=Ke(L,C,He),y=Array.from(new Set(g)).sort((s,a)=>s-a);function Z(s){const a=x.current;if(!a)return null;const v=a.getBoundingClientRect(),w=(s-v.left)/v.width*U,N=k+(w-X)/R*D;let P=y[0],H=1/0;for(const G of y){const z=Math.abs(G-N);z<H&&(H=z,P=G)}return P}function I(s){const a=Z(s.clientX);if(a===null)return;f(a);const v=x.current;if(v){const w=v.getBoundingClientRect(),N=m(a)/U*w.width;F({left:N,top:0})}}const ae=r!==null?t.map(s=>({series:s,point:s.points.find(a=>a.x===r)??null})):null;return e.jsxs("div",{className:p.wrap,children:[e.jsxs("svg",{ref:x,className:p.svg,viewBox:`0 0 ${U} ${l}`,role:"img","aria-label":b,onPointerMove:I,onPointerLeave:()=>f(null),children:[T.map((s,a)=>e.jsxs("g",{children:[e.jsx("line",{x1:X,x2:U-$,y1:d(s),y2:d(s),className:p.gridline,stroke:se}),e.jsx("text",{x:X-6,y:d(s),dy:"0.32em",textAnchor:"end",className:p.axisLabel,children:c(s)})]},a)),e.jsx("line",{x1:X,x2:U-$,y1:l-J,y2:l-J,className:p.axis,stroke:ne}),y.length>1?[y[0],y[y.length-1]].map((s,a)=>e.jsx("text",{x:m(s),y:l-6,textAnchor:a===0?"start":"end",className:p.axisLabel,children:o(s)},a)):null,t.map((s,a)=>{const v=q(a),w=Ve(s.points);return e.jsxs("g",{children:[n&&t.length===1?w.map((N,P)=>{const H=N.map((G,z)=>`${z===0?"M":"L"}${m(G.x)},${d(G.y)}`).join(" ")+` L${m(N[N.length-1].x)},${d(L)} L${m(N[0].x)},${d(L)} Z`;return e.jsx("path",{d:H,fill:v,className:p.area},P)}):null,w.map((N,P)=>e.jsx("path",{d:N.map((H,G)=>`${G===0?"M":"L"}${m(H.x)},${d(H.y)}`).join(" "),stroke:v,className:p.line},P)),u&&w.length?(()=>{const N=w[w.length-1],P=N[N.length-1];return e.jsx("text",{x:m(P.x)+oe,y:d(P.y),dy:"0.32em",className:p.endLabel,fill:v,children:s.label})})():null]},s.id)}),r!==null?e.jsx("line",{x1:m(r),x2:m(r),y1:Q,y2:l-J,className:p.crosshairLine}):null,r!==null?t.map((s,a)=>{const v=s.points.find(w=>w.x===r);return!v||v.y===null?null:e.jsx("circle",{cx:m(v.x),cy:d(v.y),r:4,fill:q(a),className:p.marker},s.id)}):null,e.jsx("rect",{x:X,y:Q,width:R,height:B,className:p.overlay,onFocus:()=>f(y[y.length-1]??null)})]}),ae&&S?e.jsxs("div",{className:p.tooltip,style:{left:S.left,top:S.top},children:[e.jsx("div",{className:p.tooltipDate,children:o(r)}),ae.map(({series:s,point:a},v)=>e.jsxs("div",{className:p.tooltipRow,children:[e.jsx("span",{className:p.tooltipKey,style:{background:q(v)},"aria-hidden":"true"}),a&&a.y!==null?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:p.tooltipValue,children:c(a.y)}),_?e.jsx("span",{children:s.label}):null]}):e.jsxs("span",{className:p.tooltipGap,children:["no data",_?` — ${s.label}`:""]})]},s.id))]}):null,_?e.jsx(fe,{items:t.map((s,a)=>({label:s.label,color:q(a),kind:"line"}))}):null]})}const Ue="_svg_o4jfa_1",Oe="_bar_o4jfa_6",Ze="_baseline_o4jfa_15",ze="_axisLabel_o4jfa_25",Ye="_valueLabel_o4jfa_31",qe="_categoryLabel_o4jfa_38",Qe="_hitArea_o4jfa_44",Je="_tooltip_o4jfa_49",et="_tooltipValue_o4jfa_63",tt="_tooltipLabel_o4jfa_68",lt="_wrap_o4jfa_73",h={svg:Ue,bar:Oe,baseline:Ze,axisLabel:ze,valueLabel:Ye,categoryLabel:qe,hitArea:Qe,tooltip:Je,tooltipValue:et,tooltipLabel:tt,wrap:lt},ee=24,j=10;function Nt({data:t,height:l=160,orientation:n="vertical",color:o=ye,formatValue:c=x=>String(x),ariaLabel:b}){const x=O.useId(),[r,f]=O.useState(null),S=t.map(u=>u.value).filter(u=>u!==null),F=Math.max(0,...S,1e-4),g=Math.min(0,...S),M=F-g||1;if(n==="horizontal"){const _=Math.min(ee,Math.max(14,Math.floor((l-j)/t.length)-j)),R=420,B=t.length*(_+j)+j,m=120+R+48;return e.jsxs("div",{className:h.wrap,children:[e.jsxs("svg",{className:h.svg,width:m,height:B,viewBox:`0 0 ${m} ${B}`,role:"img","aria-label":b,children:[e.jsx("line",{x1:120,y1:0,x2:120,y2:B,className:h.baseline,stroke:ne}),t.map((d,T)=>{const y=j+T*(_+j),Z=d.value!==null?(d.value-g)/M*R:0;return e.jsxs("g",{children:[e.jsx("text",{x:112,y:y+_/2,dy:"0.32em",textAnchor:"end",className:h.categoryLabel,children:d.label.length>22?`${d.label.slice(0,21)}…`:d.label}),d.value===null?e.jsx("line",{x1:124,y1:y+_/2,x2:134,y2:y+_/2,stroke:se,strokeWidth:2,strokeDasharray:"2 2"}):e.jsxs(e.Fragment,{children:[e.jsx("rect",{x:120,y,width:Math.max(2,Z),height:_,rx:4,fill:o,className:h.bar}),e.jsx("text",{x:120+Math.max(2,Z)+6,y:y+_/2,dy:"0.32em",className:h.valueLabel,children:c(d.value)})]}),e.jsx("rect",{className:h.hitArea,x:0,y:y-j/2,width:m,height:_+j,tabIndex:0,role:"img","aria-label":`${d.label}: ${d.value===null?"no data":c(d.value)}`,onPointerEnter:()=>f(T),onPointerLeave:()=>f(I=>I===T?null:I),onFocus:()=>f(T),onBlur:()=>f(I=>I===T?null:I)})]},d.label+T)})]}),r!==null?e.jsxs("div",{className:h.tooltip,style:{left:128,top:j+r*(_+j)-4},children:[e.jsx("span",{className:h.tooltipValue,children:t[r].value===null?"no data":c(t[r].value)}),e.jsx("span",{className:h.tooltipLabel,children:t[r].label})]}):null]})}const k=t.length?Math.max(ee,0):ee,i=Math.min(ee,k),L=20,C=30,D=l,V=D+L+C,K=t.length*(i+j)+j,E=L+D-(0-g)/M*D;return e.jsxs("div",{className:h.wrap,children:[e.jsxs("svg",{className:h.svg,width:K,height:V,viewBox:`0 0 ${K} ${V}`,role:"img","aria-label":b,children:[e.jsx("line",{x1:0,y1:E,x2:K,y2:E,className:h.baseline,stroke:ne}),t.map((u,$)=>{const _=j+$*(i+j),R=u.value!==null?Math.abs(u.value-g)/M*D:0,B=u.value!==null&&u.value>=0?E-R:E;return e.jsxs("g",{children:[u.value===null?e.jsx("line",{x1:_+i/2-5,y1:E,x2:_+i/2+5,y2:E,stroke:se,strokeWidth:2,strokeDasharray:"2 2"}):e.jsxs(e.Fragment,{children:[e.jsx("rect",{x:_,y:B,width:i,height:Math.max(2,R),rx:4,fill:o,className:h.bar}),e.jsx("text",{x:_+i/2,y:B-4,textAnchor:"middle",className:h.valueLabel,children:c(u.value)})]}),e.jsx("text",{x:_+i/2,y:V-8,textAnchor:"middle",className:h.axisLabel,children:u.label.length>10?`${u.label.slice(0,9)}…`:u.label}),e.jsx("rect",{className:h.hitArea,x:_-j/2,y:0,width:i+j,height:V,tabIndex:0,role:"img","aria-label":`${u.label}: ${u.value===null?"no data":c(u.value)}`,onPointerEnter:()=>f($),onPointerLeave:()=>f(m=>m===$?null:m),onFocus:()=>f($),onBlur:()=>f(m=>m===$?null:m)})]},u.label+$)})]}),r!==null?e.jsxs("div",{className:h.tooltip,style:{left:j+r*(i+j),top:0},id:`${x}-tooltip`,children:[e.jsx("span",{className:h.tooltipValue,children:t[r].value===null?"no data":c(t[r].value)}),e.jsx("span",{className:h.tooltipLabel,children:t[r].label})]}):null]})}const st="_line_gomyo_6",nt="_dot_gomyo_14",ce={line:st,dot:nt};function at({points:t,width:l=72,height:n=24,ariaLabel:o}){const c=t.filter(i=>i!==null);if(c.length<2)return e.jsx("svg",{width:l,height:n,viewBox:`0 0 ${l} ${n}`,role:"img","aria-label":o});const b=Math.min(...c,0),r=Math.max(...c,0)-b||1,f=l/Math.max(1,t.length-1),S=i=>n-(i-b)/r*(n-2)-1,F=[];let g=[];t.forEach((i,L)=>{if(i===null){g.length&&F.push(g),g=[];return}g.push({x:L*f,y:S(i)})}),g.length&&F.push(g);const M=t.map(i=>i!==null).lastIndexOf(!0),k=M>=0?{x:M*f,y:S(t[M])}:null;return e.jsxs("svg",{width:l,height:n,viewBox:`0 0 ${l} ${n}`,role:"img","aria-label":o,children:[F.map((i,L)=>e.jsx("path",{className:ce.line,d:i.map((C,D)=>`${D===0?"M":"L"}${C.x.toFixed(1)},${C.y.toFixed(1)}`).join(" ")},L)),k?e.jsx("circle",{className:ce.dot,cx:k.x,cy:k.y,r:2}):null]})}function ot(t){if(!Number.isFinite(t))return"—";const l=Math.abs(t);return l>=1e6?`${(t/1e6).toFixed(l>=1e7?0:1)}M`:l>=1e4?`${Math.round(t/1e3)}K`:l>=1e3?t.toLocaleString("en-US"):Number.isInteger(t)?String(t):t.toFixed(1)}function Lt(t){if(!Number.isFinite(t))return"—";const l=Math.abs(t),n=t<0?"-":"";return l>=1e6?`${n}$${(l/1e6).toFixed(1)}M`:l>=1e3?`${n}$${(l/1e3).toFixed(1)}K`:`${n}$${l.toFixed(2)}`}function $t(t,l=0){return Number.isFinite(t)?`${(t*100).toFixed(l)}%`:"—"}function ct(t){if(!Number.isFinite(t))return"—";const l=ot(Math.abs(t));return t>0?`+${l}`:t<0?`-${l}`:l}function wt(t){if(!/^\d{4}-\d{2}-\d{2}$/.test(t))return t;const l=new Date(`${t}T00:00:00Z`);return Number.isNaN(l.getTime())||l.toISOString().slice(0,10)!==t?t:l.toLocaleDateString("en-US",{month:"short",day:"numeric",timeZone:"UTC"})}function At(t){const l=new Date(t);return Number.isNaN(l.getTime())?"":l.toLocaleDateString("en-US",{month:"short",day:"numeric"})}const it="_tile_rp7c9_1",rt="_label_rp7c9_11",ut="_row_rp7c9_18",dt="_value_rp7c9_25",xt="_trendRow_rp7c9_31",_t="_delta_rp7c9_38",mt="_deltaGood_rp7c9_43",ht="_deltaBad_rp7c9_47",pt="_deltaNeutral_rp7c9_51",jt="_caption_rp7c9_55",A={tile:it,label:rt,row:ut,value:dt,trendRow:xt,delta:_t,deltaGood:mt,deltaBad:ht,deltaNeutral:pt,caption:jt};function Mt({label:t,value:l,caption:n,delta:o,trend:c,trendLabel:b}){const x=o==null||o.goodWhenPositive===void 0||o.value===0?A.deltaNeutral:o.value>0===o.goodWhenPositive?A.deltaGood:A.deltaBad;return e.jsxs("div",{className:A.tile,children:[e.jsx("span",{className:A.label,children:t}),e.jsx("div",{className:A.row,children:e.jsx("span",{className:A.value,children:l})}),e.jsxs("div",{className:A.trendRow,children:[n?e.jsx("span",{className:A.caption,children:n}):e.jsx("span",{}),c?e.jsx(at,{points:c,ariaLabel:b??`${t} trend`}):null]}),o?e.jsxs("span",{className:`${A.delta} ${x}`,children:[ct(o.value),o.versus?` ${o.versus}`:""]}):null]})}const gt="_table_1ggl4_1",vt="_numeric_1ggl4_22",le={table:gt,numeric:vt};function Bt({caption:t,columns:l,rows:n,rowKey:o}){return e.jsxs("table",{className:le.table,children:[e.jsx("caption",{className:"visually-hidden",children:t}),e.jsx("thead",{children:e.jsx("tr",{children:l.map(c=>e.jsx("th",{scope:"col",className:c.numeric?le.numeric:void 0,children:c.label},c.key))})}),e.jsx("tbody",{children:n.map((c,b)=>e.jsx("tr",{children:l.map(x=>e.jsx("td",{className:x.numeric?le.numeric:void 0,children:x.render(c)},x.key))},o(c,b)))})]})}export{Nt as B,ft as C,yt as L,Mt as S,Bt as T,ot as a,wt as b,$t as c,fe as d,At as e,Lt as f,q as s};
|
|
2
|
-
//# sourceMappingURL=TableView-nyYs7Sv1.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"TableView-nyYs7Sv1.js","sources":["../../../../../../src/web-ui/components/charts/ChartContainer.tsx","../../../../../../src/web-ui/components/charts/Legend.tsx","../../../../../../src/web-ui/components/charts/colors.ts","../../../../../../src/web-ui/components/charts/LineChart.tsx","../../../../../../src/web-ui/components/charts/BarChart.tsx","../../../../../../src/web-ui/components/charts/Sparkline.tsx","../../../../../../src/web-ui/components/charts/format.ts","../../../../../../src/web-ui/components/charts/StatTile.tsx","../../../../../../src/web-ui/components/charts/TableView.tsx"],"sourcesContent":["/**\n * components/charts/ChartContainer.tsx — the figure every chart mounts\n * inside: title/description, the plot itself, an optional caveat banner\n * (epistemic-honesty-adjacent: for a chart built on data with a known,\n * disclosed limitation — see ProductionView's judge-verdict caveat), an\n * optional table-view twin (the WCAG-clean accessibility equivalent every\n * chart should ship per the dataviz skill), and an empty state that never\n * lies about missing data.\n */\nimport type { ReactNode } from 'react';\nimport './chart-tokens.css';\nimport styles from './ChartContainer.module.css';\n\nexport interface ChartContainerProps {\n title: string;\n description?: string;\n /** A short, honest note about a known limitation of the data behind this\n * chart (e.g. \"counts may include X, not yet separable\"). Never omit a\n * caveat to make a chart look cleaner than the data actually is. */\n caveat?: string;\n /** The chart itself (SVG + legend). */\n children: ReactNode;\n /** The accessibility twin — same data as a real HTML table. Omit only\n * when the chart already IS a table. */\n table?: ReactNode;\n /** When true, renders the empty state instead of `children`. */\n empty?: boolean;\n emptyMessage?: string;\n}\n\nexport function ChartContainer({\n title,\n description,\n caveat,\n children,\n table,\n empty,\n emptyMessage = 'No data for this window.',\n}: ChartContainerProps) {\n return (\n <figure className={styles.figure}>\n <figcaption className={styles.caption}>\n <span className={styles.title}>{title}</span>\n {description ? <span className={styles.description}>{description}</span> : null}\n </figcaption>\n {caveat ? (\n <p className={styles.caveat} role=\"note\">\n {caveat}\n </p>\n ) : null}\n {empty ? (\n <p className={styles.empty}>{emptyMessage}</p>\n ) : (\n <div className={styles.plot}>{children}</div>\n )}\n {table ? (\n <details className={styles.tableDisclosure}>\n <summary>View as table</summary>\n <div className={styles.tableBody}>{table}</div>\n </details>\n ) : null}\n </figure>\n );\n}\n","/**\n * components/charts/Legend.tsx — the dependable identity channel. A legend\n * is always present for two or more series (never rely on color-matching\n * alone); a single series needs no legend box because the chart's own title\n * already names it (see marks-and-anatomy.md \"Labels & legend\").\n */\nimport styles from './Legend.module.css';\n\nexport interface LegendItem {\n label: string;\n color: string;\n /** 'line' for line charts (a short stroke key), 'swatch' for bar/area. */\n kind?: 'line' | 'swatch';\n}\n\nexport function Legend({ items }: { items: LegendItem[] }) {\n if (items.length < 2) return null;\n return (\n <ul className={styles.legend}>\n {items.map((it) => (\n <li key={it.label} className={styles.item}>\n <span\n className={it.kind === 'line' ? styles.swatchLine : styles.swatch}\n style={{ background: it.color }}\n aria-hidden=\"true\"\n />\n {it.label}\n </li>\n ))}\n </ul>\n );\n}\n","/**\n * components/charts/colors.ts — the one place a chart asks for a color.\n * Every function returns a `var(--chart-*)` reference into chart-tokens.css\n * (never a literal hex) so theming is automatic and colors can never drift\n * out of sync between light and dark. See chart-tokens.css's header comment\n * for the palette-selection rationale — an exhaustive permutation search\n * clears the CVD adjacent floor (worst ΔE 13.8 light / 14.5 dark, target\n * 8.0) without changing which hues are used, only their series order.\n */\n\nconst SERIES_SLOTS = 7;\n\n/** Fixed-order categorical color for series index `slot` (0-based). Color\n * follows the entity, never its row number — callers must assign a series\n * its slot once (e.g. by stable sort order) and keep it even if other\n * series are filtered out; never reassign slots to \"fill the gap\" left by\n * a removed series (see dataviz anti-patterns: \"recolor-on-filter\"). */\nexport function seriesColor(slot: number): string {\n const n = ((slot % SERIES_SLOTS) + SERIES_SLOTS) % SERIES_SLOTS;\n return `var(--chart-series-${n + 1})`;\n}\n\n/** The \"Other\"/overflow bucket color — never part of the identity rotation. */\nexport const CHART_NEUTRAL = 'var(--chart-neutral)';\n\n/** Default single hue for magnitude (sequential) and for a single nominal\n * series (one series needs no legend box — every bar takes the same hue). */\nexport const CHART_SEQUENTIAL = 'var(--chart-sequential)';\nexport const CHART_SEQUENTIAL_SOFT = 'var(--chart-sequential-soft)';\n\nexport const CHART_DIVERGING_POS = 'var(--chart-diverging-pos)';\nexport const CHART_DIVERGING_NEG = 'var(--chart-diverging-neg)';\nexport const CHART_DIVERGING_MID = 'var(--chart-diverging-mid)';\n\nexport const CHART_GRID = 'var(--chart-grid)';\nexport const CHART_AXIS = 'var(--chart-axis)';\n","/**\n * components/charts/LineChart.tsx — trend over time. A gap (`null` y) is\n * split into a separate path segment so it renders as a visible break in\n * the line, never as a straight line through a missing value and never as\n * a silent zero. Single series gets an optional soft area fill; two-plus\n * series always render a legend (never color-matching alone).\n */\nimport { useRef, useState } from 'react';\nimport type { Series } from './types.js';\nimport { seriesColor, CHART_GRID, CHART_AXIS } from './colors.js';\nimport { Legend } from './Legend.js';\nimport './chart-tokens.css';\nimport styles from './LineChart.module.css';\n\nconst VBOX_W = 640;\nconst PAD_L = 44;\nconst PAD_R = 12;\nconst PAD_T = 12;\nconst PAD_B = 24;\nconst TICKS_Y = 4;\n/* Direct end-of-line labels need a gutter of their own. They are drawn in USER\n units — the viewBox scales the font along with the geometry, so a reserve\n measured in user units holds at every rendered width — and `--text-xs-size`\n resolves to 12 user units here, where the UI sans averages a shade over 6\n units per character at medium weight. 6.4 rounds that up so the reserve errs\n wide rather than clipping. Without the reserve the label was drawn at\n `VBOX_W - PAD_R + 4` with only PAD_R (12u) of room and the svg's own\n `overflow: hidden` cropped it to its first glyph — \"Estimated spend\"\n rendered as a lone \"E\". */\nconst END_LABEL_CH = 6.4;\nconst END_LABEL_GAP = 4;\n/* Past this the gutter would cost more plot than the label is worth, so the\n label is dropped rather than shrinking the chart around it. Nothing is lost:\n Legend.tsx deliberately renders nothing below two series because the panel\n heading already names a lone series, and two-plus series always have the\n legend regardless. */\nconst END_LABEL_MAX = 150;\n\ninterface Run {\n x: number;\n y: number;\n}\n\nfunction splitRuns(points: Series['points']): Run[][] {\n const runs: Run[][] = [];\n let current: Run[] = [];\n for (const p of points) {\n if (p.y === null) {\n if (current.length) runs.push(current);\n current = [];\n continue;\n }\n current.push({ x: p.x, y: p.y });\n }\n if (current.length) runs.push(current);\n return runs;\n}\n\nfunction niceTicks(min: number, max: number, count: number): number[] {\n if (max <= min) return [min];\n const step = (max - min) / count;\n return Array.from({ length: count + 1 }, (_, i) => min + step * i);\n}\n\nexport function LineChart({\n series,\n height = 200,\n area = false,\n formatX = (x: number) => String(x),\n formatY = (y: number) => String(y),\n ariaLabel,\n}: {\n series: Series[];\n height?: number;\n area?: boolean;\n formatX?: (x: number) => string;\n formatY?: (y: number) => string;\n ariaLabel: string;\n}) {\n const svgRef = useRef<SVGSVGElement>(null);\n const [hoverX, setHoverX] = useState<number | null>(null);\n const [tooltipPos, setTooltipPos] = useState<{ left: number; top: number } | null>(null);\n\n const allX = series.flatMap((s) => s.points.map((p) => p.x));\n const knownY = series.flatMap((s) => s.points.map((p) => p.y)).filter((y): y is number => y !== null);\n if (allX.length === 0) {\n return <p>No data.</p>;\n }\n const xMin = Math.min(...allX);\n const xMax = Math.max(...allX);\n const yMin = Math.min(0, ...knownY);\n const yMax = Math.max(0.0001, ...knownY);\n const xRange = xMax - xMin || 1;\n const yRange = yMax - yMin || 1;\n\n /* Decided before the scales, because the reserved gutter is what plotW is\n measured against — and the gridlines and x-axis stop at the same edge. */\n const wantEndLabels = series.length >= 1 && series.length <= 4;\n const endLabelW = wantEndLabels\n ? Math.max(...series.map((s) => s.label.length)) * END_LABEL_CH\n : 0;\n const showEndLabels = wantEndLabels && endLabelW <= END_LABEL_MAX;\n const padR = PAD_R + (showEndLabels ? END_LABEL_GAP + endLabelW : 0);\n const showLegend = series.length >= 2;\n\n const plotW = VBOX_W - PAD_L - padR;\n const plotH = height - PAD_T - PAD_B;\n const xScale = (x: number) => PAD_L + ((x - xMin) / xRange) * plotW;\n const yScale = (y: number) => PAD_T + plotH - ((y - yMin) / yRange) * plotH;\n\n const yTicks = niceTicks(yMin, yMax, TICKS_Y);\n\n // Nearest-x lookup across a reference axis (the union of all distinct x\n // values, since series may not share every point).\n const xAxis = Array.from(new Set(allX)).sort((a, b) => a - b);\n\n function nearestX(clientX: number): number | null {\n const svg = svgRef.current;\n if (!svg) return null;\n const rect = svg.getBoundingClientRect();\n const svgX = ((clientX - rect.left) / rect.width) * VBOX_W;\n const dataX = xMin + ((svgX - PAD_L) / plotW) * xRange;\n let nearest = xAxis[0];\n let best = Infinity;\n for (const x of xAxis) {\n const d = Math.abs(x - dataX);\n if (d < best) {\n best = d;\n nearest = x;\n }\n }\n return nearest;\n }\n\n function handleMove(e: React.PointerEvent<SVGSVGElement>) {\n const x = nearestX(e.clientX);\n if (x === null) return;\n setHoverX(x);\n const svg = svgRef.current;\n if (svg) {\n const rect = svg.getBoundingClientRect();\n const px = (xScale(x) / VBOX_W) * rect.width;\n setTooltipPos({ left: px, top: 0 });\n }\n }\n\n const hoverPoints =\n hoverX !== null\n ? series.map((s) => ({\n series: s,\n point: s.points.find((p) => p.x === hoverX) ?? null,\n }))\n : null;\n\n return (\n <div className={styles.wrap}>\n <svg\n ref={svgRef}\n className={styles.svg}\n viewBox={`0 0 ${VBOX_W} ${height}`}\n role=\"img\"\n aria-label={ariaLabel}\n onPointerMove={handleMove}\n onPointerLeave={() => setHoverX(null)}\n >\n {yTicks.map((t, i) => (\n <g key={i}>\n <line\n x1={PAD_L}\n x2={VBOX_W - padR}\n y1={yScale(t)}\n y2={yScale(t)}\n className={styles.gridline}\n stroke={CHART_GRID}\n />\n <text x={PAD_L - 6} y={yScale(t)} dy=\"0.32em\" textAnchor=\"end\" className={styles.axisLabel}>\n {formatY(t)}\n </text>\n </g>\n ))}\n <line\n x1={PAD_L}\n x2={VBOX_W - padR}\n y1={height - PAD_B}\n y2={height - PAD_B}\n className={styles.axis}\n stroke={CHART_AXIS}\n />\n {xAxis.length > 1\n ? [xAxis[0], xAxis[xAxis.length - 1]].map((x, i) => (\n <text\n key={i}\n x={xScale(x)}\n y={height - 6}\n textAnchor={i === 0 ? 'start' : 'end'}\n className={styles.axisLabel}\n >\n {formatX(x)}\n </text>\n ))\n : null}\n\n {series.map((s, si) => {\n const color = seriesColor(si);\n const runs = splitRuns(s.points);\n return (\n <g key={s.id}>\n {area && series.length === 1\n ? runs.map((run, ri) => {\n const d =\n run.map((p, j) => `${j === 0 ? 'M' : 'L'}${xScale(p.x)},${yScale(p.y)}`).join(' ') +\n ` L${xScale(run[run.length - 1].x)},${yScale(yMin)} L${xScale(run[0].x)},${yScale(yMin)} Z`;\n return <path key={ri} d={d} fill={color} className={styles.area} />;\n })\n : null}\n {runs.map((run, ri) => (\n <path\n key={ri}\n d={run.map((p, j) => `${j === 0 ? 'M' : 'L'}${xScale(p.x)},${yScale(p.y)}`).join(' ')}\n stroke={color}\n className={styles.line}\n />\n ))}\n {showEndLabels && runs.length ? (\n (() => {\n const lastRun = runs[runs.length - 1];\n const last = lastRun[lastRun.length - 1];\n return (\n <text\n x={xScale(last.x) + END_LABEL_GAP}\n y={yScale(last.y)}\n dy=\"0.32em\"\n className={styles.endLabel}\n fill={color}\n >\n {s.label}\n </text>\n );\n })()\n ) : null}\n </g>\n );\n })}\n\n {hoverX !== null ? (\n <line\n x1={xScale(hoverX)}\n x2={xScale(hoverX)}\n y1={PAD_T}\n y2={height - PAD_B}\n className={styles.crosshairLine}\n />\n ) : null}\n {hoverX !== null\n ? series.map((s, si) => {\n const p = s.points.find((pt) => pt.x === hoverX);\n if (!p || p.y === null) return null;\n return (\n <circle\n key={s.id}\n cx={xScale(p.x)}\n cy={yScale(p.y)}\n r={4}\n fill={seriesColor(si)}\n className={styles.marker}\n />\n );\n })\n : null}\n\n <rect\n x={PAD_L}\n y={PAD_T}\n width={plotW}\n height={plotH}\n className={styles.overlay}\n onFocus={() => setHoverX(xAxis[xAxis.length - 1] ?? null)}\n />\n </svg>\n {hoverPoints && tooltipPos ? (\n <div className={styles.tooltip} style={{ left: tooltipPos.left, top: tooltipPos.top }}>\n <div className={styles.tooltipDate}>{formatX(hoverX as number)}</div>\n {hoverPoints.map(({ series: s, point }, i) => (\n <div className={styles.tooltipRow} key={s.id}>\n <span className={styles.tooltipKey} style={{ background: seriesColor(i) }} aria-hidden=\"true\" />\n {point && point.y !== null ? (\n <>\n <span className={styles.tooltipValue}>{formatY(point.y)}</span>\n {showLegend ? <span>{s.label}</span> : null}\n </>\n ) : (\n <span className={styles.tooltipGap}>no data{showLegend ? ` — ${s.label}` : ''}</span>\n )}\n </div>\n ))}\n </div>\n ) : null}\n {showLegend ? (\n <Legend items={series.map((s, i) => ({ label: s.label, color: seriesColor(i), kind: 'line' }))} />\n ) : null}\n </div>\n );\n}\n","/**\n * components/charts/BarChart.tsx — categorical magnitude comparison.\n * Single hue by default (nominal categories never get a value-ramp — see\n * dataviz anti-patterns \"a value-ramp on nominal categories\"). Vertical for\n * a handful of short-named categories, horizontal for many or long-named\n * ones (dataviz choosing-a-form.md). Null values render as an explicit\n * \"no data\" dash, never a silent zero-height bar indistinguishable from a\n * real zero.\n */\nimport { useId, useState } from 'react';\nimport type { CategoricalDatum } from './types.js';\nimport { CHART_SEQUENTIAL, CHART_AXIS, CHART_GRID } from './colors.js';\nimport './chart-tokens.css';\nimport styles from './BarChart.module.css';\n\nconst BAR_MAX = 24;\nconst GAP = 10;\n\nexport function BarChart({\n data,\n height = 160,\n orientation = 'vertical',\n color = CHART_SEQUENTIAL,\n formatValue = (v: number) => String(v),\n ariaLabel,\n}: {\n data: CategoricalDatum[];\n height?: number;\n orientation?: 'vertical' | 'horizontal';\n color?: string;\n formatValue?: (v: number) => string;\n ariaLabel: string;\n}) {\n const uid = useId();\n const [hover, setHover] = useState<number | null>(null);\n\n const known = data.map((d) => d.value).filter((v): v is number => v !== null);\n const maxVal = Math.max(0, ...known, 0.0001);\n const minVal = Math.min(0, ...known);\n const range = maxVal - minVal || 1;\n\n if (orientation === 'horizontal') {\n const LABEL_W = 120;\n const PAD_R = 48;\n const rowH = Math.min(BAR_MAX, Math.max(14, Math.floor((height - GAP) / data.length) - GAP));\n const plotW = 420;\n const svgH = data.length * (rowH + GAP) + GAP;\n const svgW = LABEL_W + plotW + PAD_R;\n\n return (\n <div className={styles.wrap}>\n <svg\n className={styles.svg}\n width={svgW}\n height={svgH}\n viewBox={`0 0 ${svgW} ${svgH}`}\n role=\"img\"\n aria-label={ariaLabel}\n >\n <line x1={LABEL_W} y1={0} x2={LABEL_W} y2={svgH} className={styles.baseline} stroke={CHART_AXIS} />\n {data.map((d, i) => {\n const y = GAP + i * (rowH + GAP);\n const barW = d.value !== null ? ((d.value - minVal) / range) * plotW : 0;\n return (\n <g key={d.label + i}>\n <text\n x={LABEL_W - 8}\n y={y + rowH / 2}\n dy=\"0.32em\"\n textAnchor=\"end\"\n className={styles.categoryLabel}\n >\n {d.label.length > 22 ? `${d.label.slice(0, 21)}…` : d.label}\n </text>\n {d.value === null ? (\n <line\n x1={LABEL_W + 4}\n y1={y + rowH / 2}\n x2={LABEL_W + 14}\n y2={y + rowH / 2}\n stroke={CHART_GRID}\n strokeWidth={2}\n strokeDasharray=\"2 2\"\n />\n ) : (\n <>\n <rect\n x={LABEL_W}\n y={y}\n width={Math.max(2, barW)}\n height={rowH}\n rx={4}\n fill={color}\n className={styles.bar}\n />\n <text\n x={LABEL_W + Math.max(2, barW) + 6}\n y={y + rowH / 2}\n dy=\"0.32em\"\n className={styles.valueLabel}\n >\n {formatValue(d.value)}\n </text>\n </>\n )}\n <rect\n className={styles.hitArea}\n x={0}\n y={y - GAP / 2}\n width={svgW}\n height={rowH + GAP}\n tabIndex={0}\n role=\"img\"\n aria-label={`${d.label}: ${d.value === null ? 'no data' : formatValue(d.value)}`}\n onPointerEnter={() => setHover(i)}\n onPointerLeave={() => setHover((h) => (h === i ? null : h))}\n onFocus={() => setHover(i)}\n onBlur={() => setHover((h) => (h === i ? null : h))}\n />\n </g>\n );\n })}\n </svg>\n {hover !== null ? (\n <div\n className={styles.tooltip}\n style={{ left: LABEL_W + 8, top: GAP + hover * (rowH + GAP) - 4 }}\n >\n <span className={styles.tooltipValue}>\n {data[hover].value === null ? 'no data' : formatValue(data[hover].value as number)}\n </span>\n <span className={styles.tooltipLabel}>{data[hover].label}</span>\n </div>\n ) : null}\n </div>\n );\n }\n\n // Vertical orientation.\n const barSlot = data.length ? Math.max(BAR_MAX, 0) : BAR_MAX;\n const barW = Math.min(BAR_MAX, barSlot);\n const PAD_T = 20;\n const PAD_B = 30;\n const plotH = height;\n const svgH = plotH + PAD_T + PAD_B;\n const svgW = data.length * (barW + GAP) + GAP;\n const zeroY = PAD_T + plotH - ((0 - minVal) / range) * plotH;\n\n return (\n <div className={styles.wrap}>\n <svg\n className={styles.svg}\n width={svgW}\n height={svgH}\n viewBox={`0 0 ${svgW} ${svgH}`}\n role=\"img\"\n aria-label={ariaLabel}\n >\n <line x1={0} y1={zeroY} x2={svgW} y2={zeroY} className={styles.baseline} stroke={CHART_AXIS} />\n {data.map((d, i) => {\n const x = GAP + i * (barW + GAP);\n const barH = d.value !== null ? (Math.abs(d.value - minVal) / range) * plotH : 0;\n const top = d.value !== null && d.value >= 0 ? zeroY - barH : zeroY;\n return (\n <g key={d.label + i}>\n {d.value === null ? (\n <line\n x1={x + barW / 2 - 5}\n y1={zeroY}\n x2={x + barW / 2 + 5}\n y2={zeroY}\n stroke={CHART_GRID}\n strokeWidth={2}\n strokeDasharray=\"2 2\"\n />\n ) : (\n <>\n <rect\n x={x}\n y={top}\n width={barW}\n height={Math.max(2, barH)}\n rx={4}\n fill={color}\n className={styles.bar}\n />\n <text x={x + barW / 2} y={top - 4} textAnchor=\"middle\" className={styles.valueLabel}>\n {formatValue(d.value)}\n </text>\n </>\n )}\n <text\n x={x + barW / 2}\n y={svgH - 8}\n textAnchor=\"middle\"\n className={styles.axisLabel}\n >\n {d.label.length > 10 ? `${d.label.slice(0, 9)}…` : d.label}\n </text>\n <rect\n className={styles.hitArea}\n x={x - GAP / 2}\n y={0}\n width={barW + GAP}\n height={svgH}\n tabIndex={0}\n role=\"img\"\n aria-label={`${d.label}: ${d.value === null ? 'no data' : formatValue(d.value)}`}\n onPointerEnter={() => setHover(i)}\n onPointerLeave={() => setHover((h) => (h === i ? null : h))}\n onFocus={() => setHover(i)}\n onBlur={() => setHover((h) => (h === i ? null : h))}\n />\n </g>\n );\n })}\n </svg>\n {hover !== null ? (\n <div\n className={styles.tooltip}\n style={{ left: GAP + hover * (barW + GAP), top: 0 }}\n id={`${uid}-tooltip`}\n >\n <span className={styles.tooltipValue}>\n {data[hover].value === null ? 'no data' : formatValue(data[hover].value as number)}\n </span>\n <span className={styles.tooltipLabel}>{data[hover].label}</span>\n </div>\n ) : null}\n </div>\n );\n}\n","/**\n * components/charts/Sparkline.tsx — the 12-ish-point inline trend for a\n * stat tile (marks-and-anatomy.md \"Figures\" stat-tile contract). No axes,\n * no legend, no tooltip — it is a glance, not a chart; the real numbers\n * live in the stat tile's value and in the full chart elsewhere on the\n * view. Gaps (`null`) break the line rather than reading as a dip to zero.\n */\nimport './chart-tokens.css';\nimport styles from './Sparkline.module.css';\n\nexport function Sparkline({\n points,\n width = 72,\n height = 24,\n ariaLabel,\n}: {\n points: (number | null)[];\n width?: number;\n height?: number;\n ariaLabel: string;\n}) {\n const known = points.filter((p): p is number => p !== null);\n if (known.length < 2) {\n return (\n <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={ariaLabel} />\n );\n }\n const min = Math.min(...known, 0);\n const max = Math.max(...known, 0);\n const range = max - min || 1;\n const stepX = width / Math.max(1, points.length - 1);\n const yOf = (v: number) => height - ((v - min) / range) * (height - 2) - 1;\n\n // Split into contiguous runs so a null renders as a real gap, not a dip.\n const runs: { x: number; y: number }[][] = [];\n let current: { x: number; y: number }[] = [];\n points.forEach((v, i) => {\n if (v === null) {\n if (current.length) runs.push(current);\n current = [];\n return;\n }\n current.push({ x: i * stepX, y: yOf(v) });\n });\n if (current.length) runs.push(current);\n\n const lastKnownIndex = points.map((v) => v !== null).lastIndexOf(true);\n const lastPoint =\n lastKnownIndex >= 0 ? { x: lastKnownIndex * stepX, y: yOf(points[lastKnownIndex] as number) } : null;\n\n return (\n <svg width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={ariaLabel}>\n {runs.map((run, i) => (\n <path\n key={i}\n className={styles.line}\n d={run.map((p, j) => `${j === 0 ? 'M' : 'L'}${p.x.toFixed(1)},${p.y.toFixed(1)}`).join(' ')}\n />\n ))}\n {lastPoint ? <circle className={styles.dot} cx={lastPoint.x} cy={lastPoint.y} r={2} /> : null}\n </svg>\n );\n}\n","/**\n * components/charts/format.ts — number formatting shared by every chart and\n * stat tile. Proportional figures everywhere EXCEPT columns that must align\n * vertically (table cells, axis ticks) — see marks-and-anatomy.md \"Proportional\n * figures for big numbers; tabular only in columns.\" Callers apply\n * `font-variant-numeric: tabular-nums` via CSS where that applies; these\n * functions only produce the string.\n */\n\n/** Auto-compact a count: 1,284 / 12.9K / 4.2M. */\nexport function formatCompact(n: number): string {\n if (!Number.isFinite(n)) return '—';\n const abs = Math.abs(n);\n if (abs >= 1_000_000) return `${(n / 1_000_000).toFixed(abs >= 10_000_000 ? 0 : 1)}M`;\n if (abs >= 10_000) return `${Math.round(n / 1000)}K`;\n if (abs >= 1_000) return n.toLocaleString('en-US');\n return Number.isInteger(n) ? String(n) : n.toFixed(1);\n}\n\n/** Auto-compact USD: $4.20 / $1.2K / $4.2M. */\nexport function formatUsd(n: number): string {\n if (!Number.isFinite(n)) return '—';\n const abs = Math.abs(n);\n const sign = n < 0 ? '-' : '';\n if (abs >= 1_000_000) return `${sign}$${(abs / 1_000_000).toFixed(1)}M`;\n if (abs >= 1_000) return `${sign}$${(abs / 1_000).toFixed(1)}K`;\n return `${sign}$${abs.toFixed(2)}`;\n}\n\n/** Fraction (0..1) as a percentage. */\nexport function formatPercent(fraction: number, digits = 0): string {\n if (!Number.isFinite(fraction)) return '—';\n return `${(fraction * 100).toFixed(digits)}%`;\n}\n\n/** Signed delta for a stat tile: \"+12\" / \"-3\" / \"0\". */\nexport function formatSignedCompact(n: number): string {\n if (!Number.isFinite(n)) return '—';\n const s = formatCompact(Math.abs(n));\n if (n > 0) return `+${s}`;\n if (n < 0) return `-${s}`;\n return s;\n}\n\n/** YYYY-MM-DD -> short label, e.g. \"Aug 14\". Local-independent (UTC parse). */\nexport function formatDayLabel(day: string): string {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(day)) return day;\n const d = new Date(`${day}T00:00:00Z`);\n // Date normalizes impossible dates; compare the padded UTC date to reject rollover.\n if (Number.isNaN(d.getTime()) || d.toISOString().slice(0, 10) !== day) return day;\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric', timeZone: 'UTC' });\n}\n\n/** Epoch ms -> short label for axis ticks. */\nexport function formatTimeLabel(ms: number): string {\n const d = new Date(ms);\n if (Number.isNaN(d.getTime())) return '';\n return d.toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n}\n","/**\n * components/charts/StatTile.tsx — value + delta + optional sparkline, the\n * figure contract from marks-and-anatomy.md. Use for a single current value\n * (a one-bar bar chart is never the answer — this is). `value` takes a\n * ReactNode (not just a string) so callers can wrap a sourceQuality-bearing\n * field in <Epistemic/> and pass that straight through.\n */\nimport type { ReactNode } from 'react';\nimport { formatSignedCompact } from './format.js';\nimport { Sparkline } from './Sparkline.js';\nimport styles from './StatTile.module.css';\n\nexport interface StatTileDelta {\n /** Signed raw value, e.g. +12 or -3. */\n value: number;\n /** Whether a positive delta reads as good (green) or bad (red). Omit for\n * a neutral, non-judgmental delta (e.g. \"goals in flight\" — more isn't\n * inherently good or bad). */\n goodWhenPositive?: boolean;\n /** vs which period, e.g. \"vs yesterday\". */\n versus?: string;\n}\n\nexport function StatTile({\n label,\n value,\n caption,\n delta,\n trend,\n trendLabel,\n}: {\n label: string;\n value: ReactNode;\n caption?: ReactNode;\n delta?: StatTileDelta | null;\n trend?: (number | null)[];\n trendLabel?: string;\n}) {\n const deltaTone =\n delta == null || delta.goodWhenPositive === undefined\n ? styles.deltaNeutral\n : delta.value === 0\n ? styles.deltaNeutral\n : (delta.value > 0) === delta.goodWhenPositive\n ? styles.deltaGood\n : styles.deltaBad;\n\n return (\n <div className={styles.tile}>\n <span className={styles.label}>{label}</span>\n <div className={styles.row}>\n <span className={styles.value}>{value}</span>\n </div>\n <div className={styles.trendRow}>\n {caption ? <span className={styles.caption}>{caption}</span> : <span />}\n {trend ? <Sparkline points={trend} ariaLabel={trendLabel ?? `${label} trend`} /> : null}\n </div>\n {delta ? (\n <span className={`${styles.delta} ${deltaTone}`}>\n {formatSignedCompact(delta.value)}\n {delta.versus ? ` ${delta.versus}` : ''}\n </span>\n ) : null}\n </div>\n );\n}\n","/**\n * components/charts/TableView.tsx — the WCAG-clean accessibility twin every\n * chart should ship (dataviz skill: \"no table view / color-only encoding on\n * a continuous scale\" is an anti-pattern). Every value a chart's tooltip or\n * direct label shows must also be reachable here without hovering anything.\n */\nimport type { ReactNode } from 'react';\nimport styles from './TableView.module.css';\n\nexport interface TableColumn<T> {\n key: string;\n label: string;\n numeric?: boolean;\n render: (row: T) => ReactNode;\n}\n\nexport function TableView<T>({\n caption,\n columns,\n rows,\n rowKey,\n}: {\n caption: string;\n columns: TableColumn<T>[];\n rows: T[];\n rowKey: (row: T, index: number) => string;\n}) {\n return (\n <table className={styles.table}>\n <caption className=\"visually-hidden\">{caption}</caption>\n <thead>\n <tr>\n {columns.map((c) => (\n <th key={c.key} scope=\"col\" className={c.numeric ? styles.numeric : undefined}>\n {c.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.map((row, i) => (\n <tr key={rowKey(row, i)}>\n {columns.map((c) => (\n <td key={c.key} className={c.numeric ? styles.numeric : undefined}>\n {c.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n"],"names":["ChartContainer","title","description","caveat","children","table","empty","emptyMessage","jsxs","styles","jsx","Legend","items","it","SERIES_SLOTS","seriesColor","slot","CHART_SEQUENTIAL","CHART_GRID","CHART_AXIS","VBOX_W","PAD_L","PAD_R","PAD_T","PAD_B","TICKS_Y","END_LABEL_CH","END_LABEL_GAP","END_LABEL_MAX","splitRuns","points","runs","current","p","niceTicks","min","max","count","step","_","i","LineChart","series","height","area","formatX","formatY","y","ariaLabel","svgRef","useRef","hoverX","setHoverX","useState","tooltipPos","setTooltipPos","allX","knownY","xMin","xMax","yMin","yMax","xRange","yRange","wantEndLabels","endLabelW","showEndLabels","padR","showLegend","plotW","plotH","xScale","x","yScale","yTicks","xAxis","a","b","nearestX","clientX","svg","rect","svgX","dataX","nearest","best","d","handleMove","e","px","hoverPoints","t","si","color","run","ri","j","lastRun","last","pt","point","Fragment","BAR_MAX","GAP","BarChart","data","orientation","formatValue","v","uid","useId","hover","setHover","known","maxVal","minVal","range","rowH","svgH","svgW","barW","h","barSlot","zeroY","barH","top","Sparkline","width","stepX","yOf","lastKnownIndex","lastPoint","formatCompact","n","abs","formatUsd","sign","formatPercent","fraction","digits","formatSignedCompact","s","formatDayLabel","day","formatTimeLabel","ms","StatTile","label","value","caption","delta","trend","trendLabel","deltaTone","TableView","columns","rows","rowKey","row","c"],"mappings":"oXA8BO,SAASA,GAAe,CAC7B,MAAAC,EACA,YAAAC,EACA,OAAAC,EACA,SAAAC,EACA,MAAAC,EACA,MAAAC,EACA,aAAAC,EAAe,0BACjB,EAAwB,CACtB,OACEC,EAAAA,KAAC,SAAA,CAAO,UAAWC,EAAO,OACxB,SAAA,CAAAD,EAAAA,KAAC,aAAA,CAAW,UAAWC,EAAO,QAC5B,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,MAAQ,SAAAR,EAAM,EACrCC,EAAcQ,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,YAAc,WAAY,EAAU,IAAA,EAC7E,EACCN,QACE,IAAA,CAAE,UAAWM,EAAO,OAAQ,KAAK,OAC/B,SAAAN,CAAA,CACH,EACE,KACHG,EACCI,EAAAA,IAAC,IAAA,CAAE,UAAWD,EAAO,MAAQ,SAAAF,CAAA,CAAa,EAE1CG,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,KAAO,SAAAL,EAAS,EAExCC,EACCG,EAAAA,KAAC,UAAA,CAAQ,UAAWC,EAAO,gBACzB,SAAA,CAAAC,EAAAA,IAAC,WAAQ,SAAA,eAAA,CAAa,EACtBA,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,UAAY,SAAAJ,CAAA,CAAM,CAAA,CAAA,CAC3C,EACE,IAAA,EACN,CAEJ,8IChDO,SAASM,GAAO,CAAE,MAAAC,GAAkC,CACzD,OAAIA,EAAM,OAAS,EAAU,KAE3BF,EAAAA,IAAC,KAAA,CAAG,UAAWD,EAAO,OACnB,SAAAG,EAAM,IAAKC,GACVL,EAAAA,KAAC,KAAA,CAAkB,UAAWC,EAAO,KACnC,SAAA,CAAAC,EAAAA,IAAC,OAAA,CACC,UAAWG,EAAG,OAAS,OAASJ,EAAO,WAAaA,EAAO,OAC3D,MAAO,CAAE,WAAYI,EAAG,KAAA,EACxB,cAAY,MAAA,CAAA,EAEbA,EAAG,KAAA,CAAA,EANGA,EAAG,KAOZ,CACD,EACH,CAEJ,CCrBA,MAAMC,GAAe,EAOd,SAASC,EAAYC,EAAsB,CAEhD,MAAO,uBADKA,EAAOF,GAAgBA,IAAgBA,GAClB,CAAC,GACpC,CAOO,MAAMG,GAAmB,0BAOnBC,GAAa,oBACbC,GAAa,8mBCrBpBC,EAAS,IACTC,EAAQ,GACRC,GAAQ,GACRC,EAAQ,GACRC,EAAQ,GACRC,GAAU,EAUVC,GAAe,IACfC,GAAgB,EAMhBC,GAAgB,IAOtB,SAASC,GAAUC,EAAmC,CACpD,MAAMC,EAAgB,CAAA,EACtB,IAAIC,EAAiB,CAAA,EACrB,UAAWC,KAAKH,EAAQ,CACtB,GAAIG,EAAE,IAAM,KAAM,CACZD,EAAQ,QAAQD,EAAK,KAAKC,CAAO,EACrCA,EAAU,CAAA,EACV,QACF,CACAA,EAAQ,KAAK,CAAE,EAAGC,EAAE,EAAG,EAAGA,EAAE,EAAG,CACjC,CACA,OAAID,EAAQ,QAAQD,EAAK,KAAKC,CAAO,EAC9BD,CACT,CAEA,SAASG,GAAUC,EAAaC,EAAaC,EAAyB,CACpE,GAAID,GAAOD,EAAK,MAAO,CAACA,CAAG,EAC3B,MAAMG,GAAQF,EAAMD,GAAOE,EAC3B,OAAO,MAAM,KAAK,CAAE,OAAQA,EAAQ,GAAK,CAACE,EAAGC,IAAML,EAAMG,EAAOE,CAAC,CACnE,CAEO,SAASC,GAAU,CACxB,OAAAC,EACA,OAAAC,EAAS,IACT,KAAAC,EAAO,GACP,QAAAC,EAAW,GAAc,OAAO,CAAC,EACjC,QAAAC,EAAWC,GAAc,OAAOA,CAAC,EACjC,UAAAC,CACF,EAOG,CACD,MAAMC,EAASC,EAAAA,OAAsB,IAAI,EACnC,CAACC,EAAQC,CAAS,EAAIC,EAAAA,SAAwB,IAAI,EAClD,CAACC,EAAYC,CAAa,EAAIF,EAAAA,SAA+C,IAAI,EAEjFG,EAAOd,EAAO,QAAS,GAAM,EAAE,OAAO,IAAKT,GAAMA,EAAE,CAAC,CAAC,EACrDwB,EAASf,EAAO,QAAS,GAAM,EAAE,OAAO,IAAKT,GAAMA,EAAE,CAAC,CAAC,EAAE,OAAQc,GAAmBA,IAAM,IAAI,EACpG,GAAIS,EAAK,SAAW,EAClB,OAAO9C,EAAAA,IAAC,KAAE,SAAA,UAAA,CAAQ,EAEpB,MAAMgD,EAAO,KAAK,IAAI,GAAGF,CAAI,EACvBG,EAAO,KAAK,IAAI,GAAGH,CAAI,EACvBI,EAAO,KAAK,IAAI,EAAG,GAAGH,CAAM,EAC5BI,EAAO,KAAK,IAAI,KAAQ,GAAGJ,CAAM,EACjCK,EAASH,EAAOD,GAAQ,EACxBK,EAASF,EAAOD,GAAQ,EAIxBI,EAAgBtB,EAAO,QAAU,GAAKA,EAAO,QAAU,EACvDuB,EAAYD,EACd,KAAK,IAAI,GAAGtB,EAAO,IAAK,GAAM,EAAE,MAAM,MAAM,CAAC,EAAIhB,GACjD,EACEwC,EAAgBF,GAAiBC,GAAarC,GAC9CuC,EAAO7C,IAAS4C,EAAgBvC,GAAgBsC,EAAY,GAC5DG,EAAa1B,EAAO,QAAU,EAE9B2B,EAAQjD,EAASC,EAAQ8C,EACzBG,EAAQ3B,EAASpB,EAAQC,EACzB+C,EAAUC,GAAcnD,GAAUmD,EAAId,GAAQI,EAAUO,EACxDI,EAAU1B,GAAcxB,EAAQ+C,GAAUvB,EAAIa,GAAQG,EAAUO,EAEhEI,EAASxC,GAAU0B,EAAMC,EAAMpC,EAAO,EAItCkD,EAAQ,MAAM,KAAK,IAAI,IAAInB,CAAI,CAAC,EAAE,KAAK,CAACoB,EAAGC,IAAMD,EAAIC,CAAC,EAE5D,SAASC,EAASC,EAAgC,CAChD,MAAMC,EAAM/B,EAAO,QACnB,GAAI,CAAC+B,EAAK,OAAO,KACjB,MAAMC,EAAOD,EAAI,sBAAA,EACXE,GAASH,EAAUE,EAAK,MAAQA,EAAK,MAAS7D,EAC9C+D,EAAQzB,GAASwB,EAAO7D,GAASgD,EAASP,EAChD,IAAIsB,EAAUT,EAAM,CAAC,EACjBU,EAAO,IACX,UAAWb,KAAKG,EAAO,CACrB,MAAMW,EAAI,KAAK,IAAId,EAAIW,CAAK,EACxBG,EAAID,IACNA,EAAOC,EACPF,EAAUZ,EAEd,CACA,OAAOY,CACT,CAEA,SAASG,EAAWC,EAAsC,CACxD,MAAMhB,EAAIM,EAASU,EAAE,OAAO,EAC5B,GAAIhB,IAAM,KAAM,OAChBpB,EAAUoB,CAAC,EACX,MAAMQ,EAAM/B,EAAO,QACnB,GAAI+B,EAAK,CACP,MAAMC,EAAOD,EAAI,sBAAA,EACXS,EAAMlB,EAAOC,CAAC,EAAIpD,EAAU6D,EAAK,MACvC1B,EAAc,CAAE,KAAMkC,EAAI,IAAK,EAAG,CACpC,CACF,CAEA,MAAMC,GACJvC,IAAW,KACPT,EAAO,IAAK,IAAO,CACjB,OAAQ,EACR,MAAO,EAAE,OAAO,KAAMT,GAAMA,EAAE,IAAMkB,CAAM,GAAK,IAAA,EAC/C,EACF,KAEN,OACE3C,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,KACrB,SAAA,CAAAD,EAAAA,KAAC,MAAA,CACC,IAAKyC,EACL,UAAWxC,EAAO,IAClB,QAAS,OAAOW,CAAM,IAAIuB,CAAM,GAChC,KAAK,MACL,aAAYK,EACZ,cAAeuC,EACf,eAAgB,IAAMnC,EAAU,IAAI,EAEnC,SAAA,CAAAsB,EAAO,IAAI,CAACiB,EAAGnD,WACb,IAAA,CACC,SAAA,CAAA9B,EAAAA,IAAC,OAAA,CACC,GAAIW,EACJ,GAAID,EAAS+C,EACb,GAAIM,EAAOkB,CAAC,EACZ,GAAIlB,EAAOkB,CAAC,EACZ,UAAWlF,EAAO,SAClB,OAAQS,EAAA,CAAA,QAET,OAAA,CAAK,EAAGG,EAAQ,EAAG,EAAGoD,EAAOkB,CAAC,EAAG,GAAG,SAAS,WAAW,MAAM,UAAWlF,EAAO,UAC9E,SAAAqC,EAAQ6C,CAAC,CAAA,CACZ,CAAA,CAAA,EAXMnD,CAYR,CACD,EACD9B,EAAAA,IAAC,OAAA,CACC,GAAIW,EACJ,GAAID,EAAS+C,EACb,GAAIxB,EAASnB,EACb,GAAImB,EAASnB,EACb,UAAWf,EAAO,KAClB,OAAQU,EAAA,CAAA,EAETwD,EAAM,OAAS,EACZ,CAACA,EAAM,CAAC,EAAGA,EAAMA,EAAM,OAAS,CAAC,CAAC,EAAE,IAAI,CAACH,EAAGhC,IAC1C9B,EAAAA,IAAC,OAAA,CAEC,EAAG6D,EAAOC,CAAC,EACX,EAAG7B,EAAS,EACZ,WAAYH,IAAM,EAAI,QAAU,MAChC,UAAW/B,EAAO,UAEjB,WAAQ+D,CAAC,CAAA,EANLhC,CAAA,CAQR,EACD,KAEHE,EAAO,IAAI,CAAC,EAAGkD,IAAO,CACrB,MAAMC,EAAQ9E,EAAY6E,CAAE,EACtB7D,EAAOF,GAAU,EAAE,MAAM,EAC/B,cACG,IAAA,CACE,SAAA,CAAAe,GAAQF,EAAO,SAAW,EACvBX,EAAK,IAAI,CAAC+D,EAAKC,IAAO,CACpB,MAAMT,EACJQ,EAAI,IAAI,CAAC7D,EAAG+D,IAAM,GAAGA,IAAM,EAAI,IAAM,GAAG,GAAGzB,EAAOtC,EAAE,CAAC,CAAC,IAAIwC,EAAOxC,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,EACjF,KAAKsC,EAAOuB,EAAIA,EAAI,OAAS,CAAC,EAAE,CAAC,CAAC,IAAIrB,EAAOb,CAAI,CAAC,KAAKW,EAAOuB,EAAI,CAAC,EAAE,CAAC,CAAC,IAAIrB,EAAOb,CAAI,CAAC,KACzF,OAAOlD,MAAC,QAAc,EAAA4E,EAAM,KAAMO,EAAO,UAAWpF,EAAO,MAAzCsF,CAA+C,CACnE,CAAC,EACD,KACHhE,EAAK,IAAI,CAAC+D,EAAKC,IACdrF,EAAAA,IAAC,OAAA,CAEC,EAAGoF,EAAI,IAAI,CAAC7D,EAAG+D,IAAM,GAAGA,IAAM,EAAI,IAAM,GAAG,GAAGzB,EAAOtC,EAAE,CAAC,CAAC,IAAIwC,EAAOxC,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,EACpF,OAAQ4D,EACR,UAAWpF,EAAO,IAAA,EAHbsF,CAAA,CAKR,EACA7B,GAAiBnC,EAAK,QACpB,IAAM,CACL,MAAMkE,EAAUlE,EAAKA,EAAK,OAAS,CAAC,EAC9BmE,EAAOD,EAAQA,EAAQ,OAAS,CAAC,EACvC,OACEvF,EAAAA,IAAC,OAAA,CACC,EAAG6D,EAAO2B,EAAK,CAAC,EAAIvE,GACpB,EAAG8C,EAAOyB,EAAK,CAAC,EAChB,GAAG,SACH,UAAWzF,EAAO,SAClB,KAAMoF,EAEL,SAAA,EAAE,KAAA,CAAA,CAGT,KACE,IAAA,CAAA,EAjCE,EAAE,EAkCV,CAEJ,CAAC,EAEA1C,IAAW,KACVzC,EAAAA,IAAC,OAAA,CACC,GAAI6D,EAAOpB,CAAM,EACjB,GAAIoB,EAAOpB,CAAM,EACjB,GAAI5B,EACJ,GAAIoB,EAASnB,EACb,UAAWf,EAAO,aAAA,CAAA,EAElB,KACH0C,IAAW,KACRT,EAAO,IAAI,CAAC,EAAGkD,IAAO,CACpB,MAAM3D,EAAI,EAAE,OAAO,KAAMkE,GAAOA,EAAG,IAAMhD,CAAM,EAC/C,MAAI,CAAClB,GAAKA,EAAE,IAAM,KAAa,KAE7BvB,EAAAA,IAAC,SAAA,CAEC,GAAI6D,EAAOtC,EAAE,CAAC,EACd,GAAIwC,EAAOxC,EAAE,CAAC,EACd,EAAG,EACH,KAAMlB,EAAY6E,CAAE,EACpB,UAAWnF,EAAO,MAAA,EALb,EAAE,EAAA,CAQb,CAAC,EACD,KAEJC,EAAAA,IAAC,OAAA,CACC,EAAGW,EACH,EAAGE,EACH,MAAO8C,EACP,OAAQC,EACR,UAAW7D,EAAO,QAClB,QAAS,IAAM2C,EAAUuB,EAAMA,EAAM,OAAS,CAAC,GAAK,IAAI,CAAA,CAAA,CAC1D,CAAA,CAAA,EAEDe,IAAepC,EACd9C,OAAC,MAAA,CAAI,UAAWC,EAAO,QAAS,MAAO,CAAE,KAAM6C,EAAW,KAAM,IAAKA,EAAW,KAC9E,SAAA,CAAA5C,MAAC,OAAI,UAAWD,EAAO,YAAc,SAAAoC,EAAQM,CAAgB,EAAE,EAC9DuC,GAAY,IAAI,CAAC,CAAE,OAAQ,EAAG,MAAAU,CAAA,EAAS5D,IACtChC,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,WACrB,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,WAAY,MAAO,CAAE,WAAYM,EAAYyB,CAAC,CAAA,EAAK,cAAY,MAAA,CAAO,EAC7F4D,GAASA,EAAM,IAAM,KACpB5F,EAAAA,KAAA6F,EAAAA,SAAA,CACE,SAAA,CAAA3F,EAAAA,IAAC,QAAK,UAAWD,EAAO,aAAe,SAAAqC,EAAQsD,EAAM,CAAC,EAAE,EACvDhC,EAAa1D,EAAAA,IAAC,OAAA,CAAM,SAAA,EAAE,MAAM,EAAU,IAAA,CAAA,CACzC,EAEAF,EAAAA,KAAC,OAAA,CAAK,UAAWC,EAAO,WAAY,SAAA,CAAA,UAAQ2D,EAAa,MAAM,EAAE,KAAK,GAAK,EAAA,CAAA,CAAG,CAAA,CAAA,EAR1C,EAAE,EAU1C,CACD,CAAA,CAAA,CACH,EACE,KACHA,QACEzD,GAAA,CAAO,MAAO+B,EAAO,IAAI,CAAC,EAAGF,KAAO,CAAE,MAAO,EAAE,MAAO,MAAOzB,EAAYyB,CAAC,EAAG,KAAM,MAAA,EAAS,CAAA,CAAG,EAC9F,IAAA,EACN,CAEJ,qZC/RM8D,GAAU,GACVC,EAAM,GAEL,SAASC,GAAS,CACvB,KAAAC,EACA,OAAA9D,EAAS,IACT,YAAA+D,EAAc,WACd,MAAAb,EAAQ5E,GACR,YAAA0F,EAAeC,GAAc,OAAOA,CAAC,EACrC,UAAA5D,CACF,EAOG,CACD,MAAM6D,EAAMC,EAAAA,MAAA,EACN,CAACC,EAAOC,CAAQ,EAAI3D,EAAAA,SAAwB,IAAI,EAEhD4D,EAAQR,EAAK,IAAKnB,GAAMA,EAAE,KAAK,EAAE,OAAQsB,GAAmBA,IAAM,IAAI,EACtEM,EAAS,KAAK,IAAI,EAAG,GAAGD,EAAO,IAAM,EACrCE,EAAS,KAAK,IAAI,EAAG,GAAGF,CAAK,EAC7BG,EAAQF,EAASC,GAAU,EAEjC,GAAIT,IAAgB,aAAc,CAGhC,MAAMW,EAAO,KAAK,IAAIf,GAAS,KAAK,IAAI,GAAI,KAAK,OAAO3D,EAAS4D,GAAOE,EAAK,MAAM,EAAIF,CAAG,CAAC,EACrFlC,EAAQ,IACRiD,EAAOb,EAAK,QAAUY,EAAOd,GAAOA,EACpCgB,EAAO,IAAUlD,EAAQ,GAE/B,OACE7D,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,KACrB,SAAA,CAAAD,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAO,IAClB,MAAO8G,EACP,OAAQD,EACR,QAAS,OAAOC,CAAI,IAAID,CAAI,GAC5B,KAAK,MACL,aAAYtE,EAEZ,SAAA,CAAAtC,EAAAA,IAAC,OAAA,CAAK,GAAI,IAAS,GAAI,EAAG,GAAI,IAAS,GAAI4G,EAAM,UAAW7G,EAAO,SAAU,OAAQU,GAAY,EAChGsF,EAAK,IAAI,CAAC,EAAGjE,IAAM,CAClB,MAAM,EAAI+D,EAAM/D,GAAK6E,EAAOd,GACtBiB,EAAO,EAAE,QAAU,MAAS,EAAE,MAAQL,GAAUC,EAAS/C,EAAQ,EACvE,cACG,IAAA,CACC,SAAA,CAAA3D,EAAAA,IAAC,OAAA,CACC,EAAG,IACH,EAAG,EAAI2G,EAAO,EACd,GAAG,SACH,WAAW,MACX,UAAW5G,EAAO,cAEjB,SAAA,EAAE,MAAM,OAAS,GAAK,GAAG,EAAE,MAAM,MAAM,EAAG,EAAE,CAAC,IAAM,EAAE,KAAA,CAAA,EAEvD,EAAE,QAAU,KACXC,EAAAA,IAAC,OAAA,CACC,GAAI,IACJ,GAAI,EAAI2G,EAAO,EACf,GAAI,IACJ,GAAI,EAAIA,EAAO,EACf,OAAQnG,GACR,YAAa,EACb,gBAAgB,KAAA,CAAA,EAGlBV,EAAAA,KAAA6F,WAAA,CACE,SAAA,CAAA3F,EAAAA,IAAC,OAAA,CACC,EAAG,IACH,EACA,MAAO,KAAK,IAAI,EAAG8G,CAAI,EACvB,OAAQH,EACR,GAAI,EACJ,KAAMxB,EACN,UAAWpF,EAAO,GAAA,CAAA,EAEpBC,EAAAA,IAAC,OAAA,CACC,EAAG,IAAU,KAAK,IAAI,EAAG8G,CAAI,EAAI,EACjC,EAAG,EAAIH,EAAO,EACd,GAAG,SACH,UAAW5G,EAAO,WAEjB,SAAAkG,EAAY,EAAE,KAAK,CAAA,CAAA,CACtB,EACF,EAEFjG,EAAAA,IAAC,OAAA,CACC,UAAWD,EAAO,QAClB,EAAG,EACH,EAAG,EAAI8F,EAAM,EACb,MAAOgB,EACP,OAAQF,EAAOd,EACf,SAAU,EACV,KAAK,MACL,aAAY,GAAG,EAAE,KAAK,KAAK,EAAE,QAAU,KAAO,UAAYI,EAAY,EAAE,KAAK,CAAC,GAC9E,eAAgB,IAAMK,EAASxE,CAAC,EAChC,eAAgB,IAAMwE,EAAUS,GAAOA,IAAMjF,EAAI,KAAOiF,CAAE,EAC1D,QAAS,IAAMT,EAASxE,CAAC,EACzB,OAAQ,IAAMwE,EAAUS,GAAOA,IAAMjF,EAAI,KAAOiF,CAAE,CAAA,CAAA,CACpD,GAtDM,EAAE,MAAQjF,CAuDlB,CAEJ,CAAC,CAAA,CAAA,CAAA,EAEFuE,IAAU,KACTvG,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAO,QAClB,MAAO,CAAE,KAAM,IAAa,IAAK8F,EAAMQ,GAASM,EAAOd,GAAO,CAAA,EAE9D,SAAA,CAAA7F,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,aACrB,WAAKsG,CAAK,EAAE,QAAU,KAAO,UAAYJ,EAAYF,EAAKM,CAAK,EAAE,KAAe,EACnF,EACArG,MAAC,QAAK,UAAWD,EAAO,aAAe,SAAAgG,EAAKM,CAAK,EAAE,KAAA,CAAM,CAAA,CAAA,CAAA,EAEzD,IAAA,EACN,CAEJ,CAGA,MAAMW,EAAUjB,EAAK,OAAS,KAAK,IAAIH,GAAS,CAAC,EAAIA,GAC/CkB,EAAO,KAAK,IAAIlB,GAASoB,CAAO,EAChCnG,EAAQ,GACRC,EAAQ,GACR8C,EAAQ3B,EACR2E,EAAOhD,EAAQ/C,EAAQC,EACvB+F,EAAOd,EAAK,QAAUe,EAAOjB,GAAOA,EACpCoB,EAAQpG,EAAQ+C,GAAU,EAAI6C,GAAUC,EAAS9C,EAEvD,OACE9D,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,KACrB,SAAA,CAAAD,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAO,IAClB,MAAO8G,EACP,OAAQD,EACR,QAAS,OAAOC,CAAI,IAAID,CAAI,GAC5B,KAAK,MACL,aAAYtE,EAEZ,SAAA,CAAAtC,EAAAA,IAAC,OAAA,CAAK,GAAI,EAAG,GAAIiH,EAAO,GAAIJ,EAAM,GAAII,EAAO,UAAWlH,EAAO,SAAU,OAAQU,GAAY,EAC5FsF,EAAK,IAAI,CAACnB,EAAG9C,IAAM,CAClB,MAAMgC,EAAI+B,EAAM/D,GAAKgF,EAAOjB,GACtBqB,EAAOtC,EAAE,QAAU,KAAQ,KAAK,IAAIA,EAAE,MAAQ6B,CAAM,EAAIC,EAAS9C,EAAQ,EACzEuD,EAAMvC,EAAE,QAAU,MAAQA,EAAE,OAAS,EAAIqC,EAAQC,EAAOD,EAC9D,cACG,IAAA,CACE,SAAA,CAAArC,EAAE,QAAU,KACX5E,EAAAA,IAAC,OAAA,CACC,GAAI8D,EAAIgD,EAAO,EAAI,EACnB,GAAIG,EACJ,GAAInD,EAAIgD,EAAO,EAAI,EACnB,GAAIG,EACJ,OAAQzG,GACR,YAAa,EACb,gBAAgB,KAAA,CAAA,EAGlBV,EAAAA,KAAA6F,WAAA,CACE,SAAA,CAAA3F,EAAAA,IAAC,OAAA,CACC,EAAA8D,EACA,EAAGqD,EACH,MAAOL,EACP,OAAQ,KAAK,IAAI,EAAGI,CAAI,EACxB,GAAI,EACJ,KAAM/B,EACN,UAAWpF,EAAO,GAAA,CAAA,QAEnB,OAAA,CAAK,EAAG+D,EAAIgD,EAAO,EAAG,EAAGK,EAAM,EAAG,WAAW,SAAS,UAAWpH,EAAO,WACtE,SAAAkG,EAAYrB,EAAE,KAAK,CAAA,CACtB,CAAA,EACF,EAEF5E,EAAAA,IAAC,OAAA,CACC,EAAG8D,EAAIgD,EAAO,EACd,EAAGF,EAAO,EACV,WAAW,SACX,UAAW7G,EAAO,UAEjB,SAAA6E,EAAE,MAAM,OAAS,GAAK,GAAGA,EAAE,MAAM,MAAM,EAAG,CAAC,CAAC,IAAMA,EAAE,KAAA,CAAA,EAEvD5E,EAAAA,IAAC,OAAA,CACC,UAAWD,EAAO,QAClB,EAAG+D,EAAI+B,EAAM,EACb,EAAG,EACH,MAAOiB,EAAOjB,EACd,OAAQe,EACR,SAAU,EACV,KAAK,MACL,aAAY,GAAGhC,EAAE,KAAK,KAAKA,EAAE,QAAU,KAAO,UAAYqB,EAAYrB,EAAE,KAAK,CAAC,GAC9E,eAAgB,IAAM0B,EAASxE,CAAC,EAChC,eAAgB,IAAMwE,EAAUS,GAAOA,IAAMjF,EAAI,KAAOiF,CAAE,EAC1D,QAAS,IAAMT,EAASxE,CAAC,EACzB,OAAQ,IAAMwE,EAAUS,GAAOA,IAAMjF,EAAI,KAAOiF,CAAE,CAAA,CAAA,CACpD,GAhDMnC,EAAE,MAAQ9C,CAiDlB,CAEJ,CAAC,CAAA,CAAA,CAAA,EAEFuE,IAAU,KACTvG,EAAAA,KAAC,MAAA,CACC,UAAWC,EAAO,QAClB,MAAO,CAAE,KAAM8F,EAAMQ,GAASS,EAAOjB,GAAM,IAAK,CAAA,EAChD,GAAI,GAAGM,CAAG,WAEV,SAAA,CAAAnG,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,aACrB,WAAKsG,CAAK,EAAE,QAAU,KAAO,UAAYJ,EAAYF,EAAKM,CAAK,EAAE,KAAe,EACnF,EACArG,MAAC,QAAK,UAAWD,EAAO,aAAe,SAAAgG,EAAKM,CAAK,EAAE,KAAA,CAAM,CAAA,CAAA,CAAA,EAEzD,IAAA,EACN,CAEJ,iEC7NO,SAASe,GAAU,CACxB,OAAAhG,EACA,MAAAiG,EAAQ,GACR,OAAApF,EAAS,GACT,UAAAK,CACF,EAKG,CACD,MAAMiE,EAAQnF,EAAO,OAAQG,GAAmBA,IAAM,IAAI,EAC1D,GAAIgF,EAAM,OAAS,EACjB,OACEvG,EAAAA,IAAC,MAAA,CAAI,MAAAqH,EAAc,OAAApF,EAAgB,QAAS,OAAOoF,CAAK,IAAIpF,CAAM,GAAI,KAAK,MAAM,aAAYK,EAAW,EAG5G,MAAMb,EAAM,KAAK,IAAI,GAAG8E,EAAO,CAAC,EAE1BG,EADM,KAAK,IAAI,GAAGH,EAAO,CAAC,EACZ9E,GAAO,EACrB6F,EAAQD,EAAQ,KAAK,IAAI,EAAGjG,EAAO,OAAS,CAAC,EAC7CmG,EAAOrB,GAAcjE,GAAWiE,EAAIzE,GAAOiF,GAAUzE,EAAS,GAAK,EAGnEZ,EAAqC,CAAA,EAC3C,IAAIC,EAAsC,CAAA,EAC1CF,EAAO,QAAQ,CAAC8E,EAAGpE,IAAM,CACvB,GAAIoE,IAAM,KAAM,CACV5E,EAAQ,QAAQD,EAAK,KAAKC,CAAO,EACrCA,EAAU,CAAA,EACV,MACF,CACAA,EAAQ,KAAK,CAAE,EAAGQ,EAAIwF,EAAO,EAAGC,EAAIrB,CAAC,EAAG,CAC1C,CAAC,EACG5E,EAAQ,QAAQD,EAAK,KAAKC,CAAO,EAErC,MAAMkG,EAAiBpG,EAAO,IAAK8E,GAAMA,IAAM,IAAI,EAAE,YAAY,EAAI,EAC/DuB,EACJD,GAAkB,EAAI,CAAE,EAAGA,EAAiBF,EAAO,EAAGC,EAAInG,EAAOoG,CAAc,CAAW,GAAM,KAElG,OACE1H,EAAAA,KAAC,MAAA,CAAI,MAAAuH,EAAc,OAAApF,EAAgB,QAAS,OAAOoF,CAAK,IAAIpF,CAAM,GAAI,KAAK,MAAM,aAAYK,EAC1F,SAAA,CAAAjB,EAAK,IAAI,CAAC+D,EAAKtD,IACd9B,EAAAA,IAAC,OAAA,CAEC,UAAWD,GAAO,KAClB,EAAGqF,EAAI,IAAI,CAAC7D,EAAG+D,IAAM,GAAGA,IAAM,EAAI,IAAM,GAAG,GAAG/D,EAAE,EAAE,QAAQ,CAAC,CAAC,IAAIA,EAAE,EAAE,QAAQ,CAAC,CAAC,EAAE,EAAE,KAAK,GAAG,CAAA,EAFrFO,CAAA,CAIR,EACA2F,EAAYzH,EAAAA,IAAC,SAAA,CAAO,UAAWD,GAAO,IAAK,GAAI0H,EAAU,EAAG,GAAIA,EAAU,EAAG,EAAG,EAAG,EAAK,IAAA,EAC3F,CAEJ,CCpDO,SAASC,GAAcC,EAAmB,CAC/C,GAAI,CAAC,OAAO,SAASA,CAAC,EAAG,MAAO,IAChC,MAAMC,EAAM,KAAK,IAAID,CAAC,EACtB,OAAIC,GAAO,IAAkB,IAAID,EAAI,KAAW,QAAQC,GAAO,IAAa,EAAI,CAAC,CAAC,IAC9EA,GAAO,IAAe,GAAG,KAAK,MAAMD,EAAI,GAAI,CAAC,IAC7CC,GAAO,IAAcD,EAAE,eAAe,OAAO,EAC1C,OAAO,UAAUA,CAAC,EAAI,OAAOA,CAAC,EAAIA,EAAE,QAAQ,CAAC,CACtD,CAGO,SAASE,GAAUF,EAAmB,CAC3C,GAAI,CAAC,OAAO,SAASA,CAAC,EAAG,MAAO,IAChC,MAAMC,EAAM,KAAK,IAAID,CAAC,EAChBG,EAAOH,EAAI,EAAI,IAAM,GAC3B,OAAIC,GAAO,IAAkB,GAAGE,CAAI,KAAKF,EAAM,KAAW,QAAQ,CAAC,CAAC,IAChEA,GAAO,IAAc,GAAGE,CAAI,KAAKF,EAAM,KAAO,QAAQ,CAAC,CAAC,IACrD,GAAGE,CAAI,IAAIF,EAAI,QAAQ,CAAC,CAAC,EAClC,CAGO,SAASG,GAAcC,EAAkBC,EAAS,EAAW,CAClE,OAAK,OAAO,SAASD,CAAQ,EACtB,IAAIA,EAAW,KAAK,QAAQC,CAAM,CAAC,IADH,GAEzC,CAGO,SAASC,GAAoBP,EAAmB,CACrD,GAAI,CAAC,OAAO,SAASA,CAAC,EAAG,MAAO,IAChC,MAAMQ,EAAIT,GAAc,KAAK,IAAIC,CAAC,CAAC,EACnC,OAAIA,EAAI,EAAU,IAAIQ,CAAC,GACnBR,EAAI,EAAU,IAAIQ,CAAC,GAChBA,CACT,CAGO,SAASC,GAAeC,EAAqB,CAClD,GAAI,CAAC,sBAAsB,KAAKA,CAAG,EAAG,OAAOA,EAC7C,MAAMzD,EAAI,IAAI,KAAK,GAAGyD,CAAG,YAAY,EAErC,OAAI,OAAO,MAAMzD,EAAE,QAAA,CAAS,GAAKA,EAAE,YAAA,EAAc,MAAM,EAAG,EAAE,IAAMyD,EAAYA,EACvEzD,EAAE,mBAAmB,QAAS,CAAE,MAAO,QAAS,IAAK,UAAW,SAAU,MAAO,CAC1F,CAGO,SAAS0D,GAAgBC,EAAoB,CAClD,MAAM3D,EAAI,IAAI,KAAK2D,CAAE,EACrB,OAAI,OAAO,MAAM3D,EAAE,QAAA,CAAS,EAAU,GAC/BA,EAAE,mBAAmB,QAAS,CAAE,MAAO,QAAS,IAAK,UAAW,CACzE,sVCnCO,SAAS4D,GAAS,CACvB,MAAAC,EACA,MAAAC,EACA,QAAAC,EACA,MAAAC,EACA,MAAAC,EACA,WAAAC,CACF,EAOG,CACD,MAAMC,EACJH,GAAS,MAAQA,EAAM,mBAAqB,QAExCA,EAAM,QAAU,EADhB7I,EAAO,aAGJ6I,EAAM,MAAQ,IAAOA,EAAM,iBAC1B7I,EAAO,UACPA,EAAO,SAEjB,OACED,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,KACrB,SAAA,CAAAC,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,MAAQ,SAAA0I,EAAM,EACtCzI,EAAAA,IAAC,MAAA,CAAI,UAAWD,EAAO,IACrB,SAAAC,EAAAA,IAAC,OAAA,CAAK,UAAWD,EAAO,MAAQ,SAAA2I,CAAA,CAAM,EACxC,EACA5I,EAAAA,KAAC,MAAA,CAAI,UAAWC,EAAO,SACpB,SAAA,CAAA4I,EAAU3I,EAAAA,IAAC,QAAK,UAAWD,EAAO,QAAU,SAAA4I,CAAA,CAAQ,QAAW,OAAA,CAAA,CAAK,EACpEE,EAAQ7I,EAAAA,IAACoH,GAAA,CAAU,OAAQyB,EAAO,UAAWC,GAAc,GAAGL,CAAK,QAAA,CAAU,EAAK,IAAA,EACrF,EACCG,SACE,OAAA,CAAK,UAAW,GAAG7I,EAAO,KAAK,IAAIgJ,CAAS,GAC1C,SAAA,CAAAb,GAAoBU,EAAM,KAAK,EAC/BA,EAAM,OAAS,IAAIA,EAAM,MAAM,GAAK,EAAA,CAAA,CACvC,EACE,IAAA,EACN,CAEJ,2ECjDO,SAASI,GAAa,CAC3B,QAAAL,EACA,QAAAM,EACA,KAAAC,EACA,OAAAC,CACF,EAKG,CACD,OACErJ,EAAAA,KAAC,QAAA,CAAM,UAAWC,GAAO,MACvB,SAAA,CAAAC,EAAAA,IAAC,UAAA,CAAQ,UAAU,kBAAmB,SAAA2I,EAAQ,EAC9C3I,EAAAA,IAAC,QAAA,CACC,SAAAA,EAAAA,IAAC,KAAA,CACE,SAAAiJ,EAAQ,IAAK,GACZjJ,EAAAA,IAAC,KAAA,CAAe,MAAM,MAAM,UAAW,EAAE,QAAUD,GAAO,QAAU,OACjE,SAAA,EAAE,OADI,EAAE,GAEX,CACD,CAAA,CACH,CAAA,CACF,EACAC,EAAAA,IAAC,QAAA,CACE,SAAAkJ,EAAK,IAAI,CAACE,EAAKtH,IACd9B,EAAAA,IAAC,KAAA,CACE,WAAQ,IAAKqJ,GACZrJ,EAAAA,IAAC,MAAe,UAAWqJ,EAAE,QAAUtJ,GAAO,QAAU,OACrD,SAAAsJ,EAAE,OAAOD,CAAG,CAAA,EADNC,EAAE,GAEX,CACD,GALMF,EAAOC,EAAKtH,CAAC,CAMtB,CACD,CAAA,CACH,CAAA,EACF,CAEJ"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._topology_1rqbo_1{margin:var(--space-6) 0;min-width:0;color:var(--text-primary);font-family:var(--font-ui)}._header_1rqbo_2{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--space-4)}._header_1rqbo_2 h3{margin:0;font-family:var(--font-display);font-size:var(--text-2xl-size);letter-spacing:-.035em}._header_1rqbo_2 p{max-width:68ch;margin:var(--space-2) 0;color:var(--text-secondary);font-size:var(--text-sm-size);line-height:1.6}._snapshot_1rqbo_5{padding:5px 8px;border:1px solid var(--border-strong);font-size:var(--text-xs-size);white-space:nowrap;border-radius:var(--radius-xs)}._counts_1rqbo_6{display:flex;flex-wrap:wrap;margin:var(--space-4) 0 0;border-top:1px solid var(--border-strong);border-bottom:1px solid var(--border-strong);padding:var(--space-3) 0;gap:var(--space-3) var(--space-6)}._counts_1rqbo_6>div{display:flex;align-items:baseline;gap:var(--space-2)}._counts_1rqbo_6 dt{font-size:var(--text-xs-size);color:var(--text-secondary)}._counts_1rqbo_6 dd{margin:0;font-family:var(--font-display);font-size:var(--text-xl-size);font-variant-numeric:tabular-nums}._finder_1rqbo_10{padding:var(--space-4);border:1px solid var(--border-strong);border-top:0;background:var(--bg-surface)}._finderControls_1rqbo_11{display:flex;flex-wrap:wrap;align-items:flex-end;gap:var(--space-3)}._finderControls_1rqbo_11 label{display:flex;flex-direction:column;gap:6px;color:var(--text-secondary);font-size:var(--text-xs-size);min-width:0}._searchLabel_1rqbo_13{flex:1 1 220px}._finderControls_1rqbo_11 :is(input,select){min-height:38px;min-width:0;max-width:100%;box-sizing:border-box;border:1px solid var(--border-strong);border-radius:var(--radius-xs);background:var(--bg-canvas);color:var(--text-primary);padding:7px 10px;font:inherit;font-size:var(--text-sm-size)}._finderControls_1rqbo_11 input::placeholder{color:var(--text-secondary);opacity:1}._utilityButton_1rqbo_16{min-height:38px;padding:7px 10px;border:1px solid var(--border-strong);border-radius:var(--radius-xs);background:var(--bg-surface);color:var(--text-primary);font:inherit;font-size:var(--text-xs-size);cursor:pointer}._utilityButton_1rqbo_16:hover:not(:disabled){background:var(--bg-hover);border-color:var(--accent-500)}._utilityButton_1rqbo_16:disabled{opacity:.5;cursor:default}._finderMeta_1rqbo_19{display:flex;justify-content:space-between;flex-wrap:wrap;align-items:baseline;gap:6px var(--space-4);margin-top:var(--space-3);color:var(--text-secondary);font-size:var(--text-xs-size);line-height:1.5}._finderMeta_1rqbo_19 p{margin:0;max-width:70ch;flex:1 1 300px}._finderMeta_1rqbo_19>span{font-variant-numeric:tabular-nums}._results_1rqbo_22{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));list-style:none;padding:0;margin:var(--space-3) 0 0;gap:6px var(--space-3)}._results_1rqbo_22 li{min-width:0}._result_1rqbo_22{display:grid;grid-template-columns:minmax(0,1fr) auto;width:100%;text-align:left;gap:5px var(--space-2);padding:10px 12px;color:var(--text-primary);background:var(--bg-canvas);border:1px solid transparent;border-left:2px solid var(--border-strong);border-radius:0 var(--radius-xs) var(--radius-xs) 0;font:inherit;cursor:pointer}._result_1rqbo_22:hover{background:var(--bg-hover)}._result_1rqbo_22[aria-pressed=true]{border-color:var(--accent-500);background:var(--bg-selected)}._resultName_1rqbo_27{font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);overflow-wrap:anywhere}._resultState_1rqbo_28{align-self:start;font-size:var(--text-xs-size);color:var(--text-secondary)}._resultState_1rqbo_28[data-state=held]{color:var(--status-warning-fg)}._resultState_1rqbo_28[data-state=completed]{color:var(--status-success-fg)}._resultState_1rqbo_28[data-state=in-flight]{color:var(--status-unknown-fg)}._resultReason_1rqbo_32{grid-column:1 / -1;overflow-wrap:anywhere;color:var(--text-secondary);font-size:var(--text-xs-size)}._pagination_1rqbo_33{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:var(--space-2);margin-top:var(--space-3);font-size:var(--text-xs-size)}._pagination_1rqbo_33>span{color:var(--text-secondary);margin-right:auto;font-variant-numeric:tabular-nums}._noResults_1rqbo_35{margin:var(--space-3) 0 0;padding:var(--space-3) 0;color:var(--text-secondary);font-size:var(--text-sm-size);line-height:1.6}._selectionNote_1rqbo_36{border-left:2px solid var(--accent-500);padding-left:var(--space-3);color:var(--text-secondary)}._workspace_1rqbo_37{display:grid;grid-template-columns:minmax(0,1fr) minmax(250px,310px);border:1px solid var(--border-strong);border-top:0;border-radius:0 0 var(--radius-sm) var(--radius-sm);overflow:hidden}._board_1rqbo_38{min-width:0;max-height:620px;overflow:auto;background:var(--bg-canvas);scrollbar-gutter:stable}._canvas_1rqbo_39{position:relative;isolation:isolate}._edges_1rqbo_40{position:absolute;inset:0;pointer-events:none}._edge_1rqbo_40,._selectedEdge_1rqbo_41{fill:none;stroke:var(--border-strong);stroke-width:1.5}._selectedEdge_1rqbo_41{stroke:var(--accent-500);stroke-width:2}._column_1rqbo_43{position:absolute;top:20px;width:192px;color:var(--text-secondary);font-size:var(--text-xs-size);font-weight:var(--font-weight-medium)}._node_1rqbo_44{position:absolute;width:192px;min-height:80px;display:flex;flex-direction:column;gap:8px;padding:13px 14px;text-align:left;color:var(--text-primary);background:var(--bg-surface);border:1px solid var(--border-strong);border-left:3px solid var(--status-neutral-solid);border-radius:3px 10px 10px 3px;cursor:pointer}._node_1rqbo_44:hover{background:var(--bg-hover)}._node_1rqbo_44[aria-pressed=true]{border-color:var(--accent-500);background:var(--bg-selected);box-shadow:0 0 0 1px var(--accent-500)}._nodeName_1rqbo_47{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:var(--font-display);font-weight:var(--font-weight-semibold);font-size:var(--text-md-size)}._nodeState_1rqbo_48{font-size:var(--text-xs-size);color:var(--text-secondary)}._node_1rqbo_44[data-state=completed]{border-left-color:var(--status-success-solid)}._node_1rqbo_44[data-state=held]{border-left-color:var(--status-warning-solid)}._node_1rqbo_44[data-state=in-flight]{border-left-color:var(--status-unknown-solid)}._detail_1rqbo_52{padding:var(--space-5);border-left:1px solid var(--border-strong);background:var(--bg-surface);min-width:0}._detail_1rqbo_52 h4{margin:var(--space-3) 0;font-family:var(--font-display);font-size:var(--text-xl-size);letter-spacing:-.025em;overflow-wrap:anywhere}._detail_1rqbo_52 p{font-size:var(--text-sm-size);line-height:1.6}._detailState_1rqbo_55{display:inline-block;padding:4px 8px;border-radius:var(--radius-xs);background:var(--status-neutral-bg);color:var(--status-neutral-fg);font-size:var(--text-xs-size)}._detailState_1rqbo_55[data-state=completed]{background:var(--status-success-bg);color:var(--status-success-fg)}._detailState_1rqbo_55[data-state=held]{background:var(--status-warning-bg);color:var(--status-warning-fg)}._detailState_1rqbo_55[data-state=in-flight]{background:var(--status-unknown-bg);color:var(--status-unknown-fg)}._facts_1rqbo_59{margin:var(--space-4) 0;display:grid;gap:var(--space-3)}._facts_1rqbo_59 dt{font-size:var(--text-xs-size);color:var(--text-secondary);margin-bottom:3px}._facts_1rqbo_59 dd{margin:0;font-size:var(--text-sm-size);overflow-wrap:anywhere}._detail_1rqbo_52 h5{font-size:var(--text-sm-size);font-weight:var(--font-weight-semibold);margin:var(--space-5) 0 var(--space-2)}._relationships_1rqbo_63{margin:0;padding:0;list-style:none}._relationships_1rqbo_63 li{display:flex;justify-content:space-between;align-items:baseline;flex-wrap:wrap;gap:4px 8px;padding:7px 0;border-bottom:1px solid var(--border-subtle);font-size:var(--text-xs-size);overflow-wrap:anywhere}._relationships_1rqbo_63 li>span:last-child{color:var(--text-secondary)}._relationships_1rqbo_63 button{padding:3px 0;min-height:28px;color:var(--text-link);background:transparent;border:0;text-align:left;text-decoration:underline;text-underline-offset:3px;overflow-wrap:anywhere;cursor:pointer;font:inherit}._note_1rqbo_67,._legend_1rqbo_67,._empty_1rqbo_67{color:var(--text-secondary);font-size:var(--text-xs-size);line-height:1.6;max-width:78ch}._legend_1rqbo_67{margin:var(--space-3) 0 0}._notice_1rqbo_69{padding:var(--space-3);border-left:3px solid var(--status-unknown-solid);background:var(--status-unknown-bg);color:var(--status-unknown-fg);font-size:var(--text-sm-size);line-height:1.6;margin:var(--space-3) 0}._empty_1rqbo_67{padding:var(--space-5) 0;font-size:var(--text-sm-size)}._topology_1rqbo_1 :is(button,input,select,[tabindex]):focus-visible{outline:3px solid var(--border-focus);outline-offset:3px}._board_1rqbo_38:focus-visible{outline-offset:-3px}._srOnly_1rqbo_73{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}@media(max-width:900px){._workspace_1rqbo_37{grid-template-columns:minmax(0,1fr)}._detail_1rqbo_52{border-left:0;border-top:1px solid var(--border-strong)}._board_1rqbo_38{max-height:430px}}@media(max-width:500px){._header_1rqbo_2{flex-direction:column;gap:var(--space-2)}._counts_1rqbo_6{gap:var(--space-2) var(--space-4)}._detail_1rqbo_52{padding:var(--space-4)}}@media(max-width:620px){._results_1rqbo_22{grid-template-columns:minmax(0,1fr)}._finderControls_1rqbo_11 label:not(._searchLabel_1rqbo_13){flex:1 1 100%}._finder_1rqbo_10{padding:var(--space-3)}}._changes_qcw1f_1{margin:var(--space-5) 0;padding:var(--space-4) 0;border-top:1px solid var(--border-strong);border-bottom:1px solid var(--border-strong);color:var(--text-primary);font-family:var(--font-ui);min-width:0}._header_qcw1f_2{display:flex;flex-wrap:wrap;justify-content:space-between;align-items:baseline;gap:var(--space-2) var(--space-4)}._header_qcw1f_2 h3{margin:0;font-family:var(--font-display);font-size:var(--text-lg-size);letter-spacing:-.025em}._labels_qcw1f_4{display:flex;flex-wrap:wrap;gap:var(--space-2)}._labels_qcw1f_4>span{border:1px solid var(--border-strong);padding:4px 7px;border-radius:var(--radius-xs);color:var(--text-secondary);font-size:var(--text-xs-size)}._labels_qcw1f_4 ._historical_qcw1f_6{border-color:var(--status-warning-solid);color:var(--status-warning-fg)}._description_qcw1f_7,._note_qcw1f_7,._footnote_qcw1f_7{max-width:78ch;color:var(--text-secondary);font-size:var(--text-xs-size);line-height:1.6}._description_qcw1f_7{margin:var(--space-2) 0 var(--space-3)}._times_qcw1f_9{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-3) var(--space-5);margin:0}._times_qcw1f_9 dt{font-size:var(--text-xs-size);color:var(--text-secondary);margin-bottom:4px}._times_qcw1f_9 dd{margin:0;overflow-wrap:anywhere;font-size:var(--text-sm-size);font-variant-numeric:tabular-nums}._warning_qcw1f_12{padding-left:var(--space-3);border-left:2px solid var(--status-warning-solid);color:var(--text-secondary);font-size:var(--text-xs-size);line-height:1.6;max-width:78ch;margin:var(--space-3) 0}._baseline_qcw1f_13{font-size:var(--text-sm-size);line-height:1.6;max-width:78ch;margin:var(--space-4) 0 0}._counts_qcw1f_14{display:flex;flex-wrap:wrap;gap:var(--space-2) var(--space-5);margin:var(--space-4) 0 var(--space-3)}._counts_qcw1f_14>div{display:flex;align-items:baseline;gap:var(--space-2)}._counts_qcw1f_14 dt{font-size:var(--text-xs-size);color:var(--text-secondary)}._counts_qcw1f_14 dd{font-family:var(--font-display);font-size:var(--text-lg-size);margin:0;font-variant-numeric:tabular-nums}._disclosure_qcw1f_18{margin-top:var(--space-3)}._disclosure_qcw1f_18 summary{padding:10px 12px;background:var(--bg-canvas);border-left:2px solid var(--accent-500);border-radius:0 var(--radius-xs) var(--radius-xs) 0;font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);cursor:pointer}._disclosure_qcw1f_18 summary:hover{background:var(--bg-hover)}._disclosure_qcw1f_18 summary:focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}._rows_qcw1f_22{list-style:none;padding:0;margin:0}._row_qcw1f_22{display:grid;grid-template-columns:minmax(130px,1fr) minmax(0,3fr);gap:var(--space-3) var(--space-4);padding:var(--space-3) 12px;border-bottom:1px solid var(--border-default)}._field_qcw1f_24{min-width:0}._field_qcw1f_24 h4{margin:0;font-size:var(--text-sm-size);font-weight:var(--font-weight-medium);overflow-wrap:anywhere}._field_qcw1f_24>span{display:block;color:var(--text-secondary);font-size:var(--text-xs-size);margin-top:4px;overflow-wrap:anywhere}._values_qcw1f_27{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:var(--space-3);margin:0}._values_qcw1f_27 dt{font-size:var(--text-xs-size);color:var(--text-secondary);margin-bottom:4px}._values_qcw1f_27 dd{font-size:var(--text-sm-size);margin:0;overflow-wrap:anywhere;white-space:pre-wrap;line-height:1.5}._footnote_qcw1f_7{margin:var(--space-3) 0 0}@media(max-width:650px){._row_qcw1f_22{grid-template-columns:minmax(0,1fr)}}@media(max-width:420px){._times_qcw1f_9,._values_qcw1f_27{grid-template-columns:minmax(0,1fr)}}._inspector_123iu_1{margin-bottom:var(--space-8);padding:var(--space-5);border:1px solid var(--border-strong);border-radius:var(--radius-md);background:var(--bg-surface);color:var(--text-primary)}._header_123iu_2{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--space-4);margin-bottom:var(--space-5)}._header_123iu_2 h2{font-family:var(--font-display);font-size:var(--text-xl-size);letter-spacing:-.025em}._header_123iu_2 p,._note_123iu_4,._empty_123iu_4,._field_123iu_4 p,._control_123iu_4 p{max-width:78ch;color:var(--text-secondary);font-size:var(--text-sm-size);line-height:1.6}._readOnly_123iu_5{padding:var(--space-1) var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-xs);white-space:nowrap;font-size:var(--text-xs-size)}._form_123iu_6{display:flex;flex-wrap:wrap;align-items:flex-start;gap:var(--space-3)}._field_123iu_4{flex:1 1 300px;max-width:560px}._field_123iu_4 label{display:block;margin-bottom:var(--space-2);font-size:var(--text-sm-size);font-weight:var(--font-weight-semibold)}._field_123iu_4 input{width:100%;min-height:42px;padding:var(--space-2) var(--space-3);background:var(--bg-canvas);color:var(--text-primary);border:1px solid var(--border-strong);border-radius:var(--radius-sm);font-family:var(--font-ui)}._field_123iu_4 p{margin-top:var(--space-2)}._form_123iu_6 button{margin-top:28px;min-height:42px;padding:var(--space-2) var(--space-4);border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--bg-surface);color:var(--text-primary);font-weight:var(--font-weight-medium)}._form_123iu_6 button[type=submit]{background:var(--accent-600);border-color:var(--accent-600);color:var(--accent-contrast)}._form_123iu_6 button:disabled{opacity:.6;cursor:wait}._inspector_123iu_1 :is(button,input,summary,[tabindex]):focus-visible{outline:2px solid var(--border-focus);outline-offset:3px}._identity_123iu_15{margin-top:var(--space-5);font-size:var(--text-lg-size);overflow-wrap:anywhere}._identity_123iu_15 code{font-family:var(--font-ui);font-weight:var(--font-weight-semibold)}._note_123iu_4,._empty_123iu_4{margin-top:var(--space-3)}._warning_123iu_18{margin-top:var(--space-3);padding:var(--space-3);border-left:3px solid var(--status-warning-solid);background:var(--status-warning-bg);color:var(--status-warning-fg);font-size:var(--text-sm-size)}._facts_123iu_19{display:grid;grid-template-columns:repeat(auto-fit,minmax(min(100%,205px),1fr));gap:var(--space-4);margin:var(--space-5) 0}._facts_123iu_19 dt{color:var(--text-secondary);font-size:var(--text-xs-size);margin-bottom:var(--space-1)}._facts_123iu_19 dd{margin:0;font-size:var(--text-sm-size);overflow-wrap:anywhere;font-variant-numeric:tabular-nums}._control_123iu_4{padding:var(--space-4);border-left:3px solid var(--accent-500);background:var(--bg-canvas);margin-bottom:var(--space-5)}._control_123iu_4 h4{font-family:var(--font-display);font-size:var(--text-lg-size)}._sequence_123iu_24{list-style:none;padding:0;display:grid;grid-template-columns:1fr 1fr;gap:var(--space-5);margin:var(--space-4) 0}._sequence_123iu_24 li{display:flex;flex-direction:column;gap:var(--space-1);border-top:2px solid var(--border-strong);padding-top:var(--space-3);font-size:var(--text-sm-size);overflow-wrap:anywhere}._sequence_123iu_24 span,._sequence_123iu_24 time{color:var(--text-secondary)}._tableWrap_123iu_27{overflow-x:auto;max-width:100%}._tableWrap_123iu_27 table{width:100%;border-collapse:collapse;font-size:var(--text-sm-size);text-align:left}._tableWrap_123iu_27 caption{text-align:left;font-weight:var(--font-weight-semibold);padding:var(--space-3) 0}._tableWrap_123iu_27 th,._tableWrap_123iu_27 td{border-bottom:1px solid var(--border-default);padding:var(--space-3);vertical-align:top;overflow-wrap:anywhere;min-width:115px}._tableWrap_123iu_27 thead{color:var(--text-secondary);background:var(--bg-canvas)}._reasons_123iu_32{margin-top:var(--space-4);font-size:var(--text-sm-size);overflow-wrap:anywhere}._reasons_123iu_32 summary{cursor:pointer;padding:var(--space-2) 0}._reasons_123iu_32 ul{padding-left:var(--space-5)}@media(max-width:650px){._inspector_123iu_1{padding:var(--space-4)}._form_123iu_6 button{margin-top:0}._field_123iu_4{max-width:none;flex-basis:100%}._sequence_123iu_24{grid-template-columns:1fr}}._shell_8ebyv_1{min-height:100%}._scopeBar_8ebyv_2{display:flex;align-items:center;justify-content:space-between;gap:var(--space-5);padding:var(--space-4) max(var(--space-6),calc((100vw - 1320px)/2));border-bottom:1px solid var(--border-default);background:var(--bg-surface)}._scope_8ebyv_2{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-2) var(--space-3);min-width:0}._brand_8ebyv_4{display:flex;align-items:center;flex-wrap:wrap;gap:var(--space-3);min-width:0}._brand_8ebyv_4 strong{font-family:var(--font-display);font-size:var(--text-xl-size);line-height:var(--text-xl-line);font-weight:var(--font-weight-semibold);letter-spacing:-.035em}._brandMark_8ebyv_6{flex-shrink:0;width:var(--space-8);height:var(--space-8);fill:none;stroke:var(--accent-600);stroke-width:1.8;stroke-linejoin:round;stroke-linecap:round}._workspace_8ebyv_7{padding-left:var(--space-3);border-left:1px solid var(--border-strong);color:var(--text-secondary);font-size:var(--text-sm-size)}._badge_8ebyv_8{padding:var(--space-1) var(--space-2);border:1px solid var(--border-default);border-radius:var(--radius-xs);color:var(--text-secondary);background:var(--bg-canvas);font-size:var(--text-xs-size);white-space:nowrap}._store_8ebyv_9{min-width:0;font-size:var(--text-xs-size);color:var(--text-secondary)}._store_8ebyv_9[open]{flex-basis:100%}._store_8ebyv_9 summary{cursor:pointer;padding:var(--space-2) 0;min-height:32px}._root_8ebyv_12{display:block;max-width:72ch;padding:var(--space-3);background:var(--bg-surface-raised);border:1px solid var(--border-strong);border-radius:var(--radius-sm);overflow-wrap:anywhere;font-size:var(--text-xs-size);color:var(--text-primary)}._actions_8ebyv_13{display:flex;flex-shrink:0;gap:var(--space-2)}._actions_8ebyv_13 button,._notice_8ebyv_14 button{min-height:36px;padding:var(--space-2) var(--space-3);border:1px solid var(--border-default);border-radius:var(--radius-sm);background:var(--bg-surface);font-size:var(--text-sm-size)}._actions_8ebyv_13 button:hover,._notice_8ebyv_14 button:hover{background:var(--bg-hover)}._main_8ebyv_16{max-width:1368px;margin:auto;padding:var(--space-6)}._explanation_8ebyv_17{color:var(--text-secondary);font-size:var(--text-sm-size);margin-bottom:var(--space-6);max-width:85ch}._notice_8ebyv_14{display:flex;flex-direction:column;align-items:flex-start;gap:var(--space-3);padding:var(--space-5);border:1px solid var(--status-warning-solid);border-radius:var(--radius-md);background:var(--status-warning-bg)}._notice_8ebyv_14 h1{font-size:var(--text-xl-size)}._checking_8ebyv_20{padding:var(--space-8)}@media(max-width:1000px){._brand_8ebyv_4{flex-basis:100%}}@media(max-width:700px){._scopeBar_8ebyv_2{flex-direction:column;align-items:stretch;gap:var(--space-3);padding:var(--space-4)}._actions_8ebyv_13{justify-content:flex-end}._main_8ebyv_16{padding:var(--space-5) var(--space-4)}}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{j as e,r as _}from"./index-BkUlX2Se.js";import{a as X,h as ne,r as te,m as ae,i as oe,S as ie,f as re,j as ce,k as le,l as de,n as he}from"./global-CNVapoV1.js";import{U as pe,a as me}from"./UniverseView-BtApwayT.js";import"./StatusBadge-BbEdqEGn.js";import"./RefreshIndicator-vHGpmyzb.js";import"./Skeleton-4qq4HuJO.js";import"./queries-C9XS4SYq.js";const Y=Object.freeze({"campaign-execution":Object.freeze(["campaign-call-threw"]),"campaign-verification":Object.freeze(["campaign-evidence-changed"]),"delivery-execution":Object.freeze(["delivery-call-threw"]),"delivery-verification":Object.freeze(["delivery-evidence-changed","delivery-receipt-unverified"]),"settlement-publication":Object.freeze(["settlement-write-failed"])});function S(s){return typeof s=="string"&&/^[a-z0-9][a-z0-9_-]{0,63}$/.test(s)}function D(s){return s!==null&&typeof s=="object"&&!Array.isArray(s)}function R(s){return typeof s=="string"&&/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/.test(s)&&Number.isFinite(Date.parse(s))&&new Date(s).toISOString()===(s.length===20?s.replace("Z",".000Z"):s)}function J(s){return typeof s=="string"&&/^[a-z0-9][a-z0-9_:-]{0,191}$/.test(s)}function ge(s,n){const l=()=>new Error("Controller evidence could not be validated.");if(!S(n)||!D(s)||s.schemaVersion!==1||s.controllerId!==n||typeof s.sourceState!="string"||!["healthy","missing","degraded"].includes(s.sourceState)||typeof s.status!="string"||!["completed","incomplete","cancelled","timed-out","unavailable","draining","drained"].includes(s.status)||!(s.createdAt===null||R(s.createdAt))||!(s.deadlineAt===null||R(s.deadlineAt))||!R(s.observedAt)||!Array.isArray(s.reasons)||s.reasons.length>128||!s.reasons.every(J)||!Array.isArray(s.outcomes)||s.outcomes.length>64)throw l();const f=new Set,r=s.outcomes.map(p=>{if(!D(p)||typeof p.campaignId!="string"||!S(p.campaignId)||f.has(p.campaignId)||typeof p.state!="string"||!["pending","in-flight","completed","held"].includes(p.state)||typeof p.attempted!="boolean"||!J(p.reasonCode))throw l();return f.add(p.campaignId),{campaignId:p.campaignId,state:p.state,attempted:p.attempted,reasonCode:p.reasonCode}});let u;if(s.topology!==void 0){if(!Array.isArray(s.topology)||s.topology.length>64||s.topology.length!==r.length)throw l();const p=new Set;u=s.topology.map(c=>{if(!D(c)||!S(c.campaignId)||!f.has(c.campaignId)||p.has(c.campaignId))throw l();p.add(c.campaignId);const h=m=>{if(!Array.isArray(m)||m.length>63||!m.every(v=>S(v)&&f.has(v)&&v!==c.campaignId)||new Set(m).size!==m.length)throw l();return[...m]},g=h(c.dependsOn),N=h(c.prerequisites);if(g.some(m=>!N.includes(m)))throw l();return{campaignId:c.campaignId,dependsOn:g,prerequisites:N}});const a=new Map(u.map(c=>[c.campaignId,c])),i=new Set;for(;i.size<u.length;){const c=u.find(h=>!i.has(h.campaignId)&&h.prerequisites.every(g=>i.has(g)));if(!c)throw l();i.add(c.campaignId)}for(const c of u){const h=new Set,g=[...c.dependsOn];for(;g.length;){const N=g.pop();h.has(N)||(h.add(N),g.push(...a.get(N).dependsOn))}if(c.prerequisites.some(N=>!h.has(N)))throw l()}}let o,y;if(s.diagnostics!==void 0){if(!Array.isArray(s.diagnostics)||s.diagnostics.length>r.length)throw l();const p=new Set;y=s.diagnostics.map(a=>{if(!D(a)||!S(a.campaignId)||!f.has(a.campaignId)||p.has(a.campaignId)||r.find(c=>c.campaignId===a.campaignId)?.state==="pending"||typeof a.phase!="string"||!Object.hasOwn(Y,a.phase)||typeof a.code!="string"||!R(a.at))throw l();const i=a.phase;if(!Y[i].includes(a.code))throw l();return p.add(a.campaignId),{campaignId:a.campaignId,phase:i,code:a.code,at:a.at}})}if(s.control!==void 0){const p=s.control;if(!D(p)||typeof p.mode!="string"||!["open","drain"].includes(p.mode)||!Number.isInteger(p.sequence)||p.sequence<1||p.sequence>511||!R(p.requestedAt)||!(p.acknowledgedAt===null||R(p.acknowledgedAt)))throw l();o={mode:p.mode,sequence:p.sequence,requestedAt:p.requestedAt,acknowledgedAt:p.acknowledgedAt}}if(o?.mode==="open"&&o.acknowledgedAt!==null||s.status==="draining"&&(o?.mode!=="drain"||o.acknowledgedAt!==null)||s.status==="drained"&&(o?.mode!=="drain"||o.acknowledgedAt===null))throw l();return{schemaVersion:1,controllerId:n,sourceState:s.sourceState,status:s.status,createdAt:s.createdAt,deadlineAt:s.deadlineAt,observedAt:s.observedAt,reasons:[...s.reasons],outcomes:r,...u?{topology:u}:{},...o?{control:o}:{},...y?{diagnostics:y}:{}}}async function ue(s,n){if(!S(s))throw new Error("Enter a valid controller ID.");const l=await X(`/api/universe/controller-status?controllerId=${encodeURIComponent(s)}`,n);return ge(l,s)}function fe(s,n,l){const f=n.trim().toLowerCase();return s.filter(r=>(l==="all"||r.state===l)&&(r.campaignId.toLowerCase().includes(f)||r.reasonCode.toLowerCase().includes(f)))}function xe(s,n,l){const f=Number.isFinite(l)?Math.max(0,Math.floor(l)):0;if(n===null)return s.slice(0,f);const r=[],u=[];for(const o of s)(o.from===n||o.to===n?r:u).push(o);return[...r,...u].slice(0,f)}const be="_topology_1rqbo_1",je="_header_1rqbo_2",_e="_snapshot_1rqbo_5",ye="_counts_1rqbo_6",ve="_finder_1rqbo_10",Ne="_finderControls_1rqbo_11",we="_searchLabel_1rqbo_13",Ie="_utilityButton_1rqbo_16",Ce="_finderMeta_1rqbo_19",qe="_results_1rqbo_22",ke="_result_1rqbo_22",Ae="_resultName_1rqbo_27",Se="_resultState_1rqbo_28",$e="_resultReason_1rqbo_32",Re="_pagination_1rqbo_33",Oe="_noResults_1rqbo_35",Te="_selectionNote_1rqbo_36",Ee="_workspace_1rqbo_37",Me="_board_1rqbo_38",De="_canvas_1rqbo_39",Le="_edges_1rqbo_40",Ue="_edge_1rqbo_40",Fe="_selectedEdge_1rqbo_41",ze="_column_1rqbo_43",Be="_node_1rqbo_44",Pe="_nodeName_1rqbo_47",We="_nodeState_1rqbo_48",Ze="_detail_1rqbo_52",Ge="_detailState_1rqbo_55",He="_facts_1rqbo_59",Qe="_relationships_1rqbo_63",Ve="_note_1rqbo_67",Ye="_legend_1rqbo_67",Je="_empty_1rqbo_67",Ke="_notice_1rqbo_69",Xe="_srOnly_1rqbo_73",d={topology:be,header:je,snapshot:_e,counts:ye,finder:ve,finderControls:Ne,searchLabel:we,utilityButton:Ie,finderMeta:Ce,results:qe,result:ke,resultName:Ae,resultState:Se,resultReason:$e,pagination:Re,noResults:Oe,selectionNote:Te,workspace:Ee,board:Me,canvas:De,edges:Le,edge:Ue,selectedEdge:Fe,column:ze,node:Be,nodeName:Pe,nodeState:We,detail:Ze,detailState:Ge,facts:He,relationships:Qe,note:Ve,legend:Ye,empty:Je,notice:Ke,srOnly:Xe},G=64,W=256,Z=8,A={pending:"Pending","in-flight":"Unresolved intent",completed:"Completed",held:"Held"},es={pending:"No settled outcome is recorded. Pending does not mean ready to run.","in-flight":"A durable dispatch intent remains unresolved. This is not proof of a live worker.",completed:"The controller recorded completion, including any required local delivery. This is not a production deployment claim.",held:"Work remains held for the recorded reason. This view does not retry or release it."};function ss(s){const n=s.outcomes.slice(0,G),l=new Map(s.topology?.map(i=>[i.campaignId,i])),f=new Set(n.map(i=>i.campaignId)),r=new Map;if(s.topology)for(let i=0;i<n.length;i++)for(const c of n){const h=l.get(c.campaignId);r.has(c.campaignId)||!h||h.dependsOn.some(g=>!r.has(g))||r.set(c.campaignId,h.dependsOn.length?Math.max(...h.dependsOn.map(g=>r.get(g)))+1:0)}const o=[...new Set(r.values())].sort((i,c)=>i-c).map(i=>({label:`Dependency layer ${i+1}`,nodes:n.filter(c=>r.get(c.campaignId)===i)})),y=n.filter(i=>!r.has(i.campaignId));y.length&&o.push({label:s.topology?"Layer unavailable":"Recorded campaigns",nodes:y});const p=new Map;o.forEach((i,c)=>i.nodes.forEach((h,g)=>p.set(h.campaignId,{x:24+c*244,y:56+g*108})));const a=n.flatMap(i=>(l.get(i.campaignId)?.dependsOn??[]).filter(c=>f.has(c)).map(c=>({from:c,to:i.campaignId})));return{nodes:n,topology:l,columns:o,positions:p,edges:a,width:Math.max(256,o.length*244+8),height:64+Math.max(1,...o.map(i=>i.nodes.length))*108}}function ns({data:s}){const n=_.useMemo(()=>ss(s),[s]),[l,f]=_.useState(n.nodes[0]?.campaignId??null),[r,u]=_.useState(""),[o,y]=_.useState("all"),[p,a]=_.useState(0),i=_.useRef(null),c=_.useRef(new Map),h=n.nodes.find(t=>t.campaignId===l),g=_.useMemo(()=>fe(n.nodes,r,o),[n.nodes,r,o]),N=r.trim().length>0||o!=="all",m=Math.max(1,Math.ceil(g.length/Z)),v=Math.min(p,m-1),U=g.slice(v*Z,(v+1)*Z),$=h&&N&&!g.some(t=>t.campaignId===h.campaignId),F=_.useMemo(()=>xe(n.edges,h?.campaignId??null,W),[n.edges,h?.campaignId]),C=_.useId(),B=`${C}-detail`,E=h?n.topology.get(h.campaignId):void 0,ee=E?.prerequisites.filter(t=>!E.dependsOn.includes(t))??[],H=new Map(s.outcomes.map(t=>[t.campaignId,t])),se=t=>s.outcomes.filter(w=>w.state===t).length;function Q(t,w=!1){const b=i.current,q=n.positions.get(t);if(!b||!q)return;const k=Math.max(0,q.x+96-b.clientWidth/2),M=Math.max(0,q.y+40-b.clientHeight/2);typeof b.scrollTo=="function"?b.scrollTo({left:k,top:M,behavior:"auto"}):(b.scrollLeft=k,b.scrollTop=M),w&&c.current.get(t)?.focus({preventScroll:!0})}function P(t){f(t),Q(t)}function V(t,w){return t.length?e.jsx("ul",{className:d.relationships,children:t.map(b=>e.jsxs("li",{children:[n.positions.has(b)?e.jsx("button",{type:"button",onClick:()=>P(b),children:b}):e.jsx("span",{children:b}),e.jsx("span",{children:H.has(b)?A[H.get(b).state]:"Outcome unavailable"})]},b))}):e.jsx("p",{className:d.note,children:w})}return e.jsxs("section",{className:d.topology,"aria-label":"Controller mission topology",children:[e.jsxs("header",{className:d.header,children:[e.jsxs("div",{children:[e.jsx("h3",{children:"Mission topology"}),e.jsx("p",{children:"Follow the declared work graph. Select a campaign to inspect its recorded state and prerequisites."})]}),e.jsx("span",{className:d.snapshot,children:"Recorded snapshot"})]}),e.jsxs("dl",{className:d.counts,"aria-label":"Recorded campaign counts",children:[e.jsxs("div",{children:[e.jsx("dt",{children:"Campaigns"}),e.jsx("dd",{children:s.outcomes.length})]}),["completed","in-flight","held","pending"].map(t=>e.jsxs("div",{"data-state":t,children:[e.jsx("dt",{children:A[t]}),e.jsx("dd",{children:se(t)})]},t))]}),s.topology?null:e.jsx("p",{className:d.notice,children:"Dependency information is unavailable in this observation. Campaign placement does not imply independence or readiness."}),s.outcomes.length>G?e.jsxs("p",{className:d.notice,children:["Showing the first ",G," of ",s.outcomes.length," campaigns. Counts include all recorded outcomes; relationships outside this diagram remain in the selected campaign detail."]}):null,n.nodes.length?e.jsxs(e.Fragment,{children:[e.jsxs("section",{className:d.finder,"aria-label":"Campaign navigator",children:[e.jsxs("div",{className:d.finderControls,children:[e.jsxs("label",{className:d.searchLabel,htmlFor:`${C}-search`,children:["Search campaigns",e.jsx("input",{id:`${C}-search`,type:"search",value:r,maxLength:192,placeholder:"Campaign ID or recorded reason","aria-describedby":`${C}-finder-hint`,onChange:t=>{u(t.target.value),a(0)}})]}),e.jsxs("label",{htmlFor:`${C}-state`,children:["Recorded state",e.jsxs("select",{id:`${C}-state`,value:o,onChange:t=>{y(t.target.value),a(0)},children:[e.jsx("option",{value:"all",children:"All recorded states"}),["pending","in-flight","completed","held"].map(t=>e.jsx("option",{value:t,children:A[t]},t))]})]}),e.jsx("button",{type:"button",className:d.utilityButton,disabled:!h,onClick:()=>{h&&Q(h.campaignId,!0)},children:"Locate selected"}),N?e.jsx("button",{type:"button",className:d.utilityButton,onClick:()=>{u(""),y("all"),a(0)},children:"Reset filters"}):null]}),e.jsxs("div",{className:d.finderMeta,children:[e.jsxs("p",{id:`${C}-finder-hint`,children:["Search covers the ",n.nodes.length," diagram campaigns. Filters narrow this index, not the graph or its dependency layers."]}),e.jsx("span",{"aria-live":"polite","aria-atomic":"true",children:N?`${g.length} matching campaign${g.length===1?"":"s"}`:`${n.nodes.length} campaigns in diagram`})]}),N?e.jsxs(e.Fragment,{children:[g.length?e.jsx("ul",{className:d.results,"aria-label":"Matching campaigns",children:U.map(t=>e.jsx("li",{children:e.jsxs("button",{type:"button",className:d.result,"aria-label":`Select campaign ${t.campaignId}`,"aria-describedby":`${C}-result-state-${t.campaignId} ${C}-result-reason-${t.campaignId}`,"aria-pressed":h?.campaignId===t.campaignId,"aria-controls":B,onClick:()=>P(t.campaignId),children:[e.jsx("span",{className:d.resultName,children:t.campaignId}),e.jsx("span",{id:`${C}-result-state-${t.campaignId}`,className:d.resultState,"data-state":t.state,children:A[t.state]}),e.jsx("span",{id:`${C}-result-reason-${t.campaignId}`,className:d.resultReason,children:t.reasonCode})]})},t.campaignId))}):e.jsx("p",{className:d.noResults,children:"No diagram campaigns match. Try another campaign ID or recorded reason, or reset filters."}),m>1?e.jsxs("nav",{className:d.pagination,"aria-label":"Campaign result pages",children:[e.jsxs("span",{children:["Page ",v+1," of ",m]}),e.jsx("button",{type:"button",className:d.utilityButton,disabled:v===0,onClick:()=>a(v-1),children:"Previous results"}),e.jsx("button",{type:"button",className:d.utilityButton,disabled:v+1===m,onClick:()=>a(v+1),children:"Next results"})]}):null]}):null]}),e.jsxs("div",{className:d.workspace,children:[e.jsx("div",{ref:i,className:d.board,role:"region","aria-label":"Campaign dependency diagram",tabIndex:0,children:e.jsxs("div",{className:d.canvas,style:{width:n.width,height:n.height},children:[e.jsx("svg",{width:n.width,height:n.height,className:d.edges,"aria-hidden":"true",children:F.map(t=>{const w=n.positions.get(t.from),b=n.positions.get(t.to),q=w.x+192,k=b.x,M=(q+k)/2;return e.jsx("path",{className:h&&(t.from===h.campaignId||t.to===h.campaignId)?d.selectedEdge:d.edge,d:`M ${q} ${w.y+40} C ${M} ${w.y+40}, ${M} ${b.y+40}, ${k} ${b.y+40}`},`${t.from}-${t.to}`)})}),n.columns.map((t,w)=>e.jsx("span",{className:d.column,style:{left:24+w*244},children:t.label},t.label)),n.nodes.map((t,w)=>{const b=n.positions.get(t.campaignId),q=n.topology.get(t.campaignId);return e.jsxs("div",{children:[e.jsxs("button",{type:"button",className:d.node,"data-state":t.state,style:{left:b.x,top:b.y},ref:k=>{k?c.current.set(t.campaignId,k):c.current.delete(t.campaignId)},"aria-label":`Inspect campaign ${t.campaignId}: ${A[t.state]}`,"aria-pressed":h?.campaignId===t.campaignId,"aria-controls":B,"aria-describedby":`${C}-relations-${w}`,onClick:()=>P(t.campaignId),children:[e.jsx("span",{className:d.nodeName,children:t.campaignId}),e.jsx("span",{className:d.nodeState,children:A[t.state]})]}),e.jsx("span",{id:`${C}-relations-${w}`,className:d.srOnly,children:q?`Direct dependencies: ${q.dependsOn.join(", ")||"none declared"}. Additional inherited delivery prerequisites: ${q.prerequisites.filter(k=>!q.dependsOn.includes(k)).join(", ")||"none recorded"}.`:"Dependency information unavailable."})]},t.campaignId)})]})}),e.jsx("section",{id:B,className:d.detail,"aria-label":"Selected campaign detail",children:h?e.jsxs(e.Fragment,{children:[e.jsx("span",{className:d.detailState,"data-state":h.state,children:A[h.state]}),e.jsx("h4",{children:h.campaignId}),$?e.jsx("p",{className:d.selectionNote,children:"The selected campaign is outside the current filters. Its recorded detail remains available."}):null,e.jsx("p",{children:es[h.state]}),e.jsxs("dl",{className:d.facts,children:[e.jsxs("div",{children:[e.jsx("dt",{children:"Recorded reason"}),e.jsx("dd",{children:h.reasonCode})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Campaign-call intent"}),e.jsx("dd",{children:h.attempted?"Recorded":"Not recorded"})]})]}),e.jsx("p",{className:d.note,children:"A call intent is not proof of worker execution, model requests or successful evaluation."}),e.jsx("h5",{children:"Direct dependencies"}),E?V(E.dependsOn,"None declared for this campaign."):e.jsx("p",{className:d.note,children:"Dependency information unavailable."}),e.jsx("h5",{children:"Additional inherited delivery prerequisites"}),E?V(ee,"None recorded beyond the direct dependencies."):e.jsx("p",{className:d.note,children:"Delivery prerequisite information unavailable."}),e.jsx("p",{className:d.note,children:"Inherited prerequisites are ancestor delivery gates, not additional declared dependency edges. A state badge alone does not verify the delivery receipt."})]}):e.jsx("p",{className:d.note,children:l?`Selected campaign ${l} is no longer present in this diagram. No substitute has been selected. Choose another campaign to inspect its evidence.`:"Select a campaign to inspect its recorded evidence."})})]}),e.jsx("p",{className:d.legend,children:"Lines show declared dependencies, from earlier to later layers. Layer placement does not change declared priority or establish execution readiness."}),n.edges.length>W?e.jsxs("p",{className:d.note,children:["Showing ",W," of ",n.edges.length," visible dependency lines. Every campaign’s complete relationships remain available in its detail and accessible description."]}):null]}):e.jsx("p",{className:d.empty,children:"No campaign outcomes are available in this observation. Inspect a registered controller with recorded campaigns to see its mission topology."})]})}function ts({data:s}){return e.jsx(ns,{data:s},s.controllerId)}const z=s=>s==null?"Not recorded":String(s),O=s=>[...new Set(s)].sort().join(", ")||"None recorded",K={pending:"Pending",held:"Held",completed:"Completed","in-flight":"Unresolved intent"};function as(s,n){const l={clockWarning:!1,changes:[],changedCampaigns:0};if(!s)return{...l,kind:"baseline",notice:"First accepted observation. Refresh this controller explicitly to compare recorded evidence."};if(s.controllerId!==n.controllerId||s.createdAt!==n.createdAt)return{...l,kind:"incomparable",notice:"Controller identity or registration timestamp changed. Registration continuity is not established; these observations are not compared."};const f=[],r=(a,i,c,h,g)=>{c!==h&&f.push({key:a,label:i,before:c,after:h,...g?{campaignId:g}:{}})},u=[];(s.sourceState!=="healthy"||n.sourceState!=="healthy")&&u.push("One or both observations contain missing or degraded evidence. Absence from an observation does not establish deletion, completion or execution."),n.createdAt===null&&u.push("The registration timestamp is not recorded. Registration continuity is not established."),s.deadlineAt!==n.deadlineAt&&u.push("The recorded deadline changed. This difference does not establish registration continuity or renew execution authority."),r("controller:status","Recorded controller status",s.status,n.status),r("controller:health","Evidence health",s.sourceState,n.sourceState),r("controller:deadline","Recorded deadline",z(s.deadlineAt),z(n.deadlineAt)),r("controller:reasons","Evidence reasons",O(s.reasons),O(n.reasons));for(const[a,i]of[["mode","Admission mode"],["sequence","Admission sequence"],["requestedAt","Admission requested at"],["acknowledgedAt","Admission acknowledged at"]])r(`control:${a}`,i,z(s.control?.[a]),z(n.control?.[a]));const o=new Map(s.outcomes.map(a=>[a.campaignId,a])),y=new Map(n.outcomes.map(a=>[a.campaignId,a])),p=[...y.keys(),...[...o.keys()].filter(a=>!y.has(a))];for(const a of p){const i=o.get(a),c=y.get(a);if(!i||!c){r(`campaign:${a}:presence`,"Campaign presence",i?"Present":"Not observed",c?"Present":"Not observed",a);continue}r(`campaign:${a}:state`,"Recorded state",K[i.state],K[c.state],a),r(`campaign:${a}:reason`,"Recorded reason",i.reasonCode,c.reasonCode,a),r(`campaign:${a}:attempted`,"Campaign-call intent",i.attempted?"Recorded":"Not recorded",c.attempted?"Recorded":"Not recorded",a)}if(r("controller:campaign-order","Recorded campaign order",s.outcomes.map(a=>a.campaignId).join(", ")||"None recorded",n.outcomes.map(a=>a.campaignId).join(", ")||"None recorded"),r("controller:topology","Dependency evidence",s.topology?"Available":"Unavailable",n.topology?"Available":"Unavailable"),s.topology&&n.topology){const a=new Map(s.topology.map(i=>[i.campaignId,i]));for(const i of n.topology){const c=a.get(i.campaignId);c&&(r(`campaign:${i.campaignId}:dependencies`,"Direct dependencies",O(c.dependsOn),O(i.dependsOn),i.campaignId),r(`campaign:${i.campaignId}:prerequisites`,"Effective prerequisites",O(c.prerequisites),O(i.prerequisites),i.campaignId))}}return{kind:"compared",notice:u.join(" ")||null,clockWarning:Date.parse(n.observedAt)<=Date.parse(s.observedAt),changes:f,changedCampaigns:new Set(f.flatMap(a=>a.campaignId?[a.campaignId]:[])).size}}const os="_changes_qcw1f_1",is="_header_qcw1f_2",rs="_labels_qcw1f_4",cs="_historical_qcw1f_6",ls="_description_qcw1f_7",ds="_note_qcw1f_7",hs="_footnote_qcw1f_7",ps="_times_qcw1f_9",ms="_warning_qcw1f_12",gs="_baseline_qcw1f_13",us="_counts_qcw1f_14",fs="_disclosure_qcw1f_18",xs="_rows_qcw1f_22",bs="_row_qcw1f_22",js="_field_qcw1f_24",_s="_values_qcw1f_27",j={changes:os,header:is,labels:rs,historical:cs,description:ls,note:ds,footnote:hs,times:ps,warning:ms,baseline:gs,counts:us,disclosure:fs,rows:xs,row:bs,field:js,values:_s};function ys({previous:s,current:n,historical:l,loading:f}){const r=_.useMemo(()=>as(s,n),[s,n]);return e.jsxs("section",{className:j.changes,"aria-label":"Changes between observations",children:[e.jsxs("header",{className:j.header,children:[e.jsx("h3",{children:"Changes between observations"}),e.jsxs("div",{className:j.labels,children:[f?e.jsx("span",{children:"Refresh in progress"}):null,l?e.jsx("span",{className:j.historical,children:"Historical observations"}):null]})]}),e.jsx("p",{className:j.description,children:"Compare the last two accepted responses in this session. This is not an event log or a live activity view."}),e.jsxs("dl",{className:j.times,"aria-label":"Compared observation times",children:[e.jsxs("div",{children:[e.jsx("dt",{children:"Previous observation"}),e.jsx("dd",{children:s?e.jsx("time",{dateTime:s.observedAt,children:s.observedAt}):"Not yet observed"})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Displayed observation"}),e.jsx("dd",{children:e.jsx("time",{dateTime:n.observedAt,children:n.observedAt})})]})]}),f?e.jsx("p",{className:j.note,children:"The accepted observations below remain unchanged while the refresh is pending."}):null,l?e.jsx("p",{className:j.warning,children:"The latest refresh failed. This comparison uses retained observations, not current evidence."}):null,r.notice?e.jsx("p",{className:r.kind==="baseline"?j.note:j.warning,children:r.notice}):null,r.clockWarning?e.jsx("p",{className:j.warning,children:"Observation timestamps are equal or move backward. Before and after follow response order, not a verified event timeline."}):null,r.kind==="baseline"?e.jsx("p",{className:j.baseline,children:"Refresh this controller to compare two observations."}):r.kind==="incomparable"?e.jsx("p",{className:j.baseline,children:"These observations cannot be compared as one controller registration."}):r.changes.length===0?e.jsx("p",{className:j.baseline,children:"No compared evidence fields changed. Observation times are excluded; this does not prove that no work occurred."}):e.jsxs(e.Fragment,{children:[e.jsxs("dl",{className:j.counts,"aria-label":"Observation change counts",children:[e.jsxs("div",{children:[e.jsx("dt",{children:"Changed fields"}),e.jsx("dd",{children:r.changes.length})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Campaigns with displayed changes"}),e.jsx("dd",{children:r.changedCampaigns})]})]}),e.jsxs("details",{className:j.disclosure,children:[e.jsxs("summary",{children:["Review ",r.changes.length," changed field",r.changes.length===1?"":"s"]}),e.jsx("ul",{className:j.rows,"aria-label":"Changed observation fields",children:r.changes.map(u=>e.jsxs("li",{className:j.row,children:[e.jsxs("div",{className:j.field,children:[e.jsx("h4",{children:u.label}),u.campaignId?e.jsx("span",{children:u.campaignId}):null]}),e.jsxs("dl",{className:j.values,children:[e.jsxs("div",{children:[e.jsx("dt",{children:"Before"}),e.jsx("dd",{children:u.before})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"After"}),e.jsx("dd",{children:u.after})]})]})]},u.key))})]})]}),e.jsx("p",{className:j.footnote,children:"Differences describe returned evidence only. They do not establish worker execution, delivery verification or a production deployment."})]})}const vs="_inspector_123iu_1",Ns="_header_123iu_2",ws="_note_123iu_4",Is="_empty_123iu_4",Cs="_field_123iu_4",qs="_control_123iu_4",ks="_readOnly_123iu_5",As="_form_123iu_6",Ss="_identity_123iu_15",$s="_warning_123iu_18",Rs="_facts_123iu_19",Os="_sequence_123iu_24",Ts="_tableWrap_123iu_27",Es="_reasons_123iu_32",x={inspector:vs,header:Ns,note:ws,empty:Is,field:Cs,control:qs,readOnly:ks,form:As,identity:Ss,warning:$s,facts:Rs,sequence:Os,tableWrap:Ts,reasons:Es};function T({value:s}){return s?e.jsx("time",{dateTime:s,children:s.replace("T"," ").replace("Z"," UTC")}):e.jsx(e.Fragment,{children:"Not recorded"})}const Ms={"campaign-execution":"Campaign execution","campaign-verification":"Campaign verification","delivery-execution":"Local branch delivery","delivery-verification":"Delivery confirmation","settlement-publication":"Controller acknowledgement"};function Ds(){const[s,n]=_.useState(""),[l,f]=_.useState(null),[r,u]=_.useState({current:null,previous:null}),o=r.current,[y,p]=_.useState(!1),[a,i]=_.useState(null),[c,h]=_.useState(!1),g=_.useRef({sequence:0,abort:null});_.useEffect(()=>()=>{g.current.sequence+=1,g.current.abort?.abort()},[]);async function N(m){if(!S(m)){h(!0);return}h(!1),g.current.abort?.abort();const v=++g.current.sequence,U=new AbortController;g.current.abort=U,f(m),u($=>$.current?.controllerId===m?$:{current:null,previous:null}),p(!0),i(null);try{const $=await ue(m,U.signal);v===g.current.sequence&&u(F=>({current:$,previous:F.current?.controllerId===m?F.current:null}))}catch{v===g.current.sequence&&i("Observation failed or returned invalid evidence. Check your connection and refresh this controller.")}finally{v===g.current.sequence&&p(!1)}}return e.jsxs("section",{className:x.inspector,"aria-labelledby":"controller-inspector-title",children:[e.jsxs("header",{className:x.header,children:[e.jsxs("div",{children:[e.jsx("h2",{id:"controller-inspector-title",children:"Controller inspector"}),e.jsx("p",{children:"Read the recorded progress of a named portfolio controller."})]}),e.jsx("span",{className:x.readOnly,children:"Read-only"})]}),e.jsxs("form",{className:x.form,onSubmit:m=>{m.preventDefault(),N(s)},children:[e.jsxs("div",{className:x.field,children:[e.jsx("label",{htmlFor:"controller-id",children:"Controller ID"}),e.jsx("input",{id:"controller-id",value:s,onChange:m=>{n(m.target.value),h(!1)},maxLength:64,autoComplete:"off",autoCapitalize:"none",spellCheck:!1,"aria-invalid":c,"aria-describedby":"controller-id-help"}),e.jsx("p",{id:"controller-id-help",children:"Use the ID from your controller manifest: lowercase letters, numbers, hyphens or underscores."})]}),e.jsx("button",{type:"submit",children:"Inspect controller"}),l?e.jsx("button",{type:"button",disabled:y,onClick:()=>{N(l)},children:"Refresh controller"}):null]}),c?e.jsx("p",{role:"alert",className:x.warning,children:"Enter 1–64 characters, starting with a lowercase letter or number."}):null,l?e.jsxs("div",{"aria-busy":y,children:[e.jsxs("h3",{className:x.identity,children:["Evidence for ",e.jsx("code",{children:l})]}),s!==l?e.jsxs("p",{className:x.note,children:["The form has changed. Evidence below still belongs to ",l,"; submit to inspect another ID."]}):null,e.jsx("p",{role:"status",className:x.note,children:y?`Reading ${l}…${o?" Previous observation remains below.":""}`:a&&o?"Historical observation — refresh failed. This is not current evidence.":o?"Recorded snapshot. Refresh explicitly to check for changes; this is not a live process view.":"No verified observation is available."}),a?e.jsx("p",{role:"alert",className:x.warning,children:a}):null,o?e.jsxs(e.Fragment,{children:[e.jsxs("dl",{className:x.facts,children:[e.jsxs("div",{children:[e.jsx("dt",{children:"Evidence health"}),e.jsx("dd",{children:o.sourceState})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Recorded status"}),e.jsx("dd",{children:o.status})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Observed at"}),e.jsx("dd",{children:e.jsx(T,{value:o.observedAt})})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Created at"}),e.jsx("dd",{children:e.jsx(T,{value:o.createdAt})})]}),e.jsxs("div",{children:[e.jsx("dt",{children:"Original deadline"}),e.jsx("dd",{children:e.jsx(T,{value:o.deadlineAt})})]})]}),e.jsx(ys,{previous:r.previous,current:o,historical:!!a,loading:y}),o.sourceState==="missing"?e.jsx("p",{className:x.warning,children:"No controller registration was found in this store. Check the ID and selected Universe store."}):null,o.sourceState==="degraded"?e.jsx("p",{className:x.warning,children:"Evidence could not be fully verified. This observation does not repair locks, reconcile work or prove a controller is running."}):null,o.control?e.jsxs("section",{className:x.control,"aria-label":"Recorded admission control",children:[e.jsx("h4",{children:o.control.mode==="open"?"Admission reopened":o.control.acknowledgedAt?"Drain acknowledged":"Drain awaiting acknowledgement"}),e.jsxs("ol",{className:x.sequence,children:[e.jsxs("li",{children:[e.jsx("strong",{children:o.control.mode==="open"?"Resume recorded":"Drain recorded"}),e.jsxs("span",{children:["Sequence ",o.control.sequence]}),e.jsx(T,{value:o.control.requestedAt})]}),e.jsxs("li",{children:[e.jsx("strong",{children:o.control.mode==="open"?"Resume did not start work":o.control.acknowledgedAt?"Acknowledgement recorded":"Acknowledgement not recorded"}),o.control.mode==="drain"?e.jsx(T,{value:o.control.acknowledgedAt}):e.jsx("span",{children:"Resume does not start work."})]})]}),e.jsx("p",{children:o.control.mode==="drain"?"Drain blocks new dispatch intents; already-admitted work can continue. An unresolved intent prevents acknowledgement; absence of a visible worker proves neither completion nor failure.":"Execution requires a separate run invocation. Admission state does not renew the original deadline or establish a running controller."})]}):e.jsx("p",{className:x.note,children:"No admission-control record. This does not establish process liveness."}),e.jsx(ts,{data:o},o.controllerId),o.outcomes.length?e.jsx("div",{className:x.tableWrap,role:"region","aria-label":"Recorded campaign outcomes",tabIndex:0,children:e.jsxs("table",{children:[e.jsx("caption",{children:"Recorded campaign outcomes"}),e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{scope:"col",children:"Campaign"}),e.jsx("th",{scope:"col",children:"State"}),e.jsx("th",{scope:"col",children:"Campaign attempted"}),e.jsx("th",{scope:"col",children:"Reason"})]})}),e.jsx("tbody",{children:o.outcomes.map(m=>e.jsxs("tr",{children:[e.jsx("th",{scope:"row",children:m.campaignId}),e.jsx("td",{children:m.state}),e.jsx("td",{children:m.attempted?"Yes":"No"}),e.jsx("td",{children:m.reasonCode})]},m.campaignId))})]})}):e.jsx("p",{className:x.note,children:"No campaign outcomes available in this observation."}),e.jsx("p",{className:x.note,children:"“In-flight” means an unresolved durable intent, not proof of a live worker. Campaign attempted records a call intent, not proof of worker execution or successful evaluation. A dispatch-not-started outcome remains held and does not authorize a retry."}),o.diagnostics?.length?e.jsxs("section",{"aria-label":"Recorded handoff diagnostics",children:[e.jsx("h4",{children:"Recorded handoff diagnostics"}),e.jsx("p",{className:x.note,children:"These are historical failure records, not live errors. Check the campaign outcome above for its current recorded state. A diagnostic never authorizes retrying a worker or publishing a branch."}),e.jsx("div",{className:x.tableWrap,role:"region","aria-label":"Handoff diagnostic details",tabIndex:0,children:e.jsxs("table",{children:[e.jsx("caption",{children:"Where the handoff stopped"}),e.jsx("thead",{children:e.jsxs("tr",{children:[e.jsx("th",{scope:"col",children:"Campaign"}),e.jsx("th",{scope:"col",children:"Stage"}),e.jsx("th",{scope:"col",children:"Failure code"}),e.jsx("th",{scope:"col",children:"Recorded at"})]})}),e.jsx("tbody",{children:o.diagnostics.map(m=>e.jsxs("tr",{children:[e.jsx("th",{scope:"row",children:m.campaignId}),e.jsx("td",{children:Ms[m.phase]}),e.jsx("td",{children:m.code}),e.jsx("td",{children:e.jsx(T,{value:m.at})})]},m.campaignId))})]})}),e.jsx("p",{className:x.note,children:"Inspect the pinned campaign and delivery receipts before recovery. Completed outcomes can retain an earlier diagnostic; raw error text and private intent digests are omitted here."})]}):null,o.reasons.length?e.jsxs("details",{className:x.reasons,children:[e.jsxs("summary",{children:["Evidence reasons (",o.reasons.length,")"]}),e.jsx("ul",{children:o.reasons.map((m,v)=>e.jsx("li",{children:m},`${m}-${v}`))})]}):null]}):null]}):e.jsx("p",{className:x.empty,children:"Enter an ID to inspect this store. Nothing is queried until you submit."})]})}const Ls="_shell_8ebyv_1",Us="_scopeBar_8ebyv_2",Fs="_scope_8ebyv_2",zs="_brand_8ebyv_4",Bs="_brandMark_8ebyv_6",Ps="_workspace_8ebyv_7",Ws="_badge_8ebyv_8",Zs="_store_8ebyv_9",Gs="_root_8ebyv_12",Hs="_actions_8ebyv_13",Qs="_notice_8ebyv_14",Vs="_main_8ebyv_16",Ys="_explanation_8ebyv_17",Js="_checking_8ebyv_20",I={shell:Ls,scopeBar:Us,scope:Fs,brand:zs,brandMark:Bs,workspace:Ps,badge:Ws,store:Zs,root:Gs,actions:Hs,notice:Qs,main:Vs,explanation:Ys,checking:Js},L={key:"universe-console-scope",async fetch(){const s=await X("/api/universe/console");if(s?.schemaVersion!==1||s.mode!=="universe"||s.readOnly!==!0||typeof s.root!="string"||!/^(?:\/|[a-zA-Z]:[\\/]|\\\\)/.test(s.root)||[...s.root].some(n=>n.charCodeAt(0)<32||n.charCodeAt(0)>=127&&n.charCodeAt(0)<=159))throw new Error("The server did not establish an explicit read-only Universe scope.");return s}};function Ks(){const s=re(L),n=ce(L),l=le();return e.jsxs(e.Fragment,{children:[e.jsx(de,{}),e.jsxs("div",{className:I.shell,children:[e.jsxs("header",{className:I.scopeBar,children:[e.jsxs("div",{className:I.scope,children:[e.jsxs("div",{className:I.brand,children:[e.jsx("svg",{className:I.brandMark,viewBox:"0 0 32 32","aria-hidden":"true",focusable:"false",children:e.jsx("path",{d:"m5 11 11-6 11 6-11 6Z M5 16l11 6 11-6 M5 21l11 6 11-6"})}),e.jsx("strong",{children:"Ashlrverse"}),e.jsx("span",{className:I.workspace,children:"Experiments"})]}),e.jsx("span",{className:I.badge,children:"Read-only observation"}),s.data?e.jsxs("details",{className:I.store,children:[e.jsx("summary",{children:"Universe store"}),e.jsx("code",{"aria-label":"Universe store",className:I.root,children:s.data.root})]}):null]}),e.jsxs("div",{className:I.actions,children:[e.jsxs("button",{type:"button",onClick:l.cycle,children:["Theme: ",l.theme]}),e.jsx("button",{type:"button",onClick:()=>{he()},children:"Disconnect"})]})]}),e.jsx("main",{id:"main-content",tabIndex:-1,className:I.main,children:s.status==="error"?e.jsxs("section",{role:"alert",className:I.notice,children:[e.jsx("h1",{children:"Console scope unavailable"}),e.jsxs("p",{children:[s.error?.message," No project data is shown until the scope can be checked."]}),e.jsx("button",{type:"button",onClick:n,children:"Retry scope check"})]}):s.data?e.jsxs(pe.Provider,{value:s.data.root,children:[e.jsx("p",{className:I.explanation,children:"This console observes the selected Universe store. Run campaigns from your terminal; opening this page does not start work."}),e.jsx(Ds,{},s.data.root),e.jsx(me,{})]}):e.jsx("p",{role:"status",children:"Checking the selected Universe store…"})})]})]})}function rn(){const s=ne();return _.useEffect(()=>{if(s!=="checking")return;let n=!1;return te(L.key,L.fetch).then(()=>{n||ae(oe(L.key).status==="success")}),()=>{n=!0}},[s]),s==="checking"?e.jsx("p",{className:I.checking,role:"status",children:"Checking for an existing console session…"}):s==="unauthenticated"?e.jsx(ie,{heading:"Connect to Ashlrverse",command:"ashlr universe console --root /absolute/universe-store"}):e.jsx(Ks,{})}export{rn as UniverseConsoleApp};
|
|
2
|
-
//# sourceMappingURL=UniverseConsoleApp-DjTpQUrA.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"UniverseConsoleApp-DjTpQUrA.js","sources":["../../../../../../src/core/universe/portfolio-controller-types.ts","../../../../../../src/web-ui/data/controller-status.ts","../../../../../../src/web-ui/data/controller-navigation.ts","../../../../../../src/web-ui/app/UniverseControllerTopology.tsx","../../../../../../src/web-ui/data/controller-observation-delta.ts","../../../../../../src/web-ui/app/UniverseControllerChanges.tsx","../../../../../../src/web-ui/app/UniverseControllerInspector.tsx","../../../../../../src/web-ui/app/UniverseConsoleApp.tsx"],"sourcesContent":["import type { UniverseCampaignDeliveryPlan } from './campaign-delivery.js';\nimport type { UniversePortfolioDefinition } from './portfolio-types.js';\n\n/** Closed historical diagnoses; none of these codes grants settlement or retry authority. */\nexport const PORTFOLIO_CONTROLLER_DIAGNOSTIC_CODES = Object.freeze({\n 'campaign-execution': Object.freeze(['campaign-call-threw'] as const),\n 'campaign-verification': Object.freeze(['campaign-evidence-changed'] as const),\n 'delivery-execution': Object.freeze(['delivery-call-threw'] as const),\n 'delivery-verification': Object.freeze(['delivery-evidence-changed', 'delivery-receipt-unverified'] as const),\n 'settlement-publication': Object.freeze(['settlement-write-failed'] as const),\n});\nexport type UniversePortfolioControllerDiagnosticPhase = keyof typeof PORTFOLIO_CONTROLLER_DIAGNOSTIC_CODES;\nexport type UniversePortfolioControllerDiagnosticCode = typeof PORTFOLIO_CONTROLLER_DIAGNOSTIC_CODES[UniversePortfolioControllerDiagnosticPhase][number];\nexport interface UniversePortfolioControllerDiagnostic {\n campaignId: string;\n intentDigest: string;\n phase: UniversePortfolioControllerDiagnosticPhase;\n code: UniversePortfolioControllerDiagnosticCode;\n at: string;\n}\n\nexport interface UniversePortfolioControllerOutcome {\n campaignId: string;\n /** In-flight means an unsettled durable intent, never proof of a live process. */\n state: 'pending' | 'in-flight' | 'completed' | 'held';\n /** Durable campaign-call intent, not proof or a count of provider/model requests. */\n attempted: boolean;\n reasonCode: string;\n campaignDigest: string | null;\n /** Digest of the verified local delivery receipt, not a deployment identity. */\n deliveryDigest: string | null;\n}\n\nexport interface UniversePortfolioControllerReport {\n schemaVersion: 1;\n controllerId: string;\n definitionDigest: string | null;\n sourceState: 'healthy' | 'missing' | 'degraded';\n status: 'completed' | 'incomplete' | 'cancelled' | 'timed-out' | 'unavailable' | 'draining' | 'drained';\n createdAt: string | null;\n deadlineAt: string | null;\n observedAt: string;\n outcomes: UniversePortfolioControllerOutcome[];\n /** Recorded enrollment ordering only; prerequisites include planned ancestor delivery gates. */\n topology?: Array<{ campaignId: string; dependsOn: string[]; prerequisites: string[] }>;\n reasons: string[];\n control?: UniversePortfolioControllerControl;\n /** Historical call-boundary evidence, independent of current outcome or settlement. */\n diagnostics?: UniversePortfolioControllerDiagnostic[];\n}\n\nexport interface UniversePortfolioControllerControl {\n mode: 'open' | 'drain';\n sequence: number;\n requestedAt: string;\n acknowledgedAt: string | null;\n}\n\n/** A durable owner request, not evidence that workers have exited. */\nexport interface UniversePortfolioControllerControlReceipt {\n schemaVersion: 1;\n controllerId: string;\n action: 'drain' | 'resume';\n changed: boolean;\n sequence: number;\n requestedAt: string;\n}\n\n/** Internal fixed enrollment; source refresh cannot renew these admission pins. */\nexport interface PortfolioControllerPin {\n campaignId: string;\n universeId: string;\n definitionDigest: string;\n manifestDigest: string;\n comparatorDigest: string;\n campaignDigest: string;\n recordsDigest: string;\n initialState: 'pending' | 'completed' | 'held';\n dispatch: 'campaign' | 'delivery' | 'none';\n reasonCode: string;\n}\n\n/** Association with one already-persisted signed graph intent, not an effect permit. */\nexport interface PortfolioControllerGraphDispatch {\n schemaVersion: 1;\n graphRootDigest: string;\n graphId: string;\n definitionDigest: string;\n nodeId: string;\n intentDigest: string;\n}\n\nexport interface PortfolioControllerEnrollment {\n definition: UniversePortfolioDefinition;\n deliveryPlan: UniverseCampaignDeliveryPlan | null;\n definitionDigest: string;\n pins: PortfolioControllerPin[];\n deadlineAt: string;\n /** Absent on legacy/direct controllers; never backfilled after creation. */\n graphDispatch?: PortfolioControllerGraphDispatch;\n}\n\nexport type PortfolioControllerEvent = { id: string; sequence: number; at: string } & (\n { kind: 'created'; enrollment: PortfolioControllerEnrollment } |\n { kind: 'observed' } |\n { kind: 'control'; action: 'drain' } |\n { kind: 'control'; action: 'resume'; drainSequence: number } |\n { kind: 'drained'; drainSequence: number } |\n { kind: 'intent'; campaignId: string; /** Absent for legacy and delivery-only intents. */ dispatchId?: string } |\n ({ kind: 'dispatch-diagnostic' } & Omit<UniversePortfolioControllerDiagnostic, 'at'>) |\n { kind: 'settled'; outcome: UniversePortfolioControllerOutcome; recordsDigest: string }\n);\n","import type { UniversePortfolioControllerView } from '../../core/web/universe-console-types.js';\nimport { PORTFOLIO_CONTROLLER_DIAGNOSTIC_CODES } from '../../core/universe/portfolio-controller-types.js';\nimport { apiGet } from './client.js';\n\nexport function isControllerId(value: unknown): value is string {\n return typeof value === 'string' && /^[a-z0-9][a-z0-9_-]{0,63}$/.test(value);\n}\n\nfunction record(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction timestamp(value: unknown): value is string {\n return typeof value === 'string' && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d{3})?Z$/.test(value) && Number.isFinite(Date.parse(value)) &&\n new Date(value).toISOString() === (value.length === 20 ? value.replace('Z', '.000Z') : value);\n}\nfunction code(value: unknown): value is string {\n return typeof value === 'string' && /^[a-z0-9][a-z0-9_:-]{0,191}$/.test(value);\n}\n\n/** Validate identity and bounded public fields before rendering any evidence. */\nexport function validateControllerStatus(value: unknown, controllerId: string): UniversePortfolioControllerView {\n const invalid = () => new Error('Controller evidence could not be validated.');\n if (!isControllerId(controllerId) || !record(value) || value.schemaVersion !== 1 || value.controllerId !== controllerId ||\n typeof value.sourceState !== 'string' || !['healthy', 'missing', 'degraded'].includes(value.sourceState) ||\n typeof value.status !== 'string' || !['completed', 'incomplete', 'cancelled', 'timed-out', 'unavailable', 'draining', 'drained'].includes(value.status) ||\n !(value.createdAt === null || timestamp(value.createdAt)) || !(value.deadlineAt === null || timestamp(value.deadlineAt)) ||\n !timestamp(value.observedAt) || !Array.isArray(value.reasons) || value.reasons.length > 128 || !value.reasons.every(code) ||\n !Array.isArray(value.outcomes) || value.outcomes.length > 64) throw invalid();\n const seen = new Set<string>();\n const outcomes = value.outcomes.map((row: unknown) => {\n if (!record(row) || typeof row.campaignId !== 'string' || !isControllerId(row.campaignId) || seen.has(row.campaignId) ||\n typeof row.state !== 'string' || !['pending', 'in-flight', 'completed', 'held'].includes(row.state) || typeof row.attempted !== 'boolean' || !code(row.reasonCode)) throw invalid();\n seen.add(row.campaignId);\n return { campaignId: row.campaignId, state: row.state, attempted: row.attempted, reasonCode: row.reasonCode };\n });\n let topology: UniversePortfolioControllerView['topology'];\n if (value.topology !== undefined) {\n if (!Array.isArray(value.topology) || value.topology.length > 64 || value.topology.length !== outcomes.length) throw invalid();\n const topologyIds = new Set<string>();\n topology = value.topology.map((node: unknown) => {\n if (!record(node) || !isControllerId(node.campaignId) || !seen.has(node.campaignId) || topologyIds.has(node.campaignId)) throw invalid();\n topologyIds.add(node.campaignId);\n const references = (input: unknown): string[] => {\n if (!Array.isArray(input) || input.length > 63 || !input.every((id) => isControllerId(id) && seen.has(id) && id !== node.campaignId) ||\n new Set(input).size !== input.length) throw invalid();\n return [...input] as string[];\n };\n const dependsOn = references(node.dependsOn); const prerequisites = references(node.prerequisites);\n if (dependsOn.some((id) => !prerequisites.includes(id))) throw invalid();\n return { campaignId: node.campaignId, dependsOn, prerequisites };\n });\n // Bound traversal and reject cycles in effective gates, not only declared edges.\n // The server's additional gates must also be genuine declared ancestors.\n const byId = new Map(topology.map((node) => [node.campaignId, node]));\n const resolved = new Set<string>();\n while (resolved.size < topology.length) {\n const next = topology.find((node) => !resolved.has(node.campaignId) && node.prerequisites.every((id) => resolved.has(id)));\n if (!next) throw invalid();\n resolved.add(next.campaignId);\n }\n for (const node of topology) {\n const ancestors = new Set<string>(); const pending = [...node.dependsOn];\n while (pending.length) {\n const id = pending.pop()!;\n if (ancestors.has(id)) continue;\n ancestors.add(id); pending.push(...byId.get(id)!.dependsOn);\n }\n if (node.prerequisites.some((id) => !ancestors.has(id))) throw invalid();\n }\n }\n let control: UniversePortfolioControllerView['control'];\n let diagnostics: UniversePortfolioControllerView['diagnostics'];\n if (value.diagnostics !== undefined) {\n if (!Array.isArray(value.diagnostics) || value.diagnostics.length > outcomes.length) throw invalid();\n const diagnosed = new Set<string>();\n diagnostics = value.diagnostics.map((row: unknown) => {\n if (!record(row) || !isControllerId(row.campaignId) || !seen.has(row.campaignId) || diagnosed.has(row.campaignId) ||\n outcomes.find(outcome => outcome.campaignId === row.campaignId)?.state === 'pending' ||\n typeof row.phase !== 'string' || !Object.hasOwn(PORTFOLIO_CONTROLLER_DIAGNOSTIC_CODES, row.phase) ||\n typeof row.code !== 'string' || !timestamp(row.at)) throw invalid();\n const phase = row.phase as keyof typeof PORTFOLIO_CONTROLLER_DIAGNOSTIC_CODES;\n if (!(PORTFOLIO_CONTROLLER_DIAGNOSTIC_CODES[phase] as readonly string[]).includes(row.code)) throw invalid();\n diagnosed.add(row.campaignId);\n return { campaignId: row.campaignId, phase, code: row.code, at: row.at } as NonNullable<typeof diagnostics>[number];\n });\n }\n if (value.control !== undefined) {\n const current = value.control;\n if (!record(current) || typeof current.mode !== 'string' || !['open', 'drain'].includes(current.mode) || !Number.isInteger(current.sequence) ||\n (current.sequence as number) < 1 || (current.sequence as number) > 511 || !timestamp(current.requestedAt) ||\n !(current.acknowledgedAt === null || timestamp(current.acknowledgedAt))) throw invalid();\n control = { mode: current.mode as 'open' | 'drain', sequence: current.sequence as number,\n requestedAt: current.requestedAt, acknowledgedAt: current.acknowledgedAt };\n }\n if (control?.mode === 'open' && control.acknowledgedAt !== null ||\n value.status === 'draining' && (control?.mode !== 'drain' || control.acknowledgedAt !== null) ||\n value.status === 'drained' && (control?.mode !== 'drain' || control.acknowledgedAt === null)) throw invalid();\n // Explicit projection also prevents unexpected private fields entering UI state.\n return { schemaVersion: 1, controllerId, sourceState: value.sourceState, status: value.status,\n createdAt: value.createdAt, deadlineAt: value.deadlineAt, observedAt: value.observedAt,\n reasons: [...value.reasons], outcomes, ...(topology ? { topology } : {}), ...(control ? { control } : {}),\n ...(diagnostics ? { diagnostics } : {}) } as UniversePortfolioControllerView;\n}\n\nexport async function readControllerStatus(controllerId: string, signal?: AbortSignal): Promise<UniversePortfolioControllerView> {\n if (!isControllerId(controllerId)) throw new Error('Enter a valid controller ID.');\n const result = await apiGet<unknown>(`/api/universe/controller-status?controllerId=${encodeURIComponent(controllerId)}`, signal);\n return validateControllerStatus(result, controllerId);\n}\n","import type { UniversePortfolioControllerView } from '../../core/web/universe-console-types.js';\n\ntype Outcome = UniversePortfolioControllerView['outcomes'][number];\nexport type ControllerCampaignStateFilter = 'all' | Outcome['state'];\n\n/** Navigation filters recorded evidence without changing declared execution priority. */\nexport function matchControllerCampaigns(\n outcomes: readonly Outcome[], query: string, filter: ControllerCampaignStateFilter,\n): Outcome[] {\n const needle = query.trim().toLowerCase();\n return outcomes.filter((outcome) => (filter === 'all' || outcome.state === filter) &&\n (outcome.campaignId.toLowerCase().includes(needle) || outcome.reasonCode.toLowerCase().includes(needle)));\n}\n\n/** Spend the visual edge budget on selected context first; this never changes task order. */\nexport function prioritizeControllerEdges<T extends { from: string; to: string }>(\n edges: readonly T[], selectedId: string | null, limit: number,\n): T[] {\n const cap = Number.isFinite(limit) ? Math.max(0, Math.floor(limit)) : 0;\n if (selectedId === null) return edges.slice(0, cap);\n const incident: T[] = [];\n const other: T[] = [];\n for (const edge of edges) {\n (edge.from === selectedId || edge.to === selectedId ? incident : other).push(edge);\n }\n return [...incident, ...other].slice(0, cap);\n}\n","import { useId, useMemo, useRef, useState } from 'react';\nimport type { UniversePortfolioControllerView } from '../../core/web/universe-console-types.js';\nimport { matchControllerCampaigns, prioritizeControllerEdges, type ControllerCampaignStateFilter } from '../data/controller-navigation.js';\nimport styles from './UniverseControllerTopology.module.css';\n\nconst NODE_LIMIT = 64;\nconst EDGE_LIMIT = 256;\nconst RESULT_PAGE_SIZE = 8;\ntype Outcome = UniversePortfolioControllerView['outcomes'][number];\nconst STATE_LABELS: Record<Outcome['state'], string> = {\n pending: 'Pending', 'in-flight': 'Unresolved intent', completed: 'Completed', held: 'Held',\n};\nconst STATE_MEANINGS: Record<Outcome['state'], string> = {\n pending: 'No settled outcome is recorded. Pending does not mean ready to run.',\n 'in-flight': 'A durable dispatch intent remains unresolved. This is not proof of a live worker.',\n completed: 'The controller recorded completion, including any required local delivery. This is not a production deployment claim.',\n held: 'Work remains held for the recorded reason. This view does not retry or release it.',\n};\n\n/** Layout follows declared dependencies, never a guessed worker schedule or execution priority. */\nfunction layoutCampaigns(data: UniversePortfolioControllerView) {\n const nodes = data.outcomes.slice(0, NODE_LIMIT);\n const topology = new Map(data.topology?.map((node) => [node.campaignId, node]));\n const visible = new Set(nodes.map((node) => node.campaignId));\n const levels = new Map<string, number>();\n if (data.topology) {\n for (let pass = 0; pass < nodes.length; pass++) {\n for (const node of nodes) {\n const links = topology.get(node.campaignId);\n if (levels.has(node.campaignId) || !links || links.dependsOn.some((id) => !levels.has(id))) continue;\n levels.set(node.campaignId, links.dependsOn.length ? Math.max(...links.dependsOn.map((id) => levels.get(id)!)) + 1 : 0);\n }\n }\n }\n const knownLevels = [...new Set(levels.values())].sort((a, b) => a - b);\n const columns = knownLevels.map((level) => ({ label: `Dependency layer ${level + 1}`, nodes: nodes.filter((node) => levels.get(node.campaignId) === level) }));\n const unplaced = nodes.filter((node) => !levels.has(node.campaignId));\n if (unplaced.length) columns.push({ label: data.topology ? 'Layer unavailable' : 'Recorded campaigns', nodes: unplaced });\n const positions = new Map<string, { x: number; y: number }>();\n columns.forEach((column, index) => column.nodes.forEach((node, row) => positions.set(node.campaignId, { x: 24 + index * 244, y: 56 + row * 108 })));\n const edges = nodes.flatMap((node) => (topology.get(node.campaignId)?.dependsOn ?? []).filter((id) => visible.has(id)).map((from) => ({ from, to: node.campaignId })));\n return { nodes, topology, columns, positions, edges, width: Math.max(256, columns.length * 244 + 8), height: 64 + Math.max(1, ...columns.map((column) => column.nodes.length)) * 108 };\n}\n\nfunction ControllerTopology({ data }: { data: UniversePortfolioControllerView }) {\n const graph = useMemo(() => layoutCampaigns(data), [data]);\n const [selectedId, setSelectedId] = useState(graph.nodes[0]?.campaignId ?? null);\n const [query, setQuery] = useState('');\n const [stateFilter, setStateFilter] = useState<ControllerCampaignStateFilter>('all');\n const [resultPage, setResultPage] = useState(0);\n const boardRef = useRef<HTMLDivElement>(null);\n const nodeRefs = useRef(new Map<string, HTMLButtonElement>());\n const selected = graph.nodes.find((node) => node.campaignId === selectedId);\n const matching = useMemo(() => matchControllerCampaigns(graph.nodes, query, stateFilter), [graph.nodes, query, stateFilter]);\n const filtering = query.trim().length > 0 || stateFilter !== 'all';\n const pageCount = Math.max(1, Math.ceil(matching.length / RESULT_PAGE_SIZE));\n const page = Math.min(resultPage, pageCount - 1);\n const visibleResults = matching.slice(page * RESULT_PAGE_SIZE, (page + 1) * RESULT_PAGE_SIZE);\n const selectedExcluded = selected && filtering && !matching.some((node) => node.campaignId === selected.campaignId);\n const visibleEdges = useMemo(() => prioritizeControllerEdges(graph.edges, selected?.campaignId ?? null, EDGE_LIMIT), [graph.edges, selected?.campaignId]);\n const prefix = useId();\n const detailId = `${prefix}-detail`;\n const links = selected ? graph.topology.get(selected.campaignId) : undefined;\n const inherited = links?.prerequisites.filter((id) => !links.dependsOn.includes(id)) ?? [];\n const outcomes = new Map(data.outcomes.map((node) => [node.campaignId, node]));\n const count = (state: Outcome['state']) => data.outcomes.filter((node) => node.state === state).length;\n function revealCampaign(id: string, focus = false) {\n const board = boardRef.current; const position = graph.positions.get(id);\n if (!board || !position) return;\n // Only the diagram viewport moves; scrollIntoView would also move the page.\n const left = Math.max(0, position.x + 96 - board.clientWidth / 2);\n const top = Math.max(0, position.y + 40 - board.clientHeight / 2);\n if (typeof board.scrollTo === 'function') board.scrollTo({ left, top, behavior: 'auto' });\n else { board.scrollLeft = left; board.scrollTop = top; }\n if (focus) nodeRefs.current.get(id)?.focus({ preventScroll: true });\n }\n function selectCampaign(id: string) { setSelectedId(id); revealCampaign(id); }\n function relations(ids: string[], empty: string) {\n return ids.length ? <ul className={styles.relationships}>{ids.map((id) => <li key={id}>\n {graph.positions.has(id) ? <button type=\"button\" onClick={() => selectCampaign(id)}>{id}</button> : <span>{id}</span>}\n <span>{outcomes.has(id) ? STATE_LABELS[outcomes.get(id)!.state] : 'Outcome unavailable'}</span>\n </li>)}</ul> : <p className={styles.note}>{empty}</p>;\n }\n return <section className={styles.topology} aria-label=\"Controller mission topology\">\n <header className={styles.header}><div><h3>Mission topology</h3><p>Follow the declared work graph. Select a campaign to inspect its recorded state and prerequisites.</p></div><span className={styles.snapshot}>Recorded snapshot</span></header>\n <dl className={styles.counts} aria-label=\"Recorded campaign counts\">\n <div><dt>Campaigns</dt><dd>{data.outcomes.length}</dd></div>\n {(['completed', 'in-flight', 'held', 'pending'] as const).map((state) => <div key={state} data-state={state}><dt>{STATE_LABELS[state]}</dt><dd>{count(state)}</dd></div>)}\n </dl>\n {!data.topology ? <p className={styles.notice}>Dependency information is unavailable in this observation. Campaign placement does not imply independence or readiness.</p> : null}\n {data.outcomes.length > NODE_LIMIT ? <p className={styles.notice}>Showing the first {NODE_LIMIT} of {data.outcomes.length} campaigns. Counts include all recorded outcomes; relationships outside this diagram remain in the selected campaign detail.</p> : null}\n {graph.nodes.length ? <>\n <section className={styles.finder} aria-label=\"Campaign navigator\">\n <div className={styles.finderControls}>\n <label className={styles.searchLabel} htmlFor={`${prefix}-search`}>Search campaigns\n <input id={`${prefix}-search`} type=\"search\" value={query} maxLength={192} placeholder=\"Campaign ID or recorded reason\" aria-describedby={`${prefix}-finder-hint`}\n onChange={(event) => { setQuery(event.target.value); setResultPage(0); }} />\n </label>\n <label htmlFor={`${prefix}-state`}>Recorded state\n <select id={`${prefix}-state`} value={stateFilter} onChange={(event) => { setStateFilter(event.target.value as ControllerCampaignStateFilter); setResultPage(0); }}>\n <option value=\"all\">All recorded states</option>\n {(['pending', 'in-flight', 'completed', 'held'] as const).map((state) => <option key={state} value={state}>{STATE_LABELS[state]}</option>)}\n </select>\n </label>\n <button type=\"button\" className={styles.utilityButton} disabled={!selected} onClick={() => { if (selected) revealCampaign(selected.campaignId, true); }}>Locate selected</button>\n {filtering ? <button type=\"button\" className={styles.utilityButton} onClick={() => { setQuery(''); setStateFilter('all'); setResultPage(0); }}>Reset filters</button> : null}\n </div>\n <div className={styles.finderMeta}><p id={`${prefix}-finder-hint`}>Search covers the {graph.nodes.length} diagram campaigns. Filters narrow this index, not the graph or its dependency layers.</p>\n <span aria-live=\"polite\" aria-atomic=\"true\">{filtering ? `${matching.length} matching campaign${matching.length === 1 ? '' : 's'}` : `${graph.nodes.length} campaigns in diagram`}</span></div>\n {filtering ? <>\n {matching.length ? <ul className={styles.results} aria-label=\"Matching campaigns\">{visibleResults.map((node) => <li key={node.campaignId}>\n <button type=\"button\" className={styles.result} aria-label={`Select campaign ${node.campaignId}`} aria-describedby={`${prefix}-result-state-${node.campaignId} ${prefix}-result-reason-${node.campaignId}`} aria-pressed={selected?.campaignId === node.campaignId} aria-controls={detailId} onClick={() => selectCampaign(node.campaignId)}>\n <span className={styles.resultName}>{node.campaignId}</span><span id={`${prefix}-result-state-${node.campaignId}`} className={styles.resultState} data-state={node.state}>{STATE_LABELS[node.state]}</span><span id={`${prefix}-result-reason-${node.campaignId}`} className={styles.resultReason}>{node.reasonCode}</span>\n </button>\n </li>)}</ul> : <p className={styles.noResults}>No diagram campaigns match. Try another campaign ID or recorded reason, or reset filters.</p>}\n {pageCount > 1 ? <nav className={styles.pagination} aria-label=\"Campaign result pages\"><span>Page {page + 1} of {pageCount}</span>\n <button type=\"button\" className={styles.utilityButton} disabled={page === 0} onClick={() => setResultPage(page - 1)}>Previous results</button>\n <button type=\"button\" className={styles.utilityButton} disabled={page + 1 === pageCount} onClick={() => setResultPage(page + 1)}>Next results</button>\n </nav> : null}\n </> : null}\n </section>\n <div className={styles.workspace}>\n <div ref={boardRef} className={styles.board} role=\"region\" aria-label=\"Campaign dependency diagram\" tabIndex={0}>\n <div className={styles.canvas} style={{ width: graph.width, height: graph.height }}>\n <svg width={graph.width} height={graph.height} className={styles.edges} aria-hidden=\"true\">\n {visibleEdges.map((edge) => {\n const from = graph.positions.get(edge.from)!; const to = graph.positions.get(edge.to)!;\n const x = from.x + 192; const end = to.x; const mid = (x + end) / 2;\n return <path key={`${edge.from}-${edge.to}`} className={selected && (edge.from === selected.campaignId || edge.to === selected.campaignId) ? styles.selectedEdge : styles.edge}\n d={`M ${x} ${from.y + 40} C ${mid} ${from.y + 40}, ${mid} ${to.y + 40}, ${end} ${to.y + 40}`} />;\n })}\n </svg>\n {graph.columns.map((column, index) => <span key={column.label} className={styles.column} style={{ left: 24 + index * 244 }}>{column.label}</span>)}\n {graph.nodes.map((node, index) => {\n const position = graph.positions.get(node.campaignId)!;\n const dependencies = graph.topology.get(node.campaignId);\n return <div key={node.campaignId}>\n <button type=\"button\" className={styles.node} data-state={node.state} style={{ left: position.x, top: position.y }}\n ref={(element) => { if (element) nodeRefs.current.set(node.campaignId, element); else nodeRefs.current.delete(node.campaignId); }}\n aria-label={`Inspect campaign ${node.campaignId}: ${STATE_LABELS[node.state]}`} aria-pressed={selected?.campaignId === node.campaignId}\n aria-controls={detailId} aria-describedby={`${prefix}-relations-${index}`} onClick={() => selectCampaign(node.campaignId)}>\n <span className={styles.nodeName}>{node.campaignId}</span><span className={styles.nodeState}>{STATE_LABELS[node.state]}</span>\n </button>\n <span id={`${prefix}-relations-${index}`} className={styles.srOnly}>{dependencies\n ? `Direct dependencies: ${dependencies.dependsOn.join(', ') || 'none declared'}. Additional inherited delivery prerequisites: ${dependencies.prerequisites.filter((id) => !dependencies.dependsOn.includes(id)).join(', ') || 'none recorded'}.`\n : 'Dependency information unavailable.'}</span>\n </div>;\n })}\n </div>\n </div>\n <section id={detailId} className={styles.detail} aria-label=\"Selected campaign detail\">\n {selected ? <><span className={styles.detailState} data-state={selected.state}>{STATE_LABELS[selected.state]}</span><h4>{selected.campaignId}</h4>\n {selectedExcluded ? <p className={styles.selectionNote}>The selected campaign is outside the current filters. Its recorded detail remains available.</p> : null}\n <p>{STATE_MEANINGS[selected.state]}</p>\n <dl className={styles.facts}><div><dt>Recorded reason</dt><dd>{selected.reasonCode}</dd></div><div><dt>Campaign-call intent</dt><dd>{selected.attempted ? 'Recorded' : 'Not recorded'}</dd></div></dl>\n <p className={styles.note}>A call intent is not proof of worker execution, model requests or successful evaluation.</p>\n <h5>Direct dependencies</h5>{links ? relations(links.dependsOn, 'None declared for this campaign.') : <p className={styles.note}>Dependency information unavailable.</p>}\n <h5>Additional inherited delivery prerequisites</h5>{links ? relations(inherited, 'None recorded beyond the direct dependencies.') : <p className={styles.note}>Delivery prerequisite information unavailable.</p>}\n <p className={styles.note}>Inherited prerequisites are ancestor delivery gates, not additional declared dependency edges. A state badge alone does not verify the delivery receipt.</p></>\n : <p className={styles.note}>{selectedId ? `Selected campaign ${selectedId} is no longer present in this diagram. No substitute has been selected. Choose another campaign to inspect its evidence.` : 'Select a campaign to inspect its recorded evidence.'}</p>}\n </section>\n </div>\n <p className={styles.legend}>Lines show declared dependencies, from earlier to later layers. Layer placement does not change declared priority or establish execution readiness.</p>\n {graph.edges.length > EDGE_LIMIT ? <p className={styles.note}>Showing {EDGE_LIMIT} of {graph.edges.length} visible dependency lines. Every campaign’s complete relationships remain available in its detail and accessible description.</p> : null}\n </> : <p className={styles.empty}>No campaign outcomes are available in this observation. Inspect a registered controller with recorded campaigns to see its mission topology.</p>}\n </section>;\n}\n\n/** Controller identity remounts selection; same-controller refreshes retain a still-present campaign. */\nexport function UniverseControllerTopology({ data }: { data: UniversePortfolioControllerView }) {\n return <ControllerTopology key={data.controllerId} data={data} />;\n}\n","import type { UniversePortfolioControllerView } from '../../core/web/universe-console-types.js';\n\ntype View = UniversePortfolioControllerView;\nexport interface ControllerObservationChange {\n key: string;\n label: string;\n before: string;\n after: string;\n campaignId?: string;\n}\nexport interface ControllerObservationDelta {\n kind: 'baseline' | 'incomparable' | 'compared';\n notice: string | null;\n clockWarning: boolean;\n changes: ControllerObservationChange[];\n changedCampaigns: number;\n}\n\nconst recorded = (value: string | number | null | undefined): string => value == null ? 'Not recorded' : String(value);\nconst members = (values: readonly string[]): string => [...new Set(values)].sort().join(', ') || 'None recorded';\nconst stateLabel: Record<View['outcomes'][number]['state'], string> = {\n pending: 'Pending', held: 'Held', completed: 'Completed', 'in-flight': 'Unresolved intent',\n};\n\n/** Compares accepted read evidence, never inferring intervening events, execution or liveness. */\nexport function compareControllerObservations(previous: View | null, current: View): ControllerObservationDelta {\n const empty = { clockWarning: false, changes: [], changedCampaigns: 0 };\n if (!previous) return { ...empty, kind: 'baseline', notice: 'First accepted observation. Refresh this controller explicitly to compare recorded evidence.' };\n if (previous.controllerId !== current.controllerId || previous.createdAt !== current.createdAt) {\n return { ...empty, kind: 'incomparable', notice: 'Controller identity or registration timestamp changed. Registration continuity is not established; these observations are not compared.' };\n }\n\n const changes: ControllerObservationChange[] = [];\n const change = (key: string, label: string, before: string, after: string, campaignId?: string) => {\n if (before !== after) changes.push({ key, label, before, after, ...(campaignId ? { campaignId } : {}) });\n };\n const notices: string[] = [];\n if (previous.sourceState !== 'healthy' || current.sourceState !== 'healthy') {\n notices.push('One or both observations contain missing or degraded evidence. Absence from an observation does not establish deletion, completion or execution.');\n }\n if (current.createdAt === null) notices.push('The registration timestamp is not recorded. Registration continuity is not established.');\n if (previous.deadlineAt !== current.deadlineAt) notices.push('The recorded deadline changed. This difference does not establish registration continuity or renew execution authority.');\n change('controller:status', 'Recorded controller status', previous.status, current.status);\n change('controller:health', 'Evidence health', previous.sourceState, current.sourceState);\n change('controller:deadline', 'Recorded deadline', recorded(previous.deadlineAt), recorded(current.deadlineAt));\n change('controller:reasons', 'Evidence reasons', members(previous.reasons), members(current.reasons));\n for (const [field, label] of [\n ['mode', 'Admission mode'], ['sequence', 'Admission sequence'],\n ['requestedAt', 'Admission requested at'], ['acknowledgedAt', 'Admission acknowledged at'],\n ] as const) change(`control:${field}`, label, recorded(previous.control?.[field]), recorded(current.control?.[field]));\n\n const previousOutcomes = new Map(previous.outcomes.map((outcome) => [outcome.campaignId, outcome]));\n const currentOutcomes = new Map(current.outcomes.map((outcome) => [outcome.campaignId, outcome]));\n // Current declared order first, followed by IDs no longer observed; never pair rows by index.\n const campaignIds = [...currentOutcomes.keys(), ...[...previousOutcomes.keys()].filter((id) => !currentOutcomes.has(id))];\n for (const id of campaignIds) {\n const before = previousOutcomes.get(id); const after = currentOutcomes.get(id);\n if (!before || !after) {\n change(`campaign:${id}:presence`, 'Campaign presence', before ? 'Present' : 'Not observed', after ? 'Present' : 'Not observed', id);\n continue;\n }\n change(`campaign:${id}:state`, 'Recorded state', stateLabel[before.state], stateLabel[after.state], id);\n change(`campaign:${id}:reason`, 'Recorded reason', before.reasonCode, after.reasonCode, id);\n change(`campaign:${id}:attempted`, 'Campaign-call intent', before.attempted ? 'Recorded' : 'Not recorded', after.attempted ? 'Recorded' : 'Not recorded', id);\n }\n change('controller:campaign-order', 'Recorded campaign order', previous.outcomes.map((row) => row.campaignId).join(', ') || 'None recorded', current.outcomes.map((row) => row.campaignId).join(', ') || 'None recorded');\n change('controller:topology', 'Dependency evidence', previous.topology ? 'Available' : 'Unavailable', current.topology ? 'Available' : 'Unavailable');\n if (previous.topology && current.topology) {\n const previousTopology = new Map(previous.topology.map((node) => [node.campaignId, node]));\n for (const node of current.topology) {\n const before = previousTopology.get(node.campaignId);\n // Membership already records presence; a missing row is not an empty dependency list.\n if (!before) continue;\n change(`campaign:${node.campaignId}:dependencies`, 'Direct dependencies', members(before.dependsOn), members(node.dependsOn), node.campaignId);\n change(`campaign:${node.campaignId}:prerequisites`, 'Effective prerequisites', members(before.prerequisites), members(node.prerequisites), node.campaignId);\n }\n }\n return { kind: 'compared', notice: notices.join(' ') || null,\n clockWarning: Date.parse(current.observedAt) <= Date.parse(previous.observedAt), changes,\n changedCampaigns: new Set(changes.flatMap((row) => row.campaignId ? [row.campaignId] : [])).size };\n}\n","import { useMemo } from 'react';\nimport type { UniversePortfolioControllerView } from '../../core/web/universe-console-types.js';\nimport { compareControllerObservations } from '../data/controller-observation-delta.js';\nimport styles from './UniverseControllerChanges.module.css';\n\ntype Props = {\n previous: UniversePortfolioControllerView | null;\n current: UniversePortfolioControllerView;\n historical: boolean;\n loading: boolean;\n};\n\n/** Compares only the supplied observations; it does not collect an event history. */\nexport function UniverseControllerChanges({ previous, current, historical, loading }: Props) {\n const comparison = useMemo(() => compareControllerObservations(previous, current), [previous, current]);\n return <section className={styles.changes} aria-label=\"Changes between observations\">\n <header className={styles.header}>\n <h3>Changes between observations</h3>\n <div className={styles.labels}>\n {loading ? <span>Refresh in progress</span> : null}\n {historical ? <span className={styles.historical}>Historical observations</span> : null}\n </div>\n </header>\n <p className={styles.description}>Compare the last two accepted responses in this session. This is not an event log or a live activity view.</p>\n <dl className={styles.times} aria-label=\"Compared observation times\">\n <div><dt>Previous observation</dt><dd>{previous ? <time dateTime={previous.observedAt}>{previous.observedAt}</time> : 'Not yet observed'}</dd></div>\n <div><dt>Displayed observation</dt><dd><time dateTime={current.observedAt}>{current.observedAt}</time></dd></div>\n </dl>\n {loading ? <p className={styles.note}>The accepted observations below remain unchanged while the refresh is pending.</p> : null}\n {historical ? <p className={styles.warning}>The latest refresh failed. This comparison uses retained observations, not current evidence.</p> : null}\n {comparison.notice ? <p className={comparison.kind === 'baseline' ? styles.note : styles.warning}>{comparison.notice}</p> : null}\n {comparison.clockWarning ? <p className={styles.warning}>Observation timestamps are equal or move backward. Before and after follow response order, not a verified event timeline.</p> : null}\n {comparison.kind === 'baseline' ? <p className={styles.baseline}>Refresh this controller to compare two observations.</p>\n : comparison.kind === 'incomparable' ? <p className={styles.baseline}>These observations cannot be compared as one controller registration.</p>\n : comparison.changes.length === 0 ? <p className={styles.baseline}>No compared evidence fields changed. Observation times are excluded; this does not prove that no work occurred.</p>\n : <>\n <dl className={styles.counts} aria-label=\"Observation change counts\">\n <div><dt>Changed fields</dt><dd>{comparison.changes.length}</dd></div>\n <div><dt>Campaigns with displayed changes</dt><dd>{comparison.changedCampaigns}</dd></div>\n </dl>\n <details className={styles.disclosure}>\n <summary>Review {comparison.changes.length} changed field{comparison.changes.length === 1 ? '' : 's'}</summary>\n <ul className={styles.rows} aria-label=\"Changed observation fields\">\n {comparison.changes.map((change) => <li key={change.key} className={styles.row}>\n <div className={styles.field}><h4>{change.label}</h4>{change.campaignId ? <span>{change.campaignId}</span> : null}</div>\n <dl className={styles.values}>\n <div><dt>Before</dt><dd>{change.before}</dd></div>\n <div><dt>After</dt><dd>{change.after}</dd></div>\n </dl>\n </li>)}\n </ul>\n </details>\n </>}\n <p className={styles.footnote}>Differences describe returned evidence only. They do not establish worker execution, delivery verification or a production deployment.</p>\n </section>;\n}\n","import { useEffect, useRef, useState } from 'react';\nimport type { UniversePortfolioControllerView } from '../../core/web/universe-console-types.js';\nimport { isControllerId, readControllerStatus } from '../data/controller-status.js';\nimport { UniverseControllerTopology } from './UniverseControllerTopology.js';\nimport { UniverseControllerChanges } from './UniverseControllerChanges.js';\nimport styles from './UniverseControllerInspector.module.css';\n\nfunction RecordedTime({ value }: { value: string | null }) {\n return value ? <time dateTime={value}>{value.replace('T', ' ').replace('Z', ' UTC')}</time> : <>Not recorded</>;\n}\n\nconst diagnosticStages = {\n 'campaign-execution': 'Campaign execution',\n 'campaign-verification': 'Campaign verification',\n 'delivery-execution': 'Local branch delivery',\n 'delivery-verification': 'Delivery confirmation',\n 'settlement-publication': 'Controller acknowledgement',\n};\n\n/** Named, user-triggered observation. Never polls, discovers controllers or changes their state. */\nexport function UniverseControllerInspector() {\n const [input, setInput] = useState('');\n const [selected, setSelected] = useState<string | null>(null);\n const [observations, setObservations] = useState<{\n current: UniversePortfolioControllerView | null;\n previous: UniversePortfolioControllerView | null;\n }>({ current: null, previous: null });\n const data = observations.current;\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [validation, setValidation] = useState(false);\n const request = useRef<{ sequence: number; abort: AbortController | null }>({ sequence: 0, abort: null });\n useEffect(() => () => { request.current.sequence += 1; request.current.abort?.abort(); }, []);\n\n async function inspect(id: string) {\n if (!isControllerId(id)) { setValidation(true); return; }\n setValidation(false);\n request.current.abort?.abort();\n const sequence = ++request.current.sequence;\n const abort = new AbortController();\n request.current.abort = abort;\n setSelected(id);\n setObservations((previous) => previous.current?.controllerId === id ? previous : { current: null, previous: null });\n setLoading(true);\n setError(null);\n try {\n const next = await readControllerStatus(id, abort.signal);\n // Advance the pair together, only for the newest accepted request. Failed\n // or superseded reads must not become the next comparison baseline.\n if (sequence === request.current.sequence) setObservations((previous) => ({\n current: next, previous: previous.current?.controllerId === id ? previous.current : null,\n }));\n } catch {\n if (sequence === request.current.sequence) setError('Observation failed or returned invalid evidence. Check your connection and refresh this controller.');\n } finally {\n if (sequence === request.current.sequence) setLoading(false);\n }\n }\n\n return <section className={styles.inspector} aria-labelledby=\"controller-inspector-title\">\n <header className={styles.header}>\n <div><h2 id=\"controller-inspector-title\">Controller inspector</h2>\n <p>Read the recorded progress of a named portfolio controller.</p></div>\n <span className={styles.readOnly}>Read-only</span>\n </header>\n <form className={styles.form} onSubmit={(event) => { event.preventDefault(); void inspect(input); }}>\n <div className={styles.field}><label htmlFor=\"controller-id\">Controller ID</label>\n <input id=\"controller-id\" value={input} onChange={(event) => { setInput(event.target.value); setValidation(false); }}\n maxLength={64} autoComplete=\"off\" autoCapitalize=\"none\" spellCheck={false}\n aria-invalid={validation} aria-describedby=\"controller-id-help\" />\n <p id=\"controller-id-help\">Use the ID from your controller manifest: lowercase letters, numbers, hyphens or underscores.</p>\n </div>\n <button type=\"submit\">Inspect controller</button>\n {selected ? <button type=\"button\" disabled={loading} onClick={() => { void inspect(selected); }}>Refresh controller</button> : null}\n </form>\n {validation ? <p role=\"alert\" className={styles.warning}>Enter 1–64 characters, starting with a lowercase letter or number.</p> : null}\n {!selected ? <p className={styles.empty}>Enter an ID to inspect this store. Nothing is queried until you submit.</p> : <div aria-busy={loading}>\n <h3 className={styles.identity}>Evidence for <code>{selected}</code></h3>\n {input !== selected ? <p className={styles.note}>The form has changed. Evidence below still belongs to {selected}; submit to inspect another ID.</p> : null}\n <p role=\"status\" className={styles.note}>{loading ? `Reading ${selected}…${data ? ' Previous observation remains below.' : ''}` :\n error && data ? 'Historical observation — refresh failed. This is not current evidence.' : data ? 'Recorded snapshot. Refresh explicitly to check for changes; this is not a live process view.' : 'No verified observation is available.'}</p>\n {error ? <p role=\"alert\" className={styles.warning}>{error}</p> : null}\n {data ? <>\n <dl className={styles.facts}>\n <div><dt>Evidence health</dt><dd>{data.sourceState}</dd></div>\n <div><dt>Recorded status</dt><dd>{data.status}</dd></div>\n <div><dt>Observed at</dt><dd><RecordedTime value={data.observedAt} /></dd></div>\n <div><dt>Created at</dt><dd><RecordedTime value={data.createdAt} /></dd></div>\n <div><dt>Original deadline</dt><dd><RecordedTime value={data.deadlineAt} /></dd></div>\n </dl>\n <UniverseControllerChanges previous={observations.previous} current={data} historical={Boolean(error)} loading={loading} />\n {data.sourceState === 'missing' ? <p className={styles.warning}>No controller registration was found in this store. Check the ID and selected Universe store.</p> : null}\n {data.sourceState === 'degraded' ? <p className={styles.warning}>Evidence could not be fully verified. This observation does not repair locks, reconcile work or prove a controller is running.</p> : null}\n {data.control ? <section className={styles.control} aria-label=\"Recorded admission control\">\n <h4>{data.control.mode === 'open' ? 'Admission reopened' : data.control.acknowledgedAt ? 'Drain acknowledged' : 'Drain awaiting acknowledgement'}</h4>\n <ol className={styles.sequence}>\n <li><strong>{data.control.mode === 'open' ? 'Resume recorded' : 'Drain recorded'}</strong><span>Sequence {data.control.sequence}</span><RecordedTime value={data.control.requestedAt} /></li>\n <li><strong>{data.control.mode === 'open' ? 'Resume did not start work' : data.control.acknowledgedAt ? 'Acknowledgement recorded' : 'Acknowledgement not recorded'}</strong>\n {data.control.mode === 'drain' ? <RecordedTime value={data.control.acknowledgedAt} /> : <span>Resume does not start work.</span>}</li>\n </ol>\n <p>{data.control.mode === 'drain' ? 'Drain blocks new dispatch intents; already-admitted work can continue. An unresolved intent prevents acknowledgement; absence of a visible worker proves neither completion nor failure.' : 'Execution requires a separate run invocation. Admission state does not renew the original deadline or establish a running controller.'}</p>\n </section> : <p className={styles.note}>No admission-control record. This does not establish process liveness.</p>}\n <UniverseControllerTopology key={data.controllerId} data={data} />\n {data.outcomes.length ? <div className={styles.tableWrap} role=\"region\" aria-label=\"Recorded campaign outcomes\" tabIndex={0}>\n <table><caption>Recorded campaign outcomes</caption><thead><tr><th scope=\"col\">Campaign</th><th scope=\"col\">State</th><th scope=\"col\">Campaign attempted</th><th scope=\"col\">Reason</th></tr></thead>\n <tbody>{data.outcomes.map((row) => <tr key={row.campaignId}><th scope=\"row\">{row.campaignId}</th><td>{row.state}</td><td>{row.attempted ? 'Yes' : 'No'}</td><td>{row.reasonCode}</td></tr>)}</tbody></table>\n </div> : <p className={styles.note}>No campaign outcomes available in this observation.</p>}\n <p className={styles.note}>“In-flight” means an unresolved durable intent, not proof of a live worker. Campaign attempted records a call intent, not proof of worker execution or successful evaluation. A dispatch-not-started outcome remains held and does not authorize a retry.</p>\n {data.diagnostics?.length ? <section aria-label=\"Recorded handoff diagnostics\">\n <h4>Recorded handoff diagnostics</h4>\n <p className={styles.note}>These are historical failure records, not live errors. Check the campaign outcome above for its current recorded state. A diagnostic never authorizes retrying a worker or publishing a branch.</p>\n <div className={styles.tableWrap} role=\"region\" aria-label=\"Handoff diagnostic details\" tabIndex={0}>\n <table><caption>Where the handoff stopped</caption><thead><tr><th scope=\"col\">Campaign</th><th scope=\"col\">Stage</th><th scope=\"col\">Failure code</th><th scope=\"col\">Recorded at</th></tr></thead>\n <tbody>{data.diagnostics.map(row => <tr key={row.campaignId}><th scope=\"row\">{row.campaignId}</th>\n <td>{diagnosticStages[row.phase]}</td><td>{row.code}</td><td><RecordedTime value={row.at} /></td></tr>)}</tbody>\n </table>\n </div>\n <p className={styles.note}>Inspect the pinned campaign and delivery receipts before recovery. Completed outcomes can retain an earlier diagnostic; raw error text and private intent digests are omitted here.</p>\n </section> : null}\n {data.reasons.length ? <details className={styles.reasons}><summary>Evidence reasons ({data.reasons.length})</summary><ul>{data.reasons.map((reason, index) => <li key={`${reason}-${index}`}>{reason}</li>)}</ul></details> : null}\n </> : null}\n </div>}\n </section>;\n}\n","import { useEffect } from 'react';\nimport { SessionGate } from '../components/auth/SessionGate.js';\nimport { clearReadSession, markCheckComplete } from '../data/auth-store.js';\nimport { getQuerySnapshot, runQuery } from '../data/cache.js';\nimport { apiGet } from '../data/client.js';\nimport { useAuthPhase, useQuery, useRefetch, useTheme } from '../data/hooks.js';\nimport { UniverseRootContext } from '../routes/universe/UniverseScope.js';\nimport { UniverseView } from '../routes/universe/UniverseView.js';\nimport { SkipToContent } from './SkipToContent.js';\nimport { UniverseControllerInspector } from './UniverseControllerInspector.js';\nimport styles from './UniverseConsoleApp.module.css';\nimport '../design/global.css';\n\ninterface ConsoleScope {\n schemaVersion: 1;\n mode: 'universe';\n root: string;\n readOnly: true;\n}\n\nconst scopeQuery = {\n key: 'universe-console-scope',\n async fetch(): Promise<ConsoleScope> {\n const scope = await apiGet<ConsoleScope>('/api/universe/console');\n if (scope?.schemaVersion !== 1 || scope.mode !== 'universe' || scope.readOnly !== true ||\n typeof scope.root !== 'string' || !/^(?:\\/|[a-zA-Z]:[\\\\/]|\\\\\\\\)/.test(scope.root) ||\n [...scope.root].some((character) => character.charCodeAt(0) < 32 ||\n character.charCodeAt(0) >= 127 && character.charCodeAt(0) <= 159)) {\n throw new Error('The server did not establish an explicit read-only Universe scope.');\n }\n return scope;\n },\n};\n\nfunction ScopedWorkspace() {\n const scope = useQuery(scopeQuery);\n const retry = useRefetch(scopeQuery);\n const theme = useTheme();\n return <>\n <SkipToContent />\n <div className={styles.shell}>\n <header className={styles.scopeBar}>\n <div className={styles.scope}>\n <div className={styles.brand}>\n <svg className={styles.brandMark} viewBox=\"0 0 32 32\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"m5 11 11-6 11 6-11 6Z M5 16l11 6 11-6 M5 21l11 6 11-6\" />\n </svg><strong>Ashlrverse</strong><span className={styles.workspace}>Experiments</span>\n </div>\n <span className={styles.badge}>Read-only observation</span>\n {scope.data ? <details className={styles.store}><summary>Universe store</summary>\n <code aria-label=\"Universe store\" className={styles.root}>{scope.data.root}</code></details> : null}\n </div>\n <div className={styles.actions}>\n <button type=\"button\" onClick={theme.cycle}>Theme: {theme.theme}</button>\n <button type=\"button\" onClick={() => { void clearReadSession(); }}>Disconnect</button>\n </div>\n </header>\n <main id=\"main-content\" tabIndex={-1} className={styles.main}>\n {scope.status === 'error' ? <section role=\"alert\" className={styles.notice}>\n <h1>Console scope unavailable</h1>\n <p>{scope.error?.message} No project data is shown until the scope can be checked.</p>\n <button type=\"button\" onClick={retry}>Retry scope check</button>\n </section> : scope.data ? <UniverseRootContext.Provider value={scope.data.root}>\n <p className={styles.explanation}>This console observes the selected Universe store. Run campaigns from your terminal; opening this page does not start work.</p>\n <UniverseControllerInspector key={scope.data.root} />\n <UniverseView />\n </UniverseRootContext.Provider> : <p role=\"status\">Checking the selected Universe store…</p>}\n </main>\n </div>\n </>;\n}\n\n/** Never mounts the general Hub shell, snapshot probe, or dispatch controls. */\nexport function UniverseConsoleApp() {\n const phase = useAuthPhase();\n useEffect(() => {\n if (phase !== 'checking') return;\n let cancelled = false;\n void runQuery(scopeQuery.key, scopeQuery.fetch).then(() => {\n if (!cancelled) markCheckComplete(getQuerySnapshot(scopeQuery.key).status === 'success');\n });\n return () => { cancelled = true; };\n }, [phase]);\n\n if (phase === 'checking') return <p className={styles.checking} role=\"status\">Checking for an existing console session…</p>;\n if (phase === 'unauthenticated') return <SessionGate\n heading=\"Connect to Ashlrverse\"\n command=\"ashlr universe console --root /absolute/universe-store\"\n />;\n return <ScopedWorkspace />;\n}\n"],"names":["PORTFOLIO_CONTROLLER_DIAGNOSTIC_CODES","isControllerId","value","record","timestamp","code","validateControllerStatus","controllerId","invalid","seen","outcomes","row","topology","topologyIds","node","references","input","id","dependsOn","prerequisites","byId","resolved","next","ancestors","pending","control","diagnostics","diagnosed","outcome","phase","current","readControllerStatus","signal","result","apiGet","matchControllerCampaigns","query","filter","needle","prioritizeControllerEdges","edges","selectedId","limit","cap","incident","other","edge","NODE_LIMIT","EDGE_LIMIT","RESULT_PAGE_SIZE","STATE_LABELS","STATE_MEANINGS","layoutCampaigns","data","nodes","visible","levels","pass","links","columns","a","b","level","unplaced","positions","column","index","from","ControllerTopology","graph","useMemo","setSelectedId","useState","setQuery","stateFilter","setStateFilter","resultPage","setResultPage","boardRef","useRef","nodeRefs","selected","matching","filtering","pageCount","page","visibleResults","selectedExcluded","visibleEdges","prefix","useId","detailId","inherited","count","state","revealCampaign","focus","board","position","left","top","selectCampaign","relations","ids","empty","jsx","styles","jsxs","Fragment","event","to","x","end","mid","dependencies","element","UniverseControllerTopology","recorded","members","values","stateLabel","compareControllerObservations","previous","changes","change","key","label","before","after","campaignId","notices","field","previousOutcomes","currentOutcomes","campaignIds","previousTopology","UniverseControllerChanges","historical","loading","comparison","RecordedTime","diagnosticStages","UniverseControllerInspector","setInput","setSelected","observations","setObservations","setLoading","error","setError","validation","setValidation","request","useEffect","inspect","sequence","abort","reason","scopeQuery","scope","character","ScopedWorkspace","useQuery","retry","useRefetch","theme","useTheme","SkipToContent","clearReadSession","UniverseRootContext","UniverseView","UniverseConsoleApp","useAuthPhase","cancelled","runQuery","markCheckComplete","getQuerySnapshot","SessionGate"],"mappings":"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"}
|