@ashlr/hub 3.13.0 → 3.14.0
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 +74 -0
- package/dist/authority-surface.json +204 -124
- package/dist/build-identity.json +2 -2
- package/dist/cli/authority.js +112 -18
- package/dist/cli/authority.js.map +1 -1
- package/dist/cli/comms.d.ts +33 -19
- package/dist/cli/comms.js +128 -151
- package/dist/cli/comms.js.map +1 -1
- package/dist/cli/completions.js +1 -1
- package/dist/cli/completions.js.map +1 -1
- package/dist/cli/daemon.js +29 -0
- package/dist/cli/daemon.js.map +1 -1
- package/dist/cli/director.d.ts +8 -12
- package/dist/cli/director.js +17 -52
- package/dist/cli/director.js.map +1 -1
- package/dist/cli/fleet.js +4 -1
- package/dist/cli/fleet.js.map +1 -1
- package/dist/cli/help.js +1 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/leader.d.ts +27 -3
- package/dist/cli/leader.js +253 -4
- package/dist/cli/leader.js.map +1 -1
- package/dist/core/authority/server-enforcement.d.ts +110 -0
- package/dist/core/authority/server-enforcement.js +260 -0
- package/dist/core/authority/server-enforcement.js.map +1 -0
- package/dist/core/authority/standing-grant.d.ts +24 -4
- package/dist/core/authority/standing-grant.js +19 -3
- package/dist/core/authority/standing-grant.js.map +1 -1
- package/dist/core/cloud/timeline.js +13 -7
- package/dist/core/cloud/timeline.js.map +1 -1
- package/dist/core/comms/change-digest.d.ts +130 -0
- package/dist/core/comms/change-digest.js +451 -0
- package/dist/core/comms/change-digest.js.map +1 -0
- package/dist/core/comms/director-prompt.d.ts +4 -5
- package/dist/core/comms/director-prompt.js +4 -71
- package/dist/core/comms/director-prompt.js.map +1 -1
- package/dist/core/comms/director.d.ts +24 -61
- package/dist/core/comms/director.js +29 -382
- package/dist/core/comms/director.js.map +1 -1
- package/dist/core/comms/dispatch.d.ts +37 -12
- package/dist/core/comms/dispatch.js +244 -177
- package/dist/core/comms/dispatch.js.map +1 -1
- package/dist/core/comms/elon-dialogue.d.ts +23 -15
- package/dist/core/comms/elon-dialogue.js +36 -307
- package/dist/core/comms/elon-dialogue.js.map +1 -1
- package/dist/core/comms/fleet-pulse.js +4 -7
- package/dist/core/comms/fleet-pulse.js.map +1 -1
- package/dist/core/comms/handlers.d.ts +10 -6
- package/dist/core/comms/handlers.js +14 -48
- package/dist/core/comms/handlers.js.map +1 -1
- package/dist/core/comms/migrations.d.ts +47 -0
- package/dist/core/comms/migrations.js +125 -0
- package/dist/core/comms/migrations.js.map +1 -0
- package/dist/core/comms/requests.d.ts +32 -5
- package/dist/core/comms/requests.js +101 -5
- package/dist/core/comms/requests.js.map +1 -1
- package/dist/core/comms/telegram-channel.d.ts +104 -0
- package/dist/core/comms/telegram-channel.js +622 -0
- package/dist/core/comms/telegram-channel.js.map +1 -0
- package/dist/core/comms/telegram-thread-map.d.ts +56 -0
- package/dist/core/comms/telegram-thread-map.js +144 -0
- package/dist/core/comms/telegram-thread-map.js.map +1 -0
- package/dist/core/daemon/capacity-publisher.d.ts +8 -1
- package/dist/core/daemon/capacity-publisher.js +40 -2
- package/dist/core/daemon/capacity-publisher.js.map +1 -1
- package/dist/core/daemon/loop.js +18 -4
- package/dist/core/daemon/loop.js.map +1 -1
- package/dist/core/daemon/tick-deadline.d.ts +44 -0
- package/dist/core/daemon/tick-deadline.js +83 -0
- package/dist/core/daemon/tick-deadline.js.map +1 -0
- package/dist/core/daemon/tick-hooks.d.ts +7 -0
- package/dist/core/daemon/tick-hooks.js.map +1 -1
- package/dist/core/daemon/tick-progress.d.ts +39 -0
- package/dist/core/daemon/tick-progress.js +194 -0
- package/dist/core/daemon/tick-progress.js.map +1 -0
- package/dist/core/dashboard.js +3 -1
- package/dist/core/dashboard.js.map +1 -1
- package/dist/core/fleet/fleet-merge-state.d.ts +6 -0
- package/dist/core/fleet/fleet-merge-state.js.map +1 -1
- package/dist/core/fleet/host-merge.d.ts +9 -0
- package/dist/core/fleet/host-merge.js +13 -2
- package/dist/core/fleet/host-merge.js.map +1 -1
- package/dist/core/fleet/merge-gates.d.ts +13 -0
- package/dist/core/fleet/merge-gates.js +14 -0
- package/dist/core/fleet/merge-gates.js.map +1 -1
- package/dist/core/fleet/mirrors.d.ts +162 -6
- package/dist/core/fleet/mirrors.js +1051 -49
- package/dist/core/fleet/mirrors.js.map +1 -1
- package/dist/core/fleet/standing-merge-pass.d.ts +8 -0
- package/dist/core/fleet/standing-merge-pass.js +72 -1
- package/dist/core/fleet/standing-merge-pass.js.map +1 -1
- package/dist/core/fleet/status.d.ts +17 -0
- package/dist/core/fleet/status.js +22 -0
- package/dist/core/fleet/status.js.map +1 -1
- package/dist/core/fleet/tick-hooks-live.d.ts +1 -1
- package/dist/core/fleet/tick-hooks-live.js +13 -3
- package/dist/core/fleet/tick-hooks-live.js.map +1 -1
- package/dist/core/git.d.ts +17 -0
- package/dist/core/git.js +124 -25
- package/dist/core/git.js.map +1 -1
- package/dist/core/goals/open-goals.d.ts +47 -0
- package/dist/core/goals/open-goals.js +33 -0
- package/dist/core/goals/open-goals.js.map +1 -0
- package/dist/core/inbox/merge.d.ts +5 -0
- package/dist/core/inbox/merge.js +58 -2
- package/dist/core/inbox/merge.js.map +1 -1
- package/dist/core/integrations/locus.d.ts +28 -0
- package/dist/core/integrations/locus.js +155 -30
- package/dist/core/integrations/locus.js.map +1 -1
- package/dist/core/integrations/telegram-format.d.ts +40 -0
- package/dist/core/integrations/telegram-format.js +123 -0
- package/dist/core/integrations/telegram-format.js.map +1 -0
- package/dist/core/integrations/telegram.d.ts +60 -4
- package/dist/core/integrations/telegram.js +161 -28
- package/dist/core/integrations/telegram.js.map +1 -1
- package/dist/core/mcp-registry.d.ts +12 -0
- package/dist/core/mcp-registry.js +70 -0
- package/dist/core/mcp-registry.js.map +1 -1
- package/dist/core/observability/rollup.d.ts +12 -10
- package/dist/core/observability/rollup.js +44 -17
- package/dist/core/observability/rollup.js.map +1 -1
- package/dist/core/resources/connection-monitor.d.ts +9 -0
- package/dist/core/resources/connection-monitor.js +19 -9
- package/dist/core/resources/connection-monitor.js.map +1 -1
- package/dist/core/resources/quota-refresh-lease.d.ts +17 -0
- package/dist/core/resources/quota-refresh-lease.js +34 -1
- package/dist/core/resources/quota-refresh-lease.js.map +1 -1
- package/dist/core/routing/budget-api.d.ts +7 -1
- package/dist/core/routing/budget-api.js +56 -2
- package/dist/core/routing/budget-api.js.map +1 -1
- package/dist/core/routing/readiness-types.d.ts +82 -0
- package/dist/core/routing/readiness-types.js +23 -0
- package/dist/core/routing/readiness-types.js.map +1 -0
- package/dist/core/routing/readiness.d.ts +103 -0
- package/dist/core/routing/readiness.js +480 -0
- package/dist/core/routing/readiness.js.map +1 -0
- package/dist/core/sandbox/confine.js +22 -1
- package/dist/core/sandbox/confine.js.map +1 -1
- package/dist/core/sandbox/policy.d.ts +23 -0
- package/dist/core/sandbox/policy.js +100 -0
- package/dist/core/sandbox/policy.js.map +1 -1
- package/dist/core/types.d.ts +13 -0
- package/dist/core/types.js.map +1 -1
- package/dist/core/universe/builtins/preparation/manifest.json +1 -1
- package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +1204 -939
- package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +1319 -1054
- package/dist/core/usage/frontier-usage.d.ts +20 -2
- package/dist/core/usage/frontier-usage.js +75 -17
- package/dist/core/usage/frontier-usage.js.map +1 -1
- package/dist/core/verse/accounts.d.ts +45 -0
- package/dist/core/verse/accounts.js +246 -17
- package/dist/core/verse/accounts.js.map +1 -1
- package/dist/core/verse/apps-api.js +23 -11
- package/dist/core/verse/apps-api.js.map +1 -1
- package/dist/core/verse/apps.d.ts +11 -9
- package/dist/core/verse/apps.js +2 -2
- package/dist/core/verse/apps.js.map +1 -1
- package/dist/core/verse/authority-api.d.ts +8 -2
- package/dist/core/verse/authority-api.js +40 -5
- package/dist/core/verse/authority-api.js.map +1 -1
- package/dist/core/verse/autonomy-ladder.d.ts +172 -0
- package/dist/core/verse/autonomy-ladder.js +251 -0
- package/dist/core/verse/autonomy-ladder.js.map +1 -0
- package/dist/core/verse/context-fit.js +7 -5
- package/dist/core/verse/context-fit.js.map +1 -1
- package/dist/core/verse/control-api.d.ts +23 -1
- package/dist/core/verse/control-api.js +117 -10
- package/dist/core/verse/control-api.js.map +1 -1
- package/dist/core/verse/fleet-live-api.js +13 -5
- package/dist/core/verse/fleet-live-api.js.map +1 -1
- package/dist/core/verse/folder-io.d.ts +50 -0
- package/dist/core/verse/folder-io.js +142 -0
- package/dist/core/verse/folder-io.js.map +1 -0
- package/dist/core/verse/git-api.js +5 -4
- package/dist/core/verse/git-api.js.map +1 -1
- package/dist/core/verse/git-ops.d.ts +10 -1
- package/dist/core/verse/git-ops.js +18 -2
- package/dist/core/verse/git-ops.js.map +1 -1
- package/dist/core/verse/github-api.d.ts +1 -1
- package/dist/core/verse/github-api.js +5 -4
- package/dist/core/verse/github-api.js.map +1 -1
- package/dist/core/verse/github-repo.js +118 -14
- package/dist/core/verse/github-repo.js.map +1 -1
- package/dist/core/verse/leader-api.d.ts +5 -4
- package/dist/core/verse/leader-api.js +237 -10
- package/dist/core/verse/leader-api.js.map +1 -1
- package/dist/core/verse/local-models.d.ts +10 -0
- package/dist/core/verse/local-models.js +10 -1
- package/dist/core/verse/local-models.js.map +1 -1
- package/dist/core/verse/login-path.d.ts +73 -0
- package/dist/core/verse/login-path.js +123 -14
- package/dist/core/verse/login-path.js.map +1 -1
- package/dist/core/verse/mcp-control-api.js +4 -4
- package/dist/core/verse/mcp-control-api.js.map +1 -1
- package/dist/core/verse/mcp-scope.d.ts +22 -0
- package/dist/core/verse/mcp-scope.js +41 -1
- package/dist/core/verse/mcp-scope.js.map +1 -1
- package/dist/core/verse/mcp-seat-view.d.ts +10 -0
- package/dist/core/verse/mcp-seat-view.js +30 -4
- package/dist/core/verse/mcp-seat-view.js.map +1 -1
- package/dist/core/verse/overnight-api.js +20 -2
- package/dist/core/verse/overnight-api.js.map +1 -1
- package/dist/core/verse/path-guard.d.ts +24 -0
- package/dist/core/verse/path-guard.js +91 -22
- package/dist/core/verse/path-guard.js.map +1 -1
- package/dist/core/verse/preview-api.js +22 -0
- package/dist/core/verse/preview-api.js.map +1 -1
- package/dist/core/verse/projects.d.ts +21 -0
- package/dist/core/verse/projects.js +82 -0
- package/dist/core/verse/projects.js.map +1 -1
- package/dist/core/verse/session-controls-api.js +5 -3
- package/dist/core/verse/session-controls-api.js.map +1 -1
- package/dist/core/verse/session-handoff.d.ts +26 -0
- package/dist/core/verse/session-handoff.js +90 -12
- package/dist/core/verse/session-handoff.js.map +1 -1
- package/dist/core/verse/terminal-api.js +7 -4
- package/dist/core/verse/terminal-api.js.map +1 -1
- package/dist/core/verse/terminal.js +9 -5
- package/dist/core/verse/terminal.js.map +1 -1
- package/dist/core/verse/verse-api.js +81 -27
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/verse/workspaces.d.ts +51 -0
- package/dist/core/verse/workspaces.js +177 -47
- package/dist/core/verse/workspaces.js.map +1 -1
- package/dist/core/vision/leader-apply.d.ts +40 -0
- package/dist/core/vision/leader-apply.js +101 -30
- package/dist/core/vision/leader-apply.js.map +1 -1
- package/dist/core/vision/leader-cadence.d.ts +114 -0
- package/dist/core/vision/leader-cadence.js +127 -0
- package/dist/core/vision/leader-cadence.js.map +1 -0
- package/dist/core/vision/leader-goal-evidence.d.ts +25 -0
- package/dist/core/vision/leader-goal-evidence.js +36 -0
- package/dist/core/vision/leader-goal-evidence.js.map +1 -0
- package/dist/core/vision/leader-health.d.ts +53 -0
- package/dist/core/vision/leader-health.js +92 -0
- package/dist/core/vision/leader-health.js.map +1 -0
- package/dist/core/vision/leader-operator.d.ts +176 -0
- package/dist/core/vision/leader-operator.js +355 -0
- package/dist/core/vision/leader-operator.js.map +1 -0
- package/dist/core/vision/leader-run-chain.d.ts +41 -0
- package/dist/core/vision/leader-run-chain.js +54 -0
- package/dist/core/vision/leader-run-chain.js.map +1 -0
- package/dist/core/vision/leader-seat-plan.d.ts +68 -0
- package/dist/core/vision/leader-seat-plan.js +93 -0
- package/dist/core/vision/leader-seat-plan.js.map +1 -0
- package/dist/core/vision/leader-seat.d.ts +71 -5
- package/dist/core/vision/leader-seat.js +235 -33
- package/dist/core/vision/leader-seat.js.map +1 -1
- package/dist/core/vision/leader-thread-types.d.ts +104 -0
- package/dist/core/vision/leader-thread-types.js +9 -0
- package/dist/core/vision/leader-thread-types.js.map +1 -0
- package/dist/core/vision/leader-thread.d.ts +138 -0
- package/dist/core/vision/leader-thread.js +926 -0
- package/dist/core/vision/leader-thread.js.map +1 -0
- package/dist/core/vision/leader-types.d.ts +75 -1
- package/dist/core/vision/leader.d.ts +88 -18
- package/dist/core/vision/leader.js +269 -69
- package/dist/core/vision/leader.js.map +1 -1
- package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js → ActionMenu-CIiX2X8w.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-Dwjk6rUQ.js.map → ActionMenu-CIiX2X8w.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-DHsysoIL.js +2 -0
- package/dist/core/web/public/next/assets/{Advanced-cVYTAsfB.js.map → Advanced-DHsysoIL.js.map} +1 -1
- package/dist/core/web/public/next/assets/{App-IsaWDsdF.js → App-CMeAocmW.js} +5 -5
- package/dist/core/web/public/next/assets/{App-IsaWDsdF.js.map → App-CMeAocmW.js.map} +1 -1
- package/dist/core/web/public/next/assets/AppsSection-DISYnMnc.js +2 -0
- package/dist/core/web/public/next/assets/{AppsSection-DDqeSrty.js.map → AppsSection-DISYnMnc.js.map} +1 -1
- package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js +2 -0
- package/dist/core/web/public/next/assets/AreaTrend-DK2Y2TbZ.js.map +1 -0
- package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js → AutonomyOffState-CEPSZToP.js} +3 -3
- package/dist/core/web/public/next/assets/{AutonomyOffState-CpFYS3tQ.js.map → AutonomyOffState-CEPSZToP.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomySection-DWc3ciAD.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-Dwn8UtOy.js.map → AutonomySection-DWc3ciAD.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js +2 -0
- package/dist/core/web/public/next/assets/AutonomyStatus-CYaHjJ9U.js.map +1 -0
- package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js → BranchBar-BxhdiIpx.js} +2 -2
- package/dist/core/web/public/next/assets/{BranchBar-ISZ7xUCj.js.map → BranchBar-BxhdiIpx.js.map} +1 -1
- package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js → BudgetControl-C-0KhjRS.js} +2 -2
- package/dist/core/web/public/next/assets/{BudgetControl-BARVp-En.js.map → BudgetControl-C-0KhjRS.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js → Button-D90dzI_o.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-DtE0rlWD.js.map → Button-D90dzI_o.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js → CapacityStrip-qKDBC65C.js} +2 -2
- package/dist/core/web/public/next/assets/{CapacityStrip-DKbKA_Aa.js.map → CapacityStrip-qKDBC65C.js.map} +1 -1
- package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js +2 -0
- package/dist/core/web/public/next/assets/ChartFrame-DY-GVUb3.js.map +1 -0
- package/dist/core/web/public/next/assets/ChartFrame-DyjmyV8N.css +1 -0
- package/dist/core/web/public/next/assets/ChatSection-DlT4QU6a.js +3 -0
- package/dist/core/web/public/next/assets/{ChatSection-C9myY4ei.js.map → ChatSection-DlT4QU6a.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js → CloudBudgetForm-BrNun_Yu.js} +2 -2
- package/dist/core/web/public/next/assets/{CloudBudgetForm-CvjK4Oh6.js.map → CloudBudgetForm-BrNun_Yu.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js +2 -0
- package/dist/core/web/public/next/assets/CommandPalette-C5lDDKN0.js.map +1 -0
- package/dist/core/web/public/next/assets/CommandSection-B0xuU-yZ.css +1 -0
- package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-DXFvPgKp.js.map +1 -0
- package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js → ConfirmDialog-BR4nZQ2D.js} +2 -2
- package/dist/core/web/public/next/assets/{ConfirmDialog-CLUhzaBj.js.map → ConfirmDialog-BR4nZQ2D.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js → DeleteChatDialog-BCfP12GH.js} +2 -2
- package/dist/core/web/public/next/assets/{DeleteChatDialog-C_eDhV8b.js.map → DeleteChatDialog-BCfP12GH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js → Dialog-D3msQlCj.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-BRd_B9OE.js.map → Dialog-D3msQlCj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js → DiffPane-Ix6hvXlY.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffPane-Cpr9soB2.js.map → DiffPane-Ix6hvXlY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js → DiffViewer-C4WKsCIe.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-CNwd0W3Q.js.map → DiffViewer-C4WKsCIe.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-aWP7liri.js +2 -0
- package/dist/core/web/public/next/assets/{DockHost-BcEq2qaS.js.map → DockHost-aWP7liri.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js → EmptyState-D2IRy3Cg.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js.map → EmptyState-D2IRy3Cg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js → Epistemic-DMr18muX.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js.map → Epistemic-DMr18muX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js → EvidenceTimeline-DXmmz6Fi.js} +2 -2
- package/dist/core/web/public/next/assets/{EvidenceTimeline-sCCAdnBK.js.map → EvidenceTimeline-DXmmz6Fi.js.map} +1 -1
- package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js +3 -0
- package/dist/core/web/public/next/assets/FleetSection-BfplcwFU.js.map +1 -0
- package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js +2 -0
- package/dist/core/web/public/next/assets/Funnel-Dh2yVHws.js.map +1 -0
- package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js → GearTray-Dt-ee32-.js} +2 -2
- package/dist/core/web/public/next/assets/{GearTray-CpDt0xwj.js.map → GearTray-Dt-ee32-.js.map} +1 -1
- package/dist/core/web/public/next/assets/GrowthSection-P9EUfGeA.js +2 -0
- package/dist/core/web/public/next/assets/{GrowthSection-BvZezOsX.js.map → GrowthSection-P9EUfGeA.js.map} +1 -1
- package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js → HandoffDialog-CLJQLe7M.js} +2 -2
- package/dist/core/web/public/next/assets/{HandoffDialog-B1G6gQyk.js.map → HandoffDialog-CLJQLe7M.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js → Input-D_KRJA9V.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-CI0yBHmn.js.map → Input-D_KRJA9V.js.map} +1 -1
- package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js +2 -0
- package/dist/core/web/public/next/assets/LeaderCard-D-7DlJuR.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderCard-DNsbLwY3.css +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js +2 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DGZjWI-E.js.map +1 -0
- package/dist/core/web/public/next/assets/LeaderConversation-DPHUTq6W.css +1 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js +2 -0
- package/dist/core/web/public/next/assets/MatrixHeatmap-C7BCG2d7.js.map +1 -0
- package/dist/core/web/public/next/assets/McpSection-DGbRcyv8.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-nuXer4K-.js.map → McpSection-DGbRcyv8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js → MessageMarkdown-DFvk06qG.js} +3 -3
- package/dist/core/web/public/next/assets/{MessageMarkdown-BCe4TsXk.js.map → MessageMarkdown-DFvk06qG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js → MessageMarkdownRenderer-BAv4oEUf.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-DL3LU5kL.js.map → MessageMarkdownRenderer-BAv4oEUf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js → Meter-CMj-VafN.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-b69LM0mU.js.map → Meter-CMj-VafN.js.map} +1 -1
- package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js +3 -0
- package/dist/core/web/public/next/assets/MindSection-C6kLPIjt.js.map +1 -0
- package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js → MutationTokenDialog-DbnO8aYi.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-Bm34BNVV.js.map → MutationTokenDialog-DbnO8aYi.js.map} +1 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-crsiX-Nc.js.map +1 -0
- package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js → NeedsYouList-CCsijdWt.js} +2 -2
- package/dist/core/web/public/next/assets/{NeedsYouList-D5Kk549g.js.map → NeedsYouList-CCsijdWt.js.map} +1 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BlCHtOIr.js +3 -0
- package/dist/core/web/public/next/assets/{NewChatDialog-BqFTWgHU.js.map → NewChatDialog-BlCHtOIr.js.map} +1 -1
- package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js → OnboardingFlow-Cy9BA9eR.js} +3 -3
- package/dist/core/web/public/next/assets/{OnboardingFlow-DcDsguAM.js.map → OnboardingFlow-Cy9BA9eR.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingGate-BXpNFoLt.js +3 -0
- package/dist/core/web/public/next/assets/{OnboardingGate-BZafM1Vf.js.map → OnboardingGate-BXpNFoLt.js.map} +1 -1
- package/dist/core/web/public/next/assets/PreviewPane-COid5A0f.js +2 -0
- package/dist/core/web/public/next/assets/{PreviewPane-zT3gK9TD.js.map → PreviewPane-COid5A0f.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js → ProviderLogo-Cq-CYIwT.js} +2 -2
- package/dist/core/web/public/next/assets/{ProviderLogo-AwHn2sKm.js.map → ProviderLogo-Cq-CYIwT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js → RailStatus-Co5UB6We.js} +2 -2
- package/dist/core/web/public/next/assets/{RailStatus-xHrovWvI.js.map → RailStatus-Co5UB6We.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js → RefreshIndicator-DO9ibnSq.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-SEFZlMB2.js.map → RefreshIndicator-DO9ibnSq.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-Dr2WRgkq.js +7 -0
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-CAxPQ4sZ.js.map → ResourcePoolConsoleApp-Dr2WRgkq.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js +3 -0
- package/dist/core/web/public/next/assets/ResourcesChrome-CwMnbqI1.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js +2 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-B_Xp_JNc.js.map +1 -0
- package/dist/core/web/public/next/assets/ResourcesDrawer-DrGoO8KG.css +1 -0
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js → RouteErrorBoundary-SkNhhUbt.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-C8WGiixc.js.map → RouteErrorBoundary-SkNhhUbt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js → RunInCloudAction-BXPlZwJQ.js} +2 -2
- package/dist/core/web/public/next/assets/{RunInCloudAction-1-IPLYhf.js.map → RunInCloudAction-BXPlZwJQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js → SeatSelector-J5R3zDkB.js} +3 -3
- package/dist/core/web/public/next/assets/{SeatSelector-DpwNiX8F.js.map → SeatSelector-J5R3zDkB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js → Segmented-CGh_-tBb.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-Wt1ATod9.js.map → Segmented-CGh_-tBb.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-By-V9lMc.js → Select-CWnmUzs3.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-By-V9lMc.js.map → Select-CWnmUzs3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js → SessionGate-sp4KsnUo.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionGate-WROS02tK.js.map → SessionGate-sp4KsnUo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js → SessionInsightChip-DLFAzdbi.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionInsightChip-DNUcruwp.js.map → SessionInsightChip-DLFAzdbi.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js → SessionSearch-DbFjwR1h.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionSearch-UHtt7a8f.js.map → SessionSearch-DbFjwR1h.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SettingsSection-Bf74l0Gj.js → SettingsSection-Ch23msJ5.js} +2 -2
- package/dist/core/web/public/next/assets/SettingsSection-Ch23msJ5.js.map +1 -0
- package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js → SetupChecklist-Bd76MBAR.js} +2 -2
- package/dist/core/web/public/next/assets/{SetupChecklist-CzpEcfOl.js.map → SetupChecklist-Bd76MBAR.js.map} +1 -1
- package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js +3 -0
- package/dist/core/web/public/next/assets/ShadowDecisions-C5RAY91f.js.map +1 -0
- package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js → Sheet-BZ2AG4Eo.js} +2 -2
- package/dist/core/web/public/next/assets/{Sheet-HkBOBMTT.js.map → Sheet-BZ2AG4Eo.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js → ShortcutsOverlay-C8n8y3zf.js} +2 -2
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DiigiT8H.js.map → ShortcutsOverlay-C8n8y3zf.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-DN--cPYN.js +3 -0
- package/dist/core/web/public/next/assets/{Sidebar-C9YtBYVZ.js.map → Sidebar-DN--cPYN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js → Slider-KVoJLDD6.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-DaEDws-b.js.map → Slider-KVoJLDD6.js.map} +1 -1
- package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js +2 -0
- package/dist/core/web/public/next/assets/StatTile-C4KgjltA.js.map +1 -0
- package/dist/core/web/public/next/assets/StatTile-CNCqDoPO.css +1 -0
- package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js → StatusBadge-CXsYqmdU.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-CXG3iNL4.js.map → StatusBadge-CXsYqmdU.js.map} +1 -1
- package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js +2 -0
- package/dist/core/web/public/next/assets/StepBand-BMtVOFpK.js.map +1 -0
- package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js → Surface-BfDmQcKe.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-5bNA08tK.js.map → Surface-BfDmQcKe.js.map} +1 -1
- package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js +2 -0
- package/dist/core/web/public/next/assets/Swimlane-B9Exxekk.js.map +1 -0
- package/dist/core/web/public/next/assets/Swimlane-Bf4Rjoy9.css +1 -0
- package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js → Switch-9NtO_6Lj.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-BmCzfFnu.js.map → Switch-9NtO_6Lj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js → Tag-DscCRFcN.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-WSUIaMVy.js.map → Tag-DscCRFcN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js → TerminalPane-B668-DJW.js} +5 -5
- package/dist/core/web/public/next/assets/{TerminalPane-BVFgYX6K.js.map → TerminalPane-B668-DJW.js.map} +1 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BUV_brY7.js +2 -0
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-BpphLqoz.js.map → UniverseConsoleApp-BUV_brY7.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js → UniverseView-DG70zH0W.js} +4 -4
- package/dist/core/web/public/next/assets/{UniverseView-DbpbSMwO.js.map → UniverseView-DG70zH0W.js.map} +1 -1
- package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js +3 -0
- package/dist/core/web/public/next/assets/UsageSection-DY7uOTm1.js.map +1 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-CWU6R3By.js.map +1 -0
- package/dist/core/web/public/next/assets/Workspace-D1nP9BhD.js +10 -0
- package/dist/core/web/public/next/assets/{Workspace-RXy0pqp6.js.map → Workspace-D1nP9BhD.js.map} +1 -1
- package/dist/core/web/public/next/assets/actions-CY-PjpGc.js +2 -0
- package/dist/core/web/public/next/assets/{actions-BZTidCXZ.js.map → actions-CY-PjpGc.js.map} +1 -1
- package/dist/core/web/public/next/assets/actions-DkWhhWIg.css +1 -0
- package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js → apps-model-Du02KhAf.js} +2 -2
- package/dist/core/web/public/next/assets/{apps-model-CHO133qt.js.map → apps-model-Du02KhAf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js → authority-model-79SeuKlJ.js} +2 -2
- package/dist/core/web/public/next/assets/{authority-model-8NeAEwAF.js.map → authority-model-79SeuKlJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/autonomy-ladder-BGWmZzP7.css +1 -0
- package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js +2 -0
- package/dist/core/web/public/next/assets/autonomy-ladder.module-ArDv4bkr.js.map +1 -0
- package/dist/core/web/public/next/assets/budget-queries-D8QV5XtH.js +2 -0
- package/dist/core/web/public/next/assets/{budget-queries-DFF-3ICg.js.map → budget-queries-D8QV5XtH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js → capacity-strip-model-BwZ1ZbkU.js} +2 -2
- package/dist/core/web/public/next/assets/{capacity-strip-model-5ViUgUlP.js.map → capacity-strip-model-BwZ1ZbkU.js.map} +1 -1
- package/dist/core/web/public/next/assets/charts-BZ50mZD_.js +2 -0
- package/dist/core/web/public/next/assets/charts-BZ50mZD_.js.map +1 -0
- package/dist/core/web/public/next/assets/charts-ClCB18la.css +1 -0
- package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js → cloud-model-BDivRMqv.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-model-CfRydq8N.js.map → cloud-model-BDivRMqv.js.map} +1 -1
- package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js → cloud-queries-BPQQ5_pJ.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-queries-DmptbjS8.js.map → cloud-queries-BPQQ5_pJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js → colors-DvK0wMHH.js} +2 -2
- package/dist/core/web/public/next/assets/{colors-BZ3a9wFf.js.map → colors-DvK0wMHH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{command-catalog-ffCAijVY.js → command-catalog-BIntSa9l.js} +2 -2
- package/dist/core/web/public/next/assets/command-catalog-BIntSa9l.js.map +1 -0
- package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js → context-model-Br8t9jgG.js} +2 -2
- package/dist/core/web/public/next/assets/{context-model-CDeyP0cA.js.map → context-model-Br8t9jgG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js → context-model-CokrgEUq.js} +3 -3
- package/dist/core/web/public/next/assets/{context-model-Bb15chFt.js.map → context-model-CokrgEUq.js.map} +1 -1
- package/dist/core/web/public/next/assets/context-queries-eL3caKVG.js +2 -0
- package/dist/core/web/public/next/assets/{context-queries-_9bFWb9v.js.map → context-queries-eL3caKVG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js → control-queries-B9K-wmcB.js} +2 -2
- package/dist/core/web/public/next/assets/{control-queries-CXtmZZH6.js.map → control-queries-B9K-wmcB.js.map} +1 -1
- package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js → copy-setup-XMgCC5f8.js} +2 -2
- package/dist/core/web/public/next/assets/{copy-setup-BIp0iaiZ.js.map → copy-setup-XMgCC5f8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js → dock-icons-BJ6ZqB2t.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-icons-Cc43W7r4.js.map → dock-icons-BJ6ZqB2t.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js → fleet-model-BvDR3gjp.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-model-DOK8ZtEt.js.map → fleet-model-BvDR3gjp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js → fleet-queries-W2UFVMZJ.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-queries-BeEAqD6y.js.map → fleet-queries-W2UFVMZJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js → focus-trap-CtI1SlMX.js} +2 -2
- package/dist/core/web/public/next/assets/{focus-trap-ChZ5EFfM.js.map → focus-trap-CtI1SlMX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{format-BmH2yWL6.js → format-CH4g_sl1.js} +2 -2
- package/dist/core/web/public/next/assets/{format-BmH2yWL6.js.map → format-CH4g_sl1.js.map} +1 -1
- package/dist/core/web/public/next/assets/{format-DKrNjdwD.js → format-D7nBg2bn.js} +2 -2
- package/dist/core/web/public/next/assets/{format-DKrNjdwD.js.map → format-D7nBg2bn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js → git-model-Dnkd1TnK.js} +2 -2
- package/dist/core/web/public/next/assets/{git-model-BFwAVbxF.js.map → git-model-Dnkd1TnK.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-CMNW_dqn.js +2 -0
- package/dist/core/web/public/next/assets/{global-y_exIyAP.js.map → global-CMNW_dqn.js.map} +1 -1
- package/dist/core/web/public/next/assets/guarded-runners-YeAc9wLQ.js +2 -0
- package/dist/core/web/public/next/assets/{guarded-runners-Cd4POBtI.js.map → guarded-runners-YeAc9wLQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{icons-CygCEFWs.js → icons-D1sYbCTQ.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-CygCEFWs.js.map → icons-D1sYbCTQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-CyK31YRm.js → index-DZ-UQ7v8.js} +3 -3
- package/dist/core/web/public/next/assets/{index-CyK31YRm.js.map → index-DZ-UQ7v8.js.map} +1 -1
- package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js +2 -0
- package/dist/core/web/public/next/assets/leader-focus-BjeJv7CW.js.map +1 -0
- package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js +2 -0
- package/dist/core/web/public/next/assets/leader-thread-types-CDb-VPPO.js.map +1 -0
- package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js → live-model-D_32RAOR.js} +2 -2
- package/dist/core/web/public/next/assets/{live-model-D7hilYFk.js.map → live-model-D_32RAOR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js → mind.module-7hA92hRg.js} +2 -2
- package/dist/core/web/public/next/assets/{mind.module-B15k0Y9q.js.map → mind.module-7hA92hRg.js.map} +1 -1
- package/dist/core/web/public/next/assets/mutations-DQPbFdRJ.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-CWlxEMEm.js.map → mutations-DQPbFdRJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{nav-mimleI0R.js → nav-0dOYe2rJ.js} +2 -2
- package/dist/core/web/public/next/assets/{nav-mimleI0R.js.map → nav-0dOYe2rJ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js → overnight-queries-C4wOnFtE.js} +2 -2
- package/dist/core/web/public/next/assets/{overnight-queries-DJ4mZKSj.js.map → overnight-queries-C4wOnFtE.js.map} +1 -1
- package/dist/core/web/public/next/assets/primitives-2A5Eq8FQ.js +1 -0
- package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js → queries-BTXWdZzU.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-Bw1McHTj.js.map → queries-BTXWdZzU.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js → reasoning-pref-Ca6lN6x_.js} +2 -2
- package/dist/core/web/public/next/assets/{reasoning-pref-KkhI_5-j.js.map → reasoning-pref-Ca6lN6x_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js → reveal-anchor-DfNLgK_I.js} +2 -2
- package/dist/core/web/public/next/assets/{reveal-anchor-CCCx_kfT.js.map → reveal-anchor-DfNLgK_I.js.map} +1 -1
- package/dist/core/web/public/next/assets/seat-subscription-C5uPHBsN.js +2 -0
- package/dist/core/web/public/next/assets/{seat-subscription-BhUUz7VL.js.map → seat-subscription-C5uPHBsN.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js → sidebar-model-CLCdqwkR.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-Dcd437cf.js.map → sidebar-model-CLCdqwkR.js.map} +1 -1
- package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js → slots-C-qBeu-8.js} +3 -3
- package/dist/core/web/public/next/assets/{slots-BL_J5mmV.js.map → slots-C-qBeu-8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js → surface-data-Dj71tdD-.js} +2 -2
- package/dist/core/web/public/next/assets/{surface-data-C3UAQ4QX.js.map → surface-data-Dj71tdD-.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js +2 -0
- package/dist/core/web/public/next/assets/surface-prefetch-B0WdJOJG.js.map +1 -0
- package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js → tasks-model-O8yR5YXp.js} +2 -2
- package/dist/core/web/public/next/assets/{tasks-model-CzHvclVm.js.map → tasks-model-O8yR5YXp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js → terminal-icons-CoRZq9iO.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-BwgQTQP0.js.map → terminal-icons-CoRZq9iO.js.map} +1 -1
- package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js +2 -0
- package/dist/core/web/public/next/assets/thread-data-DQB_g66d.js.map +1 -0
- package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js → usage-queries-AdjEyEtn.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-pXxvy54x.js.map → usage-queries-AdjEyEtn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js → use-guarded-action-CuuMHeDX.js} +2 -2
- package/dist/core/web/public/next/assets/{use-guarded-action-EgVWjM5c.js.map → use-guarded-action-CuuMHeDX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js → use-ticker-BBcp02SZ.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-BoqFxRFG.js.map → use-ticker-BBcp02SZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js → use-token-gate-CbXVYQYI.js} +2 -2
- package/dist/core/web/public/next/assets/{use-token-gate-DSNIIpI6.js.map → use-token-gate-CbXVYQYI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js → useOnboarding-C_Fpe_sH.js} +2 -2
- package/dist/core/web/public/next/assets/{useOnboarding-Bk0VnkxQ.js.map → useOnboarding-C_Fpe_sH.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js → useSeatsRefresh-Co1CnxLc.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-q7Id9RcW.js.map → useSeatsRefresh-Co1CnxLc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js → useVerseTranscript-DgbigUlV.js} +2 -2
- package/dist/core/web/public/next/assets/{useVerseTranscript-CqH51rt9.js.map → useVerseTranscript-DgbigUlV.js.map} +1 -1
- package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js → verse-icons-S56hIiXS.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-icons-DsG1dOQx.js.map → verse-icons-S56hIiXS.js.map} +1 -1
- package/dist/core/web/public/next/assets/verse-model-DAVevkNe.js +2 -0
- package/dist/core/web/public/next/assets/{verse-model-JTuvRBVK.js.map → verse-model-DAVevkNe.js.map} +1 -1
- package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js → warmup-B_RAtNZ_.js} +3 -3
- package/dist/core/web/public/next/assets/{warmup-Bv1RumVq.js.map → warmup-B_RAtNZ_.js.map} +1 -1
- package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js → why-seat-model-M_r0wX3b.js} +2 -2
- package/dist/core/web/public/next/assets/{why-seat-model-Cau8qG6O.js.map → why-seat-model-M_r0wX3b.js.map} +1 -1
- package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js → workspace-model-dji5-Al3.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-D-SLfads.js.map → workspace-model-dji5-Al3.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/core/web/read-projection-worker.js +2 -1
- package/dist/core/web/read-projection-worker.js.map +1 -1
- package/dist/core/web/read-projections.d.ts +3 -0
- package/dist/core/web/read-projections.js +2 -2
- package/dist/core/web/read-projections.js.map +1 -1
- package/dist/core/web/visibility.js +3 -4
- package/dist/core/web/visibility.js.map +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/package.json +3 -2
- package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +0 -2
- package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js +0 -2
- package/dist/core/web/public/next/assets/AreaTrend-C32rUaxm.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-BVuBe6RP.css +0 -1
- package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js +0 -2
- package/dist/core/web/public/next/assets/ChartFrame-DK_BDXCt.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +0 -3
- package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js +0 -2
- package/dist/core/web/public/next/assets/CommandPalette-DzPsth0u.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +0 -3
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-CvAVd1w4.css +0 -1
- package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +0 -2
- package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js +0 -3
- package/dist/core/web/public/next/assets/FleetSection-BG8iGraG.js.map +0 -1
- package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js +0 -2
- package/dist/core/web/public/next/assets/Funnel-B88_wpA4.js.map +0 -1
- package/dist/core/web/public/next/assets/GrowthSection-BvZezOsX.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js +0 -2
- package/dist/core/web/public/next/assets/LeaderCard-BxxiEg4e.js.map +0 -1
- package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js +0 -2
- package/dist/core/web/public/next/assets/MatrixHeatmap-iPFEU2Tv.js.map +0 -1
- package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js +0 -2
- package/dist/core/web/public/next/assets/MindSection-Dc5v5rH3.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +0 -3
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +0 -1
- package/dist/core/web/public/next/assets/NewChatDialog-BqFTWgHU.js +0 -3
- package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +0 -3
- package/dist/core/web/public/next/assets/PreviewPane-zT3gK9TD.js +0 -2
- package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CAxPQ4sZ.js +0 -7
- package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js +0 -2
- package/dist/core/web/public/next/assets/ResourcesDrawer-BAFGodny.js.map +0 -1
- package/dist/core/web/public/next/assets/ResourcesDrawer-BCFJ2Uq8.css +0 -1
- package/dist/core/web/public/next/assets/SettingsSection-Bf74l0Gj.js.map +0 -1
- package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +0 -3
- package/dist/core/web/public/next/assets/StatTile-BuLMsJMx.css +0 -1
- package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js +0 -2
- package/dist/core/web/public/next/assets/StatTile-CTX41O6y.js.map +0 -1
- package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js +0 -2
- package/dist/core/web/public/next/assets/StepBand-jJTqYIdX.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js +0 -2
- package/dist/core/web/public/next/assets/Swimlane-LrslsGxw.js.map +0 -1
- package/dist/core/web/public/next/assets/Swimlane-o6_Zsrnr.css +0 -1
- package/dist/core/web/public/next/assets/UniverseConsoleApp-BpphLqoz.js +0 -2
- package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js +0 -3
- package/dist/core/web/public/next/assets/UsageSection-CUlaKtws.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +0 -1
- package/dist/core/web/public/next/assets/Workspace-RXy0pqp6.js +0 -10
- package/dist/core/web/public/next/assets/actions-BZTidCXZ.js +0 -2
- package/dist/core/web/public/next/assets/actions-BmIf9avl.css +0 -1
- package/dist/core/web/public/next/assets/budget-queries-DFF-3ICg.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzxWrZn7.js +0 -2
- package/dist/core/web/public/next/assets/charts-CzxWrZn7.js.map +0 -1
- package/dist/core/web/public/next/assets/charts-DhKTrQLw.css +0 -1
- package/dist/core/web/public/next/assets/command-catalog-ffCAijVY.js.map +0 -1
- package/dist/core/web/public/next/assets/context-queries-_9bFWb9v.js +0 -2
- package/dist/core/web/public/next/assets/global-y_exIyAP.js +0 -2
- package/dist/core/web/public/next/assets/guarded-runners-Cd4POBtI.js +0 -2
- package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +0 -2
- package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +0 -1
- package/dist/core/web/public/next/assets/seat-subscription-BhUUz7VL.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +0 -2
- package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js.map +0 -1
- package/dist/core/web/public/next/assets/verse-model-JTuvRBVK.js +0 -2
package/dist/core/web/public/next/assets/{EmptyState-DsN1H6MC.js.map → EmptyState-D2IRy3Cg.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EmptyState-
|
|
1
|
+
{"version":3,"file":"EmptyState-D2IRy3Cg.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/EmptyState.module.css","../../../../../../src/web-ui/components/primitives/EmptyState.tsx"],"sourcesContent":["/**\n * The designed dead-end. DESIGN-V2 §1.2 allows no cards and no nested boxes,\n * and §5 asks an empty state to read as \"a single quiet line, one action\" —\n * so this is NOT a dashed box on a filled ground. It was one, which meant\n * every empty panel grew a second border inside the panel's own hairline and\n * announced the absence of data louder than the data would have been.\n *\n * What carries it instead: a 2px left rule (the same device the transcript\n * uses for a user turn, a blockquote and a failed tool call), left-aligned\n * text on the surface it already sits on, and one action. Tone moves the rule\n * and the glyph only — never a fill, never a border box.\n */\n.empty {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: var(--space-2);\n padding: var(--space-6) 0 var(--space-6) var(--space-4);\n border-left: 2px solid var(--border-strong);\n text-align: left;\n}\n\n.compact {\n padding: var(--space-4) 0 var(--space-4) var(--space-3);\n gap: var(--space-1);\n}\n\n.icon {\n display: inline-flex;\n color: var(--text-tertiary);\n}\n\n.title {\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-medium);\n letter-spacing: var(--tracking-display);\n color: var(--text-primary);\n}\n\n.body {\n max-width: 52ch;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n\n.action {\n margin-top: var(--space-1);\n}\n\n/* Tone is carried by the rule and the glyph. The text stays neutral so the\n state never reads as a filled alert banner (§1.1: one accent per screen,\n colour only where it carries meaning). */\n.error {\n border-left-color: var(--status-danger-solid);\n}\n.error .icon {\n color: var(--status-danger-fg);\n}\n\n.unauthorized {\n border-left-color: var(--status-warning-solid);\n}\n.unauthorized .icon {\n color: var(--status-warning-fg);\n}\n","/**\n * components/primitives/EmptyState.tsx — the designed state for \"there is\n * genuinely nothing here\" (design doc §1.6: honest states).\n *\n * It takes a TITLE and a BODY because an empty surface has to say what it\n * means — \"No enrolled repositories\" is a fact, \"the daemon will do nothing\n * until you enroll one\" is the consequence the operator needs. `tone=\"error\"`\n * and `tone=\"unauthorized\"` cover the other two dead ends so no view has to\n * invent its own.\n */\nimport type { ReactNode } from 'react';\nimport styles from './EmptyState.module.css';\n\nexport interface EmptyStateProps {\n title: ReactNode;\n /** What it means / what to do about it. */\n body?: ReactNode;\n /** 16px glyph from ./icons.tsx. */\n icon?: ReactNode;\n /** A single action — usually the thing that resolves the emptiness. */\n action?: ReactNode;\n tone?: 'neutral' | 'error' | 'unauthorized';\n /** Tighter padding for a panel rather than a whole view. */\n compact?: boolean;\n className?: string;\n}\n\nexport function EmptyState({\n title,\n body,\n icon,\n action,\n tone = 'neutral',\n compact = false,\n className,\n}: EmptyStateProps) {\n return (\n <div\n className={`${styles.empty} ${styles[tone]} ${compact ? styles.compact : ''} ${className ?? ''}`}\n role={tone === 'error' ? 'alert' : undefined}\n >\n {icon ? <span className={styles.icon}>{icon}</span> : null}\n <p className={styles.title}>{title}</p>\n {body ? <p className={styles.body}>{body}</p> : null}\n {action ? <div className={styles.action}>{action}</div> : null}\n </div>\n );\n}\n"],"mappings":"sQC2BA,SAAgB,EAAW,CACzB,QACA,OACA,OACA,SACA,OAAO,UACP,UAAU,GACV,aACkB,CAClB,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CACE,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,GAAM,GAAG,EAAU,EAAO,QAAU,GAAG,GAAG,GAAa,KAC5F,KAAM,IAAS,QAAU,QAAU,IAAA,GAFrC,SAAA,CAIG,GAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAO,SAAA,CAAW,CAAA,EAAI,MACtD,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,MAAQ,SAAA,CAAS,CAAA,EACrC,GAAO,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAO,SAAA,CAAQ,CAAA,EAAI,KAC/C,GAAS,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,OAAS,SAAA,CAAY,CAAA,EAAI,IACvD,GAET"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{n as e}from"./index-
|
|
2
|
-
//# sourceMappingURL=Epistemic-
|
|
1
|
+
import{n as e}from"./index-DZ-UQ7v8.js";var t={unknown:`_unknown_4gf0c_1`,dot:`_dot_4gf0c_11`,badge:`_badge_4gf0c_19`},n=e();function r(e){return!e||e.sourceState===`healthy`&&e.complete!==!1}function i({quality:e,children:i,renderControl:a,label:o}){if(r(e))return(0,n.jsxs)(n.Fragment,{children:[i,a?.()]});let s=e?.reason;return(0,n.jsxs)(`span`,{className:t.unknown,title:s?`Unavailable: ${s}`:`Source data unavailable`,children:[(0,n.jsx)(`span`,{className:t.dot,"aria-hidden":`true`}),`unknown`,o?(0,n.jsxs)(`span`,{className:`visually-hidden`,children:[` (`,o,`)`]}):null]})}function a({quality:e,label:i}){return r(e)?null:(0,n.jsxs)(`span`,{className:t.badge,title:e?.reason??`Source data unavailable`,children:[i?`${i}: `:``,`unknown`]})}export{a as n,r,i as t};
|
|
2
|
+
//# sourceMappingURL=Epistemic-DMr18muX.js.map
|
package/dist/core/web/public/next/assets/{Epistemic-fycQTBRO.js.map → Epistemic-DMr18muX.js.map}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Epistemic-
|
|
1
|
+
{"version":3,"file":"Epistemic-DMr18muX.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Epistemic.module.css","../../../../../../src/web-ui/components/primitives/Epistemic.tsx"],"sourcesContent":[".unknown {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n color: var(--status-unknown-fg);\n font-size: var(--text-sm-size);\n font-style: italic;\n cursor: help;\n}\n\n.dot {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--status-unknown-solid);\n flex-shrink: 0;\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n padding: 1px var(--space-2);\n border-radius: var(--radius-xs);\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-size: var(--text-xs-size);\n font-style: italic;\n cursor: help;\n}\n","/**\n * components/primitives/Epistemic.tsx — the one thing the old UI got right,\n * promoted to a first-class primitive (foundation brief, item 7).\n *\n * When a piece of data's `sourceQuality.sourceState` is 'degraded' or\n * 'unknown'/'missing', this component displays \"unknown\" (never a stale or\n * guessed value dressed up as current) AND withholds any control built on\n * top of it (`renderControl` simply never runs). Every future view should\n * wrap sourceQuality-bearing fields in this rather than reinventing the\n * check — that is the whole point of making it a primitive instead of a\n * convention someone has to remember.\n *\n * Reference (old, correct behavior this replaces): app.js:311-314, :336-347.\n */\nimport type { ReactNode } from 'react';\nimport type { SourceQuality } from '../../data/api-types.js';\nimport styles from './Epistemic.module.css';\n\nexport function isKnown(quality: SourceQuality | undefined): boolean {\n if (!quality) return true; // absent quality metadata => field predates the pattern; trust it.\n return quality.sourceState === 'healthy' && quality.complete !== false;\n}\n\nexport interface EpistemicProps {\n quality: SourceQuality | undefined;\n /** Rendered when the value is known-good. */\n children: ReactNode;\n /**\n * A control (button, toggle, link) whose action depends on this data\n * being trustworthy — e.g. \"restart daemon\" next to daemon.running.\n * Omitted entirely (not disabled — omitted) when the source is degraded,\n * so an operator never sees an actionable-looking control wired to a\n * guess.\n */\n renderControl?: () => ReactNode;\n /** Optional label used in the \"unknown\" state, e.g. \"daemon status\". */\n label?: string;\n}\n\nexport function Epistemic({ quality, children, renderControl, label }: EpistemicProps): ReactNode {\n if (isKnown(quality)) {\n return (\n <>\n {children}\n {renderControl?.()}\n </>\n );\n }\n\n const reason = quality?.reason;\n return (\n <span className={styles.unknown} title={reason ? `Unavailable: ${reason}` : 'Source data unavailable'}>\n <span className={styles.dot} aria-hidden=\"true\" />\n unknown\n {label ? <span className=\"visually-hidden\"> ({label})</span> : null}\n </span>\n );\n}\n\n/** Small inline badge form, for table cells / dense rows. */\nexport function EpistemicBadge({ quality, label }: { quality: SourceQuality | undefined; label?: string }): ReactNode {\n if (isKnown(quality)) return null;\n return (\n <span className={styles.badge} title={quality?.reason ?? 'Source data unavailable'}>\n {label ? `${label}: ` : ''}unknown\n </span>\n );\n}\n"],"mappings":"6HCkBA,SAAgB,EAAQ,EAA6C,CAEnE,MADA,CAAK,GACE,EAAQ,cAAgB,WAAa,EAAQ,WAAa,EACnE,CAkBA,SAAgB,EAAU,CAAE,UAAS,WAAU,gBAAe,SAAoC,CAChG,GAAI,EAAQ,CAAO,EACjB,OACE,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,EACA,IAAgB,CACjB,CAAA,CAAA,EAIN,IAAM,EAAS,GAAS,OACxB,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,MAAO,EAAS,gBAAgB,IAAW,0BAA5E,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,IAAK,cAAY,MAAQ,CAAA,EAAC,UAEjD,GAAQ,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAU,kBAAhB,SAAA,CAAkC,KAAG,EAAM,GAAO,CAAI,CAAA,EAAA,IAC3D,GAEV,CAGA,SAAgB,EAAe,CAAE,UAAS,SAA4E,CAEpH,OADI,EAAQ,CAAO,EAAU,MAE3B,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,MAAO,GAAS,QAAU,0BAAzD,SAAA,CACG,EAAQ,GAAG,EAAM,IAAM,GAAG,SACvB,GAEV"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,c as t,n}from"./index-
|
|
2
|
-
//# sourceMappingURL=EvidenceTimeline-
|
|
1
|
+
import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{g as r,h as i,l as a,o}from"./global-CMNW_dqn.js";import{n as s}from"./StatusBadge-CXsYqmdU.js";import{v as c}from"./context-model-CokrgEUq.js";import{n as l}from"./Button-D90dzI_o.js";import{_ as u,c as d}from"./icons-D1sYbCTQ.js";import{r as f}from"./types-IYKrYLku.js";import{t as p}from"./Sheet-BZ2AG4Eo.js";import{T as m,_ as h}from"./cloud-model-BDivRMqv.js";var g=t(e(),1);function _(e){return`/api/verse/cloud/tasks/${encodeURIComponent(e)}/timeline`}var v=[`objective`,`launch`,`worker`,`report`,`pr`,`diff`,`checks`,`gates`,`merge`,`release`,`health`,`cost`],y={verified:`Verified`,claim:`Claim`,estimate:`Estimate`,unknown:`Unknown`},b={verified:`Read from a record Verse or GitHub wrote, not from the session.`,claim:`The cloud session’s own say-so. Nothing checked it.`,estimate:`An estimate fixed at launch; the real balance is on claude.ai.`,unknown:`Nothing was recorded, or the record could not be read.`},x={objective:`Objective`,launch:`Session`,worker:`Worker`,report:`Report`,pr:`Pull request`,diff:`Diff`,checks:`Checks`,gates:`Merge gates`,merge:`Merge`,release:`Release`,health:`Health`,cost:`Cost`};function S(e){return e.verified===!0?`verified`:e.verified===!1?e.kind===`cost`?`estimate`:`claim`:`unknown`}var C=[!0,!1,`unknown`];function w(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function T(e){if(!w(e))return null;let t=e.kind;if(typeof t!=`string`||!v.includes(t)||!C.includes(e.verified)||typeof e.title!=`string`||typeof e.detail!=`string`||typeof e.source!=`string`||e.at!==null&&typeof e.at!=`string`)return null;let n={kind:t,at:e.at,title:e.title,detail:e.detail,source:e.source,verified:e.verified,reached:e.reached!==!1},r=e.link;if(w(r)&&typeof r.href==`string`&&typeof r.label==`string`){let e=h(r.href,`github.com`)??h(r.href,`claude.ai`);e&&(n.link={href:e,label:r.label})}return n}function E(e){if(!w(e)||e.v!==1||typeof e.taskId!=`string`||!Array.isArray(e.steps))return null;let t=e.steps.map(T).filter(e=>e!==null);return{v:1,generatedAt:typeof e.generatedAt==`string`?e.generatedAt:``,taskId:e.taskId,repo:typeof e.repo==`string`?e.repo:``,title:typeof e.title==`string`?e.title:``,state:typeof e.state==`string`?e.state:``,steps:t}}function D(e,t=Date.now()){return c(e.at,t)}function O(e){return m(e)}function k(e){let t=0,n=0,r=0;for(let i of e){if(!i.reached)continue;let e=S(i);e===`verified`?t+=1:e===`unknown`?r+=1:n+=1}let i=[`${t} verified`];return n>0&&i.push(`${n} ${n===1?`claim or estimate`:`claims or estimates`}`),r>0&&i.push(`${r} unknown`),{verified:t,claims:n,unknown:r,text:i.join(` · `)}}var A={summaryRow:`_summaryRow_71hqu_11`,summary:`_summary_71hqu_11`,muted:`_muted_71hqu_20`,notice:`_notice_71hqu_27`,steps:`_steps_71hqu_38`,step:`_step_71hqu_38`,rail:`_rail_71hqu_52`,node:`_node_71hqu_59`,line:`_line_71hqu_82`,content:`_content_71hqu_90`,head:`_head_71hqu_98`,label:`_label_71hqu_105`,badge:`_badge_71hqu_112`,title:`_title_71hqu_117`,detail:`_detail_71hqu_131`,meta:`_meta_71hqu_139`,link:`_link_71hqu_155`},j=n(),M={verified:`success`,claim:`warning`,estimate:`neutral`,unknown:`unknown`};function N(e){return e instanceof o?e.status===404?`Verse has no evidence for this task — it is not in the task store, or this build has no timeline yet.`:e.status===503?`The timeline failed to load on the server.`:`The timeline answered HTTP ${e.status}.`:`The timeline could not be reached.`}function P(e){return{key:`verse-cloud-timeline-${e}`,fetch:async t=>{if(!f.test(e))return{timeline:null,reason:`That task id is not one Verse issued.`};try{let n=E(await a(_(e),t));return n?{timeline:n,reason:null}:{timeline:null,reason:`Unrecognized response — update Ashlr.`}}catch(e){if(e instanceof o&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{timeline:null,reason:N(e)}}}}}function F({step:e,now:t,last:n}){let r=S(e),i=D(e,t),a=O(e.detail);return(0,j.jsxs)(`li`,{className:A.step,"data-badge":r,"data-reached":e.reached?`true`:`false`,"data-kind":e.kind,children:[(0,j.jsxs)(`span`,{className:A.rail,"aria-hidden":`true`,children:[(0,j.jsx)(`span`,{className:A.node}),n?null:(0,j.jsx)(`span`,{className:A.line})]}),(0,j.jsxs)(`div`,{className:A.content,children:[(0,j.jsxs)(`div`,{className:A.head,children:[(0,j.jsx)(`span`,{className:A.label,children:x[e.kind]}),(0,j.jsx)(`span`,{className:A.badge,title:b[r],children:(0,j.jsx)(s,{status:r,tone:M[r],children:r===`verified`?`✓ ${y[r]}`:y[r]})})]}),(0,j.jsx)(`p`,{className:A.title,children:O(e.title)}),a?(0,j.jsx)(`p`,{className:A.detail,children:a}):null,(0,j.jsxs)(`p`,{className:A.meta,children:[(0,j.jsx)(`span`,{children:e.source}),i?(0,j.jsx)(`span`,{children:i}):null,e.link?(0,j.jsxs)(`a`,{className:A.link,href:e.link.href,target:`_blank`,rel:`noreferrer noopener`,children:[e.link.label,` `,(0,j.jsx)(d,{width:11,height:11,"aria-hidden":`true`})]}):null]})]})]})}function I({taskId:e,now:t}){let n=(0,g.useMemo)(()=>P(e),[e]),a=i(n,{freshMs:15e3}),o=r(n),s=a.data?.timeline??null,c=s?k(s.steps):null;return!a.data&&!a.error?(0,j.jsx)(`p`,{className:A.muted,"aria-busy":`true`,children:`Reading the evidence…`}):s?(0,j.jsxs)(j.Fragment,{children:[(0,j.jsxs)(`div`,{className:A.summaryRow,children:[(0,j.jsx)(`p`,{className:A.summary,children:c?.text}),(0,j.jsx)(l,{size:`sm`,variant:`ghost`,icon:(0,j.jsx)(u,{width:14,height:14}),"aria-label":`Re-read the evidence`,onClick:o})]}),(0,j.jsx)(`ol`,{className:A.steps,"aria-label":`Evidence, from objective to cost`,children:s.steps.map((e,n)=>(0,j.jsx)(F,{step:e,now:t,last:n===s.steps.length-1},e.kind))})]}):(0,j.jsx)(`p`,{className:A.notice,role:`note`,children:a.data?.reason??a.error?.message??`The timeline did not answer.`})}function L({taskId:e,title:t,open:n,onClose:r,now:i=Date.now()}){let a=(0,g.useId)();return(0,j.jsx)(p,{open:n,onClose:r,titleId:a,width:520,title:`Evidence`,description:t,children:n?(0,j.jsx)(I,{taskId:e,now:i}):null})}export{L as EvidenceTimeline,L as default,P as cloudTimelineQuery};
|
|
2
|
+
//# sourceMappingURL=EvidenceTimeline-DXmmz6Fi.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EvidenceTimeline-sCCAdnBK.js","names":[],"sources":["../../../../../../src/core/cloud/timeline-types.ts","../../../../../../src/web-ui/routes/verse/cloud/timeline-model.ts","../../../../../../src/web-ui/routes/verse/cloud/evidence-timeline.module.css","../../../../../../src/web-ui/routes/verse/cloud/EvidenceTimeline.tsx"],"sourcesContent":["/**\n * Cloud task evidence timeline — the HTTP contract (3.13).\n *\n * GET /api/verse/cloud/tasks/<id>/timeline → CloudTimelineResponse\n *\n * One ordered chain per cloud task, from the objective to what it cost:\n *\n * objective → launch → worker (model / account) → report (a CLAIM) → PR\n * → diff → checks → merge gates → merge → release → health → cost\n *\n * Every step says where it came from (`source`) and how much it can be\n * trusted (`verified`):\n * true a record Verse (or GitHub, through the tracker) wrote itself —\n * the task store, the fleet merge record, the hash-chained\n * authority ledger, the post-merge watch, local git.\n * false someone's say-so. The session's own report is ALWAYS this,\n * and so is the cost, which is an estimate fixed at launch.\n * 'unknown' nothing was recorded, or the record could not be read.\n *\n * Steps are always present and always in this order, so the chain reads the\n * same for every task; a stage the task has not reached says so\n * (`reached: false`) instead of disappearing.\n *\n * NODE-FREE on purpose: the web UI imports these types and the path helper.\n */\n\nexport const CLOUD_TIMELINE_SCHEMA_VERSION = 1 as const;\n\n/** `/api/verse/cloud/tasks/<id>/timeline` — the id is checked against CLOUD_TASK_ID_PATTERN by the route. */\nexport const CLOUD_TIMELINE_PATH_RE = /^\\/api\\/verse\\/cloud\\/tasks\\/([^/]+)\\/timeline$/;\n\nexport function cloudTimelinePath(taskId: string): string {\n return `/api/verse/cloud/tasks/${encodeURIComponent(taskId)}/timeline`;\n}\n\nexport type TimelineStepKind =\n | 'objective'\n | 'launch'\n | 'worker'\n | 'report'\n | 'pr'\n | 'diff'\n | 'checks'\n | 'gates'\n | 'merge'\n | 'release'\n | 'health'\n | 'cost';\n\n/** The fixed order every timeline uses. */\nexport const TIMELINE_STEP_ORDER: readonly TimelineStepKind[] = [\n 'objective', 'launch', 'worker', 'report', 'pr', 'diff', 'checks', 'gates', 'merge', 'release', 'health', 'cost',\n];\n\nexport type TimelineVerified = true | false | 'unknown';\n\nexport interface TimelineLink {\n /** https only: claude.ai, github.com. */\n href: string;\n label: string;\n}\n\nexport interface TimelineStep {\n kind: TimelineStepKind;\n /** ISO time the evidence was recorded; null when no time was recorded (never guessed). */\n at: string | null;\n /** One short line (\"PR #512 merged\"). */\n title: string;\n /** Plain sentences; scrubbed. May be empty. */\n detail: string;\n /** Where the evidence came from, in operator words (\"authority ledger\", \"session report\"). */\n source: string;\n verified: TimelineVerified;\n /** False while the task has not reached this stage (it may never). */\n reached: boolean;\n link?: TimelineLink;\n}\n\nexport interface CloudTimelineResponse {\n v: typeof CLOUD_TIMELINE_SCHEMA_VERSION;\n generatedAt: string;\n taskId: string;\n repo: string;\n title: string;\n state: string;\n steps: TimelineStep[];\n}\n","/**\n * routes/verse/cloud/timeline-model.ts — the evidence timeline's words and\n * decisions as pure functions (3.13; server: core/cloud/timeline.ts). No React.\n *\n * Copy rules, on top of the cloud lane's (cloud-model.ts):\n * - every step carries a WORD for how far it can be trusted — \"Verified\",\n * \"Claim\", \"Estimate\" or \"Unknown\" — never a colour or an icon alone;\n * - the session's report is a claim and the cost an estimate, whatever the\n * server sends: the badge is derived from `verified`, and `false` can only\n * ever read as Claim / Estimate;\n * - times are local and relative; a step with no recorded time shows none\n * (it is never back-filled from a neighbour).\n */\nimport {\n TIMELINE_STEP_ORDER,\n type CloudTimelineResponse,\n type TimelineStep,\n type TimelineStepKind,\n type TimelineVerified,\n} from '../../../../core/cloud/timeline-types.js';\nimport { scrubSecrets } from '../../../../core/util/scrub.js';\nimport { relativePhrase } from '../context/context-model.js';\nimport { safeHref } from './cloud-model.js';\n\nexport type TimelineBadge = 'verified' | 'claim' | 'estimate' | 'unknown';\n\nexport const BADGE_WORD: Record<TimelineBadge, string> = {\n verified: 'Verified',\n claim: 'Claim',\n estimate: 'Estimate',\n unknown: 'Unknown',\n};\n\n/** Tooltip / screen-reader sentence for each badge. */\nexport const BADGE_MEANING: Record<TimelineBadge, string> = {\n verified: 'Read from a record Verse or GitHub wrote, not from the session.',\n claim: 'The cloud session’s own say-so. Nothing checked it.',\n estimate: 'An estimate fixed at launch; the real balance is on claude.ai.',\n unknown: 'Nothing was recorded, or the record could not be read.',\n};\n\nexport const STEP_LABEL: Record<TimelineStepKind, string> = {\n objective: 'Objective',\n launch: 'Session',\n worker: 'Worker',\n report: 'Report',\n pr: 'Pull request',\n diff: 'Diff',\n checks: 'Checks',\n gates: 'Merge gates',\n merge: 'Merge',\n release: 'Release',\n health: 'Health',\n cost: 'Cost',\n};\n\nexport function badgeFor(step: Pick<TimelineStep, 'kind' | 'verified'>): TimelineBadge {\n if (step.verified === true) return 'verified';\n if (step.verified === false) return step.kind === 'cost' ? 'estimate' : 'claim';\n return 'unknown';\n}\n\nconst VERIFIED_VALUES: readonly TimelineVerified[] = [true, false, 'unknown'];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction narrowStep(raw: unknown): TimelineStep | null {\n if (!isRecord(raw)) return null;\n const kind = raw['kind'];\n if (typeof kind !== 'string' || !(TIMELINE_STEP_ORDER as readonly string[]).includes(kind)) return null;\n if (!VERIFIED_VALUES.includes(raw['verified'] as TimelineVerified)) return null;\n if (typeof raw['title'] !== 'string' || typeof raw['detail'] !== 'string' || typeof raw['source'] !== 'string') return null;\n if (raw['at'] !== null && typeof raw['at'] !== 'string') return null;\n const step: TimelineStep = {\n kind: kind as TimelineStepKind,\n at: raw['at'] as string | null,\n title: raw['title'],\n detail: raw['detail'],\n source: raw['source'],\n verified: raw['verified'] as TimelineVerified,\n reached: raw['reached'] !== false,\n };\n const link = raw['link'];\n if (isRecord(link) && typeof link['href'] === 'string' && typeof link['label'] === 'string') {\n // Only these hosts ever become links, whatever the server sent.\n const href = safeHref(link['href'], 'github.com') ?? safeHref(link['href'], 'claude.ai');\n if (href) step.link = { href, label: link['label'] };\n }\n return step;\n}\n\n/**\n * Just enough structure that no render can crash; an unknown step kind or a\n * malformed step is dropped rather than guessed at. Null when the envelope\n * itself is unrecognisable.\n */\nexport function narrowTimeline(raw: unknown): CloudTimelineResponse | null {\n if (!isRecord(raw) || raw['v'] !== 1 || typeof raw['taskId'] !== 'string' || !Array.isArray(raw['steps'])) return null;\n const steps = raw['steps'].map(narrowStep).filter((s): s is TimelineStep => s !== null);\n return {\n v: 1,\n generatedAt: typeof raw['generatedAt'] === 'string' ? raw['generatedAt'] : '',\n taskId: raw['taskId'],\n repo: typeof raw['repo'] === 'string' ? raw['repo'] : '',\n title: typeof raw['title'] === 'string' ? raw['title'] : '',\n state: typeof raw['state'] === 'string' ? raw['state'] : '',\n steps,\n };\n}\n\n/** \"5m ago\" / \"on Sep 24\", or null when the step recorded no time. */\nexport function stepWhen(step: Pick<TimelineStep, 'at'>, now: number = Date.now()): string | null {\n return relativePhrase(step.at, now);\n}\n\n/** Server prose is already scrubbed; scrub again so the panel is safe outside the HTTP sanitizer too. */\nexport function stepText(text: string): string {\n return scrubSecrets(text);\n}\n\nexport interface TimelineSummary {\n verified: number;\n claims: number;\n unknown: number;\n /** \"7 verified · 2 claims · 3 unknown\" */\n text: string;\n}\n\n/** Counts over the stages the task has REACHED — pending stages are not \"unknown evidence\". */\nexport function timelineSummary(steps: readonly TimelineStep[]): TimelineSummary {\n let verified = 0;\n let claims = 0;\n let unknown = 0;\n for (const step of steps) {\n if (!step.reached) continue;\n const badge = badgeFor(step);\n if (badge === 'verified') verified += 1;\n else if (badge === 'unknown') unknown += 1;\n else claims += 1;\n }\n const parts = [`${verified} verified`];\n if (claims > 0) parts.push(`${claims} ${claims === 1 ? 'claim or estimate' : 'claims or estimates'}`);\n if (unknown > 0) parts.push(`${unknown} unknown`);\n return { verified, claims, unknown, text: parts.join(' · ') };\n}\n","/*\n * routes/verse/cloud/evidence-timeline.module.css — a cloud task's evidence\n * chain (3.13). Tokens only (style-scan-310): no raw hex colour, no px font\n * size, every colour follows the theme. Long text wraps at word boundaries;\n * nothing is ellipsized — evidence is read, not skimmed.\n *\n * The rail: a filled node for a reached stage (its colour follows the trust\n * badge), a hollow one for a stage not reached, joined by a hairline.\n */\n\n.summaryRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n margin-bottom: var(--space-3);\n}\n\n.summary,\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.notice {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n overflow-wrap: break-word;\n}\n\n.steps {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.step {\n display: grid;\n grid-template-columns: var(--space-4) minmax(0, 1fr);\n gap: 0 var(--space-3);\n}\n\n.rail {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: var(--space-1);\n}\n\n.node {\n width: 9px;\n height: 9px;\n flex-shrink: 0;\n border: 1.5px solid var(--border-strong);\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n\n.step[data-badge='verified'] .node {\n border-color: var(--status-success-solid);\n background: var(--status-success-solid);\n}\n\n.step[data-badge='claim'] .node {\n border-color: var(--status-warning-solid);\n background: var(--status-warning-solid);\n}\n\n.step[data-reached='false'] .node {\n background: var(--bg-surface);\n}\n\n.line {\n flex: 1 1 auto;\n width: 1px;\n min-height: var(--space-3);\n margin-top: var(--space-1);\n background: var(--border-subtle);\n}\n\n.content {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n padding-bottom: var(--space-4);\n}\n\n.head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.label {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n line-height: var(--text-xs-line);\n}\n\n.badge {\n display: inline-flex;\n flex-shrink: 0;\n}\n\n.title {\n margin: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n line-height: var(--text-sm-line);\n overflow-wrap: break-word;\n}\n\n.step[data-reached='false'] .title {\n color: var(--text-secondary);\n font-weight: var(--font-weight-regular);\n}\n\n.detail {\n margin: 0;\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n overflow-wrap: break-word;\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-1) var(--space-2);\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.meta > span + span::before {\n content: '·';\n margin-right: var(--space-2);\n}\n\n.link {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n color: var(--text-link);\n text-decoration: none;\n white-space: nowrap;\n}\n\n.link:hover {\n text-decoration: underline;\n}\n\n.link:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}\n","/**\n * routes/verse/cloud/EvidenceTimeline.tsx — one cloud task's evidence chain\n * (3.13), in a side sheet opened from its row on Command's cloud card.\n *\n * Evidence [↻] [×]\n * Fix the flaky tracker test · ashlrai/ashlr-hub\n * 7 verified · 2 claims or estimates · 1 unknown\n * ● Objective Fix the flaky tracker test Verified\n * │ From New cloud task, requested by mason…\n * │ cloud task record · 2h ago\n * ● Report Session reports “done” (unverified) Claim\n * ○ Release Release unknown Unknown\n * …\n *\n * Reads GET /api/verse/cloud/tasks/<id>/timeline (core/cloud/timeline-api.ts)\n * only while open. Every step shows a trust WORD (timeline-model.ts): the\n * session's report is always a Claim and the cost an Estimate. Stages the\n * task has not reached are drawn hollow and quiet, never hidden, so the\n * chain always reads end to end.\n *\n * LAZY: CloudCard imports this with React.lazy, so none of it costs chat\n * first-paint bytes (cloud-queries.ts rule).\n */\nimport { useId, useMemo } from 'react';\nimport { cloudTimelinePath, type CloudTimelineResponse, type TimelineStep } from '../../../../core/cloud/timeline-types.js';\nimport { CLOUD_TASK_ID_PATTERN } from '../../../../core/cloud/types.js';\nimport { IconButton } from '../../../components/primitives/Button.js';\nimport { IconExternalLink, IconRefresh } from '../../../components/primitives/icons.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport { ApiError, apiGet } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport {\n BADGE_MEANING,\n BADGE_WORD,\n badgeFor,\n narrowTimeline,\n STEP_LABEL,\n stepText,\n stepWhen,\n timelineSummary,\n type TimelineBadge,\n} from './timeline-model.js';\nimport styles from './evidence-timeline.module.css';\n\nconst BADGE_TONE: Record<TimelineBadge, Tone> = {\n verified: 'success',\n claim: 'warning',\n estimate: 'neutral',\n unknown: 'unknown',\n};\n\nexport type TimelineRead = { timeline: CloudTimelineResponse; reason: null } | { timeline: null; reason: string };\n\n/** Operator words for a timeline read that did not answer — never a path, never a trace. */\nfunction absence(err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) return 'Verse has no evidence for this task — it is not in the task store, or this build has no timeline yet.';\n if (err.status === 503) return 'The timeline failed to load on the server.';\n return `The timeline answered HTTP ${err.status}.`;\n }\n return 'The timeline could not be reached.';\n}\n\nexport function cloudTimelineQuery(taskId: string): QueryDef<TimelineRead> {\n return {\n key: `verse-cloud-timeline-${taskId}`,\n fetch: async (signal) => {\n // The id came from the server, but it is spliced into a request path.\n if (!CLOUD_TASK_ID_PATTERN.test(taskId)) return { timeline: null, reason: 'That task id is not one Verse issued.' };\n try {\n const timeline = narrowTimeline(await apiGet<unknown>(cloudTimelinePath(taskId), signal));\n return timeline ? { timeline, reason: null } : { timeline: null, reason: 'Unrecognized response — update Ashlr.' };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { timeline: null, reason: absence(err) };\n }\n },\n };\n}\n\nfunction StepRow({ step, now, last }: { step: TimelineStep; now: number; last: boolean }) {\n const badge = badgeFor(step);\n const when = stepWhen(step, now);\n const detail = stepText(step.detail);\n return (\n <li className={styles.step} data-badge={badge} data-reached={step.reached ? 'true' : 'false'} data-kind={step.kind}>\n <span className={styles.rail} aria-hidden=\"true\">\n <span className={styles.node} />\n {last ? null : <span className={styles.line} />}\n </span>\n <div className={styles.content}>\n <div className={styles.head}>\n <span className={styles.label}>{STEP_LABEL[step.kind]}</span>\n <span className={styles.badge} title={BADGE_MEANING[badge]}>\n <StatusBadge status={badge} tone={BADGE_TONE[badge]}>\n {badge === 'verified' ? `✓ ${BADGE_WORD[badge]}` : BADGE_WORD[badge]}\n </StatusBadge>\n </span>\n </div>\n <p className={styles.title}>{stepText(step.title)}</p>\n {detail ? <p className={styles.detail}>{detail}</p> : null}\n <p className={styles.meta}>\n <span>{step.source}</span>\n {when ? <span>{when}</span> : null}\n {step.link ? (\n <a className={styles.link} href={step.link.href} target=\"_blank\" rel=\"noreferrer noopener\">\n {step.link.label} <IconExternalLink width={11} height={11} aria-hidden=\"true\" />\n </a>\n ) : null}\n </p>\n </div>\n </li>\n );\n}\n\nexport interface EvidenceTimelineProps {\n taskId: string;\n /** The row's title, shown while the timeline loads. */\n title: string;\n open: boolean;\n onClose: () => void;\n now?: number;\n}\n\nfunction Body({ taskId, now }: { taskId: string; now: number }) {\n const def = useMemo(() => cloudTimelineQuery(taskId), [taskId]);\n const read = useQuery(def, { freshMs: 15_000 });\n const refetch = useRefetch(def);\n const timeline = read.data?.timeline ?? null;\n const summary = timeline ? timelineSummary(timeline.steps) : null;\n if (!read.data && !read.error) return <p className={styles.muted} aria-busy=\"true\">Reading the evidence…</p>;\n if (!timeline) {\n return <p className={styles.notice} role=\"note\">{read.data?.reason ?? read.error?.message ?? 'The timeline did not answer.'}</p>;\n }\n return (\n <>\n <div className={styles.summaryRow}>\n <p className={styles.summary}>{summary?.text}</p>\n <IconButton size=\"sm\" variant=\"ghost\" icon={<IconRefresh width={14} height={14} />} aria-label=\"Re-read the evidence\" onClick={refetch} />\n </div>\n <ol className={styles.steps} aria-label=\"Evidence, from objective to cost\">\n {timeline.steps.map((step, i) => (\n <StepRow key={step.kind} step={step} now={now} last={i === timeline.steps.length - 1} />\n ))}\n </ol>\n </>\n );\n}\n\nexport function EvidenceTimeline({ taskId, title, open, onClose, now = Date.now() }: EvidenceTimelineProps) {\n const titleId = useId();\n return (\n <Sheet open={open} onClose={onClose} titleId={titleId} width={520} title=\"Evidence\" description={title}>\n {open ? <Body taskId={taskId} now={now} /> : null}\n </Sheet>\n );\n}\n\nexport default EvidenceTimeline;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"EvidenceTimeline-DXmmz6Fi.js","names":[],"sources":["../../../../../../src/core/cloud/timeline-types.ts","../../../../../../src/web-ui/routes/verse/cloud/timeline-model.ts","../../../../../../src/web-ui/routes/verse/cloud/evidence-timeline.module.css","../../../../../../src/web-ui/routes/verse/cloud/EvidenceTimeline.tsx"],"sourcesContent":["/**\n * Cloud task evidence timeline — the HTTP contract (3.13).\n *\n * GET /api/verse/cloud/tasks/<id>/timeline → CloudTimelineResponse\n *\n * One ordered chain per cloud task, from the objective to what it cost:\n *\n * objective → launch → worker (model / account) → report (a CLAIM) → PR\n * → diff → checks → merge gates → merge → release → health → cost\n *\n * Every step says where it came from (`source`) and how much it can be\n * trusted (`verified`):\n * true a record Verse (or GitHub, through the tracker) wrote itself —\n * the task store, the fleet merge record, the hash-chained\n * authority ledger, the post-merge watch, local git.\n * false someone's say-so. The session's own report is ALWAYS this,\n * and so is the cost, which is an estimate fixed at launch.\n * 'unknown' nothing was recorded, or the record could not be read.\n *\n * Steps are always present and always in this order, so the chain reads the\n * same for every task; a stage the task has not reached says so\n * (`reached: false`) instead of disappearing.\n *\n * NODE-FREE on purpose: the web UI imports these types and the path helper.\n */\n\nexport const CLOUD_TIMELINE_SCHEMA_VERSION = 1 as const;\n\n/** `/api/verse/cloud/tasks/<id>/timeline` — the id is checked against CLOUD_TASK_ID_PATTERN by the route. */\nexport const CLOUD_TIMELINE_PATH_RE = /^\\/api\\/verse\\/cloud\\/tasks\\/([^/]+)\\/timeline$/;\n\nexport function cloudTimelinePath(taskId: string): string {\n return `/api/verse/cloud/tasks/${encodeURIComponent(taskId)}/timeline`;\n}\n\nexport type TimelineStepKind =\n | 'objective'\n | 'launch'\n | 'worker'\n | 'report'\n | 'pr'\n | 'diff'\n | 'checks'\n | 'gates'\n | 'merge'\n | 'release'\n | 'health'\n | 'cost';\n\n/** The fixed order every timeline uses. */\nexport const TIMELINE_STEP_ORDER: readonly TimelineStepKind[] = [\n 'objective', 'launch', 'worker', 'report', 'pr', 'diff', 'checks', 'gates', 'merge', 'release', 'health', 'cost',\n];\n\nexport type TimelineVerified = true | false | 'unknown';\n\nexport interface TimelineLink {\n /** https only: claude.ai, github.com. */\n href: string;\n label: string;\n}\n\nexport interface TimelineStep {\n kind: TimelineStepKind;\n /** ISO time the evidence was recorded; null when no time was recorded (never guessed). */\n at: string | null;\n /** One short line (\"PR #512 merged\"). */\n title: string;\n /** Plain sentences; scrubbed. May be empty. */\n detail: string;\n /** Where the evidence came from, in operator words (\"authority ledger\", \"session report\"). */\n source: string;\n verified: TimelineVerified;\n /** False while the task has not reached this stage (it may never). */\n reached: boolean;\n link?: TimelineLink;\n}\n\nexport interface CloudTimelineResponse {\n v: typeof CLOUD_TIMELINE_SCHEMA_VERSION;\n generatedAt: string;\n taskId: string;\n repo: string;\n title: string;\n state: string;\n steps: TimelineStep[];\n}\n","/**\n * routes/verse/cloud/timeline-model.ts — the evidence timeline's words and\n * decisions as pure functions (3.13; server: core/cloud/timeline.ts). No React.\n *\n * Copy rules, on top of the cloud lane's (cloud-model.ts):\n * - every step carries a WORD for how far it can be trusted — \"Verified\",\n * \"Claim\", \"Estimate\" or \"Unknown\" — never a colour or an icon alone;\n * - the session's report is a claim and the cost an estimate, whatever the\n * server sends: the badge is derived from `verified`, and `false` can only\n * ever read as Claim / Estimate;\n * - times are local and relative; a step with no recorded time shows none\n * (it is never back-filled from a neighbour).\n */\nimport {\n TIMELINE_STEP_ORDER,\n type CloudTimelineResponse,\n type TimelineStep,\n type TimelineStepKind,\n type TimelineVerified,\n} from '../../../../core/cloud/timeline-types.js';\nimport { scrubSecrets } from '../../../../core/util/scrub.js';\nimport { relativePhrase } from '../context/context-model.js';\nimport { safeHref } from './cloud-model.js';\n\nexport type TimelineBadge = 'verified' | 'claim' | 'estimate' | 'unknown';\n\nexport const BADGE_WORD: Record<TimelineBadge, string> = {\n verified: 'Verified',\n claim: 'Claim',\n estimate: 'Estimate',\n unknown: 'Unknown',\n};\n\n/** Tooltip / screen-reader sentence for each badge. */\nexport const BADGE_MEANING: Record<TimelineBadge, string> = {\n verified: 'Read from a record Verse or GitHub wrote, not from the session.',\n claim: 'The cloud session’s own say-so. Nothing checked it.',\n estimate: 'An estimate fixed at launch; the real balance is on claude.ai.',\n unknown: 'Nothing was recorded, or the record could not be read.',\n};\n\nexport const STEP_LABEL: Record<TimelineStepKind, string> = {\n objective: 'Objective',\n launch: 'Session',\n worker: 'Worker',\n report: 'Report',\n pr: 'Pull request',\n diff: 'Diff',\n checks: 'Checks',\n gates: 'Merge gates',\n merge: 'Merge',\n release: 'Release',\n health: 'Health',\n cost: 'Cost',\n};\n\nexport function badgeFor(step: Pick<TimelineStep, 'kind' | 'verified'>): TimelineBadge {\n if (step.verified === true) return 'verified';\n if (step.verified === false) return step.kind === 'cost' ? 'estimate' : 'claim';\n return 'unknown';\n}\n\nconst VERIFIED_VALUES: readonly TimelineVerified[] = [true, false, 'unknown'];\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nfunction narrowStep(raw: unknown): TimelineStep | null {\n if (!isRecord(raw)) return null;\n const kind = raw['kind'];\n if (typeof kind !== 'string' || !(TIMELINE_STEP_ORDER as readonly string[]).includes(kind)) return null;\n if (!VERIFIED_VALUES.includes(raw['verified'] as TimelineVerified)) return null;\n if (typeof raw['title'] !== 'string' || typeof raw['detail'] !== 'string' || typeof raw['source'] !== 'string') return null;\n if (raw['at'] !== null && typeof raw['at'] !== 'string') return null;\n const step: TimelineStep = {\n kind: kind as TimelineStepKind,\n at: raw['at'] as string | null,\n title: raw['title'],\n detail: raw['detail'],\n source: raw['source'],\n verified: raw['verified'] as TimelineVerified,\n reached: raw['reached'] !== false,\n };\n const link = raw['link'];\n if (isRecord(link) && typeof link['href'] === 'string' && typeof link['label'] === 'string') {\n // Only these hosts ever become links, whatever the server sent.\n const href = safeHref(link['href'], 'github.com') ?? safeHref(link['href'], 'claude.ai');\n if (href) step.link = { href, label: link['label'] };\n }\n return step;\n}\n\n/**\n * Just enough structure that no render can crash; an unknown step kind or a\n * malformed step is dropped rather than guessed at. Null when the envelope\n * itself is unrecognisable.\n */\nexport function narrowTimeline(raw: unknown): CloudTimelineResponse | null {\n if (!isRecord(raw) || raw['v'] !== 1 || typeof raw['taskId'] !== 'string' || !Array.isArray(raw['steps'])) return null;\n const steps = raw['steps'].map(narrowStep).filter((s): s is TimelineStep => s !== null);\n return {\n v: 1,\n generatedAt: typeof raw['generatedAt'] === 'string' ? raw['generatedAt'] : '',\n taskId: raw['taskId'],\n repo: typeof raw['repo'] === 'string' ? raw['repo'] : '',\n title: typeof raw['title'] === 'string' ? raw['title'] : '',\n state: typeof raw['state'] === 'string' ? raw['state'] : '',\n steps,\n };\n}\n\n/** \"5m ago\" / \"on Sep 24\", or null when the step recorded no time. */\nexport function stepWhen(step: Pick<TimelineStep, 'at'>, now: number = Date.now()): string | null {\n return relativePhrase(step.at, now);\n}\n\n/** Server prose is already scrubbed; scrub again so the panel is safe outside the HTTP sanitizer too. */\nexport function stepText(text: string): string {\n return scrubSecrets(text);\n}\n\nexport interface TimelineSummary {\n verified: number;\n claims: number;\n unknown: number;\n /** \"7 verified · 2 claims · 3 unknown\" */\n text: string;\n}\n\n/** Counts over the stages the task has REACHED — pending stages are not \"unknown evidence\". */\nexport function timelineSummary(steps: readonly TimelineStep[]): TimelineSummary {\n let verified = 0;\n let claims = 0;\n let unknown = 0;\n for (const step of steps) {\n if (!step.reached) continue;\n const badge = badgeFor(step);\n if (badge === 'verified') verified += 1;\n else if (badge === 'unknown') unknown += 1;\n else claims += 1;\n }\n const parts = [`${verified} verified`];\n if (claims > 0) parts.push(`${claims} ${claims === 1 ? 'claim or estimate' : 'claims or estimates'}`);\n if (unknown > 0) parts.push(`${unknown} unknown`);\n return { verified, claims, unknown, text: parts.join(' · ') };\n}\n","/*\n * routes/verse/cloud/evidence-timeline.module.css — a cloud task's evidence\n * chain (3.13). Tokens only (style-scan-310): no raw hex colour, no px font\n * size, every colour follows the theme. Long text wraps at word boundaries;\n * nothing is ellipsized — evidence is read, not skimmed.\n *\n * The rail: a filled node for a reached stage (its colour follows the trust\n * badge), a hollow one for a stage not reached, joined by a hairline.\n */\n\n.summaryRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n margin-bottom: var(--space-3);\n}\n\n.summary,\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.notice {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n overflow-wrap: break-word;\n}\n\n.steps {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.step {\n display: grid;\n grid-template-columns: var(--space-4) minmax(0, 1fr);\n gap: 0 var(--space-3);\n}\n\n.rail {\n display: flex;\n flex-direction: column;\n align-items: center;\n padding-top: var(--space-1);\n}\n\n.node {\n width: 9px;\n height: 9px;\n flex-shrink: 0;\n border: 1.5px solid var(--border-strong);\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n\n.step[data-badge='verified'] .node {\n border-color: var(--status-success-solid);\n background: var(--status-success-solid);\n}\n\n.step[data-badge='claim'] .node {\n border-color: var(--status-warning-solid);\n background: var(--status-warning-solid);\n}\n\n.step[data-reached='false'] .node {\n background: var(--bg-surface);\n}\n\n.line {\n flex: 1 1 auto;\n width: 1px;\n min-height: var(--space-3);\n margin-top: var(--space-1);\n background: var(--border-subtle);\n}\n\n.content {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n padding-bottom: var(--space-4);\n}\n\n.head {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.label {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n line-height: var(--text-xs-line);\n}\n\n.badge {\n display: inline-flex;\n flex-shrink: 0;\n}\n\n.title {\n margin: 0;\n color: var(--text-primary);\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n line-height: var(--text-sm-line);\n overflow-wrap: break-word;\n}\n\n.step[data-reached='false'] .title {\n color: var(--text-secondary);\n font-weight: var(--font-weight-regular);\n}\n\n.detail {\n margin: 0;\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line-relaxed);\n overflow-wrap: break-word;\n}\n\n.meta {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-1) var(--space-2);\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n\n.meta > span + span::before {\n content: '·';\n margin-right: var(--space-2);\n}\n\n.link {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n color: var(--text-link);\n text-decoration: none;\n white-space: nowrap;\n}\n\n.link:hover {\n text-decoration: underline;\n}\n\n.link:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n}\n","/**\n * routes/verse/cloud/EvidenceTimeline.tsx — one cloud task's evidence chain\n * (3.13), in a side sheet opened from its row on Command's cloud card.\n *\n * Evidence [↻] [×]\n * Fix the flaky tracker test · ashlrai/ashlr-hub\n * 7 verified · 2 claims or estimates · 1 unknown\n * ● Objective Fix the flaky tracker test Verified\n * │ From New cloud task, requested by mason…\n * │ cloud task record · 2h ago\n * ● Report Session reports “done” (unverified) Claim\n * ○ Release Release unknown Unknown\n * …\n *\n * Reads GET /api/verse/cloud/tasks/<id>/timeline (core/cloud/timeline-api.ts)\n * only while open. Every step shows a trust WORD (timeline-model.ts): the\n * session's report is always a Claim and the cost an Estimate. Stages the\n * task has not reached are drawn hollow and quiet, never hidden, so the\n * chain always reads end to end.\n *\n * LAZY: CloudCard imports this with React.lazy, so none of it costs chat\n * first-paint bytes (cloud-queries.ts rule).\n */\nimport { useId, useMemo } from 'react';\nimport { cloudTimelinePath, type CloudTimelineResponse, type TimelineStep } from '../../../../core/cloud/timeline-types.js';\nimport { CLOUD_TASK_ID_PATTERN } from '../../../../core/cloud/types.js';\nimport { IconButton } from '../../../components/primitives/Button.js';\nimport { IconExternalLink, IconRefresh } from '../../../components/primitives/icons.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { StatusBadge, type Tone } from '../../../components/primitives/StatusBadge.js';\nimport { ApiError, apiGet } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport {\n BADGE_MEANING,\n BADGE_WORD,\n badgeFor,\n narrowTimeline,\n STEP_LABEL,\n stepText,\n stepWhen,\n timelineSummary,\n type TimelineBadge,\n} from './timeline-model.js';\nimport styles from './evidence-timeline.module.css';\n\nconst BADGE_TONE: Record<TimelineBadge, Tone> = {\n verified: 'success',\n claim: 'warning',\n estimate: 'neutral',\n unknown: 'unknown',\n};\n\nexport type TimelineRead = { timeline: CloudTimelineResponse; reason: null } | { timeline: null; reason: string };\n\n/** Operator words for a timeline read that did not answer — never a path, never a trace. */\nfunction absence(err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) return 'Verse has no evidence for this task — it is not in the task store, or this build has no timeline yet.';\n if (err.status === 503) return 'The timeline failed to load on the server.';\n return `The timeline answered HTTP ${err.status}.`;\n }\n return 'The timeline could not be reached.';\n}\n\nexport function cloudTimelineQuery(taskId: string): QueryDef<TimelineRead> {\n return {\n key: `verse-cloud-timeline-${taskId}`,\n fetch: async (signal) => {\n // The id came from the server, but it is spliced into a request path.\n if (!CLOUD_TASK_ID_PATTERN.test(taskId)) return { timeline: null, reason: 'That task id is not one Verse issued.' };\n try {\n const timeline = narrowTimeline(await apiGet<unknown>(cloudTimelinePath(taskId), signal));\n return timeline ? { timeline, reason: null } : { timeline: null, reason: 'Unrecognized response — update Ashlr.' };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { timeline: null, reason: absence(err) };\n }\n },\n };\n}\n\nfunction StepRow({ step, now, last }: { step: TimelineStep; now: number; last: boolean }) {\n const badge = badgeFor(step);\n const when = stepWhen(step, now);\n const detail = stepText(step.detail);\n return (\n <li className={styles.step} data-badge={badge} data-reached={step.reached ? 'true' : 'false'} data-kind={step.kind}>\n <span className={styles.rail} aria-hidden=\"true\">\n <span className={styles.node} />\n {last ? null : <span className={styles.line} />}\n </span>\n <div className={styles.content}>\n <div className={styles.head}>\n <span className={styles.label}>{STEP_LABEL[step.kind]}</span>\n <span className={styles.badge} title={BADGE_MEANING[badge]}>\n <StatusBadge status={badge} tone={BADGE_TONE[badge]}>\n {badge === 'verified' ? `✓ ${BADGE_WORD[badge]}` : BADGE_WORD[badge]}\n </StatusBadge>\n </span>\n </div>\n <p className={styles.title}>{stepText(step.title)}</p>\n {detail ? <p className={styles.detail}>{detail}</p> : null}\n <p className={styles.meta}>\n <span>{step.source}</span>\n {when ? <span>{when}</span> : null}\n {step.link ? (\n <a className={styles.link} href={step.link.href} target=\"_blank\" rel=\"noreferrer noopener\">\n {step.link.label} <IconExternalLink width={11} height={11} aria-hidden=\"true\" />\n </a>\n ) : null}\n </p>\n </div>\n </li>\n );\n}\n\nexport interface EvidenceTimelineProps {\n taskId: string;\n /** The row's title, shown while the timeline loads. */\n title: string;\n open: boolean;\n onClose: () => void;\n now?: number;\n}\n\nfunction Body({ taskId, now }: { taskId: string; now: number }) {\n const def = useMemo(() => cloudTimelineQuery(taskId), [taskId]);\n const read = useQuery(def, { freshMs: 15_000 });\n const refetch = useRefetch(def);\n const timeline = read.data?.timeline ?? null;\n const summary = timeline ? timelineSummary(timeline.steps) : null;\n if (!read.data && !read.error) return <p className={styles.muted} aria-busy=\"true\">Reading the evidence…</p>;\n if (!timeline) {\n return <p className={styles.notice} role=\"note\">{read.data?.reason ?? read.error?.message ?? 'The timeline did not answer.'}</p>;\n }\n return (\n <>\n <div className={styles.summaryRow}>\n <p className={styles.summary}>{summary?.text}</p>\n <IconButton size=\"sm\" variant=\"ghost\" icon={<IconRefresh width={14} height={14} />} aria-label=\"Re-read the evidence\" onClick={refetch} />\n </div>\n <ol className={styles.steps} aria-label=\"Evidence, from objective to cost\">\n {timeline.steps.map((step, i) => (\n <StepRow key={step.kind} step={step} now={now} last={i === timeline.steps.length - 1} />\n ))}\n </ol>\n </>\n );\n}\n\nexport function EvidenceTimeline({ taskId, title, open, onClose, now = Date.now() }: EvidenceTimelineProps) {\n const titleId = useId();\n return (\n <Sheet open={open} onClose={onClose} titleId={titleId} width={520} title=\"Evidence\" description={title}>\n {open ? <Body taskId={taskId} now={now} /> : null}\n </Sheet>\n );\n}\n\nexport default EvidenceTimeline;\n"],"mappings":"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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ShadowDecisions-C5RAY91f.js","assets/autonomy-ladder.module-ArDv4bkr.js","assets/global-BlI2BYa1.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/autonomy-ladder-BGWmZzP7.css","assets/Surface-e1z6GdZt.css","assets/Advanced-DHsysoIL.js","assets/Epistemic-DMr18muX.js","assets/StatusBadge-CXsYqmdU.js","assets/ConfirmDialog-BR4nZQ2D.js","assets/Segmented-CGh_-tBb.js","assets/workspace-model-dji5-Al3.js","assets/Meter-CMj-VafN.js","assets/Select-CWnmUzs3.js","assets/fleet-model-BvDR3gjp.js","assets/fleet-queries-W2UFVMZJ.js","assets/Epistemic-OaGnEJkn.css","assets/StatusBadge-BVi0IBb9.css","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/ConfirmDialog-Dx15x0Ho.css","assets/RefreshIndicator-CVv22U_j.css","assets/Segmented-BnjHbKzH.css","assets/Meter-CYt9KpM0.css","assets/Select-DSu5ghId.css","assets/Advanced-Bywv_iYR.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{a as e,c as t,n,t as r}from"./index-DZ-UQ7v8.js";import{g as i,h as a}from"./global-CMNW_dqn.js";import{t as o}from"./RefreshIndicator-DO9ibnSq.js";import{n as s,t as c}from"./Swimlane-B9Exxekk.js";import{n as l,t as u}from"./Funnel-Dh2yVHws.js";import{L as d,kt as ee}from"./VerseConsoleApp-CWU6R3By.js";import{n as f,u as p}from"./format-CH4g_sl1.js";import{t as m}from"./Tag-DscCRFcN.js";import{n as h,t as g}from"./budget-queries-D8QV5XtH.js";import{t as _}from"./Button-D90dzI_o.js";import{a as te}from"./icons-D1sYbCTQ.js";import{n as ne,s as v,t as re}from"./AutonomyOffState-CEPSZToP.js";import{p as y}from"./cloud-model-BDivRMqv.js";import{n as b,r as x}from"./cloud-queries-BPQQ5_pJ.js";import{t as S}from"./cloud.module-DOP-N4Ch.js";import{a as C,r as ie,u as w}from"./surface-data-Dj71tdD-.js";import{t as T}from"./nav-0dOYe2rJ.js";import{a as ae,i as E,n as D,r as O,t as k}from"./Surface-BfDmQcKe.js";import{n as oe,t as se}from"./actions-CY-PjpGc.js";import{t as ce}from"./use-ticker-BBcp02SZ.js";import{a as le,r as A}from"./overnight-queries-C4wOnFtE.js";import{i as ue,n as de,r as fe,t as pe}from"./why-seat-model-M_r0wX3b.js";import{a as me,c as he,d as ge,f as j,i as _e,l as M,n as N,o as P,r as F,s as I,t as ve,u as ye}from"./live-model-D_32RAOR.js";var L=t(e(),1),R=n();function be({classes:e={}}){let t=a(x,{freshMs:15e3}),n=i(x);d(n,b);let r=t.data?.value??null;if(!r)return null;let o=y(r.tasks),s=`Claude Code cloud sessions Verse launched that have not delivered a PR yet. ${r.budget.sessionsToday} of ${r.budget.budget.maxSessionsPerDay} sessions used today.`;return(0,R.jsxs)(`li`,{className:`${e.lane??``} ${S.laneChip}`,"data-active":o>0||void 0,title:s,"aria-label":`Cloud: ${o} running`,children:[(0,R.jsx)(`span`,{className:e.name,children:`Cloud`}),(0,R.jsx)(`span`,{className:e.sep,"aria-hidden":`true`,children:` · `}),(0,R.jsxs)(`span`,{className:e.slots,children:[o,` running`]})]})}var z={stack:`_stack_j599h_5`,muted:`_muted_j599h_11`,link:`_link_j599h_18`,disclosure:`_disclosure_j599h_34`,num:`_num_j599h_39`,lanes:`_lanes_j599h_45`,lane:`_lane_j599h_45`,laneName:`_laneName_j599h_72`,laneSlots:`_laneSlots_j599h_77`,laneSep:`_laneSep_j599h_83`,laneStrip:`_laneStrip_j599h_88`,laneNotes:`_laneNotes_j599h_94`,laneNoteLanes:`_laneNoteLanes_j599h_107`,decision:`_decision_j599h_113`,decisionLead:`_decisionLead_j599h_119`,mode:`_mode_j599h_129`,decisionWhy:`_decisionWhy_j599h_142`,candidates:`_candidates_j599h_149`,exclusions:`_exclusions_j599h_150`,excluded:`_excluded_j599h_170`,excludedWhy:`_excludedWhy_j599h_175`,excludedWhen:`_excludedWhen_j599h_179`,overnight:`_overnight_j599h_184`,overnightLead:`_overnightLead_j599h_190`,facts:`_facts_j599h_196`,discarded:`_discarded_j599h_219`,discardTitle:`_discardTitle_j599h_234`,discardWhy:`_discardWhy_j599h_238`,tableWrap:`_tableWrap_j599h_243`,table:`_table_j599h_243`,repoName:`_repoName_j599h_276`,actionCell:`_actionCell_j599h_283`,stage:`_stage_j599h_287`,stageNote:`_stageNote_j599h_309`,green:`_green_j599h_314`,greenValue:`_greenValue_j599h_320`,holds:`_holds_j599h_325`,hold:`_hold_j599h_325`,repoCards:`_repoCards_j599h_347`,repoCard:`_repoCard_j599h_347`,repoCardHead:`_repoCardHead_j599h_365`,advanced:`_advanced_j599h_373`,chevron:`_chevron_j599h_399`,disclosureNote:`_disclosureNote_j599h_407`},B=36e5;function V(e,t,n){if(!e)return{kind:`loading`};let r=e.value;return r?r.state===`dark`&&!n?v(r):n?{kind:`ready`}:{kind:`empty`,message:t}:{kind:`unknown`,reason:e.reason??`the live fleet view did not answer.`}}function xe({lane:e}){let t=_e(e);return(0,R.jsxs)(`li`,{className:z.lane,"data-off":e.slots===0||void 0,title:P(e)??void 0,children:[(0,R.jsx)(m,{engine:ve[e.lane]}),(0,R.jsx)(`span`,{className:z.laneName,children:t.name}),(0,R.jsx)(`span`,{className:z.laneSep,"aria-hidden":`true`,children:` · `}),(0,R.jsx)(`span`,{className:z.laneSlots,children:t.slots})]})}function Se({live:e}){if(!e||e.lanes.length===0)return null;let t=me(e.lanes);return(0,R.jsxs)(`div`,{className:z.laneStrip,children:[(0,R.jsxs)(`ul`,{className:z.lanes,"aria-label":`Lanes: busy of slots`,children:[e.lanes.map(e=>(0,R.jsx)(xe,{lane:e},e.lane)),(0,R.jsx)(be,{classes:{lane:z.lane,name:z.laneName,sep:z.laneSep,slots:z.laneSlots}})]}),t.length>0?(0,R.jsx)(`ul`,{className:z.laneNotes,"aria-label":`Why lanes are limited`,children:t.map(e=>(0,R.jsxs)(`li`,{children:[e.all?null:(0,R.jsxs)(`span`,{className:z.laneNoteLanes,children:[e.lanes.map(e=>N[e]).join(`, `),`: `]}),f(e.reason)]},e.lanes.join(`,`)))}):null]})}function Ce({read:e,now:t,hours:n}){let r=e?.value??null,i=t-n*B,a=r?I(r.runs,i,t,{includeParked:!1}):[];return(0,R.jsx)(c,{title:`Live fleet`,description:`Lanes × slots, last ${n} h · bars coloured by phase or outcome · outlines are queued`,status:V(e,`Nothing ran in the last ${n} hours.`,a.length>0),lanes:a,from:i,to:t,now:t,toneOf:j})}function we({read:e}){let t=(e?.value??null)?.funnel??null,n=F(t),r=ge(t),i=t?`${new Date(t.from).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})} – ${new Date(t.to).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`})}`:void 0;return(0,R.jsxs)(`div`,{className:z.stack,children:[(0,R.jsx)(u,{title:`Gate funnel`,description:i?`Proposals through G0–G7, ${i}`:`Proposals through the merge gates G0–G7`,status:V(e,`No proposal reached the gates in this window.`,n.length>0),stages:n}),(0,R.jsx)(l,{title:`Refusals by gate`,description:r.total?`${r.total} refusals · top reasons keep their colour`:`Why proposals stopped`,status:V(e,`Nothing was refused in this window.`,r.total>0),categories:r.categories,segments:r.segments,values:r.values,height:180})]})}function H(e,t){let n=e?.seatInfo.find(e=>e.seatId===t);return{label:n?.label??t,engine:n?.engine??null}}function U({decision:e,view:t,now:n}){let r=e.seatId?H(t,e.seatId):null;return(0,R.jsxs)(`div`,{className:z.decision,children:[(0,R.jsxs)(`p`,{className:z.decisionLead,children:[r?(0,R.jsxs)(R.Fragment,{children:[r.engine?(0,R.jsx)(m,{engine:r.engine}):null,(0,R.jsx)(`strong`,{children:r.label})]}):(0,R.jsx)(`strong`,{children:`No seat`}),(0,R.jsx)(`span`,{className:z.mode,children:e.mode})]}),(0,R.jsx)(`p`,{className:z.decisionWhy,children:pe(e)}),e.candidates.length>1?(0,R.jsxs)(`div`,{children:[(0,R.jsx)(E,{children:`Then`}),(0,R.jsx)(`ol`,{className:z.candidates,children:e.candidates.slice(+!!e.seatId).map(e=>(0,R.jsx)(`li`,{children:H(t,e).label},e))})]}):null,e.exclusions.length?(0,R.jsxs)(`div`,{children:[(0,R.jsx)(E,{children:`Held back`}),(0,R.jsx)(`ul`,{className:z.exclusions,"aria-label":`Held back seats`,children:e.exclusions.map(e=>(0,R.jsxs)(`li`,{children:[(0,R.jsx)(`span`,{className:z.excluded,children:H(t,e.seatId).label}),(0,R.jsx)(`span`,{className:z.excludedWhy,children:ue(e)}),(0,R.jsxs)(`span`,{className:z.excludedWhen,children:[`eligible again: `,de(fe(e),n)]})]},e.seatId))})]}):null]})}function Te({read:e,preview:t,view:n,now:r}){let i=he(e?.value??null);return(0,R.jsx)(k,{title:`Why this seat`,caption:i?`Latest dispatch: ${i.run.title} (${p(i.run.phaseStartedAt??i.run.startedAt)})`:t?`The next medium autonomous task would go to…`:void 0,children:i?(0,R.jsx)(U,{decision:i.decision,view:n,now:r}):t?(0,R.jsx)(U,{decision:t,view:n,now:r}):(0,R.jsx)(D,{tone:`unknown`,children:`No routing decision yet. The router preview didn't answer.`})})}function Ee({read:e,now:t}){let n=e?.value??null,r=n?ye(n.runs,t):{lanes:[],from:t-B,to:t+2*B,unknownRelease:0};return(0,R.jsx)(c,{title:`Parked`,description:`Waiting for a seat to free up — each bar ends when it should`,caveat:r.unknownRelease?`${r.unknownRelease} item${r.unknownRelease===1?` has`:`s have`} no known release time; ${r.unknownRelease===1?`it runs`:`they run`} to the right edge.`:void 0,status:V(e,`Nothing is parked.`,r.lanes.length>0),lanes:r.lanes,from:r.from,to:r.to,now:t,toneOf:j,formatTick:e=>new Date(e).toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`})})}function De({read:e,onOpenAdvanced:t,dark:n=!1}){let r=e?.value??null,i=r?.run??null;return(0,R.jsx)(k,{title:`Overnight`,caption:r?r.armed?`Armed`:`Not armed`:void 0,actions:(0,R.jsx)(`button`,{type:`button`,className:z.link,onClick:t,children:`Arm or stop in Advanced`}),children:e?r?!r.armed&&!i?(0,R.jsx)(D,{children:n?`Nothing armed.`:`Nothing armed. The fleet runs on its normal schedule.`}):(0,R.jsxs)(`div`,{className:z.overnight,children:[i?.stopRule?(0,R.jsx)(`p`,{className:z.overnightLead,children:le(i.stopRule)}):null,(0,R.jsxs)(`dl`,{className:z.facts,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{children:`Started`}),(0,R.jsx)(`dd`,{children:i?.startedAt?p(i.startedAt):`—`})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{children:`Iterations`}),(0,R.jsx)(`dd`,{children:i?.iterationsDone??`—`})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{children:`Merged`}),(0,R.jsx)(`dd`,{children:i?i.merged.length:`—`})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{children:`Discarded`}),(0,R.jsx)(`dd`,{children:i?i.discarded.length:`—`})]})]}),i?.activity?(0,R.jsxs)(`p`,{className:z.muted,children:[`Now: `,i.activity]}):null,i&&i.discarded.length?(0,R.jsx)(`ul`,{className:z.discarded,"aria-label":`Discarded work`,children:i.discarded.slice(0,3).map(e=>(0,R.jsxs)(`li`,{children:[(0,R.jsx)(`span`,{className:z.discardTitle,children:e.title}),(0,R.jsx)(`span`,{className:z.discardWhy,children:e.reason})]},e.id))}):null]}):(0,R.jsx)(D,{tone:`unknown`,children:e.reason??`The overnight lane did not answer.`}):(0,R.jsx)(`p`,{className:z.muted,"aria-busy":`true`,children:`Reading the overnight lane…`})})}var W={quarantine:`Quarantined`,"owner-hold":`On hold (you)`,"leader-pause":`Paused by Leader`,cooldown:`Cooling down`};function Oe(e,t){let n=e.until?Date.parse(e.until):NaN,r=Number.isFinite(n)?Math.max(0,n-t):null,i=r===null?`until resumed`:r<36e5?`${Math.ceil(r/6e4)}m left`:`${Math.round(r/36e5)}h left`;return`${W[e.kind]} · ${i}`}function G(e){return e.includes(`/`)?e.split(`/`)[1]:e}function K({row:e}){return e.stage===null?(0,R.jsx)(`span`,{className:z.stage,"data-stage":`none`,children:`Not in grant`}):(0,R.jsxs)(`span`,{className:z.stage,"data-stage":e.stage,children:[e.stage===`merge`?`Merge`:`Propose`,e.enforcement===`local`?(0,R.jsx)(`span`,{className:z.stageNote,children:` · local checks`}):null]})}function q({row:e,actions:t}){let n=t.busy||t.readOnly;return e.holds.length?(0,R.jsx)(_,{size:`sm`,variant:`subtle`,disabled:n,"aria-label":`Resume ${e.repo}`,onClick:()=>t.act(()=>w({action:`resume-repo`,repo:e.repo}),`Resume ${e.repo}`,{confirm:{title:`Resume ${G(e.repo)}?`,body:`Clears ${e.holds.map(e=>W[e.kind].toLowerCase()).join(` and `)}. New fleet work can start there on the next tick.`,confirmLabel:`Resume`}}),children:`Resume`}):e.stage===null?null:(0,R.jsx)(_,{size:`sm`,variant:`ghost`,disabled:n,"aria-label":`Pause ${e.repo}`,onClick:()=>t.act(()=>w({action:`pause-repo`,repo:e.repo,reason:`Paused by Mason from the Fleet surface`}),`Pause ${e.repo}`,{confirm:{title:`Pause ${G(e.repo)}?`,body:`No new fleet work starts there until you resume it. Runs already in flight finish and are watched as usual.`,confirmLabel:`Pause repo`,destructive:!0}}),children:`Pause`})}function J({row:e}){return(0,R.jsxs)(`span`,{className:z.green,children:[(0,R.jsx)(`span`,{className:z.greenValue,children:e.greenPct7d===null?`—`:`${Math.round(e.greenPct7d)}%`}),(0,R.jsx)(s,{points:e.greenTrend,width:64,height:18,ariaLabel:`${e.repo} post-merge green, 14 days`,describe:e=>`${Math.round(e)}%`})]})}function Y({row:e,now:t}){return e.holds.length?(0,R.jsx)(`span`,{className:z.holds,children:e.holds.map(e=>(0,R.jsx)(`span`,{className:z.hold,"data-kind":e.kind,title:e.reason,children:Oe(e,t)},e.kind))}):(0,R.jsx)(`span`,{className:z.muted,children:`—`})}function X(e){if(e===void 0)return null;if(e===null)return`Fleet mirrors: unknown — the enrollment registry could not be read.`;if(e.count===0)return`Fleet mirrors: none yet — the fleet clones a repo the first time it works on it.`;let t=e.repos.slice(0,6).join(`, `),n=e.repos.length>6?` and ${e.repos.length-6} more`:``;return`Fleet mirrors: ${e.count} working ${e.count===1?`copy`:`copies`}${t?` (${t}${n})`:``} — the fleet's own clones of the repos above.`}var Z=e=>e.mergesToday===null?`—`:`${e.mergesToday}${e.maxMergesPerDay===null?``:` / ${e.maxMergesPerDay}`}`;function ke({read:e,actions:t,now:n,compact:r}){let i=e?.value??null,a=i?.repos??[];return(0,R.jsxs)(k,{title:`Repositories`,caption:i?`${a.length} enrolled · stage is what the grant and rollout allow right now`:void 0,children:[e?i?a.length===0?(0,R.jsx)(D,{children:`No repositories are enrolled.`}):r?(0,R.jsx)(`ul`,{className:z.repoCards,children:a.map(e=>(0,R.jsxs)(`li`,{className:z.repoCard,id:T(`repo-${e.repo}`),children:[(0,R.jsxs)(`div`,{className:z.repoCardHead,children:[(0,R.jsx)(`span`,{className:z.repoName,children:e.repo}),(0,R.jsx)(q,{row:e,actions:t})]}),(0,R.jsxs)(`dl`,{className:z.facts,children:[(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{children:`Stage`}),(0,R.jsx)(`dd`,{children:(0,R.jsx)(K,{row:e})})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{children:`Last merge`}),(0,R.jsx)(`dd`,{children:e.lastMergeAt?p(e.lastMergeAt):`—`})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{children:`Today`}),(0,R.jsx)(`dd`,{children:Z(e)})]}),(0,R.jsxs)(`div`,{children:[(0,R.jsx)(`dt`,{children:`Green 7d`}),(0,R.jsx)(`dd`,{children:(0,R.jsx)(J,{row:e})})]})]}),(0,R.jsx)(Y,{row:e,now:n})]},e.repo))}):(0,R.jsx)(`div`,{className:z.tableWrap,children:(0,R.jsxs)(`table`,{className:z.table,children:[(0,R.jsx)(`caption`,{className:`visually-hidden`,children:`Enrolled repositories`}),(0,R.jsx)(`thead`,{children:(0,R.jsxs)(`tr`,{children:[(0,R.jsx)(`th`,{scope:`col`,children:`Repository`}),(0,R.jsx)(`th`,{scope:`col`,children:`Stage`}),(0,R.jsx)(`th`,{scope:`col`,children:`Last merge`}),(0,R.jsx)(`th`,{scope:`col`,className:z.num,children:`Today`}),(0,R.jsx)(`th`,{scope:`col`,children:`Post-merge green · 14d`}),(0,R.jsx)(`th`,{scope:`col`,className:z.num,children:`Open PRs`}),(0,R.jsx)(`th`,{scope:`col`,children:`Holds`}),(0,R.jsx)(`th`,{scope:`col`,children:(0,R.jsx)(`span`,{className:`visually-hidden`,children:`Action`})})]})}),(0,R.jsx)(`tbody`,{children:a.map(e=>(0,R.jsxs)(`tr`,{id:T(`repo-${e.repo}`),"data-held":e.holds.length>0||void 0,children:[(0,R.jsx)(`th`,{scope:`row`,className:z.repoName,children:e.repo}),(0,R.jsx)(`td`,{children:(0,R.jsx)(K,{row:e})}),(0,R.jsx)(`td`,{children:e.lastMergeAt?p(e.lastMergeAt):`—`}),(0,R.jsx)(`td`,{className:z.num,children:Z(e)}),(0,R.jsx)(`td`,{children:(0,R.jsx)(J,{row:e})}),(0,R.jsx)(`td`,{className:z.num,children:e.openFleetPrs??`—`}),(0,R.jsx)(`td`,{children:(0,R.jsx)(Y,{row:e,now:n})}),(0,R.jsx)(`td`,{className:z.actionCell,children:(0,R.jsx)(q,{row:e,actions:t})})]},e.repo))})]})}):(0,R.jsx)(D,{tone:`unknown`,children:e.reason??`The live fleet view did not answer.`}):(0,R.jsx)(`p`,{className:z.muted,"aria-busy":`true`,children:`Reading repositories…`}),i&&X(i.mirrors)?(0,R.jsx)(`p`,{className:z.muted,children:X(i.mirrors)}):null]})}var Q=5e3,$=3e4,Ae=(0,L.lazy)(()=>r(()=>import(`./ShadowDecisions-C5RAY91f.js`),__vite__mapDeps([0,1,2,3,4,5,6]))),je=(0,L.lazy)(()=>r(()=>import(`./Advanced-DHsysoIL.js`).then(e=>e.t).then(e=>({default:()=>(0,R.jsx)(e.FleetAdvanced,{embedded:!0})})),__vite__mapDeps([7,8,9,10,11,12,13,14,15,16,2,17,18,19,20,21,22,3,4,23,24,25,26])));function Me(){let{compact:e}=ee(),t=a(C),n=a(A),r=a(h,{freshMs:15e3}),s=a(g,{freshMs:15e3}),c=i(C),l=i(A),u=i(g);d(c,Q),d(()=>{l(),u()},$);let f=ce(15e3),p=oe(),[m,_]=(0,L.useState)(!1),v=(0,L.useId)(),y=t.data?.value??null,b=ne(),x=a(ie,{freshMs:3e4}).data?.value?.grant.state??null,S=x!==null&&x!==`none`,w=b!=null&&y!==null&&M(y);function T(){_(!0),requestAnimationFrame(()=>document.getElementById(v)?.scrollIntoView?.({block:`start`,behavior:`smooth`}))}return(0,R.jsxs)(ae,{title:`Fleet`,actions:t.status===`refreshing`?(0,R.jsx)(o,{}):null,lead:(0,R.jsxs)(R.Fragment,{children:[(0,R.jsx)(se,{actions:p}),(0,R.jsx)(Se,{live:y}),b?(0,R.jsx)(re,{state:b,here:`fleet`}):null]}),children:[w?null:(0,R.jsx)(O,{span:12,children:(0,R.jsx)(Ce,{read:t.data,now:f,hours:e?6:12})}),S?(0,R.jsx)(O,{span:12,children:(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(`p`,{className:z.muted,"aria-busy":`true`,children:`Loading shadow decisions…`}),children:(0,R.jsx)(Ae,{now:f})})}):null,w?null:(0,R.jsx)(O,{span:7,children:(0,R.jsx)(we,{read:t.data})}),(0,R.jsx)(O,{span:w?6:5,children:(0,R.jsx)(Te,{read:t.data,preview:s.data??null,view:r.data??null,now:f})}),w?null:(0,R.jsx)(O,{span:7,children:(0,R.jsx)(Ee,{read:t.data,now:f})}),(0,R.jsx)(O,{span:w?6:5,children:(0,R.jsx)(De,{read:n.data,onOpenAdvanced:T,dark:y?.state===`dark`})}),(0,R.jsx)(O,{span:12,children:(0,R.jsx)(ke,{read:t.data,actions:p,now:f,compact:e})}),(0,R.jsx)(O,{span:12,children:(0,R.jsxs)(`div`,{className:z.advanced,children:[(0,R.jsxs)(`button`,{type:`button`,className:z.disclosure,"aria-expanded":m,"aria-controls":v,onClick:()=>_(e=>!e),children:[(0,R.jsx)(te,{className:z.chevron,width:14,height:14,"aria-hidden":`true`}),`Advanced`,(0,R.jsx)(`span`,{className:z.disclosureNote,children:`daemon, overnight, local runtime, caps, scope, activity, safety, goals`})]}),(0,R.jsx)(`div`,{id:v,hidden:!m,children:m?(0,R.jsx)(L.Suspense,{fallback:(0,R.jsx)(`p`,{className:z.muted,"aria-busy":`true`,children:`Loading the advanced panels…`}),children:(0,R.jsx)(je,{})}):null})]})}),p.dialogs]})}export{Q as FLEET_POLL_MS,$ as FLEET_SLOW_POLL_MS,Me as FleetSection};
|
|
3
|
+
//# sourceMappingURL=FleetSection-BfplcwFU.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"mappings":";sxCAuBA,SAAgB,GAAc,CAAE,UAAU,CAAC,GAAyC,CAClF,IAAM,EAAO,EAAS,EAAY,CAAE,QAAS,IAAO,CAAC,EAC/C,EAAU,EAAW,CAAU,EACrC,EAAoB,EAAS,CAAa,EAC1C,IAAM,EAAW,EAAK,MAAM,OAAS,KACrC,GAAI,CAAC,EAAU,OAAO,KACtB,IAAM,EAAU,EAAc,EAAS,KAAK,EACtC,EAAQ,+EAA+E,EAAS,OAAO,cAAc,MAAM,EAAS,OAAO,OAAO,kBAAkB,uBAC1K,OACE,UAAC,KAAD,CAAI,UAAW,GAAG,EAAQ,MAAQ,GAAG,GAAG,EAAO,WAAY,cAAa,EAAU,GAAK,OAAkB,QAAO,aAAY,UAAU,EAAQ,UAA9I,WACE,SAAC,OAAD,CAAM,UAAW,EAAQ,KAAM,gBAAW,IAC1C,SAAC,OAAD,CAAM,UAAW,EAAQ,IAAK,cAAY,OACvC,cACG,IACN,UAAC,OAAD,CAAM,UAAW,EAAQ,MAAzB,UAAiC,EAAQ,UAAc,GACrD,GAER,s2CCZM,EAAO,KAQb,SAAgB,EAAY,EAAqD,EAAe,EAA+B,CAC7H,GAAI,CAAC,EAAM,MAAO,CAAE,KAAM,SAAU,EACpC,IAAM,EAAO,EAAK,MAGlB,OAFK,EACD,EAAK,QAAU,QAAU,CAAC,EAAgB,EAAgB,CAAI,EAC3D,EAAU,CAAE,KAAM,OAAQ,EAAI,CAAE,KAAM,QAAS,QAAS,CAAM,EAFnD,CAAE,KAAM,UAAW,OAAQ,EAAK,QAAU,qCAAsC,CAGpG,CAOA,SAAS,GAAS,CAAE,QAAkC,CACpD,IAAM,EAAO,GAAa,CAAI,EAC9B,OACE,UAAC,KAAD,CAAI,UAAW,EAAO,KAAM,WAAU,EAAK,QAAU,GAAK,OAAW,MAAO,EAAW,CAAI,GAAK,OAAhG,WACE,SAAC,EAAD,CAAc,OAAQ,GAAY,EAAK,KAAQ,IAC/C,SAAC,OAAD,CAAM,UAAW,EAAO,SAAW,WAAK,IAAW,IACnD,SAAC,OAAD,CAAM,UAAW,EAAO,QAAS,cAAY,OAC1C,cACG,IACN,SAAC,OAAD,CAAM,UAAW,EAAO,UAAY,WAAK,KAAY,EACnD,GAER,CAEA,SAAgB,GAAW,CAAE,QAA8C,CACzE,GAAI,CAAC,GAAQ,EAAK,MAAM,SAAW,EAAG,OAAO,KAC7C,IAAM,EAAQ,GAAU,EAAK,KAAK,EAClC,OACE,UAAC,MAAD,CAAK,UAAW,EAAO,UAAvB,WACE,UAAC,KAAD,CAAI,UAAW,EAAO,MAAO,aAAW,uBAAxC,UACG,EAAK,MAAM,IAAK,IACf,SAAC,GAAD,CAAuB,KAAM,CAAI,EAAlB,EAAE,IAAgB,CAClC,GACD,SAAC,GAAD,CAAe,QAAS,CAAE,KAAM,EAAO,KAAM,KAAM,EAAO,SAAU,IAAK,EAAO,QAAS,MAAO,EAAO,SAAU,CAAI,EACnH,CACH,KAAM,OAAS,GACd,SAAC,KAAD,CAAI,UAAW,EAAO,UAAW,aAAW,wBACzC,WAAM,IAAK,IACV,UAAC,KAAD,WACG,EAAE,IAAM,MAAO,UAAC,OAAD,CAAM,UAAW,EAAO,cAAxB,UAAwC,EAAE,MAAM,IAAK,GAAM,EAAW,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,IAAQ,CAC5G,KAAW,EAAE,MAAM,CAClB,GAHK,EAAE,MAAM,KAAK,GAAG,CAGrB,CACL,CACC,GACF,IACD,GAET,CAEA,SAAgB,GAAa,CAAE,OAAM,MAAK,SAA8F,CACtI,IAAM,EAAO,GAAM,OAAS,KACtB,EAAO,EAAM,EAAQ,EACrB,EAAQ,EAAO,EAAS,EAAK,KAAM,EAAM,EAAK,CAAE,cAAe,EAAM,CAAC,EAAI,CAAC,EACjF,OACE,SAAC,EAAD,CACE,MAAM,aACN,YAAa,uBAAuB,EAAM,8DAC1C,OAAQ,EAAY,EAAM,2BAA2B,EAAM,SAAU,EAAM,OAAS,CAAC,EAC9E,QACD,OACN,GAAI,EACC,MACL,OAAQ,CACT,EAEL,CAMA,SAAgB,GAAgB,CAAE,QAAiE,CAEjG,IAAM,GADO,GAAM,OAAS,OACP,QAAU,KACzB,EAAS,EAAa,CAAM,EAC5B,EAAW,GAAa,CAAM,EAC9B,EAAS,EAAS,GAAG,IAAI,KAAK,EAAO,IAAI,CAAC,CAAC,mBAAmB,QAAS,CAAE,MAAO,QAAS,IAAK,SAAU,CAAC,EAAE,KAAK,IAAI,KAAK,EAAO,EAAE,CAAC,CAAC,mBAAmB,QAAS,CAAE,MAAO,QAAS,IAAK,SAAU,CAAC,IAAM,OAC9M,OACE,UAAC,MAAD,CAAK,UAAW,EAAO,MAAvB,WACE,SAAC,EAAD,CACE,MAAM,cACN,YAAa,EAAS,4BAA4B,IAAW,0CAC7D,OAAQ,EAAY,EAAM,gDAAiD,EAAO,OAAS,CAAC,EACpF,QACT,IACD,SAAC,EAAD,CACE,MAAM,mBACN,YAAa,EAAS,MAAQ,GAAG,EAAS,MAAM,2CAA6C,wBAC7F,OAAQ,EAAY,EAAM,sCAAuC,EAAS,MAAQ,CAAC,EACnF,WAAY,EAAS,WACrB,SAAU,EAAS,SACnB,OAAQ,EAAS,OACjB,OAAQ,GACT,EACE,GAET,CAMA,SAAS,EAAU,EAAyB,EAAyF,CACnI,IAAM,EAAO,GAAM,SAAS,KAAM,GAAM,EAAE,SAAW,CAAM,EAC3D,MAAO,CAAE,MAAO,GAAM,OAAS,EAAQ,OAAQ,GAAM,QAAU,IAAK,CACtE,CAEA,SAAgB,EAAa,CAAE,WAAU,OAAM,OAA0E,CACvH,IAAM,EAAS,EAAS,OAAS,EAAU,EAAM,EAAS,MAAM,EAAI,KACpE,OACE,UAAC,MAAD,CAAK,UAAW,EAAO,SAAvB,WACE,UAAC,IAAD,CAAG,UAAW,EAAO,aAArB,UACG,GACC,gCACG,EAAO,QAAS,SAAC,EAAD,CAAc,OAAQ,EAAO,MAAS,GAAI,MAC3D,SAAC,SAAD,UAAS,EAAO,KAAc,EAC9B,KAEF,SAAC,SAAD,UAAQ,SAAe,IAEzB,SAAC,OAAD,CAAM,UAAW,EAAO,KAAO,WAAS,IAAW,EAClD,KACH,SAAC,IAAD,CAAG,UAAW,EAAO,YAAc,YAAgB,CAAQ,CAAK,GAC/D,EAAS,WAAW,OAAS,GAC5B,UAAC,MAAD,YACE,SAAC,EAAD,UAAY,MAAgB,IAC5B,SAAC,KAAD,CAAI,UAAW,EAAO,WACnB,WAAS,WAAW,MAAM,KAAS,MAAc,CAAC,CAAC,IAAK,IACvD,SAAC,KAAD,UAAc,EAAU,EAAM,CAAE,CAAC,CAAC,KAAU,EAAnC,CAAmC,CAC7C,CACC,EACD,IACH,KACH,EAAS,WAAW,QACnB,UAAC,MAAD,YACE,SAAC,EAAD,UAAY,WAAqB,IACjC,SAAC,KAAD,CAAI,UAAW,EAAO,WAAY,aAAW,kBAC1C,WAAS,WAAW,IAAK,IACxB,UAAC,KAAD,YACE,SAAC,OAAD,CAAM,UAAW,EAAO,SAAW,WAAU,EAAM,EAAE,MAAM,CAAC,CAAC,KAAY,IACzE,SAAC,OAAD,CAAM,UAAW,EAAO,YAAc,YAAa,CAAC,CAAQ,IAC5D,UAAC,OAAD,CAAM,UAAW,EAAO,aAAxB,UAAsC,mBAAiB,GAAsB,GAAc,CAAC,EAAG,CAAG,CAAQ,GACxG,GAJK,EAAE,MAIP,CACL,CACC,EACD,IACH,IACD,GAET,CAEA,SAAgB,GAAY,CAAE,OAAM,UAAS,OAAM,OAAqI,CACtL,IAAM,EAAS,GAAe,GAAM,OAAS,IAAI,EACjD,OACE,SAAC,EAAD,CACE,MAAM,gBACN,QAAS,EAAS,oBAAoB,EAAO,IAAI,MAAM,IAAI,EAAe,EAAO,IAAI,gBAAkB,EAAO,IAAI,SAAS,EAAE,GAAK,EAAU,+CAAiD,OAE5L,YACC,SAAC,EAAD,CAAc,SAAU,EAAO,SAAgB,OAAW,KAAM,GAC9D,GACF,SAAC,EAAD,CAAc,SAAU,EAAe,OAAW,KAAM,IAExD,SAAC,EAAD,CAAU,KAAK,UAAU,qEAAoE,EAE3F,EAEV,CAMA,SAAgB,GAAW,CAAE,OAAM,OAA6E,CAC9G,IAAM,EAAO,GAAM,OAAS,KACtB,EAAQ,EAAO,GAAY,EAAK,KAAM,CAAG,EAAI,CAAE,MAAO,CAAC,EAAG,KAAM,EAAM,EAAM,GAAI,EAAM,EAAI,EAAM,eAAgB,CAAE,EACxH,OACE,SAAC,EAAD,CACE,MAAM,SACN,YAAY,+DACZ,OAAQ,EAAM,eAAiB,GAAG,EAAM,eAAe,OAAO,EAAM,iBAAmB,EAAI,OAAS,SAAS,0BAA0B,EAAM,iBAAmB,EAAI,UAAY,WAAW,qBAAuB,OAClN,OAAQ,EAAY,EAAM,qBAAsB,EAAM,MAAM,OAAS,CAAC,EACtE,MAAO,EAAM,MACb,KAAM,EAAM,KACZ,GAAI,EAAM,GACL,MACL,OAAQ,EACR,WAAa,GAAO,IAAI,KAAK,CAAE,CAAC,CAAC,eAAe,QAAS,CAAE,QAAS,QAAS,KAAM,SAAU,CAAC,CAC/F,EAEL,CAMA,SAAgB,GAAc,CAAE,OAAM,iBAAgB,OAAO,IAAgL,CAC3O,IAAM,EAAS,GAAM,OAAS,KACxB,EAAM,GAAQ,KAAO,KAC3B,OACE,SAAC,EAAD,CACE,MAAM,YACN,QAAS,EAAU,EAAO,MAAQ,QAAU,YAAe,OAC3D,SACE,SAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,KAAM,QAAS,EAAgB,kCAE/D,GAGT,SAAC,EAEG,EAED,CAAC,EAAO,OAAS,CAAC,GACpB,SAAC,EAAD,UAAW,EAAO,iBAAmB,uDAAkE,IAEvG,UAAC,MAAD,CAAK,UAAW,EAAO,UAAvB,UACG,GAAK,UAAW,SAAC,IAAD,CAAG,UAAW,EAAO,cAAgB,YAAiB,EAAI,QAAQ,CAAK,GAAI,MAC5F,UAAC,KAAD,CAAI,UAAW,EAAO,MAAtB,WACE,UAAC,MAAD,YACE,SAAC,KAAD,UAAI,SAAW,IACf,SAAC,KAAD,UAAK,GAAK,UAAY,EAAe,EAAI,SAAS,EAAI,GAAQ,EAC3D,KACL,UAAC,MAAD,YACE,SAAC,KAAD,UAAI,YAAc,IAClB,SAAC,KAAD,UAAK,GAAK,gBAAkB,GAAQ,EACjC,KACL,UAAC,MAAD,YACE,SAAC,KAAD,UAAI,QAAU,IACd,SAAC,KAAD,UAAK,EAAM,EAAI,OAAO,OAAS,GAAQ,EACpC,KACL,UAAC,MAAD,YACE,SAAC,KAAD,UAAI,WAAa,IACjB,SAAC,KAAD,UAAK,EAAM,EAAI,UAAU,OAAS,GAAQ,EACvC,GACH,IACH,GAAK,UAAW,UAAC,IAAD,CAAG,UAAW,EAAO,MAArB,UAA4B,QAAM,EAAI,QAAY,CAAI,QACtE,GAAO,EAAI,UAAU,QACpB,SAAC,KAAD,CAAI,UAAW,EAAO,UAAW,aAAW,iBACzC,WAAI,UAAU,MAAM,EAAG,CAAC,CAAC,CAAC,IAAK,IAC9B,UAAC,KAAD,YACE,SAAC,OAAD,CAAM,UAAW,EAAO,aAAe,WAAE,KAAY,IACrD,SAAC,OAAD,CAAM,UAAW,EAAO,WAAa,WAAE,MAAa,EAClD,GAHK,EAAE,EAGP,CACL,CACC,GACF,IACD,KAnCL,SAAC,EAAD,CAAU,KAAK,UAAW,WAAK,QAAU,oCAA+C,IAFxF,SAAC,IAAD,CAAG,UAAW,EAAO,MAAO,YAAU,OAAO,sCAA8B,EAuCzE,EAEV,CC7QA,IAAM,EAA8C,CAClD,WAAY,cACZ,aAAc,gBACd,eAAgB,mBAChB,SAAU,cACZ,EAEA,SAAgB,GAAS,EAAgB,EAAqB,CAC5D,IAAM,EAAQ,EAAK,MAAQ,KAAK,MAAM,EAAK,KAAK,EAAI,IAC9C,EAAO,OAAO,SAAS,CAAK,EAAI,KAAK,IAAI,EAAG,EAAQ,CAAG,EAAI,KAC3D,EAAO,IAAS,KAAO,gBAAkB,EAAO,KAAY,GAAG,KAAK,KAAK,EAAO,GAAM,EAAE,QAAU,GAAG,KAAK,MAAM,EAAO,IAAS,EAAE,QACxI,MAAO,GAAG,EAAU,EAAK,MAAM,KAAK,GACtC,CAEA,SAAS,EAAU,EAAsB,CACvC,OAAO,EAAK,SAAS,GAAG,EAAI,EAAK,MAAM,GAAG,CAAC,CAAC,GAAM,CACpD,CAEA,SAAS,EAAW,CAAE,OAA8B,CAElD,OADI,EAAI,QAAU,MAAa,SAAC,OAAD,CAAM,UAAW,EAAO,MAAO,aAAW,OAAO,uBAAkB,IAEhG,UAAC,OAAD,CAAM,UAAW,EAAO,MAAO,aAAY,EAAI,MAA/C,UACG,EAAI,QAAU,QAAU,QAAU,UAClC,EAAI,cAAgB,SAAU,SAAC,OAAD,CAAM,UAAW,EAAO,UAAW,0BAAqB,GAAI,IACvF,GAEV,CAEA,SAAS,EAAW,CAAE,MAAK,WAA2D,CACpF,IAAM,EAAW,EAAQ,MAAQ,EAAQ,SAuBzC,OAtBI,EAAI,MAAM,QAEV,SAAC,EAAD,CACE,KAAK,KACL,QAAQ,SACE,WACV,aAAY,UAAU,EAAI,OAC1B,YACE,EAAQ,QAAU,EAAc,CAAE,OAAQ,cAAe,KAAM,EAAI,IAAK,CAAC,EAAG,UAAU,EAAI,OAAQ,CAChG,QAAS,CACP,MAAO,UAAU,EAAU,EAAI,IAAI,EAAE,GACrC,KAAM,UAAU,EAAI,MAAM,IAAK,GAAM,EAAU,EAAE,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,KAAK,OAAO,EAAE,oDACpF,aAAc,QAChB,CACF,CAAC,EAEJ,iBAEO,GAGR,EAAI,QAAU,KAAa,MAE7B,SAAC,EAAD,CACE,KAAK,KACL,QAAQ,QACE,WACV,aAAY,SAAS,EAAI,OACzB,YACE,EAAQ,QAAU,EAAc,CAAE,OAAQ,aAAc,KAAM,EAAI,KAAM,OAAQ,wCAAyC,CAAC,EAAG,SAAS,EAAI,OAAQ,CAChJ,QAAS,CACP,MAAO,SAAS,EAAU,EAAI,IAAI,EAAE,GACpC,KAAM,8GACN,aAAc,aACd,YAAa,EACf,CACF,CAAC,EAEJ,gBAEO,EAEZ,CAEA,SAAS,EAAU,CAAE,OAA8B,CACjD,OACE,UAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,WACE,SAAC,OAAD,CAAM,UAAW,EAAO,WAAa,WAAI,aAAe,KAAO,IAAM,GAAG,KAAK,MAAM,EAAI,UAAU,EAAE,EAAS,IAC5G,SAAC,EAAD,CAAW,OAAQ,EAAI,WAAY,MAAO,GAAI,OAAQ,GAAI,UAAW,GAAG,EAAI,KAAK,4BAA6B,SAAW,GAAM,GAAG,KAAK,MAAM,CAAC,EAAE,EAAK,EACjJ,GAEV,CAEA,SAAS,EAAM,CAAE,MAAK,OAA2C,CAE/D,OADK,EAAI,MAAM,QAEb,SAAC,OAAD,CAAM,UAAW,EAAO,MACrB,WAAI,MAAM,IAAK,IACd,SAAC,OAAD,CAAmB,UAAW,EAAO,KAAM,YAAW,EAAE,KAAM,MAAO,EAAE,OACpE,YAAS,EAAG,CAAG,CACZ,EAFK,EAAE,IAEP,CACP,CACG,IARsB,SAAC,OAAD,CAAM,UAAW,EAAO,MAAO,YAAO,EAUtE,CAUA,SAAgB,EAAY,EAA+D,CACzF,GAAI,IAAY,OAAW,OAAO,KAClC,GAAI,IAAY,KAAM,MAAO,sEAC7B,GAAI,EAAQ,QAAU,EAAG,MAAO,mFAChC,IAAM,EAAQ,EAAQ,MAAM,MAAM,EAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAC3C,EAAO,EAAQ,MAAM,OAAS,EAAI,QAAQ,EAAQ,MAAM,OAAS,EAAE,OAAS,GAClF,MAAO,kBAAkB,EAAQ,MAAM,WAAW,EAAQ,QAAU,EAAI,OAAS,WAAW,EAAQ,KAAK,IAAQ,EAAK,GAAK,GAAG,8CAChI,CAEA,IAAM,EAAS,GAAuB,EAAI,cAAgB,KAAO,IAAM,GAAG,EAAI,cAAc,EAAI,kBAAoB,KAAqC,GAA9B,MAAM,EAAI,oBAErI,SAAgB,GAAU,CAAE,OAAM,UAAS,MAAK,WAA4H,CAC1K,IAAM,EAAO,GAAM,OAAS,KACtB,EAAO,GAAM,OAAS,CAAC,EAC7B,OACE,UAAC,EAAD,CAAM,MAAM,eAAe,QAAS,EAAO,GAAG,EAAK,OAAO,iEAAmE,OAA7H,UACI,EAEG,EAED,EAAK,SAAW,GAClB,SAAC,EAAD,UAAU,+BAAuC,GAC/C,GACF,SAAC,KAAD,CAAI,UAAW,EAAO,UACnB,WAAK,IAAK,IACT,UAAC,KAAD,CAAmB,UAAW,EAAO,SAAU,GAAI,EAAS,QAAQ,EAAI,MAAM,EAA9E,WACE,UAAC,MAAD,CAAK,UAAW,EAAO,aAAvB,WACE,SAAC,OAAD,CAAM,UAAW,EAAO,SAAW,WAAI,IAAW,IAClD,SAAC,EAAD,CAAiB,MAAc,SAAU,EACtC,KACL,UAAC,KAAD,CAAI,UAAW,EAAO,MAAtB,WACE,UAAC,MAAD,YAAK,SAAC,KAAD,UAAI,OAAS,IAAC,SAAC,KAAD,WAAI,SAAC,EAAD,CAAiB,KAAM,EAAK,EAAM,KACzD,UAAC,MAAD,YAAK,SAAC,KAAD,UAAI,YAAc,IAAC,SAAC,KAAD,UAAK,EAAI,YAAc,EAAe,EAAI,WAAW,EAAI,GAAQ,EAAM,KAC/F,UAAC,MAAD,YAAK,SAAC,KAAD,UAAI,OAAS,IAAC,SAAC,KAAD,UAAK,EAAM,CAAG,CAAM,EAAM,KAC7C,UAAC,MAAD,YAAK,SAAC,KAAD,UAAI,UAAY,IAAC,SAAC,KAAD,WAAI,SAAC,EAAD,CAAgB,KAAM,EAAK,EAAM,GACzD,KACJ,SAAC,EAAD,CAAY,MAAU,KAAM,EAC1B,CAZK,IAAI,IAYT,CACL,CACC,IAEJ,SAAC,MAAD,CAAK,UAAW,EAAO,UACrB,oBAAC,QAAD,CAAO,UAAW,EAAO,MAAzB,WACE,SAAC,UAAD,CAAS,UAAU,kBAAkB,gCAA8B,IACnE,SAAC,QAAD,WACE,UAAC,KAAD,YACE,SAAC,KAAD,CAAI,MAAM,MAAM,qBAAc,IAC9B,SAAC,KAAD,CAAI,MAAM,MAAM,gBAAS,IACzB,SAAC,KAAD,CAAI,MAAM,MAAM,qBAAc,IAC9B,SAAC,KAAD,CAAI,MAAM,MAAM,UAAW,EAAO,IAAK,gBAAS,IAChD,SAAC,KAAD,CAAI,MAAM,MAAM,iCAA0B,IAC1C,SAAC,KAAD,CAAI,MAAM,MAAM,UAAW,EAAO,IAAK,mBAAY,IACnD,SAAC,KAAD,CAAI,MAAM,MAAM,gBAAS,IACzB,SAAC,KAAD,CAAI,MAAM,MAAM,mBAAC,OAAD,CAAM,UAAU,kBAAkB,iBAAY,EAAK,EACjE,GACC,IACP,SAAC,QAAD,UACG,EAAK,IAAK,IACT,UAAC,KAAD,CAAmB,GAAI,EAAS,QAAQ,EAAI,MAAM,EAAG,YAAW,EAAI,MAAM,OAAS,GAAK,OAAxF,WACE,SAAC,KAAD,CAAI,MAAM,MAAM,UAAW,EAAO,SAAW,WAAI,IAAS,IAC1D,SAAC,KAAD,WAAI,SAAC,EAAD,CAAiB,KAAM,EAAK,IAChC,SAAC,KAAD,UAAK,EAAI,YAAc,EAAe,EAAI,WAAW,EAAI,GAAQ,IACjE,SAAC,KAAD,CAAI,UAAW,EAAO,IAAM,WAAM,CAAG,CAAM,IAC3C,SAAC,KAAD,WAAI,SAAC,EAAD,CAAgB,KAAM,EAAK,IAC/B,SAAC,KAAD,CAAI,UAAW,EAAO,IAAM,WAAI,cAAgB,GAAQ,IACxD,SAAC,KAAD,WAAI,SAAC,EAAD,CAAY,MAAU,KAAM,EAAK,IACrC,SAAC,KAAD,CAAI,UAAW,EAAO,WAAY,mBAAC,EAAD,CAAiB,MAAc,SAAU,EAAK,EAC9E,CATK,IAAI,IAST,CACL,CACI,EACF,GACJ,IApDL,SAAC,EAAD,CAAU,KAAK,UAAW,WAAK,QAAU,qCAAgD,IAFzF,SAAC,IAAD,CAAG,UAAW,EAAO,MAAO,YAAU,OAAO,gCAAwB,GAwDtE,GAAQ,EAAY,EAAK,OAAO,GAAI,SAAC,IAAD,CAAG,UAAW,EAAO,MAAQ,WAAY,EAAK,OAAO,CAAK,GAAI,IAC/F,GAEV,CCpKA,IAAa,EAAgB,IAChB,EAAqB,IAK5B,MAAkB,kBAAW,OAAO,kEAA8B,EAElE,MAAgB,kBAAW,OAAO,yBAAuB,cAAC,KAAM,IAAO,CAAE,aAAe,SAAC,EAAE,cAAH,CAAiB,WAAU,EAAE,EAAE,oFAAC,EAE9H,SAAgB,IAAe,CAC7B,GAAM,CAAE,WAAY,GAAY,EAC1B,EAAQ,EAAS,CAAc,EAC/B,EAAY,EAAS,CAAc,EACnC,EAAS,EAAS,EAAa,CAAE,QAAS,IAAO,CAAC,EAClD,EAAU,EAAS,EAAoB,CAAE,QAAS,IAAO,CAAC,EAC1D,EAAe,EAAW,CAAc,EACxC,EAAmB,EAAW,CAAc,EAC5C,EAAiB,EAAW,CAAkB,EACpD,EAAoB,EAAc,CAAa,EAC/C,MAA0B,CACxB,EAAiB,EACjB,EAAe,CACjB,EAAG,CAAkB,EAErB,IAAM,EAAM,GAAO,IAAM,EACnB,EAAU,GAAkB,EAC5B,CAAC,EAAc,MAAmB,YAAS,EAAK,EAChD,KAAa,SAAM,EACnB,EAAO,EAAM,MAAM,OAAS,KAC5B,EAAM,GAAe,EAGrB,EADY,EAAS,GAAgB,CAAE,QAAS,GAAO,CAC1C,EAAU,MAAM,OAAO,MAAM,OAAS,KAEnD,EAAgB,IAAe,MAAQ,IAAe,OAGtD,EAAW,GAAO,MAAQ,IAAS,MAAQ,EAAc,CAAI,EAEnE,SAAS,GAAqB,CAC5B,EAAgB,EAAI,EACpB,0BAA4B,SAAS,eAAe,CAAU,CAAC,EAAE,iBAAiB,CAAE,MAAO,QAAS,SAAU,QAAS,CAAC,CAAC,CAC3H,CAEA,OACE,UAAC,GAAD,CACE,MAAM,QACN,QAAS,EAAM,SAAW,cAAe,SAAC,EAAD,CAAmB,GAAI,KAChE,MACE,iCACE,SAAC,GAAD,CAAuB,SAAU,IACjC,SAAC,GAAD,CAAkB,MAAO,GACxB,GAAM,SAAC,GAAD,CAAkB,MAAO,EAAK,KAAK,OAAS,GAAI,IACvD,IARN,UAWG,EAAW,MACV,SAAC,EAAD,CAAM,KAAM,GACV,mBAAC,GAAD,CAAc,KAAM,EAAM,KAAW,MAAK,MAAO,EAAU,EAAI,EAAK,EAChE,GAEP,GACC,SAAC,EAAD,CAAM,KAAM,GACV,mBAAC,WAAD,CAAU,UAAU,SAAC,IAAD,CAAG,UAAW,EAAO,MAAO,YAAU,OAAO,oCAA4B,GAC3F,mBAAC,GAAD,CAAsB,KAAM,EACpB,EACN,GACJ,KACH,EAAW,MACV,SAAC,EAAD,CAAM,KAAM,EACV,mBAAC,GAAD,CAAiB,KAAM,EAAM,IAAO,EAChC,IAER,SAAC,EAAD,CAAM,KAAM,EAAW,EAAI,EACzB,mBAAC,GAAD,CAAa,KAAM,EAAM,KAAM,QAAS,EAAQ,MAAQ,KAAM,KAAM,EAAO,MAAQ,KAAW,KAAM,EAChG,GACL,EAAW,MACV,SAAC,EAAD,CAAM,KAAM,EACV,mBAAC,GAAD,CAAY,KAAM,EAAM,KAAW,KAAM,EACrC,IAER,SAAC,EAAD,CAAM,KAAM,EAAW,EAAI,EACzB,mBAAC,GAAD,CAAe,KAAM,EAAU,KAAM,eAAgB,EAAc,KAAM,GAAM,QAAU,MAAS,EAC9F,IACN,SAAC,EAAD,CAAM,KAAM,GACV,mBAAC,GAAD,CAAW,KAAM,EAAM,KAAe,UAAc,MAAc,SAAU,EACxE,IACN,SAAC,EAAD,CAAM,KAAM,GACV,oBAAC,MAAD,CAAK,UAAW,EAAO,SAAvB,WACE,UAAC,SAAD,CACE,KAAK,SACL,UAAW,EAAO,WAClB,gBAAe,EACf,gBAAe,EACf,YAAe,EAAiB,GAAM,CAAC,CAAC,EAL1C,WAOE,SAAC,GAAD,CAAkB,UAAW,EAAO,QAAS,MAAO,GAAI,OAAQ,GAAI,cAAY,MAAQ,GAAC,YAEzF,SAAC,OAAD,CAAM,UAAW,EAAO,eAAgB,iFAA4E,EAC9G,CACR,aAAC,MAAD,CAAK,GAAI,EAAY,OAAQ,CAAC,EAC3B,YACC,SAAC,WAAD,CAAU,UAAU,SAAC,IAAD,CAAG,UAAW,EAAO,MAAO,YAAU,OAAO,uCAA+B,GAC9F,mBAAC,GAAD,CAAgB,EACR,GACR,IACD,EACF,GACD,GACL,EAAQ,OACF,GAEb","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/cloud/CloudLaneChip.tsx","../../../../../../src/web-ui/routes/verse/fleet/FleetCards.tsx","../../../../../../src/web-ui/routes/verse/fleet/RepoTable.tsx","../../../../../../src/web-ui/routes/verse/sections/FleetSection.tsx"],"sourcesContent":["/**\n * routes/verse/cloud/CloudLaneChip.tsx — \"Cloud · N running\" at the end of\n * Fleet's lanes row (3.11 unit C3; mounted by fleet/FleetCards.tsx\n * LanesStrip). Styled by the lanes row's own classes, which it passes in,\n * so it reads as one more lane.\n *\n * N counts tasks queued, launching or running — sessions Verse started that\n * have not delivered a PR yet. A server without the cloud lane renders no\n * chip at all: the lanes row is not the place to say \"not in this build\".\n */\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { inFlightCount } from './cloud-model.js';\nimport { CLOUD_POLL_MS, cloudQuery } from './cloud-queries.js';\nimport styles from './cloud.module.css';\n\nexport interface CloudLaneChipClasses {\n lane?: string;\n name?: string;\n sep?: string;\n slots?: string;\n}\n\nexport function CloudLaneChip({ classes = {} }: { classes?: CloudLaneChipClasses }) {\n const read = useQuery(cloudQuery, { freshMs: 15_000 });\n const refetch = useRefetch(cloudQuery);\n usePollWhileVisible(refetch, CLOUD_POLL_MS);\n const overview = read.data?.value ?? null;\n if (!overview) return null;\n const running = inFlightCount(overview.tasks);\n const title = `Claude Code cloud sessions Verse launched that have not delivered a PR yet. ${overview.budget.sessionsToday} of ${overview.budget.budget.maxSessionsPerDay} sessions used today.`;\n return (\n <li className={`${classes.lane ?? ''} ${styles.laneChip}`} data-active={running > 0 || undefined} title={title} aria-label={`Cloud: ${running} running`}>\n <span className={classes.name}>Cloud</span>\n <span className={classes.sep} aria-hidden=\"true\">\n {' · '}\n </span>\n <span className={classes.slots}>{running} running</span>\n </li>\n );\n}\n","/**\n * routes/verse/fleet/FleetCards.tsx — the Fleet surface's cards (SPEC-310B §6,\n * SPEC-310C §5; unit C7): lanes, the live swimlane, the gate funnel with its\n * refusal reasons, \"why this seat\", the parked Gantt and Overnight.\n *\n * Every card takes an OptionalRead and draws the designed state for each way\n * a source can be missing (not landed, unrecognised, dark) — never empty axes.\n */\nimport type { FleetLaneState, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { SeatDecision } from '../../../../core/routing/types.js';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport { BarStack } from '../../../components/charts/BarStack.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { Funnel } from '../../../components/charts/Funnel.js';\nimport { Swimlane } from '../../../components/charts/Swimlane.js';\nimport { EngineMarker } from '../../../components/primitives/Tag.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport type { OptionalFleetRead } from '../autonomy/fleet-contract.js';\nimport type { OvernightStatus } from '../autonomy/overnight-contract.js';\nimport { describeStopRule } from '../autonomy/overnight-model.js';\nimport { CloudLaneChip } from '../cloud/CloudLaneChip.js';\nimport { Card, CardNote, MicroLabel } from '../command/Surface.js';\nimport type { OptionalRead } from '../command/surface-data.js';\nimport { fleetDarkStatus } from './dark-since.js';\nimport { LANE_ENGINE, LANE_LABEL, funnelStages, laneChipText, laneNotes, laneReason, laneRows, latestDecision, parkedGantt, refusalStack, runTone } from './live-model.js';\nimport { asSentence, decisionSummary, describeEligibleAgain, eligibleAgain, heldBackText } from './why-seat-model.js';\nimport styles from './fleet.module.css';\n\nconst HOUR = 3_600_000;\n\n/**\n * The shared \"is there a fleet to draw at all\" decision for every chart card.\n * Dark reads THE dark-since instant (`fleetDarkStatus`), as the viewer's local\n * day — the same day Command's verdict line names — and no day at all when\n * the server does not know one.\n */\nexport function fleetStatus(read: OptionalRead<FleetLiveSnapshotV1> | undefined, empty: string, hasData: boolean): ChartStatus {\n if (!read) return { kind: 'loading' };\n const live = read.value;\n if (!live) return { kind: 'unknown', reason: read.reason ?? 'the live fleet view did not answer.' };\n if (live.state === 'dark' && !hasData) return fleetDarkStatus(live);\n return hasData ? { kind: 'ready' } : { kind: 'empty', message: empty };\n}\n\n// ---------------------------------------------------------------------------\n// Lanes strip + live swimlane\n// ---------------------------------------------------------------------------\n\n/** \"Local · off\" — the chip is the lane and its slots; its why is one line below the strip (and its title). */\nfunction LaneChip({ lane }: { lane: FleetLaneState }) {\n const text = laneChipText(lane);\n return (\n <li className={styles.lane} data-off={lane.slots === 0 || undefined} title={laneReason(lane) ?? undefined}>\n <EngineMarker engine={LANE_ENGINE[lane.lane]} />\n <span className={styles.laneName}>{text.name}</span>\n <span className={styles.laneSep} aria-hidden=\"true\">\n {' · '}\n </span>\n <span className={styles.laneSlots}>{text.slots}</span>\n </li>\n );\n}\n\nexport function LanesStrip({ live }: { live: FleetLiveSnapshotV1 | null }) {\n if (!live || live.lanes.length === 0) return null;\n const notes = laneNotes(live.lanes);\n return (\n <div className={styles.laneStrip}>\n <ul className={styles.lanes} aria-label=\"Lanes: busy of slots\">\n {live.lanes.map((l) => (\n <LaneChip key={l.lane} lane={l} />\n ))}\n <CloudLaneChip classes={{ lane: styles.lane, name: styles.laneName, sep: styles.laneSep, slots: styles.laneSlots }} />\n </ul>\n {notes.length > 0 ? (\n <ul className={styles.laneNotes} aria-label=\"Why lanes are limited\">\n {notes.map((n) => (\n <li key={n.lanes.join(',')}>\n {n.all ? null : <span className={styles.laneNoteLanes}>{n.lanes.map((l) => LANE_LABEL[l]).join(', ')}: </span>}\n {asSentence(n.reason)}\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n );\n}\n\nexport function LiveSwimlane({ read, now, hours }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; now: number; hours: number }) {\n const live = read?.value ?? null;\n const from = now - hours * HOUR;\n const lanes = live ? laneRows(live.runs, from, now, { includeParked: false }) : [];\n return (\n <Swimlane\n title=\"Live fleet\"\n description={`Lanes × slots, last ${hours} h · bars coloured by phase or outcome · outlines are queued`}\n status={fleetStatus(read, `Nothing ran in the last ${hours} hours.`, lanes.length > 0)}\n lanes={lanes}\n from={from}\n to={now}\n now={now}\n toneOf={runTone}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Gate funnel + refusal reasons\n// ---------------------------------------------------------------------------\n\nexport function GateFunnelCards({ read }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined }) {\n const live = read?.value ?? null;\n const funnel = live?.funnel ?? null;\n const stages = funnelStages(funnel);\n const refusals = refusalStack(funnel);\n const window = funnel ? `${new Date(funnel.from).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })} – ${new Date(funnel.to).toLocaleDateString('en-US', { month: 'short', day: 'numeric' })}` : undefined;\n return (\n <div className={styles.stack}>\n <Funnel\n title=\"Gate funnel\"\n description={window ? `Proposals through G0–G7, ${window}` : 'Proposals through the merge gates G0–G7'}\n status={fleetStatus(read, 'No proposal reached the gates in this window.', stages.length > 0)}\n stages={stages}\n />\n <BarStack\n title=\"Refusals by gate\"\n description={refusals.total ? `${refusals.total} refusals · top reasons keep their colour` : 'Why proposals stopped'}\n status={fleetStatus(read, 'Nothing was refused in this window.', refusals.total > 0)}\n categories={refusals.categories}\n segments={refusals.segments}\n values={refusals.values}\n height={180}\n />\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Why this seat\n// ---------------------------------------------------------------------------\n\nfunction seatLabel(view: BudgetView | null, seatId: string): { label: string; engine: 'claude' | 'codex' | 'grok' | 'local' | null } {\n const info = view?.seatInfo.find((s) => s.seatId === seatId);\n return { label: info?.label ?? seatId, engine: info?.engine ?? null };\n}\n\nexport function DecisionView({ decision, view, now }: { decision: SeatDecision; view: BudgetView | null; now?: number }) {\n const chosen = decision.seatId ? seatLabel(view, decision.seatId) : null;\n return (\n <div className={styles.decision}>\n <p className={styles.decisionLead}>\n {chosen ? (\n <>\n {chosen.engine ? <EngineMarker engine={chosen.engine} /> : null}\n <strong>{chosen.label}</strong>\n </>\n ) : (\n <strong>No seat</strong>\n )}\n <span className={styles.mode}>{decision.mode}</span>\n </p>\n <p className={styles.decisionWhy}>{decisionSummary(decision)}</p>\n {decision.candidates.length > 1 ? (\n <div>\n <MicroLabel>Then</MicroLabel>\n <ol className={styles.candidates}>\n {decision.candidates.slice(decision.seatId ? 1 : 0).map((id) => (\n <li key={id}>{seatLabel(view, id).label}</li>\n ))}\n </ol>\n </div>\n ) : null}\n {decision.exclusions.length ? (\n <div>\n <MicroLabel>Held back</MicroLabel>\n <ul className={styles.exclusions} aria-label=\"Held back seats\">\n {decision.exclusions.map((x) => (\n <li key={x.seatId}>\n <span className={styles.excluded}>{seatLabel(view, x.seatId).label}</span>\n <span className={styles.excludedWhy}>{heldBackText(x)}</span>\n <span className={styles.excludedWhen}>eligible again: {describeEligibleAgain(eligibleAgain(x), now)}</span>\n </li>\n ))}\n </ul>\n </div>\n ) : null}\n </div>\n );\n}\n\nexport function WhySeatCard({ read, preview, view, now }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; preview: SeatDecision | null; view: BudgetView | null; now?: number }) {\n const latest = latestDecision(read?.value ?? null);\n return (\n <Card\n title=\"Why this seat\"\n caption={latest ? `Latest dispatch: ${latest.run.title} (${formatRelative(latest.run.phaseStartedAt ?? latest.run.startedAt)})` : preview ? 'The next medium autonomous task would go to…' : undefined}\n >\n {latest ? (\n <DecisionView decision={latest.decision} view={view} now={now} />\n ) : preview ? (\n <DecisionView decision={preview} view={view} now={now} />\n ) : (\n <CardNote tone=\"unknown\">No routing decision yet. The router preview didn't answer.</CardNote>\n )}\n </Card>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Parked Gantt\n// ---------------------------------------------------------------------------\n\nexport function ParkedCard({ read, now }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; now: number }) {\n const live = read?.value ?? null;\n const gantt = live ? parkedGantt(live.runs, now) : { lanes: [], from: now - HOUR, to: now + 2 * HOUR, unknownRelease: 0 };\n return (\n <Swimlane\n title=\"Parked\"\n description=\"Waiting for a seat to free up — each bar ends when it should\"\n caveat={gantt.unknownRelease ? `${gantt.unknownRelease} item${gantt.unknownRelease === 1 ? ' has' : 's have'} no known release time; ${gantt.unknownRelease === 1 ? 'it runs' : 'they run'} to the right edge.` : undefined}\n status={fleetStatus(read, 'Nothing is parked.', gantt.lanes.length > 0)}\n lanes={gantt.lanes}\n from={gantt.from}\n to={gantt.to}\n now={now}\n toneOf={runTone}\n formatTick={(ms) => new Date(ms).toLocaleString('en-US', { weekday: 'short', hour: 'numeric' })}\n />\n );\n}\n\n// ---------------------------------------------------------------------------\n// Overnight\n// ---------------------------------------------------------------------------\n\nexport function OvernightCard({ read, onOpenAdvanced, dark = false }: { read: OptionalFleetRead<OvernightStatus> | undefined; onOpenAdvanced: () => void; /** The fleet is dark: it has no \"normal schedule\" to run on. */ dark?: boolean }) {\n const status = read?.value ?? null;\n const run = status?.run ?? null;\n return (\n <Card\n title=\"Overnight\"\n caption={status ? (status.armed ? 'Armed' : 'Not armed') : undefined}\n actions={\n <button type=\"button\" className={styles.link} onClick={onOpenAdvanced}>\n Arm or stop in Advanced\n </button>\n }\n >\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the overnight lane…</p>\n ) : !status ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The overnight lane did not answer.'}</CardNote>\n ) : !status.armed && !run ? (\n <CardNote>{dark ? 'Nothing armed.' : 'Nothing armed. The fleet runs on its normal schedule.'}</CardNote>\n ) : (\n <div className={styles.overnight}>\n {run?.stopRule ? <p className={styles.overnightLead}>{describeStopRule(run.stopRule)}</p> : null}\n <dl className={styles.facts}>\n <div>\n <dt>Started</dt>\n <dd>{run?.startedAt ? formatRelative(run.startedAt) : '—'}</dd>\n </div>\n <div>\n <dt>Iterations</dt>\n <dd>{run?.iterationsDone ?? '—'}</dd>\n </div>\n <div>\n <dt>Merged</dt>\n <dd>{run ? run.merged.length : '—'}</dd>\n </div>\n <div>\n <dt>Discarded</dt>\n <dd>{run ? run.discarded.length : '—'}</dd>\n </div>\n </dl>\n {run?.activity ? <p className={styles.muted}>Now: {run.activity}</p> : null}\n {run && run.discarded.length ? (\n <ul className={styles.discarded} aria-label=\"Discarded work\">\n {run.discarded.slice(0, 3).map((d) => (\n <li key={d.id}>\n <span className={styles.discardTitle}>{d.title}</span>\n <span className={styles.discardWhy}>{d.reason}</span>\n </li>\n ))}\n </ul>\n ) : null}\n </div>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/fleet/RepoTable.tsx — one row per enrolled repo (SPEC-310C §5\n * Fleet \"Repo table: stage, last merge, green% sparkline, holds,\n * pause/resume\"; unit C7).\n *\n * Pause sets an owner-hold as Mason; Resume clears every active hold (or the\n * one a Needs-you item names). Both confirm first — a pause stops new work\n * in a repo, a resume can lift a quarantine early — then take the token.\n * At 375 px the table becomes one card per repo (a 7-column table does not\n * fit a phone, and a horizontal scroll hides the action).\n */\nimport type { FleetLiveSnapshotV1, FleetMirrorSummary, FleetRepoRow, RepoHold } from '../../../../core/fleet/fleet-types.js';\nimport { Sparkline } from '../../../components/charts/Sparkline.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { formatRelative } from '../autonomy/format.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { anchorId } from '../command/nav.js';\nimport { Card, CardNote } from '../command/Surface.js';\nimport { postFleetLive, type OptionalRead } from '../command/surface-data.js';\nimport styles from './fleet.module.css';\n\nconst HOLD_WORD: Record<RepoHold['kind'], string> = {\n quarantine: 'Quarantined',\n 'owner-hold': 'On hold (you)',\n 'leader-pause': 'Paused by Leader',\n cooldown: 'Cooling down',\n};\n\nexport function holdText(hold: RepoHold, now: number): string {\n const until = hold.until ? Date.parse(hold.until) : NaN;\n const left = Number.isFinite(until) ? Math.max(0, until - now) : null;\n const tail = left === null ? 'until resumed' : left < 3_600_000 ? `${Math.ceil(left / 60_000)}m left` : `${Math.round(left / 3_600_000)}h left`;\n return `${HOLD_WORD[hold.kind]} · ${tail}`;\n}\n\nfunction shortRepo(repo: string): string {\n return repo.includes('/') ? repo.split('/')[1]! : repo;\n}\n\nfunction StageBadge({ row }: { row: FleetRepoRow }) {\n if (row.stage === null) return <span className={styles.stage} data-stage=\"none\">Not in grant</span>;\n return (\n <span className={styles.stage} data-stage={row.stage}>\n {row.stage === 'merge' ? 'Merge' : 'Propose'}\n {row.enforcement === 'local' ? <span className={styles.stageNote}> · local checks</span> : null}\n </span>\n );\n}\n\nfunction RepoAction({ row, actions }: { row: FleetRepoRow; actions: SurfaceActions }) {\n const disabled = actions.busy || actions.readOnly;\n if (row.holds.length) {\n return (\n <Button\n size=\"sm\"\n variant=\"subtle\"\n disabled={disabled}\n aria-label={`Resume ${row.repo}`}\n onClick={() =>\n actions.act(() => postFleetLive({ action: 'resume-repo', repo: row.repo }), `Resume ${row.repo}`, {\n confirm: {\n title: `Resume ${shortRepo(row.repo)}?`,\n body: `Clears ${row.holds.map((h) => HOLD_WORD[h.kind].toLowerCase()).join(' and ')}. New fleet work can start there on the next tick.`,\n confirmLabel: 'Resume',\n },\n })\n }\n >\n Resume\n </Button>\n );\n }\n if (row.stage === null) return null;\n return (\n <Button\n size=\"sm\"\n variant=\"ghost\"\n disabled={disabled}\n aria-label={`Pause ${row.repo}`}\n onClick={() =>\n actions.act(() => postFleetLive({ action: 'pause-repo', repo: row.repo, reason: 'Paused by Mason from the Fleet surface' }), `Pause ${row.repo}`, {\n confirm: {\n title: `Pause ${shortRepo(row.repo)}?`,\n body: 'No new fleet work starts there until you resume it. Runs already in flight finish and are watched as usual.',\n confirmLabel: 'Pause repo',\n destructive: true,\n },\n })\n }\n >\n Pause\n </Button>\n );\n}\n\nfunction GreenCell({ row }: { row: FleetRepoRow }) {\n return (\n <span className={styles.green}>\n <span className={styles.greenValue}>{row.greenPct7d === null ? '—' : `${Math.round(row.greenPct7d)}%`}</span>\n <Sparkline points={row.greenTrend} width={64} height={18} ariaLabel={`${row.repo} post-merge green, 14 days`} describe={(v) => `${Math.round(v)}%`} />\n </span>\n );\n}\n\nfunction Holds({ row, now }: { row: FleetRepoRow; now: number }) {\n if (!row.holds.length) return <span className={styles.muted}>—</span>;\n return (\n <span className={styles.holds}>\n {row.holds.map((h) => (\n <span key={h.kind} className={styles.hold} data-kind={h.kind} title={h.reason}>\n {holdText(h, now)}\n </span>\n ))}\n </span>\n );\n}\n\n/**\n * The fleet's own mirror clones, apart from the repo rows. WHY separate: a\n * mirror is the fleet's working copy of a repo already listed above, so\n * counting it as a row double-counts the repo (and its pause would not pause\n * the real one). `undefined` = an older server that does not report mirrors\n * (say nothing); `null` = the enrollment registry could not be read (say so —\n * unknown is never \"none\").\n */\nexport function mirrorsText(mirrors: FleetMirrorSummary | null | undefined): string | null {\n if (mirrors === undefined) return null;\n if (mirrors === null) return 'Fleet mirrors: unknown — the enrollment registry could not be read.';\n if (mirrors.count === 0) return 'Fleet mirrors: none yet — the fleet clones a repo the first time it works on it.';\n const shown = mirrors.repos.slice(0, 6).join(', ');\n const more = mirrors.repos.length > 6 ? ` and ${mirrors.repos.length - 6} more` : '';\n return `Fleet mirrors: ${mirrors.count} working ${mirrors.count === 1 ? 'copy' : 'copies'}${shown ? ` (${shown}${more})` : ''} — the fleet's own clones of the repos above.`;\n}\n\nconst today = (row: FleetRepoRow) => (row.mergesToday === null ? '—' : `${row.mergesToday}${row.maxMergesPerDay !== null ? ` / ${row.maxMergesPerDay}` : ''}`);\n\nexport function RepoTable({ read, actions, now, compact }: { read: OptionalRead<FleetLiveSnapshotV1> | undefined; actions: SurfaceActions; now: number; compact: boolean }) {\n const live = read?.value ?? null;\n const rows = live?.repos ?? [];\n return (\n <Card title=\"Repositories\" caption={live ? `${rows.length} enrolled · stage is what the grant and rollout allow right now` : undefined}>\n {!read ? (\n <p className={styles.muted} aria-busy=\"true\">Reading repositories…</p>\n ) : !live ? (\n <CardNote tone=\"unknown\">{read.reason ?? 'The live fleet view did not answer.'}</CardNote>\n ) : rows.length === 0 ? (\n <CardNote>No repositories are enrolled.</CardNote>\n ) : compact ? (\n <ul className={styles.repoCards}>\n {rows.map((row) => (\n <li key={row.repo} className={styles.repoCard} id={anchorId(`repo-${row.repo}`)}>\n <div className={styles.repoCardHead}>\n <span className={styles.repoName}>{row.repo}</span>\n <RepoAction row={row} actions={actions} />\n </div>\n <dl className={styles.facts}>\n <div><dt>Stage</dt><dd><StageBadge row={row} /></dd></div>\n <div><dt>Last merge</dt><dd>{row.lastMergeAt ? formatRelative(row.lastMergeAt) : '—'}</dd></div>\n <div><dt>Today</dt><dd>{today(row)}</dd></div>\n <div><dt>Green 7d</dt><dd><GreenCell row={row} /></dd></div>\n </dl>\n <Holds row={row} now={now} />\n </li>\n ))}\n </ul>\n ) : (\n <div className={styles.tableWrap}>\n <table className={styles.table}>\n <caption className=\"visually-hidden\">Enrolled repositories</caption>\n <thead>\n <tr>\n <th scope=\"col\">Repository</th>\n <th scope=\"col\">Stage</th>\n <th scope=\"col\">Last merge</th>\n <th scope=\"col\" className={styles.num}>Today</th>\n <th scope=\"col\">Post-merge green · 14d</th>\n <th scope=\"col\" className={styles.num}>Open PRs</th>\n <th scope=\"col\">Holds</th>\n <th scope=\"col\"><span className=\"visually-hidden\">Action</span></th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row) => (\n <tr key={row.repo} id={anchorId(`repo-${row.repo}`)} data-held={row.holds.length > 0 || undefined}>\n <th scope=\"row\" className={styles.repoName}>{row.repo}</th>\n <td><StageBadge row={row} /></td>\n <td>{row.lastMergeAt ? formatRelative(row.lastMergeAt) : '—'}</td>\n <td className={styles.num}>{today(row)}</td>\n <td><GreenCell row={row} /></td>\n <td className={styles.num}>{row.openFleetPrs ?? '—'}</td>\n <td><Holds row={row} now={now} /></td>\n <td className={styles.actionCell}><RepoAction row={row} actions={actions} /></td>\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n )}\n {live && mirrorsText(live.mirrors) ? <p className={styles.muted}>{mirrorsText(live.mirrors)}</p> : null}\n </Card>\n );\n}\n","/**\n * routes/verse/sections/FleetSection.tsx — ⌘2 Fleet (SPEC-310B §6,\n * SPEC-310C §5; unit C7). What is running where, why that seat, what is\n * waiting, and per-repo control.\n *\n * Live swimlane by lane × phase (12)\n * Shadow decisions: G0–G7 per proposal, ladder regressions (12)\n * Gate funnel + refusal reasons (7) | Why this seat (5)\n * Parked Gantt (7) | Overnight (5)\n * Repo table: stage, last merge, green% sparkline, holds, pause/resume (12)\n * ▸ Advanced — the eleven legacy Autonomy panels, fetched only when opened\n *\n * At 375 px: one column in that order; the repo table becomes cards.\n * The live view polls every 5 s while Fleet is the visible surface.\n *\n * Autonomy off: the shared AutonomyOffState sits under the lanes, and when\n * the fleet has nothing to draw (no runs, no gate traffic) the three chart\n * cards are left out instead of each repeating \"Fleet dark since …\".\n */\nimport { Suspense, lazy, useId, useState } from 'react';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { IconChevronRight } from '../../../components/primitives/icons.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { AutonomyOffState, useAutonomyOff } from '../autonomy/AutonomyOffState.js';\nimport { overnightQuery } from '../autonomy/overnight-queries.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { budgetPreviewQuery, budgetQuery } from '../budget/budget-queries.js';\nimport { ActionStatus, useSurfaceActions } from '../command/actions.js';\nimport { Cell, Surface } from '../command/Surface.js';\nimport { authorityQuery, fleetLiveQuery } from '../command/surface-data.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { GateFunnelCards, LanesStrip, LiveSwimlane, OvernightCard, ParkedCard, WhySeatCard } from '../fleet/FleetCards.js';\nimport { RepoTable } from '../fleet/RepoTable.js';\nimport { nothingToDraw } from '../fleet/live-model.js';\nimport styles from '../fleet/fleet.module.css';\n\nexport const FLEET_POLL_MS = 5_000;\nexport const FLEET_SLOW_POLL_MS = 30_000;\n\n// The legacy cockpit is ~74 KB of panels: its own chunk, loaded on open.\n// Shadow decisions (3.14): the gates' verdicts per proposal and ladder\n// regressions — its own chunk, loaded once a grant has ever been signed.\nconst ShadowDecisions = lazy(() => import('../fleet/ShadowDecisions.js'));\n\nconst FleetAdvanced = lazy(() => import('../fleet/Advanced.js').then((m) => ({ default: () => <m.FleetAdvanced embedded /> })));\n\nexport function FleetSection() {\n const { compact } = useViewport();\n const fleet = useQuery(fleetLiveQuery);\n const overnight = useQuery(overnightQuery);\n const budget = useQuery(budgetQuery, { freshMs: 15_000 });\n const preview = useQuery(budgetPreviewQuery, { freshMs: 15_000 });\n const refetchFleet = useRefetch(fleetLiveQuery);\n const refetchOvernight = useRefetch(overnightQuery);\n const refetchPreview = useRefetch(budgetPreviewQuery);\n usePollWhileVisible(refetchFleet, FLEET_POLL_MS);\n usePollWhileVisible(() => {\n refetchOvernight();\n refetchPreview();\n }, FLEET_SLOW_POLL_MS);\n\n const now = useNow(15_000);\n const actions = useSurfaceActions();\n const [advancedOpen, setAdvancedOpen] = useState(false);\n const advancedId = useId();\n const live = fleet.data?.value ?? null;\n const off = useAutonomyOff();\n // Same cache entry as the off-state's read (no extra request).\n const authority = useQuery(authorityQuery, { freshMs: 30_000 });\n const grantState = authority.data?.value?.grant.state ?? null;\n // A grant (active, or lapsed with history) means the ledger has decisions to show.\n const showDecisions = grantState !== null && grantState !== 'none';\n // Collapse only what would be empty: a fleet stopped an hour ago still\n // draws its last runs.\n const collapse = off != null && live !== null && nothingToDraw(live);\n\n function openAdvanced(): void {\n setAdvancedOpen(true);\n requestAnimationFrame(() => document.getElementById(advancedId)?.scrollIntoView?.({ block: 'start', behavior: 'smooth' }));\n }\n\n return (\n <Surface\n title=\"Fleet\"\n actions={fleet.status === 'refreshing' ? <RefreshIndicator /> : null}\n lead={\n <>\n <ActionStatus actions={actions} />\n <LanesStrip live={live} />\n {off ? <AutonomyOffState state={off} here=\"fleet\" /> : null}\n </>\n }\n >\n {collapse ? null : (\n <Cell span={12}>\n <LiveSwimlane read={fleet.data} now={now} hours={compact ? 6 : 12} />\n </Cell>\n )}\n {showDecisions ? (\n <Cell span={12}>\n <Suspense fallback={<p className={styles.muted} aria-busy=\"true\">Loading shadow decisions…</p>}>\n <ShadowDecisions now={now} />\n </Suspense>\n </Cell>\n ) : null}\n {collapse ? null : (\n <Cell span={7}>\n <GateFunnelCards read={fleet.data} />\n </Cell>\n )}\n <Cell span={collapse ? 6 : 5}>\n <WhySeatCard read={fleet.data} preview={preview.data ?? null} view={budget.data ?? null} now={now} />\n </Cell>\n {collapse ? null : (\n <Cell span={7}>\n <ParkedCard read={fleet.data} now={now} />\n </Cell>\n )}\n <Cell span={collapse ? 6 : 5}>\n <OvernightCard read={overnight.data} onOpenAdvanced={openAdvanced} dark={live?.state === 'dark'} />\n </Cell>\n <Cell span={12}>\n <RepoTable read={fleet.data} actions={actions} now={now} compact={compact} />\n </Cell>\n <Cell span={12}>\n <div className={styles.advanced}>\n <button\n type=\"button\"\n className={styles.disclosure}\n aria-expanded={advancedOpen}\n aria-controls={advancedId}\n onClick={() => setAdvancedOpen((o) => !o)}\n >\n <IconChevronRight className={styles.chevron} width={14} height={14} aria-hidden=\"true\" />\n Advanced\n <span className={styles.disclosureNote}>daemon, overnight, local runtime, caps, scope, activity, safety, goals</span>\n </button>\n <div id={advancedId} hidden={!advancedOpen}>\n {advancedOpen ? (\n <Suspense fallback={<p className={styles.muted} aria-busy=\"true\">Loading the advanced panels…</p>}>\n <FleetAdvanced />\n </Suspense>\n ) : null}\n </div>\n </div>\n </Cell>\n {actions.dialogs}\n </Surface>\n );\n}\n"],"file":"FleetSection-BfplcwFU.js"}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{a as e,c as t,n}from"./index-DZ-UQ7v8.js";import{D as r,H as i,L as a,M as o,N as s,O as c,P as l,S as u,V as d,W as f,a as ee,c as te,i as ne,n as re,p,r as ie,s as m,t as ae,u as h,y as oe,z as g}from"./ChartFrame-DY-GVUb3.js";import{c as _,m as v}from"./colors-DvK0wMHH.js";import{i as y,r as b,t as se}from"./format-D7nBg2bn.js";var x=t(e(),1),S=n(),C=14,w=26,T=8,E=24,D=2;function ce({title:e,description:t,caveat:n,status:r,categories:p,segments:_,values:ce,normalize:O=!1,height:k=200,width:A,formatValue:j,formatTooltip:le,ariaLabel:ue}){let M=j??se,N=le??j??b,de=ee(),fe=(0,x.useRef)(null),P=ne(fe,A),F=ie(),[I,L]=(0,x.useState)(null),R=(0,x.useId)(),z=v((0,x.useId)()),B=_.map(e=>e.color),V=p.map((e,t)=>{let n=ce[t]??_.map(()=>null);return{label:e,values:n,stack:o(n)}}),H=V.some(e=>!e.stack.unknown),pe=Math.max(0,...V.map(e=>e.stack.total)),me=V.some(e=>e.stack.incomplete),he=r??(V.length===0||H&&pe===0&&!me?{kind:`empty`}:H?{kind:`ready`}:{kind:`unknown`}),ge=V.flatMap(e=>e.values.filter(e=>e!==null&&Number.isFinite(e))),U=O?{ticks:[0,.25,.5,.75,1],labels:[0,.25,.5,.75,1].map(e=>y(e))}:te(0,pe,{count:4,integer:m(ge),format:j}),W=U.ticks,_e=W[W.length-1],G=l(U.labels,28,60,F),K=Math.max(40,P-G-T),q=k-C-w,J=V.length?K/V.length:K,Y=Math.max(2,Math.min(E,J*.66)),X=u(0,_e,C+q,C),Z=e=>G+J*e+(J-Y)/2,ve=Math.max(0,...V.map(e=>e.label.length))*oe(F)+12,ye=s(V.length,Math.max(2,Math.floor(K/Math.max(64*F,ve)))),be=e=>t=>`${t.stack.incomplete&&!t.stack.unknown?`≥ `:``}${t.stack.unknown?`—`:e(t.stack.total)}`,xe=be(M),Se=be(N);function Ce(e){if(V.length===0)return;let t=I??V.length-1,n=e.key===`ArrowLeft`?t-1:e.key===`ArrowRight`?t+1:e.key===`Home`?0:e.key===`End`?V.length-1:null;n!==null&&(e.preventDefault(),L(Math.max(0,Math.min(V.length-1,n))))}let Q=V.reduce((e,t)=>!t.stack.unknown&&(!e||t.stack.total>e.stack.total)?t:e,null),we=ue??`${e}: ${V.length} columns of ${_.map(e=>e.label).join(`, `)}.`+(Q?` Highest: ${Q.label} with ${xe(Q)}.`:``),Te=[{key:`label`,label:`Category`,render:e=>e.label},..._.map((e,t)=>({key:e.id,label:e.label,numeric:!0,render:e=>e.values[t]===null||e.values[t]===void 0?`—`:M(e.values[t])})),{key:`__total`,label:`Total`,numeric:!0,render:xe}],$=I===null?void 0:V[I];return(0,S.jsx)(ae,{title:e,description:t,caveat:n,status:he,skeleton:`bars`,skeletonHeight:k,table:(0,S.jsx)(re,{caption:e,columns:Te,rows:V,rowKey:(e,t)=>`${t}:${e.label}`}),footer:(0,S.jsx)(a,{items:[..._.map((e,t)=>({label:e.label,color:B[t]})),...V.some(e=>e.stack.unknown)?[{label:`no data`,kind:`hatch`}]:[]]}),children:(0,S.jsxs)(`div`,{ref:fe,className:`${f.plotWrap} ${f.focusable}`,"data-motion":de,tabIndex:0,role:`group`,"aria-label":`${e}. Use the left and right arrow keys to read each column.`,"aria-describedby":R,onFocus:()=>L(e=>e??(V.length?V.length-1:null)),onBlur:()=>L(null),onKeyDown:Ce,children:[(0,S.jsxs)(`svg`,{className:f.svg,width:P,height:k,viewBox:`0 0 ${P} ${k}`,role:`img`,"aria-label":we,children:[(0,S.jsx)(`defs`,{children:(0,S.jsx)(d,{id:z})}),I===null?null:(0,S.jsx)(`rect`,{"data-role":`hover-band`,className:f.hoverBand,x:G+J*I+1,y:C,width:Math.max(0,J-2),height:q,rx:4}),W.map((e,t)=>(0,S.jsxs)(`g`,{children:[(0,S.jsx)(`line`,{className:f.grid,x1:G,x2:G+K,y1:h(X(e)),y2:h(X(e))}),(0,S.jsx)(`text`,{className:f.tick,x:G-6,y:X(e),dy:`0.32em`,textAnchor:`end`,children:U.labels[t]})]},e)),V.map((e,t)=>{let n=Z(t),r=O&&e.stack.total||1;if(e.stack.unknown)return(0,S.jsx)(`rect`,{"data-unknown":`true`,className:f.unknownMark,fill:`url(#${z})`,x:n+.5,y:C+q-12.5,width:Math.max(1,Y-1),height:12,rx:2},t);let i=e.stack.segments[e.stack.segments.length-1];return(0,S.jsxs)(`g`,{"data-column":t,className:f.rise,style:{"--chart-i":t},opacity:I!==null&&I!==t?.55:1,children:[e.stack.segments.map(e=>{let t=X(e.y1/r),a=X(e.y0/r),o=e===i,s=Math.max(0,a-t-(o?0:D)),l=o?t:t+D;return o?(0,S.jsx)(`path`,{d:c(n,l,Y,s),fill:B[e.index],"data-segment":_[e.index].id},e.index):(0,S.jsx)(`rect`,{x:n,y:l,width:Y,height:s,fill:B[e.index],"data-segment":_[e.index].id},e.index)}),e.stack.incomplete?(0,S.jsx)(`rect`,{"data-incomplete":`true`,className:f.noData,x:n,y:X(e.stack.total/r)-8,width:Y,height:6,rx:2}):null]},t)}),(0,S.jsx)(`line`,{className:f.axis,x1:G,x2:G+K,y1:h(C+q),y2:h(C+q)}),ye.map(e=>(0,S.jsx)(`text`,{className:f.tick,x:Z(e)+Y/2,y:k-8,textAnchor:`middle`,children:V[e].label},e)),V.map((e,t)=>(0,S.jsx)(`rect`,{className:f.hit,x:G+J*t,y:C,width:J,height:q,onPointerEnter:()=>L(t),onPointerLeave:()=>L(e=>e===t?null:e)},`hit${t}`))]}),(0,S.jsx)(`span`,{id:R,className:f.srOnly,"aria-live":`polite`,children:$?`${$.label}: ${_.map((e,t)=>`${e.label} ${$.values[t]===null?`no data`:N($.values[t])}`).join(`, `)}; total ${Se($)}`:``}),$&&I!==null?(0,S.jsx)(g,{left:i(Z(I)+Y/2,P),top:$.stack.unknown?C+q-12:X(O?1:$.stack.total),title:$.label,rows:[..._.map((e,t)=>({key:e.id,label:e.label,value:$.values[t]===null||$.values[t]===void 0?null:N($.values[t]),color:B[t]})),{key:`__t`,label:`Total`,value:$.stack.unknown?null:Se($),total:!0}]}):null]})})}var O=20,k=480;function A(e,t){return t===0?``:e.ofPrevious===null?`— of previous`:`${y(e.ofPrevious,+(e.ofPrevious<.1&&e.ofPrevious>0))} of previous`}function j({title:e,description:t,caveat:n,status:i,stages:a,width:o,color:s=_,formatValue:c=se,ariaLabel:l}){let u=(0,x.useRef)(null),d=ne(u,o),te=ee(),ie=p(a.map(e=>e.value)),m=a.map((e,t)=>({...ie[t],stage:e})),h=a[0]?.value??null,oe=i??(a.length===0||h===null?a.length===0?{kind:`empty`}:{kind:`unknown`,reason:`the first stage (${a[0].label}) is unknown`}:h===0?{kind:`empty`,message:`No ${a[0].label.toLowerCase()} in this window.`}:{kind:`ready`}),g=Math.max(0,...a.map(e=>e.value!==null&&Number.isFinite(e.value)?e.value:0)),v=d<k,b=v?0:Math.min(170,Math.round(d*.28)),C=v?150:180,w=Math.max(40,d-b-C),T=v?42:34,E=m.length*T+4,D=l??`${e}: `+m.map((e,t)=>`${e.stage.label} ${e.value===null?`unknown`:c(e.value)}${t>0?` (${A(e,t)})`:``}`).join(`, `)+`.`;return(0,S.jsx)(ae,{title:e,description:t,caveat:n,status:oe,skeleton:`funnel`,table:(0,S.jsx)(re,{caption:e,columns:[{key:`stage`,label:`Stage`,render:e=>e.stage.label},{key:`value`,label:`Count`,numeric:!0,render:e=>e.value===null?`—`:c(e.value)},{key:`prev`,label:`Of previous`,numeric:!0,render:e=>e.ofPrevious===null?`—`:y(e.ofPrevious,1)},{key:`first`,label:`Of first`,numeric:!0,render:e=>e.ofFirst===null?`—`:y(e.ofFirst,1)}],rows:m,rowKey:e=>e.stage.id}),children:(0,S.jsx)(`div`,{ref:u,className:f.plotWrap,"data-motion":te,children:(0,S.jsx)(`svg`,{className:f.svg,width:d,height:E,viewBox:`0 0 ${d} ${E}`,role:`img`,"aria-label":D,children:m.map((e,t)=>{let n=t*T+(v?18:7),i=e.value===null||!(e.value>0)||g<=0?0:Math.max(3,e.value/g*w),a=n+O/2;return(0,S.jsxs)(`g`,{"data-stage":e.stage.id,children:[(0,S.jsx)(`text`,{className:f.label,x:v?0:b-10,y:v?n-5:a,dy:v?void 0:`0.32em`,textAnchor:v?`start`:`end`,children:e.stage.label}),(0,S.jsx)(`rect`,{"data-role":`track`,className:f.trackEmpty,x:b,y:n,width:w,height:O,rx:4}),e.value===null?(0,S.jsx)(`rect`,{"data-unknown":`true`,className:f.noData,x:b,y:n,width:Math.min(w,48),height:O,rx:4}):i>0?(0,S.jsx)(`path`,{"data-role":`bar`,className:f.grow,style:{"--chart-i":t},d:r(b,n,i,O),fill:s}):null,(0,S.jsxs)(`text`,{className:f.labelStrong,x:b+w+10,y:a,dy:`0.32em`,children:[e.value===null?`unknown`:c(e.value),t>0?(0,S.jsx)(`tspan`,{className:f.tick,dx:8,children:A(e,t)}):null]})]},e.stage.id)})})})})}export{ce as n,j as t};
|
|
2
|
+
//# sourceMappingURL=Funnel-Dh2yVHws.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Funnel-Dh2yVHws.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/BarStack.tsx","../../../../../../src/web-ui/components/charts/Funnel.tsx"],"sourcesContent":["/**\n * components/charts/BarStack.tsx — stacked columns over ordered categories\n * (usually days): e.g. runs per day split into done / failed / aborted.\n *\n * Marks follow the kit spec: columns ≤ 24 px, a 4 px rounded data end on the\n * top segment only, square on the baseline, a 2 px surface gap between\n * segments. `normalize` shows each column as 100% (composition, not volume).\n *\n * Honesty: a null segment is UNKNOWN. A column with every segment null draws\n * a dashed \"no data\" placeholder; a column with some nulls stacks what is\n * known and marks the total as a lower bound (hollow cap + \"≥\" in the\n * tooltip and table). Nothing unknown ever renders as a zero-height bar.\n *\n * V3.10: every segment names its colour. The old fallback — categorical slot\n * by INDEX — meant an engine chart silently painted Claude in whatever ink\n * slot 0 held; engine charts must pass engineColor(), status charts\n * toneColor(), identity charts seriesColor(slot) with a slot fixed per entity\n * (SPEC-310C §6). An all-unknown column is drawn with the unknown hatch.\n *\n * Polish (verse-visual-quality): columns rise from the baseline once on\n * mount, staggered left to right (static under reduced motion — motion.ts);\n * the hovered / focused column gets a soft slot band behind it while the\n * others dim; gridlines snap to the pixel grid; the tooltip prints exact\n * values (formatExact unless the caller formats them) with the total set\n * apart; loading holds a column-shaped skeleton.\n */\nimport { useId, useRef, useState, type CSSProperties, type KeyboardEvent } from 'react';\nimport { hatchPatternId } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { ChartLegend, ChartTooltip, HatchPattern, clampTooltipLeft } from './ChartParts.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { allIntegers, axisTicks, crisp, labelCharPx, linearScale, roundedTopBar, stackColumn, thinIndexes, tickGutter, type StackedColumn } from './chart-math.js';\nimport { formatCompact, formatExact, formatPercent } from './format.js';\nimport { useChartMotion } from './motion.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useTextScale } from './useTextScale.js';\nimport plot from './plot.module.css';\n\nexport interface BarStackSegment {\n id: string;\n label: string;\n /**\n * Required (V3.10): seriesColor(fixedSlot) for identity, toneColor(...) for\n * status, engineColor(...) for engines. Never picked by index.\n */\n color: string;\n}\n\nexport interface BarStackProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n /** Category labels in display order (e.g. formatted days). */\n categories: string[];\n segments: BarStackSegment[];\n /** values[categoryIndex][segmentIndex]; null = unknown. */\n values: ReadonlyArray<ReadonlyArray<number | null>>;\n normalize?: boolean;\n height?: number;\n width?: number;\n formatValue?: (v: number) => string;\n /** Tooltip value format. Default: `formatValue` when given, else formatExact (\"12,934\", not \"13K\"). */\n formatTooltip?: (v: number) => string;\n ariaLabel?: string;\n}\n\nconst PAD_T = 14;\nconst PAD_B = 26;\nconst PAD_R = 8;\nconst BAR_MAX = 24;\nconst GAP = 2;\n\ninterface Row {\n label: string;\n values: ReadonlyArray<number | null>;\n stack: StackedColumn;\n}\n\nexport function BarStack({\n title,\n description,\n caveat,\n status,\n categories,\n segments,\n values,\n normalize = false,\n height = 200,\n width: fixedWidth,\n formatValue: formatValueProp,\n formatTooltip: formatTooltipProp,\n ariaLabel,\n}: BarStackProps) {\n const formatValue = formatValueProp ?? formatCompact;\n const formatTip = formatTooltipProp ?? formatValueProp ?? formatExact;\n const motion = useChartMotion();\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const textScale = useTextScale();\n const [active, setActive] = useState<number | null>(null);\n const liveId = useId();\n const hatchId = hatchPatternId(useId());\n const colors = segments.map((s) => s.color);\n\n const rows: Row[] = categories.map((label, i) => {\n const vals = values[i] ?? segments.map(() => null);\n return { label, values: vals, stack: stackColumn(vals) };\n });\n const anyKnown = rows.some((r) => !r.stack.unknown);\n const maxTotal = Math.max(0, ...rows.map((r) => r.stack.total));\n const anyIncomplete = rows.some((r) => r.stack.incomplete);\n // A window of known zeros is a designed empty state, not empty axes.\n const resolvedStatus: ChartStatus = status ?? (\n rows.length === 0 || (anyKnown && maxTotal === 0 && !anyIncomplete)\n ? { kind: 'empty' }\n : anyKnown ? { kind: 'ready' } : { kind: 'unknown' }\n );\n\n // Counts (every known value whole) get whole-number ticks: a column of 1\n // run is scaled 0 / 1, never 0 / 0.3 / 0.5 / 0.8 / 1.\n const knownValues = rows.flatMap((r) => r.values.filter((v): v is number => v !== null && Number.isFinite(v)));\n const yAxis = normalize\n ? { ticks: [0, 0.25, 0.5, 0.75, 1], labels: [0, 0.25, 0.5, 0.75, 1].map((v) => formatPercent(v)) }\n : axisTicks(0, maxTotal, { count: 4, integer: allIntegers(knownValues), format: formatValueProp });\n const ticks = yAxis.ticks;\n const top = ticks[ticks.length - 1]!;\n const padL = tickGutter(yAxis.labels, 28, 60, textScale);\n const plotW = Math.max(40, width - padL - PAD_R);\n const plotH = height - PAD_T - PAD_B;\n const slot = rows.length ? plotW / rows.length : plotW;\n const barW = Math.max(2, Math.min(BAR_MAX, slot * 0.66));\n const ys = linearScale(0, top, PAD_T + plotH, PAD_T);\n const xOf = (i: number) => padL + slot * i + (slot - barW) / 2;\n // A category label gets 64 px at 12 px text (more at a larger Display\n // size), or its own estimated width plus air when the labels are longer\n // (\"wk to Sep 18\"): thinned to what fits, never printed over each other.\n const widestLabel = Math.max(0, ...rows.map((r) => r.label.length)) * labelCharPx(textScale) + 12;\n const labelIdx = thinIndexes(rows.length, Math.max(2, Math.floor(plotW / Math.max(64 * textScale, widestLabel))));\n\n const fmtTotalWith = (fmt: (v: number) => string) => (r: Row) =>\n `${r.stack.incomplete && !r.stack.unknown ? '≥ ' : ''}${r.stack.unknown ? '—' : fmt(r.stack.total)}`;\n const fmtTotal = fmtTotalWith(formatValue);\n const fmtTotalExact = fmtTotalWith(formatTip);\n\n function onKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (rows.length === 0) return;\n const cur = active ?? rows.length - 1;\n const next = e.key === 'ArrowLeft' ? cur - 1 : e.key === 'ArrowRight' ? cur + 1 : e.key === 'Home' ? 0 : e.key === 'End' ? rows.length - 1 : null;\n if (next === null) return;\n e.preventDefault();\n setActive(Math.max(0, Math.min(rows.length - 1, next)));\n }\n\n const busiest = rows.reduce<Row | null>((best, r) => (!r.stack.unknown && (!best || r.stack.total > best.stack.total) ? r : best), null);\n const summary = ariaLabel ?? `${title}: ${rows.length} columns of ${segments.map((s) => s.label).join(', ')}.` +\n (busiest ? ` Highest: ${busiest.label} with ${fmtTotal(busiest)}.` : '');\n\n const columns: TableColumn<Row>[] = [\n { key: 'label', label: 'Category', render: (r) => r.label },\n ...segments.map((s, i) => ({\n key: s.id,\n label: s.label,\n numeric: true,\n render: (r: Row) => (r.values[i] === null || r.values[i] === undefined ? '—' : formatValue(r.values[i]!)),\n })),\n { key: '__total', label: 'Total', numeric: true, render: fmtTotal },\n ];\n\n const activeRow = active !== null ? rows[active] : undefined;\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n skeleton=\"bars\"\n skeletonHeight={height}\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(r, i) => `${i}:${r.label}`} />}\n footer={\n <ChartLegend\n items={[\n ...segments.map((s, i) => ({ label: s.label, color: colors[i] })),\n ...(rows.some((r) => r.stack.unknown) ? [{ label: 'no data', kind: 'hatch' as const }] : []),\n ]}\n />\n }\n >\n <div\n ref={wrapRef}\n className={`${plot.plotWrap} ${plot.focusable}`}\n data-motion={motion}\n tabIndex={0}\n role=\"group\"\n aria-label={`${title}. Use the left and right arrow keys to read each column.`}\n aria-describedby={liveId}\n onFocus={() => setActive((a) => a ?? (rows.length ? rows.length - 1 : null))}\n onBlur={() => setActive(null)}\n onKeyDown={onKey}\n >\n <svg className={plot.svg} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={summary}>\n <defs>\n <HatchPattern id={hatchId} />\n </defs>\n {active !== null ? (\n <rect data-role=\"hover-band\" className={plot.hoverBand} x={padL + slot * active + 1} y={PAD_T} width={Math.max(0, slot - 2)} height={plotH} rx={4} />\n ) : null}\n {ticks.map((t, i) => (\n <g key={t}>\n <line className={plot.grid} x1={padL} x2={padL + plotW} y1={crisp(ys(t))} y2={crisp(ys(t))} />\n <text className={plot.tick} x={padL - 6} y={ys(t)} dy=\"0.32em\" textAnchor=\"end\">{yAxis.labels[i]}</text>\n </g>\n ))}\n {rows.map((r, i) => {\n const x = xOf(i);\n const scaleTotal = normalize ? r.stack.total || 1 : 1;\n if (r.stack.unknown) {\n return (\n <rect\n key={i}\n data-unknown=\"true\"\n className={plot.unknownMark}\n fill={`url(#${hatchId})`}\n x={x + 0.5}\n y={PAD_T + plotH - 12.5}\n width={Math.max(1, barW - 1)}\n height={12}\n rx={2}\n />\n );\n }\n const last = r.stack.segments[r.stack.segments.length - 1];\n return (\n <g\n key={i}\n data-column={i}\n className={plot.rise}\n style={{ '--chart-i': i } as CSSProperties}\n opacity={active !== null && active !== i ? 0.55 : 1}\n >\n {r.stack.segments.map((seg) => {\n const y1 = ys(seg.y1 / scaleTotal);\n const y0 = ys(seg.y0 / scaleTotal);\n const isTop = seg === last;\n // 2 px surface gap above every segment but the top one.\n const h = Math.max(0, y0 - y1 - (isTop ? 0 : GAP));\n const y = isTop ? y1 : y1 + GAP;\n return isTop ? (\n <path key={seg.index} d={roundedTopBar(x, y, barW, h)} fill={colors[seg.index]} data-segment={segments[seg.index]!.id} />\n ) : (\n <rect key={seg.index} x={x} y={y} width={barW} height={h} fill={colors[seg.index]} data-segment={segments[seg.index]!.id} />\n );\n })}\n {r.stack.incomplete ? (\n <rect data-incomplete=\"true\" className={plot.noData} x={x} y={ys(r.stack.total / scaleTotal) - 8} width={barW} height={6} rx={2} />\n ) : null}\n </g>\n );\n })}\n <line className={plot.axis} x1={padL} x2={padL + plotW} y1={crisp(PAD_T + plotH)} y2={crisp(PAD_T + plotH)} />\n {labelIdx.map((i) => (\n <text key={i} className={plot.tick} x={xOf(i) + barW / 2} y={height - 8} textAnchor=\"middle\">{rows[i]!.label}</text>\n ))}\n {rows.map((_, i) => (\n <rect\n key={`hit${i}`}\n className={plot.hit}\n x={padL + slot * i}\n y={PAD_T}\n width={slot}\n height={plotH}\n onPointerEnter={() => setActive(i)}\n onPointerLeave={() => setActive((a) => (a === i ? null : a))}\n />\n ))}\n </svg>\n <span id={liveId} className={plot.srOnly} aria-live=\"polite\">\n {activeRow\n ? `${activeRow.label}: ${segments.map((s, i) => `${s.label} ${activeRow.values[i] === null ? 'no data' : formatTip(activeRow.values[i]!)}`).join(', ')}; total ${fmtTotalExact(activeRow)}`\n : ''}\n </span>\n {activeRow && active !== null ? (\n <ChartTooltip\n left={clampTooltipLeft(xOf(active) + barW / 2, width)}\n top={activeRow.stack.unknown ? PAD_T + plotH - 12 : ys(normalize ? 1 : activeRow.stack.total)}\n title={activeRow.label}\n rows={[\n ...segments.map((s, i) => ({\n key: s.id,\n label: s.label,\n value: activeRow.values[i] === null || activeRow.values[i] === undefined ? null : formatTip(activeRow.values[i]!),\n color: colors[i],\n })),\n { key: '__t', label: 'Total', value: activeRow.stack.unknown ? null : fmtTotalExact(activeRow), total: true },\n ]}\n />\n ) : null}\n </div>\n </ChartFrame>\n );\n}\n","/**\n * components/charts/Funnel.tsx — an ordered pipeline (filed → verified →\n * passed → judged ship → merged). One series, so ONE hue for every bar (no\n * value ramp on stages); each bar's length is its share of the first stage,\n * and the step-to-step conversion is written out in words beside it. A zero\n * stage is an empty neutral track (never a full pale bar that reads 100%).\n *\n * Honesty: an unknown stage (null) draws a dashed placeholder and \"unknown\",\n * and the conversions on either side of it are \"—\", never a guessed rate.\n * Works at 375 px: below 480 px the stage label moves above its bar.\n *\n * Polish (verse-visual-quality): each stage's bar grows from its start edge\n * once on mount, top stage first (static under reduced motion — motion.ts).\n */\nimport { useRef, type CSSProperties } from 'react';\nimport { CHART_SEQUENTIAL } from './colors.js';\nimport { ChartFrame, type ChartStatus } from './ChartFrame.js';\nimport { TableView, type TableColumn } from './TableView.js';\nimport { funnelSteps, roundedRightBar, type FunnelStep } from './chart-math.js';\nimport { formatCompact, formatPercent } from './format.js';\nimport { useChartWidth } from './useChartWidth.js';\nimport { useChartMotion } from './motion.js';\nimport plot from './plot.module.css';\n\nexport interface FunnelStage {\n id: string;\n label: string;\n value: number | null;\n}\n\nexport interface FunnelProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n stages: FunnelStage[];\n width?: number;\n color?: string;\n formatValue?: (v: number) => string;\n ariaLabel?: string;\n}\n\nconst BAR_H = 20;\nconst NARROW = 480;\n\ninterface Row extends FunnelStep {\n stage: FunnelStage;\n}\n\nfunction conversionText(step: FunnelStep, index: number): string {\n if (index === 0) return '';\n return step.ofPrevious === null ? '— of previous' : `${formatPercent(step.ofPrevious, step.ofPrevious < 0.1 && step.ofPrevious > 0 ? 1 : 0)} of previous`;\n}\n\nexport function Funnel({\n title,\n description,\n caveat,\n status,\n stages,\n width: fixedWidth,\n color = CHART_SEQUENTIAL,\n formatValue = formatCompact,\n ariaLabel,\n}: FunnelProps) {\n const wrapRef = useRef<HTMLDivElement>(null);\n const width = useChartWidth(wrapRef, fixedWidth);\n const motion = useChartMotion();\n const steps = funnelSteps(stages.map((s) => s.value));\n const rows: Row[] = stages.map((stage, i) => ({ ...steps[i]!, stage }));\n const first = stages[0]?.value ?? null;\n const resolvedStatus: ChartStatus = status ?? (\n stages.length === 0 || first === null\n ? (stages.length === 0 ? { kind: 'empty' } : { kind: 'unknown', reason: `the first stage (${stages[0]!.label}) is unknown` })\n : first === 0 ? { kind: 'empty', message: `No ${stages[0]!.label.toLowerCase()} in this window.` } : { kind: 'ready' }\n );\n\n // Bar length is a share of the widest stage — the first, in any real\n // funnel; the max only guards a later stage that out-counts it (it would\n // overflow the track). When that is 0 every bar is 0: an all-zero window\n // is a row of EMPTY tracks, never full bars that read as 100%.\n const scaleMax = Math.max(0, ...stages.map((s) => (s.value !== null && Number.isFinite(s.value) ? s.value : 0)));\n\n const narrow = width < NARROW;\n const labelW = narrow ? 0 : Math.min(170, Math.round(width * 0.28));\n const valueW = narrow ? 150 : 180;\n const plotW = Math.max(40, width - labelW - valueW);\n const rowH = narrow ? BAR_H + 22 : BAR_H + 14;\n const height = rows.length * rowH + 4;\n\n const summary = ariaLabel ?? `${title}: ` + rows\n .map((r, i) => `${r.stage.label} ${r.value === null ? 'unknown' : formatValue(r.value)}${i > 0 ? ` (${conversionText(r, i)})` : ''}`)\n .join(', ') + '.';\n\n const columns: TableColumn<Row>[] = [\n { key: 'stage', label: 'Stage', render: (r) => r.stage.label },\n { key: 'value', label: 'Count', numeric: true, render: (r) => (r.value === null ? '—' : formatValue(r.value)) },\n { key: 'prev', label: 'Of previous', numeric: true, render: (r) => (r.ofPrevious === null ? '—' : formatPercent(r.ofPrevious, 1)) },\n { key: 'first', label: 'Of first', numeric: true, render: (r) => (r.ofFirst === null ? '—' : formatPercent(r.ofFirst, 1)) },\n ];\n\n return (\n <ChartFrame\n title={title}\n description={description}\n caveat={caveat}\n status={resolvedStatus}\n skeleton=\"funnel\"\n table={<TableView caption={title} columns={columns} rows={rows} rowKey={(r) => r.stage.id} />}\n >\n <div ref={wrapRef} className={plot.plotWrap} data-motion={motion}>\n <svg className={plot.svg} width={width} height={height} viewBox={`0 0 ${width} ${height}`} role=\"img\" aria-label={summary}>\n {rows.map((r, i) => {\n const y = i * rowH + (narrow ? 18 : 7);\n const barW = r.value === null || !(r.value > 0) || scaleMax <= 0 ? 0 : Math.max(3, (r.value / scaleMax) * plotW);\n const textY = y + BAR_H / 2;\n return (\n <g key={r.stage.id} data-stage={r.stage.id}>\n <text className={plot.label} x={narrow ? 0 : labelW - 10} y={narrow ? y - 5 : textY} dy={narrow ? undefined : '0.32em'} textAnchor={narrow ? 'start' : 'end'}>\n {r.stage.label}\n </text>\n {/* The track is the neutral empty-meter gray (plot.module.css\n .trackEmpty), not the pale azure chart track: at 0 it must\n read as empty, and it must be SEEN — it is what every\n bar's length is a share of. */}\n <rect data-role=\"track\" className={plot.trackEmpty} x={labelW} y={y} width={plotW} height={BAR_H} rx={4} />\n {r.value === null ? (\n <rect data-unknown=\"true\" className={plot.noData} x={labelW} y={y} width={Math.min(plotW, 48)} height={BAR_H} rx={4} />\n ) : barW > 0 ? (\n <path data-role=\"bar\" className={plot.grow} style={{ '--chart-i': i } as CSSProperties} d={roundedRightBar(labelW, y, barW, BAR_H)} fill={color} />\n ) : null}\n <text className={plot.labelStrong} x={labelW + plotW + 10} y={textY} dy=\"0.32em\">\n {r.value === null ? 'unknown' : formatValue(r.value)}\n {i > 0 ? <tspan className={plot.tick} dx={8}>{conversionText(r, i)}</tspan> : null}\n </text>\n </g>\n );\n })}\n </svg>\n </div>\n </ChartFrame>\n );\n}\n"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{a as e,c as t,i as n,n as r}from"./index-
|
|
2
|
-
//# sourceMappingURL=GearTray-
|
|
1
|
+
import{a as e,c as t,i as n,n as r}from"./index-DZ-UQ7v8.js";import{v as i}from"./global-CMNW_dqn.js";import{N as a,_n as o,dt as s,hn as c,lt as l,nt as u}from"./VerseConsoleApp-CWU6R3By.js";import{d}from"./icons-D1sYbCTQ.js";import{d as f,l as p,t as m}from"./verse-icons-S56hIiXS.js";import{a as h}from"./command-catalog-BIntSa9l.js";var g=t(e(),1),_=t(n(),1),v={menu:`_menu_bwc3k_3`,pop:`_pop_bwc3k_1`,item:`_item_bwc3k_16`,icon:`_icon_bwc3k_33`,check:`_check_bwc3k_40`,label:`_label_bwc3k_49`,key:`_key_bwc3k_51`,separator:`_separator_bwc3k_57`,groupLabel:`_groupLabel_bwc3k_62`},y=r();function b(e){let t=h(e)?.keys[0];return t?o(t,c()):null}var x=[{value:`system`,label:`Match system`},{value:`light`,label:`Light`},{value:`dark`,label:`Dark`}];function S({open:e,anchorRef:t,onClose:n,compact:r}){let o=a(),c=i(),h=(0,g.useRef)(null),[S,C]=(0,g.useState)(0),[w,T]=(0,g.useState)(null),E=[{key:`settings`,role:`menuitem`,label:`Settings`,icon:(0,y.jsx)(p,{}),shortcut:b(`section.settings`),run:()=>l(`settings`)},{key:`apps`,role:`menuitem`,label:`Apps & Accounts`,icon:(0,y.jsx)(m,{}),run:()=>l(`apps`)},{key:`usage`,role:`menuitem`,label:`Usage`,icon:(0,y.jsx)(f,{}),run:()=>l(`usage`)},{key:`shortcuts`,role:`menuitem`,label:`Keyboard shortcuts`,icon:(0,y.jsx)(d,{}),shortcut:b(`shortcuts.open`),run:()=>u(`shortcuts`)},...r?[]:[{key:`rail`,role:`menuitemcheckbox`,label:`Show rail labels`,shortcut:b(`rail.toggle-labels`),checked:o.railExpanded,run:s,stay:!0}],...x.map(e=>({key:`theme-${e.value}`,role:`menuitemradio`,label:e.label,checked:c.theme===e.value,run:()=>c.set(e.value),stay:!0}))];(0,g.useLayoutEffect)(()=>{if(!e)return;let n=t.current?.getBoundingClientRect();n&&T(r?{left:8,bottom:Math.max(8,window.innerHeight-n.top+8)}:{left:n.right+8,bottom:Math.max(8,window.innerHeight-n.bottom)})},[e,t,r]);let[D,O]=(0,g.useState)(e);e!==D&&(O(e),e&&C(0));let k=(0,g.useRef)(n);k.current=n,(0,g.useEffect)(()=>{if(!e)return;function n(e){let n=e.target;h.current?.contains(n)||t.current?.contains(n)||k.current()}return document.addEventListener(`mousedown`,n),()=>document.removeEventListener(`mousedown`,n)},[e,t]);let A=w!==null;(0,g.useEffect)(()=>{e&&A&&h.current?.querySelector(`[data-index="${S}"]`)?.focus()},[S,e,A]);let j=(0,g.useRef)(!1);if((0,g.useEffect)(()=>{!e&&j.current&&(j.current=!1,t.current?.focus())},[e,t]),!e)return null;function M(e=!0){j.current=e,n()}function N(e){e.run(),e.stay||M(!1)}function P(e){let t=E.length;switch(e.key){case`ArrowDown`:e.preventDefault(),C(e=>(e+1)%t);break;case`ArrowUp`:e.preventDefault(),C(e=>(e-1+t)%t);break;case`Home`:e.preventDefault(),C(0);break;case`End`:e.preventDefault(),C(t-1);break;case`Escape`:e.preventDefault(),e.stopPropagation(),M();break;case`Tab`:M(!1)}}let F=E.findIndex(e=>e.key.startsWith(`theme-`));return(0,_.createPortal)((0,y.jsx)(`div`,{ref:h,role:`menu`,"aria-label":`Settings and more`,className:v.menu,"data-compact":r||void 0,style:w?{left:w.left,bottom:w.bottom}:{visibility:`hidden`},onKeyDown:P,children:E.map((e,t)=>(0,y.jsxs)(`div`,{role:`none`,children:[t===F?(0,y.jsx)(`div`,{role:`separator`,className:v.separator,children:(0,y.jsx)(`span`,{className:v.groupLabel,children:`Theme`})}):null,e.key===`rail`?(0,y.jsx)(`div`,{role:`separator`,className:v.separator}):null,(0,y.jsxs)(`button`,{type:`button`,role:e.role,"data-index":t,tabIndex:t===S?0:-1,"aria-checked":e.role===`menuitem`?void 0:e.checked===!0,className:v.item,onClick:()=>N(e),onMouseMove:()=>t!==S&&C(t),children:[(0,y.jsx)(`span`,{className:v.icon,"aria-hidden":`true`,children:e.role===`menuitem`?e.icon:e.checked?(0,y.jsx)(`span`,{className:v.check}):null}),(0,y.jsx)(`span`,{className:v.label,children:e.label}),e.shortcut?(0,y.jsx)(`kbd`,{className:v.key,children:e.shortcut}):null]})]},e.key))}),document.body)}export{S as GearTray};
|
|
2
|
+
//# sourceMappingURL=GearTray-Dt-ee32-.js.map
|