@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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandPalette-C5lDDKN0.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/palette-model.ts","../../../../../../src/web-ui/routes/verse/shell/CommandPalette.module.css","../../../../../../src/web-ui/routes/verse/shell/CommandPalette.tsx"],"sourcesContent":["/**\n * routes/verse/shell/palette-model.ts — the ⌘K palette as data (unit C1;\n * SPEC-310C §1 \"⌘K palette\"). Pure: items in, ranked groups out.\n *\n * Needs you › Chats (running first) › Actions › Go to › Seats & Apps › Projects\n *\n * `>` limits results to actions, `#` to chats (command-catalog PALETTE_PREFIXES).\n * An empty query shows what needs you (top 3) and the last 5 actions run.\n * Tab on an item with an argument (\"New chat on…\") lists its candidates.\n *\n * Ranking is a small fuzzy matcher, not a library: every query word must\n * match (title or keywords), contiguous and word-start matches win, and the\n * catalog's order breaks ties — so \"stop\" puts \"Stop running chats…\" above a\n * chat that merely contains an s, t, o and p.\n */\nimport type { VerseProject, VerseSeat, VerseSession } from '../../../data/api-types.js';\nimport {\n ENGINE_MONOGRAM,\n type NeedsYouItem,\n type VerseActivityRunning,\n} from '../../../../core/verse/workbench-types.js';\nimport {\n formatChord,\n paletteCommands,\n PALETTE_GROUPS,\n PALETTE_PREFIXES,\n PALETTE_RECENT_LIMIT,\n findCommand,\n type CommandArgumentKind,\n type KeyPlatform,\n type PaletteGroupId,\n type WorkbenchCommand,\n} from './command-catalog.js';\n\nexport type PaletteItemKind = 'needs-you' | 'chat' | 'command' | 'seat' | 'project' | 'argument';\n\nexport interface PaletteItem {\n /** Unique across the whole list (React key + active-descendant id). */\n key: string;\n kind: PaletteItemKind;\n group: PaletteGroupId | 'recent';\n title: string;\n /** Muted second part of the row. */\n subtitle: string | null;\n /** Right-aligned shortcut (\"⇧⌘B\"), when the command has one. */\n shortcut: string | null;\n /** A one-letter engine monogram for chats and seats; null otherwise. */\n monogram: string | null;\n engine: VerseSession['engine'] | null;\n /** Extra words that match but are not shown. */\n keywords: readonly string[];\n /** Tab fills this. */\n argument: { kind: CommandArgumentKind; prompt: string } | null;\n /** Painted as a warning (running chat, high-severity item). */\n tone: 'neutral' | 'running' | 'warn' | 'danger';\n /** What Enter does — interpreted by the component. */\n payload:\n | { kind: 'needs-you'; itemId: string }\n | { kind: 'chat'; sessionId: string }\n | { kind: 'command'; commandId: string }\n | { kind: 'seat'; seatId: string; label: string }\n | { kind: 'project'; path: string; name: string }\n | { kind: 'argument'; argument: { kind: CommandArgumentKind; id: string; label: string } };\n}\n\nexport interface PaletteInput {\n needsYou: readonly NeedsYouItem[];\n running: readonly VerseActivityRunning[];\n sessions: readonly VerseSession[];\n seats: readonly VerseSeat[];\n projects: readonly VerseProject[];\n recentActions: readonly string[];\n platform: KeyPlatform;\n now?: number;\n}\n\nexport const GROUP_LABEL: Readonly<Record<PaletteGroupId | 'recent', string>> = {\n ...(Object.fromEntries(PALETTE_GROUPS.map((g) => [g.id, g.label])) as Record<PaletteGroupId, string>),\n recent: 'Recent',\n};\n\nconst GROUP_ORDER: readonly (PaletteGroupId | 'recent')[] = [\n 'needs-you',\n 'recent',\n ...PALETTE_GROUPS.map((g) => g.id).filter((id) => id !== 'needs-you'),\n];\n\n/** Per-group caps with a query (the palette is for jumping, not browsing). */\nconst GROUP_CAP: Readonly<Record<PaletteGroupId | 'recent', number>> = {\n 'needs-you': 5,\n recent: PALETTE_RECENT_LIMIT,\n chats: 8,\n actions: 8,\n 'go-to': 6,\n 'seats-apps': 5,\n projects: 5,\n};\n\n// ---------------------------------------------------------------------------\n// Matching\n// ---------------------------------------------------------------------------\n\nfunction isWordStart(text: string, index: number): boolean {\n if (index === 0) return true;\n const prev = text[index - 1]!;\n return /[\\s\\-_/.:·›,(]/.test(prev) || (/[a-z]/.test(prev) && /[A-Z]/.test(text[index]!));\n}\n\n/**\n * Score one query word against one text; null = no match. Contiguous beats\n * scattered, word-start beats mid-word, earlier beats later.\n */\nexport function fuzzyScore(word: string, text: string): number | null {\n const q = word.toLowerCase();\n if (!q) return 0;\n const lower = text.toLowerCase();\n const at = lower.indexOf(q);\n if (at >= 0) {\n // No length penalty: two titles that both START with the word tie, and\n // the catalog's order decides (\"stop\" → Stop running chats… before Stop\n // the fleet…, the everyday action before the drastic one).\n let score = 1_000 - at * 4;\n if (isWordStart(text, at)) score += 400;\n if (at === 0) score += 200;\n return score;\n }\n // Subsequence: every character in order.\n let score = 0;\n let from = 0;\n let prevHit = -2;\n for (const ch of q) {\n const hit = lower.indexOf(ch, from);\n if (hit < 0) return null;\n score += hit === prevHit + 1 ? 30 : 5;\n if (isWordStart(text, hit)) score += 20;\n score -= Math.min(20, hit - from);\n prevHit = hit;\n from = hit + 1;\n }\n return score;\n}\n\n/** Every word must match the title or a keyword; the best field per word counts. */\nexport function matchItem(item: Pick<PaletteItem, 'title' | 'subtitle' | 'keywords'>, query: string): number | null {\n const words = query.trim().split(/\\s+/).filter(Boolean);\n if (words.length === 0) return 0;\n let total = 0;\n for (const word of words) {\n let best: number | null = fuzzyScore(word, item.title);\n for (const field of [item.subtitle ?? '', ...item.keywords]) {\n if (!field) continue;\n const s = fuzzyScore(word, field);\n // A keyword / subtitle hit counts, but less than the title itself.\n if (s !== null) best = Math.max(best ?? Number.NEGATIVE_INFINITY, s * 0.6);\n }\n if (best === null) return null;\n total += best;\n }\n return total;\n}\n\n// ---------------------------------------------------------------------------\n// Items\n// ---------------------------------------------------------------------------\n\nfunction elapsed(startedAt: string, now: number): string {\n const s = Math.max(0, Math.round((now - Date.parse(startedAt)) / 1000));\n if (!Number.isFinite(s)) return 'running';\n if (s < 60) return `running ${s}s`;\n const m = Math.floor(s / 60);\n if (m < 60) return `running ${m}m ${String(s % 60).padStart(2, '0')}s`;\n return `running ${Math.floor(m / 60)}h ${m % 60}m`;\n}\n\nfunction relative(iso: string, now: number): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return '';\n const m = Math.round((now - t) / 60_000);\n if (m < 1) return 'just now';\n if (m < 60) return `${m}m ago`;\n const h = Math.round(m / 60);\n if (h < 36) return `${h}h ago`;\n return `${Math.round(h / 24)}d ago`;\n}\n\nfunction projectName(path: string): string {\n const parts = path.split(/[\\\\/]/).filter(Boolean);\n return parts[parts.length - 1] ?? path;\n}\n\nexport function commandItem(command: WorkbenchCommand, platform: KeyPlatform, group: PaletteGroupId | 'recent'): PaletteItem {\n const chord = command.keys[0];\n return {\n key: `${group}:cmd:${command.id}`,\n kind: 'command',\n group,\n title: command.title,\n subtitle: command.scope === 'chat' || command.scope === 'composer' ? 'in Chat' : command.surface === 'command' ? 'on Command' : command.surface === 'mind' ? 'on Mind' : null,\n shortcut: chord ? formatChord(chord, platform) : null,\n monogram: null,\n engine: null,\n keywords: [...(command.keywords ?? []), command.section.toLowerCase()],\n argument: command.argument ? { ...command.argument } : null,\n tone: command.guard?.confirm.destructive ? 'danger' : 'neutral',\n payload: { kind: 'command', commandId: command.id },\n };\n}\n\n/** Every candidate item, before the query. */\nexport function buildPaletteItems(input: PaletteInput): PaletteItem[] {\n const now = input.now ?? Date.now();\n const items: PaletteItem[] = [];\n\n for (const n of input.needsYou) {\n items.push({\n key: `needs-you:${n.id}`,\n kind: 'needs-you',\n group: 'needs-you',\n title: n.title,\n subtitle: n.subject.repo ?? n.subject.seatId ?? null,\n shortcut: null,\n monogram: n.subject.engine ? ENGINE_MONOGRAM[n.subject.engine] : null,\n engine: n.subject.engine,\n keywords: [n.kind.replace(/-/g, ' '), n.source, 'needs you'],\n argument: null,\n tone: n.severity === 'high' ? 'danger' : n.severity === 'warn' ? 'warn' : 'neutral',\n payload: { kind: 'needs-you', itemId: n.id },\n });\n }\n\n const running = new Map(input.running.map((r) => [r.sessionId, r] as const));\n const sessions = [...input.sessions].sort((a, b) => {\n const ra = running.has(a.id) || a.status === 'running' ? 0 : 1;\n const rb = running.has(b.id) || b.status === 'running' ? 0 : 1;\n if (ra !== rb) return ra - rb;\n return a.updatedAt < b.updatedAt ? 1 : a.updatedAt > b.updatedAt ? -1 : 0;\n });\n for (const s of sessions) {\n const live = running.get(s.id);\n const isRunning = !!live || s.status === 'running';\n const status = isRunning ? (live ? elapsed(live.startedAt, now) : 'running') : s.status === 'error' ? 'failed' : relative(s.updatedAt, now);\n items.push({\n key: `chat:${s.id}`,\n kind: 'chat',\n group: 'chats',\n title: s.title || 'Untitled chat',\n subtitle: [projectName(s.projectPath), status].filter(Boolean).join(' · '),\n shortcut: null,\n monogram: ENGINE_MONOGRAM[s.engine],\n engine: s.engine,\n keywords: [s.model, s.seatId, projectName(s.projectPath)],\n argument: null,\n tone: isRunning ? 'running' : s.status === 'error' ? 'warn' : 'neutral',\n payload: { kind: 'chat', sessionId: s.id },\n });\n }\n\n for (const command of paletteCommands('actions')) items.push(commandItem(command, input.platform, 'actions'));\n for (const command of paletteCommands('go-to')) items.push(commandItem(command, input.platform, 'go-to'));\n\n for (const seat of input.seats) {\n items.push({\n key: `seat:${seat.id}`,\n kind: 'seat',\n group: 'seats-apps',\n title: `New chat on ${seat.label}`,\n subtitle: seat.id,\n shortcut: null,\n monogram: ENGINE_MONOGRAM[seat.engine],\n engine: seat.engine,\n keywords: [seat.engine, seat.label, 'seat', 'account'],\n argument: null,\n tone: 'neutral',\n payload: { kind: 'seat', seatId: seat.id, label: seat.label },\n });\n }\n\n for (const project of input.projects) {\n items.push({\n key: `project:${project.path}`,\n kind: 'project',\n group: 'projects',\n title: `New chat in ${project.name || projectName(project.path)}`,\n subtitle: project.enrolled ? 'enrolled in the fleet' : null,\n shortcut: null,\n monogram: null,\n engine: null,\n keywords: [project.name, projectName(project.path)],\n argument: null,\n tone: 'neutral',\n payload: { kind: 'project', path: project.path, name: project.name || projectName(project.path) },\n });\n }\n\n return items;\n}\n\n/** The candidates Tab offers for an argument. */\nexport function argumentItems(kind: CommandArgumentKind, input: PaletteInput): PaletteItem[] {\n const base = (id: string, label: string, subtitle: string | null, monogram: string | null, engine: PaletteItem['engine']): PaletteItem => ({\n key: `arg:${kind}:${id}`,\n kind: 'argument',\n group: 'actions',\n title: label,\n subtitle,\n shortcut: null,\n monogram,\n engine,\n keywords: [id],\n argument: null,\n tone: 'neutral',\n payload: { kind: 'argument', argument: { kind, id, label } },\n });\n switch (kind) {\n case 'seat':\n return input.seats.map((s) => base(s.id, s.label, s.id, ENGINE_MONOGRAM[s.engine], s.engine));\n case 'project':\n return input.projects.map((p) => base(p.path, p.name || projectName(p.path), null, null, null));\n case 'session':\n return input.sessions.map((s) => base(s.id, s.title || 'Untitled chat', projectName(s.projectPath), ENGINE_MONOGRAM[s.engine], s.engine));\n case 'section':\n return [];\n default:\n return [];\n }\n}\n\nexport interface PaletteGroup {\n id: PaletteGroupId | 'recent';\n label: string;\n items: PaletteItem[];\n}\n\nexport interface PaletteView {\n groups: PaletteGroup[];\n /** Flattened, in display order — what ↑/↓ walks. */\n flat: PaletteItem[];\n /** The prefix in force (`>` / `#`), if any. */\n prefix: '>' | '#' | null;\n /**\n * Index into `flat` of the strongest match — what a fresh query highlights,\n * so Enter runs it. Groups keep their fixed order, which means the best hit\n * can sit in a LATER group: \"usage\" hits the resource-bar toggle's\n * \"usage bars\" keyword in Actions above \"Open Usage\" in Go to, and\n * highlighting row 0 made Enter toggle the bar instead of opening Usage.\n * 0 for an empty query (the rows there are unscored).\n */\n best: number;\n}\n\n/** Items → ranked, grouped, capped view for `rawQuery`. */\nexport function paletteView(items: readonly PaletteItem[], rawQuery: string, recentActions: readonly string[], platform: KeyPlatform): PaletteView {\n let query = rawQuery;\n let prefix: '>' | '#' | null = null;\n const first = query.trimStart().charAt(0);\n if (first === '>' || first === '#') {\n prefix = first;\n query = query.trimStart().slice(1);\n }\n const only: PaletteGroupId | null = prefix ? PALETTE_PREFIXES[prefix] : null;\n const trimmed = query.trim();\n\n const groups = new Map<PaletteGroupId | 'recent', Array<{ item: PaletteItem; score: number; order: number }>>();\n const push = (item: PaletteItem, score: number, order: number) => {\n const list = groups.get(item.group) ?? [];\n list.push({ item, score, order });\n groups.set(item.group, list);\n };\n\n if (trimmed === '' && !prefix) {\n // Empty query: what needs you, then what you did last.\n items.filter((i) => i.group === 'needs-you').slice(0, 3).forEach((item, order) => push(item, 0, order));\n const recent = recentActions.map((id) => findCommand(id)).filter((c): c is WorkbenchCommand => c !== null && c.group !== null);\n const shown = recent.length > 0 ? recent : (['chat.new', 'needs-you.open', 'shortcuts.open'] as const).map((id) => findCommand(id)!);\n shown.slice(0, PALETTE_RECENT_LIMIT).forEach((command, order) => push(commandItem(command, platform, 'recent'), 0, order));\n } else {\n items.forEach((item, order) => {\n if (only && item.group !== only) return;\n const score = trimmed === '' ? 0 : matchItem(item, trimmed);\n if (score === null) return;\n push(item, score, order);\n });\n }\n\n const out: PaletteGroup[] = [];\n const flatScores: number[] = [];\n for (const id of GROUP_ORDER) {\n const list = groups.get(id);\n if (!list || list.length === 0) continue;\n // Chats: running first (SPEC-310C §1), then by match. Everything else by\n // match, with catalog / recency order breaking ties.\n const runRank = (e: { item: PaletteItem }) => (id === 'chats' && e.item.tone === 'running' ? 0 : 1);\n list.sort((a, b) => runRank(a) - runRank(b) || b.score - a.score || a.order - b.order);\n const cap = prefix ? 50 : GROUP_CAP[id];\n const shown = list.slice(0, cap);\n for (const e of shown) flatScores.push(e.score);\n out.push({ id, label: GROUP_LABEL[id], items: shown.map((e) => e.item) });\n }\n // Strictly greater: on a tie the earlier row (group order, then rank) wins.\n let best = 0;\n if (trimmed !== '') {\n flatScores.forEach((score, i) => {\n if (score > flatScores[best]!) best = i;\n });\n }\n return { groups: out, flat: out.flatMap((g) => g.items), prefix, best };\n}\n","/* ⌘K — a raised panel over a dimmed workbench. Hairlines, one accent (the\n highlighted row), engine identity only as a monogram tile. */\n\n.backdrop {\n position: fixed;\n inset: 0;\n z-index: var(--z-command-palette);\n display: flex;\n align-items: flex-start;\n justify-content: center;\n padding: 12vh var(--space-4) var(--space-4);\n background: var(--bg-overlay);\n animation: fade var(--duration-fast) var(--ease-standard);\n}\n\n.panel {\n display: flex;\n flex-direction: column;\n width: min(640px, 100%);\n max-height: min(560px, 72vh);\n overflow: hidden;\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-xl);\n box-shadow: var(--shadow-xl);\n animation: rise var(--duration-base) var(--ease-decelerate);\n}\n\n.field {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: 0 var(--space-4);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.crumb {\n flex: none;\n padding: 2px var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--bg-selected);\n color: var(--text-primary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n white-space: nowrap;\n}\n\n.input {\n flex: 1;\n min-width: 0;\n /* The palette's search field is a notch taller than a full control, so it\n reads as the palette's title: control + 20px = 52px comfortable, 48px\n compact. Derived rather than literal so Density reaches it. */\n height: calc(var(--control-h) + var(--space-5));\n border: 0;\n background: transparent;\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n}\n.input::placeholder { color: var(--text-tertiary); }\n.input:focus-visible { outline: none; box-shadow: none; }\n\n.list {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n overscroll-behavior: contain;\n padding: var(--space-1) var(--space-2) var(--space-2);\n}\n\n.group + .group { margin-top: var(--space-1); }\n\n.groupLabel {\n padding: var(--space-2) var(--space-2) var(--space-1);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.item {\n display: grid;\n grid-template-columns: 24px minmax(0, 1fr) auto;\n align-items: center;\n column-gap: var(--space-3);\n /* A list row plus its 4px+4px padding: 40px comfortable, 34px compact. */\n min-height: calc(var(--density-row) + var(--space-2));\n padding: var(--space-1) var(--space-2);\n border-radius: var(--radius-md);\n color: var(--text-primary);\n cursor: pointer;\n}\n.item[aria-selected='true'] { background: var(--bg-selected); }\n\n.lead {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n/* Engine identity: a letter on a tile with a 2px engine tick — never a logo.\n Its 20px is intrinsic glyph geometry (a square identity mark, like Apps'\n monogram tile), not a control height, so it does not follow Density. */\n.monogram {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 20px;\n height: 20px;\n border-radius: var(--radius-sm);\n background: var(--bg-hover);\n box-shadow: inset 2px 0 0 var(--text-tertiary);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.monogram[data-engine='claude'] { box-shadow: inset 2px 0 0 var(--engine-claude); }\n.monogram[data-engine='codex'] { box-shadow: inset 2px 0 0 var(--engine-codex); }\n.monogram[data-engine='grok'] { box-shadow: inset 2px 0 0 var(--engine-grok); }\n.monogram[data-engine='local'] { box-shadow: inset 2px 0 0 var(--engine-local); }\n\n.bullet {\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n.bullet[data-kind='needs-you'] { background: var(--status-warning-solid); }\n\n.text {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n min-width: 0;\n}\n\n.title {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n.subtitle {\n flex: 0 1 auto;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.item[data-tone='running'] .subtitle { color: var(--status-running-fg); }\n.item[data-tone='warn'] .subtitle { color: var(--status-warning-fg); }\n.item[data-tone='danger'] .bullet { background: var(--status-danger-solid); }\n\n.trail {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n}\n\n/* <kbd> keycap: a non-interactive glyph sized to its chord (20px), not a control. */\n.key {\n display: inline-flex;\n align-items: center;\n min-width: 20px;\n height: 20px;\n padding: 0 var(--space-1);\n justify-content: center;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n background: var(--bg-surface);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n color: var(--text-secondary);\n}\n\n.empty {\n padding: var(--space-8) var(--space-4);\n text-align: center;\n font-size: var(--text-sm-size);\n color: var(--text-tertiary);\n}\n\n.foot {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-4);\n padding: var(--space-2) var(--space-4);\n border-top: 1px solid var(--border-subtle);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n}\n.foot span { display: inline-flex; align-items: center; gap: var(--space-1); }\n\n@keyframes fade { from { opacity: 0; } }\n@keyframes rise { from { opacity: 0; transform: translateY(-4px); } }\n\n/* Phone: a full-width sheet from the top; no footer (no keyboard). */\n@media (max-width: 479.98px) {\n .backdrop { padding: var(--space-2); align-items: stretch; }\n .panel { width: 100%; max-height: 100%; border-radius: var(--radius-lg); }\n .foot { display: none; }\n .text { flex-direction: column; align-items: stretch; gap: 0; }\n /* A touch target on a phone — fixed on purpose: the DESKTOP density switch\n must not shrink a finger target (same rule as VerseApp's bottom bar). */\n .item { min-height: 48px; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .backdrop,\n :root:not([data-motion='full']) .panel { animation: none; }\n}\n:root[data-motion='reduce'] .backdrop,\n:root[data-motion='reduce'] .panel { animation: none; }\n","/**\n * routes/verse/shell/CommandPalette.tsx — ⌘K (unit C1; SPEC-310C §1).\n *\n * Lives in the SHELL chunk (VerseApp imports it statically), so opening it\n * costs one render — no chunk to fetch, no surface to mount — which is how\n * it opens inside the 50 ms budget. It NEVER switches surface on its own:\n * opening it on Fleet leaves Fleet on screen (the pre-3.10 switcher jumped to\n * Chat first). Only running an item navigates, and only when that is what\n * the item is.\n *\n * Keys (the palette owns every key while open):\n * ↑ ↓ move · ↩ run · ⇥ fill the argument (\"New chat on…\" → a seat) ·\n * ⌫ on an empty argument query steps back · Esc closes (or leaves the\n * argument step) · ⌘K closes.\n *\n * Accessibility: a combobox driving a listbox through aria-activedescendant\n * (focus never leaves the input); group headings are presentational labels\n * the options reference, and the result count is announced politely.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useFocusTrap } from '../../../components/primitives/focus-trap.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { verseBootstrapQuery, verseSessionsQuery } from '../verse-queries.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { ReturnKeyIcon } from '../verse-icons.js';\nimport { closeVerseOverlay, openVerseNeedsYou, openVerseSession, requestVerseCommand } from '../verse-ui-store.js';\nimport { detectKeyPlatform, findCommand, type WorkbenchCommand } from './command-catalog.js';\nimport { argumentItems, buildPaletteItems, paletteView, type PaletteItem } from './palette-model.js';\nimport { executeCatalogCommand } from './run-command.js';\nimport { useActivity } from './useActivity.js';\nimport styles from './CommandPalette.module.css';\nimport { ProviderLogo } from '../../../components/primitives/ProviderLogo.js';\n\nexport interface CommandPaletteProps {\n onClose?: () => void;\n}\n\nexport function CommandPalette({ onClose = closeVerseOverlay }: CommandPaletteProps) {\n const ui = useVerseUi();\n const activity = useActivity();\n const sessions = useQuery(verseSessionsQuery);\n const bootstrap = useQuery(verseBootstrapQuery);\n const platform = useMemo(() => detectKeyPlatform(), []);\n const [query, setQuery] = useState('');\n const [active, setActive] = useState(0);\n const [argFor, setArgFor] = useState<WorkbenchCommand | null>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const listRef = useRef<HTMLDivElement>(null);\n const listId = useId();\n const labelId = useId();\n\n // The trap owns Escape (it listens in the capture phase, before the input\n // sees the key), so \"Esc leaves the argument step first\" lives here.\n const argRef = useRef<WorkbenchCommand | null>(null);\n argRef.current = argFor;\n const trapClose = useCallback(() => {\n if (argRef.current) setArgFor(null);\n else onClose();\n }, [onClose]);\n useFocusTrap({ open: true, containerRef: panelRef, onClose: trapClose, initialFocusRef: inputRef });\n\n const input = useMemo(\n () => ({\n needsYou: activity.data?.needsYou ?? [],\n running: activity.data?.running ?? [],\n sessions: sessions.data ?? bootstrap.data?.sessions ?? [],\n seats: bootstrap.data?.seats ?? [],\n projects: bootstrap.data?.projects ?? [],\n recentActions: ui.recentActions,\n platform,\n }),\n [activity.data, sessions.data, bootstrap.data, ui.recentActions, platform],\n );\n\n const view = useMemo(() => {\n if (argFor?.argument) {\n const candidates = argumentItems(argFor.argument.kind, input);\n const shown = paletteView(candidates, `>${query}`, [], platform);\n return { ...shown, prefix: null };\n }\n return paletteView(buildPaletteItems(input), query, ui.recentActions, platform);\n }, [argFor, input, query, ui.recentActions, platform]);\n\n // A new query highlights its best match (see PaletteView.best); a data\n // refresh under an unchanged query only keeps the highlight on a real row,\n // so it never yanks a highlight the operator arrowed to.\n const highlightBestRef = useRef(false);\n useEffect(() => {\n if (highlightBestRef.current) {\n highlightBestRef.current = false;\n setActive(view.best);\n return;\n }\n setActive((i) => (view.flat.length === 0 ? 0 : Math.min(i, view.flat.length - 1)));\n }, [view]);\n\n useEffect(() => {\n const row = listRef.current?.querySelector<HTMLElement>(`[data-index=\"${active}\"]`);\n row?.scrollIntoView?.({ block: 'nearest' });\n }, [active]);\n\n function enterArgument(command: WorkbenchCommand) {\n setArgFor(command);\n setQuery('');\n setActive(0);\n }\n\n function run(item: PaletteItem | undefined) {\n if (!item) return;\n const payload = item.payload;\n if (payload.kind === 'command') {\n const command = findCommand(payload.commandId);\n // Enter on an argument command asks for the argument, like Tab.\n if (command?.argument) {\n enterArgument(command);\n return;\n }\n onClose();\n executeCatalogCommand(payload.commandId, { via: 'palette' });\n return;\n }\n onClose();\n switch (payload.kind) {\n case 'needs-you':\n openVerseNeedsYou({ split: 'all', focusId: payload.itemId });\n break;\n case 'chat':\n openVerseSession(payload.sessionId);\n break;\n case 'seat':\n executeCatalogCommand('chat.new-on', { via: 'palette', argument: { kind: 'seat', id: payload.seatId, label: payload.label } });\n break;\n case 'project':\n requestVerseCommand('new-chat', { projectPath: payload.path });\n break;\n case 'argument':\n if (argFor) executeCatalogCommand(argFor.id, { via: 'palette', argument: payload.argument });\n break;\n default:\n break;\n }\n }\n\n function onKeyDown(event: ReactKeyboardEvent<HTMLInputElement>) {\n const count = view.flat.length;\n const key = event.key;\n if ((event.metaKey || event.ctrlKey) && key.toLowerCase() === 'k') {\n event.preventDefault();\n onClose();\n return;\n }\n switch (key) {\n case 'ArrowDown':\n event.preventDefault();\n if (count > 0) setActive((i) => (i + 1) % count);\n return;\n case 'ArrowUp':\n event.preventDefault();\n if (count > 0) setActive((i) => (i - 1 + count) % count);\n return;\n case 'Home':\n if (count > 0) { event.preventDefault(); setActive(0); }\n return;\n case 'End':\n if (count > 0) { event.preventDefault(); setActive(count - 1); }\n return;\n case 'Enter':\n event.preventDefault();\n run(view.flat[active]);\n return;\n case 'Tab': {\n // Tab never moves focus out of the palette: it fills an argument or does nothing.\n event.preventDefault();\n const item = view.flat[active];\n const command = item?.payload.kind === 'command' ? findCommand(item.payload.commandId) : null;\n if (command?.argument) enterArgument(command);\n return;\n }\n case 'Backspace':\n if (argFor && query === '') {\n event.preventDefault();\n setArgFor(null);\n }\n return;\n case 'Escape':\n event.preventDefault();\n event.stopPropagation();\n if (argFor) setArgFor(null);\n else onClose();\n return;\n default:\n return;\n }\n }\n\n const activeItem = view.flat[active];\n const placeholder = argFor?.argument\n ? `${argFor.argument.prompt}…`\n : 'Search chats, actions and places';\n let index = -1;\n\n return createPortal(\n <div className={styles.backdrop} onMouseDown={(e) => e.target === e.currentTarget && onClose()}>\n <div ref={panelRef} className={styles.panel} role=\"dialog\" aria-modal=\"true\" aria-labelledby={labelId} data-verse-overlay=\"palette\">\n <h2 id={labelId} className=\"visually-hidden\">Command palette</h2>\n <div className={styles.field}>\n {argFor ? (\n <span className={styles.crumb}>\n {argFor.title.replace(/…$/, '')}\n <span aria-hidden=\"true\"> ›</span>\n </span>\n ) : null}\n <input\n ref={inputRef}\n className={styles.input}\n value={query}\n placeholder={placeholder}\n aria-label={argFor?.argument ? argFor.argument.prompt : 'Search commands'}\n role=\"combobox\"\n aria-expanded=\"true\"\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeItem ? `${listId}-${active}` : undefined}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n spellCheck={false}\n onChange={(e) => {\n setQuery(e.target.value);\n highlightBestRef.current = true;\n }}\n onKeyDown={onKeyDown}\n />\n </div>\n <div ref={listRef} id={listId} className={styles.list} role=\"listbox\" aria-label=\"Results\">\n {view.flat.length === 0 ? (\n <p className={styles.empty}>\n {argFor ? `No ${argFor.argument?.prompt.toLowerCase() ?? 'match'} matches “${query}”.` : `Nothing matches “${query.trim()}”.`}\n </p>\n ) : (\n view.groups.map((group) => (\n <div key={group.id} role=\"group\" aria-label={argFor ? (argFor.argument?.prompt ?? group.label) : group.label} className={styles.group}>\n <div className={styles.groupLabel} aria-hidden=\"true\">\n {argFor ? argFor.argument?.prompt : group.label}\n </div>\n {group.items.map((item) => {\n index += 1;\n const i = index;\n return (\n <div\n key={item.key}\n id={`${listId}-${i}`}\n data-index={i}\n role=\"option\"\n aria-selected={i === active}\n className={styles.item}\n data-tone={item.tone}\n onMouseMove={() => i !== active && setActive(i)}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => run(item)}\n >\n <span className={styles.lead} aria-hidden=\"true\">\n {item.monogram ? (\n <span className={styles.monogram} data-engine={item.engine ?? undefined}>{item.engine ? <ProviderLogo engine={item.engine} size={13} /> : item.monogram}</span>\n ) : (\n <span className={styles.bullet} data-kind={item.kind} />\n )}\n </span>\n <span className={styles.text}>\n <span className={styles.title}>{item.title}</span>\n {item.subtitle ? <span className={styles.subtitle}>{item.subtitle}</span> : null}\n </span>\n <span className={styles.trail}>\n {item.argument ? <kbd className={styles.key}>⇥</kbd> : null}\n {item.shortcut ? <kbd className={styles.key}>{item.shortcut}</kbd> : null}\n </span>\n </div>\n );\n })}\n </div>\n ))\n )}\n </div>\n <div className={styles.foot} aria-hidden=\"true\">\n <span><kbd className={styles.key}>↑↓</kbd> move</span>\n <span><kbd className={styles.key}><ReturnKeyIcon /></kbd> run</span>\n {activeItem?.argument ? <span><kbd className={styles.key}>⇥</kbd> {activeItem.argument.prompt.toLowerCase()}</span> : null}\n <span><kbd className={styles.key}>esc</kbd> {argFor ? 'back' : 'close'}</span>\n {argFor ? null : <span><kbd className={styles.key}>></kbd> actions only · <kbd className={styles.key}>#</kbd> chats only</span>}\n </div>\n <p className=\"visually-hidden\" role=\"status\" aria-live=\"polite\">\n {view.flat.length === 1 ? '1 result' : `${view.flat.length} results`}\n </p>\n </div>\n </div>,\n document.body,\n );\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
._list_cx4tx_11{grid-template-columns:repeat(var(--seat-columns,1), minmax(0, 1fr));gap:var(--space-2);display:grid}._item_cx4tx_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_cx4tx_17:hover{background:var(--bg-hover);border-color:var(--border-default)}._item_cx4tx_17:focus-visible{outline:2px solid var(--border-focus);outline-offset:1px}._item_cx4tx_17[data-level=low]{--level:var(--status-warning-fg)}._item_cx4tx_17[data-level=out]{--level:var(--status-danger-fg)}._item_cx4tx_17[data-level=unknown]{--level:var(--text-tertiary)}._head_cx4tx_48{align-items:center;gap:var(--space-2);min-width:0;display:flex}._logo_cx4tx_55{flex:none}._name_cx4tx_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_cx4tx_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_cx4tx_17[data-level=low] ._value_cx4tx_71,._item_cx4tx_17[data-level=out] ._value_cx4tx_71{color:var(--level)}._item_cx4tx_17[data-level=unknown] ._value_cx4tx_71{color:var(--text-tertiary)}._meter_cx4tx_90{background:var(--meter-track);border-radius:3px;height:6px;display:block;position:relative}._reserveZone_cx4tx_100{width:var(--reserve,0%);background:var(--status-warning-bg);border-radius:3px 0 0 3px;position:absolute;inset:0 auto 0 0}._fill_cx4tx_108{width:var(--fill,0%);border-radius:inherit;background:var(--level);transform-origin:0;transition:width var(--duration-base) var(--ease-standard);animation:_seat-fill-in_cx4tx_1 calc(var(--duration-slow) * 3) var(--ease-decelerate) both;position:absolute;inset:0 auto 0 0}@keyframes _seat-fill-in_cx4tx_1{0%{transform:scaleX(0)}to{transform:scaleX(1)}}._item_cx4tx_17[data-free] ._fill_cx4tx_108{opacity:.45}._reserve_cx4tx_100{z-index:1;top:-2px;bottom:-2px;left:var(--reserve);background:var(--text-secondary);border-radius:1px;width:2px;margin-left:-1px;position:absolute}._foot_cx4tx_147{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_cx4tx_157{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--text-tertiary);overflow:hidden}._autonomy_cx4tx_165{color:var(--text-secondary);flex:none;align-items:center;gap:5px;display:inline-flex}._dot_cx4tx_173{background:var(--text-tertiary);border-radius:50%;width:6px;height:6px}._autonomy_cx4tx_165[data-kind=eligible] ._dot_cx4tx_173{background:var(--status-success-fg)}._autonomy_cx4tx_165[data-kind=held] ._dot_cx4tx_173{background:var(--status-warning-fg)}._autonomy_cx4tx_165[data-kind=conflict]{color:var(--status-unknown-fg)}._autonomy_cx4tx_165[data-kind=conflict] ._dot_cx4tx_173{box-shadow:inset 0 0 0 1.5px var(--status-unknown-fg);background:0 0}@media (prefers-reduced-motion:reduce){._item_cx4tx_17,._fill_cx4tx_108{transition:none}:root:not([data-motion=full]) ._fill_cx4tx_108{animation:none}}:root[data-motion=reduce] ._fill_cx4tx_108{animation:none}._tip_cx4tx_204{max-width:300px;color:var(--text-primary);flex-direction:column;gap:3px;display:flex}._tipHead_cx4tx_205{align-items:center;gap:6px;display:flex}._tipLine_cx4tx_206{color:var(--text-secondary);font-size:var(--text-2xs-size)}._tipHint_cx4tx_207{color:var(--text-tertiary);font-size:var(--text-2xs-size);margin-top:2px}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EvidenceTimeline-DXmmz6Fi.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","assets/AutonomyStatus-CYaHjJ9U.js","assets/autonomy-ladder.module-ArDv4bkr.js","assets/Meter-CYt9KpM0.css","assets/AutonomyOffState-CmSSTHVe.css","assets/autonomy-ladder-BGWmZzP7.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{a as e,c as t,n,s as r,t as i}from"./index-DZ-UQ7v8.js";import{U as a,Y as o,g as s,h as c,s as l}from"./global-CMNW_dqn.js";import{t as u}from"./focus-trap-CtI1SlMX.js";import{t as d}from"./Dialog-D3msQlCj.js";import{n as f}from"./StatusBadge-CXsYqmdU.js";import{t as p}from"./RefreshIndicator-DO9ibnSq.js";import{t as m}from"./ProviderLogo-Cq-CYIwT.js";import{t as h}from"./Swimlane-B9Exxekk.js";import{t as g}from"./StatTile-C4KgjltA.js";import{B as _,D as v,H as y,I as b,L as x,Lt as S,R as C,in as w,kt as ee}from"./VerseConsoleApp-CWU6R3By.js";import{m as T,n as te}from"./verse-model-DAVevkNe.js";import{t as ne}from"./Segmented-CGh_-tBb.js";import{b as re,y as E}from"./format-CH4g_sl1.js";import{n as ie,r as D}from"./budget-queries-D8QV5XtH.js";import{_ as O,b as k,n as A,o as j,r as M,s as N,t as ae}from"./capacity-strip-model-BwZ1ZbkU.js";import{n as oe,t as P}from"./Button-D90dzI_o.js";import{_ as se,c as ce,f as le,g as ue,h as de,i as fe,x as pe}from"./icons-D1sYbCTQ.js";import{a as me}from"./command-catalog-BIntSa9l.js";import{t as he}from"./Meter-CMj-VafN.js";import{i as ge,o as _e,r as ve,s as ye,t as be}from"./AutonomyOffState-CEPSZToP.js";import{t as xe}from"./Switch-9NtO_6Lj.js";import{t as Se}from"./BudgetControl-C-0KhjRS.js";import{n as Ce,t as we}from"./types-IYKrYLku.js";import{t as Te}from"./Sheet-BZ2AG4Eo.js";import{C as Ee,S as De,_ as F,a as Oe,b as ke,c as Ae,d as je,f as Me,h as Ne,i as Pe,l as Fe,m as Ie,n as Le,r as Re,u as ze,v as Be,w as Ve,x as He,y as Ue}from"./cloud-model-BDivRMqv.js";import{a as We,c as Ge,i as Ke,n as qe,o as Je,r as Ye,s as Xe}from"./cloud-queries-BPQQ5_pJ.js";import{t as I}from"./cloud.module-DOP-N4Ch.js";import{a as Ze,c as Qe,i as $e,l as et,n as tt,r as nt,s as rt,t as L}from"./authority-model-79SeuKlJ.js";import{a as it,f as at,i as ot,l as R,n as st,o as ct,r as lt,s as ut}from"./surface-data-Dj71tdD-.js";import{i as z,n as dt,r as ft,t as pt}from"./nav-0dOYe2rJ.js";import{a as mt,i as B,n as V,r as H,t as U}from"./Surface-BfDmQcKe.js";import{n as ht,r as W,t as gt}from"./actions-CY-PjpGc.js";import{t as _t}from"./use-ticker-BBcp02SZ.js";import{t as vt}from"./use-guarded-action-CuuMHeDX.js";import{n as yt}from"./LeaderCard-D-7DlJuR.js";import{t as bt}from"./Input-D_KRJA9V.js";import{t as xt}from"./binding-left-DZpq5sLf.js";import{a as St,c as Ct,f as wt,m as Tt,o as Et,p as Dt,r as Ot,t as kt,u as At}from"./CloudBudgetForm-BrNun_Yu.js";import{d as jt,f as Mt,n as Nt}from"./NeedsYouList-CCsijdWt.js";import{f as Pt,s as Ft}from"./live-model-D_32RAOR.js";var G=t(e(),1),K=n(),It=864e5;function Lt(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 Rt(e){let t=Date.parse(e.issuedAt),n=Date.parse(e.expiresAt);return Number.isFinite(t)&&Number.isFinite(n)?Math.round((n-t)/It):null}function zt(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 Bt({draft:e}){let t=e.payload,n=Rt(t);return(0,K.jsxs)(`div`,{className:W.scope,children:[(0,K.jsxs)(`section`,{className:W.scopeBlock,"aria-label":`Expiry`,children:[(0,K.jsx)(B,{children:`Expiry`}),(0,K.jsxs)(`p`,{className:W.scopeLead,children:[n===null?`—`:`${n} days`,`, until `,Lt(t.expiresAt)]}),(0,K.jsxs)(`p`,{className:W.scopeMeta,children:[`Signed by key `,(0,K.jsx)(`span`,{className:W.mono,children:t.keyId}),` · sequence `,t.grantSeq,` · bound to this Mac`]})]}),(0,K.jsxs)(`section`,{className:W.scopeBlock,"aria-label":`Repositories`,children:[(0,K.jsxs)(B,{children:[`Repositories (`,t.repos.length,`)`]}),(0,K.jsxs)(`table`,{className:W.scopeTable,children:[(0,K.jsx)(`thead`,{children:(0,K.jsxs)(`tr`,{children:[(0,K.jsx)(`th`,{scope:`col`,children:`Repo`}),(0,K.jsx)(`th`,{scope:`col`,children:`Up to`}),(0,K.jsx)(`th`,{scope:`col`,children:`Checks`}),(0,K.jsx)(`th`,{scope:`col`,children:`Risk`}),(0,K.jsx)(`th`,{scope:`col`,className:W.num,children:`Merges/day`})]})}),(0,K.jsx)(`tbody`,{children:t.repos.map(e=>(0,K.jsxs)(`tr`,{children:[(0,K.jsx)(`td`,{className:W.mono,children:e.nameWithOwner}),(0,K.jsx)(`td`,{children:e.stage===`merge`?`Merge`:`Propose`}),(0,K.jsx)(`td`,{children:e.enforcement===`server`?`GitHub`:`Local only`}),(0,K.jsx)(`td`,{children:e.maxRisk}),(0,K.jsx)(`td`,{className:W.num,children:e.maxMergesPerDay})]},e.nameWithOwner))})]}),(0,K.jsxs)(`p`,{className:W.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,K.jsxs)(`section`,{className:W.scopeBlock,"aria-label":`Spend`,children:[(0,K.jsx)(B,{children:`Spend`}),(0,K.jsxs)(`p`,{className:W.scopeLead,children:[`Up to `,t.spend.maxMode===`all-in`?`All-in`:t.spend.maxMode===`balanced`?`Balanced`:`Reserve`,` · metered APIs $`,t.spend.meteredUsdPerDay,`/day`]}),(0,K.jsx)(`ul`,{className:W.scopeList,children:Object.entries(t.spend.seats).map(([e,t])=>(0,K.jsxs)(`li`,{children:[(0,K.jsx)(`span`,{className:W.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,K.jsxs)(`section`,{className:W.scopeBlock,"aria-label":`Engines and Leader`,children:[(0,K.jsx)(B,{children:`Engines and Leader`}),(0,K.jsx)(`p`,{className:W.scopeLead,children:t.engines.join(`, `)||`none`}),(0,K.jsxs)(`p`,{className:W.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,K.jsxs)(`section`,{className:W.scopeBlock,"aria-label":`Rollout ladder`,children:[(0,K.jsxs)(B,{children:[`Rollout ladder (`,t.rollout.stages.length,` stages, advances by itself)`]}),(0,K.jsx)(`ol`,{className:W.ladder,children:t.rollout.stages.map(e=>(0,K.jsxs)(`li`,{children:[(0,K.jsx)(`span`,{className:W.ladderId,children:e.id}),(0,K.jsx)(`span`,{children:zt(e)})]},e.id))}),(0,K.jsx)(`p`,{className:W.scopeMeta,children:`Any sandbox violation or reserve breach drops it back one stage. It can never climb past the last stage.`})]}),(0,K.jsxs)(`p`,{className:W.scopeMeta,children:[`Draft digest `,(0,K.jsxs)(`span`,{className:W.mono,children:[e.digest.slice(0,16),`…`]})]})]})}function Vt({open:e,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o}){let s=(0,G.useId)();return e?(0,K.jsx)(Ht,{titleId:s,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o}):null}function Ht({titleId:e,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o}){let s=c(st,{freshMs:0}),l=s.data?.value??null,u=s.data?.reason??null;return(0,K.jsx)(Te,{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,K.jsxs)(`div`,{className:W.sheetFooter,children:[(0,K.jsxs)(`p`,{className:W.sheetFootnote,children:[`Touch ID appears on this Mac. Lowering authority — Off, Stop, Revoke — never needs it.`,n?` After approval the switch moves to ${L[n]}.`:``]}),(0,K.jsxs)(`span`,{className:W.sheetButtons,children:[(0,K.jsx)(P,{variant:`ghost`,onClick:o,children:`Cancel`}),(0,K.jsx)(P,{variant:`primary`,icon:(0,K.jsx)(le,{}),disabled:!l,busy:r,onClick:()=>l&&a(l),children:`Approve with Touch ID`})]})]}),children:s.status===`loading`&&!s.data?(0,K.jsx)(`p`,{className:W.muted,"aria-busy":`true`,children:`Preparing the grant draft…`}):l?(0,K.jsx)(Bt,{draft:l}):(0,K.jsx)(V,{tone:`unknown`,children:u??`Grant draft unreadable — nothing to approve.`})})}var q={"all-in":`All-in`,balanced:`Balanced`,reserve:`Reserve`};function Ut(){let e=me(`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 Wt={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 Gt({tone:e}){return(0,K.jsx)(`span`,{className:W.dot,"data-tone":e,"aria-hidden":`true`})}function Kt(e){let[t,n]=(0,G.useState)(null);function r(r){if(!t)return;let{then:i}=t,a=nt(r,t.intent);e.act(()=>R({action:a,draftDigest:r.digest}),a===`re-approve`?`Re-approve the standing grant`:`Sign a new standing grant`,{onDone:t=>{n(null),i&&t&&tt[i]<=tt[t.maxSwitchWithoutGrant]&&i!==t.switch&&e.act(()=>R({action:`switch`,to:i}),`Switch autonomy to ${L[i]}`)}})}return{open:(e,t,r=null)=>n({intent:e,then:r,why:t}),sheet:(0,K.jsx)(Vt,{open:t!==null,intent:t?.intent??`grant`,then:t?.then??null,why:t?.why??``,busy:e.busy,onApprove:r,onClose:()=>n(null)})}}function qt({read:e,loading:t,budgetMode:n,actions:r,compact:i,now:a,grantFlow:o}){let s=e?.value??null,c=Kt(r),l=o??c,[u,d]=(0,G.useState)(null),[f,p]=(0,G.useState)(!1),m=!s,h=Ze(s,a);function g(e){if(!s)return;let t=$e(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.`} ${L[e]} needs it re-approved.`:`${L[e]} is beyond what the installed grant allows, so it needs a new grant.`,e);return}r.act(()=>R({action:`switch`,to:e}),`Switch autonomy to ${L[e]}`)}}Yt({read:e,status:s,budgetMode:n,actions:r,chip:h,onSwitch:g,openGrant:l.open});let _=Qe(s||{switch:`off`,maxSwitchWithoutGrant:`off`}),v=s?.kill??!1,y=m||r.busy||r.readOnly,b=(0,K.jsxs)(`div`,{className:W.switchWrap,title:m?e?.reason??`Reading autonomy state…`:void 0,children:[i?null:(0,K.jsx)(`span`,{className:W.barLabel,"aria-hidden":`true`,children:`Autonomy`}),(0,K.jsx)(ne,{size:`sm`,"aria-label":`Autonomy`,value:s?.switch??`off`,onChange:g,options:_.map(e=>({value:e.value,label:(0,K.jsxs)(`span`,{className:W.switchOption,children:[i?e.short:e.label,e.needsGrant?(0,K.jsx)(le,{className:W.touchMark,width:12,height:12,"aria-hidden":`true`}):null]}),ariaLabel:e.ariaLabel,disabled:y}))})]}),x=()=>r.act(()=>R({action:`stop`}),`Stop the fleet`,{confirm:Ut(),onDone:e=>d(rt(e))}),S=()=>r.act(()=>R({action:`clear-stop`}),`Resume the fleet`,{confirm:Wt,onDone:()=>d(null)}),C=v?i?(0,K.jsx)(P,{variant:`subtle`,size:`sm`,icon:(0,K.jsx)(de,{}),iconOnly:!0,"aria-label":`Resume the fleet`,disabled:y,onClick:S}):(0,K.jsx)(P,{variant:`subtle`,size:`sm`,icon:(0,K.jsx)(de,{}),disabled:y,onClick:S,children:`Resume`}):i?(0,K.jsx)(P,{variant:`danger`,size:`sm`,icon:(0,K.jsx)(pe,{}),iconOnly:!0,"aria-label":`Stop the fleet`,disabled:y,onClick:x}):(0,K.jsx)(P,{variant:`danger`,size:`sm`,icon:(0,K.jsx)(pe,{}),disabled:y,onClick:x,children:`Stop`});return(0,K.jsxs)(K.Fragment,{children:[(0,K.jsxs)(`div`,{className:W.bar,role:`toolbar`,"aria-label":`Autonomy controls`,"data-loading":t||void 0,children:[b,i?null:(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(Xt,{mode:n,onOpen:()=>p(!0)}),(0,K.jsx)(Zt,{chip:h,onOpen:e=>l.open(e,h.detail)})]}),(0,K.jsx)(`span`,{className:W.barSpacer}),C]}),v&&u?(0,K.jsx)(`p`,{className:W.muted,role:`status`,children:u}):null,i?(0,K.jsxs)(`div`,{className:W.barSecondary,children:[(0,K.jsx)(Xt,{mode:n,onOpen:()=>p(!0)}),(0,K.jsx)(Zt,{chip:h,onOpen:e=>l.open(e,h.detail)})]}):null,o?null:c.sheet,(0,K.jsx)(Qt,{open:f,onClose:()=>p(!1),status:s})]})}function Jt(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 Yt({read:e,status:t,budgetMode:n,actions:r,chip:i,onSwitch:a,openGrant:o}){let s=e!==void 0,c=()=>Jt({status:t,reason:e?.reason??null,readOnly:r.readOnly,busy:r.busy}),l=e=>()=>{let n=c();if(n||!t){_(n??`The autonomy state is unknown, so nothing was changed.`,`neutral`);return}if(t.switch===e){_(`Autonomy is already ${L[e]}.`,`neutral`);return}a(e)};y(`autonomy.off`,l(`off`),s),y(`autonomy.propose`,l(`propose`),s),y(`autonomy.autonomous`,l(`autonomous`),s),y(`autonomy.grant`,()=>{let e=c();if(e){_(e,`neutral`);return}if(!i.action){_(i.detail,`neutral`);return}o(i.action,i.detail)},s),y(`autonomy.reapprove`,()=>{let e=c();if(e||!t){_(e??`The autonomy state is unknown, so nothing was changed.`,`neutral`);return}let n=t.grant.state;if(n!==`active`&&n!==`paused`&&n!==`expired`){_(`There is no grant to re-approve. Use "Approve grant…" to sign a new one.`,`neutral`);return}o(`re-approve`,n===`active`?`${i.detail} Re-approving signs a fresh 30 days and continues the rollout from its current stage.`:i.detail)},s);let u=e=>()=>{if(r.readOnly||r.busy){_(c()??`Budget cannot be changed right now.`,`neutral`);return}if(n===e){_(`Budget is already ${q[e]}.`,`neutral`);return}let i=t?.grant.state===`active`?t.grant.maxMode:null;if(i&&k(e,i)){_(`Your grant allows up to ${q[i]}, so ${q[e]} is unavailable. A new grant can raise the ceiling.`,`neutral`);return}r.act(()=>D({mode:e}),`Switch the budget to ${q[e]}`,{onDone:()=>_(`Budget set to ${q[e]}.`,`success`)})};y(`budget.all-in`,u(`all-in`),s),y(`budget.balanced`,u(`balanced`),s),y(`budget.reserve`,u(`reserve`),s)}function Xt({mode:e,onOpen:t}){return(0,K.jsxs)(`button`,{type:`button`,className:W.pill,"aria-haspopup":`dialog`,onClick:t,children:[(0,K.jsx)(`span`,{className:W.pillLabel,children:`Budget`}),(0,K.jsx)(`span`,{children:e?q[e]:`—`}),(0,K.jsx)(fe,{width:14,height:14,"aria-hidden":`true`})]})}function Zt({chip:e,onOpen:t}){let n=(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(Gt,{tone:e.tone}),(0,K.jsx)(`span`,{className:W.pillLabel,children:`Grant`}),(0,K.jsx)(`span`,{children:e.label})]});if(!e.action)return(0,K.jsx)(`span`,{className:W.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,K.jsx)(`button`,{type:`button`,className:W.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,K.jsx)(Te,{open:e,onClose:t,titleId:`command-budget-sheet`,width:560,title:`Budget`,description:r?`Your grant allows up to ${q[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,K.jsx)(Se,{maxMode:r}):null})}var $t={merged:e=>`${Math.round(e)} merged`,green:e=>`${Math.round(e)}%`,spend:e=>`$${e.toFixed(2)}`};function en({kpis:e}){return(0,K.jsx)(`div`,{className:W.kpis,role:`group`,"aria-label":`Key numbers`,children:e.map(e=>(0,K.jsx)(g,{label:e.label,value:e.value,delta:e.delta,trend:e.trend,trendLabel:e.trendLabel,describeTrend:$t[e.id],caption:e.caption},e.id))})}var tn=3e4,nn={high:`Urgent`,warn:`Soon`,info:`FYI`},rn={approvals:`approvals`,authority:`authority`,fleet:`fleet`,leader:`Leader`,chats:`chats`,accounts:`accounts`};function an(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:Mt(e).text,confirmLabel:t.label,destructive:t.destructive}}function on(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:()=>dt(t.section,t.anchor)};case`session`:return{label:`Open chat`,onOpen:()=>ft(t.sessionId)};case`approval`:case`seat`:return{label:`Open`,onOpen:()=>z(e.id)};default:return null}}function sn(e){return e===null?null:e.replace(/(^|· )(Partial )?([a-z][\w-]*) run$/,(e,t,n,r)=>{let i=T(r)?te[r]:`${r.charAt(0).toUpperCase()}${r.slice(1)}`;return`${t}${n??``}${i} run`})}function cn({item:e,view:t,seatNames:n}){let r=e.subject,i=[];if(t.repo&&i.push((0,K.jsx)(`span`,{className:W.needsRepo,title:t.repoFull,children:t.repo},`repo`)),r.pr&&i.push((0,K.jsxs)(`span`,{children:[`#`,r.pr]},`pr`)),r.seatId){let e=n?.get(r.seatId)??r.seatId;i.push((0,K.jsx)(`span`,{title:e===r.seatId?void 0:r.seatId,children:e},`seat`))}return i.push((0,K.jsx)(`span`,{title:t.ageStamp,children:t.age},`age`)),(0,K.jsx)(`span`,{className:W.needsMeta,children:i.map((e,t)=>(0,K.jsxs)(G.Fragment,{children:[t>0?(0,K.jsx)(`span`,{"aria-hidden":`true`,children:`·`}):null,e]},e.key))})}function ln({item:e,actions:t,now:n,seatNames:r}){let i=on(e),a=e.actions.filter(e=>e.request!==null),o=jt(e,n),s=sn(o.kindLabel);return(0,K.jsxs)(`li`,{className:W.needsRow,"data-severity":e.severity,id:pt(e.id),children:[(0,K.jsx)(`span`,{className:W.sevDot,"data-severity":e.severity,"aria-hidden":`true`}),(0,K.jsxs)(`div`,{className:W.needsText,children:[s?(0,K.jsx)(`span`,{className:W.needsKind,children:s}):null,(0,K.jsxs)(`span`,{className:W.needsTitle,title:o.fullTitle,children:[(0,K.jsxs)(`span`,{className:`visually-hidden`,children:[nn[e.severity],`: `]}),o.title]}),o.run?(0,K.jsx)(Nt,{run:o.run}):null,o.detail?(0,K.jsx)(`span`,{className:W.needsDetail,children:o.detail}):null,(0,K.jsx)(cn,{item:e,view:o,seatNames:r})]}),(0,K.jsxs)(`div`,{className:W.needsActions,children:[a.map(n=>(0,K.jsx)(P,{size:`sm`,variant:n.destructive?`danger`:n.kind===`approve`?`primary`:`subtle`,disabled:t.busy||t.readOnly,onClick:()=>t.act(()=>at(n.request.path,n.request.body),`${n.label}: ${o.title}`,{confirm:an(e,n)}),children:n.label},n.kind)),i?i.href?(0,K.jsxs)(`a`,{className:W.linkButton,href:i.href,target:`_blank`,rel:`noopener noreferrer`,children:[i.label,(0,K.jsx)(ce,{width:12,height:12,"aria-hidden":`true`}),(0,K.jsx)(`span`,{className:`visually-hidden`,children:` (opens in a new tab)`})]}):(0,K.jsx)(`button`,{type:`button`,className:W.linkButton,onClick:i.onOpen,children:i.label}):null]})]})}function un(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 dn({state:e,actions:t,fleetLine:n,seatNames:r}){let{activity:i,loading:a,reason:o,stale:s}=un(e),c=_t(tn),l=i?Ct(i.needsYou):[],u=Dt(i),d=l.slice(0,5),f=i?i.needsYou.length:null;return(0,K.jsx)(U,{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,K.jsxs)(`button`,{type:`button`,className:W.linkButton,onClick:()=>z(),"aria-keyshortcuts":`Meta+J`,children:[`Open all `,(0,K.jsx)(`kbd`,{className:W.kbd,children:`⌘J`})]}),children:a?(0,K.jsx)(`p`,{className:W.muted,"aria-busy":`true`,children:`Reading the inbox…`}):i?d.length===0?u.length||s?(0,K.jsx)(V,{tone:`unknown`,children:u.length?`Nothing to show, but ${u.map(e=>rn[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,K.jsxs)(`div`,{className:W.allClear,role:`status`,children:[(0,K.jsx)(`span`,{className:W.allClearTitle,children:`All clear`}),n?(0,K.jsx)(`span`,{className:W.allClearBody,children:n}):null]}):(0,K.jsxs)(K.Fragment,{children:[(0,K.jsx)(`ul`,{className:W.needsList,children:d.map(e=>(0,K.jsx)(ln,{item:e,actions:t,now:c,seatNames:r},e.id))}),l.length>d.length?(0,K.jsxs)(`button`,{type:`button`,className:W.moreLink,onClick:()=>z(),children:[l.length-d.length,` more in the drawer`]}):null,u.length?(0,K.jsxs)(`p`,{className:W.muted,children:[u.map(e=>rn[e]??e).join(`, `),` not answering — the list may be incomplete.`]}):null,s?(0,K.jsx)(`p`,{className:W.muted,children:`The last refresh failed; showing the previous list.`}):null]}):(0,K.jsxs)(V,{tone:`unknown`,children:[o??`The inbox didn't answer.`,` This is not an all-clear.`]})})}var fn={usable:`ok`,low:`low`,spent:`out`,"signed-out":`out`,unavailable:`out`,checking:`unknown`,"not-checked":`unknown`},pn=new Set([`usable`,`low`,`checking`]);function mn(e){let t=e.trim();return/[.!?]$/.test(t)?t:`${t}.`}function hn(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 J={eligible:`eligible`,held:`held`,off:`off`,unknown:`no-reading`};function gn(e,t,n){return e?e.status===`eligible`&&!pn.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:J[e.status],word:O[e.status],why:e.why?mn(e.why):null}:{kind:`none`,word:`Not reported`,why:n?`The budget route does not list this seat.`:null}}function _n(e,t){if(t.kind===`spent`)return t.detail;let n=e.windows.find(e=>e.binding)??null;return n?.resetText?At(n.resetText):null}function vn(e,t,n){let r=ae(e,{healthRead:n.healthRead,now:n.now}),i=gn(hn(e,t),r,n.budgetRead),a=fn[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:xt(e),c=a===`out`?r.label:s===null?`—`:`${v(s)} left`,l=_n(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 yn(e,t){let n=N(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=re(n?.resetAt??null,t),s={kind:J[e.status],word:O[e.status],why:e.why?mn(e.why):null},c=e.free||a===null?`—`:`${v(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 bn({rows:e,budget:t,healthRead:n,now:r}){if(e.length===0){let e=t?yn(t,r):[];return{items:e,headline:e.length===0?`No seats reported yet`:`Seat roster not loaded — readiness unknown`}}let i=N(t);return{items:j(e,{healthRead:n,now:r}).map(e=>vn(e,i,{healthRead:n,budgetRead:t!==null,now:r})),headline:M(e)}}function xn(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 Y={list:`_list_cx4tx_11`,item:`_item_cx4tx_17`,head:`_head_cx4tx_48`,logo:`_logo_cx4tx_55`,name:`_name_cx4tx_59`,value:`_value_cx4tx_71`,meter:`_meter_cx4tx_90`,reserveZone:`_reserveZone_cx4tx_100`,fill:`_fill_cx4tx_108`,"seat-fill-in":`_seat-fill-in_cx4tx_1`,reserve:`_reserve_cx4tx_100`,foot:`_foot_cx4tx_147`,note:`_note_cx4tx_157`,autonomy:`_autonomy_cx4tx_165`,dot:`_dot_cx4tx_173`,tip:`_tip_cx4tx_204`,tipHead:`_tipHead_cx4tx_205`,tipLine:`_tipLine_cx4tx_206`,tipHint:`_tipHint_cx4tx_207`};function Sn(){return(0,G.useSyncExternalStore)((0,G.useCallback)(e=>o(`verse-health`,e),[]),()=>a(`verse-health`),()=>a(`verse-health`)).data??null}function Cn({item:e}){return(0,K.jsxs)(`div`,{className:Y.tip,children:[(0,K.jsxs)(`div`,{className:Y.tipHead,children:[(0,K.jsx)(m,{engine:e.engine,size:14}),(0,K.jsx)(`strong`,{children:e.name})]}),(0,K.jsxs)(`div`,{children:[e.status,e.note&&e.note!==e.status?` · ${e.note}`:``]}),e.reserveLabel?(0,K.jsx)(`div`,{className:Y.tipLine,children:e.reserveLabel}):null,(0,K.jsxs)(`div`,{className:Y.tipLine,children:[`Autonomy: `,e.autonomy.word,e.autonomy.why?` — ${e.autonomy.why}`:``]}),(0,K.jsx)(`div`,{className:Y.tipHint,children:`Click for Resources · ⌘.`})]})}function wn({item:e}){let t={"--fill":`${e.leftPercent??(e.engine===`local`&&e.value===`Free`?100:0)}%`,...e.reservePercent===null?{}:{"--reserve":`${e.reservePercent}%`}};return(0,K.jsx)(w,{content:(0,K.jsx)(Cn,{item:e}),placement:`bottom`,children:(0,K.jsxs)(`button`,{type:`button`,className:Y.item,"data-level":e.level,"data-free":e.engine===`local`||void 0,"aria-label":`${e.spoken}. Open Resources`,"aria-keyshortcuts":`Meta+.`,onClick:()=>S(),children:[(0,K.jsxs)(`span`,{className:Y.head,children:[(0,K.jsx)(m,{engine:e.engine,size:14,className:Y.logo}),(0,K.jsx)(`span`,{className:Y.name,children:e.name}),(0,K.jsx)(`span`,{className:Y.value,children:e.value})]}),(0,K.jsxs)(`span`,{className:Y.meter,style:t,"aria-hidden":`true`,children:[e.reservePercent===null?null:(0,K.jsx)(`span`,{className:Y.reserveZone}),(0,K.jsx)(`span`,{className:Y.fill}),e.reservePercent===null?null:(0,K.jsx)(`span`,{className:Y.reserve})]}),(0,K.jsxs)(`span`,{className:Y.foot,children:[(0,K.jsx)(`span`,{className:Y.note,children:e.note??e.status}),(0,K.jsxs)(`span`,{className:Y.autonomy,"data-kind":e.autonomy.kind,children:[(0,K.jsx)(`span`,{className:Y.dot,"aria-hidden":`true`}),e.autonomy.word]})]})]})})}function Tn({budget:e,seats:t,now:n}){let r=Sn(),{viewport:i}=ee(),a=(0,G.useMemo)(()=>{let i=[];try{i=t&&t.length>0?A(t,{health:r?.seats??null,budget:e,now:n}):[]}catch{i=[]}return bn({rows:i,budget:e,healthRead:r!==null,now:n})},[t,r,e,n]);return(0,K.jsx)(U,{title:`Seats`,caption:a.headline,actions:(0,K.jsxs)(`button`,{type:`button`,className:W.linkButton,onClick:()=>S(),"aria-keyshortcuts":`Meta+.`,children:[`Resources `,(0,K.jsx)(`kbd`,{className:W.kbd,children:`⌘.`})]}),children:a.items.length===0?(0,K.jsx)(V,{tone:`unknown`,children:`Seat capacity unavailable.`}):(0,K.jsx)(`div`,{className:Y.list,role:`group`,"aria-label":`Capacity per seat`,style:{"--seat-columns":xn(i,a.items.length)},children:a.items.map(e=>(0,K.jsx)(wn,{item:e},e.key))})})}var En=new Intl.NumberFormat(`en-US`);function Dn({open:e,onClose:t,actions:n,estimatePerSessionUsd:r,onLaunched:i,defaultRepo:a=Le}){let o=(0,G.useId)(),s=(0,G.useId)(),c=(0,G.useId)(),u=(0,G.useRef)(null),[f,p]=(0,G.useState)({repo:a,baseBranch:``,prompt:``}),[m,h]=(0,G.useState)({}),[g,_]=(0,G.useState)(null);(0,G.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=Ve(f);if(!r.ok){h(r.errors);return}h({}),_(null),n.act(async()=>{try{let e=await We({...r.request,origin:`operator`});p(e=>({...e,prompt:``})),i(e.task),t()}catch(e){if(e instanceof l)throw e;_(vt(e))}},`Launch a Claude Code cloud session with this task.`)},b=f.prompt.trim().length;return(0,K.jsx)(d,{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:I.dialogWidth,initialFocusRef:u,children:(0,K.jsxs)(`form`,{className:I.form,onSubmit:y,noValidate:!0,children:[(0,K.jsxs)(`div`,{className:I.fieldGrid,children:[(0,K.jsx)(bt,{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,K.jsx)(bt,{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,K.jsxs)(`div`,{className:I.textareaField,children:[(0,K.jsx)(`label`,{className:I.label,htmlFor:s,children:`Task`}),(0,K.jsx)(`textarea`,{ref:u,id:s,className:I.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?c:void 0,onChange:e=>v({prompt:e.target.value})}),m.prompt?(0,K.jsx)(`p`,{id:c,className:I.fieldError,role:`alert`,children:m.prompt}):null,(0,K.jsxs)(`p`,{className:I.muted,children:[En.format(b),` of `,En.format(Ce),` characters`,r===null?``:` · estimated at ${je(r)} per session`]})]}),g?(0,K.jsx)(`p`,{className:I.notice,"data-tone":`danger`,role:`alert`,children:g}):null,(0,K.jsxs)(`div`,{className:I.formActions,children:[(0,K.jsx)(P,{variant:`ghost`,onClick:t,disabled:n.busy,children:`Cancel`}),(0,K.jsx)(P,{type:`submit`,variant:`primary`,busy:n.busy,children:`Launch`})]})]})})}var On=(0,G.lazy)(()=>i(()=>import(`./EvidenceTimeline-DXmmz6Fi.js`),__vite__mapDeps([0,1,2,3,4,5,6,7])));function X({href:e,children:t,label:n}){return(0,K.jsxs)(`a`,{className:I.link,href:e,target:`_blank`,rel:`noreferrer noopener`,"aria-label":n,children:[t,` `,(0,K.jsx)(ce,{width:12,height:12,"aria-hidden":`true`})]})}function kn({task:e,actions:t,now:n}){let r=F(e.sessionUrl,`claude.ai`),i=e.pr?F(e.pr.url,`github.com`):null,a=De(e,n),[o,s]=(0,G.useState)(!1);return(0,K.jsxs)(`li`,{className:I.task,"data-state":e.state,children:[(0,K.jsx)(`span`,{className:I.taskChip,children:(0,K.jsx)(f,{status:e.state,tone:Pe[e.state],children:He(e)})}),(0,K.jsxs)(`span`,{className:I.taskMain,children:[(0,K.jsx)(`p`,{className:I.taskTitle,children:e.title}),(0,K.jsx)(`span`,{className:I.muted,children:Ee(e,n)}),a?(0,K.jsx)(`span`,{className:I.facts,children:a}):null,(0,K.jsxs)(`span`,{className:I.taskLinks,children:[r?(0,K.jsx)(X,{href:r,label:`Open “${e.title}” in Claude`,children:`Open in Claude`}):null,i&&e.pr?(0,K.jsx)(X,{href:i,label:`Pull request #${e.pr.number} on GitHub`,children:`PR #${e.pr.number}`}):null,(0,K.jsx)(`button`,{type:`button`,className:I.linkButton,"aria-haspopup":`dialog`,"aria-label":`Evidence for “${e.title}”`,onClick:()=>s(!0),children:`Evidence`}),Ae(e)?(0,K.jsx)(`button`,{type:`button`,className:I.linkButton,disabled:t.busy||t.readOnly,"aria-label":`Dismiss “${e.title}”`,onClick:()=>t.act(()=>Ke(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,K.jsx)(G.Suspense,{fallback:null,children:(0,K.jsx)(On,{taskId:e.id,title:e.title,open:!0,onClose:()=>s(!1),now:n})}):null]})}function An({overview:e,actions:t,onClose:n}){let r=(0,G.useRef)(null),i=(0,G.useId)();return u({open:!0,containerRef:r,onClose:n}),(0,K.jsxs)(`div`,{ref:r,className:I.popover,role:`dialog`,"aria-modal":`false`,"aria-labelledby":i,tabIndex:-1,children:[(0,K.jsx)(`h4`,{id:i,className:I.popoverTitle,children:`Cloud budget`}),(0,K.jsx)(kt,{idPrefix:`cloud-card-budget`,budget:e.budget.budget,busy:t.busy,disabled:t.readOnly,onSave:e=>t.act(()=>Ge(e),`Change the cloud budget.`,{onDone:n}),onCancel:n})]})}function jn({overview:e,actions:t,now:n,onNotice:r}){let i=e.budget,a=ze(i),o=Be(e.seat),s=Me(i.canLaunch,`The cloud budget does not allow another launch right now.`),{shown:c,hidden:l}=Fe(e.tasks,n),u=i.budget.selfImprove,d=(0,K.jsxs)(`p`,{className:I.estimateNote,children:[E(i.estimateNote,n),` `,(0,K.jsx)(X,{href:we,label:`Check the real balance on claude.ai`,children:`Check usage on claude.ai`})]});return(0,K.jsxs)(`div`,{className:I.body,children:[o?(0,K.jsxs)(`div`,{className:I.meterBlock,"data-standing":`not-set-up`,children:[(0,K.jsxs)(`p`,{className:I.standing,title:Ne(i.estimatedRemainingUsd),children:[(0,K.jsx)(f,{status:`not-set-up`,tone:`warning`,children:Re}),(0,K.jsxs)(`span`,{className:I.muted,children:[Oe(i.estimatedRemainingUsd),` · estimate`]})]}),(0,K.jsx)(`p`,{className:I.notice,"data-tone":`warning`,role:`note`,children:o}),d]}):(0,K.jsxs)(`div`,{className:I.meterBlock,children:[(0,K.jsx)(he,{value:a.value,max:a.max,label:`Credits remaining`,valueText:a.text,tone:a.tone,"aria-label":`Estimated credits remaining: ${a.text}, ${a.usedText}`}),d,a.warning?(0,K.jsx)(`p`,{className:I.notice,"data-tone":`warning`,role:`note`,children:a.warning}):null]}),(0,K.jsx)(`p`,{className:I.facts,children:ke(i,n)}),s?(0,K.jsxs)(`p`,{className:I.notice,"data-tone":`warning`,role:`note`,"data-testid":`cloud-budget-refused`,children:[`New launches are paused: `,s]}):null,(0,K.jsxs)(`div`,{className:I.toggleRow,children:[(0,K.jsx)(xe,{checked:u.enabled,label:`Self-improvement`,disabled:t.busy||t.readOnly,onChange:e=>t.act(()=>Ge({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,K.jsx)(`span`,{className:`${I.muted} ${I.toggleText}`,children:Ue(i)})]}),c.length===0?(0,K.jsx)(V,{children:`No cloud tasks yet. Start one with New cloud task, or let Verse improve itself.`}):(0,K.jsx)(`ul`,{className:I.tasks,"aria-label":`Cloud tasks`,children:c.map(e=>(0,K.jsx)(kn,{task:e,actions:t,now:n},e.id))}),l>0?(0,K.jsxs)(`p`,{className:I.muted,children:[l,` more `,l===1?`task is`:`tasks are`,` listed by ashlr cloud list.`]}):null]})}function Mn({actions:e,now:t=Date.now()}){let n=c(Ye,{freshMs:15e3}),r=s(Ye);x(r,qe);let[i,a]=(0,G.useState)(!1),[o,l]=(0,G.useState)(!1),[u,d]=(0,G.useState)(null),f=n.data?.value??null,p=!n.data&&(n.status===`loading`||n.status===`idle`),m=f?Ie(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?Be(f.seat)??Me(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,K.jsxs)(`span`,{className:I.headActions,children:[(0,K.jsx)(w,{label:m??`Start a cloud session with your own task`,children:(0,K.jsx)(P,{size:`sm`,variant:`primary`,icon:(0,K.jsx)(ue,{width:14,height:14}),disabled:h||m!==null,onClick:()=>a(!0),children:`New cloud task`})}),(0,K.jsx)(w,{label:_??(g?`Launch the next backlog item: ${g.title}`:`Launch the next backlog item`),children:(0,K.jsx)(P,{size:`sm`,disabled:h||_!==null,onClick:()=>{f&&g&&e.act(()=>Xe({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 ${je(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:E(t)})}}})},children:`Improve Verse`})}),(0,K.jsx)(w,{label:`Credits, per-session estimate and daily caps`,children:(0,K.jsx)(P,{size:`sm`,variant:`ghost`,"aria-expanded":o,"aria-haspopup":`dialog`,onClick:()=>l(e=>!e),disabled:e.readOnly,children:`Edit budget`})}),(0,K.jsx)(w,{label:`Check GitHub for task updates now`,children:(0,K.jsx)(oe,{size:`sm`,variant:`ghost`,icon:(0,K.jsx)(se,{width:14,height:14}),"aria-label":`Check GitHub for task updates now`,disabled:h,onClick:()=>e.act(()=>Je(),`Re-read the cloud tasks from GitHub.`)})}),o?(0,K.jsx)(An,{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,K.jsx)(U,{title:`Cloud`,caption:`Claude Code cloud sessions on your Claude credits`,actions:y,children:p?(0,K.jsx)(`p`,{className:I.muted,"aria-busy":`true`,children:`Reading the cloud lane…`}):f?(0,K.jsxs)(K.Fragment,{children:[u?(0,K.jsx)(`div`,{className:I.notice,"data-tone":u.tone,role:`status`,children:(0,K.jsxs)(`span`,{className:I.noticeRow,children:[(0,K.jsxs)(`span`,{children:[u.text,u.href?(0,K.jsxs)(K.Fragment,{children:[` `,(0,K.jsx)(X,{href:u.href,children:u.linkText??`Open`})]}):null]}),(0,K.jsx)(`button`,{type:`button`,className:I.linkButton,onClick:()=>d(null),children:`Dismiss`})]})}):null,(0,K.jsx)(jn,{overview:f,actions:e,now:t,onNotice:d}),(0,K.jsx)(Dn,{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,K.jsx)(V,{tone:`unknown`,children:n.data?.reason??n.error?.message??`The cloud lane did not answer.`})})}function Nn(e){let t=et(e);return(0,K.jsx)(`p`,{className:W.verdict,"data-testid":`verdict`,children:t.map((e,t)=>(0,K.jsxs)(`span`,{className:W.verdictPart,"data-tone":e.tone,children:[t>0?(0,K.jsx)(`span`,{className:W.verdictSep,"aria-hidden":`true`,children:` · `}):null,e.text]},e.key))})}var Pn=`ashlr.verse.command.lastLooked.v1`;function Fn(){try{let e=window.localStorage.getItem(Pn);return e&&Number.isFinite(Date.parse(e))?e:null}catch{return null}}function In(e){try{window.localStorage.setItem(Pn,e)}catch{}}function Ln(){let e=C(),[t,n]=(0,G.useState)(null),r=(0,G.useRef)(!1);return(0,G.useEffect)(()=>{e&&!r.current&&(n(Fn()),In(new Date().toISOString())),r.current=e},[e]),t}function Rn({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,K.jsxs)(`div`,{className:W.since,role:`group`,"aria-label":`Since you looked at ${i}`,children:[(0,K.jsxs)(`span`,{className:W.sinceLead,children:[`Since `,i]}),t.map(e=>(0,K.jsx)(`span`,{className:W.sinceChip,"data-tone":e.tone,children:e.text},e.id))]})}var zn=r({COMMAND_FAST_POLL_MS:()=>Z,COMMAND_HISTORY_POLL_MS:()=>$,COMMAND_SLOW_POLL_MS:()=>Q,CommandSection:()=>Hn}),Bn=36e5,Vn=(0,G.lazy)(()=>i(()=>import(`./AutonomyStatus-CYaHjJ9U.js`),__vite__mapDeps([8,9,1,3,4,5,10,11,12]))),Z=1e4,Q=3e4,$=3e5;function Hn(){let{compact:e}=ee(),t=c(lt),n=c(it),r=b(),i=c(ct),l=c(ut,{freshMs:6e4}),u=c(ot,{freshMs:6e4}),d=c(ie,{freshMs:15e3}),f={authority:s(lt),fleet:s(it),leader:s(ct),learning:s(ut),history:s(ot),budget:s(ie)};x(()=>{f.authority(),f.fleet()},Z),x(()=>{f.leader(),f.budget()},Q),x(()=>{f.history(),f.learning()},$);let m=_t(3e4),g=ht(),_=Kt(g),v=Ln(),y=(0,G.useSyncExternalStore)((0,G.useCallback)(e=>o(`verse-bootstrap`,e),[]),()=>a(`verse-bootstrap`),()=>a(`verse-bootstrap`)).data?.seats??null,S=d.data??null,C=t.data?.value??null,w=n.data?.value??null,T=u.data?.value??null,te=_e(w),ne=(0,G.useMemo)(()=>Ot({fleet:w,history:T,learning:l.data?.value??null,policy:C?.policy??null,budget:S}),[w,T,l.data,C,S]),re=(0,G.useMemo)(()=>wt(y,S),[y,S]),E=ve(C?.grant.state===`none`),D=t.data&&n.data&&E.readiness!==void 0?ge({authority:C,live:w,readiness:E.readiness,setup:E.report}):null,O=(0,G.useMemo)(()=>Et({fleet:w,history:T,learning:l.data?.value??null}),[w,T,l.data]),k=Tt({lastLookedAt:v,fleet:w,leader:i.data?.value??null,activity:r.data}),A=e?6:12,j=m-A*Bn,M=(0,G.useMemo)(()=>w?Ft(w.runs,j,m):[],[w,j,m]),N=n.data?w?w.state===`dark`&&M.length===0?ye(w):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=w?w.state===`dark`?null:`Fleet ${w.state}: ${w.summary.building??`—`} building, ${w.summary.queued??`—`} queued.`:`Fleet status unknown.`,oe=[t,n].some(e=>e.status===`refreshing`);return(0,K.jsxs)(mt,{title:`Command`,actions:oe?(0,K.jsx)(p,{}):null,lead:(0,K.jsxs)(`div`,{className:W.lead,children:[(0,K.jsx)(qt,{read:t.data,loading:t.status===`loading`,budgetMode:S?.mode??null,actions:g,compact:e,now:m,grantFlow:_}),(0,K.jsx)(gt,{actions:g}),D?(0,K.jsx)(be,{state:D,here:`command`,onGrant:e=>_.open(e,D.why)}):(0,K.jsxs)(K.Fragment,{children:[C&&C.grant.state===`active`?(0,K.jsx)(`div`,{id:pt(`autonomy`),children:(0,K.jsx)(G.Suspense,{fallback:(0,K.jsx)(`div`,{className:W.autonomyPlaceholder,"aria-busy":`true`}),children:(0,K.jsx)(Vn,{status:C,now:m,onReapprove:e=>_.open(`re-approve`,e),blocked:Jt({status:C,reason:null,readOnly:g.readOnly,busy:g.busy})})})}):null,(0,K.jsx)(Nn,{authority:C,building:w?.summary.building??null,mergedToday:w?.summary.mergedToday??null,revertsToday:w?.summary.revertsToday??null,reserve:St(S),darkSince:te}),(0,K.jsx)(Rn,{lastLookedAt:v,items:k,now:m})]})]}),children:[(0,K.jsx)(H,{span:5,children:(0,K.jsx)(dn,{state:r,actions:g,fleetLine:ae,seatNames:re})}),(0,K.jsx)(H,{span:7,children:(0,K.jsx)(yt,{read:i.data,loading:i.status===`loading`,actions:g})}),D&&O?null:(0,K.jsx)(H,{span:12,children:(0,K.jsx)(en,{kpis:ne})}),(0,K.jsx)(H,{span:12,children:(0,K.jsx)(Tn,{budget:S,seats:y,now:m})}),(0,K.jsx)(H,{span:12,children:(0,K.jsx)(Mn,{actions:g,now:m})}),D&&M.length===0?null:(0,K.jsx)(H,{span:12,children:(0,K.jsx)(h,{title:`Last ${A} hours`,description:`Fleet lanes; bars coloured by status, outlines are queued or parked`,status:N,lanes:M,from:j,to:m,now:m,toneOf:Pt})}),_.sheet,g.dialogs]})}export{Z as COMMAND_FAST_POLL_MS,$ as COMMAND_HISTORY_POLL_MS,Q as COMMAND_SLOW_POLL_MS,Hn as CommandSection,Gt as n,zn as t};
|
|
3
|
+
//# sourceMappingURL=CommandSection-DXFvPgKp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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…\", \"Re-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 // 3.14 \"Re-approve grant…\": renew a grant that is still continuable (active,\n // paused, expired) through the SAME sheet — the server drafts it as a\n // re-approval that continues the ladder. Nothing to continue → say so.\n useCommandHandler(\n 'autonomy.reapprove',\n () => {\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 const state = status.grant.state;\n if (state !== 'active' && state !== 'paused' && state !== 'expired') {\n shellNotify('There is no grant to re-approve. Use \"Approve grant…\" to sign a new one.', 'neutral');\n return;\n }\n openGrant(\n 're-approve',\n state === 'active'\n ? `${chip.detail} Re-approving signs a fresh 30 days and continues the rollout from its current stage.`\n : chip.detail,\n );\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 *\n * Each sparkline also SPEAKS its trend (first → latest, range) in the unit\n * the tile prints, so the glance is not image-only for a screen reader.\n * Cycle time and lift carry no sparkline on purpose: their sources hold one\n * current figure, not a daily series, and none is invented for the glance.\n */\nimport { StatTile } from '../../../components/charts/StatTile.js';\nimport type { Kpi } from './command-model.js';\nimport styles from './command.module.css';\n\nconst DESCRIBE_TREND: Partial<Record<Kpi['id'], (v: number) => string>> = {\n merged: (v) => `${Math.round(v)} merged`,\n green: (v) => `${Math.round(v)}%`,\n spend: (v) => `$${v.toFixed(2)}`,\n};\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\n key={k.id}\n label={k.label}\n value={k.value}\n delta={k.delta}\n trend={k.trend}\n trendLabel={k.trendLabel}\n describeTrend={DESCRIBE_TREND[k.id]}\n caption={k.caption}\n />\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 {/* The reserve as a ZONE (empty → the reserve line), then the fill,\n then the tick — so \"how close to the reserve\" reads as distance\n to a region, as on the Usage burn-downs' reserve band. */}\n {item.reservePercent !== null ? <span className={styles.reserveZone} /> : null}\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 * Autonomy ACTIVE (3.14): the banner's place goes to AutonomyStatus — the\n * rollout ladder, progress to the next stage, the grant's expiry (Re-approve\n * under 7 days, through the same sheet) and what the fleet decided last. It\n * is a lazy chunk; the bar above keeps the switch and Stop.\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 { Suspense, lazy, 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, paletteBlock, useGrantFlow } from '../command/AutonomyBar.js';\nimport { anchorId } from '../command/nav.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// The active fleet's ladder, progress and last decision (3.14): its own chunk,\n// loaded only while a grant is active — never on the chat first paint.\nconst AutonomyStatus = lazy(() => import('../command/AutonomyStatus.js'));\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 {auth && auth.grant.state === 'active' ? (\n // Needs-you's rollout and Stop items point at this anchor.\n <div id={anchorId('autonomy')}>\n <Suspense fallback={<div className={styles.autonomyPlaceholder} aria-busy=\"true\" />}>\n <AutonomyStatus\n status={auth}\n now={now}\n onReapprove={(why) => grantFlow.open('re-approve', why)}\n blocked={paletteBlock({ status: auth, reason: null, readOnly: actions.readOnly, busy: actions.busy })}\n />\n </Suspense>\n </div>\n ) : null}\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-DXFvPgKp.js"}
|