@ashlr/hub 3.12.0 → 3.13.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 +83 -0
- package/README.md +29 -16
- package/dist/authority-surface.json +89 -43
- package/dist/build-identity.json +2 -2
- package/dist/cli/authority.d.ts +145 -33
- package/dist/cli/authority.js +1196 -313
- package/dist/cli/authority.js.map +1 -1
- package/dist/cli/cloud.js +12 -3
- package/dist/cli/cloud.js.map +1 -1
- package/dist/core/authority/protected-paths.js +11 -0
- package/dist/core/authority/protected-paths.js.map +1 -1
- package/dist/core/authority/resident.d.ts +101 -0
- package/dist/core/authority/resident.js +246 -0
- package/dist/core/authority/resident.js.map +1 -0
- package/dist/core/authority/types.d.ts +43 -0
- package/dist/core/authority/types.js +6 -0
- package/dist/core/authority/types.js.map +1 -1
- package/dist/core/cloud/budget.js +11 -1
- package/dist/core/cloud/budget.js.map +1 -1
- package/dist/core/cloud/cloud-api.d.ts +25 -2
- package/dist/core/cloud/cloud-api.js +139 -5
- package/dist/core/cloud/cloud-api.js.map +1 -1
- package/dist/core/cloud/pr-actions.d.ts +93 -0
- package/dist/core/cloud/pr-actions.js +436 -0
- package/dist/core/cloud/pr-actions.js.map +1 -0
- package/dist/core/cloud/pr-preview.d.ts +128 -0
- package/dist/core/cloud/pr-preview.js +228 -0
- package/dist/core/cloud/pr-preview.js.map +1 -0
- package/dist/core/cloud/store.d.ts +2 -0
- package/dist/core/cloud/store.js +28 -0
- package/dist/core/cloud/store.js.map +1 -1
- package/dist/core/cloud/timeline-api.d.ts +24 -0
- package/dist/core/cloud/timeline-api.js +46 -0
- package/dist/core/cloud/timeline-api.js.map +1 -0
- package/dist/core/cloud/timeline-types.d.ts +62 -0
- package/dist/core/cloud/timeline-types.js +36 -0
- package/dist/core/cloud/timeline-types.js.map +1 -0
- package/dist/core/cloud/timeline.d.ts +102 -0
- package/dist/core/cloud/timeline.js +919 -0
- package/dist/core/cloud/timeline.js.map +1 -0
- package/dist/core/cloud/tracker.js +67 -0
- package/dist/core/cloud/tracker.js.map +1 -1
- package/dist/core/cloud/types.d.ts +38 -0
- package/dist/core/cloud/types.js +1 -1
- package/dist/core/cloud/types.js.map +1 -1
- package/dist/core/daemon/service-install-authority.d.ts +10 -2
- package/dist/core/daemon/service-install-authority.js +14 -5
- package/dist/core/daemon/service-install-authority.js.map +1 -1
- package/dist/core/daemon/service.d.ts +15 -0
- package/dist/core/daemon/service.js +26 -0
- package/dist/core/daemon/service.js.map +1 -1
- package/dist/core/fleet/cloud-intake.d.ts +95 -0
- package/dist/core/fleet/cloud-intake.js +557 -0
- package/dist/core/fleet/cloud-intake.js.map +1 -0
- package/dist/core/fleet/dispatch-router.d.ts +13 -0
- package/dist/core/fleet/dispatch-router.js +32 -8
- package/dist/core/fleet/dispatch-router.js.map +1 -1
- package/dist/core/fleet/fleet-merge-state.d.ts +10 -0
- package/dist/core/fleet/fleet-merge-state.js.map +1 -1
- package/dist/core/fleet/host-merge.d.ts +5 -0
- package/dist/core/fleet/host-merge.js +11 -0
- package/dist/core/fleet/host-merge.js.map +1 -1
- package/dist/core/fleet/merge-gates.d.ts +8 -0
- package/dist/core/fleet/merge-gates.js +25 -5
- package/dist/core/fleet/merge-gates.js.map +1 -1
- package/dist/core/fleet/standing-merge-pass.js +30 -0
- package/dist/core/fleet/standing-merge-pass.js.map +1 -1
- package/dist/core/fleet/tick-hooks-live.d.ts +9 -0
- package/dist/core/fleet/tick-hooks-live.js +44 -5
- package/dist/core/fleet/tick-hooks-live.js.map +1 -1
- package/dist/core/fleet/verify-check-run.d.ts +90 -0
- package/dist/core/fleet/verify-check-run.js +274 -0
- package/dist/core/fleet/verify-check-run.js.map +1 -0
- package/dist/core/routing/budget-api.d.ts +11 -0
- package/dist/core/routing/budget-api.js +64 -8
- package/dist/core/routing/budget-api.js.map +1 -1
- package/dist/core/routing/budget-store.d.ts +22 -1
- package/dist/core/routing/budget-store.js +22 -8
- package/dist/core/routing/budget-store.js.map +1 -1
- package/dist/core/verse/account-health.js +9 -3
- package/dist/core/verse/account-health.js.map +1 -1
- package/dist/core/verse/activity-api.d.ts +5 -1
- package/dist/core/verse/activity-api.js +62 -14
- package/dist/core/verse/activity-api.js.map +1 -1
- package/dist/core/verse/authority-api.d.ts +9 -1
- package/dist/core/verse/authority-api.js +82 -2
- package/dist/core/verse/authority-api.js.map +1 -1
- package/dist/core/verse/seat-readiness.d.ts +25 -0
- package/dist/core/verse/seat-readiness.js +43 -6
- package/dist/core/verse/seat-readiness.js.map +1 -1
- package/dist/core/verse/verse-api.d.ts +3 -1
- package/dist/core/verse/verse-api.js +6 -0
- package/dist/core/verse/verse-api.js.map +1 -1
- package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js → ActionMenu-Dwjk6rUQ.js} +2 -2
- package/dist/core/web/public/next/assets/{ActionMenu-B4-39f2S.js.map → ActionMenu-Dwjk6rUQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/Advanced-cVYTAsfB.js +2 -0
- package/dist/core/web/public/next/assets/{Advanced-B-LqYXvd.js.map → Advanced-cVYTAsfB.js.map} +1 -1
- package/dist/core/web/public/next/assets/App-IsaWDsdF.js +7 -0
- package/dist/core/web/public/next/assets/{App-E2zCDRxm.js.map → App-IsaWDsdF.js.map} +1 -1
- package/dist/core/web/public/next/assets/AppsSection-DDqeSrty.js +2 -0
- package/dist/core/web/public/next/assets/{AppsSection-8wXPPhZb.js.map → AppsSection-DDqeSrty.js.map} +1 -1
- package/dist/core/web/public/next/assets/{AreaTrend-BFimExYn.js → AreaTrend-C32rUaxm.js} +2 -2
- package/dist/core/web/public/next/assets/{AreaTrend-BFimExYn.js.map → AreaTrend-C32rUaxm.js.map} +1 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-CmSSTHVe.css +1 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-CpFYS3tQ.js +3 -0
- package/dist/core/web/public/next/assets/AutonomyOffState-CpFYS3tQ.js.map +1 -0
- package/dist/core/web/public/next/assets/AutonomySection-Dwn8UtOy.js +2 -0
- package/dist/core/web/public/next/assets/{AutonomySection-B46igJKR.js.map → AutonomySection-Dwn8UtOy.js.map} +1 -1
- package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js → BranchBar-ISZ7xUCj.js} +2 -2
- package/dist/core/web/public/next/assets/{BranchBar-BRkrEQGs.js.map → BranchBar-ISZ7xUCj.js.map} +1 -1
- package/dist/core/web/public/next/assets/BudgetControl-BARVp-En.js +2 -0
- package/dist/core/web/public/next/assets/BudgetControl-BARVp-En.js.map +1 -0
- package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js → Button-DtE0rlWD.js} +2 -2
- package/dist/core/web/public/next/assets/{Button-BhO-WKPp.js.map → Button-DtE0rlWD.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js → CapacityStrip-DKbKA_Aa.js} +2 -2
- package/dist/core/web/public/next/assets/{CapacityStrip-CkFz5vq2.js.map → CapacityStrip-DKbKA_Aa.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ChartFrame-SygZ7B3x.js → ChartFrame-DK_BDXCt.js} +2 -2
- package/dist/core/web/public/next/assets/{ChartFrame-SygZ7B3x.js.map → ChartFrame-DK_BDXCt.js.map} +1 -1
- package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js +3 -0
- package/dist/core/web/public/next/assets/ChatSection-C9myY4ei.js.map +1 -0
- package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js → CloudBudgetForm-CvjK4Oh6.js} +2 -2
- package/dist/core/web/public/next/assets/{CloudBudgetForm-Bd91iStN.js.map → CloudBudgetForm-CvjK4Oh6.js.map} +1 -1
- package/dist/core/web/public/next/assets/{CommandPalette-B6SgDJH-.js → CommandPalette-DzPsth0u.js} +2 -2
- package/dist/core/web/public/next/assets/{CommandPalette-B6SgDJH-.js.map → CommandPalette-DzPsth0u.js.map} +1 -1
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js +3 -0
- package/dist/core/web/public/next/assets/CommandSection-Brp73iox.js.map +1 -0
- package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js → ConfirmDialog-CLUhzaBj.js} +2 -2
- package/dist/core/web/public/next/assets/{ConfirmDialog-Bv4hdK2T.js.map → ConfirmDialog-CLUhzaBj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js → DeleteChatDialog-C_eDhV8b.js} +2 -2
- package/dist/core/web/public/next/assets/{DeleteChatDialog-CH1Ix8Eh.js.map → DeleteChatDialog-C_eDhV8b.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js → Dialog-BRd_B9OE.js} +2 -2
- package/dist/core/web/public/next/assets/{Dialog-BSsIFNqD.js.map → Dialog-BRd_B9OE.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js → DiffPane-Cpr9soB2.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffPane-BpNuJmth.js.map → DiffPane-Cpr9soB2.js.map} +1 -1
- package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js → DiffViewer-CNwd0W3Q.js} +2 -2
- package/dist/core/web/public/next/assets/{DiffViewer-CJarUvs0.js.map → DiffViewer-CNwd0W3Q.js.map} +1 -1
- package/dist/core/web/public/next/assets/DockHost-BcEq2qaS.js +2 -0
- package/dist/core/web/public/next/assets/{DockHost-DW9q0NdR.js.map → DockHost-BcEq2qaS.js.map} +1 -1
- package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js → EmptyState-DsN1H6MC.js} +2 -2
- package/dist/core/web/public/next/assets/{EmptyState-DPrd2aak.js.map → EmptyState-DsN1H6MC.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js → Epistemic-fycQTBRO.js} +2 -2
- package/dist/core/web/public/next/assets/{Epistemic-D7MxSmED.js.map → Epistemic-fycQTBRO.js.map} +1 -1
- package/dist/core/web/public/next/assets/EvidenceTimeline-PBDAiSuG.css +1 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-sCCAdnBK.js +2 -0
- package/dist/core/web/public/next/assets/EvidenceTimeline-sCCAdnBK.js.map +1 -0
- package/dist/core/web/public/next/assets/{FleetSection-BdZN6rGS.js → FleetSection-BG8iGraG.js} +3 -3
- package/dist/core/web/public/next/assets/{FleetSection-BdZN6rGS.js.map → FleetSection-BG8iGraG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Funnel-BeNQZWv2.js → Funnel-B88_wpA4.js} +2 -2
- package/dist/core/web/public/next/assets/{Funnel-BeNQZWv2.js.map → Funnel-B88_wpA4.js.map} +1 -1
- package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js → GearTray-CpDt0xwj.js} +2 -2
- package/dist/core/web/public/next/assets/{GearTray-CIPtzeIx.js.map → GearTray-CpDt0xwj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{GrowthSection-iiQg6wvK.js → GrowthSection-BvZezOsX.js} +2 -2
- package/dist/core/web/public/next/assets/{GrowthSection-iiQg6wvK.js.map → GrowthSection-BvZezOsX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js → HandoffDialog-B1G6gQyk.js} +2 -2
- package/dist/core/web/public/next/assets/{HandoffDialog-DrQ6ofuy.js.map → HandoffDialog-B1G6gQyk.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js → Input-CI0yBHmn.js} +2 -2
- package/dist/core/web/public/next/assets/{Input-C0MQxEM6.js.map → Input-CI0yBHmn.js.map} +1 -1
- package/dist/core/web/public/next/assets/{LeaderCard-BRr3_yE-.js → LeaderCard-BxxiEg4e.js} +2 -2
- package/dist/core/web/public/next/assets/{LeaderCard-BRr3_yE-.js.map → LeaderCard-BxxiEg4e.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MatrixHeatmap-DZvZeWXL.js → MatrixHeatmap-iPFEU2Tv.js} +2 -2
- package/dist/core/web/public/next/assets/{MatrixHeatmap-DZvZeWXL.js.map → MatrixHeatmap-iPFEU2Tv.js.map} +1 -1
- package/dist/core/web/public/next/assets/McpSection-nuXer4K-.js +2 -0
- package/dist/core/web/public/next/assets/{McpSection-BRuCcTjT.js.map → McpSection-nuXer4K-.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js → MessageMarkdown-BCe4TsXk.js} +3 -3
- package/dist/core/web/public/next/assets/{MessageMarkdown-bRvD5nSc.js.map → MessageMarkdown-BCe4TsXk.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js → MessageMarkdownRenderer-DL3LU5kL.js} +2 -2
- package/dist/core/web/public/next/assets/{MessageMarkdownRenderer-FjjkPKA2.js.map → MessageMarkdownRenderer-DL3LU5kL.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js → Meter-b69LM0mU.js} +2 -2
- package/dist/core/web/public/next/assets/{Meter-CFNLpwA-.js.map → Meter-b69LM0mU.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MindSection-BTIiQS8P.js → MindSection-Dc5v5rH3.js} +2 -2
- package/dist/core/web/public/next/assets/{MindSection-BTIiQS8P.js.map → MindSection-Dc5v5rH3.js.map} +1 -1
- package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js → MutationTokenDialog-Bm34BNVV.js} +2 -2
- package/dist/core/web/public/next/assets/{MutationTokenDialog-T7gv3a9r.js.map → MutationTokenDialog-Bm34BNVV.js.map} +1 -1
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js +3 -0
- package/dist/core/web/public/next/assets/NeedsYouDrawer-N1cWJjpz.js.map +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-CH6Mq-E_.css +1 -0
- package/dist/core/web/public/next/assets/NeedsYouList-D5Kk549g.js +2 -0
- package/dist/core/web/public/next/assets/{NeedsYouList-BgH8ezqf.js.map → NeedsYouList-D5Kk549g.js.map} +1 -1
- package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js → NewChatDialog-BqFTWgHU.js} +2 -2
- package/dist/core/web/public/next/assets/{NewChatDialog-Db5Xjrk8.js.map → NewChatDialog-BqFTWgHU.js.map} +1 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-DcDsguAM.js +3 -0
- package/dist/core/web/public/next/assets/OnboardingFlow-DcDsguAM.js.map +1 -0
- package/dist/core/web/public/next/assets/OnboardingGate-BZafM1Vf.js +3 -0
- package/dist/core/web/public/next/assets/{OnboardingGate-C4VXn7BJ.js.map → OnboardingGate-BZafM1Vf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{PreviewPane-BPBbcROb.js → PreviewPane-zT3gK9TD.js} +2 -2
- package/dist/core/web/public/next/assets/{PreviewPane-BPBbcROb.js.map → PreviewPane-zT3gK9TD.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js → ProviderLogo-AwHn2sKm.js} +2 -2
- package/dist/core/web/public/next/assets/{ProviderLogo-CT2cSfkg.js.map → ProviderLogo-AwHn2sKm.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js → RailStatus-xHrovWvI.js} +2 -2
- package/dist/core/web/public/next/assets/{RailStatus-Vgl0GYtd.js.map → RailStatus-xHrovWvI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js → RefreshIndicator-SEFZlMB2.js} +2 -2
- package/dist/core/web/public/next/assets/{RefreshIndicator-CSyqpY_q.js.map → RefreshIndicator-SEFZlMB2.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BX2nkdmZ.js → ResourcePoolConsoleApp-CAxPQ4sZ.js} +3 -3
- package/dist/core/web/public/next/assets/{ResourcePoolConsoleApp-BX2nkdmZ.js.map → ResourcePoolConsoleApp-CAxPQ4sZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/ResourcesChrome-BnhnEdJe.js +3 -0
- package/dist/core/web/public/next/assets/{ResourcesChrome-B2U2lO1H.js.map → ResourcesChrome-BnhnEdJe.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ResourcesDrawer-DlUKOjl9.js → ResourcesDrawer-BAFGodny.js} +2 -2
- package/dist/core/web/public/next/assets/{ResourcesDrawer-DlUKOjl9.js.map → ResourcesDrawer-BAFGodny.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js → RouteErrorBoundary-C8WGiixc.js} +2 -2
- package/dist/core/web/public/next/assets/{RouteErrorBoundary-BaC7YVzR.js.map → RouteErrorBoundary-C8WGiixc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js → RunInCloudAction-1-IPLYhf.js} +2 -2
- package/dist/core/web/public/next/assets/{RunInCloudAction-D5PDHJPE.js.map → RunInCloudAction-1-IPLYhf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js → SeatSelector-DpwNiX8F.js} +2 -2
- package/dist/core/web/public/next/assets/{SeatSelector-Cg75LInq.js.map → SeatSelector-DpwNiX8F.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Segmented-CametjLt.js → Segmented-Wt1ATod9.js} +2 -2
- package/dist/core/web/public/next/assets/{Segmented-CametjLt.js.map → Segmented-Wt1ATod9.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Select-De52fghU.js → Select-By-V9lMc.js} +2 -2
- package/dist/core/web/public/next/assets/{Select-De52fghU.js.map → Select-By-V9lMc.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js → SessionGate-WROS02tK.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionGate-CzlcNq3O.js.map → SessionGate-WROS02tK.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js → SessionInsightChip-DNUcruwp.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionInsightChip-Bk_Owa7u.js.map → SessionInsightChip-DNUcruwp.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js → SessionSearch-UHtt7a8f.js} +2 -2
- package/dist/core/web/public/next/assets/{SessionSearch-C6C8DHN8.js.map → SessionSearch-UHtt7a8f.js.map} +1 -1
- package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.js → SettingsSection-Bf74l0Gj.js} +2 -2
- package/dist/core/web/public/next/assets/{SettingsSection-mI9wQYZg.js.map → SettingsSection-Bf74l0Gj.js.map} +1 -1
- package/dist/core/web/public/next/assets/SetupChecklist-BhZpFLsj.css +1 -0
- package/dist/core/web/public/next/assets/SetupChecklist-CzpEcfOl.js +2 -0
- package/dist/core/web/public/next/assets/SetupChecklist-CzpEcfOl.js.map +1 -0
- package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js → Sheet-HkBOBMTT.js} +2 -2
- package/dist/core/web/public/next/assets/{Sheet-CJhK9Dqv.js.map → Sheet-HkBOBMTT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js → ShortcutsOverlay-DiigiT8H.js} +2 -2
- package/dist/core/web/public/next/assets/{ShortcutsOverlay-DDW-i9Fc.js.map → ShortcutsOverlay-DiigiT8H.js.map} +1 -1
- package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js +3 -0
- package/dist/core/web/public/next/assets/Sidebar-C9YtBYVZ.js.map +1 -0
- package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js → Slider-DaEDws-b.js} +2 -2
- package/dist/core/web/public/next/assets/{Slider-Bwd9HfXl.js.map → Slider-DaEDws-b.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StatTile-DPZ5yyaU.js → StatTile-CTX41O6y.js} +2 -2
- package/dist/core/web/public/next/assets/{StatTile-DPZ5yyaU.js.map → StatTile-CTX41O6y.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js → StatusBadge-CXG3iNL4.js} +2 -2
- package/dist/core/web/public/next/assets/{StatusBadge-DHKRtttH.js.map → StatusBadge-CXG3iNL4.js.map} +1 -1
- package/dist/core/web/public/next/assets/{StepBand-DQykLkk_.js → StepBand-jJTqYIdX.js} +2 -2
- package/dist/core/web/public/next/assets/{StepBand-DQykLkk_.js.map → StepBand-jJTqYIdX.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js → Surface-5bNA08tK.js} +2 -2
- package/dist/core/web/public/next/assets/{Surface-D--LXgQm.js.map → Surface-5bNA08tK.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Swimlane-BzH6OCee.js → Swimlane-LrslsGxw.js} +2 -2
- package/dist/core/web/public/next/assets/{Swimlane-BzH6OCee.js.map → Swimlane-LrslsGxw.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js → Switch-BmCzfFnu.js} +2 -2
- package/dist/core/web/public/next/assets/{Switch-PMixU6b0.js.map → Switch-BmCzfFnu.js.map} +1 -1
- package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js → Tag-WSUIaMVy.js} +2 -2
- package/dist/core/web/public/next/assets/{Tag-fordBsrJ.js.map → Tag-WSUIaMVy.js.map} +1 -1
- package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js → TerminalPane-BVFgYX6K.js} +5 -5
- package/dist/core/web/public/next/assets/{TerminalPane-BSnGdUuF.js.map → TerminalPane-BVFgYX6K.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-DtXFhAhw.js → UniverseConsoleApp-BpphLqoz.js} +2 -2
- package/dist/core/web/public/next/assets/{UniverseConsoleApp-DtXFhAhw.js.map → UniverseConsoleApp-BpphLqoz.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js → UniverseView-DbpbSMwO.js} +4 -4
- package/dist/core/web/public/next/assets/{UniverseView-sWm3pnTW.js.map → UniverseView-DbpbSMwO.js.map} +1 -1
- package/dist/core/web/public/next/assets/{UsageSection-CiD1DbuF.js → UsageSection-CUlaKtws.js} +3 -3
- package/dist/core/web/public/next/assets/{UsageSection-CiD1DbuF.js.map → UsageSection-CUlaKtws.js.map} +1 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js +3 -0
- package/dist/core/web/public/next/assets/VerseConsoleApp-DXDv1aOi.js.map +1 -0
- package/dist/core/web/public/next/assets/{Workspace-BQSZFSeO.js → Workspace-RXy0pqp6.js} +5 -5
- package/dist/core/web/public/next/assets/{Workspace-BQSZFSeO.js.map → Workspace-RXy0pqp6.js.map} +1 -1
- package/dist/core/web/public/next/assets/{actions-Ci6I4C0l.js → actions-BZTidCXZ.js} +2 -2
- package/dist/core/web/public/next/assets/{actions-Ci6I4C0l.js.map → actions-BZTidCXZ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js → apps-model-CHO133qt.js} +2 -2
- package/dist/core/web/public/next/assets/{apps-model-DlwnfqwJ.js.map → apps-model-CHO133qt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js → authority-model-8NeAEwAF.js} +2 -2
- package/dist/core/web/public/next/assets/{authority-model-BFuPezSo.js.map → authority-model-8NeAEwAF.js.map} +1 -1
- package/dist/core/web/public/next/assets/{budget-queries-DsAjH8ac.js → budget-queries-DFF-3ICg.js} +2 -2
- package/dist/core/web/public/next/assets/{budget-queries-DsAjH8ac.js.map → budget-queries-DFF-3ICg.js.map} +1 -1
- package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js → capacity-strip-model-5ViUgUlP.js} +2 -2
- package/dist/core/web/public/next/assets/{capacity-strip-model-Dn1cNOhz.js.map → capacity-strip-model-5ViUgUlP.js.map} +1 -1
- package/dist/core/web/public/next/assets/{charts-C_xJbJiw.js → charts-CzxWrZn7.js} +2 -2
- package/dist/core/web/public/next/assets/{charts-C_xJbJiw.js.map → charts-CzxWrZn7.js.map} +1 -1
- package/dist/core/web/public/next/assets/cloud-model-CfRydq8N.js +2 -0
- package/dist/core/web/public/next/assets/{cloud-model-CX407gPY.js.map → cloud-model-CfRydq8N.js.map} +1 -1
- package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js → cloud-queries-DmptbjS8.js} +2 -2
- package/dist/core/web/public/next/assets/{cloud-queries-QAhpExlz.js.map → cloud-queries-DmptbjS8.js.map} +1 -1
- package/dist/core/web/public/next/assets/{command-catalog-CF0cQQac.js → command-catalog-ffCAijVY.js} +2 -2
- package/dist/core/web/public/next/assets/{command-catalog-CF0cQQac.js.map → command-catalog-ffCAijVY.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js → context-model-Bb15chFt.js} +2 -2
- package/dist/core/web/public/next/assets/{context-model-DV1zCfAm.js.map → context-model-Bb15chFt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js → context-model-CDeyP0cA.js} +2 -2
- package/dist/core/web/public/next/assets/{context-model-Co4wh3SM.js.map → context-model-CDeyP0cA.js.map} +1 -1
- package/dist/core/web/public/next/assets/{context-queries-CktFQqSS.js → context-queries-_9bFWb9v.js} +2 -2
- package/dist/core/web/public/next/assets/{context-queries-CktFQqSS.js.map → context-queries-_9bFWb9v.js.map} +1 -1
- package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js → control-queries-CXtmZZH6.js} +2 -2
- package/dist/core/web/public/next/assets/{control-queries-DAvlh_YM.js.map → control-queries-CXtmZZH6.js.map} +1 -1
- package/dist/core/web/public/next/assets/copy-setup-BIp0iaiZ.js +2 -0
- package/dist/core/web/public/next/assets/copy-setup-BIp0iaiZ.js.map +1 -0
- package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js → dock-icons-Cc43W7r4.js} +2 -2
- package/dist/core/web/public/next/assets/{dock-icons-BFuBbqJl.js.map → dock-icons-Cc43W7r4.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js → fleet-model-DOK8ZtEt.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-model-Dfd5JyLR.js.map → fleet-model-DOK8ZtEt.js.map} +1 -1
- package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js → fleet-queries-BeEAqD6y.js} +2 -2
- package/dist/core/web/public/next/assets/{fleet-queries-RtMTd5rR.js.map → fleet-queries-BeEAqD6y.js.map} +1 -1
- package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js → focus-trap-ChZ5EFfM.js} +2 -2
- package/dist/core/web/public/next/assets/{focus-trap-BdrbWfC4.js.map → focus-trap-ChZ5EFfM.js.map} +1 -1
- package/dist/core/web/public/next/assets/format-BmH2yWL6.js +2 -0
- package/dist/core/web/public/next/assets/format-BmH2yWL6.js.map +1 -0
- package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js → git-model-BFwAVbxF.js} +2 -2
- package/dist/core/web/public/next/assets/{git-model-_BnI_Ogh.js.map → git-model-BFwAVbxF.js.map} +1 -1
- package/dist/core/web/public/next/assets/global-y_exIyAP.js +2 -0
- package/dist/core/web/public/next/assets/{global-CNNGMril.js.map → global-y_exIyAP.js.map} +1 -1
- package/dist/core/web/public/next/assets/{guarded-runners-DPh2d32e.js → guarded-runners-Cd4POBtI.js} +2 -2
- package/dist/core/web/public/next/assets/{guarded-runners-DPh2d32e.js.map → guarded-runners-Cd4POBtI.js.map} +1 -1
- package/dist/core/web/public/next/assets/{icons-0haWy6nh.js → icons-CygCEFWs.js} +2 -2
- package/dist/core/web/public/next/assets/{icons-0haWy6nh.js.map → icons-CygCEFWs.js.map} +1 -1
- package/dist/core/web/public/next/assets/{index-QesfXBsb.js → index-CyK31YRm.js} +3 -3
- package/dist/core/web/public/next/assets/{index-QesfXBsb.js.map → index-CyK31YRm.js.map} +1 -1
- package/dist/core/web/public/next/assets/{live-model-De-q0ZFK.js → live-model-D7hilYFk.js} +2 -2
- package/dist/core/web/public/next/assets/live-model-D7hilYFk.js.map +1 -0
- package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js → mind.module-B15k0Y9q.js} +2 -2
- package/dist/core/web/public/next/assets/{mind.module-BrK2nFOL.js.map → mind.module-B15k0Y9q.js.map} +1 -1
- package/dist/core/web/public/next/assets/mutations-CWlxEMEm.js +2 -0
- package/dist/core/web/public/next/assets/{mutations-DTCtKCn_.js.map → mutations-CWlxEMEm.js.map} +1 -1
- package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js → nav-mimleI0R.js} +2 -2
- package/dist/core/web/public/next/assets/{nav-KmGX0CVz.js.map → nav-mimleI0R.js.map} +1 -1
- package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js → overnight-queries-DJ4mZKSj.js} +2 -2
- package/dist/core/web/public/next/assets/{overnight-queries-mlO0xzsr.js.map → overnight-queries-DJ4mZKSj.js.map} +1 -1
- package/dist/core/web/public/next/assets/primitives-DMijqcu0.js +1 -0
- package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js → queries-Bw1McHTj.js} +2 -2
- package/dist/core/web/public/next/assets/{queries-CyBE8nsW.js.map → queries-Bw1McHTj.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js → reasoning-pref-KkhI_5-j.js} +2 -2
- package/dist/core/web/public/next/assets/{reasoning-pref-CaoA4_Vl.js.map → reasoning-pref-KkhI_5-j.js.map} +1 -1
- package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js → reveal-anchor-CCCx_kfT.js} +2 -2
- package/dist/core/web/public/next/assets/{reveal-anchor-BP1VqnPU.js.map → reveal-anchor-CCCx_kfT.js.map} +1 -1
- package/dist/core/web/public/next/assets/{seat-subscription-C5Tvr0WQ.js → seat-subscription-BhUUz7VL.js} +2 -2
- package/dist/core/web/public/next/assets/{seat-subscription-C5Tvr0WQ.js.map → seat-subscription-BhUUz7VL.js.map} +1 -1
- package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js → sidebar-model-Dcd437cf.js} +2 -2
- package/dist/core/web/public/next/assets/{sidebar-model-B5Qk95k_.js.map → sidebar-model-Dcd437cf.js.map} +1 -1
- package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js → slots-BL_J5mmV.js} +3 -3
- package/dist/core/web/public/next/assets/{slots-DHKQDoE6.js.map → slots-BL_J5mmV.js.map} +1 -1
- package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js → surface-data-C3UAQ4QX.js} +2 -2
- package/dist/core/web/public/next/assets/{surface-data-CchClvHo.js.map → surface-data-C3UAQ4QX.js.map} +1 -1
- package/dist/core/web/public/next/assets/surface-prefetch-BXKjPsV5.js +2 -0
- package/dist/core/web/public/next/assets/{surface-prefetch-BWr0LBQn.js.map → surface-prefetch-BXKjPsV5.js.map} +1 -1
- package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js → tasks-model-CzHvclVm.js} +2 -2
- package/dist/core/web/public/next/assets/{tasks-model-D6WFVULI.js.map → tasks-model-CzHvclVm.js.map} +1 -1
- package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js → terminal-icons-BwgQTQP0.js} +2 -2
- package/dist/core/web/public/next/assets/{terminal-icons-BvCvuXk2.js.map → terminal-icons-BwgQTQP0.js.map} +1 -1
- package/dist/core/web/public/next/assets/types-IYKrYLku.js +2 -0
- package/dist/core/web/public/next/assets/types-IYKrYLku.js.map +1 -0
- package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js → usage-queries-pXxvy54x.js} +2 -2
- package/dist/core/web/public/next/assets/{usage-queries-D1SU1t7r.js.map → usage-queries-pXxvy54x.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js → use-guarded-action-EgVWjM5c.js} +2 -2
- package/dist/core/web/public/next/assets/{use-guarded-action-BZmBv7CJ.js.map → use-guarded-action-EgVWjM5c.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js → use-ticker-BoqFxRFG.js} +2 -2
- package/dist/core/web/public/next/assets/{use-ticker-CkJ4-0wU.js.map → use-ticker-BoqFxRFG.js.map} +1 -1
- package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js → use-token-gate-DSNIIpI6.js} +2 -2
- package/dist/core/web/public/next/assets/{use-token-gate-CYcfk_GS.js.map → use-token-gate-DSNIIpI6.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js → useOnboarding-Bk0VnkxQ.js} +2 -2
- package/dist/core/web/public/next/assets/{useOnboarding-CujRS6PK.js.map → useOnboarding-Bk0VnkxQ.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js → useSeatsRefresh-q7Id9RcW.js} +2 -2
- package/dist/core/web/public/next/assets/{useSeatsRefresh-BEaQdkZs.js.map → useSeatsRefresh-q7Id9RcW.js.map} +1 -1
- package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js → useVerseTranscript-CqH51rt9.js} +2 -2
- package/dist/core/web/public/next/assets/{useVerseTranscript-BQ0J6Xhx.js.map → useVerseTranscript-CqH51rt9.js.map} +1 -1
- package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js → verse-icons-DsG1dOQx.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-icons-DndgEgKS.js.map → verse-icons-DsG1dOQx.js.map} +1 -1
- package/dist/core/web/public/next/assets/{verse-model-MMySehjj.js → verse-model-JTuvRBVK.js} +2 -2
- package/dist/core/web/public/next/assets/{verse-model-MMySehjj.js.map → verse-model-JTuvRBVK.js.map} +1 -1
- package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js → warmup-Bv1RumVq.js} +3 -3
- package/dist/core/web/public/next/assets/{warmup-CNEH_-be.js.map → warmup-Bv1RumVq.js.map} +1 -1
- package/dist/core/web/public/next/assets/why-seat-model-Cau8qG6O.js +2 -0
- package/dist/core/web/public/next/assets/why-seat-model-Cau8qG6O.js.map +1 -0
- package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js → workspace-model-D-SLfads.js} +2 -2
- package/dist/core/web/public/next/assets/{workspace-model-Dukb2wwv.js.map → workspace-model-D-SLfads.js.map} +1 -1
- package/dist/core/web/public/next/index.html +1 -1
- package/dist/release-dependency-inventory.json +1 -1
- package/docs/AUTONOMY-GAP.md +1 -1
- package/package.json +1 -1
- package/dist/core/web/public/next/assets/Advanced-B-LqYXvd.js +0 -2
- package/dist/core/web/public/next/assets/App-E2zCDRxm.js +0 -7
- package/dist/core/web/public/next/assets/AppsSection-8wXPPhZb.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js +0 -2
- package/dist/core/web/public/next/assets/AutonomyOffState-B5eEkmiz.js.map +0 -1
- package/dist/core/web/public/next/assets/AutonomyOffState-DmbE71vI.css +0 -1
- package/dist/core/web/public/next/assets/AutonomySection-B46igJKR.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js +0 -2
- package/dist/core/web/public/next/assets/BudgetControl-T_RjPrw9.js.map +0 -1
- package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js +0 -3
- package/dist/core/web/public/next/assets/ChatSection-D6WybBpB.js.map +0 -1
- package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js +0 -2
- package/dist/core/web/public/next/assets/CommandSection-DgMGoepd.js.map +0 -1
- package/dist/core/web/public/next/assets/DockHost-DW9q0NdR.js +0 -2
- package/dist/core/web/public/next/assets/McpSection-BRuCcTjT.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouDrawer-lYN4G_aM.js.map +0 -1
- package/dist/core/web/public/next/assets/NeedsYouList-BgH8ezqf.js +0 -2
- package/dist/core/web/public/next/assets/NeedsYouList-CruOt4JT.css +0 -1
- package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js +0 -2
- package/dist/core/web/public/next/assets/OnboardingFlow-LoY-zuSe.js.map +0 -1
- package/dist/core/web/public/next/assets/OnboardingGate-C4VXn7BJ.js +0 -3
- package/dist/core/web/public/next/assets/ResourcesChrome-B2U2lO1H.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js +0 -3
- package/dist/core/web/public/next/assets/Sidebar-DT7ykaqS.js.map +0 -1
- package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js +0 -3
- package/dist/core/web/public/next/assets/VerseConsoleApp-BCY5uSok.js.map +0 -1
- package/dist/core/web/public/next/assets/cloud-model-CX407gPY.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js +0 -2
- package/dist/core/web/public/next/assets/copy-setup-CqRSfELB.js.map +0 -1
- package/dist/core/web/public/next/assets/format-Dk4Fmxax.js +0 -2
- package/dist/core/web/public/next/assets/format-Dk4Fmxax.js.map +0 -1
- package/dist/core/web/public/next/assets/global-CNNGMril.js +0 -2
- package/dist/core/web/public/next/assets/live-model-De-q0ZFK.js.map +0 -1
- package/dist/core/web/public/next/assets/mutations-DTCtKCn_.js +0 -2
- package/dist/core/web/public/next/assets/primitives-D0Fb3TtS.js +0 -1
- package/dist/core/web/public/next/assets/surface-prefetch-BWr0LBQn.js +0 -2
- package/dist/core/web/public/next/assets/types-D5XOdyw8.js +0 -2
- package/dist/core/web/public/next/assets/types-D5XOdyw8.js.map +0 -1
- package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js +0 -2
- package/dist/core/web/public/next/assets/why-seat-model-jlDTwYSc.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CommandPalette-B6SgDJH-.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' : 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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"}
|
|
1
|
+
{"version":3,"file":"CommandPalette-DzPsth0u.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' : 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,3 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/EvidenceTimeline-sCCAdnBK.js","assets/global-BlI2BYa1.css","assets/StatusBadge-BVi0IBb9.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-Cxqr-3qc.css","assets/Button-DrnKsvnQ.css","assets/Sheet-ChxlNivX.css","assets/EvidenceTimeline-PBDAiSuG.css"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{a as e,c as t,n,t as r}from"./index-CyK31YRm.js";import{H as i,J as a,h as o,m as s,s as c}from"./global-y_exIyAP.js";import{t as l}from"./focus-trap-ChZ5EFfM.js";import{t as u}from"./Dialog-BRd_B9OE.js";import{n as d}from"./StatusBadge-CXG3iNL4.js";import{t as f}from"./RefreshIndicator-SEFZlMB2.js";import{t as p}from"./Swimlane-LrslsGxw.js";import{t as m}from"./StatTile-CTX41O6y.js";import{t as h}from"./ProviderLogo-AwHn2sKm.js";import{B as g,D as _,H as v,I as y,L as b,Lt as x,R as S,in as C,kt as w}from"./VerseConsoleApp-DXDv1aOi.js";import{n as T,p as E}from"./verse-model-JTuvRBVK.js";import{t as ee}from"./Segmented-Wt1ATod9.js";import{b as te,y as D}from"./format-BmH2yWL6.js";import{n as ne,r as O}from"./budget-queries-DFF-3ICg.js";import{_ as k,b as re,n as ie,o as A,r as j,s as M,t as N}from"./capacity-strip-model-5ViUgUlP.js";import{n as ae,t as P}from"./Button-DtE0rlWD.js";import{_ as oe,c as se,f as ce,g as le,h as ue,i as de,x as fe}from"./icons-CygCEFWs.js";import{a as pe}from"./command-catalog-ffCAijVY.js";import{t as me}from"./Meter-b69LM0mU.js";import{i as he,o as ge,r as _e,s as ve,t as ye}from"./AutonomyOffState-CpFYS3tQ.js";import{t as be}from"./Switch-BmCzfFnu.js";import{t as xe}from"./BudgetControl-BARVp-En.js";import{n as Se,t as Ce}from"./types-IYKrYLku.js";import{t as we}from"./Sheet-HkBOBMTT.js";import{C as Te,S as Ee,_ as F,a as De,b as Oe,c as ke,d as Ae,f as je,h as Me,i as Ne,l as Pe,m as Fe,n as Ie,r as Le,u as Re,v as ze,w as Be,x as Ve,y as He}from"./cloud-model-CfRydq8N.js";import{a as Ue,c as We,i as Ge,n as Ke,o as qe,r as I,s as Je}from"./cloud-queries-DmptbjS8.js";import{t as L}from"./cloud.module-DOP-N4Ch.js";import{t as R}from"./use-ticker-BoqFxRFG.js";import{t as Ye}from"./use-guarded-action-EgVWjM5c.js";import{i as z,n as Xe,r as Ze,t as Qe}from"./nav-mimleI0R.js";import{a as B,c as V,d as $e,i as et,n as tt,o as nt,r as rt,t as it}from"./surface-data-C3UAQ4QX.js";import{t as at}from"./Input-CI0yBHmn.js";import{a as ot,c as st,i as ct,l as lt,n as ut,r as dt,s as ft,t as H}from"./authority-model-8NeAEwAF.js";import{t as pt}from"./binding-left-DZpq5sLf.js";import{n as mt,r as U,t as ht}from"./actions-BZTidCXZ.js";import{a as gt,i as W,n as G,r as K,t as q}from"./Surface-5bNA08tK.js";import{a as _t,c as vt,f as yt,m as bt,o as xt,p as St,r as Ct,t as wt,u as Tt}from"./CloudBudgetForm-CvjK4Oh6.js";import{n as Et}from"./LeaderCard-BxxiEg4e.js";import{d as Dt,f as Ot,n as kt}from"./NeedsYouList-D5Kk549g.js";import{f as At,s as jt}from"./live-model-D7hilYFk.js";var J=t(e(),1),Y=n(),Mt=864e5;function Nt(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`}):`—`}function Pt(e){let t=Date.parse(e.issuedAt),n=Date.parse(e.expiresAt);return Number.isFinite(t)&&Number.isFinite(n)?Math.round((n-t)/Mt):null}function Ft(e){let t=e.criteria,n=[`${e.repos.length} repo${e.repos.length===1?``:`s`}`,`${e.maxRisk} risk`,`≤ ${e.maxFiles} files / ${e.maxLines} lines`,`≤ ${e.maxMergesPerRepoPerDay} merges/repo/day`],r=[`${t.minMerges} merges`,`${t.minHours} h`,t.minPostMergeGreenPct?`≥ ${t.minPostMergeGreenPct}% green`:null,`≤ ${t.maxRevertRatePct}% reverts`].filter(Boolean);return`${n.join(` · `)} — advances after ${r.join(`, `)}`}function It({draft:e}){let t=e.payload,n=Pt(t);return(0,Y.jsxs)(`div`,{className:U.scope,children:[(0,Y.jsxs)(`section`,{className:U.scopeBlock,"aria-label":`Expiry`,children:[(0,Y.jsx)(W,{children:`Expiry`}),(0,Y.jsxs)(`p`,{className:U.scopeLead,children:[n===null?`—`:`${n} days`,`, until `,Nt(t.expiresAt)]}),(0,Y.jsxs)(`p`,{className:U.scopeMeta,children:[`Signed by key `,(0,Y.jsx)(`span`,{className:U.mono,children:t.keyId}),` · sequence `,t.grantSeq,` · bound to this Mac`]})]}),(0,Y.jsxs)(`section`,{className:U.scopeBlock,"aria-label":`Repositories`,children:[(0,Y.jsxs)(W,{children:[`Repositories (`,t.repos.length,`)`]}),(0,Y.jsxs)(`table`,{className:U.scopeTable,children:[(0,Y.jsx)(`thead`,{children:(0,Y.jsxs)(`tr`,{children:[(0,Y.jsx)(`th`,{scope:`col`,children:`Repo`}),(0,Y.jsx)(`th`,{scope:`col`,children:`Up to`}),(0,Y.jsx)(`th`,{scope:`col`,children:`Checks`}),(0,Y.jsx)(`th`,{scope:`col`,children:`Risk`}),(0,Y.jsx)(`th`,{scope:`col`,className:U.num,children:`Merges/day`})]})}),(0,Y.jsx)(`tbody`,{children:t.repos.map(e=>(0,Y.jsxs)(`tr`,{children:[(0,Y.jsx)(`td`,{className:U.mono,children:e.nameWithOwner}),(0,Y.jsx)(`td`,{children:e.stage===`merge`?`Merge`:`Propose`}),(0,Y.jsx)(`td`,{children:e.enforcement===`server`?`GitHub`:`Local only`}),(0,Y.jsx)(`td`,{children:e.maxRisk}),(0,Y.jsx)(`td`,{className:U.num,children:e.maxMergesPerDay})]},e.nameWithOwner))})]}),(0,Y.jsxs)(`p`,{className:U.scopeMeta,children:[`Every merge ≤ `,t.merge.maxFiles,` files / `,t.merge.maxLines,` lines · ashlr-hub itself: `,t.merge.selfRepo===`propose-only`?`propose only`:`merge outside authority code`]})]}),(0,Y.jsxs)(`section`,{className:U.scopeBlock,"aria-label":`Spend`,children:[(0,Y.jsx)(W,{children:`Spend`}),(0,Y.jsxs)(`p`,{className:U.scopeLead,children:[`Up to `,t.spend.maxMode===`all-in`?`All-in`:t.spend.maxMode===`balanced`?`Balanced`:`Reserve`,` · metered APIs $`,t.spend.meteredUsdPerDay,`/day`]}),(0,Y.jsx)(`ul`,{className:U.scopeList,children:Object.entries(t.spend.seats).map(([e,t])=>(0,Y.jsxs)(`li`,{children:[(0,Y.jsx)(`span`,{className:U.mono,children:e}),t.enabled?`: keeps ${t.reserveFloorPercent}% for you`:`: not used by autonomy`,t.enabled&&t.maxSessionWindowPercent!==void 0?`, never above ${t.maxSessionWindowPercent}% of its 5-hour window`:``,t.enabled?` · ${t.roles.join(`, `)}`:``]},e))})]}),(0,Y.jsxs)(`section`,{className:U.scopeBlock,"aria-label":`Engines and Leader`,children:[(0,Y.jsx)(W,{children:`Engines and Leader`}),(0,Y.jsx)(`p`,{className:U.scopeLead,children:t.engines.join(`, `)||`none`}),(0,Y.jsxs)(`p`,{className:U.scopeMeta,children:[`Leader classes `,t.leader.classes.length?t.leader.classes.join(` + `):`none (proposes only)`,` · class-B veto window `,t.leader.vetoMinutes,` min · goal conductor `,t.conductorGoals?`on`:`off`]})]}),(0,Y.jsxs)(`section`,{className:U.scopeBlock,"aria-label":`Rollout ladder`,children:[(0,Y.jsxs)(W,{children:[`Rollout ladder (`,t.rollout.stages.length,` stages, advances by itself)`]}),(0,Y.jsx)(`ol`,{className:U.ladder,children:t.rollout.stages.map(e=>(0,Y.jsxs)(`li`,{children:[(0,Y.jsx)(`span`,{className:U.ladderId,children:e.id}),(0,Y.jsx)(`span`,{children:Ft(e)})]},e.id))}),(0,Y.jsx)(`p`,{className:U.scopeMeta,children:`Any sandbox violation or reserve breach drops it back one stage. It can never climb past the last stage.`})]}),(0,Y.jsxs)(`p`,{className:U.scopeMeta,children:[`Draft digest `,(0,Y.jsxs)(`span`,{className:U.mono,children:[e.digest.slice(0,16),`…`]})]})]})}function Lt({open:e,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o}){let s=(0,J.useId)();return e?(0,Y.jsx)(Rt,{titleId:s,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o}):null}function Rt({titleId:e,intent:t,then:n,busy:r,why:i,onApprove:a,onClose:o}){let c=s(it,{freshMs:0}),l=c.data?.value??null,u=c.data?.reason??null;return(0,Y.jsx)(we,{open:!0,onClose:o,titleId:e,width:600,title:t===`re-approve`?`Re-approve the standing grant`:`Approve a standing grant`,description:i,footer:(0,Y.jsxs)(`div`,{className:U.sheetFooter,children:[(0,Y.jsxs)(`p`,{className:U.sheetFootnote,children:[`Touch ID appears on this Mac. Lowering authority — Off, Stop, Revoke — never needs it.`,n?` After approval the switch moves to ${H[n]}.`:``]}),(0,Y.jsxs)(`span`,{className:U.sheetButtons,children:[(0,Y.jsx)(P,{variant:`ghost`,onClick:o,children:`Cancel`}),(0,Y.jsx)(P,{variant:`primary`,icon:(0,Y.jsx)(ce,{}),disabled:!l,busy:r,onClick:()=>l&&a(l),children:`Approve with Touch ID`})]})]}),children:c.status===`loading`&&!c.data?(0,Y.jsx)(`p`,{className:U.muted,"aria-busy":`true`,children:`Preparing the grant draft…`}):l?(0,Y.jsx)(It,{draft:l}):(0,Y.jsx)(G,{tone:`unknown`,children:u??`Grant draft unreadable — nothing to approve.`})})}var X={"all-in":`All-in`,balanced:`Balanced`,reserve:`Reserve`};function zt(){let e=pe(`fleet.stop`)?.guard?.confirm;return{title:e?.title??`Stop the fleet?`,body:e?.body??`Autonomous work halts within one tick and stays stopped until you resume it. Chats keep running.`,confirmLabel:e?.confirmLabel??`Stop fleet`,destructive:!0}}var Bt={title:`Resume the fleet?`,body:`Autonomy picks up at the switch position on its next tick. Stopping again is one click.`,confirmLabel:`Resume fleet`,destructive:!1};function Vt({tone:e}){return(0,Y.jsx)(`span`,{className:U.dot,"data-tone":e,"aria-hidden":`true`})}function Ht(e){let[t,n]=(0,J.useState)(null);function r(r){if(!t)return;let{then:i}=t,a=dt(r,t.intent);e.act(()=>V({action:a,draftDigest:r.digest}),a===`re-approve`?`Re-approve the standing grant`:`Sign a new standing grant`,{onDone:t=>{n(null),i&&t&&ut[i]<=ut[t.maxSwitchWithoutGrant]&&i!==t.switch&&e.act(()=>V({action:`switch`,to:i}),`Switch autonomy to ${H[i]}`)}})}return{open:(e,t,r=null)=>n({intent:e,then:r,why:t}),sheet:(0,Y.jsx)(Lt,{open:t!==null,intent:t?.intent??`grant`,then:t?.then??null,why:t?.why??``,busy:e.busy,onApprove:r,onClose:()=>n(null)})}}function Ut({read:e,loading:t,budgetMode:n,actions:r,compact:i,now:a,grantFlow:o}){let s=e?.value??null,c=Ht(r),l=o??c,[u,d]=(0,J.useState)(null),[f,p]=(0,J.useState)(!1),m=!s,h=ot(s,a);function g(e){if(!s)return;let t=ct(s,e);if(t!==`same`){if(t===`raise-needs-grant`){let t=s.grant.state===`paused`;l.open(t?`re-approve`:`grant`,t?`${s.grant.reason??`The grant is paused.`} ${H[e]} needs it re-approved.`:`${H[e]} is beyond what the installed grant allows, so it needs a new grant.`,e);return}r.act(()=>V({action:`switch`,to:e}),`Switch autonomy to ${H[e]}`)}}Gt({read:e,status:s,budgetMode:n,actions:r,chip:h,onSwitch:g,openGrant:l.open});let _=st(s||{switch:`off`,maxSwitchWithoutGrant:`off`}),v=s?.kill??!1,y=m||r.busy||r.readOnly,b=(0,Y.jsxs)(`div`,{className:U.switchWrap,title:m?e?.reason??`Reading autonomy state…`:void 0,children:[i?null:(0,Y.jsx)(`span`,{className:U.barLabel,"aria-hidden":`true`,children:`Autonomy`}),(0,Y.jsx)(ee,{size:`sm`,"aria-label":`Autonomy`,value:s?.switch??`off`,onChange:g,options:_.map(e=>({value:e.value,label:(0,Y.jsxs)(`span`,{className:U.switchOption,children:[i?e.short:e.label,e.needsGrant?(0,Y.jsx)(ce,{className:U.touchMark,width:12,height:12,"aria-hidden":`true`}):null]}),ariaLabel:e.ariaLabel,disabled:y}))})]}),x=()=>r.act(()=>V({action:`stop`}),`Stop the fleet`,{confirm:zt(),onDone:e=>d(ft(e))}),S=()=>r.act(()=>V({action:`clear-stop`}),`Resume the fleet`,{confirm:Bt,onDone:()=>d(null)}),C=v?i?(0,Y.jsx)(P,{variant:`subtle`,size:`sm`,icon:(0,Y.jsx)(ue,{}),iconOnly:!0,"aria-label":`Resume the fleet`,disabled:y,onClick:S}):(0,Y.jsx)(P,{variant:`subtle`,size:`sm`,icon:(0,Y.jsx)(ue,{}),disabled:y,onClick:S,children:`Resume`}):i?(0,Y.jsx)(P,{variant:`danger`,size:`sm`,icon:(0,Y.jsx)(fe,{}),iconOnly:!0,"aria-label":`Stop the fleet`,disabled:y,onClick:x}):(0,Y.jsx)(P,{variant:`danger`,size:`sm`,icon:(0,Y.jsx)(fe,{}),disabled:y,onClick:x,children:`Stop`});return(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsxs)(`div`,{className:U.bar,role:`toolbar`,"aria-label":`Autonomy controls`,"data-loading":t||void 0,children:[b,i?null:(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(Z,{mode:n,onOpen:()=>p(!0)}),(0,Y.jsx)(Kt,{chip:h,onOpen:e=>l.open(e,h.detail)})]}),(0,Y.jsx)(`span`,{className:U.barSpacer}),C]}),v&&u?(0,Y.jsx)(`p`,{className:U.muted,role:`status`,children:u}):null,i?(0,Y.jsxs)(`div`,{className:U.barSecondary,children:[(0,Y.jsx)(Z,{mode:n,onOpen:()=>p(!0)}),(0,Y.jsx)(Kt,{chip:h,onOpen:e=>l.open(e,h.detail)})]}):null,o?null:c.sheet,(0,Y.jsx)(qt,{open:f,onClose:()=>p(!1),status:s})]})}function Wt(e){return e.readOnly?`Read-only session: this server was started without dispatch, so autonomy cannot be changed from here.`:e.status?e.busy?`Another autonomy action is still running. Try again when it finishes.`:null:e.reason??`The autonomy state has not been read yet, so nothing was changed.`}function Gt({read:e,status:t,budgetMode:n,actions:r,chip:i,onSwitch:a,openGrant:o}){let s=e!==void 0,c=()=>Wt({status:t,reason:e?.reason??null,readOnly:r.readOnly,busy:r.busy}),l=e=>()=>{let n=c();if(n||!t){g(n??`The autonomy state is unknown, so nothing was changed.`,`neutral`);return}if(t.switch===e){g(`Autonomy is already ${H[e]}.`,`neutral`);return}a(e)};v(`autonomy.off`,l(`off`),s),v(`autonomy.propose`,l(`propose`),s),v(`autonomy.autonomous`,l(`autonomous`),s),v(`autonomy.grant`,()=>{let e=c();if(e){g(e,`neutral`);return}if(!i.action){g(i.detail,`neutral`);return}o(i.action,i.detail)},s);let u=e=>()=>{if(r.readOnly||r.busy){g(c()??`Budget cannot be changed right now.`,`neutral`);return}if(n===e){g(`Budget is already ${X[e]}.`,`neutral`);return}let i=t?.grant.state===`active`?t.grant.maxMode:null;if(i&&re(e,i)){g(`Your grant allows up to ${X[i]}, so ${X[e]} is unavailable. A new grant can raise the ceiling.`,`neutral`);return}r.act(()=>O({mode:e}),`Switch the budget to ${X[e]}`,{onDone:()=>g(`Budget set to ${X[e]}.`,`success`)})};v(`budget.all-in`,u(`all-in`),s),v(`budget.balanced`,u(`balanced`),s),v(`budget.reserve`,u(`reserve`),s)}function Z({mode:e,onOpen:t}){return(0,Y.jsxs)(`button`,{type:`button`,className:U.pill,"aria-haspopup":`dialog`,onClick:t,children:[(0,Y.jsx)(`span`,{className:U.pillLabel,children:`Budget`}),(0,Y.jsx)(`span`,{children:e?X[e]:`—`}),(0,Y.jsx)(de,{width:14,height:14,"aria-hidden":`true`})]})}function Kt({chip:e,onOpen:t}){let n=(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(Vt,{tone:e.tone}),(0,Y.jsx)(`span`,{className:U.pillLabel,children:`Grant`}),(0,Y.jsx)(`span`,{children:e.label})]});if(!e.action)return(0,Y.jsx)(`span`,{className:U.chip,"data-tone":e.tone,title:e.detail,"aria-label":`Grant: ${e.label}. ${e.detail}`,role:`status`,children:n});let r=e.action;return(0,Y.jsx)(`button`,{type:`button`,className:U.chip,"data-tone":e.tone,title:e.detail,"aria-haspopup":`dialog`,onClick:()=>t(r),"aria-label":`Grant: ${e.label}. ${e.detail}`,children:n})}function qt({open:e,onClose:t,status:n}){let r=n?.grant.state===`active`?n.grant.maxMode:null;return(0,Y.jsx)(we,{open:e,onClose:t,titleId:`command-budget-sheet`,width:560,title:`Budget`,description:r?`Your grant allows up to ${X[r]}. Autonomy never spends past it, whatever is selected here — moving toward Reserve is always instant.`:`No active grant: autonomy only proposes. The budget still decides which seats it would use.`,children:e?(0,Y.jsx)(xe,{maxMode:r}):null})}function Jt({kpis:e}){return(0,Y.jsx)(`div`,{className:U.kpis,role:`group`,"aria-label":`Key numbers`,children:e.map(e=>(0,Y.jsx)(m,{label:e.label,value:e.value,delta:e.delta,trend:e.trend,trendLabel:e.trendLabel,caption:e.caption},e.id))})}var Yt=3e4,Xt={high:`Urgent`,warn:`Soon`,info:`FYI`},Zt={approvals:`approvals`,authority:`authority`,fleet:`fleet`,leader:`Leader`,chats:`chats`,accounts:`accounts`};function Qt(e,t){if(t.confirm)return{...t.confirm,destructive:t.destructive};if(t.kind===`approve`||t.kind===`reject`||t.kind===`veto`)return{title:`${t.kind===`approve`?`Approve`:t.kind===`reject`?`Reject`:`Veto`}?`,body:Ot(e).text,confirmLabel:t.label,destructive:t.destructive}}function $t(e){let t=e.target;switch(t.kind){case`url`:return/^https:\/\//.test(t.url)?{label:`Open`,href:t.url}:null;case`section`:return{label:`Show`,onOpen:()=>Xe(t.section,t.anchor)};case`session`:return{label:`Open chat`,onOpen:()=>Ze(t.sessionId)};case`approval`:case`seat`:return{label:`Open`,onOpen:()=>z(e.id)};default:return null}}function en(e){return e===null?null:e.replace(/(^|· )(Partial )?([a-z][\w-]*) run$/,(e,t,n,r)=>{let i=E(r)?T[r]:`${r.charAt(0).toUpperCase()}${r.slice(1)}`;return`${t}${n??``}${i} run`})}function tn({item:e,view:t,seatNames:n}){let r=e.subject,i=[];if(t.repo&&i.push((0,Y.jsx)(`span`,{className:U.needsRepo,title:t.repoFull,children:t.repo},`repo`)),r.pr&&i.push((0,Y.jsxs)(`span`,{children:[`#`,r.pr]},`pr`)),r.seatId){let e=n?.get(r.seatId)??r.seatId;i.push((0,Y.jsx)(`span`,{title:e===r.seatId?void 0:r.seatId,children:e},`seat`))}return i.push((0,Y.jsx)(`span`,{title:t.ageStamp,children:t.age},`age`)),(0,Y.jsx)(`span`,{className:U.needsMeta,children:i.map((e,t)=>(0,Y.jsxs)(J.Fragment,{children:[t>0?(0,Y.jsx)(`span`,{"aria-hidden":`true`,children:`·`}):null,e]},e.key))})}function nn({item:e,actions:t,now:n,seatNames:r}){let i=$t(e),a=e.actions.filter(e=>e.request!==null),o=Dt(e,n),s=en(o.kindLabel);return(0,Y.jsxs)(`li`,{className:U.needsRow,"data-severity":e.severity,id:Qe(e.id),children:[(0,Y.jsx)(`span`,{className:U.sevDot,"data-severity":e.severity,"aria-hidden":`true`}),(0,Y.jsxs)(`div`,{className:U.needsText,children:[s?(0,Y.jsx)(`span`,{className:U.needsKind,children:s}):null,(0,Y.jsxs)(`span`,{className:U.needsTitle,title:o.fullTitle,children:[(0,Y.jsxs)(`span`,{className:`visually-hidden`,children:[Xt[e.severity],`: `]}),o.title]}),o.run?(0,Y.jsx)(kt,{run:o.run}):null,o.detail?(0,Y.jsx)(`span`,{className:U.needsDetail,children:o.detail}):null,(0,Y.jsx)(tn,{item:e,view:o,seatNames:r})]}),(0,Y.jsxs)(`div`,{className:U.needsActions,children:[a.map(n=>(0,Y.jsx)(P,{size:`sm`,variant:n.destructive?`danger`:n.kind===`approve`?`primary`:`subtle`,disabled:t.busy||t.readOnly,onClick:()=>t.act(()=>$e(n.request.path,n.request.body),`${n.label}: ${o.title}`,{confirm:Qt(e,n)}),children:n.label},n.kind)),i?i.href?(0,Y.jsxs)(`a`,{className:U.linkButton,href:i.href,target:`_blank`,rel:`noopener noreferrer`,children:[i.label,(0,Y.jsx)(se,{width:12,height:12,"aria-hidden":`true`}),(0,Y.jsx)(`span`,{className:`visually-hidden`,children:` (opens in a new tab)`})]}):(0,Y.jsx)(`button`,{type:`button`,className:U.linkButton,onClick:i.onOpen,children:i.label}):null]})]})}function rn(e){return e.status===`unavailable`?{activity:null,loading:!1,reason:e.error?`Needs-you inbox unavailable. ${e.error}`:`The Needs-you inbox is not in this build yet, so this card has no source.`,stale:!1}:e.data?{activity:e.data,loading:!1,reason:null,stale:e.status===`stale`}:{activity:null,loading:!0,reason:null,stale:!1}}function an({state:e,actions:t,fleetLine:n,seatNames:r}){let{activity:i,loading:a,reason:o,stale:s}=rn(e),c=R(Yt),l=i?vt(i.needsYou):[],u=St(i),d=l.slice(0,5),f=i?i.needsYou.length:null;return(0,Y.jsx)(q,{title:f===null?`Needs you`:`Needs you (${f})`,caption:f===null||f===0?void 0:`Most urgent first`,tone:f?`attention`:void 0,actions:(0,Y.jsxs)(`button`,{type:`button`,className:U.linkButton,onClick:()=>z(),"aria-keyshortcuts":`Meta+J`,children:[`Open all `,(0,Y.jsx)(`kbd`,{className:U.kbd,children:`⌘J`})]}),children:a?(0,Y.jsx)(`p`,{className:U.muted,"aria-busy":`true`,children:`Reading the inbox…`}):i?d.length===0?u.length||s?(0,Y.jsx)(G,{tone:`unknown`,children:u.length?`Nothing to show, but ${u.map(e=>Zt[e]??e).join(`, `)} ${u.length===1?`is`:`are`} not answering — this is not an all-clear.`:`Nothing to show, but the last refresh failed — this is not an all-clear.`}):(0,Y.jsxs)(`div`,{className:U.allClear,role:`status`,children:[(0,Y.jsx)(`span`,{className:U.allClearTitle,children:`All clear`}),n?(0,Y.jsx)(`span`,{className:U.allClearBody,children:n}):null]}):(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(`ul`,{className:U.needsList,children:d.map(e=>(0,Y.jsx)(nn,{item:e,actions:t,now:c,seatNames:r},e.id))}),l.length>d.length?(0,Y.jsxs)(`button`,{type:`button`,className:U.moreLink,onClick:()=>z(),children:[l.length-d.length,` more in the drawer`]}):null,u.length?(0,Y.jsxs)(`p`,{className:U.muted,children:[u.map(e=>Zt[e]??e).join(`, `),` not answering — the list may be incomplete.`]}):null,s?(0,Y.jsx)(`p`,{className:U.muted,children:`The last refresh failed; showing the previous list.`}):null]}):(0,Y.jsxs)(G,{tone:`unknown`,children:[o??`The inbox didn't answer.`,` This is not an all-clear.`]})})}var on={usable:`ok`,low:`low`,spent:`out`,"signed-out":`out`,unavailable:`out`,checking:`unknown`,"not-checked":`unknown`},sn=new Set([`usable`,`low`,`checking`]);function cn(e){let t=e.trim();return/[.!?]$/.test(t)?t:`${t}.`}function ln(e,t){let n=t.get(e.seatId);if(n)return{status:n.status,why:n.why};if(e.kind!==`local`)return null;let r=[...t.values()].filter(e=>e.free||e.engine===`local`);if(r.length===0)return null;let i=e=>r.find(t=>t.status===e),a=i(`eligible`)??i(`held`)??i(`unknown`)??r[0];return{status:a.status,why:a.why}}var un={eligible:`eligible`,held:`held`,off:`off`,unknown:`no-reading`};function dn(e,t,n){return e?e.status===`eligible`&&!sn.has(t.kind)?{kind:`conflict`,word:`Status unknown`,why:`The router lists it as eligible for autonomy, but its readiness check says: ${`${t.label}${t.detail?` — ${t.detail}`:``}`}.`}:{kind:un[e.status],word:k[e.status],why:e.why?cn(e.why):null}:{kind:`none`,word:`Not reported`,why:n?`The budget route does not list this seat.`:null}}function fn(e,t){if(t.kind===`spent`)return t.detail;let n=e.windows.find(e=>e.binding)??null;return n?.resetText?Tt(n.resetText):null}function pn(e,t,n){let r=N(e,{healthRead:n.healthRead,now:n.now}),i=dn(ln(e,t),r,n.budgetRead),a=on[r.kind]??`unknown`,o=`${r.label}${r.detail?` · ${r.detail}`:``}`,s,c,l;e.kind===`local`?(s=null,c=r.kind===`usable`?`Free`:r.kind===`unavailable`?`Offline`:`—`,l=r.kind===`usable`?`Runs on this machine`:r.kind===`checking`?`Checking…`:r.detail??r.label):(s=a===`out`?0:pt(e),c=a===`out`?r.label:s===null?`—`:`${_(s)} left`,l=fn(e,r)??(s===null?o:null));let u=e.kind===`local`&&e.localCount>1?`Local models (${e.localCount})`:e.label,d=[`${u}: ${c}`,l&&l!==o?l:null,o,`Autonomy: ${i.word}`].filter(e=>e!==null).join(`. `),f=e.reserve?.percent??null,p=f!==null&&f>0?f:null;return{key:e.seatId,engine:e.engine,name:u,leftPercent:s,level:a,value:c,note:l,status:r.label,autonomy:i,reservePercent:p,reserveLabel:e.reserve?.label??null,spoken:d}}function mn(e,t){let n=M(e),r=[];for(let e of n.values()){let n=e.headroom,i=n?.bindingWindow===`weekly`?n.weeklyUsedPercent:n?.bindingWindow===`session`?n.sessionUsedPercent:null,a=e.free||i==null?null:Math.max(0,Math.min(100,100-i)),o=te(n?.resetAt??null,t),s={kind:un[e.status],word:k[e.status],why:e.why?cn(e.why):null},c=e.free||a===null?`—`:`${_(a)} left`,l=e.free?`Readiness not reported`:o?`resets ${o}`:null;r.push({key:e.seatId,engine:e.engine,name:e.label,leftPercent:a,level:a===null?`unknown`:a<=0?`out`:`ok`,value:c,note:l,status:`Readiness not reported`,autonomy:s,reservePercent:null,reserveLabel:null,spoken:[`${e.label}: ${c}`,l,`Readiness not reported`,`Autonomy: ${s.word}`].filter(Boolean).join(`. `)})}return r.sort((e,t)=>Number(e.engine===`local`)-Number(t.engine===`local`)||e.name.localeCompare(t.name))}function hn({rows:e,budget:t,healthRead:n,now:r}){if(e.length===0){let e=t?mn(t,r):[];return{items:e,headline:e.length===0?`No seats reported yet`:`Seat roster not loaded — readiness unknown`}}let i=M(t);return{items:A(e,{healthRead:n,now:r}).map(e=>pn(e,i,{healthRead:n,budgetRead:t!==null,now:r})),headline:j(e)}}function gn(e,t){let n=Math.max(1,Math.floor(t));if(e===`compact`)return 1;let r=e===`medium`?3:5;if(n<=r)return e===`medium`&&n===4?2:n;let i=Math.ceil(n/r);return Math.ceil(n/i)}var Q={list:`_list_1r7bb_11`,item:`_item_1r7bb_17`,head:`_head_1r7bb_48`,logo:`_logo_1r7bb_55`,name:`_name_1r7bb_59`,value:`_value_1r7bb_71`,meter:`_meter_1r7bb_90`,fill:`_fill_1r7bb_99`,reserve:`_reserve_1r7bb_113`,foot:`_foot_1r7bb_124`,note:`_note_1r7bb_134`,autonomy:`_autonomy_1r7bb_142`,dot:`_dot_1r7bb_150`,tip:`_tip_1r7bb_173`,tipHead:`_tipHead_1r7bb_174`,tipLine:`_tipLine_1r7bb_175`,tipHint:`_tipHint_1r7bb_176`};function _n(){return(0,J.useSyncExternalStore)((0,J.useCallback)(e=>a(`verse-health`,e),[]),()=>i(`verse-health`),()=>i(`verse-health`)).data??null}function vn({item:e}){return(0,Y.jsxs)(`div`,{className:Q.tip,children:[(0,Y.jsxs)(`div`,{className:Q.tipHead,children:[(0,Y.jsx)(h,{engine:e.engine,size:14}),(0,Y.jsx)(`strong`,{children:e.name})]}),(0,Y.jsxs)(`div`,{children:[e.status,e.note&&e.note!==e.status?` · ${e.note}`:``]}),e.reserveLabel?(0,Y.jsx)(`div`,{className:Q.tipLine,children:e.reserveLabel}):null,(0,Y.jsxs)(`div`,{className:Q.tipLine,children:[`Autonomy: `,e.autonomy.word,e.autonomy.why?` — ${e.autonomy.why}`:``]}),(0,Y.jsx)(`div`,{className:Q.tipHint,children:`Click for Resources · ⌘.`})]})}function yn({item:e}){let t={"--fill":`${e.leftPercent??(e.engine===`local`&&e.value===`Free`?100:0)}%`,...e.reservePercent===null?{}:{"--reserve":`${e.reservePercent}%`}};return(0,Y.jsx)(C,{content:(0,Y.jsx)(vn,{item:e}),placement:`bottom`,children:(0,Y.jsxs)(`button`,{type:`button`,className:Q.item,"data-level":e.level,"data-free":e.engine===`local`||void 0,"aria-label":`${e.spoken}. Open Resources`,"aria-keyshortcuts":`Meta+.`,onClick:()=>x(),children:[(0,Y.jsxs)(`span`,{className:Q.head,children:[(0,Y.jsx)(h,{engine:e.engine,size:14,className:Q.logo}),(0,Y.jsx)(`span`,{className:Q.name,children:e.name}),(0,Y.jsx)(`span`,{className:Q.value,children:e.value})]}),(0,Y.jsxs)(`span`,{className:Q.meter,style:t,"aria-hidden":`true`,children:[(0,Y.jsx)(`span`,{className:Q.fill}),e.reservePercent===null?null:(0,Y.jsx)(`span`,{className:Q.reserve})]}),(0,Y.jsxs)(`span`,{className:Q.foot,children:[(0,Y.jsx)(`span`,{className:Q.note,children:e.note??e.status}),(0,Y.jsxs)(`span`,{className:Q.autonomy,"data-kind":e.autonomy.kind,children:[(0,Y.jsx)(`span`,{className:Q.dot,"aria-hidden":`true`}),e.autonomy.word]})]})]})})}function bn({budget:e,seats:t,now:n}){let r=_n(),{viewport:i}=w(),a=(0,J.useMemo)(()=>{let i=[];try{i=t&&t.length>0?ie(t,{health:r?.seats??null,budget:e,now:n}):[]}catch{i=[]}return hn({rows:i,budget:e,healthRead:r!==null,now:n})},[t,r,e,n]);return(0,Y.jsx)(q,{title:`Seats`,caption:a.headline,actions:(0,Y.jsxs)(`button`,{type:`button`,className:U.linkButton,onClick:()=>x(),"aria-keyshortcuts":`Meta+.`,children:[`Resources `,(0,Y.jsx)(`kbd`,{className:U.kbd,children:`⌘.`})]}),children:a.items.length===0?(0,Y.jsx)(G,{tone:`unknown`,children:`Seat capacity unavailable.`}):(0,Y.jsx)(`div`,{className:Q.list,role:`group`,"aria-label":`Capacity per seat`,style:{"--seat-columns":gn(i,a.items.length)},children:a.items.map(e=>(0,Y.jsx)(yn,{item:e},e.key))})})}var xn=new Intl.NumberFormat(`en-US`);function Sn({open:e,onClose:t,actions:n,estimatePerSessionUsd:r,onLaunched:i,defaultRepo:a=Ie}){let o=(0,J.useId)(),s=(0,J.useId)(),l=(0,J.useId)(),d=(0,J.useRef)(null),[f,p]=(0,J.useState)({repo:a,baseBranch:``,prompt:``}),[m,h]=(0,J.useState)({}),[g,_]=(0,J.useState)(null);(0,J.useEffect)(()=>{e&&(h({}),_(null))},[e]);let v=e=>{_(null),p(t=>({...t,...e})),h(t=>{let n={...t};for(let t of Object.keys(e))delete n[t];return n})},y=e=>{e.preventDefault();let r=Be(f);if(!r.ok){h(r.errors);return}h({}),_(null),n.act(async()=>{try{let e=await Ue({...r.request,origin:`operator`});p(e=>({...e,prompt:``})),i(e.task),t()}catch(e){if(e instanceof c)throw e;_(Ye(e))}},`Launch a Claude Code cloud session with this task.`)},b=f.prompt.trim().length;return(0,Y.jsx)(u,{open:e,onClose:t,titleId:o,title:`New cloud task`,description:`Runs as a Claude Code cloud session on your Claude account. It delivers a draft PR; nothing merges on its own.`,widthClassName:L.dialogWidth,initialFocusRef:d,children:(0,Y.jsxs)(`form`,{className:L.form,onSubmit:y,noValidate:!0,children:[(0,Y.jsxs)(`div`,{className:L.fieldGrid,children:[(0,Y.jsx)(at,{label:`Repository`,hint:`GitHub owner/name`,mono:!0,value:f.repo,error:m.repo,autoComplete:`off`,spellCheck:!1,onChange:e=>v({repo:e.target.value})}),(0,Y.jsx)(at,{label:`Base branch`,hint:`Must be pushed. Empty uses the default branch.`,mono:!0,value:f.baseBranch,placeholder:`default branch`,error:m.baseBranch,autoComplete:`off`,spellCheck:!1,onChange:e=>v({baseBranch:e.target.value})})]}),(0,Y.jsxs)(`div`,{className:L.textareaField,children:[(0,Y.jsx)(`label`,{className:L.label,htmlFor:s,children:`Task`}),(0,Y.jsx)(`textarea`,{ref:d,id:s,className:L.textarea,value:f.prompt,placeholder:`What should the cloud session do? It reads the repo's own guidance and opens a draft PR.`,"aria-invalid":m.prompt?!0:void 0,"aria-describedby":m.prompt?l:void 0,onChange:e=>v({prompt:e.target.value})}),m.prompt?(0,Y.jsx)(`p`,{id:l,className:L.fieldError,role:`alert`,children:m.prompt}):null,(0,Y.jsxs)(`p`,{className:L.muted,children:[xn.format(b),` of `,xn.format(Se),` characters`,r===null?``:` · estimated at ${Ae(r)} per session`]})]}),g?(0,Y.jsx)(`p`,{className:L.notice,"data-tone":`danger`,role:`alert`,children:g}):null,(0,Y.jsxs)(`div`,{className:L.formActions,children:[(0,Y.jsx)(P,{variant:`ghost`,onClick:t,disabled:n.busy,children:`Cancel`}),(0,Y.jsx)(P,{type:`submit`,variant:`primary`,busy:n.busy,children:`Launch`})]})]})})}var Cn=(0,J.lazy)(()=>r(()=>import(`./EvidenceTimeline-sCCAdnBK.js`),__vite__mapDeps([0,1,2,3,4,5,6,7])));function $({href:e,children:t,label:n}){return(0,Y.jsxs)(`a`,{className:L.link,href:e,target:`_blank`,rel:`noreferrer noopener`,"aria-label":n,children:[t,` `,(0,Y.jsx)(se,{width:12,height:12,"aria-hidden":`true`})]})}function wn({task:e,actions:t,now:n}){let r=F(e.sessionUrl,`claude.ai`),i=e.pr?F(e.pr.url,`github.com`):null,a=Ee(e,n),[o,s]=(0,J.useState)(!1);return(0,Y.jsxs)(`li`,{className:L.task,"data-state":e.state,children:[(0,Y.jsx)(`span`,{className:L.taskChip,children:(0,Y.jsx)(d,{status:e.state,tone:Ne[e.state],children:Ve(e)})}),(0,Y.jsxs)(`span`,{className:L.taskMain,children:[(0,Y.jsx)(`p`,{className:L.taskTitle,children:e.title}),(0,Y.jsx)(`span`,{className:L.muted,children:Te(e,n)}),a?(0,Y.jsx)(`span`,{className:L.facts,children:a}):null,(0,Y.jsxs)(`span`,{className:L.taskLinks,children:[r?(0,Y.jsx)($,{href:r,label:`Open “${e.title}” in Claude`,children:`Open in Claude`}):null,i&&e.pr?(0,Y.jsx)($,{href:i,label:`Pull request #${e.pr.number} on GitHub`,children:`PR #${e.pr.number}`}):null,(0,Y.jsx)(`button`,{type:`button`,className:L.linkButton,"aria-haspopup":`dialog`,"aria-label":`Evidence for “${e.title}”`,onClick:()=>s(!0),children:`Evidence`}),ke(e)?(0,Y.jsx)(`button`,{type:`button`,className:L.linkButton,disabled:t.busy||t.readOnly,"aria-label":`Dismiss “${e.title}”`,onClick:()=>t.act(()=>Ge(e.id),`Dismiss the cloud task “${e.title}”.`,{confirm:{title:`Dismiss this cloud task?`,body:`Verse stops tracking “${e.title}”. Nothing on GitHub or claude.ai changes — the session and any PR stay where they are.`,confirmLabel:`Dismiss`}}),children:`Dismiss`}):null]})]}),o?(0,Y.jsx)(J.Suspense,{fallback:null,children:(0,Y.jsx)(Cn,{taskId:e.id,title:e.title,open:!0,onClose:()=>s(!1),now:n})}):null]})}function Tn({overview:e,actions:t,onClose:n}){let r=(0,J.useRef)(null),i=(0,J.useId)();return l({open:!0,containerRef:r,onClose:n}),(0,Y.jsxs)(`div`,{ref:r,className:L.popover,role:`dialog`,"aria-modal":`false`,"aria-labelledby":i,tabIndex:-1,children:[(0,Y.jsx)(`h4`,{id:i,className:L.popoverTitle,children:`Cloud budget`}),(0,Y.jsx)(wt,{idPrefix:`cloud-card-budget`,budget:e.budget.budget,busy:t.busy,disabled:t.readOnly,onSave:e=>t.act(()=>We(e),`Change the cloud budget.`,{onDone:n}),onCancel:n})]})}function En({overview:e,actions:t,now:n,onNotice:r}){let i=e.budget,a=Re(i),o=ze(e.seat),s=je(i.canLaunch,`The cloud budget does not allow another launch right now.`),{shown:c,hidden:l}=Pe(e.tasks,n),u=i.budget.selfImprove,f=(0,Y.jsxs)(`p`,{className:L.estimateNote,children:[D(i.estimateNote,n),` `,(0,Y.jsx)($,{href:Ce,label:`Check the real balance on claude.ai`,children:`Check usage on claude.ai`})]});return(0,Y.jsxs)(`div`,{className:L.body,children:[o?(0,Y.jsxs)(`div`,{className:L.meterBlock,"data-standing":`not-set-up`,children:[(0,Y.jsxs)(`p`,{className:L.standing,title:Me(i.estimatedRemainingUsd),children:[(0,Y.jsx)(d,{status:`not-set-up`,tone:`warning`,children:Le}),(0,Y.jsxs)(`span`,{className:L.muted,children:[De(i.estimatedRemainingUsd),` · estimate`]})]}),(0,Y.jsx)(`p`,{className:L.notice,"data-tone":`warning`,role:`note`,children:o}),f]}):(0,Y.jsxs)(`div`,{className:L.meterBlock,children:[(0,Y.jsx)(me,{value:a.value,max:a.max,label:`Credits remaining`,valueText:a.text,tone:a.tone,"aria-label":`Estimated credits remaining: ${a.text}, ${a.usedText}`}),f,a.warning?(0,Y.jsx)(`p`,{className:L.notice,"data-tone":`warning`,role:`note`,children:a.warning}):null]}),(0,Y.jsx)(`p`,{className:L.facts,children:Oe(i,n)}),s?(0,Y.jsxs)(`p`,{className:L.notice,"data-tone":`warning`,role:`note`,"data-testid":`cloud-budget-refused`,children:[`New launches are paused: `,s]}):null,(0,Y.jsxs)(`div`,{className:L.toggleRow,children:[(0,Y.jsx)(be,{checked:u.enabled,label:`Self-improvement`,disabled:t.busy||t.readOnly,onChange:e=>t.act(()=>We({selfImprove:{enabled:e}}),e?`Let Verse launch its own self-improvement tasks.`:`Stop Verse launching its own self-improvement tasks.`,{onDone:()=>r({tone:`success`,text:e?`Self-improvement is on — up to ${u.maxPerDay} a day.`:`Self-improvement is off.`})})}),(0,Y.jsx)(`span`,{className:`${L.muted} ${L.toggleText}`,children:He(i)})]}),c.length===0?(0,Y.jsx)(G,{children:`No cloud tasks yet. Start one with New cloud task, or let Verse improve itself.`}):(0,Y.jsx)(`ul`,{className:L.tasks,"aria-label":`Cloud tasks`,children:c.map(e=>(0,Y.jsx)(wn,{task:e,actions:t,now:n},e.id))}),l>0?(0,Y.jsxs)(`p`,{className:L.muted,children:[l,` more `,l===1?`task is`:`tasks are`,` listed by ashlr cloud list.`]}):null]})}function Dn({actions:e,now:t=Date.now()}){let n=s(I,{freshMs:15e3}),r=o(I);b(r,Ke);let[i,a]=(0,J.useState)(!1),[c,l]=(0,J.useState)(!1),[u,d]=(0,J.useState)(null),f=n.data?.value??null,p=!n.data&&(n.status===`loading`||n.status===`idle`),m=f?Fe(f.seat,f.budget):null,h=e.busy||e.readOnly,g=f?.backlog.nextUp?f.backlog.items.find(e=>e.id===f.backlog.nextUp)??null:null,_=f?ze(f.seat)??je(f.budget.canLaunch,`The cloud budget does not allow another launch right now.`)??(g?null:`The self-improvement backlog has nothing left to launch.`):null,v=f?f.budget.budget.estimatedCostPerSessionUsd:null,y=f?(0,Y.jsxs)(`span`,{className:L.headActions,children:[(0,Y.jsx)(C,{label:m??`Start a cloud session with your own task`,children:(0,Y.jsx)(P,{size:`sm`,variant:`primary`,icon:(0,Y.jsx)(le,{width:14,height:14}),disabled:h||m!==null,onClick:()=>a(!0),children:`New cloud task`})}),(0,Y.jsx)(C,{label:_??(g?`Launch the next backlog item: ${g.title}`:`Launch the next backlog item`),children:(0,Y.jsx)(P,{size:`sm`,disabled:h||_!==null,onClick:()=>{f&&g&&e.act(()=>Je({count:1}),`Launch the next self-improvement task as a cloud session.`,{confirm:{title:`Improve Verse now?`,body:`Launches “${g.title}” as a cloud session on ${g.repo??f.budget.budget.selfImprove.repo}${v===null?``:`, estimated at ${Ae(v)}`}. It delivers a draft PR; nothing merges on its own.`,confirmLabel:`Launch`},onDone:e=>{let t=e.launched[0]??null;if(t)d({tone:`success`,text:`Started “${t.title}”.`,href:F(t.sessionUrl,`claude.ai`),linkText:`Open in Claude`});else{let t=e.skipped[0]?.reason??`Nothing was launched, and the server sent no reason.`;d({tone:`warning`,text:D(t)})}}})},children:`Improve Verse`})}),(0,Y.jsx)(C,{label:`Credits, per-session estimate and daily caps`,children:(0,Y.jsx)(P,{size:`sm`,variant:`ghost`,"aria-expanded":c,"aria-haspopup":`dialog`,onClick:()=>l(e=>!e),disabled:e.readOnly,children:`Edit budget`})}),(0,Y.jsx)(C,{label:`Check GitHub for task updates now`,children:(0,Y.jsx)(ae,{size:`sm`,variant:`ghost`,icon:(0,Y.jsx)(oe,{width:14,height:14}),"aria-label":`Check GitHub for task updates now`,disabled:h,onClick:()=>e.act(()=>qe(),`Re-read the cloud tasks from GitHub.`)})}),c?(0,Y.jsx)(Tn,{overview:f,actions:e,onClose:()=>l(!1)}):null]}):null;return n.data?.available===!1&&n.data.reason===`The cloud lane is not in this build yet.`?null:(0,Y.jsx)(q,{title:`Cloud`,caption:`Claude Code cloud sessions on your Claude credits`,actions:y,children:p?(0,Y.jsx)(`p`,{className:L.muted,"aria-busy":`true`,children:`Reading the cloud lane…`}):f?(0,Y.jsxs)(Y.Fragment,{children:[u?(0,Y.jsx)(`div`,{className:L.notice,"data-tone":u.tone,role:`status`,children:(0,Y.jsxs)(`span`,{className:L.noticeRow,children:[(0,Y.jsxs)(`span`,{children:[u.text,u.href?(0,Y.jsxs)(Y.Fragment,{children:[` `,(0,Y.jsx)($,{href:u.href,children:u.linkText??`Open`})]}):null]}),(0,Y.jsx)(`button`,{type:`button`,className:L.linkButton,onClick:()=>d(null),children:`Dismiss`})]})}):null,(0,Y.jsx)(En,{overview:f,actions:e,now:t,onNotice:d}),(0,Y.jsx)(Sn,{open:i,onClose:()=>a(!1),actions:e,estimatePerSessionUsd:v,onLaunched:e=>d({tone:`success`,text:`Started “${e.title}”.`,href:F(e.sessionUrl,`claude.ai`),linkText:`Open in Claude`})})]}):(0,Y.jsx)(G,{tone:`unknown`,children:n.data?.reason??n.error?.message??`The cloud lane did not answer.`})})}function On(e){let t=lt(e);return(0,Y.jsx)(`p`,{className:U.verdict,"data-testid":`verdict`,children:t.map((e,t)=>(0,Y.jsxs)(`span`,{className:U.verdictPart,"data-tone":e.tone,children:[t>0?(0,Y.jsx)(`span`,{className:U.verdictSep,"aria-hidden":`true`,children:` · `}):null,e.text]},e.key))})}var kn=`ashlr.verse.command.lastLooked.v1`;function An(){try{let e=window.localStorage.getItem(kn);return e&&Number.isFinite(Date.parse(e))?e:null}catch{return null}}function jn(e){try{window.localStorage.setItem(kn,e)}catch{}}function Mn(){let e=S(),[t,n]=(0,J.useState)(null),r=(0,J.useRef)(!1);return(0,J.useEffect)(()=>{e&&!r.current&&(n(An()),jn(new Date().toISOString())),r.current=e},[e]),t}function Nn({lastLookedAt:e,items:t,now:n=Date.now()}){if(!e||t.length===0)return null;let r=new Date(e);if(!Number.isFinite(r.getTime())||n-r.getTime()<36e5)return null;let i=r.toDateString()===new Date(n).toDateString()?r.toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`}):r.toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`,minute:`2-digit`});return(0,Y.jsxs)(`div`,{className:U.since,role:`group`,"aria-label":`Since you looked at ${i}`,children:[(0,Y.jsxs)(`span`,{className:U.sinceLead,children:[`Since `,i]}),t.map(e=>(0,Y.jsx)(`span`,{className:U.sinceChip,"data-tone":e.tone,children:e.text},e.id))]})}var Pn=36e5,Fn=1e4,In=3e4,Ln=3e5;function Rn(){let{compact:e}=w(),t=s(tt),n=s(et),r=y(),c=s(B),l=s(nt,{freshMs:6e4}),u=s(rt,{freshMs:6e4}),d=s(ne,{freshMs:15e3}),m={authority:o(tt),fleet:o(et),leader:o(B),learning:o(nt),history:o(rt),budget:o(ne)};b(()=>{m.authority(),m.fleet()},Fn),b(()=>{m.leader(),m.budget()},In),b(()=>{m.history(),m.learning()},Ln);let h=R(3e4),g=mt(),_=Ht(g),v=Mn(),x=(0,J.useSyncExternalStore)((0,J.useCallback)(e=>a(`verse-bootstrap`,e),[]),()=>i(`verse-bootstrap`),()=>i(`verse-bootstrap`)).data?.seats??null,S=d.data??null,C=t.data?.value??null,T=n.data?.value??null,E=u.data?.value??null,ee=ge(T),te=(0,J.useMemo)(()=>Ct({fleet:T,history:E,learning:l.data?.value??null,policy:C?.policy??null,budget:S}),[T,E,l.data,C,S]),D=(0,J.useMemo)(()=>yt(x,S),[x,S]),O=_e(C?.grant.state===`none`),k=t.data&&n.data&&O.readiness!==void 0?he({authority:C,live:T,readiness:O.readiness,setup:O.report}):null,re=(0,J.useMemo)(()=>xt({fleet:T,history:E,learning:l.data?.value??null}),[T,E,l.data]),ie=bt({lastLookedAt:v,fleet:T,leader:c.data?.value??null,activity:r.data}),A=e?6:12,j=h-A*Pn,M=(0,J.useMemo)(()=>T?jt(T.runs,j,h):[],[T,j,h]),N=n.data?T?T.state===`dark`&&M.length===0?ve(T):M.length===0?{kind:`empty`,message:`No runs in the last ${A} hours.`}:{kind:`ready`}:{kind:`unknown`,reason:n.data.reason??`the live fleet view did not answer.`}:{kind:`loading`},ae=T?T.state===`dark`?null:`Fleet ${T.state}: ${T.summary.building??`—`} building, ${T.summary.queued??`—`} queued.`:`Fleet status unknown.`,P=[t,n].some(e=>e.status===`refreshing`);return(0,Y.jsxs)(gt,{title:`Command`,actions:P?(0,Y.jsx)(f,{}):null,lead:(0,Y.jsxs)(`div`,{className:U.lead,children:[(0,Y.jsx)(Ut,{read:t.data,loading:t.status===`loading`,budgetMode:S?.mode??null,actions:g,compact:e,now:h,grantFlow:_}),(0,Y.jsx)(ht,{actions:g}),k?(0,Y.jsx)(ye,{state:k,here:`command`,onGrant:e=>_.open(e,k.why)}):(0,Y.jsxs)(Y.Fragment,{children:[(0,Y.jsx)(On,{authority:C,building:T?.summary.building??null,mergedToday:T?.summary.mergedToday??null,revertsToday:T?.summary.revertsToday??null,reserve:_t(S),darkSince:ee}),(0,Y.jsx)(Nn,{lastLookedAt:v,items:ie,now:h})]})]}),children:[(0,Y.jsx)(K,{span:5,children:(0,Y.jsx)(an,{state:r,actions:g,fleetLine:ae,seatNames:D})}),(0,Y.jsx)(K,{span:7,children:(0,Y.jsx)(Et,{read:c.data,loading:c.status===`loading`,actions:g})}),k&&re?null:(0,Y.jsx)(K,{span:12,children:(0,Y.jsx)(Jt,{kpis:te})}),(0,Y.jsx)(K,{span:12,children:(0,Y.jsx)(bn,{budget:S,seats:x,now:h})}),(0,Y.jsx)(K,{span:12,children:(0,Y.jsx)(Dn,{actions:g,now:h})}),k&&M.length===0?null:(0,Y.jsx)(K,{span:12,children:(0,Y.jsx)(p,{title:`Last ${A} hours`,description:`Fleet lanes; bars coloured by status, outlines are queued or parked`,status:N,lanes:M,from:j,to:h,now:h,toneOf:At})}),_.sheet,g.dialogs]})}export{Fn as COMMAND_FAST_POLL_MS,Ln as COMMAND_HISTORY_POLL_MS,In as COMMAND_SLOW_POLL_MS,Rn as CommandSection};
|
|
3
|
+
//# sourceMappingURL=CommandSection-Brp73iox.js.map
|