@ashlr/hub 3.22.0 → 3.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (929) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +5 -5
  3. package/dist/authority-surface.json +16 -11
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/verify-safety-sources.d.ts +4 -0
  6. package/dist/cli/verify-safety-sources.js +41 -0
  7. package/dist/cli/verify-safety-sources.js.map +1 -0
  8. package/dist/cli/verify-safety.js +16 -1
  9. package/dist/cli/verify-safety.js.map +1 -1
  10. package/dist/core/decide/needs-you.d.ts +3 -1
  11. package/dist/core/decide/needs-you.js +52 -28
  12. package/dist/core/decide/needs-you.js.map +1 -1
  13. package/dist/core/fleet/fleet-control-model.d.ts +2 -1
  14. package/dist/core/fleet/fleet-control-model.js +5 -0
  15. package/dist/core/fleet/fleet-control-model.js.map +1 -1
  16. package/dist/core/fleet/fleet-control-types.d.ts +11 -1
  17. package/dist/core/fleet/fleet-control.d.ts +4 -0
  18. package/dist/core/fleet/fleet-control.js +23 -1
  19. package/dist/core/fleet/fleet-control.js.map +1 -1
  20. package/dist/core/fleet/quota.js +1 -1
  21. package/dist/core/fleet/quota.js.map +1 -1
  22. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  23. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
  24. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
  25. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
  26. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
  27. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
  28. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
  29. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
  30. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
  31. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
  32. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
  33. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
  34. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
  35. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
  36. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
  37. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
  38. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
  39. package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
  40. package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
  41. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
  42. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
  43. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
  44. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
  45. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
  46. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
  47. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
  48. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
  49. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
  50. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
  51. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
  52. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
  53. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
  54. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
  55. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
  56. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
  57. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
  58. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
  59. package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
  60. package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
  61. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
  62. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
  63. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
  64. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
  65. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
  66. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
  67. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
  68. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
  69. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
  70. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
  71. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
  72. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
  73. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
  74. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
  75. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
  76. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
  77. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
  78. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
  79. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
  80. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
  81. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
  82. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
  83. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
  84. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
  85. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
  86. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
  87. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
  88. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
  89. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
  90. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
  91. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
  92. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
  93. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
  94. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
  95. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
  96. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
  97. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
  98. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
  99. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
  100. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
  101. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
  102. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
  103. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
  104. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
  105. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
  106. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
  107. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
  108. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
  109. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
  110. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
  111. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
  112. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
  113. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
  114. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
  115. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
  116. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
  117. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
  118. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
  119. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
  120. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
  121. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
  122. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
  123. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
  124. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
  125. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
  126. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
  127. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
  128. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
  129. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
  130. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
  131. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
  132. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
  133. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
  134. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
  135. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
  136. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
  137. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
  138. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
  139. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
  140. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
  141. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
  142. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
  143. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
  144. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
  145. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
  146. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
  147. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
  148. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
  149. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
  150. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
  151. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
  152. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
  153. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
  154. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
  155. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
  156. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
  157. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
  158. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
  159. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
  160. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
  161. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
  162. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
  163. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
  164. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
  165. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
  166. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
  167. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
  168. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
  169. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
  170. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
  171. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
  172. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
  173. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
  174. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
  175. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
  176. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
  177. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
  178. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
  179. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
  180. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
  181. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
  182. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
  183. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
  184. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
  185. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
  186. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
  187. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
  188. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
  189. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
  190. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
  191. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
  192. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
  193. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
  194. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
  195. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
  196. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
  197. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
  198. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
  199. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
  200. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
  201. package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
  202. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
  203. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
  204. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
  205. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
  206. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
  207. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
  208. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
  209. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
  210. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
  211. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
  212. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
  213. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
  214. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
  215. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
  216. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
  217. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
  218. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
  219. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
  220. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
  221. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
  222. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
  223. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
  224. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
  225. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
  226. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
  227. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
  228. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
  229. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
  230. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
  231. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
  232. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
  233. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
  234. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
  235. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
  236. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
  237. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
  238. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
  239. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
  241. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
  242. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
  243. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
  244. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
  245. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
  246. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
  247. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
  248. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
  249. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
  250. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
  251. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
  252. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
  253. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
  254. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
  255. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
  256. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
  257. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
  258. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
  259. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
  260. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
  261. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
  262. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
  263. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
  264. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
  265. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
  266. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
  267. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
  268. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
  269. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
  270. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
  271. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
  272. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
  273. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
  274. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
  275. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
  276. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
  277. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
  278. package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
  279. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
  280. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
  281. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
  282. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
  283. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
  284. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
  285. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
  286. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
  287. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
  288. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
  289. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
  290. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
  291. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
  292. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
  293. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
  294. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
  295. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
  296. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
  297. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
  298. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
  299. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
  300. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
  301. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
  302. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
  303. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
  304. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
  305. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
  306. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
  307. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
  308. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
  309. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
  310. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
  311. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
  312. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
  313. package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
  314. package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
  315. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
  316. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
  317. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
  318. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
  319. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
  320. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
  321. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
  322. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
  323. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
  324. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
  325. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
  326. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
  327. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
  328. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
  329. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
  330. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
  331. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
  332. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
  333. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
  334. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
  335. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
  336. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
  337. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
  338. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
  339. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
  340. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
  341. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
  342. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
  343. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
  344. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
  345. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
  346. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
  347. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
  348. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
  349. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
  350. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
  351. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
  352. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
  353. package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
  354. package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
  355. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
  356. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
  357. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
  358. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
  359. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
  360. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
  361. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
  362. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
  363. package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
  364. package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
  365. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
  366. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
  367. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
  368. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
  369. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
  370. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
  371. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
  372. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
  373. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
  374. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
  375. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
  376. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
  377. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
  378. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
  379. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
  380. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
  381. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
  382. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
  383. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
  384. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
  385. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
  386. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
  387. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
  388. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
  389. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
  390. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
  391. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
  392. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
  393. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
  394. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
  395. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
  396. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
  397. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
  398. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
  399. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
  400. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
  401. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
  402. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
  403. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
  404. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
  405. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
  406. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
  407. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
  408. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
  409. package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
  410. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
  411. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
  412. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
  413. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
  414. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
  415. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
  416. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
  417. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
  418. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
  419. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
  420. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
  421. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
  422. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
  423. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
  424. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
  425. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
  426. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
  427. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
  428. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
  429. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
  430. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
  431. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
  432. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
  433. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
  434. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
  435. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
  436. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
  437. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
  438. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
  439. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
  440. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
  441. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
  442. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
  443. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
  444. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
  445. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
  446. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
  447. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
  448. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
  449. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
  450. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
  451. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
  452. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
  453. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
  454. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
  455. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
  456. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
  457. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
  458. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
  459. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
  460. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
  461. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
  462. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
  463. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
  464. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
  465. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
  466. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
  467. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
  468. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
  469. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
  470. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
  471. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
  472. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
  473. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
  474. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
  475. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
  476. package/dist/core/web/public/next/index.html +1 -1
  477. package/dist/release-dependency-inventory.json +1 -1
  478. package/package.json +1 -1
  479. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
  480. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
  481. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
  482. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
  483. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
  484. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
  485. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
  486. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
  487. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
  488. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
  489. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
  490. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
  491. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
  492. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
  493. package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
  494. package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
  495. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
  496. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
  497. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
  498. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
  499. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
  500. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
  501. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
  502. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
  503. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
  504. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
  505. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
  506. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
  507. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
  508. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
  509. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
  510. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
  511. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
  512. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
  513. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
  514. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
  515. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
  516. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
  517. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
  518. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
  519. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
  520. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
  521. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
  522. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
  523. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
  524. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
  525. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
  526. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
  527. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
  528. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
  529. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
  530. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
  531. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
  532. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
  533. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
  534. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
  535. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
  536. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
  537. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
  538. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
  539. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
  540. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
  541. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
  542. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
  543. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
  544. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
  545. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
  546. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
  547. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
  548. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
  549. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
  550. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
  551. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
  552. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
  553. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
  554. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
  555. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
  556. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
  557. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
  558. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
  559. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
  560. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
  561. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
  562. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
  563. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
  564. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
  565. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
  566. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
  567. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
  568. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
  569. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
  570. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
  571. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
  572. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
  573. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
  574. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
  575. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
  576. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
  577. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
  578. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
  579. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
  580. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
  581. package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
  582. package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
  583. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
  584. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
  585. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
  586. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
  587. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
  588. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
  589. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
  590. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
  591. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
  592. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
  593. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
  594. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
  595. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
  596. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
  597. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
  598. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
  599. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
  600. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
  601. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
  602. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
  603. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
  604. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
  605. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
  606. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
  607. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
  608. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
  609. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
  610. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
  611. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
  612. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
  613. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
  614. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
  615. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
  616. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
  617. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
  618. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
  619. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
  620. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
  621. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
  622. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
  623. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
  624. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
  625. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
  626. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
  627. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
  628. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
  629. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
  630. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
  631. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
  632. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
  633. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
  634. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
  635. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
  636. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
  637. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
  638. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
  639. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
  640. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
  641. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
  642. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
  643. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
  644. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
  645. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
  646. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
  647. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
  648. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
  649. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
  650. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
  651. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
  652. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
  653. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
  654. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
  655. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
  656. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
  657. package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
  658. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
  659. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
  660. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
  661. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
  662. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
  663. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
  664. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
  665. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
  666. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
  667. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
  668. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
  669. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
  670. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
  671. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
  672. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
  673. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
  674. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
  675. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
  676. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
  677. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
  678. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
  679. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
  680. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
  681. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
  682. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
  683. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
  684. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
  685. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
  686. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
  687. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
  688. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
  689. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
  690. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
  691. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
  692. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
  693. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
  694. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
  695. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
  696. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
  697. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
  698. package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
  699. package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
  700. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
  701. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
  702. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
  703. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
  704. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
  705. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
  706. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
  707. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
  708. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
  709. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
  710. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
  711. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
  712. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
  713. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
  714. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
  715. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
  716. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
  717. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
  718. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
  719. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
  720. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
  721. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
  722. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
  723. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
  724. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
  725. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
  726. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
  727. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
  728. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
  729. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
  730. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
  731. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
  732. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
  733. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
  734. package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
  735. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
  736. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
  737. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
  738. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
  739. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
  740. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
  741. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
  742. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
  743. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
  744. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
  745. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
  746. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
  747. package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
  748. package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
  749. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
  750. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
  751. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
  752. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
  753. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
  754. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
  755. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
  756. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
  757. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
  758. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
  759. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
  760. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
  761. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
  762. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
  763. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
  764. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
  765. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
  766. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
  767. package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
  768. package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
  769. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
  770. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
  771. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
  772. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
  773. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
  774. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
  775. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
  776. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
  777. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
  778. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
  779. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
  780. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
  781. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
  782. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
  783. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
  784. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
  785. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
  786. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
  787. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
  788. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
  789. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
  790. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
  791. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
  792. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
  793. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
  794. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
  795. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
  796. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
  797. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
  798. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
  799. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
  800. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
  801. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
  802. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
  803. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
  804. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
  805. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
  806. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
  807. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
  808. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
  809. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
  810. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
  811. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
  812. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
  813. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
  814. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
  815. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
  816. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
  817. package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
  818. package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
  819. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
  820. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
  821. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
  822. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
  823. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
  824. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
  825. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
  826. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
  827. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
  828. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
  829. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
  830. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
  831. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
  832. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
  833. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
  834. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
  835. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
  836. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
  837. package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
  838. package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
  839. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
  840. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
  841. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
  842. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
  843. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
  844. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
  845. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
  846. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
  847. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
  848. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
  849. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
  850. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
  851. package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
  852. package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
  853. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
  854. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
  855. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
  856. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
  857. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
  858. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
  859. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
  860. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
  861. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
  862. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
  863. package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
  864. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
  865. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
  866. package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
  867. package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
  868. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
  869. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
  870. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
  871. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
  872. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
  873. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
  874. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
  875. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
  876. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
  877. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
  878. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
  879. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
  880. package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
  881. package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
  882. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
  883. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
  884. package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
  885. package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
  886. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
  887. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
  888. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
  889. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
  890. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
  891. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
  892. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
  893. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
  894. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
  895. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
  896. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
  897. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
  898. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
  899. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
  900. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
  901. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
  902. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
  903. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
  904. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
  905. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
  906. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
  907. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
  908. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
  909. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
  910. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
  911. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
  912. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
  913. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
  914. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
  915. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
  916. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
  917. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
  918. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
  919. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
  920. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
  921. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
  922. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
  923. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
  924. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
  925. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
  926. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
  927. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
  928. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
  929. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/command-keys.ts","../../../../../../src/web-ui/app/desktop-shell.ts","../../../../../../src/web-ui/components/primitives/Tooltip.tsx","../../../../../../src/web-ui/routes/verse/resources/resources-store.ts","../../../../../../src/web-ui/routes/verse/shell/anchor-requests.ts","../../../../../../src/web-ui/routes/verse/shell/viewport.ts","../../../../../../src/web-ui/routes/verse/shell/dock-catalog.ts","../../../../../../src/web-ui/routes/verse/dock/dock-store.ts","../../../../../../src/web-ui/routes/verse/shell/nav-history.ts","../../../../../../src/web-ui/routes/verse/shell/section-modules.ts","../../../../../../src/web-ui/routes/verse/verse-ui-store.ts","../../../../../../src/web-ui/routes/verse/composer/composer-keys.ts","../../../../../../src/web-ui/routes/verse/shell/command-bus.ts","../../../../../../src/web-ui/routes/verse/shell/run-command.ts","../../../../../../src/web-ui/routes/verse/shell/skeletons.tsx","../../../../../../src/web-ui/routes/verse/useVerseUi.ts","../../../../../../src/web-ui/routes/verse/shell/focus-mode.ts","../../../../../../src/web-ui/routes/verse/shell/open-terminal-event.ts","../../../../../../src/web-ui/routes/verse/rail-icons.tsx","../../../../../../src/web-ui/routes/verse/shell/work-mode.ts","../../../../../../src/web-ui/routes/verse/VerseApp.tsx","../../../../../../src/web-ui/design/fonts/AshlrSans-latin.woff2?url","../../../../../../src/web-ui/design/fonts/SpaceGrotesk-latin.woff2?url","../../../../../../src/web-ui/app/VerseConsoleApp.tsx"],"sourcesContent":["/**\n * routes/verse/shell/command-keys.ts — every workbench KEY: which command a\n * chord runs, in which scope, and how a native layer delivers it — plus the\n * pure helpers that match and print chords (unit C0; SPEC-310C §1).\n *\n * This is the half of the command catalog a key press needs, and the only\n * half on the chat first-paint path: the shell's and the chat's key\n * handlers, the rail's shortcut hints, the composer's keys and the desktop\n * menu bridge read it. Titles, palette groups, keywords, guards and the\n * keyless palette actions are command-catalog.ts, which loads with the ⌘K\n * palette (warmed after first paint) and binds its keyed rows from the\n * table below by id — so a key is still written exactly once, here. A key\n * that is not here does not exist.\n *\n * Pure data plus pure helpers — no React, no DOM beyond reading a\n * KeyboardEvent-shaped object.\n *\n * Adding a key: an entry in COMMAND_KEYS, and `...bind('<id>')` in the\n * command's catalog row. command-catalog.test.ts checks the two agree.\n */\nimport type { WorkbenchCommand } from './command-catalog.js';\n\n// ===========================================================================\n// Scopes — where a key is live\n// ===========================================================================\n\n/**\n * global anywhere in the workbench (except inside the palette, which\n * owns every key while open, and native text editing keys)\n * chat the Chat surface has focus (transcript, sidebar, dock)\n * composer the composer's text box has focus\n * drawer the Needs-you drawer list has focus (bare letters are safe\n * there: nothing in it takes text)\n * chart a chart card has focus\n */\nexport const COMMAND_SCOPES = ['global', 'chat', 'composer', 'drawer', 'chart'] as const;\nexport type CommandScope = (typeof COMMAND_SCOPES)[number];\n\n/**\n * The scopes live AT THE SAME TIME as each scope (itself included). A key\n * must be unique across every such set — the key test checks exactly this —\n * while two scopes that are never live together (the drawer's bare `Enter`\n * and the composer's) may reuse a key.\n */\nexport const SCOPE_LAYERS: Readonly<Record<CommandScope, readonly CommandScope[]>> = {\n global: ['global'],\n chat: ['chat', 'global'],\n composer: ['composer', 'chat', 'global'],\n drawer: ['drawer', 'global'],\n chart: ['chart', 'global'],\n};\n\n// ===========================================================================\n// Keys\n// ===========================================================================\n\n/**\n * One key chord. `key` is the UNSHIFTED US-layout name: a lowercase letter or\n * digit, a punctuation character, or one of the named keys below. `mod` is ⌘\n * on macOS and Ctrl elsewhere (\"CmdOrCtrl\"); `ctrl` is the literal ⌃ key.\n */\nexport interface KeyChord {\n key: string;\n mod?: true;\n ctrl?: true;\n shift?: true;\n alt?: true;\n}\n\nexport const NAMED_KEYS = ['enter', 'escape', 'tab', 'space', 'arrowup', 'arrowdown', 'arrowleft', 'arrowright', 'backspace'] as const;\n\n/**\n * Keys the page never binds, because macOS or the desktop shell answers them\n * first: the native menu's own accelerators live in app_menu.rs (the key test\n * parses that file), these are the system's.\n */\nexport const SYSTEM_RESERVED_CHORDS: readonly KeyChord[] = [\n { key: 'space', mod: true }, // Spotlight\n { key: 'space', ctrl: true }, // input sources\n { key: 'tab', mod: true }, // app switcher\n { key: 'tab', mod: true, shift: true },\n { key: '`', mod: true }, // cycle this app's windows\n { key: '3', mod: true, shift: true }, // screenshots\n { key: '4', mod: true, shift: true },\n { key: '5', mod: true, shift: true },\n];\n\n/**\n * How a key reaches the page when a native layer is involved.\n * menu the desktop menu owns the accelerator and forwards the\n * command (via `ashlr:desktop-command`); the page's own\n * handler only fires in a plain browser.\n * global-hotkey registered system-wide by the desktop app (C8); the page\n * never binds it — it is listed for the shortcuts overlay.\n */\nexport type NativeBinding =\n | { kind: 'menu'; desktopCommand: DesktopCommandName; accelerator: string }\n | { kind: 'global-hotkey'; accelerator: string };\n\n/** One command's keys: where they are live, the chords, and any native binding. */\nexport interface KeySpec {\n scope: CommandScope;\n /** Non-empty: a command without a key has no entry here. */\n keys: readonly KeyChord[];\n native?: NativeBinding;\n}\n\n/**\n * A chord as the table writes it: its modifiers and its key, `+`-joined —\n * 'mod+k', 'ctrl+shift+`', 'alt+arrowup', 'enter'. Text rather than KeyChord\n * objects because this table is on the chat first-paint path and the text\n * is a third of the bytes; parseChord() turns it into the KeyChord every\n * helper below takes.\n */\ntype ChordText = string;\n\n/**\n * Every key: by scope, then command id. The ids are the catalog's\n * (command-catalog.ts WORKBENCH_COMMANDS); each row there with keys takes\n * them from here with `bind(id)`.\n */\nconst KEYS = {\n global: {\n // Surfaces (⌘1 Command … ⌘5 Chat) and the gear tray\n 'surface.command': 'mod+1',\n 'surface.fleet': 'mod+2',\n 'surface.growth': 'mod+3',\n 'surface.mind': 'mod+4',\n 'surface.chat': 'mod+5',\n 'surface.agents': 'mod+6',\n 'section.settings': 'mod+,',\n // Navigation\n 'palette.open': 'mod+k',\n 'needs-you.open': 'mod+j',\n 'shortcuts.open': 'mod+/',\n // ⌘. — not ⇧⌘R, which browsers keep for a hard reload.\n 'resources.toggle': 'mod+.',\n 'history.back': 'mod+[',\n 'history.forward': 'mod+]',\n 'chat.recent-next': 'ctrl+tab',\n 'chat.recent-prev': 'ctrl+shift+tab',\n 'rail.toggle-labels': 'mod+shift+\\\\',\n // Chats\n 'chat.new': 'mod+n',\n // The fleet (3.15): Start / Pause / Resume / Stop from anywhere. Start\n // and Stop still confirm on screen — raising authority is never ONE key.\n 'fleet.start': 'mod+alt+s',\n 'fleet.pause': 'mod+alt+p',\n 'fleet.resume': 'mod+alt+r',\n // Not `fleet.stop` (the shell's guarded palette row, which stays keyless):\n // this key opens the Fleet tab's own Stop confirmation.\n 'fleet.halt': 'mod+alt+.',\n // 3.16: one task on several seats, each in its own workspace (the Agents board).\n 'agents.new-multi': 'mod+shift+n',\n // App\n 'appearance.toggle-theme': 'mod+shift+l',\n 'app.summon': 'ctrl+alt+space',\n },\n chat: {\n 'chat.sidebar': 'mod+b',\n 'chat.find': 'mod+f',\n 'chat.turn-prev': 'alt+arrowup',\n 'chat.turn-next': 'alt+arrowdown',\n // Focus mode: everything but the conversation steps aside.\n 'chat.focus-mode': 'mod+shift+f',\n // Dock (the panel area). One mnemonic chord per first-party pane; a pane\n // registered by another unit brings its own (panes/pane-registry.ts\n // refuses one that collides with any chord here). NOT ⇧⌘E (composer\n // effort) and NOT ⇧⌘R (a browser's hard reload).\n 'dock.toggle': 'mod+\\\\',\n 'dock.terminal': 'ctrl+`',\n 'dock.terminal-new': 'ctrl+shift+`',\n 'dock.preview': 'mod+shift+b',\n 'dock.diff': 'mod+shift+d',\n 'dock.files': 'mod+shift+o',\n 'dock.sources': 'mod+shift+s',\n 'dock.reasoning': 'mod+shift+y',\n // Composer menus (open from anywhere in the chat)\n 'composer.permission': 'mod+shift+m',\n 'composer.model': 'mod+shift+i',\n 'composer.effort': 'mod+shift+e',\n 'composer.attach': 'mod+u',\n },\n composer: {\n 'composer.send': 'enter',\n 'composer.stop-and-send': 'mod+shift+enter',\n 'composer.stop': 'escape',\n },\n drawer: {\n 'drawer.next': 'j',\n 'drawer.prev': 'k',\n 'drawer.open': 'enter',\n 'drawer.approve': 'a',\n 'drawer.reject': 'r',\n 'drawer.veto': 'v',\n 'drawer.done': 'e',\n 'drawer.select': 'x',\n 'drawer.split-prev': 'h',\n 'drawer.split-next': 'l',\n },\n chart: {\n 'chart.table': 't',\n },\n} as const satisfies Record<CommandScope, Record<string, ChordText>>;\n\ntype KeyTable = typeof KEYS;\nexport type KeyedCommandId = { [S in keyof KeyTable]: keyof KeyTable[S] }[keyof KeyTable];\n\n/** The keys a native layer delivers or owns (C8). */\nconst NATIVE: Readonly<Partial<Record<KeyedCommandId, NativeBinding>>> = {\n 'section.settings': { kind: 'menu', desktopCommand: 'open-settings', accelerator: 'CmdOrCtrl+,' },\n 'appearance.toggle-theme': { kind: 'menu', desktopCommand: 'toggle-theme', accelerator: 'Shift+CmdOrCtrl+L' },\n 'app.summon': { kind: 'global-hotkey', accelerator: 'Control+Alt+Space' },\n};\n\n/** 'mod+shift+b' → { key: 'b', mod: true, shift: true }. */\nexport function parseChord(text: ChordText): KeyChord {\n const parts = text.split('+');\n const chord: KeyChord = { key: parts.pop()! };\n for (const modifier of parts) chord[modifier as 'mod' | 'ctrl' | 'shift' | 'alt'] = true;\n return chord;\n}\n\n/** A command's keys, with its id. */\nexport interface KeyBinding extends KeySpec {\n id: KeyedCommandId;\n}\n\nconst BINDINGS: readonly KeyBinding[] = (Object.entries(KEYS) as Array<[CommandScope, Record<string, ChordText>]>).flatMap(([scope, byId]) =>\n Object.entries(byId).map(([id, text]) => {\n const native = NATIVE[id as KeyedCommandId];\n return { id: id as KeyedCommandId, scope, keys: [parseChord(text)], ...(native ? { native } : {}) };\n }),\n);\n\n/** Every command's keys, by id (the catalog's bind() reads it). */\nexport const COMMAND_KEYS = Object.fromEntries(BINDINGS.map((b) => [b.id, b])) as Readonly<Record<KeyedCommandId, KeyBinding>>;\n\n/** The keys of command `id`; null for a command with none (or no such command). */\nexport function keyBinding(id: string): KeyBinding | null {\n // Reuse the catalog's index instead of allocating a second startup map.\n // Own-property lookup keeps names such as \"constructor\" unbound.\n return Object.hasOwn(COMMAND_KEYS, id) ? COMMAND_KEYS[id as KeyedCommandId] : null;\n}\n\n/** The chord a hint prints for `id` (its first); undefined when it has no key. */\nexport function commandChord(id: string): KeyChord | undefined {\n return keyBinding(id)?.keys[0];\n}\n\n// ===========================================================================\n// The window event (units that are not on the command bus)\n// ===========================================================================\n\n/**\n * The window event the palette (C1) and the native menu bridge dispatch to\n * run a catalog command on a surface that listens for it instead of\n * registering on the command bus:\n * window.dispatchEvent(new CustomEvent(WORKBENCH_COMMAND_EVENT, { detail: { id } }))\n * The composer (C3) answers the `composer.*` ids it implements.\n *\n * It lives HERE, beside the ids it carries, so the shell (run-command.ts)\n * does not have to import a composer module to name its own event —\n * composer/composer-keys.ts re-exports it for its existing importers.\n */\nexport const WORKBENCH_COMMAND_EVENT = 'ashlr:command';\n\n// ===========================================================================\n// Desktop commands (C8 → page)\n// ===========================================================================\n\n/**\n * What the desktop shell may send the page (`ashlr:desktop-command`), and the\n * catalog command each one runs. C8 dispatches these from the menu bar, the\n * tray, a clicked notification (focus regained within 60 s) and the global\n * hotkey; C1 runs them. `open-session:<id>` carries a session id.\n */\nexport const DESKTOP_COMMAND_NAMES = ['open-settings', 'toggle-theme', 'open-needs-you', 'new-chat', 'focus-composer'] as const;\n// Its own literal list (not `keyof typeof DESKTOP_COMMANDS`): NativeBinding\n// names it, COMMAND_KEYS uses NativeBinding, and DESKTOP_COMMANDS is typed by\n// KeyedCommandId — deriving it from the map would make the types circular.\nexport type DesktopCommandName = (typeof DESKTOP_COMMAND_NAMES)[number];\n\n/** Each runs a command with a key (the menu shows it), so the ids are keyed ones. */\nexport const DESKTOP_COMMANDS: Readonly<Record<DesktopCommandName, KeyedCommandId>> = {\n 'open-settings': 'section.settings',\n 'toggle-theme': 'appearance.toggle-theme',\n 'open-needs-you': 'needs-you.open',\n 'new-chat': 'chat.new',\n 'focus-composer': 'app.summon',\n};\n\n/** `open-session:<id>` — the notification for a finished or failed chat. */\nexport const OPEN_SESSION_COMMAND_RE = /^open-session:([A-Za-z0-9._-]{1,128})$/;\n\n/**\n * `open-pane:<paneId>` or `open-pane:<paneId>@<sessionId>` — a pane in the\n * chat's panel area, in the open chat or in the one named (3.16 workbench;\n * shell/deep-link.ts is the URL form of the same thing).\n */\nexport const OPEN_PANE_COMMAND_RE = /^open-pane:([a-z][a-z0-9-]{0,39})(?:@([A-Za-z0-9._-]{1,128}))?$/;\n\n/**\n * `open-terminal:<tabId>` or `open-terminal:<tabId>/<blockId>` — a terminal\n * tab (in its chat, the Terminal pane showing it) and optionally one of its\n * command blocks: the notification for a long command or a CLI agent that\n * needs you (3.15; desktop notify.rs `ClickTarget::Terminal`).\n */\nexport const OPEN_TERMINAL_COMMAND_RE = /^open-terminal:(t-[a-z0-9]{1,32})(?:\\/(b-\\d{1,9}))?$/;\n\nexport type ParsedDesktopCommand =\n | { kind: 'command'; name: DesktopCommandName; commandId: KeyedCommandId }\n | { kind: 'open-session'; sessionId: string }\n | { kind: 'open-pane'; paneId: string; sessionId: string | null }\n | { kind: 'open-terminal'; tabId: string; blockId: string | null };\n\n/** Parse a raw desktop command string; null for anything unknown (never guessed). */\nexport function parseDesktopCommand(raw: unknown): ParsedDesktopCommand | null {\n if (typeof raw !== 'string') return null;\n if (Object.prototype.hasOwnProperty.call(DESKTOP_COMMANDS, raw)) {\n const name = raw as DesktopCommandName;\n return { kind: 'command', name, commandId: DESKTOP_COMMANDS[name] };\n }\n const pane = OPEN_PANE_COMMAND_RE.exec(raw);\n if (pane) return { kind: 'open-pane', paneId: pane[1]!, sessionId: pane[2] ?? null };\n const terminal = OPEN_TERMINAL_COMMAND_RE.exec(raw);\n if (terminal) return { kind: 'open-terminal', tabId: terminal[1]!, blockId: terminal[2] ?? null };\n const session = OPEN_SESSION_COMMAND_RE.exec(raw);\n return session ? { kind: 'open-session', sessionId: session[1]! } : null;\n}\n\n// ===========================================================================\n// The whole catalog, once it has loaded\n// ===========================================================================\n\nlet catalogLookup: ((id: string) => WorkbenchCommand | null) | null = null;\n\n/**\n * command-catalog.ts registers its lookup here when its chunk evaluates.\n * Everything that can name a keyless command — the palette, onboarding's\n * \"Approve grant…\" — imports the catalog, so by the time such an id reaches\n * run-command.ts the lookup is in; the warm-up fetches it after first paint\n * regardless.\n */\nexport function registerCommandCatalog(lookup: (id: string) => WorkbenchCommand | null): void {\n catalogLookup = lookup;\n}\n\n/**\n * The full catalog entry for `id` — null before the catalog has loaded (a\n * key's id then still resolves through keyBinding()) or for an id the\n * catalog does not have.\n */\nexport function loadedCommand(id: string): WorkbenchCommand | null {\n return catalogLookup ? catalogLookup(id) : null;\n}\n\n/** Has the catalog registered its lookup yet? */\nexport function commandCatalogLoaded(): boolean {\n return catalogLookup !== null;\n}\n\n// ===========================================================================\n// Matching and display\n// ===========================================================================\n\nexport type KeyPlatform = 'mac' | 'other';\n\n/** The platform the page runs on, for ⌘ vs Ctrl. */\nexport function detectKeyPlatform(): KeyPlatform {\n if (typeof navigator === 'undefined') return 'mac';\n const nav = navigator as Navigator & { userAgentData?: { platform?: string } };\n const platform = nav.userAgentData?.platform ?? nav.platform ?? '';\n return /mac|iphone|ipad|ipod/i.test(platform) ? 'mac' : 'other';\n}\n\n/** The part of a KeyboardEvent matching needs (so tests can pass plain objects). */\nexport interface KeyEventLike {\n key: string;\n code?: string;\n metaKey: boolean;\n ctrlKey: boolean;\n shiftKey: boolean;\n altKey: boolean;\n}\n\nconst CODE_CHARS: Readonly<Record<string, string>> = {\n Backslash: '\\\\',\n Backquote: '`',\n BracketLeft: '[',\n BracketRight: ']',\n Slash: '/',\n Comma: ',',\n Period: '.',\n Semicolon: ';',\n Quote: \"'\",\n Minus: '-',\n Equal: '=',\n Space: 'space',\n};\n\nconst KEY_ALIASES: Readonly<Record<string, string>> = {\n ' ': 'space',\n spacebar: 'space',\n esc: 'escape',\n return: 'enter',\n up: 'arrowup',\n down: 'arrowdown',\n left: 'arrowleft',\n right: 'arrowright',\n};\n\n/**\n * The event's key as a chord `key`. Letters come from `event.key` (so ⌘K is\n * ⌘K on any keyboard layout); digits and punctuation come from `event.code`\n * when it is known, because Shift and ⌥ change `event.key` (⇧\\ reads \"|\",\n * ⌥J reads \"∆\") while the chord names the unshifted key.\n */\nexport function eventKeyName(event: Pick<KeyEventLike, 'key' | 'code'>): string {\n const key = event.key ?? '';\n if (/^[a-z]$/i.test(key)) return key.toLowerCase();\n const code = event.code ?? '';\n if (/^Digit[0-9]$/.test(code)) return code.slice(5);\n if (CODE_CHARS[code]) return CODE_CHARS[code]!;\n if (/^Key[A-Z]$/.test(code)) return code.slice(3).toLowerCase();\n const lower = key.toLowerCase();\n return KEY_ALIASES[lower] ?? lower;\n}\n\n/**\n * Does `event` press `chord`? Modifiers must match EXACTLY (⌘K is not ⇧⌘K).\n * Off macOS, `mod` and `ctrl` are both the Ctrl key and ⌘/Win never matches.\n */\nexport function chordMatches(event: KeyEventLike, chord: KeyChord, platform: KeyPlatform = detectKeyPlatform()): boolean {\n if (platform === 'mac') {\n if (Boolean(chord.mod) !== event.metaKey) return false;\n if (Boolean(chord.ctrl) !== event.ctrlKey) return false;\n } else {\n if (event.metaKey) return false;\n if (Boolean(chord.mod || chord.ctrl) !== event.ctrlKey) return false;\n }\n if (Boolean(chord.shift) !== event.shiftKey) return false;\n if (Boolean(chord.alt) !== event.altKey) return false;\n return eventKeyName(event) === chord.key;\n}\n\n/**\n * The key binding a key press runs, given the scopes live right now\n * (innermost first, e.g. ['composer', 'chat', 'global']). Null when nothing\n * is bound — the caller must then leave the event alone.\n * (command-catalog.ts matchCommand returns the full catalog entry.)\n */\nexport function matchKey(event: KeyEventLike, liveScopes: readonly CommandScope[], platform: KeyPlatform = detectKeyPlatform()): KeyBinding | null {\n for (const scope of liveScopes) {\n for (const binding of BINDINGS) {\n if (binding.scope !== scope) continue;\n // The page never handles a system-wide hotkey itself.\n if (binding.native?.kind === 'global-hotkey') continue;\n if (binding.keys.some((chord) => chordMatches(event, chord, platform))) return binding;\n }\n }\n return null;\n}\n\n/** Stable identity for a chord (\"mod+shift+b\"), for de-duplication and tests. */\nexport function chordId(chord: KeyChord): string {\n return [chord.ctrl ? 'ctrl' : '', chord.alt ? 'alt' : '', chord.shift ? 'shift' : '', chord.mod ? 'mod' : '', chord.key].filter(Boolean).join('+');\n}\n\nconst MAC_KEY_GLYPHS: Readonly<Record<string, string>> = {\n enter: '↩',\n tab: '⇥',\n backspace: '⌫',\n};\n\n/** Shared names; macOS overrides only the keys that have native glyphs. */\nconst KEY_NAMES: Readonly<Record<string, string>> = {\n enter: 'Enter',\n escape: 'Esc',\n tab: 'Tab',\n space: 'Space',\n arrowup: '↑',\n arrowdown: '↓',\n arrowleft: '←',\n arrowright: '→',\n backspace: 'Backspace',\n};\n\n/**\n * How a chord is printed. macOS uses Apple's modifier order (⌃ ⌥ ⇧ ⌘) with\n * no separators (\"⇧⌘B\", \"⌃`\", \"⌥↑\"); elsewhere \"Ctrl+Shift+B\".\n */\nexport function formatChord(chord: KeyChord, platform: KeyPlatform = detectKeyPlatform()): string {\n const key = chord.key.length === 1 ? chord.key.toUpperCase() :\n (platform === 'mac' ? MAC_KEY_GLYPHS[chord.key] : undefined) ?? KEY_NAMES[chord.key] ?? chord.key;\n if (platform === 'mac') {\n return `${chord.ctrl ? '⌃' : ''}${chord.alt ? '⌥' : ''}${chord.shift ? '⇧' : ''}${chord.mod ? '⌘' : ''}${key}`;\n }\n const parts = [chord.mod || chord.ctrl ? 'Ctrl' : '', chord.alt ? 'Alt' : '', chord.shift ? 'Shift' : '', key].filter(Boolean);\n return parts.join('+');\n}\n\n/**\n * Tauri's accelerator string for a chord (\"Shift+CmdOrCtrl+L\") — what C8\n * writes in app_menu.rs, and what the key test compares against.\n */\nexport function chordAccelerator(chord: KeyChord): string {\n const TAURI_KEYS: Readonly<Record<string, string>> = {\n enter: 'Enter',\n escape: 'Escape',\n tab: 'Tab',\n space: 'Space',\n arrowup: 'Up',\n arrowdown: 'Down',\n arrowleft: 'Left',\n arrowright: 'Right',\n backspace: 'Backspace',\n };\n const key = TAURI_KEYS[chord.key] ?? (chord.key.length === 1 ? chord.key.toUpperCase() : chord.key);\n return [chord.shift ? 'Shift' : '', chord.ctrl ? 'Control' : '', chord.alt ? 'Alt' : '', chord.mod ? 'CmdOrCtrl' : '', key].filter(Boolean).join('+');\n}\n","/**\n * app/desktop-shell.ts — the web half of the desktop shell contract.\n *\n * The native side (`desktop/src-tauri/src/shell_contract.{rs,js}`, documented\n * in `desktop/README.md` → \"Desktop shell contract\") injects markers, CSS\n * variables, a drag-region mirror, a command event (menu bar, tray, clicked\n * notifications, the global hotkey), the desktop state behind Settings ▸\n * Desktop, and two page→native calls (theme, preferences). This module is the\n * ONLY place the web UI touches any of it, so the console keeps exactly one\n * seam to the desktop app and never references Tauri.\n *\n * Everything here is inert in a browser: the markers are absent, the global\n * is undefined, and the event is never dispatched. No caller needs a\n * conditional build or a feature flag.\n */\nimport { useSyncExternalStore } from 'react';\nimport type { ThemePreference } from '../data/theme-store.js';\nimport { parseDesktopCommand, type ParsedDesktopCommand } from '../routes/verse/shell/command-keys.js';\n\n/**\n * The two commands the native MENU BAR sends (the 3.9 contract).\n * `subscribeDesktopCommands` keeps delivering exactly these; everything the\n * 3.10 shell sends (tray, notifications, hotkey) arrives through\n * `subscribeShellCommands`, parsed by the command catalog.\n */\nexport type DesktopCommand = 'open-settings' | 'toggle-theme';\n\nconst DESKTOP_COMMAND_EVENT = 'ashlr:desktop-command';\nconst COMMANDS: readonly DesktopCommand[] = ['open-settings', 'toggle-theme'];\n\n/**\n * True only inside the Tauri window, where `shell_contract.js` has stamped\n * `data-app-shell=\"desktop\"` on `<html>`. Layout does NOT branch on this —\n * the CSS reads `--app-titlebar-height` / `--app-traffic-light-inset` with a\n * `0px` fallback instead, so there is one layout, not two.\n */\nexport function isDesktopShell(): boolean {\n try {\n return document.documentElement.getAttribute('data-app-shell') === 'desktop';\n } catch {\n return false;\n }\n}\n\n/**\n * Resolve a three-state preference down to what is actually painted, which is\n * what the native side needs: it stores the value and paints the window\n * background with the matching canvas colour on the NEXT launch, before the\n * webview has painted. 'system' therefore has to become a concrete answer\n * here, not be passed through.\n */\nexport function resolveTheme(preference: ThemePreference): 'light' | 'dark' {\n if (preference === 'light' || preference === 'dark') return preference;\n try {\n return window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';\n } catch {\n // jsdom and old webviews without matchMedia: light is the token default.\n return 'light';\n }\n}\n\ninterface DesktopBridge {\n reportTheme?: (theme: 'light' | 'dark') => void;\n getState?: () => unknown;\n setPreference?: (name: DesktopPreference, value: boolean) => boolean;\n}\n\nfunction bridge(): DesktopBridge | undefined {\n return (window as unknown as { __ASHLR_DESKTOP__?: DesktopBridge }).__ASHLR_DESKTOP__;\n}\n\n/**\n * Tell the native window which theme is painted, so the next cold launch does\n * not flash white. Optional by contract, best-effort by implementation: a\n * browser has no bridge, and a throwing bridge must never break a render.\n * Repeat calls with the same value are dropped on the native side.\n */\nexport function reportThemeToShell(preference: ThemePreference): void {\n try {\n bridge()?.reportTheme?.(resolveTheme(preference));\n } catch {\n /* the shell is an enhancement; never let it fail the page */\n }\n}\n\nfunction isDesktopCommand(value: unknown): value is DesktopCommand {\n return typeof value === 'string' && (COMMANDS as readonly string[]).includes(value);\n}\n\n/**\n * Listen for menu commands. Returns an unsubscribe function, so a component\n * can register it from an effect.\n *\n * Unknown commands are ignored rather than forwarded: the native menu can\n * grow ahead of the web UI, and an unhandled command is specified to be inert\n * rather than an error.\n */\nexport function subscribeDesktopCommands(handler: (command: DesktopCommand) => void): () => void {\n function onCommand(event: Event): void {\n const detail = (event as CustomEvent<{ command?: unknown }>).detail;\n const command = detail?.command;\n if (isDesktopCommand(command)) handler(command);\n }\n window.addEventListener(DESKTOP_COMMAND_EVENT, onCommand);\n return () => window.removeEventListener(DESKTOP_COMMAND_EVENT, onCommand);\n}\n\n/**\n * Every desktop command — menu bar, tray, a clicked notification, the global\n * hotkey — parsed by the command catalog (`parseDesktopCommand`): a catalog\n * command (`open-needs-you`, `new-chat`, `focus-composer`, …) or\n * `open-session:<id>`. Unknown strings are dropped, never guessed. This is\n * what the workbench shell (C1) listens to; `subscribeDesktopCommands` stays\n * for the 3.9 menu-only contract.\n */\nexport function subscribeShellCommands(handler: (command: ParsedDesktopCommand) => void): () => void {\n function onCommand(event: Event): void {\n const parsed = parseDesktopCommand((event as CustomEvent<{ command?: unknown }>).detail?.command);\n if (parsed) handler(parsed);\n }\n window.addEventListener(DESKTOP_COMMAND_EVENT, onCommand);\n return () => window.removeEventListener(DESKTOP_COMMAND_EVENT, onCommand);\n}\n\n// ===========================================================================\n// Desktop state — Settings ▸ Desktop (V3.10, C8)\n// ===========================================================================\n\n/** Preferences Settings ▸ Desktop may change (desktop_prefs.rs `PrefsPatch`). */\nexport type DesktopPreference = 'globalHotkey' | 'notifications';\n\n/**\n * What the desktop app reports (desktop_prefs.rs `DesktopStateView`). Every\n * string is the shell's own copy — nothing from the server.\n */\nexport interface DesktopState {\n hotkey: {\n /** The operator's choice. */\n enabled: boolean;\n /** Whether macOS actually gave Ashlr the chord. */\n registered: boolean;\n /** Display form, e.g. \"⌃⌥Space\". */\n accelerator: string;\n /** Why `registered` is false while `enabled` is true; null otherwise. */\n error: string | null;\n };\n notifications: {\n enabled: boolean;\n /**\n * `native` — a signed build, banners come from Ashlr.\n * `script` — an unsigned build, banners come through osascript and show\n * as Script Editor (say so beside the toggle).\n */\n delivery: 'native' | 'script';\n };\n}\n\nconst DESKTOP_STATE_EVENT = 'ashlr:desktop-state';\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\n/** Boundary check: the value crossed from another runtime. */\nexport function isDesktopState(value: unknown): value is DesktopState {\n if (!isRecord(value) || !isRecord(value['hotkey']) || !isRecord(value['notifications'])) return false;\n const h = value['hotkey'];\n const n = value['notifications'];\n return (\n typeof h['enabled'] === 'boolean' &&\n typeof h['registered'] === 'boolean' &&\n typeof h['accelerator'] === 'string' &&\n h['accelerator'].length > 0 &&\n h['accelerator'].length <= 32 &&\n (h['error'] === null || (typeof h['error'] === 'string' && h['error'].length <= 300)) &&\n typeof n['enabled'] === 'boolean' &&\n (n['delivery'] === 'native' || n['delivery'] === 'script')\n );\n}\n\n// One module-level listener feeds a cached snapshot, so readers (and\n// useSyncExternalStore, which needs a STABLE snapshot) never see a stale or\n// freshly-copied object.\nlet cachedState: DesktopState | null | undefined;\nlet listening = false;\nconst stateListeners = new Set<(state: DesktopState) => void>();\n\nfunction readBridgeState(): DesktopState | null {\n try {\n const raw = bridge()?.getState?.();\n return isDesktopState(raw) ? raw : null;\n } catch {\n return null;\n }\n}\n\nfunction onDesktopState(event: Event): void {\n const detail = (event as CustomEvent<unknown>).detail;\n if (!isDesktopState(detail)) return;\n cachedState = detail;\n for (const listener of [...stateListeners]) listener(detail);\n}\n\nfunction ensureListening(): void {\n if (listening) return;\n listening = true;\n window.addEventListener(DESKTOP_STATE_EVENT, onDesktopState);\n}\n\n/** The latest desktop state, or null in a browser (and before native answered). */\nexport function getDesktopState(): DesktopState | null {\n ensureListening();\n if (cachedState === undefined || cachedState === null) cachedState = readBridgeState();\n return cachedState;\n}\n\n/** Called with every new state native sends. Returns an unsubscribe function. */\nexport function subscribeDesktopState(handler: (state: DesktopState) => void): () => void {\n ensureListening();\n stateListeners.add(handler);\n return () => {\n stateListeners.delete(handler);\n };\n}\n\n/**\n * Ask the desktop app to change a preference. True when the request was sent\n * (a desktop bridge exists), false in a browser. The answer arrives as a new\n * state — e.g. a hotkey another app holds comes back\n * `{ enabled: true, registered: false, error }` — so render from state, never\n * from the value you asked for.\n */\nexport function setDesktopPreference(name: DesktopPreference, value: boolean): boolean {\n if (name !== 'globalHotkey' && name !== 'notifications') return false;\n if (typeof value !== 'boolean') return false;\n try {\n return bridge()?.setPreference?.(name, value) === true;\n } catch {\n return false;\n }\n}\n\nfunction subscribeStore(onChange: () => void): () => void {\n return subscribeDesktopState(() => onChange());\n}\n\n/**\n * React: the live desktop state, or null in a browser. Settings ▸ Desktop\n * renders its hotkey and notification rows from this and hides them (or says\n * \"available in the desktop app\") when it is null.\n */\nexport function useDesktopState(): DesktopState | null {\n return useSyncExternalStore(subscribeStore, getDesktopState, () => null);\n}\n\n/** Tests only: forget the cached state and the module listener. */\nexport function resetDesktopStateForTests(): void {\n if (listening) window.removeEventListener(DESKTOP_STATE_EVENT, onDesktopState);\n listening = false;\n cachedState = undefined;\n stateListeners.clear();\n}\n","/**\n * components/primitives/Tooltip.tsx — the label for an icon-only control and\n * the numbers behind a 2px meter line.\n *\n * Rules it enforces so a tooltip never becomes the only way to read the UI:\n * - it shows on HOVER *and* on keyboard FOCUS (a mouse-only tooltip is\n * invisible to keyboard operators);\n * - Escape dismisses it while the trigger keeps focus (WCAG 1.4.13);\n * - the trigger is wired with aria-describedby, so the content is\n * announced rather than merely drawn;\n * - it carries description, never the accessible NAME — icon buttons still\n * need their own aria-label.\n *\n * WHY IT RENDERS THROUGH A PORTAL. This used to be an absolutely-positioned\n * span inside a `position: relative` wrapper, which is correct right up until\n * the trigger lives inside something that clips — and the first real consumer,\n * the Verse rail, is exactly that: a 56px flex column inside a grid shell with\n * its own stacking context. A bubble anchored there is cut off at the rail's\n * edge, which is the failure the native `title=` tooltip already had. Rendering\n * into `document.body` at `position: fixed`, positioned from the trigger's\n * bounding rect, means NO ancestor can clip it: not `overflow: hidden`, not a\n * `transform`, not a lower `z-index` on a sibling pane.\n *\n * The Popover API (`popover=\"manual\"` + the top layer) would do the same job\n * without the portal, but it is not yet safe to depend on across the WebKit\n * version bundled with the Tauri shell, and it still needs manual positioning\n * without `anchor-name`. The portal is the boring, verifiable option.\n *\n * TWO PROP SPELLINGS, on purpose. `label` + `shortcut` is the shape icon\n * controls want, and is what new call sites should use. `content` predates it\n * and takes arbitrary nodes (the Meter's numbers, for one), so it stays as the\n * other half of a union rather than being renamed out from under its callers.\n * Exactly one of the two is required.\n */\nimport {\n cloneElement,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useRef,\n useState,\n type FocusEvent as ReactFocusEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactElement,\n type ReactNode,\n} from 'react';\nimport { createPortal } from 'react-dom';\nimport styles from './Tooltip.module.css';\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\n/**\n * Hovering across a rail of six icons must not strobe six bubbles, so the\n * POINTER waits. Focus does not: a keyboard operator has already committed to\n * the control, and a delay there just reads as lag.\n */\nconst OPEN_DELAY_MS = 160;\n/** Distance between the trigger's edge and the bubble. */\nconst GAP = 8;\n/** Smallest distance the bubble may sit from the viewport edge. */\nconst MARGIN = 8;\n\n/** The props Tooltip clones onto its trigger. */\ninterface TooltipTriggerProps {\n 'aria-describedby'?: string;\n /** Read, never set: a disabled trigger fires no pointer events, so the wrapper must take over. */\n disabled?: boolean;\n onMouseEnter?: (event: ReactMouseEvent<HTMLElement>) => void;\n onMouseLeave?: (event: ReactMouseEvent<HTMLElement>) => void;\n onFocus?: (event: ReactFocusEvent<HTMLElement>) => void;\n onBlur?: (event: ReactFocusEvent<HTMLElement>) => void;\n}\n\ninterface TooltipCommonProps {\n /** Rendered as a distinct keycap beside the label, e.g. `⌘2`. */\n shortcut?: string;\n placement?: TooltipPlacement;\n /** Skip the tooltip entirely without changing the tree (e.g. the label is already visible). */\n disabled?: boolean;\n className?: string;\n /** The trigger. Tooltip adds no layout box of its own around it. */\n children: ReactElement<TooltipTriggerProps>;\n}\n\nexport type TooltipProps = TooltipCommonProps &\n (\n | { label: string; content?: undefined }\n | { label?: undefined; content: ReactNode }\n );\n\ninterface Position {\n left: number;\n top: number;\n placement: TooltipPlacement;\n}\n\n/** Placement order: the caller's choice first, then its opposite, then the rest. */\nfunction candidates(preferred: TooltipPlacement): TooltipPlacement[] {\n const opposite: Record<TooltipPlacement, TooltipPlacement> = {\n top: 'bottom', bottom: 'top', left: 'right', right: 'left',\n };\n const rest = (['top', 'bottom', 'right', 'left'] as const).filter(\n (p) => p !== preferred && p !== opposite[preferred],\n );\n return [preferred, opposite[preferred], ...rest];\n}\n\nfunction place(placement: TooltipPlacement, trigger: DOMRect, w: number, h: number): { left: number; top: number } {\n switch (placement) {\n case 'top': return { left: trigger.left + trigger.width / 2 - w / 2, top: trigger.top - h - GAP };\n case 'bottom': return { left: trigger.left + trigger.width / 2 - w / 2, top: trigger.bottom + GAP };\n case 'left': return { left: trigger.left - w - GAP, top: trigger.top + trigger.height / 2 - h / 2 };\n case 'right': return { left: trigger.right + GAP, top: trigger.top + trigger.height / 2 - h / 2 };\n }\n}\n\n/**\n * First placement whose bubble fits the viewport wins; if none fits we keep\n * the preferred one and clamp, which is still readable — a bubble nudged\n * inward beats a bubble half off-screen.\n */\nfunction resolve(trigger: DOMRect, w: number, h: number, preferred: TooltipPlacement): Position {\n const vw = window.innerWidth || 0;\n const vh = window.innerHeight || 0;\n let fallback: Position | null = null;\n for (const placement of candidates(preferred)) {\n const { left, top } = place(placement, trigger, w, h);\n if (!fallback) fallback = { left, top, placement };\n const fits = left >= MARGIN && top >= MARGIN && left + w <= vw - MARGIN && top + h <= vh - MARGIN;\n if (fits) return { left, top, placement };\n }\n const chosen = fallback!;\n return {\n placement: chosen.placement,\n left: Math.max(MARGIN, Math.min(chosen.left, vw - w - MARGIN)),\n top: Math.max(MARGIN, Math.min(chosen.top, vh - h - MARGIN)),\n };\n}\n\nexport function Tooltip(props: TooltipProps) {\n const { label, content, shortcut, placement = 'top', disabled = false, className, children } = props;\n const [open, setOpen] = useState(false);\n const [position, setPosition] = useState<Position | null>(null);\n const id = useId();\n const triggerRef = useRef<HTMLElement | null>(null);\n const bubbleRef = useRef<HTMLDivElement | null>(null);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const cancelTimer = useCallback(() => {\n if (timer.current !== null) {\n clearTimeout(timer.current);\n timer.current = null;\n }\n }, []);\n\n const close = useCallback(() => {\n cancelTimer();\n setOpen(false);\n setPosition(null);\n }, [cancelTimer]);\n\n // Unmounting mid-delay must not fire setOpen on a dead component.\n useEffect(() => cancelTimer, [cancelTimer]);\n\n const reposition = useCallback(() => {\n const trigger = triggerRef.current;\n const bubble = bubbleRef.current;\n if (!trigger || !bubble) return;\n const rect = trigger.getBoundingClientRect();\n setPosition(resolve(rect, bubble.offsetWidth, bubble.offsetHeight, placement));\n }, [placement]);\n\n // Measure AFTER the bubble exists but BEFORE paint, so it is never seen at\n // its unpositioned origin first.\n useLayoutEffect(() => {\n if (!open) return;\n reposition();\n }, [open, reposition]);\n\n // Escape closes while the trigger keeps focus (WCAG 1.4.13). Held at the\n // document so it works wherever the keystroke lands, and a scroll or resize\n // under an open bubble re-anchors it rather than leaving it stranded.\n useEffect(() => {\n if (!open) return;\n function onKeyDown(event: globalThis.KeyboardEvent) {\n if (event.key === 'Escape') close();\n }\n document.addEventListener('keydown', onKeyDown);\n window.addEventListener('resize', reposition);\n // Capture: a scroll inside any ancestor moves the trigger too, and scroll\n // events from those do not bubble to window.\n window.addEventListener('scroll', reposition, true);\n return () => {\n document.removeEventListener('keydown', onKeyDown);\n window.removeEventListener('resize', reposition);\n window.removeEventListener('scroll', reposition, true);\n };\n }, [open, close, reposition]);\n\n const body = label ?? content;\n const empty = body === null || body === undefined || body === '';\n if (disabled || empty) return children;\n\n function openAfterDelay(element: HTMLElement) {\n triggerRef.current = element;\n cancelTimer();\n timer.current = setTimeout(() => {\n timer.current = null;\n setOpen(true);\n }, OPEN_DELAY_MS);\n }\n\n function openNow(element: HTMLElement) {\n triggerRef.current = element;\n cancelTimer();\n setOpen(true);\n }\n\n const triggerDisabled = children.props.disabled === true;\n const describedBy = open ? id : undefined;\n\n const trigger = cloneElement(children, {\n 'aria-describedby': describedBy,\n onMouseEnter: (event: ReactMouseEvent<HTMLElement>) => {\n children.props.onMouseEnter?.(event);\n openAfterDelay(event.currentTarget);\n },\n onMouseLeave: (event: ReactMouseEvent<HTMLElement>) => {\n children.props.onMouseLeave?.(event);\n close();\n },\n onFocus: (event: ReactFocusEvent<HTMLElement>) => {\n children.props.onFocus?.(event);\n openNow(event.currentTarget);\n },\n onBlur: (event: ReactFocusEvent<HTMLElement>) => {\n children.props.onBlur?.(event);\n close();\n },\n });\n\n return (\n <>\n {/*\n `display: contents` — the wrapper exists in the DOM but generates no\n box, so it cannot disturb the trigger's own flex/grid placement. It is\n here only to carry the describedby relationship at the trigger's parent\n as well as on the trigger itself; the behaviour all lives on the cloned\n child, which is what actually has a hover target.\n */}\n <span\n className={`${styles.wrapper} ${className ?? ''}`}\n aria-describedby={describedBy}\n /*\n A DISABLED trigger emits no pointer events at all, so handlers on the\n cloned child can never fire and its tooltip could never open — which\n is precisely the tooltip that matters, since it is the one explaining\n WHY the control is disabled. When the child is disabled the wrapper\n stops being `display: contents`, takes a box of its own, and carries\n the hover itself. Focus is not mirrored here: a disabled control is\n not focusable, so there is no focus to mirror.\n */\n data-disabled-trigger={triggerDisabled ? 'true' : undefined}\n onMouseOver={triggerDisabled ? (event) => openNow(event.currentTarget) : undefined}\n onMouseOut={triggerDisabled ? close : undefined}\n >\n {trigger}\n </span>\n {open\n ? createPortal(\n <div\n ref={bubbleRef}\n role=\"tooltip\"\n id={id}\n className={styles.bubble}\n data-placement={position?.placement ?? placement}\n style={{\n // Inline, though the stylesheet says it too: `left`/`top`\n // below are VIEWPORT coordinates, and they only mean that\n // under `fixed`. The two travel together or the bubble lands\n // somewhere arbitrary.\n position: 'fixed',\n left: position ? `${position.left}px` : '0px',\n top: position ? `${position.top}px` : '0px',\n // Hidden until measured, but still laid out — the measurement\n // needs a real offsetWidth, and `visibility` gives one where\n // `display: none` would not.\n visibility: position ? 'visible' : 'hidden',\n }}\n >\n <span className={styles.label}>{body}</span>\n {shortcut ? <kbd className={styles.shortcut}>{shortcut}</kbd> : null}\n </div>,\n document.body,\n )\n : null}\n </>\n );\n}\n","/**\n * routes/verse/resources/resources-store.ts — is the Resources drawer open,\n * and is it pinned (unit 3.11 C6).\n *\n * overlay ~360px over the surface; Esc, an outside click or ⌘. closes it,\n * focus is trapped inside and returned on close;\n * pinned a docked right column that shrinks the surface beside it.\n *\n * PERSISTED under its own key, one writer (this module), every access in a\n * try/catch: a private window without storage still runs the drawer. The\n * shell's `ashlr.verse.ui.v3` blob is not touched — its `resourcesOpen`\n * field belongs to an older panel and has one writer already.\n *\n * On load the drawer comes back open only when it was PINNED open: a docked\n * column is a layout preference, whereas an overlay restored on reload would\n * steal focus from whatever the operator came back to do.\n *\n * Kept tiny and framework-free apart from one hook: this file is imported by\n * the shell, so it is on the chat first-paint path.\n */\nimport { useSyncExternalStore } from 'react';\nimport type { ResourcesSummary } from './resources-model.js';\n\nexport const RESOURCES_STORAGE_KEY = 'ashlr.verse.resources.v1';\n\nexport interface ResourcesUiState {\n open: boolean;\n pinned: boolean;\n /** The always-on resource bar in the rail foot (3.11.1). On by default; persisted. */\n bar: boolean;\n /**\n * The handle's dot, written by the lazily loaded summary probe\n * (resources-summary.tsx). NOT persisted; null until the probe has read.\n */\n summary: ResourcesSummary | null;\n}\n\nfunction load(): ResourcesUiState {\n try {\n const raw = JSON.parse(localStorage.getItem(RESOURCES_STORAGE_KEY) ?? 'null') as Partial<ResourcesUiState> | null;\n const pinned = raw?.pinned === true;\n return { pinned, open: pinned && raw?.open === true, bar: raw?.bar !== false, summary: null };\n } catch {\n return { open: false, pinned: false, bar: true, summary: null };\n }\n}\n\nlet state: ResourcesUiState = load();\nconst listeners = new Set<() => void>();\n\nfunction patch(delta: Partial<ResourcesUiState>): void {\n const next = { ...state, ...delta };\n if (next.open === state.open && next.pinned === state.pinned && next.bar === state.bar && next.summary === state.summary) return;\n const persist = next.open !== state.open || next.pinned !== state.pinned || next.bar !== state.bar;\n state = next;\n if (persist) {\n try {\n localStorage.setItem(RESOURCES_STORAGE_KEY, JSON.stringify({ open: next.open, pinned: next.pinned, bar: next.bar }));\n } catch {\n /* best-effort */\n }\n }\n for (const l of [...listeners]) l();\n}\n\nexport function getResourcesUi(): ResourcesUiState {\n return state;\n}\n\nexport function openResources(): void {\n patch({ open: true });\n}\n\nexport function closeResources(): void {\n patch({ open: false });\n}\n\nexport function toggleResources(): void {\n patch({ open: !state.open });\n}\n\nexport function setResourcesPinned(pinned: boolean): void {\n patch({ pinned });\n}\n\n/** Show or hide the always-on resource bar in the rail foot. */\nexport function setResourcesBar(bar: boolean): void {\n patch({ bar });\n}\n\nexport function setResourcesSummary(summary: ResourcesSummary | null): void {\n const same = summary !== null && state.summary !== null && summary.tone === state.summary.tone && summary.spoken === state.summary.spoken;\n if (!same) patch({ summary });\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function useResourcesUi(): ResourcesUiState {\n return useSyncExternalStore(subscribe, getResourcesUi, getResourcesUi);\n}\n\n/** Test hygiene: re-read storage as a fresh page load would. */\nexport function reloadResourcesUiForTest(): void {\n state = load();\n for (const l of [...listeners]) l();\n}\n","/**\n * routes/verse/shell/anchor-requests.ts — the shell's one listener for\n * VERSE_ANCHOR_EVENT (\"go to that card\"); the reveal itself is\n * shell/reveal-anchor.ts.\n *\n * WHY SEPARATE: VerseApp installs this listener at first paint, but nothing\n * is revealed until an operator follows a link into a surface. The reveal\n * logic (and command/nav.ts with it) is preloaded instead of imported: its\n * download starts when this module evaluates, and once it is in a request\n * is revealed synchronously, exactly as with a static import. A request\n * that arrives before it lands is revealed when it does — the reveal waits\n * for its element for up to ANCHOR_WAIT_MS anyway.\n */\nimport type { VerseAnchorRequest } from '../verse-ui-store.js';\n\ntype RevealModule = typeof import('./reveal-anchor.js');\n\nlet loaded: RevealModule | null = null;\nlet pending: Promise<RevealModule> | null = null;\nfunction loadReveal(): Promise<RevealModule> {\n // A failed download is not cached: the next request asks again.\n pending ??= import('./reveal-anchor.js').then((m) => (loaded = m), (err: unknown) => { pending = null; throw err; });\n return pending;\n}\nif (typeof window !== 'undefined') void loadReveal().catch(() => undefined);\n\nfunction reveal(request: VerseAnchorRequest): void {\n if (loaded) {\n void loaded.revealAnchor(request);\n return;\n }\n void loadReveal().then((m) => m.revealAnchor(request), () => undefined);\n}\n\n/** The shell's one listener. Returns the unsubscribe. */\nexport function subscribeAnchorRequests(eventName: string): () => void {\n if (typeof window === 'undefined') return () => {};\n function onAnchor(event: Event): void {\n const detail = (event as CustomEvent<unknown>).detail;\n if (typeof detail !== 'object' || detail === null) return;\n const { section, anchor } = detail as Record<string, unknown>;\n if (typeof section !== 'string' || typeof anchor !== 'string' || anchor.length === 0 || anchor.length > 200) return;\n reveal({ section: section as VerseAnchorRequest['section'], anchor });\n }\n window.addEventListener(eventName, onAnchor);\n return () => window.removeEventListener(eventName, onAnchor);\n}\n","/**\n * routes/verse/shell/viewport.ts — the workbench's width classes (unit C0).\n *\n * ONE set of breakpoints for every 3.10 surface, so the dock, the drawer, the\n * surfaces and the composer footer all change shape at the same widths\n * (SPEC-310C §1–§5):\n *\n * compact < 480 the phone layout the 375 screenshots show: one column,\n * bottom sheets (dock at 75vh), the composer footer folds\n * its pickers into a sheet, charts render at width 375.\n * medium 480–1023 the dock and the Needs-you drawer become sheets over\n * the chat instead of columns beside it.\n * wide ≥ 1024 the full workbench: rail, sidebar, transcript, dock.\n *\n * Read through matchMedia — the browser's own answer, which is also what the\n * test support mocks — never by polling window size.\n */\nimport { useMemo, useSyncExternalStore } from 'react';\n\nexport const VIEWPORT_BREAKPOINTS = Object.freeze({\n /** Below this width: the compact (phone) layout. */\n compact: 480,\n /** At or above this width: the wide workbench (dock as a column). */\n wide: 1024,\n});\n\nexport type ViewportClass = 'compact' | 'medium' | 'wide';\n\n/**\n * The two queries every class derives from. `max-width` uses .98 so the\n * compact and medium ranges meet without overlapping at fractional widths\n * (the same convention Bootstrap and Tailwind use for zoomed displays).\n */\nexport const VIEWPORT_QUERIES = Object.freeze({\n compact: `(max-width: ${VIEWPORT_BREAKPOINTS.compact - 0.02}px)`,\n wide: `(min-width: ${VIEWPORT_BREAKPOINTS.wide}px)`,\n});\n\n/** The class a width falls in (pure; for layout math and tests). */\nexport function viewportClassFor(width: number): ViewportClass {\n if (width < VIEWPORT_BREAKPOINTS.compact) return 'compact';\n if (width < VIEWPORT_BREAKPOINTS.wide) return 'medium';\n return 'wide';\n}\n\nfunction currentClass(): ViewportClass {\n if (typeof window === 'undefined') return 'wide';\n if (typeof window.matchMedia === 'function') {\n if (window.matchMedia(VIEWPORT_QUERIES.compact).matches) return 'compact';\n return window.matchMedia(VIEWPORT_QUERIES.wide).matches ? 'wide' : 'medium';\n }\n // jsdom without a mock, and old webviews: the window's own width.\n return viewportClassFor(window.innerWidth || VIEWPORT_BREAKPOINTS.wide);\n}\n\nfunction subscribe(onChange: () => void): () => void {\n if (typeof window === 'undefined') return () => {};\n if (typeof window.matchMedia !== 'function') {\n window.addEventListener('resize', onChange);\n return () => window.removeEventListener('resize', onChange);\n }\n const lists = [window.matchMedia(VIEWPORT_QUERIES.compact), window.matchMedia(VIEWPORT_QUERIES.wide)];\n for (const list of lists) list.addEventListener('change', onChange);\n return () => {\n for (const list of lists) list.removeEventListener('change', onChange);\n };\n}\n\nexport interface ViewportState {\n viewport: ViewportClass;\n /** < 480: phone layout. */\n compact: boolean;\n /** ≥ 1024: the full workbench. */\n wide: boolean;\n}\n\n/** The current width class; re-renders only when the CLASS changes, not on every resize. */\nexport function useViewport(): ViewportState {\n const viewport = useSyncExternalStore(subscribe, currentClass, () => 'wide' as const);\n return useMemo(() => ({ viewport, compact: viewport === 'compact', wide: viewport === 'wide' }), [viewport]);\n}\n\n/** Non-hook read, for event handlers and effects. */\nexport function readViewport(): ViewportClass {\n return currentClass();\n}\n","/**\n * routes/verse/shell/dock-catalog.ts — the chat dock's panes, layout rules\n * and persisted state (unit C0; SPEC-310C §3; 3.16 workbench).\n *\n * The dock is the chat's PANEL AREA: tabs and splits beside the chat (or,\n * by the operator's choice, under it). Its panes come from the pane\n * registry (routes/verse/panes/) — first-party ones listed below, others\n * registered by their own units — so the container never imports a pane's\n * code. This file is what they all agree on: the first-party panes, how big\n * the panel may be, when it becomes a sheet, and the shape it persists.\n *\n * Pure data and pure functions — no React. On the chat's first-paint path:\n * keep it small.\n */\nimport type { CommandId } from './command-catalog.js';\nimport { VIEWPORT_BREAKPOINTS } from './viewport.js';\n\n/**\n * The FIRST-PARTY panes, in the order the dock's menus list them. This is\n * metadata only (no components): the pane REGISTRY (routes/verse/panes/)\n * turns each into a registered pane, and other units add or replace panes\n * there with `registerPane` — without touching this table or the dock.\n *\n * `slot` names the C0 slot a pane renders through when its body is another\n * unit's file; null = a component the workbench owns (panes/builtin-panes).\n */\nexport const DOCK_PANES = [\n { id: 'terminal', label: 'Terminal', owner: 'C4', commandId: 'dock.terminal', slot: 'terminal-pane' },\n { id: 'browser', label: 'Browser', owner: 'C4', commandId: 'dock.preview', slot: 'preview-pane' },\n { id: 'diff', label: 'Changes', owner: 'C5', commandId: 'dock.diff', slot: 'diff-pane' },\n { id: 'files', label: 'Files', owner: 'workbench', commandId: 'dock.files', slot: null },\n { id: 'sources', label: 'Sources', owner: 'workbench', commandId: 'dock.sources', slot: null },\n { id: 'reasoning', label: 'Reasoning', owner: 'workbench', commandId: 'dock.reasoning', slot: null },\n { id: 'tasks', label: 'Tasks', owner: 'C2', commandId: null, slot: null },\n { id: 'context', label: 'Context', owner: 'C2', commandId: null, slot: null },\n] as const satisfies readonly {\n id: string;\n label: string;\n owner: string;\n /** The catalog command that opens (and focuses) this pane; null = opened from its own affordance. */\n commandId: CommandId | null;\n /** Rendered through this slot when the pane is another unit's; null = the workbench's own component. */\n slot: 'terminal-pane' | 'preview-pane' | 'diff-pane' | null;\n}[];\n\n/** A first-party pane's id. */\nexport type BuiltinPaneId = (typeof DOCK_PANES)[number]['id'];\nexport const DOCK_PANE_IDS: readonly BuiltinPaneId[] = DOCK_PANES.map((p) => p.id);\n\n/**\n * Any pane's id — first-party or registered by another unit (panes/). Open\n * by design: persisted state may name a pane whose module registers after\n * the dock hydrates, so ids are validated by SHAPE here and by the registry\n * at render (an unregistered tab is simply not drawn, and comes back when\n * its pane does).\n */\nexport type DockPaneId = string;\n\n/** Lower-case letters, numbers and dashes, starting with a letter; at most 40 characters. */\nexport const PANE_ID_RE = /^[a-z][a-z0-9-]{0,39}$/;\n\n/**\n * Ids a pane used to have. A persisted layout written before the rename\n * still opens the same pane (\"preview\" became the Browser pane in 3.16).\n */\nexport const LEGACY_PANE_IDS: Readonly<Record<string, DockPaneId>> = Object.freeze({ preview: 'browser' });\n\n/** A persisted or requested id, with its legacy name resolved; null when it cannot be a pane id. */\nexport function normalizePaneId(value: unknown): DockPaneId | null {\n if (typeof value !== 'string') return null;\n const id = Object.prototype.hasOwnProperty.call(LEGACY_PANE_IDS, value) ? LEGACY_PANE_IDS[value]! : value;\n return PANE_ID_RE.test(id) ? id : null;\n}\n\nexport function isDockPaneId(value: unknown): value is DockPaneId {\n return typeof value === 'string' && PANE_ID_RE.test(value);\n}\n\n/**\n * Layout rules. Widths in CSS px, measured against the WINDOW, not the chat\n * column: \"resizable from 320px to 60% of the window\".\n */\nexport const DOCK_LAYOUT = Object.freeze({\n minWidth: 320,\n maxWidthFraction: 0.6,\n /** A new dock opens this wide (the 440 of the SPEC-310C shell sketch). */\n defaultWidth: 440,\n /** Below this window width the dock is a sheet over the chat, not a column. */\n sheetBelow: VIEWPORT_BREAKPOINTS.wide,\n /** Below this window width it is a bottom sheet… */\n bottomSheetBelow: VIEWPORT_BREAKPOINTS.compact,\n /** …this tall, in vh. */\n bottomSheetHeightVh: 75,\n /** The top pane's share of the height in a vertical split. */\n splitRatio: Object.freeze({ min: 0.2, max: 0.8, default: 0.5 }),\n /**\n * The BOTTOM panel (placement 'bottom', at 1024px and up): a row under\n * the transcript, like an editor's terminal panel. Heights in CSS px\n * against the chat column; the transcript keeps at least `minTranscript`.\n */\n minHeight: 160,\n defaultHeight: 300,\n maxHeightFraction: 0.7,\n minTranscript: 220,\n /** Chats whose panel layout is remembered (least recently opened forgotten first). */\n chatMemoryLimit: 40,\n});\n\n/** Where the operator wants the panel: beside the chat, or under it. */\nexport type DockPlacement = 'right' | 'bottom';\n\n/**\n * How the dock is drawn. `column` and `bottom` are the two docked\n * placements (the operator's choice); below 1024px the window decides —\n * a sheet over the chat, and on a phone a bottom sheet.\n */\nexport type DockPresentation = 'column' | 'bottom' | 'sheet' | 'bottom-sheet';\n\n/** How the dock is drawn at a given window width (and, when there is room, placement). */\nexport function dockPresentation(windowWidth: number, placement: DockPlacement = 'right'): DockPresentation {\n if (windowWidth < DOCK_LAYOUT.bottomSheetBelow) return 'bottom-sheet';\n if (windowWidth < DOCK_LAYOUT.sheetBelow) return 'sheet';\n return placement === 'bottom' ? 'bottom' : 'column';\n}\n\n/**\n * A persisted or dragged width clamped for this window. The floor wins over\n * the 60% cap on a window too narrow to honour both (it is a sheet there\n * anyway), so the result is never below minWidth.\n */\nexport function clampDockWidth(width: unknown, windowWidth: number): number {\n const n = typeof width === 'number' && Number.isFinite(width) ? Math.round(width) : DOCK_LAYOUT.defaultWidth;\n const max = Math.max(DOCK_LAYOUT.minWidth, Math.floor(windowWidth * DOCK_LAYOUT.maxWidthFraction));\n return Math.min(max, Math.max(DOCK_LAYOUT.minWidth, n));\n}\n\n/**\n * The bottom panel's height in a chat column `columnHeight` tall: at least\n * minHeight, at most 70% of the column, and never so tall that the\n * transcript drops under minTranscript. The floor wins on a column too short\n * for every rule; an unmeasured column (0) only applies the floor.\n */\nexport function clampDockHeight(height: unknown, columnHeight: number): number {\n const n = typeof height === 'number' && Number.isFinite(height) ? Math.round(height) : DOCK_LAYOUT.defaultHeight;\n if (!(columnHeight > 0)) return Math.max(DOCK_LAYOUT.minHeight, n);\n const max = Math.max(\n DOCK_LAYOUT.minHeight,\n Math.min(Math.floor(columnHeight * DOCK_LAYOUT.maxHeightFraction), Math.floor(columnHeight - DOCK_LAYOUT.minTranscript)),\n );\n return Math.min(max, Math.max(DOCK_LAYOUT.minHeight, n));\n}\n\n// ---------------------------------------------------------------------------\n// Persisted state\n// ---------------------------------------------------------------------------\n\n/** The v2 key C1 migrates FROM (verse-ui-store.ts). */\nexport const VERSE_UI_STORAGE_KEY_V2 = 'ashlr.verse.ui.v2';\n/**\n * The v3 key (SPEC-310C §3 \"State persists in ashlr.verse.ui.v3\"). ONE blob,\n * written by C1's verse-ui-store; the dock's state is its `dock` field, read\n * back through sanitizeDockState — so two writers never race for the key.\n */\nexport const VERSE_UI_STORAGE_KEY = 'ashlr.verse.ui.v3';\n\n/** What the panel shows — the part remembered PER CHAT. */\nexport interface DockLayout {\n open: boolean;\n /** Open panes, in tab order. */\n tabs: DockPaneId[];\n /** The pane shown (on top, when split); null only when there are no tabs. */\n active: DockPaneId | null;\n /** A second pane shown BELOW `active` (\"Preview over Terminal\"); never equal to it. */\n splitWith: DockPaneId | null;\n}\n\nexport interface DockState extends DockLayout {\n /** Last dragged width; clamp with clampDockWidth at render (it depends on the window). */\n width: number;\n /** `active`'s share of the height when split. */\n splitRatio: number;\n /** Beside the chat or under it (1024px and up; a window-level preference, not per chat). */\n placement: DockPlacement;\n /** The bottom panel's last dragged height; clamp with clampDockHeight at render. */\n height: number;\n /**\n * Each chat's own layout, by session id, least recently left first — so a\n * terminal-heavy chat reopens with its terminal and a reading chat with\n * nothing. The OPEN chat's layout is the top-level fields; this holds the\n * others. Capped at DOCK_LAYOUT.chatMemoryLimit.\n */\n byChat: Readonly<Record<string, DockLayout>>;\n}\n\nexport const DEFAULT_DOCK_STATE: Readonly<DockState> = Object.freeze({\n open: false,\n width: DOCK_LAYOUT.defaultWidth,\n tabs: [],\n active: null,\n splitWith: null,\n splitRatio: DOCK_LAYOUT.splitRatio.default,\n placement: 'right',\n height: DOCK_LAYOUT.defaultHeight,\n byChat: Object.freeze({}),\n});\n\n/** Session ids as the engine writes them (the same shape `open-session:<id>` accepts). */\nconst SESSION_ID_RE = /^[A-Za-z0-9._-]{1,128}$/;\n\n/** A layout read without trusting it (the per-chat part of sanitizeDockState). */\nexport function sanitizeDockLayout(value: unknown): DockLayout {\n const raw = value !== null && typeof value === 'object' && !Array.isArray(value) ? (value as Record<string, unknown>) : {};\n const tabs: DockPaneId[] = [];\n if (Array.isArray(raw['tabs'])) {\n for (const tab of raw['tabs']) {\n const id = normalizePaneId(tab);\n if (id !== null && !tabs.includes(id)) tabs.push(id);\n }\n }\n const wantActive = normalizePaneId(raw['active']);\n const active: DockPaneId | null = wantActive !== null && tabs.includes(wantActive) ? wantActive : (tabs[0] ?? null);\n const wantSplit = normalizePaneId(raw['splitWith']);\n const splitWith: DockPaneId | null = wantSplit !== null && tabs.includes(wantSplit) && wantSplit !== active ? wantSplit : null;\n return { open: raw['open'] === true && tabs.length > 0, tabs, active, splitWith };\n}\n\n/**\n * Read a persisted `dock` field without trusting it: ids that cannot be a\n * pane dropped (legacy names renamed), duplicates collapsed,\n * `active`/`splitWith` forced to open tabs, numbers clamped, the per-chat\n * memory capped. Anything unreadable falls back to the default, never throws\n * — a hand-edited or future-version blob must not take the chat down.\n */\nexport function sanitizeDockState(value: unknown): DockState {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return { ...DEFAULT_DOCK_STATE, tabs: [], byChat: {} };\n const raw = value as Record<string, unknown>;\n const layout = sanitizeDockLayout(raw);\n const width = typeof raw['width'] === 'number' && Number.isFinite(raw['width']) && raw['width'] >= DOCK_LAYOUT.minWidth\n ? Math.round(raw['width'])\n : DOCK_LAYOUT.defaultWidth;\n const height = typeof raw['height'] === 'number' && Number.isFinite(raw['height']) && raw['height'] >= DOCK_LAYOUT.minHeight\n ? Math.round(raw['height'])\n : DOCK_LAYOUT.defaultHeight;\n const ratio = typeof raw['splitRatio'] === 'number' && Number.isFinite(raw['splitRatio']) ? raw['splitRatio'] : DOCK_LAYOUT.splitRatio.default;\n const byChat: Record<string, DockLayout> = {};\n const rawByChat = raw['byChat'];\n if (rawByChat !== null && typeof rawByChat === 'object' && !Array.isArray(rawByChat)) {\n const entries = Object.entries(rawByChat as Record<string, unknown>).filter(([id]) => SESSION_ID_RE.test(id));\n for (const [id, saved] of entries.slice(-DOCK_LAYOUT.chatMemoryLimit)) byChat[id] = sanitizeDockLayout(saved);\n }\n return {\n ...layout,\n width,\n splitRatio: Math.min(DOCK_LAYOUT.splitRatio.max, Math.max(DOCK_LAYOUT.splitRatio.min, ratio)),\n placement: raw['placement'] === 'bottom' ? 'bottom' : 'right',\n height,\n byChat,\n };\n}\n","/**\n * routes/verse/dock/dock-store.ts — the chat dock's state and the one-shot\n * requests aimed at its panes (unit C2; contract: shell/dock-catalog.ts).\n *\n * PERSISTENCE. The dock's state belongs in `ashlr.verse.ui.v3`'s `dock`\n * field, and that blob has ONE writer — C1's verse-ui-store — so two stores\n * never race for the key (dock-catalog.ts). This store therefore never\n * writes the key. It:\n * - hydrates itself, read-only, from the v3 blob's `dock` field on first\n * read (through sanitizeDockState — a hand-edited blob cannot break the\n * chat);\n * - exposes getDockState / subscribeDockState, which C1's store folds into\n * the blob it writes (`dock: getDockState()`, re-written on change);\n * - accepts hydrateDockState(raw) when C1 prefers to push the field in.\n *\n * REQUESTS. \"Run in terminal\", a ± count opening the branch diff, Preview's\n * dev-server Start: each is a one-shot request with a nonce (slots.tsx\n * contracts) — the same request twice is two opens. They live here, not in\n * React state, because they are raised from deep inside the transcript\n * (CommandOutput) and consumed by a pane in another subtree.\n *\n * Framework-free; the React glue is useDock() at the bottom.\n */\nimport { useSyncExternalStore } from 'react';\nimport {\n DOCK_LAYOUT,\n VERSE_UI_STORAGE_KEY,\n normalizePaneId,\n sanitizeDockState,\n type DockLayout,\n type DockPaneId,\n type DockPlacement,\n type DockState,\n} from '../shell/dock-catalog.js';\nimport type { DiffPaneRequest, PreviewOpenRequest, TerminalOpenRequest } from '../shell/slots.js';\n\n/**\n * A terminal request as the dock carries it. C0's TerminalOpenRequest now\n * names the Apps [Launch ▸] fields (`via`, `model`) itself, so this is a\n * plain alias — kept so TerminalPane and the Apps launcher keep one name for\n * \"what the dock hands the Terminal pane\". The server resolves the actual\n * command either way, never the page.\n */\nexport type TerminalRequest = TerminalOpenRequest;\n\nexport interface DockRequests {\n terminal: TerminalRequest | null;\n preview: PreviewOpenRequest | null;\n diff: (DiffPaneRequest & { nonce: number }) | null;\n}\n\nexport interface DockSnapshot {\n state: DockState;\n requests: DockRequests;\n}\n\nconst NO_REQUESTS: DockRequests = { terminal: null, preview: null, diff: null };\n\nlet snapshot: DockSnapshot | null = null;\nlet nonce = 0;\nconst listeners = new Set<() => void>();\n\nfunction readPersisted(): DockState {\n try {\n const raw = localStorage.getItem(VERSE_UI_STORAGE_KEY);\n if (!raw) return sanitizeDockState(null);\n const parsed = JSON.parse(raw) as { dock?: unknown } | null;\n return sanitizeDockState(parsed && typeof parsed === 'object' ? parsed.dock : null);\n } catch {\n return sanitizeDockState(null);\n }\n}\n\nfunction current(): DockSnapshot {\n if (snapshot === null) snapshot = { state: readPersisted(), requests: NO_REQUESTS };\n return snapshot;\n}\n\nfunction emit(next: DockSnapshot): void {\n snapshot = next;\n for (const listener of [...listeners]) listener();\n}\n\nfunction setState(next: DockState): void {\n emit({ ...current(), state: next });\n}\n\nexport function subscribeDockState(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function getDockSnapshot(): DockSnapshot {\n return current();\n}\n\n/** The persistable part — what C1's store writes as the v3 blob's `dock` field. */\nexport function getDockState(): DockState {\n return current().state;\n}\n\n/** C1 may push the persisted field in (on load, or when another tab wrote it). */\nexport function hydrateDockState(raw: unknown): void {\n setState(sanitizeDockState(raw));\n}\n\n/** Test seam: back to defaults with no requests; next read re-hydrates from storage. */\nexport function resetDockStore(): void {\n snapshot = null;\n nonce = 0;\n activeChat = undefined;\n pendingPane = null;\n for (const listener of [...listeners]) listener();\n}\n\n// ---------------------------------------------------------------------------\n// Transitions (pure over DockState, exported for tests)\n// ---------------------------------------------------------------------------\n\n/** Open `pane` (adding its tab) and make it the visible one. A legacy id opens the pane it became. */\nexport function withPaneOpen(state: DockState, requested: DockPaneId): DockState {\n const pane = normalizePaneId(requested);\n if (pane === null) return state;\n const tabs = state.tabs.includes(pane) ? state.tabs : [...state.tabs, pane];\n // Opening the pane that is the split's lower half swaps it to the top.\n const splitWith = state.splitWith === pane ? (state.active !== pane ? state.active : null) : state.splitWith;\n return { ...state, open: true, tabs, active: pane, splitWith: splitWith === pane ? null : splitWith };\n}\n\n/** The pane's toggle: open & focus it, or — when it is already the visible pane — close the dock. */\nexport function withPaneToggled(state: DockState, requested: DockPaneId): DockState {\n const pane = normalizePaneId(requested);\n if (pane === null) return state;\n if (state.open && (state.active === pane || state.splitWith === pane)) return { ...state, open: false };\n return withPaneOpen(state, pane);\n}\n\nexport function withTabClosed(state: DockState, pane: DockPaneId): DockState {\n const tabs = state.tabs.filter((t) => t !== pane);\n const splitWith = state.splitWith === pane ? null : state.splitWith;\n let active = state.active;\n if (active === pane) {\n // The split's lower pane moves up; otherwise the neighbour tab takes over.\n const index = state.tabs.indexOf(pane);\n active = splitWith ?? tabs[Math.min(index, tabs.length - 1)] ?? null;\n }\n return {\n ...state,\n tabs,\n active,\n splitWith: splitWith === active ? null : splitWith,\n open: tabs.length > 0 && state.open,\n };\n}\n\n/** Split `pane` BELOW the active one (\"Preview over Terminal\"); null un-splits. */\nexport function withSplit(state: DockState, pane: DockPaneId | null): DockState {\n if (pane === null) return { ...state, splitWith: null };\n if (state.active === null || pane === state.active) return state;\n const tabs = state.tabs.includes(pane) ? state.tabs : [...state.tabs, pane];\n return { ...state, open: true, tabs, splitWith: pane };\n}\n\nexport function withWidth(state: DockState, width: number): DockState {\n if (!Number.isFinite(width)) return state;\n return { ...state, width: Math.max(DOCK_LAYOUT.minWidth, Math.round(width)) };\n}\n\nexport function withSplitRatio(state: DockState, ratio: number): DockState {\n if (!Number.isFinite(ratio)) return state;\n const { min, max } = DOCK_LAYOUT.splitRatio;\n return { ...state, splitRatio: Math.min(max, Math.max(min, ratio)) };\n}\n\nexport function withHeight(state: DockState, height: number): DockState {\n if (!Number.isFinite(height)) return state;\n return { ...state, height: Math.max(DOCK_LAYOUT.minHeight, Math.round(height)) };\n}\n\nexport function withPlacement(state: DockState, placement: DockPlacement): DockState {\n return state.placement === placement ? state : { ...state, placement };\n}\n\nconst layoutOf = (state: DockLayout): DockLayout => ({ open: state.open, tabs: state.tabs, active: state.active, splitWith: state.splitWith });\n\n/**\n * Leaving chat `from` for chat `to`: `from`'s layout is remembered (as the\n * most recent), and `to`'s comes back — or, for a chat never opened with a\n * panel, the current layout carries over (a new chat starts the way you\n * were working). The open chat's layout always lives in the top-level\n * fields; `byChat` holds the others, capped at DOCK_LAYOUT.chatMemoryLimit.\n */\nexport function withChatSwitch(state: DockState, from: string | null, to: string | null): DockState {\n if (from === to) return state;\n const byChat: Record<string, DockLayout> = { ...state.byChat };\n if (from !== null) {\n delete byChat[from];\n byChat[from] = layoutOf(state);\n }\n let next = layoutOf(state);\n if (to !== null && byChat[to]) {\n next = byChat[to]!;\n delete byChat[to];\n }\n const ids = Object.keys(byChat);\n for (const id of ids.slice(0, Math.max(0, ids.length - DOCK_LAYOUT.chatMemoryLimit))) delete byChat[id];\n return { ...state, ...next, byChat };\n}\n\n// ---------------------------------------------------------------------------\n// Actions\n// ---------------------------------------------------------------------------\n\nexport function openDockPane(pane: DockPaneId): void {\n setState(withPaneOpen(current().state, pane));\n}\n\nexport function toggleDockPane(pane: DockPaneId): void {\n setState(withPaneToggled(current().state, pane));\n}\n\n/** ⌘\\ — show or hide the dock as it was; an empty dock opens on Tasks. */\nexport function toggleDock(): void {\n const state = current().state;\n if (state.open) setState({ ...state, open: false });\n else if (state.tabs.length === 0) setState(withPaneOpen(state, 'tasks'));\n else setState({ ...state, open: true, active: state.active ?? state.tabs[0]! });\n}\n\nexport function closeDock(): void {\n const state = current().state;\n if (state.open) setState({ ...state, open: false });\n}\n\nexport function closeDockTab(pane: DockPaneId): void {\n setState(withTabClosed(current().state, pane));\n}\n\nexport function splitDock(pane: DockPaneId | null): void {\n setState(withSplit(current().state, pane));\n}\n\nexport function setDockWidth(width: number): void {\n setState(withWidth(current().state, width));\n}\n\nexport function setDockSplitRatio(ratio: number): void {\n setState(withSplitRatio(current().state, ratio));\n}\n\nexport function setDockHeight(height: number): void {\n setState(withHeight(current().state, height));\n}\n\nexport function setDockPlacement(placement: DockPlacement): void {\n setState(withPlacement(current().state, placement));\n}\n\n/** Beside the chat ⇄ under it. */\nexport function toggleDockPlacement(): void {\n const state = current().state;\n setState(withPlacement(state, state.placement === 'right' ? 'bottom' : 'right'));\n}\n\n/**\n * The chat whose layout the panel shows. undefined = not told yet: the FIRST\n * call (the chat surface mounting on the chat that was open at reload)\n * adopts the persisted layout as that chat's instead of swapping.\n */\nlet activeChat: string | null | undefined;\n\n/**\n * A pane to open once chat `sessionId` is the open one (a deep link, a\n * notification): opening it BEFORE the switch would file it under the chat\n * being left, since the switch swaps layouts.\n */\nlet pendingPane: { sessionId: string; paneId: DockPaneId } | null = null;\n\n/** The chat surface calls this whenever the open chat changes (and once on mount). */\nexport function activateDockChat(sessionId: string | null): void {\n if (activeChat !== undefined && activeChat !== sessionId) {\n const from = activeChat;\n activeChat = sessionId;\n setState(withChatSwitch(current().state, from, sessionId));\n } else {\n activeChat = sessionId;\n }\n if (pendingPane && pendingPane.sessionId === sessionId) {\n const { paneId } = pendingPane;\n pendingPane = null;\n openDockPane(paneId);\n }\n}\n\n/**\n * Open `paneId` in chat `sessionId` — now, when that chat is already open\n * (or none is named), else as soon as the chat surface switches to it.\n */\nexport function openPaneInChat(paneId: DockPaneId, sessionId: string | null = null): void {\n if (sessionId === null || sessionId === activeChat) {\n pendingPane = null;\n openDockPane(paneId);\n return;\n }\n pendingPane = { sessionId, paneId };\n}\n\n/** Open the Terminal pane with a request (a tab at a root, a pasted command, an app launch). */\nexport function requestTerminal(request: Omit<TerminalRequest, 'nonce'>): void {\n nonce += 1;\n const snap = current();\n emit({ state: withPaneOpen(snap.state, 'terminal'), requests: { ...snap.requests, terminal: { ...request, nonce } } });\n}\n\n/**\n * The same request, but with Terminal as the LOWER half of a split under the\n * pane that is showing (Preview's dev-server Start: the page stays on top and\n * appears when its port answers, the server's output runs underneath — the\n * \"Preview over Terminal\" layout). With nothing showing, or when Terminal is\n * the pane on top, it is a plain open. In the bottom sheet the split's lower\n * pane is mounted but hidden, so the request still runs.\n */\nexport function requestTerminalBelow(request: Omit<TerminalRequest, 'nonce'>): void {\n const snap = current();\n const top = snap.state.open ? snap.state.active : null;\n if (top === null || top === 'terminal') {\n requestTerminal(request);\n return;\n }\n nonce += 1;\n emit({ state: withSplit(snap.state, 'terminal'), requests: { ...snap.requests, terminal: { ...request, nonce } } });\n}\n\nexport function requestPreview(request: Omit<PreviewOpenRequest, 'nonce'>): void {\n nonce += 1;\n const snap = current();\n emit({ state: withPaneOpen(snap.state, 'browser'), requests: { ...snap.requests, preview: { ...request, nonce } } });\n}\n\nexport function requestDiff(request: DiffPaneRequest): void {\n nonce += 1;\n const snap = current();\n emit({ state: withPaneOpen(snap.state, 'diff'), requests: { ...snap.requests, diff: { ...request, nonce } } });\n}\n\n/**\n * Requests are per chat: switching chats must not replay the last chat's\n * terminal paste. Callers clear on a SWITCH only — never on the Chat\n * section's first mount, which is exactly when an Apps [Launch ▸] (raised on\n * another surface, then `setVerseSection('chat')`) is waiting to be served.\n */\nexport function clearDockRequests(): void {\n const snap = current();\n if (snap.requests === NO_REQUESTS) return;\n emit({ ...snap, requests: NO_REQUESTS });\n}\n\nexport function useDock(): DockSnapshot {\n return useSyncExternalStore(subscribeDockState, getDockSnapshot, getDockSnapshot);\n}\n\n/**\n * One primitive derived from the dock's state, re-rendering only when THAT\n * value changes — so the chat surface does not re-render while the split\n * boundary is dragged, or when a request is raised.\n */\nexport function useDockValue<T extends string | number | boolean | null>(select: (state: DockState) => T): T {\n const read = () => select(current().state);\n return useSyncExternalStore(subscribeDockState, read, read);\n}\n","/**\n * routes/verse/shell/nav-history.ts — ⌘[ / ⌘] through surfaces AND chats\n * (unit C1; SPEC-310C §1 \"Keep-alive\").\n *\n * One linear history, like a browser's: visiting a place after going back\n * drops the forward entries. A chat is a place of its own — Chat ▸ A and\n * Chat ▸ B are two entries — so \"back\" after jumping from one chat to another\n * returns to the first chat, not to whatever surface was before Chat.\n *\n * Pure: the ui store holds the value and decides when to push.\n */\nimport type { WorkbenchSectionId } from '../../../../core/verse/workbench-types.js';\n\nexport interface NavEntry {\n section: WorkbenchSectionId;\n /** The chat open at the time; only meaningful when `section` is chat. */\n sessionId: string | null;\n}\n\nexport interface NavHistory {\n entries: readonly NavEntry[];\n /** Index of the current entry; -1 only for an empty history. */\n index: number;\n}\n\n/** Bounded: a long day of switching must not grow without limit. */\nexport const NAV_HISTORY_LIMIT = 50;\n\nexport const EMPTY_NAV_HISTORY: NavHistory = Object.freeze({ entries: Object.freeze([]) as readonly NavEntry[], index: -1 });\n\nfunction sameEntry(a: NavEntry | undefined, b: NavEntry): boolean {\n return !!a && a.section === b.section && (a.section !== 'chat' || a.sessionId === b.sessionId);\n}\n\n/** Visit `entry`: drop the forward stack, skip a no-op repeat, cap the length. */\nexport function pushNav(history: NavHistory, entry: NavEntry): NavHistory {\n const normalised: NavEntry = { section: entry.section, sessionId: entry.section === 'chat' ? entry.sessionId : null };\n const current = history.entries[history.index];\n if (sameEntry(current, normalised)) return history;\n // \"Chat, no chat open yet\" followed by the chat that then opened is ONE\n // visit: refine the entry in place (dropping any forward stack) rather\n // than leaving a back-stop that shows an empty chat.\n if (current && current.section === 'chat' && current.sessionId === null && normalised.section === 'chat') {\n const entries = [...history.entries.slice(0, history.index), normalised];\n return { entries, index: entries.length - 1 };\n }\n const kept = history.entries.slice(0, history.index + 1);\n const entries = [...kept, normalised].slice(-NAV_HISTORY_LIMIT);\n return { entries, index: entries.length - 1 };\n}\n\nexport function canGoBack(history: NavHistory): boolean {\n return history.index > 0;\n}\n\nexport function canGoForward(history: NavHistory): boolean {\n return history.index >= 0 && history.index < history.entries.length - 1;\n}\n\n/** Step `delta` (−1 back, +1 forward). Null when there is nowhere to go. */\nexport function stepNav(history: NavHistory, delta: -1 | 1): { history: NavHistory; entry: NavEntry } | null {\n const index = history.index + delta;\n const entry = history.entries[index];\n if (!entry) return null;\n return { history: { entries: history.entries, index }, entry };\n}\n\n/**\n * ⌃Tab through recent chats: the most-recently-used list, current chat first.\n * Consecutive presses inside `windowMs` keep walking the SAME snapshot of\n * the list (the Alt-Tab rule), so ⌃Tab ⌃Tab reaches the third-most-recent\n * chat instead of bouncing between two.\n */\nexport interface RecentCycle {\n order: readonly string[];\n position: number;\n at: number;\n}\n\nexport const RECENT_CYCLE_WINDOW_MS = 1_500;\nexport const RECENT_CHATS_LIMIT = 10;\n\nexport function cycleRecent(\n recent: readonly string[],\n cycle: RecentCycle | null,\n direction: 1 | -1,\n now: number,\n windowMs: number = RECENT_CYCLE_WINDOW_MS,\n): { sessionId: string; cycle: RecentCycle } | null {\n const fresh = !cycle || now - cycle.at > windowMs;\n const order = fresh ? recent : cycle!.order;\n if (order.length < 2) return null;\n const from = fresh ? 0 : cycle!.position;\n const position = (from + direction + order.length) % order.length;\n return { sessionId: order[position]!, cycle: { order, position, at: now } };\n}\n\n/** Move `sessionId` to the front of the MRU list. */\nexport function touchRecent(recent: readonly string[], sessionId: string, limit: number = RECENT_CHATS_LIMIT): string[] {\n return [sessionId, ...recent.filter((id) => id !== sessionId)].slice(0, limit);\n}\n","/**\n * routes/verse/shell/section-modules.ts — every `sections/*Section.tsx` that\n * exists at build time, lazily (unit C1).\n *\n * The rail's surfaces are written by other owners and land at different\n * times (C7's Command/Fleet/Growth/Mind, C6's Apps). A glob yields real\n * per-section code splitting for a module that is present and a missing KEY\n * — not an unresolved import — for one that is not, so the shell builds and\n * runs at every stage of the landing.\n *\n * Lives here rather than in VerseApp.tsx so the framework-free ui store can\n * ask \"has Command landed?\" (for the first-launch-of-the-day rule) without\n * importing the shell component. Keys are re-based to `./sections/<Module>.tsx`\n * — relative to routes/verse, the form VerseApp and VerseConsoleApp's\n * first-paint preload have always used.\n *\n * THE COST OF A GLOB, paid once: a finished section outside `sections/` is\n * invisible, with nothing failing to say so (MCP shipped that way for a\n * release). VerseApp.test.tsx walks this map for every VERSE_SECTIONS entry.\n */\ntype Importer = () => Promise<unknown>;\n\nconst RAW: Record<string, Importer> = import.meta.glob('../sections/*Section.tsx');\n\nexport const SECTION_MODULES: Record<string, Importer> = Object.fromEntries(\n Object.entries(RAW).map(([key, load]) => [key.replace(/^\\.\\.\\//, './'), load]),\n);\n\n/** The importer for one module name (`ChatSection`), or undefined when it has not landed. */\nexport function sectionImporter(module: string, modules: Record<string, Importer> = SECTION_MODULES): Importer | undefined {\n return modules[`./sections/${module}.tsx`];\n}\n","/**\n * routes/verse/verse-ui-store.ts — the workbench shell's own state (unit C1):\n * which surface is on screen and which stay mounted behind it, the overlays\n * (⌘K palette, ⌘J Needs you, ⌘/ shortcuts), back/forward history, recent\n * chats, and the layout preferences the chat reads. Framework-free (one\n * `useSyncExternalStore` hook in useVerseUi.ts), same split as verse-store.ts.\n *\n * PERSISTED under `ashlr.verse.ui.v3` — ONE blob with ONE writer (this\n * module). The dock's state is its `dock` field, owned by C2's dock-store and\n * folded in here on every change (dock-catalog.ts: two writers must never\n * race for the key).\n *\n * v2 → v3 MIGRATION (SPEC-310C §0.1). 3.10 renumbered the rail: ⌘1 Command …\n * ⌘5 Chat, with Settings / Apps / Usage in the gear tray. A saved v2 section\n * migrates through workbench-types `migrateSectionId`: autonomy → fleet,\n * approvals → Command WITH the Needs-you drawer open, mcp → apps. The v2 key\n * is left in place (a downgrade still finds its own state) and is never read\n * again once v3 exists.\n *\n * LAUNCH RULE. Return to the saved surface on every launch; a fresh install\n * starts in Chat. Opening a new day must not take someone out of their chat.\n *\n * NOT PERSISTED, on purpose: the overlays, `command` (a one-shot hand-off to\n * the chat), history, the keep-alive list and `activeSessionId` — all\n * evidence about this page's life, not preferences.\n *\n * NOT HERE: appearance (theme, accent, density — data/appearance-store.ts owns\n * <html>), the reasoning display (chat/reasoning-pref.ts, C2), chat panel\n * widths (chat-panel-sizing.ts, C2), and the desktop preferences (system-wide\n * hotkey, notifications) — the desktop app stores those itself\n * (desktop_prefs.rs) and reports what actually took effect (a chord another\n * app holds comes back unregistered), so a copy here could only disagree\n * with it. Settings ▸ Desktop reads app/desktop-shell.ts useDesktopState().\n */\nimport {\n migrateSectionId,\n NEEDS_YOU_CATEGORIES,\n type NeedsYouCategory,\n type WorkbenchSectionId,\n} from '../../../core/verse/workbench-types.js';\nimport { getDockState, subscribeDockState } from './dock/dock-store.js';\nimport { VERSE_UI_STORAGE_KEY as V3_KEY, VERSE_UI_STORAGE_KEY_V2 as V2_KEY } from './shell/dock-catalog.js';\nimport {\n cycleRecent,\n pushNav,\n stepNav,\n touchRecent,\n RECENT_CHATS_LIMIT,\n type NavHistory,\n type RecentCycle,\n} from './shell/nav-history.js';\nimport { sectionImporter } from './shell/section-modules.js';\n\n// ===========================================================================\n// Sections\n// ===========================================================================\n\nexport type VerseSectionId = WorkbenchSectionId;\n\nexport interface VerseSectionEntry {\n id: VerseSectionId;\n label: string;\n /** The file `sections/<module>.tsx` the shell mounts (and first paint preloads). */\n module: string;\n /**\n * Modules to mount while `module` has not landed: Fleet shows the legacy\n * Autonomy panels until C7's FleetSection arrives. Never a guess at a\n * different surface. (Apps no longer falls back to MCP: C6's AppsSection\n * folds MCP in, and a stale MCP page under the \"Apps & Accounts\" name would\n * hide the seats and agents the operator went there for.)\n */\n fallbackModules?: readonly string[];\n /** Rail (⌘1–⌘5) or gear tray. */\n placement: 'rail' | 'tray';\n}\n\n/**\n * Rail order IS the ⌘1–⌘5 order (SPEC-310B §6); tray entries follow. A\n * section missing from this list is unreachable however complete it is.\n */\nexport const VERSE_SECTIONS: readonly VerseSectionEntry[] = [\n { id: 'command', label: 'Command', module: 'CommandSection', placement: 'rail' },\n { id: 'fleet', label: 'Fleet', module: 'FleetSection', fallbackModules: ['AutonomySection'], placement: 'rail' },\n { id: 'growth', label: 'Growth', module: 'GrowthSection', placement: 'rail' },\n { id: 'mind', label: 'Mind', module: 'MindSection', placement: 'rail' },\n { id: 'chat', label: 'Chat', module: 'ChatSection', placement: 'rail' },\n { id: 'agents', label: 'Agents', module: 'AgentsSection', placement: 'rail' },\n { id: 'settings', label: 'Settings', module: 'SettingsSection', placement: 'tray' },\n { id: 'apps', label: 'Apps & Accounts', module: 'AppsSection', placement: 'tray' },\n { id: 'usage', label: 'Usage', module: 'UsageSection', placement: 'tray' },\n { id: 'wiki', label: 'Repo wiki', module: 'WikiSection', placement: 'tray' },\n { id: 'playbooks', label: 'Playbooks', module: 'PlaybooksSection', placement: 'tray' },\n { id: 'automations', label: 'Automations', module: 'AutomationsSection', placement: 'tray' },\n];\n\nexport const RAIL_SECTIONS: readonly VerseSectionEntry[] = VERSE_SECTIONS.filter((s) => s.placement === 'rail');\nexport const TRAY_SECTIONS: readonly VerseSectionEntry[] = VERSE_SECTIONS.filter((s) => s.placement === 'tray');\n\nconst SECTION_IDS = new Set<string>(VERSE_SECTIONS.map((s) => s.id));\n\nexport function sectionEntry(id: VerseSectionId): VerseSectionEntry {\n return VERSE_SECTIONS.find((s) => s.id === id)!;\n}\n\n/** The module that will actually mount for `id` (primary first, then fallbacks); null when none landed. */\nexport function landedModule(id: VerseSectionId, landed: (module: string) => boolean = (m) => sectionImporter(m) !== undefined): string | null {\n const entry = sectionEntry(id);\n for (const module of [entry.module, ...(entry.fallbackModules ?? [])]) if (landed(module)) return module;\n return null;\n}\n\n// ===========================================================================\n// State\n// ===========================================================================\n\n/**\n * One-shot shell → chat requests. The chat surface is lazily mounted and takes\n * no props, so the shell raises a command here and the chat consumes it by\n * nonce, then clears it.\n * new-chat ⌘N / \"New chat on…\" — optional seat or project prefill\n * quick-switcher (pre-3.10; kept until C2 retires QuickSwitcher)\n * open-session the palette, the drawer, ⌘[ ⌘], ⌃Tab, a notification\n * focus-composer the system-wide hotkey (⌃⌥Space)\n */\nexport type VerseCommandName = 'new-chat' | 'quick-switcher' | 'open-session' | 'focus-composer';\n\nexport interface VerseCommand {\n name: VerseCommandName;\n /** Monotonic; a section reacts when it sees a nonce it has not handled. */\n nonce: number;\n sessionId?: string;\n seatId?: string;\n projectPath?: string;\n}\n\nexport type VerseCommandArgs = Pick<VerseCommand, 'sessionId' | 'seatId' | 'projectPath'>;\n\nexport type VerseOverlay = 'palette' | 'needs-you' | 'shortcuts' | null;\nexport type NeedsYouSplit = 'all' | NeedsYouCategory;\nexport const NEEDS_YOU_SPLITS: readonly NeedsYouSplit[] = ['all', ...NEEDS_YOU_CATEGORIES];\n\nexport interface VerseUiState {\n section: VerseSectionId;\n /** Rail shows labels beside its icons (⌘⇧\\). Defaults collapsed: the 56px rail is shipped muscle memory. */\n railExpanded: boolean;\n sidebarWidth: number;\n sidebarCollapsed: boolean;\n resourcesOpen: boolean;\n resourcesWidth: number;\n /** The last this-many palette actions run (empty query shows them). */\n recentActions: readonly string[];\n /** Most-recently-used chats, current first (⌃Tab). */\n recentChats: readonly string[];\n // ── not persisted ──\n /** Surfaces kept mounted (hidden + inert) behind the current one, most recent first. */\n mounted: readonly VerseSectionId[];\n overlay: VerseOverlay;\n needsYouSplit: NeedsYouSplit;\n /** An item the drawer should select when it opens (from the palette or a notification). */\n needsYouFocus: string | null;\n history: NavHistory;\n /** The chat open in the Chat surface, as reported by the chat (or by the shell when it opened one). */\n activeSessionId: string | null;\n command: VerseCommand | null;\n /** Set when a v2 blob was migrated this load: the shell announces \"Chat moved to ⌘5\" once. */\n announceChatMoved: boolean;\n}\n\nexport const VERSE_SIDEBAR = { min: 240, max: 360, def: 264 } as const;\nexport const VERSE_RESOURCES = { min: 260, max: 480, def: 320 } as const;\n/** Surfaces kept alive besides Chat (which, once visited, always stays). */\nexport const KEEP_ALIVE_SURFACES = 3;\nexport const RECENT_ACTIONS_LIMIT = 5;\n\nexport const VERSE_UI_STORAGE_KEY = V3_KEY;\nexport const VERSE_UI_STORAGE_KEY_V2 = V2_KEY;\n\nconst DEFAULTS: VerseUiState = {\n section: 'chat',\n railExpanded: false,\n sidebarWidth: VERSE_SIDEBAR.def,\n sidebarCollapsed: false,\n resourcesOpen: true,\n resourcesWidth: VERSE_RESOURCES.def,\n recentActions: [],\n recentChats: [],\n mounted: ['chat'],\n overlay: null,\n needsYouSplit: 'all',\n needsYouFocus: null,\n history: { entries: [{ section: 'chat', sessionId: null }], index: 0 },\n activeSessionId: null,\n command: null,\n announceChatMoved: false,\n};\n\nexport function clampWidth(value: unknown, range: { min: number; max: number; def: number }): number {\n const n = Number(value);\n if (!Number.isFinite(n) || n <= 0) return range.def;\n return Math.max(range.min, Math.min(range.max, Math.round(n)));\n}\n\n/** Local calendar day, `YYYY-MM-DD` — \"first launch each day\" is the operator's day, not UTC's. */\nexport function localDay(ms: number): string {\n const d = new Date(ms);\n const pad = (n: number) => String(n).padStart(2, '0');\n return `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;\n}\n\ninterface PersistedV3 {\n version: 3;\n section: VerseSectionId;\n railExpanded: boolean;\n sidebarWidth: number;\n sidebarCollapsed: boolean;\n resourcesOpen: boolean;\n resourcesWidth: number;\n recentActions: string[];\n recentChats: string[];\n lastLaunchDay: string | null;\n chatMovedAnnounced: boolean;\n dock: unknown;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction stringList(value: unknown, limit: number, re: RegExp): string[] {\n if (!Array.isArray(value)) return [];\n const out: string[] = [];\n for (const v of value) {\n if (typeof v === 'string' && re.test(v) && !out.includes(v)) out.push(v);\n if (out.length >= limit) break;\n }\n return out;\n}\n\nfunction readJson(key: string): Record<string, unknown> | null {\n try {\n const raw = localStorage.getItem(key);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as unknown;\n return isObject(parsed) ? parsed : null;\n } catch {\n return null;\n }\n}\n\n/** Bookkeeping that is persisted but is not UI state. */\nlet lastLaunchDay: string | null = null;\nlet chatMovedAnnounced = false;\n\nexport interface LoadOptions {\n now?: number;\n /** Has this module landed? (Injected by tests; the build's glob otherwise.) */\n landed?: (module: string) => boolean;\n}\n\n/**\n * Read v3, else migrate v2, else defaults — then apply the launch rule.\n * Total: a hand-edited or future blob falls back field by field.\n */\nexport function loadVerseUi(options: LoadOptions = {}): VerseUiState {\n const now = options.now ?? Date.now();\n const v3 = readJson(V3_KEY);\n const v2 = v3 ? null : readJson(V2_KEY);\n const src = v3 ?? v2 ?? {};\n\n let section: VerseSectionId = DEFAULTS.section;\n let overlay: VerseOverlay = null;\n const migration = migrateSectionId(src['section']);\n if (migration && SECTION_IDS.has(migration.section)) {\n section = migration.section;\n if (migration.openNeedsYou && !v3) overlay = 'needs-you';\n }\n\n lastLaunchDay = v3 && typeof v3['lastLaunchDay'] === 'string' ? v3['lastLaunchDay'] : null;\n chatMovedAnnounced = v3 ? v3['chatMovedAnnounced'] === true : false;\n\n const today = localDay(now);\n // Retain the old bookkeeping field for downgrade compatibility, without\n // interpreting a new day as permission to change the operator's view.\n lastLaunchDay = today;\n\n const state: VerseUiState = {\n ...DEFAULTS,\n section,\n railExpanded: src['railExpanded'] === true,\n sidebarWidth: clampWidth(src['sidebarWidth'], VERSE_SIDEBAR),\n sidebarCollapsed: src['sidebarCollapsed'] === true,\n resourcesOpen: src['resourcesOpen'] !== false,\n resourcesWidth: clampWidth(src['resourcesWidth'], VERSE_RESOURCES),\n recentActions: stringList(src['recentActions'], RECENT_ACTIONS_LIMIT, /^[a-z][a-z0-9.-]{0,63}$/),\n recentChats: stringList(src['recentChats'], RECENT_CHATS_LIMIT, /^[\\w.-]{1,200}$/),\n mounted: [section],\n overlay,\n history: { entries: [{ section, sessionId: null }], index: 0 },\n // A v2 blob means this operator had ⌘1 = Chat in their hands yesterday.\n announceChatMoved: v2 !== null && !chatMovedAnnounced,\n };\n return state;\n}\n\nlet state: VerseUiState = DEFAULTS;\nlet nonce = 0;\nlet recentCycle: RecentCycle | null = null;\nconst listeners = new Set<() => void>();\n\nfunction persist(next: VerseUiState): void {\n const payload: PersistedV3 = {\n version: 3,\n section: next.section,\n railExpanded: next.railExpanded,\n sidebarWidth: next.sidebarWidth,\n sidebarCollapsed: next.sidebarCollapsed,\n resourcesOpen: next.resourcesOpen,\n resourcesWidth: next.resourcesWidth,\n recentActions: [...next.recentActions],\n recentChats: [...next.recentChats],\n lastLaunchDay,\n chatMovedAnnounced,\n dock: getDockState(),\n };\n try {\n localStorage.setItem(V3_KEY, JSON.stringify(payload));\n } catch {\n /* best-effort: a private window without storage still runs the app */\n }\n}\n\nconst PERSISTED_FIELDS = [\n 'section',\n 'railExpanded',\n 'sidebarWidth',\n 'sidebarCollapsed',\n 'resourcesOpen',\n 'resourcesWidth',\n 'recentActions',\n 'recentChats',\n] as const satisfies readonly (keyof VerseUiState)[];\n\n/** Snapshot identity only changes when something actually changed. */\nfunction patch(delta: Partial<VerseUiState>): void {\n const next = { ...state, ...delta };\n if ((Object.keys(delta) as (keyof VerseUiState)[]).every((k) => Object.is(state[k], next[k]))) return;\n const shouldPersist = PERSISTED_FIELDS.some((k) => !Object.is(state[k], next[k]));\n state = next;\n if (shouldPersist) persist(next);\n for (const l of [...listeners]) l();\n}\n\nfunction init(): void {\n state = loadVerseUi();\n // Write the migrated / launch-ruled state straight away, so the day's first\n // launch is recorded even if the operator closes the app without a click.\n persist(state);\n}\n\ninit();\n\n// C2's dock changes are folded into the blob as they happen.\nlet lastDockJson = '';\nsubscribeDockState(() => {\n let json = '';\n try { json = JSON.stringify(getDockState()); } catch { json = ''; }\n if (json === lastDockJson) return;\n lastDockJson = json;\n persist(state);\n});\n\nexport function subscribeVerseUi(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function getVerseUiState(): VerseUiState {\n return state;\n}\n\n// ===========================================================================\n// Navigation\n// ===========================================================================\n\nfunction withMounted(mounted: readonly VerseSectionId[], section: VerseSectionId): VerseSectionId[] {\n // The last KEEP_ALIVE_SURFACES surfaces other than Chat, most recent first…\n const chatVisited = section === 'chat' || mounted.includes('chat');\n const others = mounted.filter((id) => id !== 'chat' && id !== section);\n const nonChat = (section === 'chat' ? others : [section, ...others]).slice(0, KEEP_ALIVE_SURFACES);\n const alive: VerseSectionId[] = section === 'chat' ? ['chat', ...nonChat] : nonChat;\n // …and Chat, once visited, always: its streams, scroll and draft are the\n // most expensive state in the app to rebuild.\n if (chatVisited && !alive.includes('chat')) alive.push('chat');\n return alive;\n}\n\nfunction go(section: VerseSectionId, options: { history: boolean }): void {\n if (!SECTION_IDS.has(section)) return;\n const history = options.history\n ? pushNav(state.history, { section, sessionId: section === 'chat' ? state.activeSessionId : null })\n : state.history;\n patch({ section, mounted: withMounted(state.mounted, section), history });\n}\n\n/** The window event that asks the shell to reveal an anchor on a surface (shell/reveal-anchor.ts). */\nexport const VERSE_ANCHOR_EVENT = 'ashlr:verse-anchor';\n\nexport interface VerseAnchorRequest {\n section: VerseSectionId;\n /** A surface's own anchor key (\"memo:m-7\", \"seat:claude-a\"); the element carries `c7-anchor-<key>` or `data-verse-anchor`. */\n anchor: string;\n}\n\n/**\n * Switch surface; with `anchor`, also ask the shell to scroll that card or\n * row into view once the surface has painted. The anchor travels as a window\n * event rather than store state because it is a one-shot gesture about DOM\n * that may not exist yet (a lazy chunk), and every unit that owns a surface\n * can dispatch the same event without importing the shell.\n */\nexport function setVerseSection(section: VerseSectionId, anchor: string | null = null): void {\n go(section, { history: true });\n if (!anchor || typeof window === 'undefined') return;\n const detail: VerseAnchorRequest = { section, anchor };\n window.dispatchEvent(new CustomEvent(VERSE_ANCHOR_EVENT, { detail }));\n}\n\n/** ⌘[ / ⌘]. Returns false when there is nowhere to go. */\nexport function stepVerseHistory(delta: -1 | 1): boolean {\n const step = stepNav(state.history, delta);\n if (!step) return false;\n patch({ history: step.history });\n go(step.entry.section, { history: false });\n const target = step.entry.sessionId;\n if (step.entry.section === 'chat' && target && target !== state.activeSessionId) {\n raise('open-session', { sessionId: target }, false);\n // Set directly, NOT through setVerseActiveSession: that would push a new\n // history entry and drop the forward stack this step just walked.\n patch({ activeSessionId: target, recentChats: touchRecent(state.recentChats, target) });\n }\n return true;\n}\n\n/**\n * The chat reports which chat is open (C2: call on every selection). Feeds\n * back/forward, ⌃Tab's recent list, and the drawer's \"you are looking at it\".\n */\nexport function setVerseActiveSession(sessionId: string | null): void {\n if (sessionId === state.activeSessionId) return;\n const recentChats = sessionId ? touchRecent(state.recentChats, sessionId) : state.recentChats;\n const history = sessionId && state.section === 'chat' ? pushNav(state.history, { section: 'chat', sessionId }) : state.history;\n patch({ activeSessionId: sessionId, recentChats, history });\n}\n\n/** ⌃Tab / ⌃⇧Tab. Returns the chat opened, or null when there is no other recent chat. */\nexport function cycleVerseRecentChat(direction: 1 | -1, now: number = Date.now()): string | null {\n const recent = state.activeSessionId ? touchRecent(state.recentChats, state.activeSessionId) : [...state.recentChats];\n const step = cycleRecent(recent, recentCycle, direction, now);\n if (!step) return null;\n recentCycle = step.cycle;\n openVerseSession(step.sessionId);\n return step.sessionId;\n}\n\n// ===========================================================================\n// Chat hand-off\n// ===========================================================================\n\n/** The chat's own selection key (ChatSection, C2) — see openVerseSession. */\nconst CHAT_SELECTED_KEY = 'ashlr.verse.selected.v1';\n\nfunction raise(name: VerseCommandName, args: VerseCommandArgs, switchTo: boolean): void {\n nonce += 1;\n const command: VerseCommand = { name, nonce, ...args };\n if (switchTo && state.section !== 'chat') {\n go('chat', { history: true });\n }\n patch({ command });\n}\n\n/** ⌘N, \"New chat on…\", the palette's chat actions: switch to Chat and hand it a one-shot request. */\nexport function requestVerseCommand(name: VerseCommandName, args: VerseCommandArgs = {}): void {\n raise(name, args, true);\n}\n\n/**\n * Open a chat by id from anywhere (palette, drawer, a notification, ⌃Tab).\n * Raises `open-session` for a mounted chat surface; when Chat is not mounted\n * yet it also writes the chat's own selection key, so the surface opens on\n * that chat when it mounts (the command then confirms it).\n */\nexport function openVerseSession(sessionId: string): void {\n if (!/^[\\w.-]{1,200}$/.test(sessionId)) return;\n if (!state.mounted.includes('chat')) {\n try { localStorage.setItem(CHAT_SELECTED_KEY, sessionId); } catch { /* the command still carries it */ }\n }\n raise('open-session', { sessionId }, true);\n setVerseActiveSession(sessionId);\n}\n\nexport function clearVerseCommand(): void {\n patch({ command: null });\n}\n\n// ===========================================================================\n// Overlays\n// ===========================================================================\n\nexport function openVerseOverlay(overlay: Exclude<VerseOverlay, null>): void {\n patch({ overlay });\n}\n\nexport function closeVerseOverlay(): void {\n patch({ overlay: null, needsYouFocus: null });\n}\n\nexport function toggleVerseOverlay(overlay: Exclude<VerseOverlay, null>): void {\n patch({ overlay: state.overlay === overlay ? null : overlay, needsYouFocus: null });\n}\n\n/** ⌘J — optionally on a split, optionally selecting one item. */\nexport function openVerseNeedsYou(options: { split?: NeedsYouSplit; focusId?: string | null } = {}): void {\n patch({\n overlay: 'needs-you',\n needsYouSplit: options.split ?? state.needsYouSplit,\n needsYouFocus: options.focusId ?? null,\n });\n}\n\nexport function setVerseNeedsYouSplit(split: NeedsYouSplit): void {\n if (NEEDS_YOU_SPLITS.includes(split)) patch({ needsYouSplit: split });\n}\n\n// ===========================================================================\n// Preferences\n// ===========================================================================\n\nexport function setVerseRailExpanded(expanded: boolean): void {\n patch({ railExpanded: expanded });\n}\n\nexport function toggleVerseRail(): void {\n patch({ railExpanded: !state.railExpanded });\n}\n\nexport function setVerseSidebarWidth(width: number): void {\n patch({ sidebarWidth: clampWidth(width, VERSE_SIDEBAR) });\n}\n\nexport function setVerseSidebarCollapsed(collapsed: boolean): void {\n patch({ sidebarCollapsed: collapsed });\n}\n\nexport function toggleVerseSidebar(): void {\n patch({ sidebarCollapsed: !state.sidebarCollapsed });\n}\n\nexport function setVerseResourcesOpen(open: boolean): void {\n patch({ resourcesOpen: open });\n}\n\nexport function setVerseResourcesWidth(width: number): void {\n patch({ resourcesWidth: clampWidth(width, VERSE_RESOURCES) });\n}\n\n/** The palette ran a catalog action: remember it for the empty-query list. */\nexport function recordVerseAction(commandId: string): void {\n if (!/^[a-z][a-z0-9.-]{0,63}$/.test(commandId)) return;\n patch({ recentActions: [commandId, ...state.recentActions.filter((id) => id !== commandId)].slice(0, RECENT_ACTIONS_LIMIT) });\n}\n\n/** The \"Chat moved to ⌘5\" toast was shown: never again. */\nexport function acknowledgeChatMoved(): void {\n chatMovedAnnounced = true;\n if (state.announceChatMoved) patch({ announceChatMoved: false });\n persist(state);\n}\n\n// ===========================================================================\n// Test hygiene\n// ===========================================================================\n\n/** Back to defaults, storage cleared. Does NOT re-run the launch rule. */\nexport function resetVerseUi(): void {\n state = DEFAULTS;\n nonce = 0;\n recentCycle = null;\n lastLaunchDay = null;\n chatMovedAnnounced = false;\n seatMemory = null;\n adviceDismissals.clear();\n try {\n localStorage.removeItem(V3_KEY);\n localStorage.removeItem(V2_KEY);\n localStorage.removeItem(SEAT_STORAGE_KEY);\n } catch {\n /* ignore */\n }\n for (const l of [...listeners]) l();\n}\n\n/** Re-read storage as a fresh page load would (migration + launch rule). */\nexport function reloadVerseUiForTest(options: LoadOptions = {}): void {\n state = loadVerseUi(options);\n persist(state);\n for (const l of [...listeners]) l();\n}\n\n// ---------------------------------------------------------------------------\n// Last-used seat, per project\n// ---------------------------------------------------------------------------\n\n/**\n * Which seat + model a project's last chat was started on.\n *\n * WHY THIS IS PERSISTED. A new chat is seat-bound at creation, and the two\n * ways to start one — the sidebar \"+\" and ⌘N — both carry the CURRENT\n * session's seat forward. That works right up until there is no current\n * session (first load, or after deleting the last chat), where both fall\n * through to `defaultSeatChoice()`, which walks ENGINE_ORDER and lands on\n * Claude: the scarcest and most expensive account, chosen by alphabet rather\n * than by intent. Remembering the last seat per project makes \"New chat\" mean\n * the same thing across a reload as it does within one.\n *\n * NOT part of `VerseUiState`: a per-project memory that grows with the\n * project list has no business in a snapshot compared by identity on every\n * render.\n */\nexport interface VerseSeatMemory {\n seatId: string;\n model: string;\n}\n\nconst SEAT_STORAGE_KEY = 'ashlr.verse.seats.v1';\n/** Bounded so a long-lived browser cannot accumulate an unbounded map. */\nconst SEAT_MEMORY_LIMIT = 50;\n\n/** Lazily read, then held in memory; `null` means \"not read yet\". */\nlet seatMemory: Record<string, VerseSeatMemory> | null = null;\n\nfunction readSeatMemory(): Record<string, VerseSeatMemory> {\n if (seatMemory) return seatMemory;\n const out: Record<string, VerseSeatMemory> = {};\n try {\n const raw = localStorage.getItem(SEAT_STORAGE_KEY);\n const parsed = raw ? (JSON.parse(raw) as unknown) : null;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n for (const [path, value] of Object.entries(parsed as Record<string, unknown>)) {\n if (!value || typeof value !== 'object' || Array.isArray(value)) continue;\n const { seatId, model } = value as Record<string, unknown>;\n if (typeof seatId !== 'string' || seatId.length === 0) continue;\n if (typeof model !== 'string' || model.length === 0) continue;\n out[path] = { seatId, model };\n }\n }\n } catch {\n /* a private window without storage still runs the app */\n }\n seatMemory = out;\n return out;\n}\n\n/**\n * The seat a chat on `projectPath` was last started with, or the most recent\n * seat on any project when that project has no record yet — a brand-new\n * project inherits the operator's current working habit rather than resetting\n * to the default engine. Null only when nothing has ever been started.\n */\nexport function lastVerseSeat(projectPath?: string | null): VerseSeatMemory | null {\n const memory = readSeatMemory();\n if (projectPath) {\n const exact = memory[projectPath];\n if (exact) return exact;\n }\n // Insertion order is recency order: rememberVerseSeat re-inserts on write.\n const keys = Object.keys(memory);\n const newest = keys[keys.length - 1];\n return newest ? memory[newest] ?? null : null;\n}\n\n/** Record the seat a chat was just created with. Never throws. */\nexport function rememberVerseSeat(projectPath: string, seat: VerseSeatMemory): void {\n if (!projectPath || !seat.seatId || !seat.model) return;\n const memory = readSeatMemory();\n // Delete before re-inserting so key order stays newest-last.\n delete memory[projectPath];\n memory[projectPath] = { seatId: seat.seatId, model: seat.model };\n const keys = Object.keys(memory);\n for (const stale of keys.slice(0, Math.max(0, keys.length - SEAT_MEMORY_LIMIT))) {\n delete memory[stale];\n }\n try {\n localStorage.setItem(SEAT_STORAGE_KEY, JSON.stringify(memory));\n } catch {\n /* best-effort */\n }\n}\n\nexport const VERSE_SEAT_STORAGE_KEY = SEAT_STORAGE_KEY;\n\n// ---------------------------------------------------------------------------\n// Dismissed context advice, per session (NOT persisted)\n// ---------------------------------------------------------------------------\n\n/**\n * Which context-advice notes (\"continue in a fresh chat\", \"expansive may\n * help\") the operator waved off, per session.\n *\n * WHY IN MEMORY ONLY. Advice is evidence about the session as it is NOW: a\n * dismissal restored from storage after a reload would silence a note whose\n * evidence has since grown. Held here rather than in component state so that\n * switching surfaces and back does not bring back a note just dismissed.\n *\n * The key names the EVIDENCE (ContextAdvice composes it from the advice level\n * and the compaction count), so a note returns on its own when it escalates.\n */\nconst adviceDismissals = new Map<string, Set<string>>();\n/** Bounded like the other per-session memories. */\nconst ADVICE_SESSION_LIMIT = 50;\n\nexport function dismissVerseAdvice(sessionId: string, key: string): void {\n if (!sessionId || !key) return;\n const set = adviceDismissals.get(sessionId) ?? new Set<string>();\n set.add(key);\n // Re-insert so Map order stays recency order, then trim the oldest.\n adviceDismissals.delete(sessionId);\n adviceDismissals.set(sessionId, set);\n for (const stale of [...adviceDismissals.keys()].slice(0, Math.max(0, adviceDismissals.size - ADVICE_SESSION_LIMIT))) {\n adviceDismissals.delete(stale);\n }\n}\n\nexport function isVerseAdviceDismissed(sessionId: string, key: string): boolean {\n return adviceDismissals.get(sessionId)?.has(key) ?? false;\n}\n","/**\n * routes/verse/composer/composer-keys.ts — the composer's keys, read from\n * C0's key table (shell/command-keys.ts, the keys half of the command\n * catalog the palette, the shortcuts overlay and the native menu also\n * read), never re-declared here (unit C3).\n */\nimport {\n chordMatches,\n commandChord,\n formatChord,\n keyBinding,\n type KeyEventLike,\n} from '../shell/command-keys.js';\n\n/** The composer commands this unit implements (command-catalog ids). */\nexport const COMPOSER_COMMAND_IDS = [\n 'composer.permission',\n 'composer.model',\n 'composer.effort',\n 'composer.attach',\n 'composer.cloud',\n 'composer.devin',\n 'composer.send',\n 'composer.stop-and-send',\n 'composer.stop',\n] as const;\nexport type ComposerCommandId = (typeof COMPOSER_COMMAND_IDS)[number];\n\n/**\n * The window event the palette (C1) and the native menu bridge dispatch to\n * run a catalog command on the surface that owns it. Defined in C0's\n * command-keys.ts (beside the ids it carries); re-exported here so the\n * composer's importers keep one import site.\n */\nexport { WORKBENCH_COMMAND_EVENT } from '../shell/command-keys.js';\n\n/** Does this key event press the catalog chord for `id`? */\nexport function pressesCommand(event: KeyEventLike, id: ComposerCommandId): boolean {\n const binding = keyBinding(id);\n return binding !== null && binding.keys.some((chord) => chordMatches(event, chord));\n}\n\n/** The chord for `id` as the platform prints it (\"⇧⌘M\" / \"Ctrl+Shift+M\"); '' when unbound. */\nexport function shortcutLabel(id: ComposerCommandId): string {\n const chord = commandChord(id);\n return chord ? formatChord(chord) : '';\n}\n","/**\n * routes/verse/shell/command-bus.ts — how a catalog command reaches the unit\n * that owns its behaviour (unit C1; the keys and titles are C0's\n * command-catalog.ts).\n *\n * The catalog is one table; the behaviour behind it is spread over units:\n * the shell runs the global commands, the chat (C2) runs `dock.*` and\n * `chat.*`, the composer (C3) runs `composer.*`. The palette, the desktop\n * menu bridge and the shell's key handler all call `runCommand(id)`; the\n * owning unit registers a handler for the ids it serves:\n *\n * useCommandHandler('dock.terminal', () => openDockPane('terminal'));\n *\n * A handler may return `false` to decline (e.g. a composer command with no\n * chat open), and the most recently registered handler for an id is asked\n * first — a mounted chat outranks nothing, a focused one outranks a hidden\n * one because it registers last.\n *\n * DELIVERY LATER. A chat command run from another surface (⌘K \"Terminal\"\n * while on Fleet) has no handler until Chat mounts. The shell switches to\n * Chat and parks the command with `runCommandWhenReady`; the first handler to\n * register for that id within the window receives it. Parked commands expire\n * — a command that runs 20 s after the operator asked for it is a surprise,\n * not a feature.\n *\n * Framework-free except the one hook at the bottom.\n */\nimport { useEffect, useRef } from 'react';\n\n/** What a palette argument (Tab) filled in, or what a caller passes along. */\nexport interface CommandArgument {\n kind: 'seat' | 'project' | 'section' | 'session';\n id: string;\n label: string;\n}\n\nexport interface CommandInvocation {\n argument?: CommandArgument;\n /** Where it came from — handlers may word a toast differently for a key press. */\n via?: 'palette' | 'key' | 'menu' | 'button';\n}\n\n/** Return false to decline (the next handler is asked); anything else = handled. */\nexport type CommandHandler = (invocation: CommandInvocation) => void | boolean;\n\nconst handlers = new Map<string, CommandHandler[]>();\n\ninterface Parked {\n id: string;\n invocation: CommandInvocation;\n until: number;\n}\n\nlet parked: Parked | null = null;\n\nexport const PARKED_COMMAND_TTL_MS = 4_000;\n\nfunction deliverParked(id: string): void {\n if (!parked || parked.id !== id) return;\n if (Date.now() > parked.until) {\n parked = null;\n return;\n }\n const { invocation } = parked;\n parked = null;\n // After the registering effect has finished: the handler's own component\n // is mounted, but its sibling effects may not have run yet.\n queueMicrotask(() => {\n runCommand(id, invocation);\n });\n}\n\n/** Register `handler` for command `id`. Returns the unregister function. */\nexport function registerCommandHandler(id: string, handler: CommandHandler): () => void {\n const list = handlers.get(id) ?? [];\n list.push(handler);\n handlers.set(id, list);\n deliverParked(id);\n return () => {\n const current = handlers.get(id);\n if (!current) return;\n const index = current.lastIndexOf(handler);\n if (index >= 0) current.splice(index, 1);\n if (current.length === 0) handlers.delete(id);\n };\n}\n\nexport function hasCommandHandler(id: string): boolean {\n return (handlers.get(id)?.length ?? 0) > 0;\n}\n\n/** Run `id` now. True when a handler took it. */\nexport function runCommand(id: string, invocation: CommandInvocation = {}): boolean {\n const list = handlers.get(id);\n if (!list) return false;\n for (const handler of [...list].reverse()) {\n try {\n if (handler(invocation) !== false) return true;\n } catch (err) {\n // A broken handler must not take the palette or the key handler down.\n console.error(`[verse] command ${id} failed`, err);\n return true;\n }\n }\n return false;\n}\n\n/** Run `id` now if someone serves it, else hold it for the next handler to register (within the TTL). */\nexport function runCommandWhenReady(id: string, invocation: CommandInvocation = {}, ttlMs: number = PARKED_COMMAND_TTL_MS): boolean {\n if (runCommand(id, invocation)) return true;\n parked = { id, invocation, until: Date.now() + ttlMs };\n return false;\n}\n\n/** Test hygiene. */\nexport function resetCommandBus(): void {\n handlers.clear();\n parked = null;\n}\n\n/**\n * Serve command `id` while mounted (and `enabled`). The latest `handler` is\n * always the one called, so an inline closure does not re-register each render.\n */\nexport function useCommandHandler(id: string, handler: CommandHandler, enabled = true): void {\n const ref = useRef(handler);\n ref.current = handler;\n useEffect(() => {\n if (!enabled) return;\n return registerCommandHandler(id, (invocation) => ref.current(invocation));\n }, [id, enabled]);\n}\n","/**\n * routes/verse/shell/run-command.ts — \"run catalog command X\" from anywhere:\n * a key, the palette, the native menu, a button (unit C1).\n *\n * - guarded commands (Stop running chats…, Stop the fleet…) go through\n * confirm → token → run (guarded-action.tsx), with the runner defined\n * by the SHELL (guarded-runners.ts, loaded when a run is confirmed):\n * they are shell actions, and a guard must never depend on some other\n * unit remembering to confirm;\n * - chat commands run on the chat's handler, and when Chat is not on\n * screen the shell switches to it and parks the command until the chat\n * registers (command-bus runCommandWhenReady);\n * - the composer's commands (`composer.*`, C3) are answered by the Composer\n * through the `ashlr:command` window event, not the bus — so they are\n * DISPATCHED to it, after switching to Chat and waiting for a composer to\n * exist (deliverComposerCommand);\n * - surface commands (`surface: 'command'` in the catalog — the autonomy\n * switch, the grant sheet, budget modes) run on the surface that owns\n * their dialogs: the shell brings it forward and parks the command until\n * it registers, exactly like a chat command;\n * - everything else runs on its registered handler.\n *\n * Palette-listed commands are remembered for the empty-query \"Recent\" list.\n */\nimport { useEffect } from 'react';\nimport { useToast } from '../../../components/primitives/Toast.js';\nimport { cycleTheme } from '../../../data/theme-store.js';\nimport {\n closeVerseOverlay,\n cycleVerseRecentChat,\n getVerseUiState,\n openVerseNeedsYou,\n recordVerseAction,\n requestVerseCommand,\n setVerseSection,\n stepVerseHistory,\n toggleVerseOverlay,\n toggleVerseRail,\n type VerseSectionId,\n} from '../verse-ui-store.js';\nimport { COMPOSER_COMMAND_IDS, WORKBENCH_COMMAND_EVENT } from '../composer/composer-keys.js';\nimport { PARKED_COMMAND_TTL_MS, registerCommandHandler, runCommand, runCommandWhenReady, type CommandInvocation } from './command-bus.js';\nimport { commandCatalogLoaded, keyBinding, loadedCommand } from './command-keys.js';\nimport { requestGuarded } from './guard-store.js';\n\nexport type ShellNotify = (message: string, tone?: 'neutral' | 'success' | 'danger') => void;\n\nlet notify: ShellNotify = () => {};\n\n/** The shell installs its toast here (run-command has no React context). */\nexport function setShellNotifier(fn: ShellNotify | null): void {\n notify = fn ?? (() => {});\n}\n\n/** Toast through whatever the shell installed (guarded-runners.ts reports with it). */\nexport function shellNotify(message: string, tone?: 'neutral' | 'success' | 'danger'): void {\n notify(message, tone);\n}\n\n/**\n * The guarded catalog commands the shell runs itself. Their runners\n * (guarded-runners.ts: a cancel per running chat, the fleet stop and its\n * toast) are a dynamic import — they run only after the operator confirmed\n * (and unlocked), never at first paint, so they stay out of the chat\n * first-paint critical JS. guarded-runners.test.ts pins that this list and\n * the runner table name the same ids.\n */\nexport const SHELL_GUARDED_COMMAND_IDS: ReadonlySet<string> = new Set(['chats.stop-all', 'fleet.stop']);\n\n/** The composer's message box inside the Chat surface (C3's Composer names it \"Message\"). */\nfunction composerPresent(): boolean {\n return document.querySelector('[data-surface=\"chat\"] textarea[aria-label=\"Message\"]') !== null;\n}\n\nfunction dispatchComposerCommand(id: string): void {\n window.dispatchEvent(new CustomEvent(WORKBENCH_COMMAND_EVENT, { detail: { id } }));\n}\n\n/**\n * How long after the composer's box appears before the command is sent. The\n * box is in the DOM at React's commit; the Composer's window listener is a\n * passive effect that runs a moment LATER. Firing on the mutation itself can\n * beat the listener and the command vanishes, so the dispatch waits a beat.\n */\nexport const COMPOSER_LISTEN_GRACE_MS = 50;\n\n/**\n * Run a `composer.*` command on the Composer. With a composer already mounted\n * (even behind another surface: keep-alive leaves its listener live) it goes\n * now. Otherwise Chat is opened and the command waits — within the same TTL\n * as a parked bus command — for a composer to mount. A command that finds no\n * composer in time is dropped: running it 20 s later would be a surprise.\n */\nexport function deliverComposerCommand(id: string, ttlMs: number = PARKED_COMMAND_TTL_MS): void {\n if (typeof document === 'undefined') return;\n if (getVerseUiState().section !== 'chat') setVerseSection('chat');\n if (composerPresent()) {\n dispatchComposerCommand(id);\n return;\n }\n let done = false;\n const finish = (found: boolean) => {\n if (done) return;\n done = true;\n observer.disconnect();\n window.clearTimeout(expiry);\n if (found) window.setTimeout(() => dispatchComposerCommand(id), COMPOSER_LISTEN_GRACE_MS);\n };\n const observer = new MutationObserver(() => {\n if (composerPresent()) finish(true);\n });\n observer.observe(document.body, { childList: true, subtree: true });\n const expiry = window.setTimeout(() => finish(false), ttlMs);\n}\n\nconst COMPOSER_IDS: ReadonlySet<string> = new Set(COMPOSER_COMMAND_IDS);\n\n/**\n * Run catalog command `id`. Returns false when nothing could run it.\n *\n * A key, the menu or a rail button names a KEYED command, and its keys and\n * scope are here from first paint (command-keys.ts). The rest of the entry —\n * title, palette group, guard, serving surface — is the full catalog's,\n * which every caller naming a keyless command (the palette, onboarding) has\n * loaded, and the warm-up fetches after first paint anyway. Should one\n * arrive before it, the catalog is loaded and the command run then.\n */\nexport function executeCatalogCommand(id: string, invocation: CommandInvocation = {}): boolean {\n const full = loadedCommand(id);\n const command = full ?? keyBinding(id);\n if (!command) {\n if (commandCatalogLoaded()) return false;\n void import('./command-catalog.js').then(\n () => { if (loadedCommand(id)) executeCatalogCommand(id, invocation); },\n (err) => console.error('[verse] command catalog failed to load', err),\n );\n return true;\n }\n if (full && full.group !== null && invocation.via === 'palette') recordVerseAction(full.id);\n\n if (full?.guard) {\n if (!SHELL_GUARDED_COMMAND_IDS.has(full.id)) return runCommand(id, invocation);\n const commandId = full.id;\n const { confirm, token } = full.guard;\n requestGuarded({\n title: confirm.title,\n body: confirm.body,\n confirmLabel: confirm.confirmLabel,\n destructive: confirm.destructive,\n token,\n tokenReason: `${full.title.replace(/…$/, '')} requires the dispatch token.`,\n run: () => import('./guarded-runners.js').then((m) => m.runGuardedShellCommand(commandId)),\n });\n return true;\n }\n\n if (full?.surface) {\n // Its handler (and the Touch ID sheet / token dialog it may open) lives on\n // that surface. Going there first means the operator sees the switch move\n // — or the sheet it opened — rather than a change behind another surface.\n if (getVerseUiState().section !== full.surface) setVerseSection(full.surface);\n runCommandWhenReady(id, invocation);\n return true;\n }\n\n if (COMPOSER_IDS.has(command.id)) {\n // A bus handler (should C3 ever register one) outranks the event.\n if (runCommand(id, invocation)) return true;\n deliverComposerCommand(id);\n return true;\n }\n\n if (command.scope === 'chat' || command.scope === 'composer') {\n if (runCommand(id, invocation)) return true;\n // Explicitly asked for a chat action: going to Chat is the point.\n if (getVerseUiState().section !== 'chat') setVerseSection('chat');\n runCommandWhenReady(id, invocation);\n return true;\n }\n\n if (runCommand(id, invocation)) return true;\n const unavailable = (title: string) => notify(`${title} isn't available here yet.`, 'neutral');\n if (full) unavailable(full.title);\n else void import('./command-catalog.js').then((m) => unavailable(m.findCommand(id)?.title ?? id), () => unavailable(id));\n return false;\n}\n\n\n/**\n * The GLOBAL commands the shell itself serves (every other id belongs to the\n * unit that owns the behaviour). Returns the unregister function.\n */\n/** The Agents board (3.16) takes New agent once its lazy chunk mounts (agents-focus.ts). */\nfunction agentsFocus(kind: 'new' | 'new-multi'): void {\n void import('../agents/agents-focus.js').then((m) => m.requestAgentsFocus(kind));\n}\n\nexport function registerShellCommandHandlers(): () => void {\n const surfaces: Array<[string, VerseSectionId]> = [\n ['mode.with-me', 'chat'],\n ['mode.for-me', 'fleet'],\n ['surface.command', 'command'],\n ['surface.fleet', 'fleet'],\n ['surface.growth', 'growth'],\n ['surface.mind', 'mind'],\n ['surface.chat', 'chat'],\n ['surface.agents', 'agents'],\n ['section.settings', 'settings'],\n ['section.apps', 'apps'],\n ['section.usage', 'usage'],\n ['section.wiki', 'wiki'],\n ['section.playbooks', 'playbooks'],\n ['section.automations', 'automations'],\n ];\n const offs = [\n ...surfaces.map(([id, section]) => registerCommandHandler(id, () => setVerseSection(section))),\n registerCommandHandler('palette.open', () => toggleVerseOverlay('palette')),\n registerCommandHandler('needs-you.open', (inv) => {\n // The menu / a notification OPENS it; the key toggles.\n if (inv.via !== 'menu' && getVerseUiState().overlay === 'needs-you') closeVerseOverlay();\n else openVerseNeedsYou();\n }),\n registerCommandHandler('shortcuts.open', () => toggleVerseOverlay('shortcuts')),\n registerCommandHandler('history.back', () => { stepVerseHistory(-1); }),\n registerCommandHandler('history.forward', () => { stepVerseHistory(1); }),\n registerCommandHandler('chat.recent-next', () => { cycleVerseRecentChat(1); }),\n registerCommandHandler('chat.recent-prev', () => { cycleVerseRecentChat(-1); }),\n registerCommandHandler('rail.toggle-labels', () => toggleVerseRail()),\n // ⌘N on the Agents board starts an agent in its own workspace; anywhere else, a chat.\n registerCommandHandler('chat.new', () => {\n if (getVerseUiState().section === 'agents') agentsFocus('new');\n else requestVerseCommand('new-chat');\n }),\n registerCommandHandler('agents.new', () => agentsFocus('new')),\n registerCommandHandler('agents.new-multi', () => agentsFocus('new-multi')),\n registerCommandHandler('chat.new-on', (inv) => {\n const seat = inv.argument?.kind === 'seat' ? inv.argument.id : undefined;\n requestVerseCommand('new-chat', seat ? { seatId: seat } : {});\n }),\n registerCommandHandler('appearance.toggle-theme', () => cycleTheme()),\n registerCommandHandler('app.summon', () => requestVerseCommand('focus-composer')),\n // The rollout ladder — on Fleet since 3.15; the status card carries the anchor.\n registerCommandHandler('autonomy.status', () => setVerseSection('fleet', 'autonomy')),\n // The clipboard code loads when asked for (copy-setup.ts), not at first paint.\n // Mind's Leader panel takes these once it mounts (leader-focus.ts waits for it).\n registerCommandHandler('leader.message', () => { void import('../leader/leader-focus.js').then((m) => m.requestLeaderFocus({ kind: 'composer' })); }),\n registerCommandHandler('leader.directive', () => { void import('../leader/leader-focus.js').then((m) => m.requestLeaderFocus({ kind: 'directive' })); }),\n registerCommandHandler('autonomy.copy-setup', () => { void import('./copy-setup.js').then((m) => m.copyAutonomySetupCommand()); }),\n // The repo wiki (3.15): the section takes the request once its chunk mounts (wiki-focus.ts).\n registerCommandHandler('wiki.open', (inv) => {\n const projectPath = inv.argument?.kind === 'project' ? inv.argument.id : null;\n void import('../wiki/wiki-focus.js').then((m) => m.requestWikiFocus({ kind: 'repo', projectPath }));\n }),\n registerCommandHandler('wiki.ask', () => { void import('../wiki/wiki-focus.js').then((m) => m.requestWikiFocus({ kind: 'ask', projectPath: null })); }),\n // Playbooks (3.15): the section takes the request once its chunk mounts (playbook-focus.ts).\n registerCommandHandler('playbook.run', () => { void import('../playbooks/playbook-focus.js').then((m) => m.requestPlaybookFocus({ kind: 'run' })); }),\n // Command workflows: the FALLBACK. The terminal panel registers its own\n // handler (its picker) later, and the newest handler is asked first, so\n // this only runs when no terminal panel is mounted (or it declines):\n // Playbooks, narrowed to command workflows, pastes into the chat's terminal.\n registerCommandHandler('terminal.workflows', () => { void import('../playbooks/playbook-focus.js').then((m) => m.requestPlaybookFocus({ kind: 'workflows' })); }),\n // Launch configurations: the FALLBACK, same pattern — the terminal panel's\n // own handler wins when it is mounted; otherwise open the Terminal pane\n // with its launch dialog requested (it lists; nothing is typed until Launch).\n registerCommandHandler('terminal.launch', () => {\n void import('../dock/dock-store.js').then((m) => {\n m.openDockPane('terminal');\n m.requestTerminal({ launch: true });\n });\n }),\n // Automations (3.15): the section opens the New form once its chunk mounts.\n registerCommandHandler('automations.new', () => { void import('../automations/automations-focus.js').then((m) => m.requestAutomationsFocus('new')); }),\n ];\n return () => offs.forEach((off) => off());\n}\n\n/** Mounted once by the shell: the global handlers, and toasts for run-command. */\nexport function useShellCommands(): void {\n const toast = useToast();\n useEffect(() => {\n setShellNotifier(toast.show);\n return () => setShellNotifier(null);\n }, [toast.show]);\n useEffect(() => registerShellCommandHandlers(), []);\n}\n","/**\n * routes/verse/shell/skeletons.tsx — what a surface looks like while its\n * chunk loads (unit C1; SPEC-310C §1 \"Surfaces show skeletons while\n * loading\"). The pre-3.10 fallback was a bare \"Loading…\" line; a skeleton in\n * the surface's own shape means the layout does not jump when it lands.\n *\n * Also the designed state for a surface whose module is not in this build\n * (`SurfaceNotInBuild`): it names the surface in operator language — never a\n * source path (the old MissingSection printed `routes/verse/sections/X.tsx`).\n */\nimport { SkeletonCard, SkeletonLine, SkeletonRow } from '../../../components/primitives/Skeleton.js';\nimport type { VerseSectionId } from '../verse-ui-store.js';\nimport styles from './skeletons.module.css';\n\nconst DASHBOARD: ReadonlySet<VerseSectionId> = new Set(['command', 'fleet', 'growth', 'mind']);\n\nexport function SurfaceSkeleton({ section, label }: { section: VerseSectionId; label: string }) {\n return (\n <div className={styles.frame} role=\"status\" aria-label={`Loading ${label}`} data-skeleton={section}>\n <div className={styles.strip}>\n <SkeletonLine width=\"140px\" />\n </div>\n {section === 'chat' ? (\n <div className={styles.chat}>\n <div className={styles.chatList}>\n {Array.from({ length: 8 }, (_, i) => (\n <SkeletonLine key={i} width={`${70 + ((i * 13) % 25)}%`} />\n ))}\n </div>\n <div className={styles.chatBody}>\n <SkeletonLine width=\"42%\" />\n <SkeletonLine width=\"88%\" />\n <SkeletonLine width=\"76%\" />\n <SkeletonLine width=\"64%\" />\n </div>\n </div>\n ) : DASHBOARD.has(section) ? (\n <div className={styles.grid}>\n <div className={styles.wide}><SkeletonLine width=\"60%\" /></div>\n {Array.from({ length: 5 }, (_, i) => (\n <div key={i} className={styles.kpi}><SkeletonCard /></div>\n ))}\n <div className={styles.half}><SkeletonCard /></div>\n <div className={styles.half}><SkeletonCard /></div>\n </div>\n ) : (\n <div className={styles.column}>\n {Array.from({ length: 6 }, (_, i) => (\n <SkeletonRow key={i} />\n ))}\n </div>\n )}\n </div>\n );\n}\n\n/** A surface this build does not ship yet. */\nexport function SurfaceNotInBuild({ label, blurb }: { label: string; blurb: string }) {\n return (\n <div className={styles.missing} role=\"status\">\n <h1 className={styles.missingTitle}>{label} isn't in this build yet</h1>\n <p className={styles.missingBody}>{blurb}</p>\n <p className={styles.missingBody}>It appears here as soon as it ships. Everything else in Verse works normally.</p>\n </div>\n );\n}\n","/**\n * routes/verse/useVerseUi.ts — the React glue over verse-ui-store.ts (same\n * split as useVerseSession.ts over verse-store.ts: the store stays\n * framework-free, this file is the only place that knows about React).\n */\nimport { useSyncExternalStore } from 'react';\nimport { getVerseUiState, subscribeVerseUi, type VerseUiState } from './verse-ui-store.js';\n\nexport function useVerseUi(): VerseUiState {\n return useSyncExternalStore(subscribeVerseUi, getVerseUiState, getVerseUiState);\n}\n","/**\n * routes/verse/shell/focus-mode.ts — FOCUS MODE (⇧⌘F): everything but the\n * conversation steps aside — the rail, the chat list, the panel area and\n * the header's pane controls — and the transcript and composer take the\n * window. The same key (or Esc from anywhere outside the composer, or the\n * \"Exit focus\" pill) brings them back exactly as they were: nothing is\n * closed, only hidden.\n *\n * Deliberately NOT persisted. A reload that came back with no rail and no\n * chat list would look broken to someone who forgot they pressed a key.\n *\n * Tiny and framework-light: on the chat's first-paint path (the shell reads\n * it to hide the rail).\n */\nimport { useSyncExternalStore } from 'react';\n\nlet focused = false;\nconst listeners = new Set<() => void>();\n\nexport function isFocusMode(): boolean {\n return focused;\n}\n\nexport function setFocusMode(next: boolean): void {\n if (focused === next) return;\n focused = next;\n for (const listener of [...listeners]) listener();\n}\n\nexport function toggleFocusMode(): void {\n setFocusMode(!focused);\n}\n\nexport function subscribeFocusMode(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\nexport function useFocusMode(): boolean {\n return useSyncExternalStore(subscribeFocusMode, isFocusMode, isFocusMode);\n}\n","/**\n * routes/verse/shell/open-terminal-event.ts — the name of the \"open this\n * terminal tab\" window event (3.15), alone in its module: VerseApp (first\n * paint) listens for it, and a module shared with lazy chunks would drag the\n * rest of open-terminal-request.ts into the first-paint chunk with it.\n */\nexport const VERSE_OPEN_TERMINAL_EVENT = 'ashlr:verse-open-terminal';\n","/**\n * routes/verse/rail-icons.tsx — the icons the shell rail draws at first\n * paint: the rail sections' glyphs, Needs you, the gear and the Verse mark.\n * The gear tray's glyphs (Settings, Apps, Usage) are drawn only once the\n * tray opens, so they live in verse-icons.tsx with SECTION_ICON.\n *\n * Split from verse-icons.tsx (which re-exports all of these) because the\n * rail is on the chat first-paint path: importing verse-icons there pulled\n * every Verse glyph and the whole shared icon set into the chat first-paint\n * critical JS (SPEC-310A §1). This module imports only icon-base.tsx, the\n * shared set's first-paint subset. See verse-icons.tsx for why each glyph is\n * drawn here or aliased onto the shared set.\n */\nimport type { ComponentType, ReactNode } from 'react';\nimport { IconChat, IconInbox, type IconProps } from '../../components/primitives/icon-base.js';\nimport type { VerseSectionId } from './verse-ui-store.js';\n\nexport const ChatIcon = IconChat;\n\n/** The Verse chrome geometry (verse-icons.tsx draws its local glyphs with it too). */\nexport function Icon({ size = 16, children, ...rest }: IconProps & { children: ReactNode }) {\n return (\n <svg\n viewBox=\"0 0 16 16\"\n width={size}\n height={size}\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n focusable=\"false\"\n {...rest}\n >\n {children}\n </svg>\n );\n}\n\n/**\n * The mark in the rail head: the Ashlr.AI keystone \"A\" (traced from the brand\n * mark, ashlar-landing public/logos/ashlar-mark.png). The legs take the ink\n * colour so it reads in light and dark themes; the core keeps the brand blue\n * (#2563EB). Not a section icon — it never gets a color state.\n */\nexport function VerseMark(props: IconProps) {\n const { size = 20, ...rest } = props;\n return (\n <svg viewBox=\"54 67 146 124\" width={size} height={size} aria-hidden=\"true\" focusable=\"false\" {...rest}>\n <path fill=\"currentColor\" d=\"M106 76H123V115H100L113 154L99 179H72L59 156Z M130 76H147L194 156L181 179H154L140 154L153 115H130Z\" />\n <path fill=\"#2563EB\" d=\"M110 121H143L133 152H120Z\" />\n </svg>\n );\n}\n\n/** Command — the morning read: a dashboard of unequal panes. */\nexport function CommandIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <rect x=\"2.5\" y=\"2.5\" width=\"5\" height=\"6\" rx=\"1\" />\n <rect x=\"8.5\" y=\"2.5\" width=\"5\" height=\"3.5\" rx=\"1\" />\n <rect x=\"8.5\" y=\"7.5\" width=\"5\" height=\"6\" rx=\"1\" />\n <rect x=\"2.5\" y=\"10\" width=\"5\" height=\"3.5\" rx=\"1\" />\n </Icon>\n );\n}\n\n/** Fleet — lanes of work, each with its runner (the live swimlane). */\nexport function FleetIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M2.5 4.5h5M2.5 8h9M2.5 11.5h3.5\" />\n <circle cx=\"10\" cy=\"4.5\" r=\"1.3\" />\n <circle cx=\"13.2\" cy=\"8\" r=\"1.3\" />\n <circle cx=\"8.5\" cy=\"11.5\" r=\"1.3\" />\n </Icon>\n );\n}\n\n/** Growth — a trend that climbs. */\nexport function GrowthIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M2.5 12.5 6.5 8.5l2.5 2.5 4.5-5\" />\n <path d=\"M10.5 6h3v3\" />\n </Icon>\n );\n}\n\n/** Mind — the Leader's thinking: a lit bulb. */\nexport function MindIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <path d=\"M8 2.5a4 4 0 0 0-2.4 7.2c.3.25.4.6.4 1v.8h4v-.8c0-.4.1-.75.4-1A4 4 0 0 0 8 2.5Z\" />\n <path d=\"M6.5 13.5h3\" />\n </Icon>\n );\n}\n\n/** Agents — a board of cards in columns (the attention board, ⌘6). */\nexport function AgentsIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <rect x=\"2\" y=\"2.5\" width=\"3.4\" height=\"11\" rx=\"1\" />\n <rect x=\"6.3\" y=\"2.5\" width=\"3.4\" height=\"7\" rx=\"1\" />\n <rect x=\"10.6\" y=\"2.5\" width=\"3.4\" height=\"9\" rx=\"1\" />\n </Icon>\n );\n}\n\n/** The gear tray (Settings, Apps, Usage, Shortcuts). */\nexport function GearIcon(props: IconProps) {\n return (\n <Icon {...props}>\n <circle cx=\"8\" cy=\"8\" r=\"2.1\" />\n <path d=\"M8 1.8v1.7M8 12.5v1.7M14.2 8h-1.7M3.5 8H1.8M12.4 3.6l-1.2 1.2M4.8 11.2l-1.2 1.2M12.4 12.4l-1.2-1.2M4.8 4.8 3.6 3.6\" />\n <circle cx=\"8\" cy=\"8\" r=\"4.4\" />\n </Icon>\n );\n}\n\n/** Needs you — the one inbox (⌘J). */\nexport const NeedsYouIcon = IconInbox;\n\n/** The rail sections' glyphs (SECTION_ICON in verse-icons.tsx adds the tray's). */\nexport const RAIL_ICON: Readonly<Partial<Record<VerseSectionId, ComponentType<IconProps>>>> = {\n command: CommandIcon,\n fleet: FleetIcon,\n growth: GrowthIcon,\n mind: MindIcon,\n chat: ChatIcon,\n agents: AgentsIcon,\n};\n","import { sectionEntry } from '../verse-ui-store.js';\nimport type { WorkbenchSectionId } from '../../../../core/verse/workbench-types.js';\n\n/** Intent describes the view, never a permission or a fleet activation. */\nexport type WorkMode = 'with-me' | 'for-me';\n\nexport const WORK_MODES = [\n { id: 'with-me', label: 'Work with me', section: 'chat', description: 'Talk, ask questions, and guide a chat.' },\n { id: 'for-me', label: 'Work for me', section: 'fleet', description: 'Give agents tasks and manage the fleet.' },\n] as const;\n\nexport function workModeForSection(section: WorkbenchSectionId): WorkMode | null {\n if (section === 'chat') return 'with-me';\n // The existing rail groups delegated work; shared tools live in the tray.\n if (sectionEntry(section).placement === 'rail') return 'for-me';\n // Shared tools belong to either intent. A settings visit is not a mode change.\n return null;\n}\n\nexport function workModeSection(mode: WorkMode): 'chat' | 'fleet' {\n return mode === 'with-me' ? 'chat' : 'fleet';\n}\n","/**\n * routes/verse/VerseApp.tsx — the Verse 3.10 workbench shell (unit C1;\n * SPEC-310C §1, SPEC-310B §6).\n *\n * [rail] Command ⌘1 · Fleet ⌘2 · Growth ⌘3 · Mind ⌘4 · Chat ⌘5\n * foot: Needs you (⌘J) · the scarcest seat's capacity ring · ⚙ tray\n * [main] the current surface, with up to three recent surfaces (and Chat,\n * once visited) kept MOUNTED behind it — hidden + inert\n * [dock] the Resources drawer when PINNED (3.11 C6): a third grid track\n * that shrinks [main]. Unpinned it floats over the surface, opened\n * from the right-edge tab, the rail, ⌘. or ⌘K \"Open Resources\".\n * overlays ⌘K palette · ⌘J Needs-you drawer · ⌘/ shortcuts · the guard\n *\n * KEEP-ALIVE. Switching surfaces used to unmount the one you left: the\n * approvals selection, the autonomy scroll and the chat's streams were\n * rebuilt every time. Now a left surface stays mounted, `hidden` (no paint,\n * no layout) and `inert` (no focus, no clicks, out of the accessibility\n * tree), inside a SectionVisibilityProvider that tells its polls to stop\n * (C0's usePollWhileVisible). Coming back is instant and exactly where you\n * were. The list is bounded (verse-ui-store KEEP_ALIVE_SURFACES).\n *\n * KEYS come from C0's command catalog — the shell handles the GLOBAL ones\n * (surfaces, palette, drawer, shortcuts, history, recent chats, rail labels,\n * new chat, theme) through the command bus, so the palette, the native menu\n * and a key press all run the same handler. Chat and composer keys belong to\n * C2 / C3 and are never bound here. While the palette is open it owns every\n * key; while a dialog the shell did not open is up (a confirmation, the\n * token prompt, New chat), global keys stand down.\n *\n * SECTIONS resolve through `shell/section-modules.ts`'s glob, one lazy chunk\n * each; a surface whose module has not landed shows a designed \"not in this\n * build\" state (no source paths), and Fleet falls back to the legacy Autonomy\n * panels until C7 lands its own.\n *\n * NATIVE (C8). The desktop app's menu, tray, clicked notifications and the\n * system-wide hotkey arrive through app/desktop-shell.ts\n * `subscribeShellCommands` — the one web seam to the desktop app — already\n * parsed by the catalog: `open-needs-you`, `new-chat`, `focus-composer`,\n * `open-session:<id>`, `open-terminal:<tab>[/<block>]` (and the 3.9 menu's\n * two). Every pointer at a terminal tab — that command, a `?terminal=` link,\n * a `verse://terminal/…` link in chat, a Needs-you row — arrives as one\n * request (shell/open-terminal-request.ts) served by a lazy chunk. Anchors (\"go to that card\")\n * arrive as VERSE_ANCHOR_EVENT and are revealed by shell/reveal-anchor.ts\n * (listened for by shell/anchor-requests.ts).\n */\nimport { Suspense, lazy, useEffect, useMemo, useRef, useState, type ComponentType } from 'react';\nimport { reportThemeToShell, subscribeShellCommands } from '../../app/desktop-shell.js';\nimport { RouteErrorBoundary } from '../../components/primitives/RouteErrorBoundary.js';\nimport { Tooltip } from '../../components/primitives/Tooltip.js';\nimport { useToast } from '../../components/primitives/Toast.js';\nimport { getMutationToken } from '../../data/auth-store.js';\nimport { queryGateStats } from '../../data/cache.js';\nimport { apiPost } from '../../data/client.js';\nimport { useTheme } from '../../data/hooks.js';\nimport { VERSE_ACTIVITY_SEEN_PATH, type VerseActivityCompletion } from '../../../core/verse/workbench-types.js';\nimport { useResourcesUi } from './resources/resources-store.js';\nimport { commandChord, detectKeyPlatform, formatChord, matchKey } from './shell/command-keys.js';\nimport { useGuardState } from './shell/guard-store.js';\nimport type { RailBadge } from './shell/RailStatus.js';\nimport { subscribeAnchorRequests } from './shell/anchor-requests.js';\nimport { executeCatalogCommand, useShellCommands } from './shell/run-command.js';\nimport { SectionVisibilityProvider } from './shell/section-visibility.js';\nimport { SECTION_MODULES, sectionImporter } from './shell/section-modules.js';\nimport { SurfaceNotInBuild, SurfaceSkeleton } from './shell/skeletons.js';\nimport { onActivityCompletions, useActivity } from './shell/useActivity.js';\nimport { useViewport } from './shell/viewport.js';\nimport type { WarmupOptions } from './shell/warmup.js';\nimport { useVerseUi } from './useVerseUi.js';\nimport { useFocusMode } from './shell/focus-mode.js';\nimport { openPaneInChat } from './dock/dock-store.js';\n// Only the event name: validation and the handler are the lazy open-terminal chunk.\nimport { VERSE_OPEN_TERMINAL_EVENT } from './shell/open-terminal-event.js';\n// rail-icons, not verse-icons: only the rail's glyphs belong in first paint.\nimport { GearIcon, NeedsYouIcon, RAIL_ICON, VerseMark } from './rail-icons.js';\nimport {\n acknowledgeChatMoved,\n closeVerseOverlay,\n getVerseUiState,\n landedModule,\n openVerseSession,\n RAIL_SECTIONS,\n sectionEntry,\n setVerseSection,\n VERSE_ANCHOR_EVENT,\n VERSE_SECTIONS,\n type VerseSectionId,\n} from './verse-ui-store.js';\nimport styles from './VerseApp.module.css';\nimport { usedPercentText } from './percent-text.js';\nimport { WORK_MODES, workModeForSection } from './shell/work-mode.js';\n\nexport { SECTION_MODULES };\n\n/**\n * The designed state for a surface whose module has not landed. Exported so\n * it can be tested directly (which surfaces exist changes as owners land).\n */\nexport function MissingSection({ label, blurb }: { label: string; blurb?: string }) {\n return <SurfaceNotInBuild label={label} blurb={blurb ?? ''} />;\n}\n\n/**\n * Resolve one section to a lazy component: the primary module, else its\n * fallback, else the designed missing state. A module that throws while\n * loading is logged to the console (never printed to the operator: messages\n * can carry paths) and shown as missing, never as a torn-down shell.\n */\nfunction sectionLoader(id: VerseSectionId): () => Promise<{ default: ComponentType }> {\n const entry = sectionEntry(id);\n return async () => {\n const module = landedModule(id);\n const importer = module ? sectionImporter(module) : undefined;\n if (module && importer) {\n try {\n const mod = (await importer()) as Record<string, unknown>;\n const exported = mod[module] ?? mod.default;\n if (typeof exported === 'function') return { default: exported as ComponentType };\n console.error(`[verse] ${module} exports no ${module} component`);\n } catch (err) {\n console.error(`[verse] ${entry.label} failed to load`, err);\n }\n }\n const { SECTION_BLURBS } = await import('./section-blurbs.js');\n return { default: () => <MissingSection label={entry.label} blurb={SECTION_BLURBS[id]} /> };\n };\n}\n\n/** One load per section for the life of the tab — shared by its lazy component and the idle prefetch. */\nconst sectionLoads = new Map<VerseSectionId, Promise<{ default: ComponentType }>>();\n/** Sections whose module has arrived, mounted directly (no Suspense round-trip, so no skeleton frame). */\nconst loadedSections = new Map<VerseSectionId, ComponentType>();\n\nfunction loadSection(id: VerseSectionId): Promise<{ default: ComponentType }> {\n let load = sectionLoads.get(id);\n if (!load) {\n load = sectionLoader(id)().then((mod) => {\n loadedSections.set(id, mod.default);\n return mod;\n });\n sectionLoads.set(id, load);\n }\n return load;\n}\n\n/** One lazy component per section, for the life of the tab. */\nconst SECTION_COMPONENTS = new Map<VerseSectionId, ComponentType>(\n VERSE_SECTIONS.map((s) => [s.id, lazy(() => loadSection(s.id))] as const),\n);\n\n// ---------------------------------------------------------------------------\n// Off the first-paint path (review 3.10 d1)\n// ---------------------------------------------------------------------------\n//\n// WHY: every module this file imports statically is in the chunk a cold chat\n// paint must download and parse before anything shows (SPEC-310A §1: chat\n// critical JS ≤ 350 KB, SPEC-310C \"xterm, the charts and the palette each load\n// as separate lazy chunks\"). The overlays render only while open, onboarding\n// only on a first run, and the rail's badges and capacity ring only once the\n// activity / capacity reads answer — none of them can draw anything at first\n// paint, so none of them may cost first-paint bytes. Each is its own chunk,\n// fetched after first paint (the overlays on idle, below) so ⌘K still opens\n// without a visible wait.\n\nconst importPalette = () => import('./shell/CommandPalette.js');\nconst importDrawer = () => import('./shell/NeedsYouDrawer.js');\nconst importShortcuts = () => import('./shell/ShortcutsOverlay.js');\nconst importGearTray = () => import('./shell/GearTray.js');\n// The first-run tour's store and its flow: the gate reads the one and loads the other.\nconst importOnboarding = () => import('./onboarding/OnboardingGate.js');\nconst importRailStatus = () => import('./shell/RailStatus.js');\nconst importWarmup = () => import('./shell/warmup.js');\n// Resources (3.11 C6): the edge tab, rail button, ⌘. handler and the drawer\n// (itself a further chunk) — see resources/ResourcesChrome.tsx for why.\nconst importResources = () => import('./resources/ResourcesChrome.js');\n\nconst CommandPalette = lazy(() => importPalette().then((m) => ({ default: m.CommandPalette })));\nconst NeedsYouDrawer = lazy(() => importDrawer().then((m) => ({ default: m.NeedsYouDrawer })));\nconst ShortcutsOverlay = lazy(() => importShortcuts().then((m) => ({ default: m.ShortcutsOverlay })));\nconst GearTray = lazy(() => importGearTray().then((m) => ({ default: m.GearTray })));\nconst ReviewMenu = lazy(() => import('./shell/ReviewMenu.js'));\nconst OnboardingGate = lazy(() => importOnboarding().then((m) => ({ default: m.OnboardingGate })));\nconst ResourcesChrome = lazy(() => importResources().then((m) => ({ default: m.ResourcesChrome })));\nconst ResourcesRailButton = lazy(() => importResources().then((m) => ({ default: m.ResourcesRailButton })));\nconst ResourcesBar = lazy(() => importResources().then((m) => ({ default: m.ResourcesBar })));\n// Dictation's floating pill (voice/VoiceHud): its own chunk, fetched only\n// where dictation can exist (the desktop shell's voice bridge, or a browser\n// with the Web Speech API). Renders nothing until someone dictates.\nconst VoiceHud = lazy(() => import('./voice/VoiceHud.js'));\nfunction dictationPossible(): boolean {\n try {\n const w = window as unknown as { __ASHLR_DESKTOP__?: { voice?: unknown }; SpeechRecognition?: unknown; webkitSpeechRecognition?: unknown };\n return Boolean(w.__ASHLR_DESKTOP__?.voice || w.SpeechRecognition || w.webkitSpeechRecognition);\n } catch {\n return false;\n }\n}\n\n// Computer use (3.15 P4): the relay poller, access / confirmation sheets and\n// the control pill. Desktop-only, so a browser tab never even fetches it.\nconst importComputer = () => import('./computer/ComputerControl.js');\nconst ComputerControl = lazy(() => importComputer().then((m) => ({ default: m.ComputerControl })));\n// Confirmation UI is needed only after a guarded action; its store is still\n// available immediately to palette and drawer actions.\nconst GuardHost = lazy(() => import('./shell/guarded-action.js').then((m) => ({ default: m.GuardHost })));\n\n/**\n * Does this shell implement computer use on this platform? The same test as\n * computer/native-computer.ts `hasNativeComputer`, inlined so first paint\n * does not carry that module; ComputerControl re-checks with the real one.\n */\nfunction shellSupportsComputerUse(): boolean {\n const bridge = (window as unknown as { __ASHLR_DESKTOP__?: { computer?: { version?: unknown; send?: unknown; capabilities?: { supported?: unknown } } } }).__ASHLR_DESKTOP__?.computer;\n return typeof bridge?.version === 'number' && bridge.version >= 1 && typeof bridge.send === 'function' && bridge.capabilities?.supported === true;\n}\n\n/**\n * The after-first-paint warm-up (shell/warmup.ts): the overlay chunks, then\n * each rail surface not yet open — its chunk (the same load its lazy\n * component uses, so the first visit mounts it directly) and the reads it\n * opens with — one piece at a time, and only while the operator is idle: no\n * input for a quiet period and none of their reads in flight.\n *\n * The scheduler and the step list are a lazy chunk; this trigger is all the\n * warm-up costs chat first paint. Returns a cancel (called on unmount; safe\n * before the chunk has even arrived).\n */\nexport function prefetchAfterFirstPaint(options?: WarmupOptions): () => void {\n const readsInFlight = () => {\n const gate = queryGateStats();\n return gate.active + gate.queued > 0;\n };\n let live = true;\n let cancel: (() => void) | null = null;\n void importWarmup().then(\n (m) => {\n if (live) cancel = m.warmUpAfterFirstPaint({ loadSection, overlays: [importPalette, importDrawer, importShortcuts, () => importResources().then((r) => r.preloadResourcesDrawer())], readsInFlight }, options);\n },\n () => undefined,\n );\n return () => {\n live = false;\n cancel?.();\n };\n}\n\ntype RailStatusModule = typeof import('./shell/RailStatus.js');\nlet railStatusModule: RailStatusModule | null = null;\n\n/**\n * The rail badge / capacity module, loaded after first paint. RailStatus\n * pulls the usage contract and capacity-strip model (~30 KB) for the ring;\n * the badges it draws depend on the activity read, which is not back at first\n * paint either, so waiting for the module costs nothing visible. Null until\n * loaded — the rail then draws no badge, which RailStatus already defines as\n * \"not known yet\", never \"zero\".\n */\nfunction useRailStatusModule(): RailStatusModule | null {\n const [mod, setMod] = useState<RailStatusModule | null>(railStatusModule);\n useEffect(() => {\n if (mod) return undefined;\n let alive = true;\n void importRailStatus().then(\n (m) => {\n railStatusModule = m;\n if (alive) setMod(m);\n },\n (err) => console.error('[verse] rail status failed to load', err),\n );\n return () => {\n alive = false;\n };\n }, [mod]);\n return mod;\n}\n\n/** A dialog the shell did not open (a confirmation, the token prompt, New chat) is up. */\nfunction foreignModalOpen(): boolean {\n return [...document.querySelectorAll('[aria-modal=\"true\"]')].some(\n (el) => !el.hasAttribute('data-verse-overlay') && !el.querySelector('[data-verse-overlay]'),\n );\n}\n\nconst COMPLETION_TOAST_LIMIT = 3;\n\n/**\n * Open a chat (or just the Chat surface) and, optionally, a pane in its\n * panel area — the one path for URL deep links and the desktop's\n * `open-pane:` command. The pane opens once that chat IS the open one, so it\n * lands in that chat's remembered layout, not the one being left.\n */\nfunction openWorkbenchLink(sessionId: string | null, paneId: string | null): void {\n closeVerseOverlay();\n if (sessionId) openVerseSession(sessionId);\n else setVerseSection('chat');\n if (paneId) openPaneInChat(paneId, sessionId);\n}\n\nexport function VerseApp() {\n const guardOpen = useGuardState().request !== null;\n const ui = useVerseUi();\n const theme = useTheme();\n const toast = useToast();\n const activity = useActivity();\n const { compact } = useViewport();\n const platform = useMemo(() => detectKeyPlatform(), []);\n const gearRef = useRef<HTMLButtonElement>(null);\n const [trayOpen, setTrayOpen] = useState(false);\n const reviewRef = useRef<HTMLButtonElement>(null);\n const [reviewOpen, setReviewOpen] = useState(false);\n const [voiceHud] = useState(dictationPossible);\n const data = activity.data;\n const rail = useRailStatusModule();\n const resources = useResourcesUi();\n // Focus mode (⇧⌘F) is the chat's: the rail steps aside only on the Chat surface.\n const focus = useFocusMode() && ui.section === 'chat';\n const [computerUse] = useState(shellSupportsComputerUse);\n useEffect(() => { setReviewOpen(false); }, [ui.section, ui.overlay]);\n useEffect(() => { if (trayOpen) setReviewOpen(false); }, [trayOpen]);\n\n useEffect(() => prefetchAfterFirstPaint(), []);\n // The gear tray is fetched right after mount (not on idle) and then stays\n // MOUNTED closed, exactly as before it was split out: its open effect\n // schedules the first item's focus on a frame, and mounting it only on the\n // click shifted that frame behind the operator's first arrow key.\n const [gearReady, setGearReady] = useState(false);\n useEffect(() => {\n let alive = true;\n void importGearTray().then(\n () => { if (alive) setGearReady(true); },\n (err) => console.error('[verse] settings tray failed to load', err),\n );\n return () => { alive = false; };\n }, []);\n\n // ── the global commands the shell serves, and run-command's toasts ─────\n useShellCommands();\n\n // ── global keys ─────────────────────────────────────────────────────────\n useEffect(() => {\n function onKey(event: KeyboardEvent) {\n if (event.defaultPrevented) return;\n if (getVerseUiState().overlay === 'palette') return;\n if (foreignModalOpen()) return;\n const command = matchKey(event, ['global']);\n if (!command) return;\n // preventDefault BEFORE running: the chat's key fallback and the\n // transcript's ⌥↑/⌥↓ skip default-prevented events (C2), which is what\n // keeps one press from running two handlers. stopPropagation is not\n // used — other listeners still see the event, they just know it is taken.\n event.preventDefault();\n executeCatalogCommand(command.id, { via: 'key' });\n }\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, []);\n\n // ── the desktop shell: menu, tray, notifications, hotkey ────────────────\n useEffect(\n () =>\n subscribeShellCommands((command) => {\n if (command.kind === 'open-session') {\n closeVerseOverlay();\n openVerseSession(command.sessionId);\n return;\n }\n if (command.kind === 'open-pane') {\n openWorkbenchLink(command.sessionId, command.paneId);\n return;\n }\n if (command.kind === 'open-terminal') {\n window.dispatchEvent(new CustomEvent(VERSE_OPEN_TERMINAL_EVENT, { detail: { tabId: command.tabId, blockId: command.blockId } }));\n return;\n }\n // The tray's \"New chat\" and the hotkey's \"focus the composer\" must\n // land in the composer: an open palette or shortcuts sheet would keep\n // focus (and every key) for itself. The drawer opener, the theme and\n // Settings leave overlays alone — open-needs-you REPLACES the overlay.\n if (command.name === 'new-chat' || command.name === 'focus-composer') closeVerseOverlay();\n executeCatalogCommand(command.commandId, { via: 'menu' });\n }),\n [],\n );\n // \"Open this terminal tab\", from wherever (see the header): the handler —\n // the tab's chat, the Terminal pane, the block — is its own chunk.\n useEffect(() => {\n function onRequest(event: Event): void {\n const request: unknown = (event as CustomEvent<unknown>).detail;\n void import('./shell/open-terminal.js').then(\n ({ openTerminalTarget }) => openTerminalTarget(request, { toast: toast.show }),\n (err) => console.error('[verse] terminal link failed to load', err),\n );\n }\n window.addEventListener(VERSE_OPEN_TERMINAL_EVENT, onRequest);\n return () => window.removeEventListener(VERSE_OPEN_TERMINAL_EVENT, onRequest);\n }, [toast]);\n // A link into the workbench (?chat=…&pane=…, ?terminal=…&block=…): opened\n // once, then stripped from the address bar. The parser loads only when the\n // URL carries one.\n useEffect(() => {\n if (typeof window === 'undefined' || !/[?&](?:chat|pane|terminal)=/.test(window.location.search)) return;\n void import('./shell/deep-link.js').then(({ consumeDeepLink }) => {\n const link = consumeDeepLink();\n if (link?.terminal) window.dispatchEvent(new CustomEvent(VERSE_OPEN_TERMINAL_EVENT, { detail: { ...link.terminal, sessionId: link.sessionId } }));\n else if (link) openWorkbenchLink(link.sessionId, link.paneId);\n }, () => undefined);\n }, []);\n // \"Go to that card\": whoever raises it (drawer, Command, Mind), the shell reveals it.\n useEffect(() => subscribeAnchorRequests(VERSE_ANCHOR_EVENT), []);\n // Report the PAINTED theme so the native window pre-paints its background\n // on the next cold launch instead of flashing white. No-op in a browser.\n useEffect(() => { reportThemeToShell(theme.theme); }, [theme.theme]);\n\n // ── one-time announcements ──────────────────────────────────────────────\n useEffect(() => {\n if (!ui.announceChatMoved) return;\n const chat = commandChord('surface.chat');\n toast.show(`Chat moved to ${chat ? formatChord(chat, platform) : '⌘5'} — Command, Fleet, Growth and Mind come first now.`);\n acknowledgeChatMoved();\n }, [ui.announceChatMoved, toast, platform]);\n\n // ── in-app \"Finished / Failed\" (the window is visible; C8 notifies when it is not) ─\n useEffect(\n () =>\n onActivityCompletions((batch: VerseActivityCompletion[]) => {\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') return;\n const s = getVerseUiState();\n const news = batch.filter((c) => !(s.section === 'chat' && s.activeSessionId === c.sessionId));\n const failed = news.filter((c) => c.outcome === 'failed');\n for (const c of failed.slice(0, COMPLETION_TOAST_LIMIT)) toast.show(`Failed: ${c.title}`, 'danger');\n const done = news.filter((c) => c.outcome === 'ok');\n if (done.length > COMPLETION_TOAST_LIMIT) toast.show(`${done.length} chats finished.`, 'success');\n else for (const c of done) toast.show(`Finished: ${c.title}`, 'success');\n }),\n [toast],\n );\n\n // ── Mind's dot clears when Mind is opened ───────────────────────────────\n const [mindSeenLocal, setMindSeenLocal] = useState<string | null>(null);\n const latestMemoAt = data?.mind?.latestMemoAt ?? null;\n useEffect(() => {\n if (ui.section !== 'mind' || !data?.mind?.unseen || !latestMemoAt) return;\n setMindSeenLocal(latestMemoAt);\n // Best-effort on the server too (it needs a held token; reading Mind is\n // not worth a token prompt — the local mark already clears the dot).\n const token = getMutationToken();\n if (token) void apiPost<unknown>(VERSE_ACTIVITY_SEEN_PATH, { surface: 'mind' }, token).catch(() => undefined);\n }, [ui.section, data?.mind?.unseen, latestMemoAt]);\n\n const expanded = ui.railExpanded && !compact;\n const needsYouCount = data ? data.counts.needsYou : null;\n // Settings, Apps & Accounts and Usage open from the gear, so on those pages\n // the gear IS the current rail item — for assistive tech too (aria-current,\n // and the page's name, since one gear stands for three pages), not only\n // through the data-active styling.\n const currentPage = sectionEntry(ui.section);\n const gearPage = currentPage.placement === 'tray' ? currentPage : null;\n const BadgeMark = rail?.RailBadgeMark ?? null;\n const shortcut = (id: string) => {\n const chord = commandChord(id);\n return chord ? formatChord(chord, platform) : undefined;\n };\n\n return (\n <div\n className={styles.shell}\n data-rail={expanded ? 'expanded' : 'collapsed'}\n data-compact={compact || undefined}\n data-resources={resources.open && resources.pinned && !compact ? 'docked' : undefined}\n data-focus={focus ? 'on' : undefined}\n >\n <nav className={styles.rail} data-rail={expanded ? 'expanded' : 'collapsed'} aria-label=\"Verse sections\">\n {/*\n Desktop shell: the window's top 48px is overlaid by the OS title bar\n and the traffic lights. The rail clears it in CSS; this strip makes\n the cleared space drag the window. 0px tall in a browser, where\n `--app-titlebar-height` is not set. See desktop/README.md.\n */}\n <span className={styles.railDragStrip} data-app-region=\"drag\" aria-hidden=\"true\" />\n <Tooltip label=\"Ashlr Verse\" placement=\"right\" disabled={expanded}>\n <span className={styles.mark}>\n <VerseMark />\n <span className=\"visually-hidden\">Ashlr Verse</span>\n </span>\n </Tooltip>\n <ul className={styles.railList}>\n {RAIL_SECTIONS.map((entry) => {\n const IconComponent = RAIL_ICON[entry.id];\n // Mind's dot also clears on sight in THIS window, whether or not\n // the server-side mark could be written (it needs a held token).\n const mindSeenHere = entry.id === 'mind' && latestMemoAt !== null && mindSeenLocal === latestMemoAt;\n const badge: RailBadge | null = mindSeenHere || !rail ? null : rail.railBadgeFor(entry.id, data);\n const active = ui.section === entry.id;\n const keys = shortcut(`surface.${entry.id}`);\n return (\n <li key={entry.id}>\n {/* The name stays on the button; badges ride it so they are announced, not just drawn. */}\n <Tooltip label={entry.label} shortcut={keys} placement=\"right\" disabled={expanded || compact}>\n <button\n type=\"button\"\n className={styles.railButton}\n aria-current={active ? 'page' : undefined}\n data-section={entry.id}\n aria-label={`${entry.label}${badge?.spoken ?? ''}`}\n onClick={() => setVerseSection(entry.id)}\n >\n <span className={styles.railIcon}>\n {IconComponent ? <IconComponent /> : null}\n {badge && BadgeMark ? <BadgeMark badge={badge} /> : null}\n </span>\n {expanded || compact ? <span className={styles.railLabel}>{entry.label}</span> : null}\n {expanded && keys ? <span className={styles.railKey} aria-hidden=\"true\">{keys}</span> : null}\n </button>\n </Tooltip>\n </li>\n );\n })}\n </ul>\n <div className={styles.railFoot}>\n <Tooltip label=\"Needs you\" shortcut={shortcut('needs-you.open')} placement=\"right\" disabled={expanded || compact}>\n <button\n type=\"button\"\n className={styles.railButton}\n aria-label={needsYouCount === null ? 'Needs you' : `Needs you, ${needsYouCount}`}\n aria-expanded={ui.overlay === 'needs-you'}\n data-needs-you={needsYouCount ?? undefined}\n onClick={() => executeCatalogCommand('needs-you.open', { via: 'button' })}\n >\n <span className={styles.railIcon}>\n <NeedsYouIcon />\n {needsYouCount && BadgeMark ? <BadgeMark badge={{ kind: 'count', count: needsYouCount, spoken: '', tone: 'warning' }} /> : null}\n </span>\n {expanded || compact ? <span className={styles.railLabel}>{compact ? 'Inbox' : 'Needs you'}</span> : null}\n </button>\n </Tooltip>\n {compact ? null : (\n <Suspense fallback={null}>\n <ResourcesRailButton expanded={expanded} buttonClass={styles.railButton} iconClass={styles.railIcon} labelClass={styles.railLabel} />\n </Suspense>\n )}\n {/* 3.11.1: the always-on resource bar (logos + batteries) replaces the\n single capacity ring while it is on; off brings the ring back. */}\n {compact ? null : resources.bar ? (\n <Suspense fallback={null}>\n <ResourcesBar expanded={expanded} />\n </Suspense>\n ) : rail ? <RailCapacityButton rail={rail} expanded={expanded} /> : null}\n <Tooltip label=\"Settings and more\" placement=\"right\" disabled={expanded || compact || trayOpen}>\n <button\n ref={gearRef}\n type=\"button\"\n className={styles.railButton}\n aria-label={gearPage ? `Settings and more (${gearPage.label} open)` : 'Settings and more'}\n aria-haspopup=\"menu\"\n aria-expanded={trayOpen}\n aria-current={gearPage ? 'page' : undefined}\n data-gear\n data-active={gearPage ? true : undefined}\n onClick={() => setTrayOpen((v) => !v)}\n >\n <span className={styles.railIcon}><GearIcon /></span>\n {expanded || compact ? <span className={styles.railLabel}>{compact ? 'More' : 'Settings'}</span> : null}\n </button>\n </Tooltip>\n </div>\n </nav>\n\n {/*\n The ONE <main id=\"main-content\"> for the whole shell (SkipToContent\n focuses it). Every mounted surface lives inside it; only the current\n one is visible.\n */}\n <main className={styles.section} data-section={ui.section} id=\"main-content\" tabIndex={-1}>\n <div className={styles.workModes}>\n <nav className={styles.workModeChoices} aria-label=\"How you work\">\n {WORK_MODES.map((mode) => (\n <button key={mode.id} type=\"button\" className={styles.workMode}\n aria-pressed={workModeForSection(ui.section) === mode.id} title={mode.description}\n onClick={() => setVerseSection(mode.section)}>\n {mode.label}\n </button>\n ))}\n </nav>\n <button ref={reviewRef} type=\"button\" className={`${styles.workMode} ${styles.reviewButton}`} aria-haspopup=\"menu\" aria-expanded={reviewOpen}\n onClick={() => { setTrayOpen(false); setReviewOpen((open) => !open); }}\n onKeyDown={(event) => {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') { event.preventDefault(); setTrayOpen(false); setReviewOpen(true); }\n if (event.key === 'Escape') { event.preventDefault(); setReviewOpen(false); }\n }}>Review</button>\n </div>\n {ui.mounted.map((id) => (\n <SurfaceHost key={id} id={id} active={id === ui.section} />\n ))}\n </main>\n\n {/* Lazy chunks (see \"Off the first-paint path\"); each mounts only while it can draw. */}\n <Suspense fallback={null}>\n {gearReady || trayOpen ? <GearTray open={trayOpen} anchorRef={gearRef} onClose={() => setTrayOpen(false)} compact={compact} /> : null}\n </Suspense>\n <Suspense fallback={null}>\n {reviewOpen && reviewRef.current ? <ReviewMenu anchor={reviewRef.current} onClose={() => setReviewOpen(false)} /> : null}\n </Suspense>\n <Suspense fallback={null}>\n <ResourcesChrome compact={compact} />\n </Suspense>\n <Suspense fallback={null}>\n {ui.overlay === 'palette' ? <CommandPalette /> : null}\n {ui.overlay === 'needs-you' ? <NeedsYouDrawer /> : null}\n {ui.overlay === 'shortcuts' ? <ShortcutsOverlay /> : null}\n </Suspense>\n {voiceHud ? <Suspense fallback={null}><VoiceHud /></Suspense> : null}\n {guardOpen ? <Suspense fallback={null}><GuardHost /></Suspense> : null}\n {computerUse ? (\n <Suspense fallback={null}>\n <ComputerControl />\n </Suspense>\n ) : null}\n {/*\n First run only, outside the surfaces: a docked card, not a modal, so\n the rail and the surface stay usable while it is open.\n */}\n <Suspense fallback={null}><OnboardingGate /></Suspense>\n </div>\n );\n}\n\n/**\n * The rail foot's capacity ring for the scarcest seat. Its own component so\n * `useRailCapacity` (a hook from the lazily loaded RailStatus module) is only\n * called once that module is here, always in the same place.\n */\nfunction RailCapacityButton({ rail, expanded }: { rail: RailStatusModule; expanded: boolean }) {\n const capacity = rail.useRailCapacity();\n if (!capacity) return null;\n const { CapacityRing, describeRailCapacity } = rail;\n return (\n <Tooltip label={describeRailCapacity(capacity)} placement=\"right\" disabled={expanded}>\n <button\n type=\"button\"\n className={styles.railButton}\n aria-label={`Capacity — ${describeRailCapacity(capacity)}`}\n data-capacity={Math.round(capacity.usedPercent)}\n onClick={() => setVerseSection('apps', `seat:${capacity.seatId}`)}\n >\n <span className={styles.railIcon}>\n <CapacityRing badge={capacity} />\n </span>\n {expanded ? (\n <span className={styles.railLabel}>\n {capacity.label} {capacity.limitReached ? 'limit' : usedPercentText(capacity.usedPercent)}\n </span>\n ) : null}\n </button>\n </Tooltip>\n );\n}\n\nfunction SurfaceHost({ id, active }: { id: VerseSectionId; active: boolean }) {\n // A section the idle prefetch already loaded mounts directly: React.lazy\n // would still suspend once on its first render — even with the module in\n // hand — and commit the skeleton, the very flash the prefetch exists to\n // remove. Chosen ONCE per host, so a load that lands while this surface is\n // up never swaps the component type under it (that would remount the\n // surface and drop its state).\n const [Section] = useState<ComponentType>(() => loadedSections.get(id) ?? SECTION_COMPONENTS.get(id)!);\n const entry = sectionEntry(id);\n return (\n <div className={styles.surface} data-surface={id} hidden={!active} inert={!active}>\n <SectionVisibilityProvider visible={active}>\n <RouteErrorBoundary resetKey={id}>\n <Suspense fallback={<SurfaceSkeleton section={id} label={entry.label} />}>\n <Section />\n </Suspense>\n </RouteErrorBoundary>\n </SectionVisibilityProvider>\n </div>\n );\n}\n","export default \"__VITE_ASSET__VRAku6fjghkApIISiBWPzg__\"","export default \"__VITE_ASSET__WPGYjwIlzWVNM1bYhOc83w__\"","/**\n * app/VerseConsoleApp.tsx — isolated bootstrap for /verse (pattern:\n * ResourcePoolConsoleApp). No global dashboard shell, router, or observer\n * stream: the read session is probed against /api/verse/bootstrap, host-\n * injected tokens (desktop wrapper) are adopted before that probe, and the\n * full-bleed VerseApp takes over once authenticated.\n *\n * V3.10 — first paint without a serial wait. The chunk of the section the\n * shell will mount (Chat, unless the operator left another one open) used to\n * start downloading only AFTER the bootstrap probe answered: index →\n * this module → probe → section chunk, one round trip after another. Now\n * this module starts that import the moment it evaluates, in parallel with\n * the probe (Vite shares the in-flight import with the lazy() that mounts\n * it later), and preloads the Latin font subsets the first paint needs (the\n * display face only once the signed-in app is what will paint).\n *\n * V3.10 — a restarted desktop sidecar is re-adopted at once. The desktop\n * shell restarts a crashed server in the background, hands the new tokens to\n * this page as `window.__ASHLR_TOKENS__` and fires `ashlr:sidecar-restarted`\n * (desktop/src-tauri/src/main.rs token_handoff_script). The old cookie died\n * with the old server, so without listening the page would sit until its\n * next 401 → failed renewal → SessionGate → adoption.\n */\nimport { lazy, Suspense, useEffect } from 'react';\nimport { ToastProvider } from '../components/primitives/Toast.js';\nimport { adoptInjectedTokens, markCheckComplete } from '../data/auth-store.js';\nimport { getQuerySnapshot, runQuery } from '../data/cache.js';\nimport { useAuthPhase } from '../data/hooks.js';\nimport { SECTION_MODULES, VerseApp } from '../routes/verse/VerseApp.js';\nimport { invalidateVerseLists, verseBootstrapQuery } from '../routes/verse/verse-queries.js';\nimport { getVerseUiState, VERSE_SECTIONS } from '../routes/verse/verse-ui-store.js';\nimport uiFontLatin from '../design/fonts/AshlrSans-latin.woff2?url';\nimport displayFontLatin from '../design/fonts/SpaceGrotesk-latin.woff2?url';\nimport { SkipToContent } from './SkipToContent.js';\nimport styles from './VerseConsoleApp.module.css';\nimport '../design/global.css';\n\n/**\n * Preload the Latin font subsets: the UI face always (every state's first\n * text is set in it), the display face (Space Grotesk: headings, numerals)\n * only when the signed-in app is what will paint. On the signed-out connect\n * screen the display face serves one heading, drawn only after the auth probe\n * answers and the gate's chunk arrives; preloaded at page start it routinely\n * sat unused past the browser's few-second window and drew \"preloaded but\n * not used\" in the console. Idempotent.\n */\nexport function preloadVerseFonts(doc: Document | null, display: boolean): void {\n if (!doc?.head) return;\n for (const href of display ? [uiFontLatin, displayFontLatin] : [uiFontLatin]) {\n const present = [...doc.head.querySelectorAll('link[rel=\"preload\"]')].some((l) => l.getAttribute('href') === href);\n if (present) continue;\n const link = doc.createElement('link');\n link.rel = 'preload';\n link.as = 'font';\n link.type = 'font/woff2';\n // Font preloads are CORS requests even same-origin; without this the\n // browser fetches the file twice.\n link.crossOrigin = 'anonymous';\n link.href = href;\n doc.head.append(link);\n }\n}\n\n/**\n * Start what the first paint will need, without waiting for the auth probe.\n * Everything here is a cache warm-up: a failure is ignored, because the real\n * mount (VerseApp's sectionLoader, the CSS @font-face) repeats the request\n * and owns the error handling.\n *\n * `signedIn` is the best guess available before the probe: the desktop shell\n * injected its tokens, so the chat is what paints. Otherwise the display face\n * waits for the authenticated phase (VerseConsoleApp below).\n */\nexport function preloadVerseFirstPaint(\n doc: Document | null = typeof document === 'undefined' ? null : document,\n signedIn: boolean = typeof window !== 'undefined' && window.__ASHLR_TOKENS__ !== undefined,\n): void {\n const section = VERSE_SECTIONS.find((s) => s.id === getVerseUiState().section);\n const importer = section ? SECTION_MODULES[`./sections/${section.module}.tsx`] : undefined;\n if (importer) void importer().catch(() => undefined);\n preloadVerseFonts(doc, signedIn);\n}\n\npreloadVerseFirstPaint();\n\n/**\n * The session gate is a dynamic import: a signed-in cold load (the common\n * case — the desktop shell injects its tokens) never draws it, and as a\n * static import it cost ~3 KB of chat first-paint critical JS (SPEC-310A §1).\n * `preloadSessionGate` starts the download while the auth probe is in flight,\n * so an unauthenticated answer finds the chunk already there instead of\n * paying a second round trip. Vite shares the in-flight import with lazy().\n */\nconst importSessionGate = () => import('../components/auth/SessionGate.js');\nconst SessionGate = lazy(() => importSessionGate().then((m) => ({ default: m.SessionGate })));\nfunction preloadSessionGate(): void {\n void importSessionGate().catch(() => undefined);\n}\n\n/** DOM event the desktop shell fires after handing a restarted sidecar's tokens to this page. */\nexport const SIDECAR_RESTARTED_EVENT = 'ashlr:sidecar-restarted';\n\n/**\n * Re-adopt host tokens whenever the desktop shell says its sidecar restarted.\n * Returns the disposer.\n *\n * Installed for the page's whole life, whatever the auth phase: the event may\n * land while the SessionGate is showing (adoption then replaces the prompt,\n * because establishReadSession flips the phase) or while the app looks\n * authenticated on a dead cookie. After a successful adoption the lists are\n * refetched — the restarted server may have marked turns interrupted — and\n * the live streams reconnect on their own: their next attempt now carries a\n * valid cookie. A failed adoption changes nothing; the ordinary 401 path\n * still ends at the SessionGate. The event carries no data, so a page script\n * firing it can at most make the page re-read tokens that are already there.\n */\nexport function listenForSidecarRestart(target: Pick<Window, 'addEventListener' | 'removeEventListener'> = window): () => void {\n let inFlight = false;\n let again = false;\n let disposed = false;\n const onRestart = (): void => {\n if (disposed) return;\n // Restarts in quick succession: adoption reads `window.__ASHLR_TOKENS__`\n // when it STARTS, so a second restart during an exchange left newer\n // tokens behind it. Run exactly once more after the current exchange\n // instead of racing a second one for the cookie.\n if (inFlight) {\n again = true;\n return;\n }\n inFlight = true;\n void adoptInjectedTokens()\n .then((adopted) => { if (adopted) invalidateVerseLists(); })\n .catch(() => undefined)\n .finally(() => {\n inFlight = false;\n if (again) {\n again = false;\n onRestart();\n }\n });\n };\n target.addEventListener(SIDECAR_RESTARTED_EVENT, onRestart);\n return () => {\n disposed = true;\n target.removeEventListener(SIDECAR_RESTARTED_EVENT, onRestart);\n };\n}\n\nexport function VerseConsoleApp() {\n const phase = useAuthPhase();\n useEffect(() => listenForSidecarRestart(), []);\n useEffect(() => {\n if (phase === 'authenticated') preloadVerseFonts(document, true);\n if (phase !== 'checking') return;\n preloadSessionGate();\n let cancelled = false;\n void adoptInjectedTokens().then((adopted) => {\n if (cancelled || adopted) return;\n return runQuery(verseBootstrapQuery.key, verseBootstrapQuery.fetch).then(() => {\n if (!cancelled) markCheckComplete(getQuerySnapshot(verseBootstrapQuery.key).status === 'success');\n });\n });\n return () => { cancelled = true; };\n }, [phase]);\n if (phase === 'checking') return <p className={styles.checking} role=\"status\">Checking for an existing Verse session…</p>;\n if (phase === 'unauthenticated') {\n return (\n <Suspense fallback={<p className={styles.checking} role=\"status\">Checking for an existing Verse session…</p>}>\n <SessionGate heading=\"Connect to Ashlr Verse\" command=\"ashlr verse\" subject=\"Ashlr Verse\" mutationField />\n </Suspense>\n );\n }\n return (\n <ToastProvider>\n <SkipToContent />\n <div className={styles.shell}><VerseApp /></div>\n </ToastProvider>\n );\n}\n"],"file":"VerseConsoleApp-DjPpZLo1.js"}