@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
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EvidenceTimeline-sCCAdnBK.js","assets/global-BlI2BYa1.css","assets/StatusBadge-BVi0IBb9.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/Button-DrnKsvnQ.css","assets/Sheet-ChxlNivX.css","assets/EvidenceTimeline-PBDAiSuG.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{a as e,c as t,n,t as r}from"./index-CyK31YRm.js";import{H as i,J as a,h as o,m as s,s as c}from"./global-y_exIyAP.js";import{t as l}from"./focus-trap-ChZ5EFfM.js";import{t as u}from"./Dialog-BRd_B9OE.js";import{n as d}from"./StatusBadge-CXG3iNL4.js";import{t as f}from"./RefreshIndicator-SEFZlMB2.js";import{t as p}from"./Swimlane-LrslsGxw.js";import{t as m}from"./StatTile-CTX41O6y.js";import{t as h}from"./ProviderLogo-AwHn2sKm.js";import{B as g,D as _,H as v,I as y,L as b,Lt as x,R as S,in as C,kt as w}from"./VerseConsoleApp-DXDv1aOi.js";import{n as T,p as E}from"./verse-model-JTuvRBVK.js";import{t as ee}from"./Segmented-Wt1ATod9.js";import{b as te,y as D}from"./format-BmH2yWL6.js";import{n as ne,r as O}from"./budget-queries-DFF-3ICg.js";import{_ as k,b as re,n as ie,o as A,r as j,s as M,t as N}from"./capacity-strip-model-5ViUgUlP.js";import{n as ae,t as P}from"./Button-DtE0rlWD.js";import{_ as oe,c as se,f as ce,g as le,h as ue,i as de,x as fe}from"./icons-CygCEFWs.js";import{a as pe}from"./command-catalog-ffCAijVY.js";import{t as me}from"./Meter-b69LM0mU.js";import{i as he,o as ge,r as _e,s as ve,t as ye}from"./AutonomyOffState-CpFYS3tQ.js";import{t as be}from"./Switch-BmCzfFnu.js";import{t as xe}from"./BudgetControl-BARVp-En.js";import{n as Se,t as Ce}from"./types-IYKrYLku.js";import{t as we}from"./Sheet-HkBOBMTT.js";import{C as Te,S as Ee,_ as F,a as De,b as Oe,c as ke,d as Ae,f as je,h as Me,i as Ne,l as Pe,m as Fe,n as Ie,r as Le,u as Re,v as ze,w as Be,x as Ve,y as He}from"./cloud-model-CfRydq8N.js";import{a as Ue,c as We,i as Ge,n as Ke,o as qe,r as I,s as Je}from"./cloud-queries-DmptbjS8.js";import{t as L}from"./cloud.module-DOP-N4Ch.js";import{t as R}from"./use-ticker-BoqFxRFG.js";import{t as Ye}from"./use-guarded-action-EgVWjM5c.js";import{i as z,n as Xe,r as Ze,t as Qe}from"./nav-mimleI0R.js";import{a as B,c as V,d as $e,i as et,n as tt,o as nt,r as rt,t as it}from"./surface-data-C3UAQ4QX.js";import{t as at}from"./Input-CI0yBHmn.js";import{a as ot,c as st,i as ct,l as lt,n as ut,r as dt,s as ft,t as H}from"./authority-model-8NeAEwAF.js";import{t as pt}from"./binding-left-DZpq5sLf.js";import{n as mt,r as U,t as ht}from"./actions-BZTidCXZ.js";import{a as gt,i as W,n as G,r as K,t as q}from"./Surface-5bNA08tK.js";import{a as _t,c as vt,f as yt,m as bt,o as xt,p as St,r as Ct,t as wt,u as Tt}from"./CloudBudgetForm-CvjK4Oh6.js";import{n as Et}from"./LeaderCard-BxxiEg4e.js";import{d as Dt,f as Ot,n as kt}from"./NeedsYouList-D5Kk549g.js";import{f as At,s as jt}from"./live-model-D7hilYFk.js";var J=t(e(),1),Y=n(),Mt=864e5;function Nt(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`}):`—`}function Pt(e){let t=Date.parse(e.issuedAt),n=Date.parse(e.expiresAt);return Number.isFinite(t)&&Number.isFinite(n)?Math.round((n-t)/Mt):null}function Ft(e){let t=e.criteria,n=[`${e.repos.length} repo${e.repos.length===1?``:`s`}`,`${e.maxRisk} risk`,`≤ ${e.maxFiles} files / ${e.maxLines} lines`,`≤ ${e.maxMergesPerRepoPerDay} merges/repo/day`],r=[`${t.minMerges} merges`,`${t.minHours} h`,t.minPostMergeGreenPct?`≥ ${t.minPostMergeGreenPct}% green`:null,`≤ ${t.maxRevertRatePct}% reverts`].filter(Boolean);return`${n.join(` · `)} — advances after ${r.join(`, `)}`}function It({draft:e}){let t=e.payload,n=Pt(t);return(0,Y.jsxs)(`div`,{className:U.scope,children:[(0,Y.jsxs)(`section`,{className:U.scopeBlock,"aria-label":`Expiry`,children:[(0,Y.jsx)(W,{children:`Expiry`}),(0,Y.jsxs)(`p`,{className:U.scopeLead,children:[n===null?`—`:`${n} days`,`, until `,Nt(t.expiresAt)]}),(0,Y.jsxs)(`p`,{className:U.scopeMeta,children:[`Signed by key `,(0,Y.jsx)(`span`,{className:U.mono,children:t.keyId}),` · sequence `,t.grantSeq,` · bound to this Mac`]})]}),(0,Y.jsxs)(`section`,{className:U.scopeBlock,"aria-label":`Repositories`,children:[(0,Y.jsxs)(W,{children:[`Repositories (`,t.repos.length,`)`]}),(0,Y.jsxs)(`table`,{className:U.scopeTable,children:[(0,Y.jsx)(`thead`,{children:(0,Y.jsxs)(`tr`,{children:[(0,Y.jsx)(`th`,{scope:`col`,children:`Repo`}),(0,Y.jsx)(`th`,{scope:`col`,children:`Up to`}),(0,Y.jsx)(`th`,{scope:`col`,children:`Checks`}),(0,Y.jsx)(`th`,{scope:`col`,children:`Risk`}),(0,Y.jsx)(`th`,{scope:`col`,className:U.num,children:`Merges/day`})]})}),(0,Y.jsx)(`tbody`,{children:t.repos.map(e=>(0,Y.jsxs)(`tr`,{children:[(0,Y.jsx)(`td`,{className:U.mono,children:e.nameWithOwner}),(0,Y.jsx)(`td`,{children:e.stage===`merge`?`Merge`:`Propose`}),(0,Y.jsx)(`td`,{children:e.enforcement===`server`?`GitHub`:`Local only`}),(0,Y.jsx)(`td`,{children:e.maxRisk}),(0,Y.jsx)(`td`,{className:U.num,children:e.maxMergesPerDay})]},e.nameWithOwner))})]}),(0,Y.jsxs)(`p`,{className:U.scopeMeta,children:[`Every merge ≤ `,t.merge.maxFiles,` files / `,t.merge.maxLines,` lines · ashlr-hub itself: `,t.merge.selfRepo===`propose-only`?`propose only`:`merge outside authority code`]})]}),(0,Y.jsxs)(`section`,{className:U.scopeBlock,"aria-label":`Spend`,children:[(0,Y.jsx)(W,{children:`Spend`}),(0,Y.jsxs)(`p`,{className:U.scopeLead,children:[`Up to `,t.spend.maxMode===`all-in`?`All-in`:t.spend.maxMode===`balanced`?`Balanced`:`Reserve`,` · metered APIs $`,t.spend.meteredUsdPerDay,`/day`]}),(0,Y.jsx)(`ul`,{className:U.scopeList,children:Object.entries(t.spend.seats).map(([e,t])=>(0,Y.jsxs)(`li`,{children:[(0,Y.jsx)(`span`,{className:U.mono,children:e}),t.enabled?`: keeps ${t.reserveFloorPercent}% for you`:`: not used by autonomy`,t.enabled&&t.maxSessionWindowPercent!==void 0?`, never above ${t.maxSessionWindowPercent}% of its 5-hour window`:``,t.enabled?` · ${t.roles.join(`, `)}`:``]},e))})]}),(0,Y.jsxs)(`section`,{className:U.scopeBlock,"aria-label":`Engines and Leader`,children:[(0,Y.jsx)(W,{children:`Engines and Leader`}),(0,Y.jsx)(`p`,{className:U.scopeLead,children:t.engines.join(`, `)||`none`}),(0,Y.jsxs)(`p`,{className:U.scopeMeta,children:[`Leader classes `,t.leader.classes.length?t.leader.classes.join(` + `):`none (proposes only)`,` · class-B veto window `,t.leader.vetoMinutes,` min · goal conductor `,t.conductorGoals?`on`:`off`]})]}),(0,Y.jsxs)(`section`,{className:U.scopeBlock,"aria-label":`Rollout ladder`,children:[(0,Y.jsxs)(W,{children:[`Rollout ladder (`,t.rollout.stages.length,` stages, advances by itself)`]}),(0,Y.jsx)(`ol`,{className:U.ladder,children:t.rollout.stages.map(e=>(0,Y.jsxs)(`li`,{children:[(0,Y.jsx)(`span`,{className:U.ladderId,children:e.id}),(0,Y.jsx)(`span`,{children:Ft(e)})]},e.id))}),(0,Y.jsx)(`p`,{className:U.scopeMeta,children:`Any sandbox violation or reserve breach drops it back one stage. It can never climb past the last stage.`})]}),(0,Y.jsxs)(`p`,{className:U.scopeMeta,children:[`Draft digest `,(0,Y.jsxs)(`span`,{className:U.mono,children:[e.digest.slice(0,16),`…`]})]})]})}function Lt({open:e,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o}){let s=(0,J.useId)();return e?(0,Y.jsx)(Rt,{titleId:s,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o}):null}function Rt({titleId:e,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o}){let c=s(it,{freshMs:0}),l=c.data?.value??null,u=c.data?.reason??null;return(0,Y.jsx)(we,{open:!0,onClose:o,titleId:e,width:600,title:t===`re-approve`?`Re-approve the standing grant`:`Approve a standing grant`,description:i,footer:(0,Y.jsxs)(`div`,{className:U.sheetFooter,children:[(0,Y.jsxs)(`p`,{className:U.sheetFootnote,children:[`Touch ID appears on this Mac. Lowering authority — Off, Stop, Revoke — never needs it.`,n?` After approval the switch moves to ${H[n]}.`:``]}),(0,Y.jsxs)(`span`,{className:U.sheetButtons,children:[(0,Y.jsx)(P,{variant:`ghost`,onClick:o,children:`Cancel`}),(0,Y.jsx)(P,{variant:`primary`,icon:(0,Y.jsx)(ce,{}),disabled:!l,busy:r,onClick:()=>l&&a(l),children:`Approve with Touch ID`})]})]}),children:c.status===`loading`&&!c.data?(0,Y.jsx)(`p`,{className:U.muted,"aria-busy":`true`,children:`Preparing the grant draft…`}):l?(0,Y.jsx)(It,{draft:l}):(0,Y.jsx)(G,{tone:`unknown`,children:u??`Grant draft unreadable — nothing to approve.`})})}var X={"all-in":`All-in`,balanced:`Balanced`,reserve:`Reserve`};function zt(){let e=pe(`fleet.stop`)?.guard?.confirm;return{title:e?.title??`Stop the fleet?`,body:e?.body??`Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.`,confirmLabel:e?.confirmLabel??`Stop fleet`,destructive:!0}}var Bt={title:`Resume the fleet?`,body:`Autonomy picks up at the switch position on its next tick. Stopping again is one click.`,confirmLabel:`Resume fleet`,destructive:!1};function Vt({tone:e}){return(0,Y.jsx)(`span`,{className:U.dot,"data-tone":e,"aria-hidden":`true`})}function Ht(e){let[t,n]=(0,J.useState)(null);function r(r){if(!t)return;let{then:i}=t,a=dt(r,t.intent);e.act(()=>V({action:a,draftDigest:r.digest}),a===`re-approve`?`Re-approve the standing grant`:`Sign a new standing grant`,{onDone:t=>{n(null),i&&t&&ut[i]<=ut[t.maxSwitchWithoutGrant]&&i!==t.switch&&e.act(()=>V({action:`switch`,to:i}),`Switch autonomy to ${H[i]}`)}})}return{open:(e,t,r=null)=>n({intent:e,then:r,why:t}),sheet:(0,Y.jsx)(Lt,{open:t!==null,intent:t?.intent??`grant`,then:t?.then??null,why:t?.why??``,busy:e.busy,onApprove:r,onClose:()=>n(null)})}}function Ut({read:e,loading:t,budgetMode:n,actions:r,compact:i,now:a,grantFlow:o}){let s=e?.value??null,c=Ht(r),l=o??c,[u,d]=(0,J.useState)(null),[f,p]=(0,J.useState)(!1),m=!s,h=ot(s,a);function g(e){if(!s)return;let t=ct(s,e);if(t!==`same`){if(t===`raise-needs-grant`){let t=s.grant.state===`paused`;l.open(t?`re-approve`:`grant`,t?`${s.grant.reason??`The grant is paused.`} ${H[e]} needs it re-approved.`:`${H[e]} is beyond what the installed grant allows, so it needs a new grant.`,e);return}r.act(()=>V({action:`switch`,to:e}),`Switch autonomy to ${H[e]}`)}}Gt({read:e,status:s,budgetMode:n,actions:r,chip:h,onSwitch:g,openGrant:l.open});let _=st(s||{switch:`off`,maxSwitchWithoutGrant:`off`}),v=s?.kill??!1,y=m||r.busy||r.readOnly,b=(0,Y.jsxs)(`div`,{className:U.switchWrap,title:m?e?.reason??`Reading autonomy state…`:void 0,children:[i?null:(0,Y.jsx)(`span`,{className:U.barLabel,"aria-hidden":`true`,children:`Autonomy`}),(0,Y.jsx)(ee,{size:`sm`,"aria-label":`Autonomy`,value:s?.switch??`off`,onChange:g,options:_.map(e=>({value:e.value,label:(0,Y.jsxs)(`span`,{className:U.switchOption,children:[i?e.short:e.label,e.needsGrant?(0,Y.jsx)(ce,{className:U.touchMark,width:12,height:12,"aria-hidden":`true`}):null]}),ariaLabel:e.ariaLabel,disabled:y}))})]}),x=()=>r.act(()=>V({action:`stop`}),`Stop the fleet`,{confirm:zt(),onDone:e=>d(ft(e))}),S=()=>r.act(()=>V({action:`clear-stop`}),`Resume the fleet`,{confirm:Bt,onDone:()=>d(null)}),C=v?i?(0,Y.jsx)(P,{variant:`subtle`,size:`sm`,icon:(0,Y.jsx)(ue,{}),iconOnly:!0,"aria-label":`Resume the fleet`,disabled:y,onClick:S}):(0,Y.jsx)(P,{variant:`subtle`,size:`sm`,icon:(0,Y.jsx)(ue,{}),disabled:y,onClick:S,children:`Resume`}):i?(0,Y.jsx)(P,{variant:`danger`,size:`sm`,icon:(0,Y.jsx)(fe,{}),iconOnly:!0,"aria-label":`Stop the fleet`,disabled:y,onClick:x}):(0,Y.jsx)(P,{variant:`danger`,size:`sm`,icon:(0,Y.jsx)(fe,{}),disabled:y,onClick:x,children:`Stop`});return(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`div`,{className:U.bar,role:`toolbar`,"aria-label":`Autonomy controls`,"data-loading":t||void 0,children:[b,i?null:(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(Z,{mode:n,onOpen:()=>p(!0)}),(0,Y.jsx)(Kt,{chip:h,onOpen:e=>l.open(e,h.detail)})]}),(0,Y.jsx)(`span`,{className:U.barSpacer}),C]}),v&&u?(0,Y.jsx)(`p`,{className:U.muted,role:`status`,children:u}):null,i?(0,Y.jsxs)(`div`,{className:U.barSecondary,children:[(0,Y.jsx)(Z,{mode:n,onOpen:()=>p(!0)}),(0,Y.jsx)(Kt,{chip:h,onOpen:e=>l.open(e,h.detail)})]}):null,o?null:c.sheet,(0,Y.jsx)(qt,{open:f,onClose:()=>p(!1),status:s})]})}function Wt(e){return e.readOnly?`Read-only session: this server was started without dispatch, so autonomy cannot be changed from here.`:e.status?e.busy?`Another autonomy action is still running. Try again when it finishes.`:null:e.reason??`The autonomy state has not been read yet, so nothing was changed.`}function Gt({read:e,status:t,budgetMode:n,actions:r,chip:i,onSwitch:a,openGrant:o}){let s=e!==void 0,c=()=>Wt({status:t,reason:e?.reason??null,readOnly:r.readOnly,busy:r.busy}),l=e=>()=>{let n=c();if(n||!t){g(n??`The autonomy state is unknown, so nothing was changed.`,`neutral`);return}if(t.switch===e){g(`Autonomy is already ${H[e]}.`,`neutral`);return}a(e)};v(`autonomy.off`,l(`off`),s),v(`autonomy.propose`,l(`propose`),s),v(`autonomy.autonomous`,l(`autonomous`),s),v(`autonomy.grant`,()=>{let e=c();if(e){g(e,`neutral`);return}if(!i.action){g(i.detail,`neutral`);return}o(i.action,i.detail)},s);let u=e=>()=>{if(r.readOnly||r.busy){g(c()??`Budget cannot be changed right now.`,`neutral`);return}if(n===e){g(`Budget is already ${X[e]}.`,`neutral`);return}let i=t?.grant.state===`active`?t.grant.maxMode:null;if(i&&re(e,i)){g(`Your grant allows up to ${X[i]}, so ${X[e]} is unavailable. A new grant can raise the ceiling.`,`neutral`);return}r.act(()=>O({mode:e}),`Switch the budget to ${X[e]}`,{onDone:()=>g(`Budget set to ${X[e]}.`,`success`)})};v(`budget.all-in`,u(`all-in`),s),v(`budget.balanced`,u(`balanced`),s),v(`budget.reserve`,u(`reserve`),s)}function Z({mode:e,onOpen:t}){return(0,Y.jsxs)(`button`,{type:`button`,className:U.pill,"aria-haspopup":`dialog`,onClick:t,children:[(0,Y.jsx)(`span`,{className:U.pillLabel,children:`Budget`}),(0,Y.jsx)(`span`,{children:e?X[e]:`—`}),(0,Y.jsx)(de,{width:14,height:14,"aria-hidden":`true`})]})}function Kt({chip:e,onOpen:t}){let n=(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(Vt,{tone:e.tone}),(0,Y.jsx)(`span`,{className:U.pillLabel,children:`Grant`}),(0,Y.jsx)(`span`,{children:e.label})]});if(!e.action)return(0,Y.jsx)(`span`,{className:U.chip,"data-tone":e.tone,title:e.detail,"aria-label":`Grant: ${e.label}. ${e.detail}`,role:`status`,children:n});let r=e.action;return(0,Y.jsx)(`button`,{type:`button`,className:U.chip,"data-tone":e.tone,title:e.detail,"aria-haspopup":`dialog`,onClick:()=>t(r),"aria-label":`Grant: ${e.label}. ${e.detail}`,children:n})}function qt({open:e,onClose:t,status:n}){let r=n?.grant.state===`active`?n.grant.maxMode:null;return(0,Y.jsx)(we,{open:e,onClose:t,titleId:`command-budget-sheet`,width:560,title:`Budget`,description:r?`Your grant allows up to ${X[r]}. Autonomy never spends past it, whatever is selected here — moving toward Reserve is always instant.`:`No active grant: autonomy only proposes. The budget still decides which seats it would use.`,children:e?(0,Y.jsx)(xe,{maxMode:r}):null})}function Jt({kpis:e}){return(0,Y.jsx)(`div`,{className:U.kpis,role:`group`,"aria-label":`Key numbers`,children:e.map(e=>(0,Y.jsx)(m,{label:e.label,value:e.value,delta:e.delta,trend:e.trend,trendLabel:e.trendLabel,caption:e.caption},e.id))})}var Yt=3e4,Xt={high:`Urgent`,warn:`Soon`,info:`FYI`},Zt={approvals:`approvals`,authority:`authority`,fleet:`fleet`,leader:`Leader`,chats:`chats`,accounts:`accounts`};function Qt(e,t){if(t.confirm)return{...t.confirm,destructive:t.destructive};if(t.kind===`approve`||t.kind===`reject`||t.kind===`veto`)return{title:`${t.kind===`approve`?`Approve`:t.kind===`reject`?`Reject`:`Veto`}?`,body:Ot(e).text,confirmLabel:t.label,destructive:t.destructive}}function $t(e){let t=e.target;switch(t.kind){case`url`:return/^https:\/\//.test(t.url)?{label:`Open`,href:t.url}:null;case`section`:return{label:`Show`,onOpen:()=>Xe(t.section,t.anchor)};case`session`:return{label:`Open chat`,onOpen:()=>Ze(t.sessionId)};case`approval`:case`seat`:return{label:`Open`,onOpen:()=>z(e.id)};default:return null}}function en(e){return e===null?null:e.replace(/(^|· )(Partial )?([a-z][\w-]*) run$/,(e,t,n,r)=>{let i=E(r)?T[r]:`${r.charAt(0).toUpperCase()}${r.slice(1)}`;return`${t}${n??``}${i} run`})}function tn({item:e,view:t,seatNames:n}){let r=e.subject,i=[];if(t.repo&&i.push((0,Y.jsx)(`span`,{className:U.needsRepo,title:t.repoFull,children:t.repo},`repo`)),r.pr&&i.push((0,Y.jsxs)(`span`,{children:[`#`,r.pr]},`pr`)),r.seatId){let e=n?.get(r.seatId)??r.seatId;i.push((0,Y.jsx)(`span`,{title:e===r.seatId?void 0:r.seatId,children:e},`seat`))}return i.push((0,Y.jsx)(`span`,{title:t.ageStamp,children:t.age},`age`)),(0,Y.jsx)(`span`,{className:U.needsMeta,children:i.map((e,t)=>(0,Y.jsxs)(J.Fragment,{children:[t>0?(0,Y.jsx)(`span`,{"aria-hidden":`true`,children:`·`}):null,e]},e.key))})}function nn({item:e,actions:t,now:n,seatNames:r}){let i=$t(e),a=e.actions.filter(e=>e.request!==null),o=Dt(e,n),s=en(o.kindLabel);return(0,Y.jsxs)(`li`,{className:U.needsRow,"data-severity":e.severity,id:Qe(e.id),children:[(0,Y.jsx)(`span`,{className:U.sevDot,"data-severity":e.severity,"aria-hidden":`true`}),(0,Y.jsxs)(`div`,{className:U.needsText,children:[s?(0,Y.jsx)(`span`,{className:U.needsKind,children:s}):null,(0,Y.jsxs)(`span`,{className:U.needsTitle,title:o.fullTitle,children:[(0,Y.jsxs)(`span`,{className:`visually-hidden`,children:[Xt[e.severity],`: `]}),o.title]}),o.run?(0,Y.jsx)(kt,{run:o.run}):null,o.detail?(0,Y.jsx)(`span`,{className:U.needsDetail,children:o.detail}):null,(0,Y.jsx)(tn,{item:e,view:o,seatNames:r})]}),(0,Y.jsxs)(`div`,{className:U.needsActions,children:[a.map(n=>(0,Y.jsx)(P,{size:`sm`,variant:n.destructive?`danger`:n.kind===`approve`?`primary`:`subtle`,disabled:t.busy||t.readOnly,onClick:()=>t.act(()=>$e(n.request.path,n.request.body),`${n.label}: ${o.title}`,{confirm:Qt(e,n)}),children:n.label},n.kind)),i?i.href?(0,Y.jsxs)(`a`,{className:U.linkButton,href:i.href,target:`_blank`,rel:`noopener noreferrer`,children:[i.label,(0,Y.jsx)(se,{width:12,height:12,"aria-hidden":`true`}),(0,Y.jsx)(`span`,{className:`visually-hidden`,children:` (opens in a new tab)`})]}):(0,Y.jsx)(`button`,{type:`button`,className:U.linkButton,onClick:i.onOpen,children:i.label}):null]})]})}function rn(e){return e.status===`unavailable`?{activity:null,loading:!1,reason:e.error?`Needs-you inbox unavailable. ${e.error}`:`The Needs-you inbox is not in this build yet, so this card has no source.`,stale:!1}:e.data?{activity:e.data,loading:!1,reason:null,stale:e.status===`stale`}:{activity:null,loading:!0,reason:null,stale:!1}}function an({state:e,actions:t,fleetLine:n,seatNames:r}){let{activity:i,loading:a,reason:o,stale:s}=rn(e),c=R(Yt),l=i?vt(i.needsYou):[],u=St(i),d=l.slice(0,5),f=i?i.needsYou.length:null;return(0,Y.jsx)(q,{title:f===null?`Needs you`:`Needs you (${f})`,caption:f===null||f===0?void 0:`Most urgent first`,tone:f?`attention`:void 0,actions:(0,Y.jsxs)(`button`,{type:`button`,className:U.linkButton,onClick:()=>z(),"aria-keyshortcuts":`Meta+J`,children:[`Open all `,(0,Y.jsx)(`kbd`,{className:U.kbd,children:`⌘J`})]}),children:a?(0,Y.jsx)(`p`,{className:U.muted,"aria-busy":`true`,children:`Reading the inbox…`}):i?d.length===0?u.length||s?(0,Y.jsx)(G,{tone:`unknown`,children:u.length?`Nothing to show, but ${u.map(e=>Zt[e]??e).join(`, `)} ${u.length===1?`is`:`are`} not answering — this is not an all-clear.`:`Nothing to show, but the last refresh failed — this is not an all-clear.`}):(0,Y.jsxs)(`div`,{className:U.allClear,role:`status`,children:[(0,Y.jsx)(`span`,{className:U.allClearTitle,children:`All clear`}),n?(0,Y.jsx)(`span`,{className:U.allClearBody,children:n}):null]}):(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`ul`,{className:U.needsList,children:d.map(e=>(0,Y.jsx)(nn,{item:e,actions:t,now:c,seatNames:r},e.id))}),l.length>d.length?(0,Y.jsxs)(`button`,{type:`button`,className:U.moreLink,onClick:()=>z(),children:[l.length-d.length,` more in the drawer`]}):null,u.length?(0,Y.jsxs)(`p`,{className:U.muted,children:[u.map(e=>Zt[e]??e).join(`, `),` not answering — the list may be incomplete.`]}):null,s?(0,Y.jsx)(`p`,{className:U.muted,children:`The last refresh failed; showing the previous list.`}):null]}):(0,Y.jsxs)(G,{tone:`unknown`,children:[o??`The inbox didn't answer.`,` This is not an all-clear.`]})})}var on={usable:`ok`,low:`low`,spent:`out`,"signed-out":`out`,unavailable:`out`,checking:`unknown`,"not-checked":`unknown`},sn=new Set([`usable`,`low`,`checking`]);function cn(e){let t=e.trim();return/[.!?]$/.test(t)?t:`${t}.`}function ln(e,t){let n=t.get(e.seatId);if(n)return{status:n.status,why:n.why};if(e.kind!==`local`)return null;let r=[...t.values()].filter(e=>e.free||e.engine===`local`);if(r.length===0)return null;let i=e=>r.find(t=>t.status===e),a=i(`eligible`)??i(`held`)??i(`unknown`)??r[0];return{status:a.status,why:a.why}}var un={eligible:`eligible`,held:`held`,off:`off`,unknown:`no-reading`};function dn(e,t,n){return e?e.status===`eligible`&&!sn.has(t.kind)?{kind:`conflict`,word:`Status unknown`,why:`The router lists it as eligible for autonomy, but its readiness check says: ${`${t.label}${t.detail?` — ${t.detail}`:``}`}.`}:{kind:un[e.status],word:k[e.status],why:e.why?cn(e.why):null}:{kind:`none`,word:`Not reported`,why:n?`The budget route does not list this seat.`:null}}function fn(e,t){if(t.kind===`spent`)return t.detail;let n=e.windows.find(e=>e.binding)??null;return n?.resetText?Tt(n.resetText):null}function pn(e,t,n){let r=N(e,{healthRead:n.healthRead,now:n.now}),i=dn(ln(e,t),r,n.budgetRead),a=on[r.kind]??`unknown`,o=`${r.label}${r.detail?` · ${r.detail}`:``}`,s,c,l;e.kind===`local`?(s=null,c=r.kind===`usable`?`Free`:r.kind===`unavailable`?`Offline`:`—`,l=r.kind===`usable`?`Runs on this machine`:r.kind===`checking`?`Checking…`:r.detail??r.label):(s=a===`out`?0:pt(e),c=a===`out`?r.label:s===null?`—`:`${_(s)} left`,l=fn(e,r)??(s===null?o:null));let u=e.kind===`local`&&e.localCount>1?`Local models (${e.localCount})`:e.label,d=[`${u}: ${c}`,l&&l!==o?l:null,o,`Autonomy: ${i.word}`].filter(e=>e!==null).join(`. `),f=e.reserve?.percent??null,p=f!==null&&f>0?f:null;return{key:e.seatId,engine:e.engine,name:u,leftPercent:s,level:a,value:c,note:l,status:r.label,autonomy:i,reservePercent:p,reserveLabel:e.reserve?.label??null,spoken:d}}function mn(e,t){let n=M(e),r=[];for(let e of n.values()){let n=e.headroom,i=n?.bindingWindow===`weekly`?n.weeklyUsedPercent:n?.bindingWindow===`session`?n.sessionUsedPercent:null,a=e.free||i==null?null:Math.max(0,Math.min(100,100-i)),o=te(n?.resetAt??null,t),s={kind:un[e.status],word:k[e.status],why:e.why?cn(e.why):null},c=e.free||a===null?`—`:`${_(a)} left`,l=e.free?`Readiness not reported`:o?`resets ${o}`:null;r.push({key:e.seatId,engine:e.engine,name:e.label,leftPercent:a,level:a===null?`unknown`:a<=0?`out`:`ok`,value:c,note:l,status:`Readiness not reported`,autonomy:s,reservePercent:null,reserveLabel:null,spoken:[`${e.label}: ${c}`,l,`Readiness not reported`,`Autonomy: ${s.word}`].filter(Boolean).join(`. `)})}return r.sort((e,t)=>Number(e.engine===`local`)-Number(t.engine===`local`)||e.name.localeCompare(t.name))}function hn({rows:e,budget:t,healthRead:n,now:r}){if(e.length===0){let e=t?mn(t,r):[];return{items:e,headline:e.length===0?`No seats reported yet`:`Seat roster not loaded — readiness unknown`}}let i=M(t);return{items:A(e,{healthRead:n,now:r}).map(e=>pn(e,i,{healthRead:n,budgetRead:t!==null,now:r})),headline:j(e)}}function gn(e,t){let n=Math.max(1,Math.floor(t));if(e===`compact`)return 1;let r=e===`medium`?3:5;if(n<=r)return e===`medium`&&n===4?2:n;let i=Math.ceil(n/r);return Math.ceil(n/i)}var Q={list:`_list_1r7bb_11`,item:`_item_1r7bb_17`,head:`_head_1r7bb_48`,logo:`_logo_1r7bb_55`,name:`_name_1r7bb_59`,value:`_value_1r7bb_71`,meter:`_meter_1r7bb_90`,fill:`_fill_1r7bb_99`,reserve:`_reserve_1r7bb_113`,foot:`_foot_1r7bb_124`,note:`_note_1r7bb_134`,autonomy:`_autonomy_1r7bb_142`,dot:`_dot_1r7bb_150`,tip:`_tip_1r7bb_173`,tipHead:`_tipHead_1r7bb_174`,tipLine:`_tipLine_1r7bb_175`,tipHint:`_tipHint_1r7bb_176`};function _n(){return(0,J.useSyncExternalStore)((0,J.useCallback)(e=>a(`verse-health`,e),[]),()=>i(`verse-health`),()=>i(`verse-health`)).data??null}function vn({item:e}){return(0,Y.jsxs)(`div`,{className:Q.tip,children:[(0,Y.jsxs)(`div`,{className:Q.tipHead,children:[(0,Y.jsx)(h,{engine:e.engine,size:14}),(0,Y.jsx)(`strong`,{children:e.name})]}),(0,Y.jsxs)(`div`,{children:[e.status,e.note&&e.note!==e.status?` · ${e.note}`:``]}),e.reserveLabel?(0,Y.jsx)(`div`,{className:Q.tipLine,children:e.reserveLabel}):null,(0,Y.jsxs)(`div`,{className:Q.tipLine,children:[`Autonomy: `,e.autonomy.word,e.autonomy.why?` — ${e.autonomy.why}`:``]}),(0,Y.jsx)(`div`,{className:Q.tipHint,children:`Click for Resources · ⌘.`})]})}function yn({item:e}){let t={"--fill":`${e.leftPercent??(e.engine===`local`&&e.value===`Free`?100:0)}%`,...e.reservePercent===null?{}:{"--reserve":`${e.reservePercent}%`}};return(0,Y.jsx)(C,{content:(0,Y.jsx)(vn,{item:e}),placement:`bottom`,children:(0,Y.jsxs)(`button`,{type:`button`,className:Q.item,"data-level":e.level,"data-free":e.engine===`local`||void 0,"aria-label":`${e.spoken}. Open Resources`,"aria-keyshortcuts":`Meta+.`,onClick:()=>x(),children:[(0,Y.jsxs)(`span`,{className:Q.head,children:[(0,Y.jsx)(h,{engine:e.engine,size:14,className:Q.logo}),(0,Y.jsx)(`span`,{className:Q.name,children:e.name}),(0,Y.jsx)(`span`,{className:Q.value,children:e.value})]}),(0,Y.jsxs)(`span`,{className:Q.meter,style:t,"aria-hidden":`true`,children:[(0,Y.jsx)(`span`,{className:Q.fill}),e.reservePercent===null?null:(0,Y.jsx)(`span`,{className:Q.reserve})]}),(0,Y.jsxs)(`span`,{className:Q.foot,children:[(0,Y.jsx)(`span`,{className:Q.note,children:e.note??e.status}),(0,Y.jsxs)(`span`,{className:Q.autonomy,"data-kind":e.autonomy.kind,children:[(0,Y.jsx)(`span`,{className:Q.dot,"aria-hidden":`true`}),e.autonomy.word]})]})]})})}function bn({budget:e,seats:t,now:n}){let r=_n(),{viewport:i}=w(),a=(0,J.useMemo)(()=>{let i=[];try{i=t&&t.length>0?ie(t,{health:r?.seats??null,budget:e,now:n}):[]}catch{i=[]}return hn({rows:i,budget:e,healthRead:r!==null,now:n})},[t,r,e,n]);return(0,Y.jsx)(q,{title:`Seats`,caption:a.headline,actions:(0,Y.jsxs)(`button`,{type:`button`,className:U.linkButton,onClick:()=>x(),"aria-keyshortcuts":`Meta+.`,children:[`Resources `,(0,Y.jsx)(`kbd`,{className:U.kbd,children:`⌘.`})]}),children:a.items.length===0?(0,Y.jsx)(G,{tone:`unknown`,children:`Seat capacity unavailable.`}):(0,Y.jsx)(`div`,{className:Q.list,role:`group`,"aria-label":`Capacity per seat`,style:{"--seat-columns":gn(i,a.items.length)},children:a.items.map(e=>(0,Y.jsx)(yn,{item:e},e.key))})})}var xn=new Intl.NumberFormat(`en-US`);function Sn({open:e,onClose:t,actions:n,estimatePerSessionUsd:r,onLaunched:i,defaultRepo:a=Ie}){let o=(0,J.useId)(),s=(0,J.useId)(),l=(0,J.useId)(),d=(0,J.useRef)(null),[f,p]=(0,J.useState)({repo:a,baseBranch:``,prompt:``}),[m,h]=(0,J.useState)({}),[g,_]=(0,J.useState)(null);(0,J.useEffect)(()=>{e&&(h({}),_(null))},[e]);let v=e=>{_(null),p(t=>({...t,...e})),h(t=>{let n={...t};for(let t of Object.keys(e))delete n[t];return n})},y=e=>{e.preventDefault();let r=Be(f);if(!r.ok){h(r.errors);return}h({}),_(null),n.act(async()=>{try{let e=await Ue({...r.request,origin:`operator`});p(e=>({...e,prompt:``})),i(e.task),t()}catch(e){if(e instanceof c)throw e;_(Ye(e))}},`Launch a Claude Code cloud session with this task.`)},b=f.prompt.trim().length;return(0,Y.jsx)(u,{open:e,onClose:t,titleId:o,title:`New cloud task`,description:`Runs as a Claude Code cloud session on your Claude account. It delivers a draft PR; nothing merges on its own.`,widthClassName:L.dialogWidth,initialFocusRef:d,children:(0,Y.jsxs)(`form`,{className:L.form,onSubmit:y,noValidate:!0,children:[(0,Y.jsxs)(`div`,{className:L.fieldGrid,children:[(0,Y.jsx)(at,{label:`Repository`,hint:`GitHub owner/name`,mono:!0,value:f.repo,error:m.repo,autoComplete:`off`,spellCheck:!1,onChange:e=>v({repo:e.target.value})}),(0,Y.jsx)(at,{label:`Base branch`,hint:`Must be pushed. Empty uses the default branch.`,mono:!0,value:f.baseBranch,placeholder:`default branch`,error:m.baseBranch,autoComplete:`off`,spellCheck:!1,onChange:e=>v({baseBranch:e.target.value})})]}),(0,Y.jsxs)(`div`,{className:L.textareaField,children:[(0,Y.jsx)(`label`,{className:L.label,htmlFor:s,children:`Task`}),(0,Y.jsx)(`textarea`,{ref:d,id:s,className:L.textarea,value:f.prompt,placeholder:`What should the cloud session do? It reads the repo's own guidance and opens a draft PR.`,"aria-invalid":m.prompt?!0:void 0,"aria-describedby":m.prompt?l:void 0,onChange:e=>v({prompt:e.target.value})}),m.prompt?(0,Y.jsx)(`p`,{id:l,className:L.fieldError,role:`alert`,children:m.prompt}):null,(0,Y.jsxs)(`p`,{className:L.muted,children:[xn.format(b),` of `,xn.format(Se),` characters`,r===null?``:` · estimated at ${Ae(r)} per session`]})]}),g?(0,Y.jsx)(`p`,{className:L.notice,"data-tone":`danger`,role:`alert`,children:g}):null,(0,Y.jsxs)(`div`,{className:L.formActions,children:[(0,Y.jsx)(P,{variant:`ghost`,onClick:t,disabled:n.busy,children:`Cancel`}),(0,Y.jsx)(P,{type:`submit`,variant:`primary`,busy:n.busy,children:`Launch`})]})]})})}var Cn=(0,J.lazy)(()=>r(()=>import(`./EvidenceTimeline-sCCAdnBK.js`),__vite__mapDeps([0,1,2,3,4,5,6,7])));function $({href:e,children:t,label:n}){return(0,Y.jsxs)(`a`,{className:L.link,href:e,target:`_blank`,rel:`noreferrer noopener`,"aria-label":n,children:[t,` `,(0,Y.jsx)(se,{width:12,height:12,"aria-hidden":`true`})]})}function wn({task:e,actions:t,now:n}){let r=F(e.sessionUrl,`claude.ai`),i=e.pr?F(e.pr.url,`github.com`):null,a=Ee(e,n),[o,s]=(0,J.useState)(!1);return(0,Y.jsxs)(`li`,{className:L.task,"data-state":e.state,children:[(0,Y.jsx)(`span`,{className:L.taskChip,children:(0,Y.jsx)(d,{status:e.state,tone:Ne[e.state],children:Ve(e)})}),(0,Y.jsxs)(`span`,{className:L.taskMain,children:[(0,Y.jsx)(`p`,{className:L.taskTitle,children:e.title}),(0,Y.jsx)(`span`,{className:L.muted,children:Te(e,n)}),a?(0,Y.jsx)(`span`,{className:L.facts,children:a}):null,(0,Y.jsxs)(`span`,{className:L.taskLinks,children:[r?(0,Y.jsx)($,{href:r,label:`Open “${e.title}” in Claude`,children:`Open in Claude`}):null,i&&e.pr?(0,Y.jsx)($,{href:i,label:`Pull request #${e.pr.number} on GitHub`,children:`PR #${e.pr.number}`}):null,(0,Y.jsx)(`button`,{type:`button`,className:L.linkButton,"aria-haspopup":`dialog`,"aria-label":`Evidence for “${e.title}”`,onClick:()=>s(!0),children:`Evidence`}),ke(e)?(0,Y.jsx)(`button`,{type:`button`,className:L.linkButton,disabled:t.busy||t.readOnly,"aria-label":`Dismiss “${e.title}”`,onClick:()=>t.act(()=>Ge(e.id),`Dismiss the cloud task “${e.title}”.`,{confirm:{title:`Dismiss this cloud task?`,body:`Verse stops tracking “${e.title}”. Nothing on GitHub or claude.ai changes — the session and any PR stay where they are.`,confirmLabel:`Dismiss`}}),children:`Dismiss`}):null]})]}),o?(0,Y.jsx)(J.Suspense,{fallback:null,children:(0,Y.jsx)(Cn,{taskId:e.id,title:e.title,open:!0,onClose:()=>s(!1),now:n})}):null]})}function Tn({overview:e,actions:t,onClose:n}){let r=(0,J.useRef)(null),i=(0,J.useId)();return l({open:!0,containerRef:r,onClose:n}),(0,Y.jsxs)(`div`,{ref:r,className:L.popover,role:`dialog`,"aria-modal":`false`,"aria-labelledby":i,tabIndex:-1,children:[(0,Y.jsx)(`h4`,{id:i,className:L.popoverTitle,children:`Cloud budget`}),(0,Y.jsx)(wt,{idPrefix:`cloud-card-budget`,budget:e.budget.budget,busy:t.busy,disabled:t.readOnly,onSave:e=>t.act(()=>We(e),`Change the cloud budget.`,{onDone:n}),onCancel:n})]})}function En({overview:e,actions:t,now:n,onNotice:r}){let i=e.budget,a=Re(i),o=ze(e.seat),s=je(i.canLaunch,`The cloud budget does not allow another launch right now.`),{shown:c,hidden:l}=Pe(e.tasks,n),u=i.budget.selfImprove,f=(0,Y.jsxs)(`p`,{className:L.estimateNote,children:[D(i.estimateNote,n),` `,(0,Y.jsx)($,{href:Ce,label:`Check the real balance on claude.ai`,children:`Check usage on claude.ai`})]});return(0,Y.jsxs)(`div`,{className:L.body,children:[o?(0,Y.jsxs)(`div`,{className:L.meterBlock,"data-standing":`not-set-up`,children:[(0,Y.jsxs)(`p`,{className:L.standing,title:Me(i.estimatedRemainingUsd),children:[(0,Y.jsx)(d,{status:`not-set-up`,tone:`warning`,children:Le}),(0,Y.jsxs)(`span`,{className:L.muted,children:[De(i.estimatedRemainingUsd),` · estimate`]})]}),(0,Y.jsx)(`p`,{className:L.notice,"data-tone":`warning`,role:`note`,children:o}),f]}):(0,Y.jsxs)(`div`,{className:L.meterBlock,children:[(0,Y.jsx)(me,{value:a.value,max:a.max,label:`Credits remaining`,valueText:a.text,tone:a.tone,"aria-label":`Estimated credits remaining: ${a.text}, ${a.usedText}`}),f,a.warning?(0,Y.jsx)(`p`,{className:L.notice,"data-tone":`warning`,role:`note`,children:a.warning}):null]}),(0,Y.jsx)(`p`,{className:L.facts,children:Oe(i,n)}),s?(0,Y.jsxs)(`p`,{className:L.notice,"data-tone":`warning`,role:`note`,"data-testid":`cloud-budget-refused`,children:[`New launches are paused: `,s]}):null,(0,Y.jsxs)(`div`,{className:L.toggleRow,children:[(0,Y.jsx)(be,{checked:u.enabled,label:`Self-improvement`,disabled:t.busy||t.readOnly,onChange:e=>t.act(()=>We({selfImprove:{enabled:e}}),e?`Let Verse launch its own self-improvement tasks.`:`Stop Verse launching its own self-improvement tasks.`,{onDone:()=>r({tone:`success`,text:e?`Self-improvement is on — up to ${u.maxPerDay} a day.`:`Self-improvement is off.`})})}),(0,Y.jsx)(`span`,{className:`${L.muted} ${L.toggleText}`,children:He(i)})]}),c.length===0?(0,Y.jsx)(G,{children:`No cloud tasks yet. Start one with New cloud task, or let Verse improve itself.`}):(0,Y.jsx)(`ul`,{className:L.tasks,"aria-label":`Cloud tasks`,children:c.map(e=>(0,Y.jsx)(wn,{task:e,actions:t,now:n},e.id))}),l>0?(0,Y.jsxs)(`p`,{className:L.muted,children:[l,` more `,l===1?`task is`:`tasks are`,` listed by ashlr cloud list.`]}):null]})}function Dn({actions:e,now:t=Date.now()}){let n=s(I,{freshMs:15e3}),r=o(I);b(r,Ke);let[i,a]=(0,J.useState)(!1),[c,l]=(0,J.useState)(!1),[u,d]=(0,J.useState)(null),f=n.data?.value??null,p=!n.data&&(n.status===`loading`||n.status===`idle`),m=f?Fe(f.seat,f.budget):null,h=e.busy||e.readOnly,g=f?.backlog.nextUp?f.backlog.items.find(e=>e.id===f.backlog.nextUp)??null:null,_=f?ze(f.seat)??je(f.budget.canLaunch,`The cloud budget does not allow another launch right now.`)??(g?null:`The self-improvement backlog has nothing left to launch.`):null,v=f?f.budget.budget.estimatedCostPerSessionUsd:null,y=f?(0,Y.jsxs)(`span`,{className:L.headActions,children:[(0,Y.jsx)(C,{label:m??`Start a cloud session with your own task`,children:(0,Y.jsx)(P,{size:`sm`,variant:`primary`,icon:(0,Y.jsx)(le,{width:14,height:14}),disabled:h||m!==null,onClick:()=>a(!0),children:`New cloud task`})}),(0,Y.jsx)(C,{label:_??(g?`Launch the next backlog item: ${g.title}`:`Launch the next backlog item`),children:(0,Y.jsx)(P,{size:`sm`,disabled:h||_!==null,onClick:()=>{f&&g&&e.act(()=>Je({count:1}),`Launch the next self-improvement task as a cloud session.`,{confirm:{title:`Improve Verse now?`,body:`Launches “${g.title}” as a cloud session on ${g.repo??f.budget.budget.selfImprove.repo}${v===null?``:`, estimated at ${Ae(v)}`}. It delivers a draft PR; nothing merges on its own.`,confirmLabel:`Launch`},onDone:e=>{let t=e.launched[0]??null;if(t)d({tone:`success`,text:`Started “${t.title}”.`,href:F(t.sessionUrl,`claude.ai`),linkText:`Open in Claude`});else{let t=e.skipped[0]?.reason??`Nothing was launched, and the server sent no reason.`;d({tone:`warning`,text:D(t)})}}})},children:`Improve Verse`})}),(0,Y.jsx)(C,{label:`Credits, per-session estimate and daily caps`,children:(0,Y.jsx)(P,{size:`sm`,variant:`ghost`,"aria-expanded":c,"aria-haspopup":`dialog`,onClick:()=>l(e=>!e),disabled:e.readOnly,children:`Edit budget`})}),(0,Y.jsx)(C,{label:`Check GitHub for task updates now`,children:(0,Y.jsx)(ae,{size:`sm`,variant:`ghost`,icon:(0,Y.jsx)(oe,{width:14,height:14}),"aria-label":`Check GitHub for task updates now`,disabled:h,onClick:()=>e.act(()=>qe(),`Re-read the cloud tasks from GitHub.`)})}),c?(0,Y.jsx)(Tn,{overview:f,actions:e,onClose:()=>l(!1)}):null]}):null;return n.data?.available===!1&&n.data.reason===`The cloud lane is not in this build yet.`?null:(0,Y.jsx)(q,{title:`Cloud`,caption:`Claude Code cloud sessions on your Claude credits`,actions:y,children:p?(0,Y.jsx)(`p`,{className:L.muted,"aria-busy":`true`,children:`Reading the cloud lane…`}):f?(0,Y.jsxs)(Y.Fragment,{children:[u?(0,Y.jsx)(`div`,{className:L.notice,"data-tone":u.tone,role:`status`,children:(0,Y.jsxs)(`span`,{className:L.noticeRow,children:[(0,Y.jsxs)(`span`,{children:[u.text,u.href?(0,Y.jsxs)(Y.Fragment,{children:[` `,(0,Y.jsx)($,{href:u.href,children:u.linkText??`Open`})]}):null]}),(0,Y.jsx)(`button`,{type:`button`,className:L.linkButton,onClick:()=>d(null),children:`Dismiss`})]})}):null,(0,Y.jsx)(En,{overview:f,actions:e,now:t,onNotice:d}),(0,Y.jsx)(Sn,{open:i,onClose:()=>a(!1),actions:e,estimatePerSessionUsd:v,onLaunched:e=>d({tone:`success`,text:`Started “${e.title}”.`,href:F(e.sessionUrl,`claude.ai`),linkText:`Open in Claude`})})]}):(0,Y.jsx)(G,{tone:`unknown`,children:n.data?.reason??n.error?.message??`The cloud lane did not answer.`})})}function On(e){let t=lt(e);return(0,Y.jsx)(`p`,{className:U.verdict,"data-testid":`verdict`,children:t.map((e,t)=>(0,Y.jsxs)(`span`,{className:U.verdictPart,"data-tone":e.tone,children:[t>0?(0,Y.jsx)(`span`,{className:U.verdictSep,"aria-hidden":`true`,children:` · `}):null,e.text]},e.key))})}var kn=`ashlr.verse.command.lastLooked.v1`;function An(){try{let e=window.localStorage.getItem(kn);return e&&Number.isFinite(Date.parse(e))?e:null}catch{return null}}function jn(e){try{window.localStorage.setItem(kn,e)}catch{}}function Mn(){let e=S(),[t,n]=(0,J.useState)(null),r=(0,J.useRef)(!1);return(0,J.useEffect)(()=>{e&&!r.current&&(n(An()),jn(new Date().toISOString())),r.current=e},[e]),t}function Nn({lastLookedAt:e,items:t,now:n=Date.now()}){if(!e||t.length===0)return null;let r=new Date(e);if(!Number.isFinite(r.getTime())||n-r.getTime()<36e5)return null;let i=r.toDateString()===new Date(n).toDateString()?r.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`}):r.toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`,minute:`2-digit`});return(0,Y.jsxs)(`div`,{className:U.since,role:`group`,"aria-label":`Since you looked at ${i}`,children:[(0,Y.jsxs)(`span`,{className:U.sinceLead,children:[`Since `,i]}),t.map(e=>(0,Y.jsx)(`span`,{className:U.sinceChip,"data-tone":e.tone,children:e.text},e.id))]})}var Pn=36e5,Fn=1e4,In=3e4,Ln=3e5;function Rn(){let{compact:e}=w(),t=s(tt),n=s(et),r=y(),c=s(B),l=s(nt,{freshMs:6e4}),u=s(rt,{freshMs:6e4}),d=s(ne,{freshMs:15e3}),m={authority:o(tt),fleet:o(et),leader:o(B),learning:o(nt),history:o(rt),budget:o(ne)};b(()=>{m.authority(),m.fleet()},Fn),b(()=>{m.leader(),m.budget()},In),b(()=>{m.history(),m.learning()},Ln);let h=R(3e4),g=mt(),_=Ht(g),v=Mn(),x=(0,J.useSyncExternalStore)((0,J.useCallback)(e=>a(`verse-bootstrap`,e),[]),()=>i(`verse-bootstrap`),()=>i(`verse-bootstrap`)).data?.seats??null,S=d.data??null,C=t.data?.value??null,T=n.data?.value??null,E=u.data?.value??null,ee=ge(T),te=(0,J.useMemo)(()=>Ct({fleet:T,history:E,learning:l.data?.value??null,policy:C?.policy??null,budget:S}),[T,E,l.data,C,S]),D=(0,J.useMemo)(()=>yt(x,S),[x,S]),O=_e(C?.grant.state===`none`),k=t.data&&n.data&&O.readiness!==void 0?he({authority:C,live:T,readiness:O.readiness,setup:O.report}):null,re=(0,J.useMemo)(()=>xt({fleet:T,history:E,learning:l.data?.value??null}),[T,E,l.data]),ie=bt({lastLookedAt:v,fleet:T,leader:c.data?.value??null,activity:r.data}),A=e?6:12,j=h-A*Pn,M=(0,J.useMemo)(()=>T?jt(T.runs,j,h):[],[T,j,h]),N=n.data?T?T.state===`dark`&&M.length===0?ve(T):M.length===0?{kind:`empty`,message:`No runs in the last ${A} hours.`}:{kind:`ready`}:{kind:`unknown`,reason:n.data.reason??`the live fleet view did not answer.`}:{kind:`loading`},ae=T?T.state===`dark`?null:`Fleet ${T.state}: ${T.summary.building??`—`} building, ${T.summary.queued??`—`} queued.`:`Fleet status unknown.`,P=[t,n].some(e=>e.status===`refreshing`);return(0,Y.jsxs)(gt,{title:`Command`,actions:P?(0,Y.jsx)(f,{}):null,lead:(0,Y.jsxs)(`div`,{className:U.lead,children:[(0,Y.jsx)(Ut,{read:t.data,loading:t.status===`loading`,budgetMode:S?.mode??null,actions:g,compact:e,now:h,grantFlow:_}),(0,Y.jsx)(ht,{actions:g}),k?(0,Y.jsx)(ye,{state:k,here:`command`,onGrant:e=>_.open(e,k.why)}):(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(On,{authority:C,building:T?.summary.building??null,mergedToday:T?.summary.mergedToday??null,revertsToday:T?.summary.revertsToday??null,reserve:_t(S),darkSince:ee}),(0,Y.jsx)(Nn,{lastLookedAt:v,items:ie,now:h})]})]}),children:[(0,Y.jsx)(K,{span:5,children:(0,Y.jsx)(an,{state:r,actions:g,fleetLine:ae,seatNames:D})}),(0,Y.jsx)(K,{span:7,children:(0,Y.jsx)(Et,{read:c.data,loading:c.status===`loading`,actions:g})}),k&&re?null:(0,Y.jsx)(K,{span:12,children:(0,Y.jsx)(Jt,{kpis:te})}),(0,Y.jsx)(K,{span:12,children:(0,Y.jsx)(bn,{budget:S,seats:x,now:h})}),(0,Y.jsx)(K,{span:12,children:(0,Y.jsx)(Dn,{actions:g,now:h})}),k&&M.length===0?null:(0,Y.jsx)(K,{span:12,children:(0,Y.jsx)(p,{title:`Last ${A} hours`,description:`Fleet lanes; bars coloured by status, outlines are queued or parked`,status:N,lanes:M,from:j,to:h,now:h,toneOf:At})}),_.sheet,g.dialogs]})}export{Fn as COMMAND_FAST_POLL_MS,Ln as COMMAND_HISTORY_POLL_MS,In as COMMAND_SLOW_POLL_MS,Rn as CommandSection};
|
|
3
|
-
//# sourceMappingURL=CommandSection-Brp73iox.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/command/GrantSheet.tsx","../../../../../../src/web-ui/routes/verse/command/AutonomyBar.tsx","../../../../../../src/web-ui/routes/verse/command/KpiRow.tsx","../../../../../../src/web-ui/routes/verse/command/NeedsYouCard.tsx","../../../../../../src/web-ui/routes/verse/command/seat-strip-model.ts","../../../../../../src/web-ui/routes/verse/command/SeatStrip.tsx","../../../../../../src/web-ui/routes/verse/cloud/CloudLaunchDialog.tsx","../../../../../../src/web-ui/routes/verse/cloud/CloudCard.tsx","../../../../../../src/web-ui/routes/verse/command/VerdictLine.tsx","../../../../../../src/web-ui/routes/verse/sections/CommandSection.tsx"],"sourcesContent":["/**\n * routes/verse/command/GrantSheet.tsx — the Touch ID sheet (SPEC-310B §6:\n * \"Raising it past the grant opens the Touch ID sheet, which shows scope and\n * expiry\"; unit C7).\n *\n * It shows EXACTLY what the custody helper will sign — the server's draft\n * StandingGrantV1 and its digest — before anything is sent: repos and how\n * far each may go, merge caps, spend (mode ceiling, metered dollars, every\n * seat's reserve floor), engines, the Leader's classes and veto window, the\n * rollout ladder with each rung's exit criteria, and the expiry. Approving\n * echoes the draft's digest back, so the server signs what Mason read, not\n * whatever it would draft a second later. The Touch ID prompt itself is the\n * helper's, on this Mac; this page never sees a key.\n *\n * All copy is plain text; the draft is server data but rendered as text only.\n */\nimport { useId } from 'react';\nimport type { AuthorityGrantDraft, RolloutStage, StandingGrantV1 } from '../../../../core/authority/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { IconLock } from '../../../components/primitives/icons.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { authorityDraftQuery, type OptionalRead } from './surface-data.js';\nimport { SWITCH_LABEL } from './authority-model.js';\nimport { CardNote, MicroLabel } from './Surface.js';\nimport type { AutonomySwitch } from '../../../../core/authority/types.js';\nimport styles from './command.module.css';\n\nexport type GrantIntent = 'grant' | 're-approve';\n\nexport interface GrantSheetProps {\n open: boolean;\n intent: GrantIntent;\n /** The switch position the operator asked for (applied after the grant, if it allows it). */\n then: AutonomySwitch | null;\n busy: boolean;\n /** Why the sheet opened, in one sentence (\"Autonomous needs a new grant.\"). */\n why: string;\n onApprove: (draft: AuthorityGrantDraft) => void;\n onClose: () => void;\n}\n\nconst DAY = 86_400_000;\n\nfunction fmtDate(iso: string): string {\n const t = Date.parse(iso);\n return Number.isFinite(t) ? new Date(t).toLocaleString('en-US', { weekday: 'short', month: 'short', day: 'numeric', hour: 'numeric', minute: '2-digit' }) : '—';\n}\n\nexport function grantDays(g: Pick<StandingGrantV1, 'issuedAt' | 'expiresAt'>): number | null {\n const a = Date.parse(g.issuedAt);\n const b = Date.parse(g.expiresAt);\n return Number.isFinite(a) && Number.isFinite(b) ? Math.round((b - a) / DAY) : null;\n}\n\nfunction stageLine(s: RolloutStage): string {\n const c = s.criteria;\n const parts = [\n `${s.repos.length} repo${s.repos.length === 1 ? '' : 's'}`,\n `${s.maxRisk} risk`,\n `≤ ${s.maxFiles} files / ${s.maxLines} lines`,\n `≤ ${s.maxMergesPerRepoPerDay} merges/repo/day`,\n ];\n const exit = [`${c.minMerges} merges`, `${c.minHours} h`, c.minPostMergeGreenPct ? `≥ ${c.minPostMergeGreenPct}% green` : null, `≤ ${c.maxRevertRatePct}% reverts`].filter(Boolean);\n return `${parts.join(' · ')} — advances after ${exit.join(', ')}`;\n}\n\nexport function DraftScope({ draft }: { draft: AuthorityGrantDraft }) {\n const g = draft.payload;\n const days = grantDays(g);\n return (\n <div className={styles.scope}>\n <section className={styles.scopeBlock} aria-label=\"Expiry\">\n <MicroLabel>Expiry</MicroLabel>\n <p className={styles.scopeLead}>\n {days !== null ? `${days} days` : '—'}, until {fmtDate(g.expiresAt)}\n </p>\n <p className={styles.scopeMeta}>\n Signed by key <span className={styles.mono}>{g.keyId}</span> · sequence {g.grantSeq} · bound to this Mac\n </p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Repositories\">\n <MicroLabel>Repositories ({g.repos.length})</MicroLabel>\n <table className={styles.scopeTable}>\n <thead>\n <tr>\n <th scope=\"col\">Repo</th>\n <th scope=\"col\">Up to</th>\n <th scope=\"col\">Checks</th>\n <th scope=\"col\">Risk</th>\n <th scope=\"col\" className={styles.num}>Merges/day</th>\n </tr>\n </thead>\n <tbody>\n {g.repos.map((r) => (\n <tr key={r.nameWithOwner}>\n <td className={styles.mono}>{r.nameWithOwner}</td>\n <td>{r.stage === 'merge' ? 'Merge' : 'Propose'}</td>\n <td>{r.enforcement === 'server' ? 'GitHub' : 'Local only'}</td>\n <td>{r.maxRisk}</td>\n <td className={styles.num}>{r.maxMergesPerDay}</td>\n </tr>\n ))}\n </tbody>\n </table>\n <p className={styles.scopeMeta}>\n Every merge ≤ {g.merge.maxFiles} files / {g.merge.maxLines} lines · ashlr-hub itself: {g.merge.selfRepo === 'propose-only' ? 'propose only' : 'merge outside authority code'}\n </p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Spend\">\n <MicroLabel>Spend</MicroLabel>\n <p className={styles.scopeLead}>\n Up to {g.spend.maxMode === 'all-in' ? 'All-in' : g.spend.maxMode === 'balanced' ? 'Balanced' : 'Reserve'} · metered APIs ${g.spend.meteredUsdPerDay}/day\n </p>\n <ul className={styles.scopeList}>\n {Object.entries(g.spend.seats).map(([seatId, seat]) => (\n <li key={seatId}>\n <span className={styles.mono}>{seatId}</span>\n {seat.enabled ? `: keeps ${seat.reserveFloorPercent}% for you` : ': not used by autonomy'}\n {seat.enabled && seat.maxSessionWindowPercent !== undefined ? `, never above ${seat.maxSessionWindowPercent}% of its 5-hour window` : ''}\n {seat.enabled ? ` · ${seat.roles.join(', ')}` : ''}\n </li>\n ))}\n </ul>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Engines and Leader\">\n <MicroLabel>Engines and Leader</MicroLabel>\n <p className={styles.scopeLead}>{g.engines.join(', ') || 'none'}</p>\n <p className={styles.scopeMeta}>\n Leader classes {g.leader.classes.length ? g.leader.classes.join(' + ') : 'none (proposes only)'} · class-B veto window {g.leader.vetoMinutes} min ·\n goal conductor {g.conductorGoals ? 'on' : 'off'}\n </p>\n </section>\n\n <section className={styles.scopeBlock} aria-label=\"Rollout ladder\">\n <MicroLabel>Rollout ladder ({g.rollout.stages.length} stages, advances by itself)</MicroLabel>\n <ol className={styles.ladder}>\n {g.rollout.stages.map((s) => (\n <li key={s.id}>\n <span className={styles.ladderId}>{s.id}</span>\n <span>{stageLine(s)}</span>\n </li>\n ))}\n </ol>\n <p className={styles.scopeMeta}>Any sandbox violation or reserve breach drops it back one stage. It can never climb past the last stage.</p>\n </section>\n\n <p className={styles.scopeMeta}>\n Draft digest <span className={styles.mono}>{draft.digest.slice(0, 16)}…</span>\n </p>\n </div>\n );\n}\n\nexport function GrantSheet({ open, intent, then, busy, why, onApprove, onClose }: GrantSheetProps) {\n const titleId = useId();\n // Only read the draft while the sheet is open: drafting is cheap on the\n // server, but a draft read while the sheet is closed would be stale by the\n // time anyone approved it.\n return open ? <GrantSheetBody titleId={titleId} intent={intent} then={then} busy={busy} why={why} onApprove={onApprove} onClose={onClose} /> : null;\n}\n\nfunction GrantSheetBody({ titleId, intent, then, busy, why, onApprove, onClose }: Omit<GrantSheetProps, 'open'> & { titleId: string }) {\n const read = useQuery(authorityDraftQuery, { freshMs: 0 });\n const draft = (read.data as OptionalRead<AuthorityGrantDraft> | undefined)?.value ?? null;\n const reason = read.data?.reason ?? null;\n return (\n <Sheet\n open\n onClose={onClose}\n titleId={titleId}\n width={600}\n title={intent === 're-approve' ? 'Re-approve the standing grant' : 'Approve a standing grant'}\n description={why}\n footer={\n <div className={styles.sheetFooter}>\n <p className={styles.sheetFootnote}>\n Touch ID appears on this Mac. Lowering authority — Off, Stop, Revoke — never needs it.\n {then ? ` After approval the switch moves to ${SWITCH_LABEL[then]}.` : ''}\n </p>\n <span className={styles.sheetButtons}>\n <Button variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button variant=\"primary\" icon={<IconLock />} disabled={!draft} busy={busy} onClick={() => draft && onApprove(draft)}>\n Approve with Touch ID\n </Button>\n </span>\n </div>\n }\n >\n {read.status === 'loading' && !read.data ? (\n <p className={styles.muted} aria-busy=\"true\">Preparing the grant draft…</p>\n ) : draft ? (\n <DraftScope draft={draft} />\n ) : (\n <CardNote tone=\"unknown\">{reason ?? 'Grant draft unreadable — nothing to approve.'}</CardNote>\n )}\n </Sheet>\n );\n}\n","/**\n * routes/verse/command/AutonomyBar.tsx — Command's top bar (SPEC-310B §6,\n * SPEC-310C §5; unit C7):\n *\n * Autonomy [Off | Propose | Autonomous] Budget · Balanced ▾ Grant 23d ■ Stop\n *\n * - Lowering the switch is instant (no confirm, no Touch ID — I1).\n * - Raising within what the installed grant allows is instant too.\n * - Raising PAST the grant opens the Touch ID sheet with the draft's full\n * scope and expiry; the switch then moves once the grant is signed.\n * - The Budget pill opens A9's BudgetControl, with the grant's mode\n * ceiling stated above it (autonomy never spends past it whatever the\n * control shows — the server clamps; see CROSS-UNIT REQUEST to C6).\n * - The grant chip reads \"23d\", or \"Paused, re-approve\" and opens the sheet.\n * - Stop asks for confirmation (the catalog's `fleet.stop` guard copy),\n * then writes KILL; while stopped it becomes Resume.\n *\n * At 375 px the bar is just [Autonomy][■] (SPEC-310C §5); the budget pill\n * and grant chip move under the verdict line (rendered by CommandSection).\n *\n * ⌘K reaches the same paths (usePaletteCommands below): \"Autonomy: …\",\n * \"Approve grant…\" and \"Budget mode: …\" run THROUGH this bar — the switch's\n * lower/raise/needs-grant classification, the grant chip's own intent, the\n * budget's grant ceiling, the token prompt, the read-only session — so the\n * palette can never be a shortcut around any of them. When the bar would\n * have been disabled, the palette says why instead of doing nothing.\n */\nimport { useState, type ReactNode } from 'react';\nimport type { AuthorityGrantDraft, AuthorityStatusV1, AutonomySwitch } from '../../../../core/authority/types.js';\nimport type { BudgetMode } from '../../../../core/routing/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { Sheet } from '../../../components/primitives/Sheet.js';\nimport { IconChevronDown, IconLock, IconPlay, IconStop } from '../../../components/primitives/icons.js';\nimport { BudgetControl } from '../budget/BudgetControl.js';\nimport { modeAboveCeiling } from '../budget/budget-model.js';\nimport { updateBudget } from '../budget/budget-queries.js';\nimport { useCommandHandler } from '../shell/command-bus.js';\nimport { findCommand } from '../shell/command-catalog.js';\nimport { shellNotify } from '../shell/run-command.js';\nimport { actionForDraft, SWITCH_LABEL, SWITCH_RANK, classifySwitch, grantChip, stopOutcomeSentence, switchOptions, type ChipTone } from './authority-model.js';\nimport { GrantSheet, type GrantIntent } from './GrantSheet.js';\nimport { postAuthority, type OptionalRead } from './surface-data.js';\nimport type { ConfirmSpec, SurfaceActions } from './actions.js';\nimport styles from './command.module.css';\n\nconst MODE_WORD: Record<BudgetMode, string> = { 'all-in': 'All-in', balanced: 'Balanced', reserve: 'Reserve' };\n\n/** The catalog's Stop copy, so ⌘K \"Stop the fleet…\" and this button confirm with the same words. */\nexport function stopConfirm(): ConfirmSpec {\n const guard = findCommand('fleet.stop')?.guard?.confirm;\n return {\n title: guard?.title ?? 'Stop the fleet?',\n body: guard?.body ?? 'Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.',\n confirmLabel: guard?.confirmLabel ?? 'Stop fleet',\n destructive: true,\n };\n}\n\nconst RESUME_CONFIRM: ConfirmSpec = {\n title: 'Resume the fleet?',\n body: 'Autonomy picks up at the switch position on its next tick. Stopping again is one click.',\n confirmLabel: 'Resume fleet',\n destructive: false,\n};\n\nexport function ChipDot({ tone }: { tone: ChipTone }) {\n return <span className={styles.dot} data-tone={tone} aria-hidden=\"true\" />;\n}\n\n/**\n * The Touch ID sheet and what approving it does, as one piece: the bar's\n * switch and grant chip open it, and so does Command's \"Autonomy is off\"\n * banner (autonomy/AutonomyOffState) — one sheet, one approve path.\n */\nexport interface GrantFlow {\n /** `then`: the switch position to apply after signing, if the new grant allows it. */\n open: (intent: GrantIntent, why: string, then?: AutonomySwitch | null) => void;\n /** Render once (the bar does unless its owner passes the flow in). */\n sheet: ReactNode;\n}\n\nexport function useGrantFlow(actions: SurfaceActions): GrantFlow {\n const [sheet, setSheet] = useState<{ intent: GrantIntent; then: AutonomySwitch | null; why: string } | null>(null);\n\n function approve(draft: AuthorityGrantDraft): void {\n if (!sheet) return;\n const { then } = sheet;\n // The DRAFT decides grant vs re-approve (B-U1: GET …/draft answers with\n // `kind`, and POST refuses a digest whose kind does not match the action).\n // The sheet's intent is only what the operator clicked; a grant that is no\n // longer continuable is drafted as a new one, and signing it must say so.\n const intent = actionForDraft(draft, sheet.intent);\n actions.act(\n () => postAuthority({ action: intent, draftDigest: draft.digest }),\n intent === 're-approve' ? 'Re-approve the standing grant' : 'Sign a new standing grant',\n {\n onDone: (next) => {\n setSheet(null);\n // Apply the requested position only if the NEW grant allows it.\n if (then && next && SWITCH_RANK[then] <= SWITCH_RANK[next.maxSwitchWithoutGrant] && then !== next.switch) {\n actions.act(() => postAuthority({ action: 'switch', to: then }), `Switch autonomy to ${SWITCH_LABEL[then]}`);\n }\n },\n },\n );\n }\n\n return {\n open: (intent, why, then = null) => setSheet({ intent, then, why }),\n sheet: (\n <GrantSheet\n open={sheet !== null}\n intent={sheet?.intent ?? 'grant'}\n then={sheet?.then ?? null}\n why={sheet?.why ?? ''}\n busy={actions.busy}\n onApprove={approve}\n onClose={() => setSheet(null)}\n />\n ),\n };\n}\n\nexport interface AutonomyBarProps {\n read: OptionalRead<AuthorityStatusV1> | undefined;\n loading: boolean;\n budgetMode: BudgetMode | null;\n actions: SurfaceActions;\n compact: boolean;\n now: number;\n /** A flow shared with the rest of the surface; its owner renders `sheet`. Omitted = the bar's own. */\n grantFlow?: GrantFlow;\n}\n\nexport function AutonomyBar({ read, loading, budgetMode, actions, compact, now, grantFlow }: AutonomyBarProps) {\n const status = read?.value ?? null;\n const ownFlow = useGrantFlow(actions);\n const flow = grantFlow ?? ownFlow;\n /** What the last Stop did (drain count, merges revoked) — shown while stopped. */\n const [stopNote, setStopNote] = useState<string | null>(null);\n const [budgetOpen, setBudgetOpen] = useState(false);\n const unavailable = !status;\n const chip = grantChip(status, now);\n\n function onSwitch(to: AutonomySwitch): void {\n if (!status) return;\n const change = classifySwitch(status, to);\n if (change === 'same') return;\n if (change === 'raise-needs-grant') {\n const paused = status.grant.state === 'paused';\n flow.open(\n paused ? 're-approve' : 'grant',\n paused\n ? `${status.grant.reason ?? 'The grant is paused.'} ${SWITCH_LABEL[to]} needs it re-approved.`\n : `${SWITCH_LABEL[to]} is beyond what the installed grant allows, so it needs a new grant.`,\n to,\n );\n return;\n }\n // Lower, or raise within the grant: straight to the server, no dialog.\n actions.act(() => postAuthority({ action: 'switch', to }), `Switch autonomy to ${SWITCH_LABEL[to]}`);\n }\n\n // ⌘K \"Approve grant…\" opens the SAME flow the chip and the off-state banner do.\n usePaletteCommands({ read, status, budgetMode, actions, chip, onSwitch, openGrant: flow.open });\n\n const options = status ? switchOptions(status) : switchOptions({ switch: 'off', maxSwitchWithoutGrant: 'off' });\n const stopped = status?.kill ?? false;\n const disabled = unavailable || actions.busy || actions.readOnly;\n\n const switchControl = (\n <div className={styles.switchWrap} title={unavailable ? (read?.reason ?? 'Reading autonomy state…') : undefined}>\n {!compact ? <span className={styles.barLabel} aria-hidden=\"true\">Autonomy</span> : null}\n <Segmented<AutonomySwitch>\n size=\"sm\"\n aria-label=\"Autonomy\"\n value={status?.switch ?? 'off'}\n onChange={onSwitch}\n options={options.map((o) => ({\n value: o.value,\n label: (\n <span className={styles.switchOption}>\n {compact ? o.short : o.label}\n {o.needsGrant ? <IconLock className={styles.touchMark} width={12} height={12} aria-hidden=\"true\" /> : null}\n </span>\n ),\n ariaLabel: o.ariaLabel,\n disabled,\n }))}\n />\n </div>\n );\n\n const onStop = () => actions.act(() => postAuthority({ action: 'stop' }), 'Stop the fleet', {\n confirm: stopConfirm(),\n onDone: (next) => setStopNote(stopOutcomeSentence(next)),\n });\n const onResume = () => actions.act(() => postAuthority({ action: 'clear-stop' }), 'Resume the fleet', {\n confirm: RESUME_CONFIRM,\n onDone: () => setStopNote(null),\n });\n const stopButton = stopped\n ? compact\n ? <Button variant=\"subtle\" size=\"sm\" icon={<IconPlay />} iconOnly aria-label=\"Resume the fleet\" disabled={disabled} onClick={onResume} />\n : <Button variant=\"subtle\" size=\"sm\" icon={<IconPlay />} disabled={disabled} onClick={onResume}>Resume</Button>\n : compact\n ? <Button variant=\"danger\" size=\"sm\" icon={<IconStop />} iconOnly aria-label=\"Stop the fleet\" disabled={disabled} onClick={onStop} />\n : <Button variant=\"danger\" size=\"sm\" icon={<IconStop />} disabled={disabled} onClick={onStop}>Stop</Button>;\n\n return (\n <>\n <div className={styles.bar} role=\"toolbar\" aria-label=\"Autonomy controls\" data-loading={loading || undefined}>\n {switchControl}\n {!compact ? (\n <>\n <BudgetPill mode={budgetMode} onOpen={() => setBudgetOpen(true)} />\n <GrantChip chip={chip} onOpen={(intent) => flow.open(intent, chip.detail)} />\n </>\n ) : null}\n <span className={styles.barSpacer} />\n {stopButton}\n </div>\n {stopped && stopNote ? <p className={styles.muted} role=\"status\">{stopNote}</p> : null}\n {compact ? (\n <div className={styles.barSecondary}>\n <BudgetPill mode={budgetMode} onOpen={() => setBudgetOpen(true)} />\n <GrantChip chip={chip} onOpen={(intent) => flow.open(intent, chip.detail)} />\n </div>\n ) : null}\n {grantFlow ? null : ownFlow.sheet}\n <BudgetSheet open={budgetOpen} onClose={() => setBudgetOpen(false)} status={status} />\n </>\n );\n}\n\n// ---------------------------------------------------------------------------\n// ⌘K — the palette's autonomy, grant and budget entries\n// ---------------------------------------------------------------------------\n\ninterface PaletteWiring {\n read: OptionalRead<AuthorityStatusV1> | undefined;\n status: AuthorityStatusV1 | null;\n budgetMode: BudgetMode | null;\n actions: SurfaceActions;\n chip: ReturnType<typeof grantChip>;\n onSwitch: (to: AutonomySwitch) => void;\n openGrant: GrantFlow['open'];\n}\n\n/**\n * Why the bar's controls are disabled right now, in the words the operator\n * needs — or null when they are live. Mirrors `disabled` in AutonomyBar.\n */\nexport function paletteBlock(p: { status: AuthorityStatusV1 | null; reason: string | null; readOnly: boolean; busy: boolean }): string | null {\n if (p.readOnly) return 'Read-only session: this server was started without dispatch, so autonomy cannot be changed from here.';\n if (!p.status) return p.reason ?? 'The autonomy state has not been read yet, so nothing was changed.';\n if (p.busy) return 'Another autonomy action is still running. Try again when it finishes.';\n return null;\n}\n\nfunction usePaletteCommands({ read, status, budgetMode, actions, chip, onSwitch, openGrant }: PaletteWiring): void {\n // Registered only once the authority read has answered (value OR a reason):\n // a command parked while Command mounts must be judged against a real\n // status, never the empty one of the first render.\n const ready = read !== undefined;\n const block = () => paletteBlock({ status, reason: read?.reason ?? null, readOnly: actions.readOnly, busy: actions.busy });\n\n const toSwitch = (to: AutonomySwitch) => () => {\n const why = block();\n if (why || !status) {\n shellNotify(why ?? 'The autonomy state is unknown, so nothing was changed.', 'neutral');\n return;\n }\n if (status.switch === to) {\n shellNotify(`Autonomy is already ${SWITCH_LABEL[to]}.`, 'neutral');\n return;\n }\n // The bar's own click path: lower / raise within the grant → POST;\n // past the grant → the Touch ID sheet, which says why it opened.\n onSwitch(to);\n };\n useCommandHandler('autonomy.off', toSwitch('off'), ready);\n useCommandHandler('autonomy.propose', toSwitch('propose'), ready);\n useCommandHandler('autonomy.autonomous', toSwitch('autonomous'), ready);\n\n useCommandHandler(\n 'autonomy.grant',\n () => {\n const why = block();\n if (why) {\n shellNotify(why, 'neutral');\n return;\n }\n // The chip decides, exactly as a click on it would: nothing to approve\n // while an active grant has days left — say so rather than draft a\n // replacement nobody asked for.\n if (!chip.action) {\n shellNotify(chip.detail, 'neutral');\n return;\n }\n openGrant(chip.action, chip.detail);\n },\n ready,\n );\n\n const toBudget = (mode: BudgetMode) => () => {\n // Budget does not need the authority read to be present — only to know\n // the ceiling — but a read-only or busy surface refuses it like the pill.\n if (actions.readOnly || actions.busy) {\n shellNotify(block() ?? 'Budget cannot be changed right now.', 'neutral');\n return;\n }\n if (budgetMode === mode) {\n shellNotify(`Budget is already ${MODE_WORD[mode]}.`, 'neutral');\n return;\n }\n // BudgetSheet's rule: an active grant's mode ceiling disables the modes above it.\n const ceiling = status?.grant.state === 'active' ? status.grant.maxMode : null;\n if (ceiling && modeAboveCeiling(mode, ceiling)) {\n shellNotify(`Your grant allows up to ${MODE_WORD[ceiling]}, so ${MODE_WORD[mode]} is unavailable. A new grant can raise the ceiling.`, 'neutral');\n return;\n }\n actions.act(() => updateBudget({ mode }), `Switch the budget to ${MODE_WORD[mode]}`, {\n onDone: () => shellNotify(`Budget set to ${MODE_WORD[mode]}.`, 'success'),\n });\n };\n useCommandHandler('budget.all-in', toBudget('all-in'), ready);\n useCommandHandler('budget.balanced', toBudget('balanced'), ready);\n useCommandHandler('budget.reserve', toBudget('reserve'), ready);\n}\n\nexport function BudgetPill({ mode, onOpen }: { mode: BudgetMode | null; onOpen: () => void }) {\n return (\n <button type=\"button\" className={styles.pill} aria-haspopup=\"dialog\" onClick={onOpen}>\n <span className={styles.pillLabel}>Budget</span>\n <span>{mode ? MODE_WORD[mode] : '—'}</span>\n <IconChevronDown width={14} height={14} aria-hidden=\"true\" />\n </button>\n );\n}\n\nexport function GrantChip({ chip, onOpen }: { chip: ReturnType<typeof grantChip>; onOpen: (intent: GrantIntent) => void }) {\n const body: ReactNode = (\n <>\n <ChipDot tone={chip.tone} />\n <span className={styles.pillLabel}>Grant</span>\n <span>{chip.label}</span>\n </>\n );\n if (!chip.action) {\n return (\n <span className={styles.chip} data-tone={chip.tone} title={chip.detail} aria-label={`Grant: ${chip.label}. ${chip.detail}`} role=\"status\">\n {body}\n </span>\n );\n }\n const intent = chip.action;\n return (\n <button type=\"button\" className={styles.chip} data-tone={chip.tone} title={chip.detail} aria-haspopup=\"dialog\" onClick={() => onOpen(intent)} aria-label={`Grant: ${chip.label}. ${chip.detail}`}>\n {body}\n </button>\n );\n}\n\nfunction BudgetSheet({ open, onClose, status }: { open: boolean; onClose: () => void; status: AuthorityStatusV1 | null }) {\n const max = status?.grant.state === 'active' ? status.grant.maxMode : null;\n return (\n <Sheet\n open={open}\n onClose={onClose}\n titleId=\"command-budget-sheet\"\n width={560}\n title=\"Budget\"\n description={\n max\n ? `Your grant allows up to ${MODE_WORD[max]}. Autonomy never spends past it, whatever is selected here — moving toward Reserve is always instant.`\n : 'No active grant: autonomy only proposes. The budget still decides which seats it would use.'\n }\n >\n {/* The grant's ceiling disables the modes above it (A9 control, C7 request). */}\n {open ? <BudgetControl maxMode={max} /> : null}\n </Sheet>\n );\n}\n","/**\n * routes/verse/command/KpiRow.tsx — five StatTiles (SPEC-310B §6: merged in\n * 7 days, post-merge green %, cycle time, spend vs cap, lift), each with a\n * \"vs prior 7d\" delta when both weeks are fully known. Five across at 1440,\n * two per row at 375.\n */\nimport { StatTile } from '../../../components/charts/StatTile.js';\nimport type { Kpi } from './command-model.js';\nimport styles from './command.module.css';\n\nexport function KpiRow({ kpis }: { kpis: Kpi[] }) {\n return (\n <div className={styles.kpis} role=\"group\" aria-label=\"Key numbers\">\n {kpis.map((k) => (\n <StatTile key={k.id} label={k.label} value={k.value} delta={k.delta} trend={k.trend} trendLabel={k.trendLabel} caption={k.caption} />\n ))}\n </div>\n );\n}\n","/**\n * routes/verse/command/NeedsYouCard.tsx — Command's \"Needs you\" card (span 5\n * at 1440, FIRST at 375; SPEC-310C §5). The five most urgent items from the\n * one inbox (owner-lane PRs, class-C asks, veto windows, holds, grant\n * renewal, reconnects — R1 producers via C1's activity route), each with its\n * own actions. The full, keyboard-triaged list is the ⌘J drawer (C1); this\n * card is the glance and the one-click path.\n *\n * Honesty: when any producer did not answer, the card never says \"All\n * clear\" — it names the silent sources instead (\"fleet not answering\").\n * Every approve / reject / veto confirms first (NeedsYouAction contract),\n * then asks for the token; items render their text as plain text only.\n *\n * Rows read like the drawer's (shell/needs-you-model needsYouRowView, one\n * copy): a \"Patch · Claude run\" label over a title that ends on a whole word\n * (two lines at most, the server's text as its tooltip), \"2 files · +384 −0 ·\n * Test-and-repair loop\" for a sandboxed run, the repo's short name, the seat\n * by its label (\"Claude Max\", the id on hover — never \"claude-a\"), and \"38\n * days ago\" with the exact local time on hover.\n */\nimport { Fragment, type ReactElement } from 'react';\nimport type { NeedsYouAction, NeedsYouItem, VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { IconExternalLink } from '../../../components/primitives/icons.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { ENGINE_LABEL, isVerseEngine } from '../verse-model.js';\nimport { rankNeedsYou, silentSources } from './command-model.js';\nimport { anchorId, goToSection, openChat, openNeedsYou } from './nav.js';\nimport { postNeedsYouAction } from './surface-data.js';\nimport type { ActivityState } from '../shell/useActivity.js';\nimport { needsYouRowView, readableItemTitle, type NeedsYouRowView } from '../shell/needs-you-model.js';\nimport { NeedsYouRunFacts } from '../shell/NeedsYouList.js';\nimport { Card, CardNote } from './Surface.js';\nimport type { ConfirmSpec, SurfaceActions } from './actions.js';\nimport styles from './command.module.css';\n\nexport const NEEDS_YOU_CARD_LIMIT = 5;\n\n/** Relative ages (\"38 days ago\") only need to stay true to the minute. */\nconst AGE_TICK_MS = 30_000;\n\nconst SEVERITY_WORD = { high: 'Urgent', warn: 'Soon', info: 'FYI' } as const;\nconst SOURCE_WORD: Record<string, string> = {\n approvals: 'approvals',\n authority: 'authority',\n fleet: 'fleet',\n leader: 'Leader',\n chats: 'chats',\n accounts: 'accounts',\n};\n\n/** Generic confirmation for the kinds the drawer always confirms (approve / reject / veto). */\nexport function confirmFor(item: NeedsYouItem, action: NeedsYouAction): ConfirmSpec | undefined {\n if (action.confirm) return { ...action.confirm, destructive: action.destructive };\n if (action.kind === 'approve' || action.kind === 'reject' || action.kind === 'veto') {\n const verb = action.kind === 'approve' ? 'Approve' : action.kind === 'reject' ? 'Reject' : 'Veto';\n return { title: `${verb}?`, body: readableItemTitle(item).text, confirmLabel: action.label, destructive: action.destructive };\n }\n return undefined;\n}\n\nfunction targetLink(item: NeedsYouItem): { label: string; onOpen?: () => void; href?: string } | null {\n const t = item.target;\n switch (t.kind) {\n case 'url':\n return /^https:\\/\\//.test(t.url) ? { label: 'Open', href: t.url } : null;\n case 'section':\n return { label: 'Show', onOpen: () => goToSection(t.section, t.anchor) };\n case 'session':\n return { label: 'Open chat', onOpen: () => openChat(t.sessionId) };\n case 'approval':\n case 'seat':\n return { label: 'Open', onOpen: () => openNeedsYou(item.id) };\n default:\n return null;\n }\n}\n\n/** Seat id → display label (command-model `seatNames`). */\nexport type SeatNames = ReadonlyMap<string, string>;\n\n/**\n * The row's kind label with its engine named the way every other surface\n * names it (verse-model ENGINE_LABEL): the shared title reader\n * (approvals-model `readableTitle`) keeps the wire's lower case for a\n * PARTIAL run, so \"Patch · Claude run\" sat beside \"Patch · Partial claude\n * run\". Only the trailing \"<engine> run\" eyebrow is touched.\n */\nexport function cardKindLabel(label: string | null): string | null {\n if (label === null) return null;\n return label.replace(/(^|· )(Partial )?([a-z][\\w-]*) run$/, (_m, lead: string, partial: string | undefined, engine: string) => {\n const name = isVerseEngine(engine) ? ENGINE_LABEL[engine] : `${engine.charAt(0).toUpperCase()}${engine.slice(1)}`;\n return `${lead}${partial ?? ''}${name} run`;\n });\n}\n\n/** \"binshield · #81 · Claude Max · 38 days ago\" — the full repo, the seat id and the exact time ride in tooltips. */\nfunction Meta({ item, view, seatNames }: { item: NeedsYouItem; view: NeedsYouRowView; seatNames: SeatNames | undefined }) {\n const s = item.subject;\n const parts: ReactElement[] = [];\n if (view.repo) parts.push(<span key=\"repo\" className={styles.needsRepo} title={view.repoFull}>{view.repo}</span>);\n if (s.pr) parts.push(<span key=\"pr\">#{s.pr}</span>);\n if (s.seatId) {\n // Unknown to both the roster and the budget route: the id is all there is.\n const name = seatNames?.get(s.seatId) ?? s.seatId;\n parts.push(<span key=\"seat\" title={name === s.seatId ? undefined : s.seatId}>{name}</span>);\n }\n parts.push(<span key=\"age\" title={view.ageStamp}>{view.age}</span>);\n return (\n <span className={styles.needsMeta}>\n {parts.map((part, i) => (\n <Fragment key={part.key}>\n {i > 0 ? <span aria-hidden=\"true\">·</span> : null}\n {part}\n </Fragment>\n ))}\n </span>\n );\n}\n\nexport function NeedsYouRow({ item, actions, now, seatNames }: { item: NeedsYouItem; actions: SurfaceActions; now: number; seatNames?: SeatNames }) {\n const link = targetLink(item);\n const runnable = item.actions.filter((a) => a.request !== null);\n const view = needsYouRowView(item, now);\n const kind = cardKindLabel(view.kindLabel);\n return (\n <li className={styles.needsRow} data-severity={item.severity} id={anchorId(item.id)}>\n <span className={styles.sevDot} data-severity={item.severity} aria-hidden=\"true\" />\n <div className={styles.needsText}>\n {kind ? <span className={styles.needsKind}>{kind}</span> : null}\n {/* Two lines at most, ending on a whole word; the server's title is the tooltip. */}\n <span className={styles.needsTitle} title={view.fullTitle}>\n <span className=\"visually-hidden\">{SEVERITY_WORD[item.severity]}: </span>\n {view.title}\n </span>\n {view.run ? <NeedsYouRunFacts run={view.run} /> : null}\n {view.detail ? <span className={styles.needsDetail}>{view.detail}</span> : null}\n <Meta item={item} view={view} seatNames={seatNames} />\n </div>\n <div className={styles.needsActions}>\n {runnable.map((action) => (\n <Button\n key={action.kind}\n size=\"sm\"\n variant={action.destructive ? 'danger' : action.kind === 'approve' ? 'primary' : 'subtle'}\n disabled={actions.busy || actions.readOnly}\n onClick={() =>\n actions.act(() => postNeedsYouAction(action.request!.path, action.request!.body), `${action.label}: ${view.title}`, {\n confirm: confirmFor(item, action),\n })\n }\n >\n {action.label}\n </Button>\n ))}\n {link ? (\n link.href ? (\n <a className={styles.linkButton} href={link.href} target=\"_blank\" rel=\"noopener noreferrer\">\n {link.label}\n <IconExternalLink width={12} height={12} aria-hidden=\"true\" />\n <span className=\"visually-hidden\"> (opens in a new tab)</span>\n </a>\n ) : (\n <button type=\"button\" className={styles.linkButton} onClick={link.onOpen}>\n {link.label}\n </button>\n )\n ) : null}\n </div>\n </li>\n );\n}\n\n/** C1's activity store in the surfaces' OptionalRead words. */\nexport function activityRead(state: ActivityState): { activity: VerseActivityResponse | null; loading: boolean; reason: string | null; stale: boolean } {\n if (state.status === 'unavailable') {\n // `unavailable` is also where a FIRST poll that failed lands: only a\n // failure-free one (the route's 404) means \"not in this build\".\n const reason = state.error\n ? `Needs-you inbox unavailable. ${state.error}`\n : 'The Needs-you inbox is not in this build yet, so this card has no source.';\n return { activity: null, loading: false, reason, stale: false };\n }\n if (!state.data) return { activity: null, loading: true, reason: null, stale: false };\n return { activity: state.data, loading: false, reason: null, stale: state.status === 'stale' };\n}\n\nexport function NeedsYouCard({\n state,\n actions,\n fleetLine,\n seatNames,\n}: {\n state: ActivityState;\n actions: SurfaceActions;\n /** One line under \"All clear\"; null when the surface already says it (Command's \"Autonomy is off\" banner). */\n fleetLine: string | null;\n /** Labels for the seats items name; an id neither source knows is shown as sent. */\n seatNames?: SeatNames;\n}) {\n const { activity, loading, reason, stale } = activityRead(state);\n const now = useNow(AGE_TICK_MS);\n const items = activity ? rankNeedsYou(activity.needsYou) : [];\n const silent = silentSources(activity);\n const shown = items.slice(0, NEEDS_YOU_CARD_LIMIT);\n const count = activity ? activity.needsYou.length : null;\n return (\n <Card\n title={count === null ? 'Needs you' : `Needs you (${count})`}\n caption={count === null ? undefined : count === 0 ? undefined : 'Most urgent first'}\n tone={count ? 'attention' : undefined}\n actions={\n <button type=\"button\" className={styles.linkButton} onClick={() => openNeedsYou()} aria-keyshortcuts=\"Meta+J\">\n Open all <kbd className={styles.kbd}>⌘J</kbd>\n </button>\n }\n >\n {loading ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the inbox…</p>\n ) : !activity ? (\n <CardNote tone=\"unknown\">{reason ?? \"The inbox didn't answer.\"} This is not an all-clear.</CardNote>\n ) : shown.length === 0 ? (\n silent.length || stale ? (\n <CardNote tone=\"unknown\">\n {silent.length\n ? `Nothing to show, but ${silent.map((s) => SOURCE_WORD[s] ?? s).join(', ')} ${silent.length === 1 ? 'is' : 'are'} not answering — this is not an all-clear.`\n : 'Nothing to show, but the last refresh failed — this is not an all-clear.'}\n </CardNote>\n ) : (\n <div className={styles.allClear} role=\"status\">\n <span className={styles.allClearTitle}>All clear</span>\n {fleetLine ? <span className={styles.allClearBody}>{fleetLine}</span> : null}\n </div>\n )\n ) : (\n <>\n <ul className={styles.needsList}>\n {shown.map((item) => (\n <NeedsYouRow key={item.id} item={item} actions={actions} now={now} seatNames={seatNames} />\n ))}\n </ul>\n {items.length > shown.length ? (\n <button type=\"button\" className={styles.moreLink} onClick={() => openNeedsYou()}>\n {items.length - shown.length} more in the drawer\n </button>\n ) : null}\n {silent.length ? (\n <p className={styles.muted}>{silent.map((s) => SOURCE_WORD[s] ?? s).join(', ')} not answering — the list may be incomplete.</p>\n ) : null}\n {stale ? <p className={styles.muted}>The last refresh failed; showing the previous list.</p> : null}\n </>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/command/seat-strip-model.ts — the one compact row of seats on\n * Command (audit 14 + 20). Pure: no React, no I/O.\n *\n * WHY THIS IS NOT BUILT FROM THE BURN-DOWNS. Command used to draw one tall\n * burn-down per seat from the budget route alone, and its free-seat card said\n * \"Takes autonomous work\" whatever the local runtime's readiness was — while\n * the rail said \"readiness not reported\" about the same seat. Every account\n * fact here now comes from the SAME projection the rail, the Resources drawer\n * and Apps & Accounts read (usage/capacity-strip-model.ts: `buildCapacityRows`,\n * `accountStatus`, `bindingLeftPercent`, `orderAccountRows`), so Command can\n * no longer describe a seat differently from the rail beside it.\n *\n * The one thing the budget route adds is autonomy eligibility (the router's\n * own verdict). When it says a seat takes autonomous work but readiness says\n * the seat cannot run (signed out, spent, offline, never reported), the two\n * sources disagree — and the strip says \"Status unknown\" and names both\n * claims, rather than picking the rosier one.\n *\n * The full burn-down charts live on Usage (SeatBurnPanel).\n */\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport { describeResetAt } from '../../../../core/verse/seat-readiness.js';\nimport { STATUS_WORDS, type BudgetSeatRow as BudgetRow, type BudgetSeatStatus } from '../budget/budget-model.js';\nimport { usedPercentText } from '../percent-text.js';\nimport { bindingLeftPercent } from '../usage/binding-left.js';\nimport {\n accountStatus,\n capacityHeadline,\n orderAccountRows,\n readBudgetRows,\n type AccountStatus,\n type CapacityRow,\n} from '../usage/capacity-strip-model.js';\nimport { resetWords } from './command-model.js';\n\n/** How the item's meter and value are toned. A word always rides with it. */\nexport type SeatLevel = 'ok' | 'low' | 'out' | 'unknown';\n\n/**\n * eligible / held / off / no-reading the budget route's own verdict\n * conflict the budget says eligible, readiness says the seat cannot run\n * none the budget route has not answered\n */\nexport type SeatAutonomyKind = 'eligible' | 'held' | 'off' | 'no-reading' | 'conflict' | 'none';\n\nexport interface SeatAutonomy {\n kind: SeatAutonomyKind;\n /** Short chip text: \"Eligible\", \"Held back\", \"Off\", \"No reading\", \"Status unknown\", \"Not reported\". */\n word: string;\n /** The router's reason, or — for a conflict — both sources' claims. Null when there is nothing to add. */\n why: string | null;\n}\n\nexport interface SeatStripItem {\n key: string;\n engine: 'claude' | 'codex' | 'grok' | 'local';\n name: string;\n /** 0–100 left in the binding window; null when there is no reading (never a substituted zero). */\n leftPercent: number | null;\n level: SeatLevel;\n /** The value beside the name: \"72% left\", \"Spent\", \"Signed out\", \"Free\", \"—\". */\n value: string;\n /** \"resets Fri 11:46 PM\", the provider's own words, or the status phrase when no reset applies. */\n note: string | null;\n /** The rail's status label for the same seat (\"Connected\", \"Checking…\", \"Ready\", \"Not checked\"). */\n status: string;\n autonomy: SeatAutonomy;\n /**\n * The share of the binding window kept for the operator (0–100), drawn as a\n * tick on the meter: autonomy stops where the remaining share meets it.\n * Null when there is no reserve or autonomy is off for the seat.\n */\n reservePercent: number | null;\n /** \"Reserved for you 40%\" / \"Autonomy off — all yours\"; null when the budget has no policy row. */\n reserveLabel: string | null;\n /** The item's accessible name (the button also says it opens Resources). */\n spoken: string;\n}\n\nexport interface SeatStrip {\n items: SeatStripItem[];\n /** \"2 of 3 accounts usable · local models ready\" — the strip's caption. */\n headline: string;\n}\n\nconst LEVEL_OF_STATUS: Readonly<Record<AccountStatus['kind'], SeatLevel>> = {\n usable: 'ok',\n low: 'low',\n spent: 'out',\n 'signed-out': 'out',\n unavailable: 'out',\n checking: 'unknown',\n 'not-checked': 'unknown',\n};\n\n/** Readiness kinds that do not contradict \"autonomy may use it now\". */\nconst RUNNABLE: ReadonlySet<AccountStatus['kind']> = new Set(['usable', 'low', 'checking']);\n\n\nfunction sentence(text: string): string {\n const t = text.trim();\n return /[.!?]$/.test(t) ? t : `${t}.`;\n}\n\n/** Eligibility for one row: its own budget row, or — for the folded local row — every free seat's. */\nfunction budgetFor(row: CapacityRow, budget: ReadonlyMap<string, BudgetRow>): { status: BudgetSeatStatus; why: string } | null {\n const own = budget.get(row.seatId);\n if (own) return { status: own.status, why: own.why };\n if (row.kind !== 'local') return null;\n const locals = [...budget.values()].filter((b) => b.free || b.engine === 'local');\n if (locals.length === 0) return null;\n // One runtime behind every local tag: any tag autonomy may use means the runtime is wanted.\n const pick = (s: BudgetSeatStatus) => locals.find((b) => b.status === s);\n const chosen = pick('eligible') ?? pick('held') ?? pick('unknown') ?? locals[0]!;\n return { status: chosen.status, why: chosen.why };\n}\n\nconst AUTONOMY_KIND: Readonly<Record<BudgetSeatStatus, SeatAutonomyKind>> = {\n eligible: 'eligible',\n held: 'held',\n off: 'off',\n unknown: 'no-reading',\n};\n\n/**\n * The autonomy chip. Exported for tests: the conflict rule is the point of\n * this module (audit 20).\n */\nexport function seatAutonomy(budget: { status: BudgetSeatStatus; why: string } | null, status: AccountStatus, budgetRead: boolean): SeatAutonomy {\n if (!budget) return { kind: 'none', word: 'Not reported', why: budgetRead ? 'The budget route does not list this seat.' : null };\n if (budget.status === 'eligible' && !RUNNABLE.has(status.kind)) {\n const readiness = `${status.label}${status.detail ? ` — ${status.detail}` : ''}`;\n return {\n kind: 'conflict',\n word: 'Status unknown',\n why: `The router lists it as eligible for autonomy, but its readiness check says: ${readiness}.`,\n };\n }\n return { kind: AUTONOMY_KIND[budget.status], word: STATUS_WORDS[budget.status], why: budget.why ? sentence(budget.why) : null };\n}\n\n/** The reset phrase for a row: the binding window's own wording, always led by \"resets\". */\nfunction resetOf(row: CapacityRow, status: AccountStatus): string | null {\n // A spent seat's status already names the reset that brings it back (the LAST spent window's).\n if (status.kind === 'spent') return status.detail;\n const binding = row.windows.find((w) => w.binding) ?? null;\n return binding?.resetText ? resetWords(binding.resetText) : null;\n}\n\nfunction itemFor(row: CapacityRow, budget: ReadonlyMap<string, BudgetRow>, opts: { healthRead: boolean; budgetRead: boolean; now: number }): SeatStripItem {\n const status = accountStatus(row, { healthRead: opts.healthRead, now: opts.now });\n const autonomy = seatAutonomy(budgetFor(row, budget), status, opts.budgetRead);\n const level = LEVEL_OF_STATUS[status.kind] ?? 'unknown';\n const statusPhrase = `${status.label}${status.detail ? ` · ${status.detail}` : ''}`;\n let left: number | null;\n let value: string;\n let note: string | null;\n if (row.kind === 'local') {\n // No quota to run out of: the value is what the runtime is, never a percent.\n left = null;\n value = status.kind === 'usable' ? 'Free' : status.kind === 'unavailable' ? 'Offline' : '—';\n note = status.kind === 'usable' ? 'Runs on this machine' : status.kind === 'checking' ? 'Checking…' : status.detail ?? status.label;\n } else {\n left = level === 'out' ? 0 : bindingLeftPercent(row);\n value = level === 'out' ? status.label : left === null ? '—' : `${usedPercentText(left)} left`;\n note = resetOf(row, status) ?? (left === null ? statusPhrase : null);\n }\n const name = row.kind === 'local' && row.localCount > 1 ? `Local models (${row.localCount})` : row.label;\n const spoken = [\n `${name}: ${value}`,\n note && note !== statusPhrase ? note : null,\n statusPhrase,\n `Autonomy: ${autonomy.word}`,\n ].filter((p): p is string => p !== null).join('. ');\n const kept = row.reserve?.percent ?? null;\n const reservePercent = kept !== null && kept > 0 ? kept : null;\n return {\n key: row.seatId,\n engine: row.engine,\n name,\n leftPercent: left,\n level,\n value,\n note,\n status: status.label,\n autonomy,\n reservePercent,\n reserveLabel: row.reserve?.label ?? null,\n spoken,\n };\n}\n\n/**\n * Before the seat roster has loaded (or on a server without one), the budget\n * route alone: name, the binding window's remaining share and its reset — and\n * readiness said to be unknown, never assumed.\n */\nfunction budgetOnlyItems(view: BudgetView, now: number): SeatStripItem[] {\n const rows = readBudgetRows(view);\n const out: SeatStripItem[] = [];\n for (const b of rows.values()) {\n const h = b.headroom;\n const used = h?.bindingWindow === 'weekly' ? h.weeklyUsedPercent : h?.bindingWindow === 'session' ? h.sessionUsedPercent : null;\n const left = b.free || used === null || used === undefined ? null : Math.max(0, Math.min(100, 100 - used));\n const when = describeResetAt(h?.resetAt ?? null, now);\n const autonomy: SeatAutonomy = { kind: AUTONOMY_KIND[b.status], word: STATUS_WORDS[b.status], why: b.why ? sentence(b.why) : null };\n const value = b.free ? '—' : left === null ? '—' : `${usedPercentText(left)} left`;\n const note = b.free ? 'Readiness not reported' : when ? `resets ${when}` : null;\n out.push({\n key: b.seatId,\n engine: b.engine,\n name: b.label,\n leftPercent: left,\n level: left === null ? 'unknown' : left <= 0 ? 'out' : 'ok',\n value,\n note,\n status: 'Readiness not reported',\n autonomy,\n reservePercent: null,\n reserveLabel: null,\n spoken: [`${b.label}: ${value}`, note, 'Readiness not reported', `Autonomy: ${autonomy.word}`].filter(Boolean).join('. '),\n });\n }\n return out.sort((a, b) => Number(a.engine === 'local') - Number(b.engine === 'local') || a.name.localeCompare(b.name));\n}\n\nexport interface SeatStripInputs {\n /** Capacity rows (`buildCapacityRows`) — the rail's own projection of the roster. */\n rows: readonly CapacityRow[];\n /** The budget view, for autonomy eligibility; null before it answers. */\n budget: BudgetView | null;\n /** False until the health sweep has answered once. */\n healthRead: boolean;\n now: number;\n}\n\nexport function seatStrip({ rows, budget, healthRead, now }: SeatStripInputs): SeatStrip {\n if (rows.length === 0) {\n const items = budget ? budgetOnlyItems(budget, now) : [];\n return { items, headline: items.length === 0 ? 'No seats reported yet' : 'Seat roster not loaded — readiness unknown' };\n }\n const budgetRows = readBudgetRows(budget);\n const ordered = orderAccountRows(rows, { healthRead, now });\n return {\n items: ordered.map((row) => itemFor(row, budgetRows, { healthRead, budgetRead: budget !== null, now })),\n headline: capacityHeadline(rows),\n };\n}\n\n/**\n * How many equal columns the strip uses, so every row is full or nearly so\n * (audit 15: no blank half-rows): all seats on one line when they fit, else\n * balanced rows — four seats are 4 across when wide and 2 x 2 at medium,\n * never 3 + a lonely 1. Compact is one per line.\n */\nexport function stripColumns(viewport: 'compact' | 'medium' | 'wide', count: number): number {\n const n = Math.max(1, Math.floor(count));\n if (viewport === 'compact') return 1;\n const perRow = viewport === 'medium' ? 3 : 5;\n if (n <= perRow) return viewport === 'medium' && n === 4 ? 2 : n;\n const rows = Math.ceil(n / perRow);\n return Math.ceil(n / rows);\n}\n","/**\n * routes/verse/command/SeatStrip.tsx — every seat's headroom in ONE compact\n * row on Command (audit 14): provider mark + name, what is left of the\n * binding window, the reset, and whether autonomy may use it. One glance\n * answers \"will it run out?\"; clicking a seat (or the head's Resources link,\n * or ⌘.) opens the Resources drawer for the detail. The burn-down charts that\n * used to fill this row live on Usage now (SeatBurnPanel).\n *\n * Its words come from seat-strip-model.ts — the same capacity projection the\n * rail's resource bar reads — so Command and the rail cannot describe one\n * seat two ways (audit 20).\n *\n * READS NOTHING NEW. The roster and the health sweep are read from the cache\n * the rail keeps warm on every surface (useCapacityData in ResourcesBar and\n * the capacity ring), never fetched from here: Command's own reads are pinned\n * by shell/surface-prefetch.test.ts, and a bootstrap read costs the server\n * ~384 ms (useSeatsRefresh.ts). The budget view is Command's own poll.\n */\nimport { useCallback, useMemo, useSyncExternalStore, type CSSProperties } from 'react';\nimport type { BudgetView } from '../../../../core/routing/policy.js';\nimport type { VerseHealthResponse } from '../../../../core/verse/health-types.js';\nimport { ProviderLogo } from '../../../components/primitives/ProviderLogo.js';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { getQuerySnapshot, subscribeQuery } from '../../../data/cache.js';\nimport type { VerseSeat } from '../../../data/api-types.js';\nimport { VERSE_HEALTH_KEY } from '../health/health-queries.js';\nimport { openResources } from '../resources/resources-store.js';\nimport { buildCapacityRows } from '../usage/capacity-strip-model.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { seatStrip, stripColumns, type SeatStripItem } from './seat-strip-model.js';\nimport { Card, CardNote } from './Surface.js';\nimport command from './command.module.css';\nimport styles from './seat-strip.module.css';\n\n/** The health sweep as the rail last read it; null until it has answered once. */\nfunction useCachedHealth(): VerseHealthResponse | null {\n const snapshot = useSyncExternalStore(\n useCallback((listener: () => void) => subscribeQuery(VERSE_HEALTH_KEY, listener), []),\n () => getQuerySnapshot<VerseHealthResponse>(VERSE_HEALTH_KEY),\n () => getQuerySnapshot<VerseHealthResponse>(VERSE_HEALTH_KEY),\n );\n return snapshot.data ?? null;\n}\n\nfunction SeatTip({ item }: { item: SeatStripItem }) {\n return (\n <div className={styles.tip}>\n <div className={styles.tipHead}>\n <ProviderLogo engine={item.engine} size={14} />\n <strong>{item.name}</strong>\n </div>\n <div>{item.status}{item.note && item.note !== item.status ? ` · ${item.note}` : ''}</div>\n {item.reserveLabel ? <div className={styles.tipLine}>{item.reserveLabel}</div> : null}\n <div className={styles.tipLine}>\n Autonomy: {item.autonomy.word}{item.autonomy.why ? ` — ${item.autonomy.why}` : ''}\n </div>\n <div className={styles.tipHint}>Click for Resources · ⌘.</div>\n </div>\n );\n}\n\nfunction SeatItem({ item }: { item: SeatStripItem }) {\n // Local seats have no quota: a full, quiet track when ready, an empty one otherwise.\n const fill = item.leftPercent ?? (item.engine === 'local' && item.value === 'Free' ? 100 : 0);\n const meterStyle = { '--fill': `${fill}%`, ...(item.reservePercent !== null ? { '--reserve': `${item.reservePercent}%` } : {}) } as CSSProperties;\n return (\n <Tooltip content={<SeatTip item={item} />} placement=\"bottom\">\n <button\n type=\"button\"\n className={styles.item}\n data-level={item.level}\n data-free={item.engine === 'local' || undefined}\n aria-label={`${item.spoken}. Open Resources`}\n aria-keyshortcuts=\"Meta+.\"\n onClick={() => openResources()}\n >\n <span className={styles.head}>\n <ProviderLogo engine={item.engine} size={14} className={styles.logo} />\n <span className={styles.name}>{item.name}</span>\n <span className={styles.value}>{item.value}</span>\n </span>\n <span className={styles.meter} style={meterStyle} aria-hidden=\"true\">\n <span className={styles.fill} />\n {item.reservePercent !== null ? <span className={styles.reserve} /> : null}\n </span>\n <span className={styles.foot}>\n <span className={styles.note}>{item.note ?? item.status}</span>\n <span className={styles.autonomy} data-kind={item.autonomy.kind}>\n <span className={styles.dot} aria-hidden=\"true\" />\n {item.autonomy.word}\n </span>\n </span>\n </button>\n </Tooltip>\n );\n}\n\nexport function SeatStrip({ budget, seats, now }: { budget: BudgetView | null; seats: readonly VerseSeat[] | null; now: number }) {\n const health = useCachedHealth();\n const { viewport } = useViewport();\n const strip = useMemo(() => {\n let rows: ReturnType<typeof buildCapacityRows> = [];\n try {\n rows = seats && seats.length > 0 ? buildCapacityRows(seats, { health: health?.seats ?? null, budget, now }) : [];\n } catch {\n // A roster entry this client cannot read (a drifted or half-written\n // seat) must not take Command down with it: the strip falls back to the\n // budget route's seat list and says readiness is unknown.\n rows = [];\n }\n return seatStrip({ rows, budget, healthRead: health !== null, now });\n }, [seats, health, budget, now]);\n\n return (\n <Card\n title=\"Seats\"\n caption={strip.headline}\n actions={\n <button type=\"button\" className={command.linkButton} onClick={() => openResources()} aria-keyshortcuts=\"Meta+.\">\n Resources <kbd className={command.kbd}>⌘.</kbd>\n </button>\n }\n >\n {strip.items.length === 0 ? (\n <CardNote tone=\"unknown\">Seat capacity unavailable.</CardNote>\n ) : (\n <div\n className={styles.list}\n role=\"group\"\n aria-label=\"Capacity per seat\"\n style={{ '--seat-columns': stripColumns(viewport, strip.items.length) } as CSSProperties}\n >\n {strip.items.map((item) => (\n <SeatItem key={item.key} item={item} />\n ))}\n </div>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/cloud/CloudLaunchDialog.tsx — \"New cloud task\" (3.11 unit C3):\n * repo (default ashlrai/ashlr-hub), base branch, the task, Launch.\n *\n * Validation runs on Launch, field by field, in the words the service would\n * use (cloud-model validateLaunch) — the server re-checks everything. The\n * request goes through the surface's guarded action (token first when none\n * is held); a refusal (budget, seat, a CLI that printed no session) stays IN\n * the dialog in the server's own sentence, with the draft intact, so the\n * operator can fix the one thing and press Launch again.\n */\nimport { useEffect, useId, useRef, useState, type FormEvent } from 'react';\nimport { CLOUD_PROMPT_MAX_CHARS, type CloudTaskV1 } from '../../../../core/cloud/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Input } from '../../../components/primitives/Input.js';\nimport { DispatchDisabledError } from '../../../data/client.js';\nimport { describeControlError } from '../autonomy/use-guarded-action.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { launchCloudTask } from './cloud-queries.js';\nimport { CLOUD_DEFAULT_REPO, formatDollars, validateLaunch, type LaunchDraft, type LaunchErrors } from './cloud-model.js';\nimport styles from './cloud.module.css';\n\nexport interface CloudLaunchDialogProps {\n open: boolean;\n onClose: () => void;\n actions: Pick<SurfaceActions, 'act' | 'busy'>;\n /** The flat per-session estimate, for the \"Estimated at $3\" line. */\n estimatePerSessionUsd: number | null;\n onLaunched: (task: CloudTaskV1) => void;\n defaultRepo?: string;\n}\n\nconst COUNT = new Intl.NumberFormat('en-US');\n\nexport function CloudLaunchDialog({ open, onClose, actions, estimatePerSessionUsd, onLaunched, defaultRepo = CLOUD_DEFAULT_REPO }: CloudLaunchDialogProps) {\n const titleId = useId();\n const promptId = useId();\n const promptErrorId = useId();\n const taskRef = useRef<HTMLTextAreaElement>(null);\n const [draft, setDraft] = useState<LaunchDraft>({ repo: defaultRepo, baseBranch: '', prompt: '' });\n const [errors, setErrors] = useState<LaunchErrors>({});\n const [refusal, setRefusal] = useState<string | null>(null);\n\n // Each opening starts clean except for the repo, which is usually the same.\n useEffect(() => {\n if (!open) return;\n setErrors({});\n setRefusal(null);\n }, [open]);\n\n const edit = (patch: Partial<LaunchDraft>) => {\n setRefusal(null);\n setDraft((prev) => ({ ...prev, ...patch }));\n setErrors((prev) => {\n const next = { ...prev };\n for (const key of Object.keys(patch) as Array<keyof LaunchDraft>) delete next[key];\n return next;\n });\n };\n\n const submit = (event: FormEvent) => {\n event.preventDefault();\n const result = validateLaunch(draft);\n if (!result.ok) {\n setErrors(result.errors);\n return;\n }\n setErrors({});\n setRefusal(null);\n actions.act(async () => {\n try {\n const response = await launchCloudTask({ ...result.request, origin: 'operator' });\n setDraft((prev) => ({ ...prev, prompt: '' }));\n onLaunched(response.task);\n onClose();\n } catch (err) {\n // A read-only server is the surface's state (its ActionStatus line);\n // every other refusal belongs next to the Launch button.\n if (err instanceof DispatchDisabledError) throw err;\n setRefusal(describeControlError(err));\n }\n }, 'Launch a Claude Code cloud session with this task.');\n };\n\n const length = draft.prompt.trim().length;\n return (\n <Dialog\n open={open}\n onClose={onClose}\n titleId={titleId}\n title=\"New cloud task\"\n description=\"Runs as a Claude Code cloud session on your Claude account. It delivers a draft PR; nothing merges on its own.\"\n widthClassName={styles.dialogWidth}\n initialFocusRef={taskRef}\n >\n <form className={styles.form} onSubmit={submit} noValidate>\n <div className={styles.fieldGrid}>\n <Input\n label=\"Repository\"\n hint=\"GitHub owner/name\"\n mono\n value={draft.repo}\n error={errors.repo}\n autoComplete=\"off\"\n spellCheck={false}\n onChange={(e) => edit({ repo: e.target.value })}\n />\n <Input\n label=\"Base branch\"\n hint=\"Must be pushed. Empty uses the default branch.\"\n mono\n value={draft.baseBranch}\n placeholder=\"default branch\"\n error={errors.baseBranch}\n autoComplete=\"off\"\n spellCheck={false}\n onChange={(e) => edit({ baseBranch: e.target.value })}\n />\n </div>\n <div className={styles.textareaField}>\n <label className={styles.label} htmlFor={promptId}>Task</label>\n <textarea\n ref={taskRef}\n id={promptId}\n className={styles.textarea}\n value={draft.prompt}\n placeholder=\"What should the cloud session do? It reads the repo's own guidance and opens a draft PR.\"\n aria-invalid={errors.prompt ? true : undefined}\n aria-describedby={errors.prompt ? promptErrorId : undefined}\n onChange={(e) => edit({ prompt: e.target.value })}\n />\n {errors.prompt ? <p id={promptErrorId} className={styles.fieldError} role=\"alert\">{errors.prompt}</p> : null}\n <p className={styles.muted}>\n {COUNT.format(length)} of {COUNT.format(CLOUD_PROMPT_MAX_CHARS)} characters\n {estimatePerSessionUsd !== null ? ` · estimated at ${formatDollars(estimatePerSessionUsd)} per session` : ''}\n </p>\n </div>\n {refusal ? <p className={styles.notice} data-tone=\"danger\" role=\"alert\">{refusal}</p> : null}\n <div className={styles.formActions}>\n <Button variant=\"ghost\" onClick={onClose} disabled={actions.busy}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"primary\" busy={actions.busy}>\n Launch\n </Button>\n </div>\n </form>\n </Dialog>\n );\n}\n","/**\n * routes/verse/cloud/CloudCard.tsx — the cloud lane on Command (3.11 unit C3;\n * mounted by sections/CommandSection.tsx beside the burn-downs).\n *\n * Cloud [New cloud task] [Improve Verse] [Edit budget] [↻]\n * Credits remaining $212 of $250 · estimate\n * ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇░░░░░\n * Estimated at $3 per session — Claude doesn't expose the credit balance… Check usage on claude.ai ↗\n * 3 of 20 sessions today · 1 running · resets Sat 12:00 AM\n * (●) Self-improvement 2 of 4 today, on ashlrai/ashlr-hub …\n * ● Running Fix the flaky tracker test\n * ashlrai/ashlr-hub from master · started 5m ago\n * Open in Claude ↗\n *\n * The balance is NOT readable anywhere (types.ts header), so every dollar is\n * an estimate and the card says so beside the number, with the link to the\n * real one. It reads GET /api/verse/cloud itself and polls it every 30 s\n * while Command is visible; every write goes through Command's guarded\n * actions (confirm → token → request) and the overview is re-read after.\n *\n * States: loading, not in this build (404 — renders nothing), empty, running, pr-open, failed,\n * and budget-refused (the launch gate closed — its plain sentence is shown,\n * and New cloud task / Improve Verse are disabled with that sentence as\n * their tooltip).\n */\nimport { lazy, Suspense, useId, useRef, useState } from 'react';\nimport { CLOUD_BALANCE_URL, type CloudBudgetUpdate, type CloudOverviewResponse, type CloudTaskV1 } from '../../../../core/cloud/types.js';\nimport { Button, IconButton } from '../../../components/primitives/Button.js';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport { IconExternalLink, IconPlus, IconRefresh } from '../../../components/primitives/icons.js';\nimport { Meter } from '../../../components/primitives/Meter.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { tidyProse } from '../autonomy/format.js';\nimport type { SurfaceActions } from '../command/actions.js';\nimport { Card, CardNote } from '../command/Surface.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { CloudBudgetForm } from './CloudBudgetForm.js';\nimport { CloudLaunchDialog } from './CloudLaunchDialog.js';\nimport {\n approxCredits,\n canDismiss,\n cardTasks,\n CLOUD_NOT_SET_UP_WORD,\n creditsMeter,\n formatDollars,\n gateText,\n launchBlock,\n notSetUpLine,\n safeHref,\n selfImproveLine,\n sessionsLine,\n seatText,\n stateWord,\n STATE_TONE,\n taskDetail,\n taskMeta,\n} from './cloud-model.js';\nimport { CLOUD_NOT_IN_BUILD, CLOUD_POLL_MS, cloudQuery, dismissCloudTask, refreshCloudTasks, runCloudImprove, updateCloudBudget } from './cloud-queries.js';\nimport styles from './cloud.module.css';\n\n/** 3.13: the evidence sheet is its own chunk, fetched the first time a row's Evidence is opened. */\nconst EvidenceTimeline = lazy(() => import('./EvidenceTimeline.js'));\n\ninterface CardNotice {\n tone: 'success' | 'warning' | 'danger';\n text: string;\n href?: string | null;\n linkText?: string;\n}\n\n/** An outbound link, always in a new tab and never carrying this page as referrer. */\nfunction OutLink({ href, children, label }: { href: string; children: string; label?: string }) {\n return (\n <a className={styles.link} href={href} target=\"_blank\" rel=\"noreferrer noopener\" aria-label={label}>\n {children} <IconExternalLink width={12} height={12} aria-hidden=\"true\" />\n </a>\n );\n}\n\nexport function CloudTaskRow({ task, actions, now }: { task: CloudTaskV1; actions: SurfaceActions; now: number }) {\n const session = safeHref(task.sessionUrl, 'claude.ai');\n const pr = task.pr ? safeHref(task.pr.url, 'github.com') : null;\n const detail = taskDetail(task, now);\n const [evidenceOpen, setEvidenceOpen] = useState(false);\n return (\n <li className={styles.task} data-state={task.state}>\n <span className={styles.taskChip}>\n <StatusBadge status={task.state} tone={STATE_TONE[task.state]}>{stateWord(task)}</StatusBadge>\n </span>\n <span className={styles.taskMain}>\n <p className={styles.taskTitle}>{task.title}</p>\n <span className={styles.muted}>{taskMeta(task, now)}</span>\n {detail ? <span className={styles.facts}>{detail}</span> : null}\n <span className={styles.taskLinks}>\n {session ? <OutLink href={session} label={`Open “${task.title}” in Claude`}>Open in Claude</OutLink> : null}\n {pr && task.pr ? <OutLink href={pr} label={`Pull request #${task.pr.number} on GitHub`}>{`PR #${task.pr.number}`}</OutLink> : null}\n <button type=\"button\" className={styles.linkButton} aria-haspopup=\"dialog\" aria-label={`Evidence for “${task.title}”`} onClick={() => setEvidenceOpen(true)}>\n Evidence\n </button>\n {canDismiss(task) ? (\n <button\n type=\"button\"\n className={styles.linkButton}\n disabled={actions.busy || actions.readOnly}\n aria-label={`Dismiss “${task.title}”`}\n onClick={() =>\n actions.act(() => dismissCloudTask(task.id), `Dismiss the cloud task “${task.title}”.`, {\n confirm: {\n title: 'Dismiss this cloud task?',\n body: `Verse stops tracking “${task.title}”. Nothing on GitHub or claude.ai changes — the session and any PR stay where they are.`,\n confirmLabel: 'Dismiss',\n },\n })\n }\n >\n Dismiss\n </button>\n ) : null}\n </span>\n </span>\n {evidenceOpen ? (\n <Suspense fallback={null}>\n <EvidenceTimeline taskId={task.id} title={task.title} open onClose={() => setEvidenceOpen(false)} now={now} />\n </Suspense>\n ) : null}\n </li>\n );\n}\n\n/** \"Edit budget\": the shared budget form in a popover anchored under its button. */\nfunction BudgetPopover({ overview, actions, onClose }: { overview: CloudOverviewResponse; actions: SurfaceActions; onClose: () => void }) {\n const panel = useRef<HTMLDivElement>(null);\n const titleId = useId();\n useFocusTrap({ open: true, containerRef: panel, onClose });\n const save = (update: CloudBudgetUpdate) =>\n actions.act(() => updateCloudBudget(update), 'Change the cloud budget.', { onDone: onClose });\n return (\n <div ref={panel} className={styles.popover} role=\"dialog\" aria-modal=\"false\" aria-labelledby={titleId} tabIndex={-1}>\n <h4 id={titleId} className={styles.popoverTitle}>Cloud budget</h4>\n <CloudBudgetForm\n idPrefix=\"cloud-card-budget\"\n budget={overview.budget.budget}\n busy={actions.busy}\n disabled={actions.readOnly}\n onSave={save}\n onCancel={onClose}\n />\n </div>\n );\n}\n\nfunction CloudBody({ overview, actions, now, onNotice }: { overview: CloudOverviewResponse; actions: SurfaceActions; now: number; onNotice: (n: CardNotice) => void }) {\n const view = overview.budget;\n const meter = creditsMeter(view);\n const seat = seatText(overview.seat);\n const refused = gateText(view.canLaunch, 'The cloud budget does not allow another launch right now.');\n const { shown, hidden } = cardTasks(overview.tasks, now);\n const si = view.budget.selfImprove;\n const estimateNote = (\n <p className={styles.estimateNote}>\n {tidyProse(view.estimateNote, now)}{' '}\n <OutLink href={CLOUD_BALANCE_URL} label=\"Check the real balance on claude.ai\">Check usage on claude.ai</OutLink>\n </p>\n );\n return (\n <div className={styles.body}>\n {seat ? (\n // No seat, no launches: the setup blocker is the state and the credit\n // figure is a plain estimate, never a meter reading as headroom.\n <div className={styles.meterBlock} data-standing=\"not-set-up\">\n <p className={styles.standing} title={notSetUpLine(view.estimatedRemainingUsd)}>\n <StatusBadge status=\"not-set-up\" tone=\"warning\">{CLOUD_NOT_SET_UP_WORD}</StatusBadge>\n <span className={styles.muted}>{approxCredits(view.estimatedRemainingUsd)} · estimate</span>\n </p>\n <p className={styles.notice} data-tone=\"warning\" role=\"note\">{seat}</p>\n {estimateNote}\n </div>\n ) : (\n <div className={styles.meterBlock}>\n <Meter\n value={meter.value}\n max={meter.max}\n label=\"Credits remaining\"\n valueText={meter.text}\n tone={meter.tone}\n aria-label={`Estimated credits remaining: ${meter.text}, ${meter.usedText}`}\n />\n {estimateNote}\n {meter.warning ? <p className={styles.notice} data-tone=\"warning\" role=\"note\">{meter.warning}</p> : null}\n </div>\n )}\n <p className={styles.facts}>{sessionsLine(view, now)}</p>\n {refused ? (\n <p className={styles.notice} data-tone=\"warning\" role=\"note\" data-testid=\"cloud-budget-refused\">\n New launches are paused: {refused}\n </p>\n ) : null}\n <div className={styles.toggleRow}>\n <Switch\n checked={si.enabled}\n label=\"Self-improvement\"\n disabled={actions.busy || actions.readOnly}\n onChange={(enabled) =>\n actions.act(() => updateCloudBudget({ selfImprove: { enabled } }), enabled ? 'Let Verse launch its own self-improvement tasks.' : 'Stop Verse launching its own self-improvement tasks.', {\n onDone: () => onNotice({ tone: 'success', text: enabled ? `Self-improvement is on — up to ${si.maxPerDay} a day.` : 'Self-improvement is off.' }),\n })\n }\n />\n <span className={`${styles.muted} ${styles.toggleText}`}>{selfImproveLine(view)}</span>\n </div>\n {shown.length === 0 ? (\n <CardNote>No cloud tasks yet. Start one with New cloud task, or let Verse improve itself.</CardNote>\n ) : (\n <ul className={styles.tasks} aria-label=\"Cloud tasks\">\n {shown.map((t) => <CloudTaskRow key={t.id} task={t} actions={actions} now={now} />)}\n </ul>\n )}\n {hidden > 0 ? <p className={styles.muted}>{hidden} more {hidden === 1 ? 'task is' : 'tasks are'} listed by ashlr cloud list.</p> : null}\n </div>\n );\n}\n\nexport function CloudCard({ actions, now = Date.now() }: { actions: SurfaceActions; now?: number }) {\n const read = useQuery(cloudQuery, { freshMs: 15_000 });\n const refetch = useRefetch(cloudQuery);\n usePollWhileVisible(refetch, CLOUD_POLL_MS);\n const [launchOpen, setLaunchOpen] = useState(false);\n const [budgetOpen, setBudgetOpen] = useState(false);\n const [notice, setNotice] = useState<CardNotice | null>(null);\n\n const overview = read.data?.value ?? null;\n const loading = !read.data && (read.status === 'loading' || read.status === 'idle');\n const block = overview ? launchBlock(overview.seat, overview.budget) : null;\n const locked = actions.busy || actions.readOnly;\n const nextUp = overview?.backlog.nextUp ? overview.backlog.items.find((i) => i.id === overview.backlog.nextUp) ?? null : null;\n const improveBlock = !overview\n ? null\n : seatText(overview.seat) ?? gateText(overview.budget.canLaunch, 'The cloud budget does not allow another launch right now.') ?? (nextUp ? null : 'The self-improvement backlog has nothing left to launch.');\n const estimate = overview ? overview.budget.budget.estimatedCostPerSessionUsd : null;\n\n const improve = () => {\n if (!overview || !nextUp) return;\n actions.act(() => runCloudImprove({ count: 1 }), 'Launch the next self-improvement task as a cloud session.', {\n confirm: {\n title: 'Improve Verse now?',\n body: `Launches “${nextUp.title}” as a cloud session on ${nextUp.repo ?? overview.budget.budget.selfImprove.repo}${estimate !== null ? `, estimated at ${formatDollars(estimate)}` : ''}. It delivers a draft PR; nothing merges on its own.`,\n confirmLabel: 'Launch',\n },\n onDone: (result) => {\n const first = result.launched[0] ?? null;\n if (first) {\n setNotice({ tone: 'success', text: `Started “${first.title}”.`, href: safeHref(first.sessionUrl, 'claude.ai'), linkText: 'Open in Claude' });\n } else {\n const why = result.skipped[0]?.reason ?? 'Nothing was launched, and the server sent no reason.';\n setNotice({ tone: 'warning', text: tidyProse(why) });\n }\n },\n });\n };\n\n const head = overview ? (\n <span className={styles.headActions}>\n <Tooltip label={block ?? 'Start a cloud session with your own task'}>\n <Button size=\"sm\" variant=\"primary\" icon={<IconPlus width={14} height={14} />} disabled={locked || block !== null} onClick={() => setLaunchOpen(true)}>\n New cloud task\n </Button>\n </Tooltip>\n <Tooltip label={improveBlock ?? (nextUp ? `Launch the next backlog item: ${nextUp.title}` : 'Launch the next backlog item')}>\n <Button size=\"sm\" disabled={locked || improveBlock !== null} onClick={improve}>\n Improve Verse\n </Button>\n </Tooltip>\n <Tooltip label=\"Credits, per-session estimate and daily caps\">\n <Button size=\"sm\" variant=\"ghost\" aria-expanded={budgetOpen} aria-haspopup=\"dialog\" onClick={() => setBudgetOpen((o) => !o)} disabled={actions.readOnly}>\n Edit budget\n </Button>\n </Tooltip>\n <Tooltip label=\"Check GitHub for task updates now\">\n <IconButton\n size=\"sm\"\n variant=\"ghost\"\n icon={<IconRefresh width={14} height={14} />}\n aria-label=\"Check GitHub for task updates now\"\n disabled={locked}\n onClick={() => actions.act(() => refreshCloudTasks(), 'Re-read the cloud tasks from GitHub.')}\n />\n </Tooltip>\n {budgetOpen ? <BudgetPopover overview={overview} actions={actions} onClose={() => setBudgetOpen(false)} /> : null}\n </span>\n ) : null;\n\n // A server without the cloud lane (404): no card at all, not a full-width\n // row saying so. Every hook above has already run, so this early return is safe.\n if (read.data?.available === false && read.data.reason === CLOUD_NOT_IN_BUILD) return null;\n\n return (\n <Card title=\"Cloud\" caption=\"Claude Code cloud sessions on your Claude credits\" actions={head}>\n {loading ? (\n <p className={styles.muted} aria-busy=\"true\">Reading the cloud lane…</p>\n ) : !overview ? (\n <CardNote tone=\"unknown\">{read.data?.reason ?? read.error?.message ?? 'The cloud lane did not answer.'}</CardNote>\n ) : (\n <>\n {notice ? (\n <div className={styles.notice} data-tone={notice.tone} role=\"status\">\n <span className={styles.noticeRow}>\n <span>\n {notice.text}\n {notice.href ? <> <OutLink href={notice.href}>{notice.linkText ?? 'Open'}</OutLink></> : null}\n </span>\n <button type=\"button\" className={styles.linkButton} onClick={() => setNotice(null)}>Dismiss</button>\n </span>\n </div>\n ) : null}\n <CloudBody overview={overview} actions={actions} now={now} onNotice={setNotice} />\n <CloudLaunchDialog\n open={launchOpen}\n onClose={() => setLaunchOpen(false)}\n actions={actions}\n estimatePerSessionUsd={estimate}\n onLaunched={(task) =>\n setNotice({ tone: 'success', text: `Started “${task.title}”.`, href: safeHref(task.sessionUrl, 'claude.ai'), linkText: 'Open in Claude' })\n }\n />\n </>\n )}\n </Card>\n );\n}\n","/**\n * routes/verse/command/VerdictLine.tsx — the one sentence under the top bar\n * (17/24, weight 500): \"Autonomous · 5 building · 7 merged today · 0 reverts\n * · Claude 46% reserved for you\", then the \"Since you looked\" strip.\n *\n * The strip compares against the operator's previous visit to Command,\n * remembered per viewer in localStorage (a convenience: if storage is\n * blocked the strip simply stays hidden — nothing depends on it).\n */\nimport { useEffect, useRef, useState } from 'react';\nimport { useSectionVisible } from '../shell/section-visibility.js';\nimport { verdictParts, type VerdictInputs } from './authority-model.js';\nimport type { SinceItem } from './command-model.js';\nimport styles from './command.module.css';\n\nexport function VerdictLine(props: VerdictInputs) {\n const parts = verdictParts(props);\n return (\n <p className={styles.verdict} data-testid=\"verdict\">\n {parts.map((p, i) => (\n <span key={p.key} className={styles.verdictPart} data-tone={p.tone}>\n {i > 0 ? <span className={styles.verdictSep} aria-hidden=\"true\"> · </span> : null}\n {p.text}\n </span>\n ))}\n </p>\n );\n}\n\nexport const LAST_LOOKED_KEY = 'ashlr.verse.command.lastLooked.v1';\n\nfunction readStored(): string | null {\n try {\n const v = window.localStorage.getItem(LAST_LOOKED_KEY);\n return v && Number.isFinite(Date.parse(v)) ? v : null;\n } catch {\n return null;\n }\n}\n\nfunction writeStored(value: string): void {\n try {\n window.localStorage.setItem(LAST_LOOKED_KEY, value);\n } catch {\n /* private window / blocked storage: the strip just stays hidden */\n }\n}\n\n/**\n * The previous visit's time. Each time Command comes into view (mount, or\n * back from another surface in the keep-alive shell), what was stored\n * becomes \"last looked\" and now is stored for next time.\n */\nexport function useLastLooked(): string | null {\n const visible = useSectionVisible();\n const [previous, setPrevious] = useState<string | null>(null);\n const wasVisible = useRef(false);\n useEffect(() => {\n if (visible && !wasVisible.current) {\n setPrevious(readStored());\n writeStored(new Date().toISOString());\n }\n wasVisible.current = visible;\n }, [visible]);\n return previous;\n}\n\n/** A glance back sooner than this is the same visit; the strip stays hidden. */\nexport const SINCE_MIN_GAP_MS = 3_600_000;\n\n/**\n * \"Since 9:40 AM: 3 merged · 1 reverted\". Shown only when something changed\n * AND the previous look was at least an hour ago — \"Since 2:14 PM: nothing\n * new\" on every return from another surface was noise.\n */\nexport function SinceStrip({ lastLookedAt, items, now = Date.now() }: { lastLookedAt: string | null; items: SinceItem[]; now?: number }) {\n if (!lastLookedAt || items.length === 0) return null;\n const when = new Date(lastLookedAt);\n if (!Number.isFinite(when.getTime()) || now - when.getTime() < SINCE_MIN_GAP_MS) return null;\n const sameDay = when.toDateString() === new Date(now).toDateString();\n const label = sameDay\n ? when.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' })\n : when.toLocaleString('en-US', { weekday: 'short', hour: 'numeric', minute: '2-digit' });\n return (\n <div className={styles.since} role=\"group\" aria-label={`Since you looked at ${label}`}>\n <span className={styles.sinceLead}>Since {label}</span>\n {items.map((item) => (\n <span key={item.id} className={styles.sinceChip} data-tone={item.tone}>\n {item.text}\n </span>\n ))}\n </div>\n );\n}\n","/**\n * routes/verse/sections/CommandSection.tsx — ⌘1 Command, the home surface\n * (SPEC-310B §6, SPEC-310C §5; unit C7). Lazy-mounted by the shell; takes no\n * props (named export, like every section).\n *\n * It answers, top to bottom, in the order the questions arrive:\n * 1. What is autonomy allowed to do, and how do I stop it? (top bar)\n * 2. Is the company producing? (verdict line)\n * 3. What changed since I last looked? (\"Since\" strip)\n * 4. What needs me, and what is the Leader doing? (Needs you 5 | Leader 7)\n * — Needs you reads the shell's shared activity store (C1 useActivity).\n * 5. Is it working? (5 KPI tiles)\n * 6. Will it run out? (one compact seat strip)\n * — and the cloud lane's estimated credits and tasks (3.11 CloudCard)\n * The per-seat burn-down charts live on Usage (audit 14); a seat here\n * opens the Resources drawer (⌘.).\n * 7. What ran? (12 h swimlane)\n * At 375 px: Needs you, Leader, KPIs two per row, one seat per line, then\n * a 6 h swimlane — the DOM order below IS that order.\n *\n * Autonomy off (no grant, grant lapsed, Stop, switch at Off, daemon down):\n * ONE banner under the top bar (autonomy/AutonomyOffState) says what is off\n * and holds the one action — Approve grant (the bar's own Touch ID sheet), or,\n * while the live setup checklist has a step open before the grant, that\n * step's command (with the checklist under it). The grant is only drafted\n * when the sheet opens, never on load. It\n * stands in for the verdict line and the Since strip, and the KPI row and the\n * swimlane are left out while they would only draw zeros and dashes.\n *\n * Every source is optional (surface-data.ts): a Track B module that has not\n * landed is one card's designed \"not in this build\" state, never a blank\n * surface. Polling runs only while Command is the visible surface\n * (usePollWhileVisible), at ≥ 2 s per the performance budget.\n */\nimport { useCallback, useMemo, useSyncExternalStore } from 'react';\nimport { Swimlane } from '../../../components/charts/Swimlane.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { getQuerySnapshot, subscribeQuery } from '../../../data/cache.js';\nimport type { VerseBootstrap } from '../../../data/api-types.js';\nimport { VERSE_BOOTSTRAP_KEY } from '../verse-queries.js';\nimport { budgetQuery } from '../budget/budget-queries.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { ActionStatus, useSurfaceActions } from '../command/actions.js';\nimport { AutonomyBar, useGrantFlow } from '../command/AutonomyBar.js';\nimport { AutonomyOffState, useSetupChecklist } from '../autonomy/AutonomyOffState.js';\nimport { autonomyOffState } from '../autonomy/autonomy-off-model.js';\nimport { buildKpis, claudeReserve, kpisSayNothing, seatNames, sinceYouLooked } from '../command/command-model.js';\nimport { KpiRow } from '../command/KpiRow.js';\nimport { LeaderCard } from '../command/LeaderCard.js';\nimport { NeedsYouCard } from '../command/NeedsYouCard.js';\nimport { SeatStrip } from '../command/SeatStrip.js';\nimport { CloudCard } from '../cloud/CloudCard.js';\nimport { Cell, Surface } from '../command/Surface.js';\nimport { SinceStrip, VerdictLine, useLastLooked } from '../command/VerdictLine.js';\nimport { useActivity } from '../shell/useActivity.js';\nimport {\n authorityQuery,\n fleetHistoryQuery,\n fleetLiveQuery,\n leaderQuery,\n learningQuery,\n} from '../command/surface-data.js';\nimport { fleetDarkSince, fleetDarkStatus } from '../fleet/dark-since.js';\nimport { laneRows, runTone } from '../fleet/live-model.js';\nimport styles from '../command/command.module.css';\n\nconst HOUR = 3_600_000;\n\n/** Fast reads: the switch, the fleet and the inbox move while nobody clicks. */\nexport const COMMAND_FAST_POLL_MS = 10_000;\n/** Slow reads: the Leader, budgets (the collector samples every 30 s). */\nexport const COMMAND_SLOW_POLL_MS = 30_000;\n/** History and learning change daily. */\nexport const COMMAND_HISTORY_POLL_MS = 300_000;\n\nexport function CommandSection() {\n const { compact } = useViewport();\n const authority = useQuery(authorityQuery);\n const fleet = useQuery(fleetLiveQuery);\n // The shell's ONE activity poll (C1) — never a second loop from here.\n const activity = useActivity();\n const leader = useQuery(leaderQuery);\n const learning = useQuery(learningQuery, { freshMs: 60_000 });\n const history = useQuery(fleetHistoryQuery, { freshMs: 60_000 });\n const budget = useQuery(budgetQuery, { freshMs: 15_000 });\n\n const refetch = {\n authority: useRefetch(authorityQuery),\n fleet: useRefetch(fleetLiveQuery),\n leader: useRefetch(leaderQuery),\n learning: useRefetch(learningQuery),\n history: useRefetch(fleetHistoryQuery),\n budget: useRefetch(budgetQuery),\n };\n usePollWhileVisible(() => {\n refetch.authority();\n refetch.fleet();\n }, COMMAND_FAST_POLL_MS);\n usePollWhileVisible(() => {\n refetch.leader();\n refetch.budget();\n }, COMMAND_SLOW_POLL_MS);\n usePollWhileVisible(() => {\n refetch.history();\n refetch.learning();\n }, COMMAND_HISTORY_POLL_MS);\n\n // A 30 s clock is enough for the chip and the swimlane's \"now\"; the\n // countdown rings keep their own 1 s ticker.\n const now = useNow(30_000);\n const actions = useSurfaceActions();\n // One Touch ID sheet for the bar AND the \"Autonomy is off\" banner.\n const grantFlow = useGrantFlow(actions);\n const lastLooked = useLastLooked();\n\n // The seat roster, for the seat strip (the rail's capacity projection) and\n // Needs-you's seat names. Read from the cache WITHOUT fetching: the console\n // loads bootstrap at startup and the chat surfaces keep it live, and a\n // bootstrap read here would cost ~384 ms of server event loop per poll\n // (useSeatsRefresh.ts). No roster → the strip falls back to the budget\n // route's own seat list and says readiness is unknown.\n const roster = useSyncExternalStore(\n useCallback((listener: () => void) => subscribeQuery(VERSE_BOOTSTRAP_KEY, listener), []),\n () => getQuerySnapshot<VerseBootstrap>(VERSE_BOOTSTRAP_KEY),\n () => getQuerySnapshot<VerseBootstrap>(VERSE_BOOTSTRAP_KEY),\n );\n const seats = roster.data?.seats ?? null;\n\n const view = budget.data ?? null;\n\n const auth = authority.data?.value ?? null;\n const live = fleet.data?.value ?? null;\n const hist = history.data?.value ?? null;\n // THE dark-since instant (fleet/dark-since.ts): null unless the fleet is\n // dark. Never fleet history's date — that is \"quiet since\", not \"dark\".\n const darkSince = fleetDarkSince(live);\n\n const kpis = useMemo(\n // `budget` puts each paid seat's window usage (percent, never dollars) in\n // the metered-spend caption (review 3.10 c10).\n () => buildKpis({ fleet: live, history: hist, learning: learning.data?.value ?? null, policy: auth?.policy ?? null, budget: view }),\n [live, hist, learning.data, auth, view],\n );\n // Needs-you names seats as the seat strip below it does, never by raw id.\n const names = useMemo(() => seatNames(seats, view), [seats, view]);\n // The banner decides once both reads (and, with no grant, the setup\n // checklist) have answered — never a flash of \"off\" while Command is still loading.\n const setup = useSetupChecklist(auth?.grant.state === 'none');\n const banner = authority.data && fleet.data && setup.readiness !== undefined\n ? autonomyOffState({ authority: auth, live, readiness: setup.readiness, setup: setup.report })\n : null;\n const kpisEmpty = useMemo(() => kpisSayNothing({ fleet: live, history: hist, learning: learning.data?.value ?? null }), [live, hist, learning.data]);\n const since = sinceYouLooked({ lastLookedAt: lastLooked, fleet: live, leader: leader.data?.value ?? null, activity: activity.data });\n\n const windowH = compact ? 6 : 12;\n const from = now - windowH * HOUR;\n const lanes = useMemo(() => (live ? laneRows(live.runs, from, now) : []), [live, from, now]);\n const runsStatus: ChartStatus = !fleet.data\n ? { kind: 'loading' }\n : !live\n ? { kind: 'unknown', reason: fleet.data.reason ?? 'the live fleet view did not answer.' }\n : live.state === 'dark' && lanes.length === 0\n ? fleetDarkStatus(live)\n : lanes.length === 0\n ? { kind: 'empty', message: `No runs in the last ${windowH} hours.` }\n : { kind: 'ready' };\n\n // The banner (or the verdict) already says the fleet is dark; \"All clear\"\n // needs no third copy of it.\n const fleetLine = live\n ? live.state === 'dark'\n ? null\n : `Fleet ${live.state}: ${live.summary.building ?? '—'} building, ${live.summary.queued ?? '—'} queued.`\n : 'Fleet status unknown.';\n const refreshing = [authority, fleet].some((q) => q.status === 'refreshing');\n\n return (\n <Surface\n title=\"Command\"\n actions={refreshing ? <RefreshIndicator /> : null}\n lead={\n <div className={styles.lead}>\n <AutonomyBar read={authority.data} loading={authority.status === 'loading'} budgetMode={view?.mode ?? null} actions={actions} compact={compact} now={now} grantFlow={grantFlow} />\n <ActionStatus actions={actions} />\n {banner ? (\n <AutonomyOffState state={banner} here=\"command\" onGrant={(intent) => grantFlow.open(intent, banner.why)} />\n ) : (\n <>\n <VerdictLine\n authority={auth}\n building={live?.summary.building ?? null}\n mergedToday={live?.summary.mergedToday ?? null}\n revertsToday={live?.summary.revertsToday ?? null}\n reserve={claudeReserve(view)}\n darkSince={darkSince}\n />\n <SinceStrip lastLookedAt={lastLooked} items={since} now={now} />\n </>\n )}\n </div>\n }\n >\n <Cell span={5}>\n <NeedsYouCard state={activity} actions={actions} fleetLine={fleetLine} seatNames={names} />\n </Cell>\n <Cell span={7}>\n <LeaderCard read={leader.data} loading={leader.status === 'loading'} actions={actions} />\n </Cell>\n {banner && kpisEmpty ? null : (\n <Cell span={12}>\n <KpiRow kpis={kpis} />\n </Cell>\n )}\n <Cell span={12}>\n <SeatStrip budget={view} seats={seats} now={now} />\n </Cell>\n <Cell span={12}>\n <CloudCard actions={actions} now={now} />\n </Cell>\n {banner && lanes.length === 0 ? null : (\n <Cell span={12}>\n <Swimlane\n title={`Last ${windowH} hours`}\n description=\"Fleet lanes; bars coloured by status, outlines are queued or parked\"\n status={runsStatus}\n lanes={lanes}\n from={from}\n to={now}\n now={now}\n toneOf={runTone}\n />\n </Cell>\n )}\n {grantFlow.sheet}\n {actions.dialogs}\n </Surface>\n );\n}\n"],"file":"CommandSection-Brp73iox.js"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
._list_1r7bb_11{grid-template-columns:repeat(var(--seat-columns,1), minmax(0, 1fr));gap:var(--space-2);display:grid}._item_1r7bb_17{--level:var(--status-success-fg);min-width:0;padding:var(--space-2) var(--space-3);border:1px solid var(--border-subtle);border-radius:var(--radius-md);color:var(--text-secondary);font:inherit;text-align:left;cursor:pointer;transition:background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);background:0 0;flex-direction:column;gap:6px;display:flex}._item_1r7bb_17:hover{background:var(--bg-hover);border-color:var(--border-default)}._item_1r7bb_17:focus-visible{outline:2px solid var(--border-focus);outline-offset:1px}._item_1r7bb_17[data-level=low]{--level:var(--status-warning-fg)}._item_1r7bb_17[data-level=out]{--level:var(--status-danger-fg)}._item_1r7bb_17[data-level=unknown]{--level:var(--text-tertiary)}._head_1r7bb_48{align-items:center;gap:var(--space-2);min-width:0;display:flex}._logo_1r7bb_55{flex:none}._name_1r7bb_59{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:var(--text-sm-size);line-height:var(--text-sm-line);font-weight:var(--font-weight-medium,500);color:var(--text-primary);flex:auto;overflow:hidden}._value_1r7bb_71{font-size:var(--text-sm-size);line-height:var(--text-sm-line);font-weight:var(--font-weight-semibold);font-variant-numeric:tabular-nums;color:var(--text-primary);flex:none}._item_1r7bb_17[data-level=low] ._value_1r7bb_71,._item_1r7bb_17[data-level=out] ._value_1r7bb_71{color:var(--level)}._item_1r7bb_17[data-level=unknown] ._value_1r7bb_71{color:var(--text-tertiary)}._meter_1r7bb_90{background:var(--bg-hover);height:4px;box-shadow:inset 0 0 0 1px var(--border-subtle);border-radius:2px;display:block;position:relative}._fill_1r7bb_99{width:var(--fill,0%);border-radius:inherit;background:var(--level);transition:width var(--duration-base) var(--ease-standard);position:absolute;inset:0 auto 0 0}._item_1r7bb_17[data-free] ._fill_1r7bb_99{opacity:.45}._reserve_1r7bb_113{top:-2px;bottom:-2px;left:var(--reserve);background:var(--text-secondary);border-radius:1px;width:2px;margin-left:-1px;position:absolute}._foot_1r7bb_124{justify-content:space-between;align-items:center;gap:var(--space-2);min-width:0;font-size:var(--text-xs-size);line-height:var(--text-xs-line);display:flex}._note_1r7bb_134{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-tertiary);overflow:hidden}._autonomy_1r7bb_142{color:var(--text-secondary);flex:none;align-items:center;gap:5px;display:inline-flex}._dot_1r7bb_150{background:var(--text-tertiary);border-radius:50%;width:6px;height:6px}._autonomy_1r7bb_142[data-kind=eligible] ._dot_1r7bb_150{background:var(--status-success-fg)}._autonomy_1r7bb_142[data-kind=held] ._dot_1r7bb_150{background:var(--status-warning-fg)}._autonomy_1r7bb_142[data-kind=conflict]{color:var(--status-unknown-fg)}._autonomy_1r7bb_142[data-kind=conflict] ._dot_1r7bb_150{box-shadow:inset 0 0 0 1.5px var(--status-unknown-fg);background:0 0}@media (prefers-reduced-motion:reduce){._item_1r7bb_17,._fill_1r7bb_99{transition:none}}._tip_1r7bb_173{max-width:300px;color:var(--text-primary);flex-direction:column;gap:3px;display:flex}._tipHead_1r7bb_174{align-items:center;gap:6px;display:flex}._tipLine_1r7bb_175{color:var(--text-secondary);font-size:var(--text-2xs-size)}._tipHint_1r7bb_176{color:var(--text-tertiary);font-size:var(--text-2xs-size);margin-top:2px}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
import{a as e,c as t,n}from"./index-CyK31YRm.js";import{g as r,i,m as a,o}from"./global-y_exIyAP.js";import{t as s}from"./MutationTokenDialog-Bm34BNVV.js";import{t as c}from"./ProviderLogo-AwHn2sKm.js";import{Dt as l,Et as u,Tt as d,_n as f,bt as p,ht as m,mt as h,pt as g,vt as _,wt as v,xt as y,yt as b}from"./VerseConsoleApp-DXDv1aOi.js";import{D as x,E as S,O as C,_ as w,c as T,o as E,s as D}from"./verse-model-JTuvRBVK.js";import{p as O}from"./format-BmH2yWL6.js";import{a as ee,c as k,d as A,l as te,u as ne}from"./context-queries-_9bFWb9v.js";import{T as j,f as M,t as re,v as N,w as ie}from"./context-model-CDeyP0cA.js";import{_ as ae,a as oe,i as se,k as ce,l as P,m as le,n as ue,r as de,v as F,w as fe,x as pe}from"./context-model-Bb15chFt.js";import{d as I,p as L,u as R}from"./workspace-model-D-SLfads.js";import{n as z,t as B}from"./ActionMenu-Dwjk6rUQ.js";import{s as me}from"./tool-semantics-GX8ScuSH.js";import{d as V,h as he,i as H,l as ge,n as U}from"./dock-icons-Cc43W7r4.js";import{a as W}from"./command-catalog-ffCAijVY.js";import{currentTurnTasks as _e}from"./tasks-model-CzHvclVm.js";import{n as ve,t as G}from"./use-token-gate-DSNIIpI6.js";import{t as ye}from"./EmptyState-DsN1H6MC.js";import{a as be,n as xe,r as Se}from"./slots-BL_J5mmV.js";import{i as Ce,r as K,t as we}from"./useVerseTranscript-CqH51rt9.js";import{t as Te}from"./Switch-BmCzfFnu.js";import{t as q}from"./context.module-BijAfoJw.js";import{s as Ee}from"./ChatSection-C9myY4ei.js";var J=t(e(),1),Y={usage:`_usage_1xfeo_5`,muted:`_muted_1xfeo_21`,subTitle:`_subTitle_1xfeo_23`,idleWarn:`_idleWarn_1xfeo_35`},X=n();function De({session:e,seats:t,events:n,now:r}){let i=e.usage,a=ie(e,t),o=j(n??[]),s=i.inputTokens+i.cacheReadTokens+i.cacheCreationTokens,c=N(i),l=e.compactionCount??o.compactions,u=M(e,a.tokens,r,C(n??[])),d=a.exact?``:`≤`,f=o.exact?``:`≤`;return(0,X.jsxs)(X.Fragment,{children:[(0,X.jsxs)(`dl`,{className:Y.usage,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Input`}),(0,X.jsx)(`dd`,{children:x(i.inputTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Output`}),(0,X.jsx)(`dd`,{children:x(i.outputTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache read`}),(0,X.jsx)(`dd`,{children:x(i.cacheReadTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache write`}),(0,X.jsx)(`dd`,{children:x(i.cacheCreationTokens)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Turns`}),(0,X.jsx)(`dd`,{children:e.turnCount})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Context`}),(0,X.jsxs)(`dd`,{title:a.exact?void 0:`An upper bound: the CLI reported only the turn total, which sums every call.`,children:[d,x(a.tokens),a.window===null?``:` / ${E(a.window)}`]})]})]}),(0,X.jsx)(`h4`,{className:Y.subTitle,children:`Efficiency`}),(0,X.jsxs)(`dl`,{className:Y.usage,"aria-label":`Context efficiency`,children:[(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Cache hit`}),(0,X.jsx)(`dd`,{title:`Share of prompt tokens served from the provider's cache: cache read ÷ (input + cache read + cache write).`,children:c===null?s>0?`none reported`:`—`:O(c)})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Compactions`}),(0,X.jsx)(`dd`,{children:l})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Avg context / turn`}),(0,X.jsx)(`dd`,{children:o.average===null?`—`:`${f}${x(o.average)}`})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Peak context`}),(0,X.jsx)(`dd`,{children:o.peak===null?`—`:`${f}${x(o.peak)}`})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Mode`}),(0,X.jsx)(`dd`,{children:re[a.mode]})]}),(0,X.jsxs)(`div`,{children:[(0,X.jsx)(`dt`,{children:`Compacts at`}),(0,X.jsx)(`dd`,{children:a.autoCompactAt===null?`—`:`≈${x(a.autoCompactAt)}`})]})]}),(0,X.jsxs)(`p`,{className:Y.muted,children:[a.source===null?a.window===null?`Window unknown for this chat.`:`Window as stored when this chat was created; how it was known was not recorded.`:`Window ${S(a.source,e.engine)}.`,o.turns>0&&!o.exact?` Figures marked ≤ are upper bounds: the CLI reported only turn totals.`:``]}),(0,X.jsx)(`p`,{className:Y.muted,children:e.memoryEnabled===!0?e.engine===`local`?`Shared project memory was given to this chat’s agent when it started.`:`Shared project memory was given to this chat’s agent when it started: a block of up to ${ue/1024} KB in its system prompt, re-sent every turn (cached after the first), plus the agent’s own reads and updates of MEMORY.md — a little of this seat’s usage.`:`This chat started without shared project memory.`}),u===null?null:(0,X.jsx)(`p`,{role:`status`,className:Y.idleWarn,children:u.local?`Idle for ${T(u.idleMs)}: the local model has likely dropped this chat from its cache, so the next turn re-processes ~${x(u.tokens)} tokens before it replies — time, not spend.`:`Idle for ${T(u.idleMs)}, past the ~1 h prompt-cache lifetime: the next turn likely re-reads ~${x(u.tokens)} tokens uncached, at full price.`})]})}function Oe({projectPath:e,refreshKey:t}){let n=(0,J.useId)();return e?(0,X.jsx)(Ne,{projectPath:e,refreshKey:t},e):(0,X.jsxs)(`section`,{className:q.memory,"aria-labelledby":n,children:[(0,X.jsx)(`h3`,{id:n,className:q.memoryHead,children:`Project memory`}),(0,X.jsx)(`p`,{className:q.hint,children:`Open a chat to see the memory its project shares across seats.`})]})}var ke=`Saving writes MEMORY.md for this project. Every seat on it reads this file.`,Ae=`Clearing empties MEMORY.md for every chat on this project.`,je=`This changes whether new chats on this project are given shared memory.`,Me=`This changes whether new chats on ANY project are given shared memory.`;function Ne({projectPath:e,refreshKey:t}){let n=(0,J.useId)(),c=(0,J.useId)(),l=(0,J.useId)(),u=(0,J.useMemo)(()=>ne(e),[e]),d=a(u),f=r(u),p=a(te),m=ve(),h=w(e),[g,_]=(0,J.useState)(`view`),[v,y]=(0,J.useState)(``),[b,x]=(0,J.useState)(``),[S,C]=(0,J.useState)(!1),[T,E]=(0,J.useState)(null),[D,O]=(0,J.useState)(null),[j,M]=(0,J.useState)(null),[re,N]=(0,J.useState)(null),ie=(0,J.useRef)(null),ue=(0,J.useRef)(t);(0,J.useEffect)(()=>{t!==ue.current&&(ue.current=t,f())},[t,f]),(0,J.useEffect)(()=>{let e=ie.current;g===`edit`&&e&&(e.focus(),e.setSelectionRange(e.value.length,e.value.length))},[g]);let[I,L]=(0,J.useState)(null);(0,J.useEffect)(()=>{I!==null&&d.status===`success`&&L(null)},[I,d.status]);let R=I!==null&&d.status!==`success`?I:d.data,z=d.error instanceof o&&d.error.status===404,B=p.data?!p.data.memory.enabled:!1,me=(0,J.useMemo)(()=>fe(v),[v]),V=me>ce,he=(0,J.useMemo)(()=>le({projectPath:e,content:v}),[e,v]),H=!V&&he>de,ge=g===`edit`?pe(v):null,U=g===`edit`&&S?ae(v):0;function W(e,t){y(e),x(e),C(t),E(null),M(null),N(null),_(`edit`)}async function _e(t=!1){if(!D){O(`saving`),M(null);try{let n=await ee(e);if(!t&&n.content!==b){E(n);return}let r=await m.run(ke,()=>A(e,v));if(r===null)return;L(r),E(null),_(`view`),N(r.content.length===0?`Saved — MEMORY.md is now empty.`:`Saved.`)}catch(e){M(G(e))}finally{O(null)}}}async function ye(){if(!D){O(`clearing`),M(null);try{let t=await m.run(Ae,()=>A(e,``));if(t===null)return;L(t),_(`view`),N(`Cleared. Agents start MEMORY.md afresh on their next write.`)}catch(e){M(G(e))}finally{O(null)}}}async function be(t){if(!D){O(`toggling`),M(null),N(null);try{await m.run(je,()=>k({projectPath:e,memoryEnabled:t}))!==null&&N(t?`New chats on ${h} will get shared memory. Chats already open keep what they started with.`:`New chats on ${h} will start without shared memory. The file is kept.`)}catch(e){M(G(e))}finally{O(null)}}}async function xe(e){if(!D){O(`toggling`),M(null),N(null);try{await m.run(Me,()=>k({memoryEnabled:e}))}catch(e){M(G(e))}finally{O(null)}}}let Se=R?B?`off everywhere`:R.enabled?`on`:`off`:null;return(0,X.jsxs)(`section`,{className:q.memory,"aria-labelledby":n,"data-project":e,children:[(0,X.jsxs)(`h3`,{id:n,className:q.memoryHead,children:[(0,X.jsx)(`span`,{children:`Project memory`}),Se?(0,X.jsx)(`span`,{className:q.memoryState,children:Se}):null,z?null:(0,X.jsx)(`button`,{type:`button`,className:q.memoryHeadAction,onClick:f,"aria-label":`Refresh project memory`,children:`Refresh`})]}),(0,X.jsxs)(`p`,{className:q.hint,children:[`One `,(0,X.jsx)(`code`,{children:`MEMORY.md`}),` shared by every chat on `,(0,X.jsx)(`strong`,{title:e,children:h}),`, whichever seat runs it. Agents keep it current — decisions and why, conventions, gotchas, plan status.`]}),z?(0,X.jsxs)(`p`,{className:q.hint,children:[`This server has no project memory yet — update Ashlr and restart `,(0,X.jsx)(`code`,{children:`ashlr verse`}),`.`]}):d.status===`loading`||d.status===`idle`&&!R?(0,X.jsxs)(`div`,{"aria-busy":`true`,children:[(0,X.jsx)(i,{width:`80%`}),(0,X.jsx)(i,{width:`60%`}),(0,X.jsx)(i,{width:`70%`})]}):R?(0,X.jsxs)(X.Fragment,{children:[B?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`Shared memory is off for every project, so new chats start without it.`}),(0,X.jsx)(`div`,{className:q.memoryActions,children:(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,disabled:D!==null,onClick:()=>void xe(!0),children:`Turn memory on`})})]}):(0,X.jsx)(Te,{checked:R.enabled,disabled:D!==null||!p.data,onChange:e=>void be(e),label:`Give new chats on ${h} this memory`}),g===`edit`?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`label`,{className:q.label,htmlFor:c,children:`Edit MEMORY.md`}),(0,X.jsx)(`textarea`,{id:c,ref:ie,className:q.textarea,value:v,rows:12,spellCheck:!1,"aria-describedby":l,"aria-invalid":V||H?!0:void 0,onChange:e=>y(e.target.value)}),(0,X.jsxs)(`p`,{id:l,className:`${q.hint} ${q.counter} ${V||H?q.counterOver:``}`,children:[P(me),` of `,P(ce),V?` — over the limit; trim it to save.`:``,H?` — ${P(he)} once line breaks and quotes are encoded for sending, over the ${P(de)} request limit; trim it to save.`:``]}),ge?(0,X.jsxs)(`p`,{className:q.warn,role:`alert`,children:[`This looks like it contains `,ge,`. MEMORY.md is sent to every seat’s model — remove it before saving.`]}):null,U>0?(0,X.jsxs)(`p`,{className:q.warn,role:`alert`,children:[U===1?`One`:U,` `,(0,X.jsx)(`code`,{children:oe}),` placeholder`,U===1?` stands`:`s stand`,` in for secret-looking text that is still in MEMORY.md. Saving `,U===1?`it`:`them`,` would replace the real value`,U===1?``:`s`,`, so Save stays off until `,U===1?`it is`:`they are`,` gone. Deleting a placeholder drops that value from the file; to keep it, edit MEMORY.md directly under `,(0,X.jsx)(`code`,{children:`~/.ashlr/verse/memory`}),`.`]}):S?(0,X.jsxs)(`p`,{className:q.hint,children:[`This copy was sanitized for the browser, so a home-folder path appears as `,(0,X.jsx)(`code`,{children:`~`}),`. Saving writes the text as shown; `,(0,X.jsx)(`code`,{children:`~`}),` names the same folder for every reader.`]}):null,T?(0,X.jsxs)(`div`,{className:q.warn,role:`alert`,children:[(0,X.jsxs)(`p`,{className:q.hint,children:[`An agent changed MEMORY.md while you were editing`,F(T.updatedAt)?` (${F(T.updatedAt)})`:``,`.`]}),(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,disabled:D!==null||U>0,onClick:()=>void _e(!0),children:`Overwrite with mine`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,disabled:D!==null,onClick:()=>W(T.content,T.contentSanitized===!0),children:`Start over from theirs`})]})]}):null,(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.primary} ${q.small}`,disabled:D!==null||V||H||v===b||T!==null||U>0,onClick:()=>void _e(!1),children:D===`saving`?`Saving…`:`Save`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,disabled:D===`saving`,onClick:()=>{_(`view`),E(null),M(null)},children:`Cancel`})]})]}):R.content.length===0?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`MEMORY.md is empty. Agents add to it as they work, or write the first entries yourself.`}),(0,X.jsx)(`div`,{className:q.memoryActions,children:(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:()=>W(``,!1),children:`Write it`})})]}):(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`pre`,{className:q.memoryBody,tabIndex:0,"aria-label":`MEMORY.md for ${h}`,children:R.content}),(0,X.jsxs)(`p`,{className:`${q.hint} ${q.memoryMeta}`,children:[(0,X.jsx)(`span`,{children:P(R.bytes)}),F(R.updatedAt)?(0,X.jsxs)(`span`,{children:[`updated `,F(R.updatedAt)]}):null]}),R.contentSanitized?(0,X.jsxs)(`p`,{className:q.hint,children:[`Shown sanitized for the browser: a home-folder path appears as `,(0,X.jsx)(`code`,{children:`~`}),` and secret-looking text as`,` `,(0,X.jsx)(`code`,{children:oe}),`.`,ae(R.content)>0?` The real values are still in the file.`:``]}):null,g===`confirm-clear`?(0,X.jsxs)(`div`,{className:q.warn,role:`alert`,children:[(0,X.jsxs)(`p`,{className:q.hint,children:[`Clear MEMORY.md for `,h,`? Every chat on this project loses what it says. Other files in the folder stay.`]}),(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small} ${q.danger}`,disabled:D!==null,onClick:()=>void ye(),children:D===`clearing`?`Clearing…`:`Clear it`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,onClick:()=>_(`view`),children:`Keep`})]})]}):(0,X.jsxs)(`div`,{className:q.memoryActions,children:[(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:()=>W(R.content,R.contentSanitized===!0),children:`Edit`}),(0,X.jsx)(`button`,{type:`button`,className:`${q.cancel} ${q.small}`,onClick:()=>{N(null),_(`confirm-clear`)},children:`Clear…`})]})]}),R.files.length>0?(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`span`,{className:q.label,children:`Also in this folder`}),(0,X.jsx)(`ul`,{className:q.memoryFiles,children:R.files.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsx)(`code`,{children:e})},e))})]}):null,re?(0,X.jsx)(`p`,{className:q.hint,role:`status`,children:re}):null,j?(0,X.jsx)(`p`,{className:q.error,role:`alert`,children:j}):null,(0,X.jsxs)(`details`,{children:[(0,X.jsx)(`summary`,{className:q.hint,children:`How project memory works`}),(0,X.jsxs)(`div`,{className:q.field,children:[(0,X.jsx)(`p`,{className:q.hint,children:`Claude, Codex and local seats can read and edit the file. Grok’s CLI can reach only its working folder, so a Grok seat is given the text and can only read it.`}),(0,X.jsx)(`p`,{className:q.hint,children:`A chat copies the memory into its instructions when it starts, so every turn re-sends the same prefix and the provider’s prompt cache keeps working. Chats already open see your edits when they next read the file; the switch above applies to new chats.`}),(0,X.jsxs)(`p`,{className:q.hint,children:[`It lives on this machine under `,(0,X.jsx)(`code`,{children:`~/.ashlr/verse/memory`}),`, readable only by you. It is sent to every seat’s model, so never put secrets in it.`]}),(0,X.jsx)(`p`,{className:q.hint,children:se}),B?null:(0,X.jsxs)(`p`,{className:q.hint,children:[`Memory is on for every project unless switched off per project.`,` `,(0,X.jsx)(`button`,{type:`button`,className:q.link,disabled:D!==null,onClick:()=>void xe(!1),children:`Turn it off for every project`})]})]})]})]}):(0,X.jsxs)(`div`,{className:q.searchError,role:`alert`,children:[(0,X.jsxs)(`span`,{children:[`Could not read this project’s memory: `,G(d.error)]}),(0,X.jsx)(`button`,{type:`button`,className:`${q.secondary} ${q.small}`,onClick:f,children:`Retry`})]}),(0,X.jsx)(s,{open:m.dialog.open,reason:m.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:m.dialog.onClose,onUnlocked:m.dialog.onUnlocked})]})}var Z={roots:`_roots_afeac_8`,title:`_title_afeac_10`,count:`_count_afeac_22`,workspace:`_workspace_afeac_30`,list:`_list_afeac_36`,root:`_root_afeac_8`,rootHead:`_rootHead_afeac_57`,name:`_name_afeac_64`,badge:`_badge_afeac_72`,path:`_path_afeac_84`,git:`_git_afeac_97`,remote:`_remote_afeac_98`,caveat:`_caveat_afeac_99`,note:`_note_afeac_116`,error:`_error_afeac_117`};function Pe({session:e,data:t,error:n=null}){return!e||t!==null&&t.roots.length<=1&&t.workspaceId===null?null:(0,X.jsxs)(`section`,{className:Z.roots,"aria-labelledby":`verse-res-roots`,children:[(0,X.jsxs)(`h3`,{id:`verse-res-roots`,className:Z.title,children:[`Folders`,t?(0,X.jsx)(`span`,{className:Z.count,children:t.roots.length}):null]}),t?.workspaceName?(0,X.jsxs)(`p`,{className:Z.workspace,children:[`Workspace `,(0,X.jsx)(`strong`,{children:t.workspaceName})]}):null,n?(0,X.jsx)(`p`,{role:`alert`,className:Z.error,children:n}):null,(0,X.jsx)(`ul`,{className:Z.list,children:(t?.roots??[]).map(e=>{let t=I(e),n=R(e);return(0,X.jsxs)(`li`,{className:Z.root,"data-tone":L(e),children:[(0,X.jsxs)(`div`,{className:Z.rootHead,children:[(0,X.jsx)(`span`,{className:Z.name,children:e.name}),(0,X.jsx)(`span`,{className:Z.badge,children:e.primary?`primary`:`added`})]}),(0,X.jsx)(`p`,{className:Z.path,title:e.path,children:he(e.path)}),(0,X.jsx)(`p`,{className:Z.git,children:t??`not a git repo`}),e.git?.remote?(0,X.jsx)(`p`,{className:Z.remote,children:e.git.remote}):null,n?(0,X.jsx)(`p`,{className:Z.caveat,children:n}):null]},e.path)})}),(t?.notes??[]).map(e=>(0,X.jsx)(`p`,{className:Z.note,children:e},e))]})}var Q={pane:`_pane_1f7em_6`,section:`_section_1f7em_13`,sectionTitle:`_sectionTitle_1f7em_19`,count:`_count_1f7em_31`,muted:`_muted_1f7em_37`,action:`_action_1f7em_43`,hint:`_hint_1f7em_46`,reserve:`_reserve_1f7em_54`,link:`_link_1f7em_73`,task:`_task_1f7em_74`,taskList:`_taskList_1f7em_88`,taskMark:`_taskMark_1f7em_113`,"pane-pulse":`_pane-pulse_1f7em_1`,taskName:`_taskName_1f7em_125`,taskDetail:`_taskDetail_1f7em_134`,taskTime:`_taskTime_1f7em_142`,engineTick:`_engineTick_1f7em_152`},Fe=3e4;function Ie(e){let[t,n]=(0,J.useState)(()=>Date.now());return(0,J.useEffect)(()=>{if(!e)return;n(Date.now());let t=setInterval(()=>n(Date.now()),Fe);return()=>clearInterval(t)},[e]),t}function Le({session:e,seats:t,events:n,roots:r,rootsError:i,onHandoff:a,handoffDisabledReason:o=null,onOpenAccounts:s,visible:c}){let l=Ie(c&&e!==null);return(0,X.jsxs)(`div`,{className:Q.pane,"aria-label":`Context`,children:[(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-context-chat`,children:[(0,X.jsx)(`h3`,{id:`dock-context-chat`,className:Q.sectionTitle,children:`This chat`}),e?(0,X.jsx)(De,{session:e,seats:t,events:n,now:l}):(0,X.jsx)(`p`,{className:Q.muted,children:`Open a chat to see its usage and context.`})]}),e?(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(Pe,{session:e,data:r,error:i})}):null,e&&a?(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-context-handoff`,children:[(0,X.jsx)(`h3`,{id:`dock-context-handoff`,className:Q.sectionTitle,children:`Handoff`}),(0,X.jsx)(`p`,{className:Q.muted,children:`Verse drafts a note from this chat's log — free — and opens a fresh chat with it in the message box. Nothing is sent until you press Send.`}),(0,X.jsx)(`button`,{type:`button`,className:Q.action,onClick:a,disabled:o!==null,title:o??void 0,children:`Continue in a fresh chat…`}),(0,X.jsx)(`p`,{className:`${Q.muted} ${Q.reserve}`,children:o??``})]}):null,(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(Oe,{projectPath:e?.projectPath??null,refreshKey:e?.turnCount??0})}),(0,X.jsx)(`div`,{className:Q.section,children:(0,X.jsx)(`button`,{type:`button`,className:Q.link,onClick:s,children:`Accounts & capacity →`})})]})}var $={dock:`_dock_10ssf_8`,sheetLayer:`_sheetLayer_10ssf_25`,scrim:`_scrim_10ssf_37`,"dock-fade":`_dock-fade_10ssf_1`,"dock-in-right":`_dock-in-right_10ssf_1`,"dock-in-up":`_dock-in-up_10ssf_1`,grabber:`_grabber_10ssf_64`,head:`_head_10ssf_75`,tabs:`_tabs_10ssf_86`,tabWrap:`_tabWrap_10ssf_97`,tab:`_tab_10ssf_86`,tabClose:`_tabClose_10ssf_135`,headActions:`_headActions_10ssf_156`,iconButton:`_iconButton_10ssf_162`,plus:`_plus_10ssf_179`,body:`_body_10ssf_185`,pane:`_pane_10ssf_191`,splitHandle:`_splitHandle_10ssf_200`,widthHandle:`_widthHandle_10ssf_220`};function Re(e){let t=W(e)?.keys[0];return t?f(t):null}var ze=16,Be=64,Ve=.05;function He(e){let{presentation:t,windowWidth:n,columnWidth:r}=e,{state:i,requests:a}=v(),o=(0,J.useRef)(null),s=(0,J.useRef)(new Map),c=(0,J.useId)(),[f,p]=(0,J.useState)(null),[_,b]=(0,J.useState)(()=>new Set(i.open&&i.active?[i.active]:[])),x=i.tabs.filter(Ce),S=i.active!==null&&x.includes(i.active)?i.active:x[0]??null,C=i.splitWith!==null&&x.includes(i.splitWith)&&i.splitWith!==S?i.splitWith:null,w=i.open&&S!==null,T=t!==`column`;(0,J.useEffect)(()=>{w&&b(e=>{let t=[S,C].filter(e=>e!==null),n=new Set([...e].filter(e=>x.includes(e)));for(let e of t)n.add(e);return n.size===e.size&&[...n].every(t=>e.has(t))?e:n})},[w,S,C,x.join(`|`)]),(0,J.useEffect)(()=>{if(!w||!T)return;let e=document.activeElement;return o.current?.focus({preventScroll:!0}),()=>{e&&document.contains(e)&&e.focus({preventScroll:!0})}},[w,T]);let E=(0,J.useCallback)(e=>{if(!T)return;let t=e.target instanceof Element&&e.target.closest(`[data-dock-pane="terminal"]`)!==null;if(e.key===`Escape`&&!t&&!e.defaultPrevented){e.preventDefault(),g();return}if(e.key!==`Tab`||t)return;let n=o.current;if(!n)return;let r=Array.from(n.querySelectorAll(`button:not([disabled]), [href], input:not([disabled]), select, textarea, [tabindex]:not([tabindex="-1"])`)).filter(e=>!e.closest(`[hidden]`));if(r.length===0)return;let i=r[0],a=r[r.length-1];e.shiftKey&&document.activeElement===i?(e.preventDefault(),a.focus()):!e.shiftKey&&document.activeElement===a&&(e.preventDefault(),i.focus())},[T]);if(!w)return null;function D(e,t){let n=x.indexOf(t),r;if(e.key===`ArrowRight`)r=x[(n+1)%x.length];else if(e.key===`ArrowLeft`)r=x[(n-1+x.length)%x.length];else if(e.key===`Home`)r=x[0];else if(e.key===`End`)r=x[x.length-1];else if((e.key===`Delete`||e.key===`Backspace`)&&x.length>0){e.preventDefault(),h(t);return}r&&(e.preventDefault(),m(r),s.current.get(r)?.focus())}let O=u.map(e=>e.id).filter(e=>Ce(e)&&!x.includes(e)),ee=O.map(e=>({id:e,label:K[e],icon:H[e]({}),onSelect:()=>m(e)})),k=[...u.map(e=>e.id).filter(e=>Ce(e)&&e!==S).map(e=>({id:e,label:`${K[e]} below`,icon:H[e]({}),onSelect:()=>y(e)})),...C?[{id:`unsplit`,label:`One pane`,separated:!0,onSelect:()=>y(null)}]:[]],A=Re(`dock.toggle`),te=t===`column`?r:l(i.width,n),ne=`Dock: ${K[S]}${C?` over ${K[C]}`:``}`,j=(0,X.jsxs)(`aside`,{ref:o,className:$.dock,"data-presentation":t,"data-split":C?`true`:void 0,"aria-label":ne,role:T?`dialog`:`complementary`,"aria-modal":T?!0:void 0,tabIndex:-1,style:t===`bottom-sheet`?{height:`${d.bottomSheetHeightVh}vh`}:{width:te},onKeyDown:E,children:[t===`column`?(0,X.jsx)(We,{width:te,windowWidth:n}):null,t===`bottom-sheet`?(0,X.jsx)(`span`,{className:$.grabber,"aria-hidden":`true`}):null,(0,X.jsxs)(`div`,{className:$.head,children:[(0,X.jsx)(`div`,{className:$.tabs,role:`tablist`,"aria-label":`Dock panes`,children:x.map(e=>{let t=H[e],n=e===S,r=e===C;return(0,X.jsxs)(`div`,{className:$.tabWrap,"data-selected":n||void 0,"data-below":r||void 0,children:[(0,X.jsxs)(`button`,{ref:t=>{t?s.current.set(e,t):s.current.delete(e)},type:`button`,role:`tab`,id:`${c}-tab-${e}`,"aria-selected":n,"aria-controls":`${c}-pane-${e}`,tabIndex:n?0:-1,className:$.tab,onClick:()=>m(e),onKeyDown:t=>D(t,e),title:r?`${K[e]} (lower pane)`:void 0,children:[(0,X.jsx)(t,{size:14}),(0,X.jsx)(`span`,{className:$.tabLabel,children:K[e]})]}),(0,X.jsx)(`button`,{type:`button`,className:$.tabClose,"aria-label":`Close ${K[e]}`,title:`Close ${K[e]}`,tabIndex:-1,onClick:()=>h(e),children:(0,X.jsx)(U,{size:12})})]},e)})}),(0,X.jsxs)(`div`,{className:$.headActions,children:[(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":`Add a pane`,title:O.length>0?`Add a pane`:`Every pane is already open`,"aria-haspopup":`menu`,"aria-expanded":f?.kind===`add`,disabled:O.length===0,onClick:e=>p({kind:`add`,anchor:z(e.currentTarget),from:e.currentTarget}),children:(0,X.jsx)(`span`,{className:$.plus,"aria-hidden":`true`,children:`+`})}),t!==`bottom-sheet`&&k.length>0?(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":C?`Split: change or undo`:`Split the dock`,title:C?`Change the split`:`Split: show a second pane below`,"aria-haspopup":`menu`,"aria-expanded":f?.kind===`split`,"aria-pressed":C!==null,onClick:e=>p({kind:`split`,anchor:z(e.currentTarget),from:e.currentTarget}),children:(0,X.jsx)(ge,{size:14})}):null,(0,X.jsx)(`button`,{type:`button`,className:$.iconButton,"aria-label":`Close the dock`,title:`Close the dock${A?` (${A})`:``}`,onClick:g,children:(0,X.jsx)(U,{size:14})})]})]}),(0,X.jsxs)(`div`,{className:$.body,children:[x.filter(e=>_.has(e)||e===S||e===C).map(n=>{let r=n===S||n===C&&t!==`bottom-sheet`,o=n===S?`top`:n===C?`bottom`:`hidden`;return(0,X.jsx)(`div`,{id:`${c}-pane-${n}`,role:`tabpanel`,"aria-labelledby":`${c}-tab-${n}`,className:$.pane,"data-dock-pane":n,"data-position":r?o:`hidden`,hidden:!r,inert:!r,style:r&&C&&t!==`bottom-sheet`?{flexBasis:`${(o===`top`?i.splitRatio:1-i.splitRatio)*100}%`,order:o===`top`?0:2}:void 0,children:(0,X.jsx)(Ue,{pane:n,visible:r,...e,requests:a})},n)}),C&&t!==`bottom-sheet`?(0,X.jsx)(Ge,{ratio:i.splitRatio,lower:K[C]}):null]}),f?(0,X.jsx)(B,{label:f.kind===`add`?`Add a pane`:`Split the dock`,items:f.kind===`add`?ee:k,anchor:f.anchor,returnFocus:f.from,onClose:()=>p(null)}):null]});return T?(0,X.jsxs)(`div`,{className:$.sheetLayer,"data-presentation":t,children:[(0,X.jsx)(`button`,{type:`button`,className:$.scrim,"aria-label":`Close the dock`,tabIndex:-1,onClick:g}),j]}):j}function Ue({pane:e,visible:t,sessionId:n,roots:r,turnFiles:i,onSendToChat:a,onAddToMessage:o,renderTasks:s,renderContext:c,requests:l}){if(e===`tasks`)return(0,X.jsx)(X.Fragment,{children:s(t)});if(e===`context`)return(0,X.jsx)(X.Fragment,{children:c(t)});if(n===null){let t=Re(`chat.new`);return(0,X.jsx)(ye,{compact:!0,title:`Open a chat to use ${K[e]}`,body:`Pick a chat in the sidebar${t?` or start one with ${t}`:``}. ${K[e]} works in that chat's folders.`})}switch(e){case`terminal`:return(0,X.jsx)(be,{sessionId:n,roots:r,request:l.terminal,onSendToChat:a,visible:t});case`preview`:return(0,X.jsx)(Se,{sessionId:n,roots:r,request:l.preview,visible:t,onOpenTerminal:_});case`diff`:return(0,X.jsx)(xe,{sessionId:n,roots:r,request:l.diff,turnFiles:i,onAddToMessage:o,visible:t});default:return null}}function We({width:e,windowWidth:t}){let n=Math.max(d.minWidth,Math.floor(t*d.maxWidthFraction)),r=(0,J.useRef)(null),[i,a]=(0,J.useState)(!1);function o(t){t.button===0&&(t.preventDefault(),r.current={startX:t.clientX,startWidth:e},t.currentTarget.setPointerCapture?.(t.pointerId),a(!0),document.body.setAttribute(`data-verse-resizing`,`true`))}function s(e){let n=r.current;n&&p(l(n.startWidth+(n.startX-e.clientX),t))}function c(){r.current=null,a(!1),document.body.removeAttribute(`data-verse-resizing`)}(0,J.useEffect)(()=>()=>document.body.removeAttribute(`data-verse-resizing`),[]);function u(r){let i=r.shiftKey?Be:ze,a=null;r.key===`ArrowLeft`?a=e+i:r.key===`ArrowRight`?a=e-i:r.key===`Home`?a=d.minWidth:r.key===`End`&&(a=n),a!==null&&(r.preventDefault(),p(l(a,t)))}return(0,X.jsx)(`div`,{className:$.widthHandle,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize the dock`,"aria-valuemin":d.minWidth,"aria-valuemax":n,"aria-valuenow":Math.round(e),tabIndex:0,"data-dragging":i||void 0,onPointerDown:o,onPointerMove:s,onPointerUp:c,onPointerCancel:c,onLostPointerCapture:c,onDoubleClick:()=>p(d.defaultWidth),onKeyDown:u})}function Ge({ratio:e,lower:t}){let n=(0,J.useRef)(null),r=(0,J.useRef)(null);function i(e){if(e.button!==0)return;let t=n.current?.parentElement;if(!t)return;e.preventDefault();let i=t.getBoundingClientRect();r.current={top:i.top,height:i.height},e.currentTarget.setPointerCapture?.(e.pointerId)}function a(e){let t=r.current;!t||t.height<=0||b((e.clientY-t.top)/t.height)}function o(t){t.key===`ArrowUp`?(t.preventDefault(),b(e-Ve)):t.key===`ArrowDown`&&(t.preventDefault(),b(e+Ve))}return(0,X.jsx)(`div`,{ref:n,className:$.splitHandle,role:`separator`,"aria-orientation":`horizontal`,"aria-label":`Resize: ${t} below`,"aria-valuemin":Math.round(d.splitRatio.min*100),"aria-valuemax":Math.round(d.splitRatio.max*100),"aria-valuenow":Math.round(e*100),tabIndex:0,style:{order:1},onPointerDown:i,onPointerMove:a,onPointerUp:()=>{r.current=null},onPointerCancel:()=>{r.current=null},onDoubleClick:()=>b(d.splitRatio.default),onKeyDown:o})}var Ke=20,qe={running:`running`,done:`done`,failed:`failed`};function Je({turnTasks:e,otherChats:t,hasSession:n,onOpenSession:r}){let i=W(`chat.new`)?.keys[0],a=i?f(i):null,o=e.filter(e=>e.status===`running`),s=e.filter(e=>e.status!==`running`).slice(0,Ke);return(0,X.jsxs)(`div`,{className:Q.pane,"aria-label":`Tasks`,children:[(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-tasks-turn`,children:[(0,X.jsxs)(`h3`,{id:`dock-tasks-turn`,className:Q.sectionTitle,children:[`This chat `,(0,X.jsx)(`span`,{className:Q.count,children:o.length>0?`${o.length} running`:``})]}),n?e.length===0?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`p`,{className:Q.muted,children:`No tool calls in the latest turn.`}),(0,X.jsx)(`p`,{className:Q.hint,children:`Send a message: each tool the agent runs shows up here, and a click jumps to it in the chat.`})]}):(0,X.jsx)(`ul`,{className:Q.taskList,children:[...o,...s].map(e=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,className:Q.task,"data-status":e.status,onClick:()=>{Ee(me(e.toolUseId))},"aria-label":`${e.kind===`subagent`?`Subagent`:e.name}: ${e.detail}, ${qe[e.status]}. Jump to it in the chat.`,children:[(0,X.jsx)(`span`,{className:Q.taskMark,"data-status":e.status,"aria-hidden":`true`}),(0,X.jsx)(`span`,{className:Q.taskName,title:e.kind===`subagent`?`Subagent`:e.name,children:e.kind===`subagent`?`Subagent`:e.name}),(0,X.jsx)(`span`,{className:Q.taskDetail,title:e.detail,children:e.detail}),(0,X.jsx)(`span`,{className:Q.taskTime,children:e.status===`running`?(0,X.jsx)(V,{since:e.startedAt}):e.status===`failed`?`failed`:e.durationMs!==null&&e.durationMs>0?D(e.durationMs):`done`})]})},e.toolUseId))}):(0,X.jsx)(`p`,{className:Q.muted,children:`Open a chat to see its tool calls here.`})]}),(0,X.jsxs)(`section`,{className:Q.section,"aria-labelledby":`dock-tasks-chats`,children:[(0,X.jsxs)(`h3`,{id:`dock-tasks-chats`,className:Q.sectionTitle,children:[`Other chats `,(0,X.jsx)(`span`,{className:Q.count,children:t.length>0?`${t.length} running`:``})]}),t.length===0?(0,X.jsxs)(X.Fragment,{children:[(0,X.jsx)(`p`,{className:Q.muted,children:`No other chat is running.`}),(0,X.jsxs)(`p`,{className:Q.hint,children:[a?`Start another with ${a}`:`Start another chat`,` and it shows here while it works, one click away.`]})]}):(0,X.jsx)(`ul`,{className:Q.taskList,children:t.map(e=>(0,X.jsx)(`li`,{children:(0,X.jsxs)(`button`,{type:`button`,className:Q.task,"data-status":`running`,onClick:()=>r(e.sessionId),"aria-label":`${e.title||`Untitled chat`}, running${e.live?`: ${e.live}`:``}. Open this chat.`,children:[(0,X.jsx)(Ye,{engine:e.engine}),(0,X.jsx)(`span`,{className:Q.taskName,title:e.title||`Untitled chat`,children:e.title||`Untitled chat`}),(0,X.jsx)(`span`,{className:Q.taskDetail,title:e.live??void 0,children:e.live??``}),(0,X.jsx)(`span`,{className:Q.taskTime,children:e.startedAt?(0,X.jsx)(V,{since:e.startedAt}):`running`})]})},e.sessionId))})]})]})}function Ye({engine:e}){return(0,X.jsx)(`span`,{className:Q.engineTick,"data-engine":e,"aria-hidden":`true`,children:(0,X.jsx)(c,{engine:e,size:12})})}function Xe(e){let{session:t,seats:n,events:r,rootsData:i,rootsError:a,otherRunning:o,dispatchEnabled:s,onOpenSession:c,onHandoff:l,onOpenAccounts:u}=e,d=s?t?.status===`running`?`Available when the current turn finishes.`:null:`Sending is disabled on this server.`;return(0,X.jsx)(He,{presentation:e.presentation,windowWidth:e.windowWidth,columnWidth:e.columnWidth,sessionId:t?.id??null,roots:e.roots,turnFiles:e.turnFiles,onSendToChat:e.onSendToChat,onAddToMessage:e.onAddToMessage,renderTasks:()=>(0,X.jsx)(Ze,{sessionId:t?.id??null,otherChats:o,onOpenSession:c}),renderContext:e=>(0,X.jsx)(Le,{session:t,seats:n,events:r,roots:i,rootsError:a,visible:e,onHandoff:t?()=>l(t.id):void 0,handoffDisabledReason:d,onOpenAccounts:u})})}function Ze({sessionId:e,otherChats:t,onOpenSession:n}){let r=we(e),i=(0,J.useMemo)(()=>_e(r.items),[r.items]);return(0,X.jsx)(Je,{turnTasks:i,otherChats:t,hasSession:e!==null,onOpenSession:n})}export{Xe as DockHost};
|
|
2
|
-
//# sourceMappingURL=DockHost-BcEq2qaS.js.map
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Advanced-cVYTAsfB.js","assets/Epistemic-fycQTBRO.js","assets/StatusBadge-CXG3iNL4.js","assets/ConfirmDialog-CLUhzaBj.js","assets/Segmented-Wt1ATod9.js","assets/workspace-model-D-SLfads.js","assets/Meter-b69LM0mU.js","assets/Select-By-V9lMc.js","assets/fleet-model-DOK8ZtEt.js","assets/fleet-queries-BeEAqD6y.js","assets/global-BlI2BYa1.css","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/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.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-CyK31YRm.js";import{h as i,m as a}from"./global-y_exIyAP.js";import{t as o}from"./RefreshIndicator-SEFZlMB2.js";import{n as s,t as c}from"./Swimlane-LrslsGxw.js";import{n as l,t as u}from"./Funnel-B88_wpA4.js";import{L as d,kt as ee}from"./VerseConsoleApp-DXDv1aOi.js";import{n as f,u as p}from"./format-BmH2yWL6.js";import{t as m}from"./Tag-WSUIaMVy.js";import{n as te,t as h}from"./budget-queries-DFF-3ICg.js";import{t as g}from"./Button-DtE0rlWD.js";import{a as ne}from"./icons-CygCEFWs.js";import{n as re,s as _,t as ie}from"./AutonomyOffState-CpFYS3tQ.js";import{p as v}from"./cloud-model-CfRydq8N.js";import{n as y,r as b}from"./cloud-queries-DmptbjS8.js";import{t as x}from"./cloud.module-DOP-N4Ch.js";import{t as ae}from"./use-ticker-BoqFxRFG.js";import{a as oe,r as S}from"./overnight-queries-DJ4mZKSj.js";import{t as C}from"./nav-mimleI0R.js";import{i as w,l as T}from"./surface-data-C3UAQ4QX.js";import{n as se,t as ce}from"./actions-BZTidCXZ.js";import{a as le,i as E,n as D,r as O,t as k}from"./Surface-5bNA08tK.js";import{i as ue,n as de,r as fe,t as pe}from"./why-seat-model-Cau8qG6O.js";import{a as me,c as he,d as ge,f as A,i as _e,l as ve,n as j,o as M,r as N,s as P,t as F,u as ye}from"./live-model-D7hilYFk.js";var I=t(e(),1),L=n();function be({classes:e={}}){let t=a(b,{freshMs:15e3}),n=i(b);d(n,y);let r=t.data?.value??null;if(!r)return null;let o=v(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,L.jsxs)(`li`,{className:`${e.lane??``} ${x.laneChip}`,"data-active":o>0||void 0,title:s,"aria-label":`Cloud: ${o} running`,children:[(0,L.jsx)(`span`,{className:e.name,children:`Cloud`}),(0,L.jsx)(`span`,{className:e.sep,"aria-hidden":`true`,children:` · `}),(0,L.jsxs)(`span`,{className:e.slots,children:[o,` running`]})]})}var R={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`},z=36e5;function B(e,t,n){if(!e)return{kind:`loading`};let r=e.value;return r?r.state===`dark`&&!n?_(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,L.jsxs)(`li`,{className:R.lane,"data-off":e.slots===0||void 0,title:M(e)??void 0,children:[(0,L.jsx)(m,{engine:F[e.lane]}),(0,L.jsx)(`span`,{className:R.laneName,children:t.name}),(0,L.jsx)(`span`,{className:R.laneSep,"aria-hidden":`true`,children:` · `}),(0,L.jsx)(`span`,{className:R.laneSlots,children:t.slots})]})}function Se({live:e}){if(!e||e.lanes.length===0)return null;let t=me(e.lanes);return(0,L.jsxs)(`div`,{className:R.laneStrip,children:[(0,L.jsxs)(`ul`,{className:R.lanes,"aria-label":`Lanes: busy of slots`,children:[e.lanes.map(e=>(0,L.jsx)(xe,{lane:e},e.lane)),(0,L.jsx)(be,{classes:{lane:R.lane,name:R.laneName,sep:R.laneSep,slots:R.laneSlots}})]}),t.length>0?(0,L.jsx)(`ul`,{className:R.laneNotes,"aria-label":`Why lanes are limited`,children:t.map(e=>(0,L.jsxs)(`li`,{children:[e.all?null:(0,L.jsxs)(`span`,{className:R.laneNoteLanes,children:[e.lanes.map(e=>j[e]).join(`, `),`: `]}),f(e.reason)]},e.lanes.join(`,`)))}):null]})}function V({read:e,now:t,hours:n}){let r=e?.value??null,i=t-n*z,a=r?P(r.runs,i,t,{includeParked:!1}):[];return(0,L.jsx)(c,{title:`Live fleet`,description:`Lanes × slots, last ${n} h · bars coloured by phase or outcome · outlines are queued`,status:B(e,`Nothing ran in the last ${n} hours.`,a.length>0),lanes:a,from:i,to:t,now:t,toneOf:A})}function Ce({read:e}){let t=(e?.value??null)?.funnel??null,n=N(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,L.jsxs)(`div`,{className:R.stack,children:[(0,L.jsx)(u,{title:`Gate funnel`,description:i?`Proposals through G0–G7, ${i}`:`Proposals through the merge gates G0–G7`,status:B(e,`No proposal reached the gates in this window.`,n.length>0),stages:n}),(0,L.jsx)(l,{title:`Refusals by gate`,description:r.total?`${r.total} refusals · top reasons keep their colour`:`Why proposals stopped`,status:B(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,L.jsxs)(`div`,{className:R.decision,children:[(0,L.jsxs)(`p`,{className:R.decisionLead,children:[r?(0,L.jsxs)(L.Fragment,{children:[r.engine?(0,L.jsx)(m,{engine:r.engine}):null,(0,L.jsx)(`strong`,{children:r.label})]}):(0,L.jsx)(`strong`,{children:`No seat`}),(0,L.jsx)(`span`,{className:R.mode,children:e.mode})]}),(0,L.jsx)(`p`,{className:R.decisionWhy,children:pe(e)}),e.candidates.length>1?(0,L.jsxs)(`div`,{children:[(0,L.jsx)(E,{children:`Then`}),(0,L.jsx)(`ol`,{className:R.candidates,children:e.candidates.slice(+!!e.seatId).map(e=>(0,L.jsx)(`li`,{children:H(t,e).label},e))})]}):null,e.exclusions.length?(0,L.jsxs)(`div`,{children:[(0,L.jsx)(E,{children:`Held back`}),(0,L.jsx)(`ul`,{className:R.exclusions,"aria-label":`Held back seats`,children:e.exclusions.map(e=>(0,L.jsxs)(`li`,{children:[(0,L.jsx)(`span`,{className:R.excluded,children:H(t,e.seatId).label}),(0,L.jsx)(`span`,{className:R.excludedWhy,children:ue(e)}),(0,L.jsxs)(`span`,{className:R.excludedWhen,children:[`eligible again: `,de(fe(e),n)]})]},e.seatId))})]}):null]})}function we({read:e,preview:t,view:n,now:r}){let i=he(e?.value??null);return(0,L.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,L.jsx)(U,{decision:i.decision,view:n,now:r}):t?(0,L.jsx)(U,{decision:t,view:n,now:r}):(0,L.jsx)(D,{tone:`unknown`,children:`No routing decision yet. The router preview didn't answer.`})})}function Te({read:e,now:t}){let n=e?.value??null,r=n?ye(n.runs,t):{lanes:[],from:t-z,to:t+2*z,unknownRelease:0};return(0,L.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:B(e,`Nothing is parked.`,r.lanes.length>0),lanes:r.lanes,from:r.from,to:r.to,now:t,toneOf:A,formatTick:e=>new Date(e).toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`})})}function Ee({read:e,onOpenAdvanced:t,dark:n=!1}){let r=e?.value??null,i=r?.run??null;return(0,L.jsx)(k,{title:`Overnight`,caption:r?r.armed?`Armed`:`Not armed`:void 0,actions:(0,L.jsx)(`button`,{type:`button`,className:R.link,onClick:t,children:`Arm or stop in Advanced`}),children:e?r?!r.armed&&!i?(0,L.jsx)(D,{children:n?`Nothing armed.`:`Nothing armed. The fleet runs on its normal schedule.`}):(0,L.jsxs)(`div`,{className:R.overnight,children:[i?.stopRule?(0,L.jsx)(`p`,{className:R.overnightLead,children:oe(i.stopRule)}):null,(0,L.jsxs)(`dl`,{className:R.facts,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Started`}),(0,L.jsx)(`dd`,{children:i?.startedAt?p(i.startedAt):`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Iterations`}),(0,L.jsx)(`dd`,{children:i?.iterationsDone??`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Merged`}),(0,L.jsx)(`dd`,{children:i?i.merged.length:`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Discarded`}),(0,L.jsx)(`dd`,{children:i?i.discarded.length:`—`})]})]}),i?.activity?(0,L.jsxs)(`p`,{className:R.muted,children:[`Now: `,i.activity]}):null,i&&i.discarded.length?(0,L.jsx)(`ul`,{className:R.discarded,"aria-label":`Discarded work`,children:i.discarded.slice(0,3).map(e=>(0,L.jsxs)(`li`,{children:[(0,L.jsx)(`span`,{className:R.discardTitle,children:e.title}),(0,L.jsx)(`span`,{className:R.discardWhy,children:e.reason})]},e.id))}):null]}):(0,L.jsx)(D,{tone:`unknown`,children:e.reason??`The overnight lane did not answer.`}):(0,L.jsx)(`p`,{className:R.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 De(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,L.jsx)(`span`,{className:R.stage,"data-stage":`none`,children:`Not in grant`}):(0,L.jsxs)(`span`,{className:R.stage,"data-stage":e.stage,children:[e.stage===`merge`?`Merge`:`Propose`,e.enforcement===`local`?(0,L.jsx)(`span`,{className:R.stageNote,children:` · local checks`}):null]})}function q({row:e,actions:t}){let n=t.busy||t.readOnly;return e.holds.length?(0,L.jsx)(g,{size:`sm`,variant:`subtle`,disabled:n,"aria-label":`Resume ${e.repo}`,onClick:()=>t.act(()=>T({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,L.jsx)(g,{size:`sm`,variant:`ghost`,disabled:n,"aria-label":`Pause ${e.repo}`,onClick:()=>t.act(()=>T({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,L.jsxs)(`span`,{className:R.green,children:[(0,L.jsx)(`span`,{className:R.greenValue,children:e.greenPct7d===null?`—`:`${Math.round(e.greenPct7d)}%`}),(0,L.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,L.jsx)(`span`,{className:R.holds,children:e.holds.map(e=>(0,L.jsx)(`span`,{className:R.hold,"data-kind":e.kind,title:e.reason,children:De(e,t)},e.kind))}):(0,L.jsx)(`span`,{className:R.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 Oe({read:e,actions:t,now:n,compact:r}){let i=e?.value??null,a=i?.repos??[];return(0,L.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,L.jsx)(D,{children:`No repositories are enrolled.`}):r?(0,L.jsx)(`ul`,{className:R.repoCards,children:a.map(e=>(0,L.jsxs)(`li`,{className:R.repoCard,id:C(`repo-${e.repo}`),children:[(0,L.jsxs)(`div`,{className:R.repoCardHead,children:[(0,L.jsx)(`span`,{className:R.repoName,children:e.repo}),(0,L.jsx)(q,{row:e,actions:t})]}),(0,L.jsxs)(`dl`,{className:R.facts,children:[(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Stage`}),(0,L.jsx)(`dd`,{children:(0,L.jsx)(K,{row:e})})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Last merge`}),(0,L.jsx)(`dd`,{children:e.lastMergeAt?p(e.lastMergeAt):`—`})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Today`}),(0,L.jsx)(`dd`,{children:Z(e)})]}),(0,L.jsxs)(`div`,{children:[(0,L.jsx)(`dt`,{children:`Green 7d`}),(0,L.jsx)(`dd`,{children:(0,L.jsx)(J,{row:e})})]})]}),(0,L.jsx)(Y,{row:e,now:n})]},e.repo))}):(0,L.jsx)(`div`,{className:R.tableWrap,children:(0,L.jsxs)(`table`,{className:R.table,children:[(0,L.jsx)(`caption`,{className:`visually-hidden`,children:`Enrolled repositories`}),(0,L.jsx)(`thead`,{children:(0,L.jsxs)(`tr`,{children:[(0,L.jsx)(`th`,{scope:`col`,children:`Repository`}),(0,L.jsx)(`th`,{scope:`col`,children:`Stage`}),(0,L.jsx)(`th`,{scope:`col`,children:`Last merge`}),(0,L.jsx)(`th`,{scope:`col`,className:R.num,children:`Today`}),(0,L.jsx)(`th`,{scope:`col`,children:`Post-merge green · 14d`}),(0,L.jsx)(`th`,{scope:`col`,className:R.num,children:`Open PRs`}),(0,L.jsx)(`th`,{scope:`col`,children:`Holds`}),(0,L.jsx)(`th`,{scope:`col`,children:(0,L.jsx)(`span`,{className:`visually-hidden`,children:`Action`})})]})}),(0,L.jsx)(`tbody`,{children:a.map(e=>(0,L.jsxs)(`tr`,{id:C(`repo-${e.repo}`),"data-held":e.holds.length>0||void 0,children:[(0,L.jsx)(`th`,{scope:`row`,className:R.repoName,children:e.repo}),(0,L.jsx)(`td`,{children:(0,L.jsx)(K,{row:e})}),(0,L.jsx)(`td`,{children:e.lastMergeAt?p(e.lastMergeAt):`—`}),(0,L.jsx)(`td`,{className:R.num,children:Z(e)}),(0,L.jsx)(`td`,{children:(0,L.jsx)(J,{row:e})}),(0,L.jsx)(`td`,{className:R.num,children:e.openFleetPrs??`—`}),(0,L.jsx)(`td`,{children:(0,L.jsx)(Y,{row:e,now:n})}),(0,L.jsx)(`td`,{className:R.actionCell,children:(0,L.jsx)(q,{row:e,actions:t})})]},e.repo))})]})}):(0,L.jsx)(D,{tone:`unknown`,children:e.reason??`The live fleet view did not answer.`}):(0,L.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Reading repositories…`}),i&&X(i.mirrors)?(0,L.jsx)(`p`,{className:R.muted,children:X(i.mirrors)}):null]})}var Q=5e3,$=3e4,ke=(0,I.lazy)(()=>r(()=>import(`./Advanced-cVYTAsfB.js`).then(e=>e.t).then(e=>({default:()=>(0,L.jsx)(e.FleetAdvanced,{embedded:!0})})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])));function Ae(){let{compact:e}=ee(),t=a(w),n=a(S),r=a(te,{freshMs:15e3}),s=a(h,{freshMs:15e3}),c=i(w),l=i(S),u=i(h);d(c,Q),d(()=>{l(),u()},$);let f=ae(15e3),p=se(),[m,g]=(0,I.useState)(!1),_=(0,I.useId)(),v=t.data?.value??null,y=re(),b=y!=null&&v!==null&&ve(v);function x(){g(!0),requestAnimationFrame(()=>document.getElementById(_)?.scrollIntoView?.({block:`start`,behavior:`smooth`}))}return(0,L.jsxs)(le,{title:`Fleet`,actions:t.status===`refreshing`?(0,L.jsx)(o,{}):null,lead:(0,L.jsxs)(L.Fragment,{children:[(0,L.jsx)(ce,{actions:p}),(0,L.jsx)(Se,{live:v}),y?(0,L.jsx)(ie,{state:y,here:`fleet`}):null]}),children:[b?null:(0,L.jsx)(O,{span:12,children:(0,L.jsx)(V,{read:t.data,now:f,hours:e?6:12})}),b?null:(0,L.jsx)(O,{span:7,children:(0,L.jsx)(Ce,{read:t.data})}),(0,L.jsx)(O,{span:b?6:5,children:(0,L.jsx)(we,{read:t.data,preview:s.data??null,view:r.data??null,now:f})}),b?null:(0,L.jsx)(O,{span:7,children:(0,L.jsx)(Te,{read:t.data,now:f})}),(0,L.jsx)(O,{span:b?6:5,children:(0,L.jsx)(Ee,{read:n.data,onOpenAdvanced:x,dark:v?.state===`dark`})}),(0,L.jsx)(O,{span:12,children:(0,L.jsx)(Oe,{read:t.data,actions:p,now:f,compact:e})}),(0,L.jsx)(O,{span:12,children:(0,L.jsxs)(`div`,{className:R.advanced,children:[(0,L.jsxs)(`button`,{type:`button`,className:R.disclosure,"aria-expanded":m,"aria-controls":_,onClick:()=>g(e=>!e),children:[(0,L.jsx)(ne,{className:R.chevron,width:14,height:14,"aria-hidden":`true`}),`Advanced`,(0,L.jsx)(`span`,{className:R.disclosureNote,children:`daemon, overnight, local runtime, caps, scope, activity, safety, goals`})]}),(0,L.jsx)(`div`,{id:_,hidden:!m,children:m?(0,L.jsx)(I.Suspense,{fallback:(0,L.jsx)(`p`,{className:R.muted,"aria-busy":`true`,children:`Loading the advanced panels…`}),children:(0,L.jsx)(ke,{})}):null})]})}),p.dialogs]})}export{Q as FLEET_POLL_MS,$ as FLEET_SLOW_POLL_MS,Ae as FleetSection};
|
|
3
|
-
//# sourceMappingURL=FleetSection-BG8iGraG.js.map
|