@ashlr/hub 3.16.0 → 3.16.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 (997) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +2 -2
  3. package/dist/authority-surface.json +5 -5
  4. package/dist/build-identity.json +2 -2
  5. package/dist/core/daemon/loop.js +1 -0
  6. package/dist/core/daemon/loop.js.map +1 -1
  7. package/dist/core/daemon/tick-hooks.d.ts +2 -0
  8. package/dist/core/daemon/tick-hooks.js.map +1 -1
  9. package/dist/core/fleet/tick-hooks-live.d.ts +2 -1
  10. package/dist/core/fleet/tick-hooks-live.js +49 -7
  11. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  12. package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js +2 -0
  13. package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js.map +1 -0
  14. package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js +2 -0
  15. package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js.map +1 -0
  16. package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js +2 -0
  17. package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js.map +1 -0
  18. package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js +2 -0
  19. package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js.map +1 -0
  20. package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js +2 -0
  21. package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js.map +1 -0
  22. package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js +2 -0
  23. package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js.map +1 -0
  24. package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js +3 -0
  25. package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js.map +1 -0
  26. package/dist/core/web/public/next/assets/App-Uy6lDpKw.js +8 -0
  27. package/dist/core/web/public/next/assets/App-Uy6lDpKw.js.map +1 -0
  28. package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js +2 -0
  29. package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js.map +1 -0
  30. package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js +2 -0
  31. package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js.map +1 -0
  32. package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js +2 -0
  33. package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js.map +1 -0
  34. package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js +3 -0
  35. package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js.map +1 -0
  36. package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js +2 -0
  37. package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js.map +1 -0
  38. package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js +2 -0
  39. package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js.map +1 -0
  40. package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js +2 -0
  41. package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js.map +1 -0
  42. package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js +7 -0
  43. package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js.map +1 -0
  44. package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js +2 -0
  45. package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js.map +1 -0
  46. package/dist/core/web/public/next/assets/Button-CMR_Op-0.js +2 -0
  47. package/dist/core/web/public/next/assets/Button-CMR_Op-0.js.map +1 -0
  48. package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js +2 -0
  49. package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js.map +1 -0
  50. package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js +16 -0
  51. package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js.map +1 -0
  52. package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js +2 -0
  53. package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js.map +1 -0
  54. package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js +2 -0
  55. package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js.map +1 -0
  56. package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js +3 -0
  57. package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js.map +1 -0
  58. package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js +5 -0
  59. package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js.map +1 -0
  60. package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js +2 -0
  61. package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js.map +1 -0
  62. package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js +3 -0
  63. package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js.map +1 -0
  64. package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js +3 -0
  65. package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js.map +1 -0
  66. package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js +9 -0
  67. package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js.map +1 -0
  68. package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js +3 -0
  69. package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js.map +1 -0
  70. package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js +4 -0
  71. package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js.map +1 -0
  72. package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js +2 -0
  73. package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js.map +1 -0
  74. package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js +2 -0
  75. package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js.map +1 -0
  76. package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js +2 -0
  77. package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js.map +1 -0
  78. package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js +2 -0
  79. package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js.map +1 -0
  80. package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js +2 -0
  81. package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js.map +1 -0
  82. package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js +2 -0
  83. package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js.map +1 -0
  84. package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js +2 -0
  85. package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js.map +1 -0
  86. package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js +2 -0
  87. package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js.map +1 -0
  88. package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js +2 -0
  89. package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js.map +1 -0
  90. package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js +2 -0
  91. package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js.map +1 -0
  92. package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js +2 -0
  93. package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js.map +1 -0
  94. package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js +2 -0
  95. package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js.map +1 -0
  96. package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js +2 -0
  97. package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js.map +1 -0
  98. package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js +5 -0
  99. package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js.map +1 -0
  100. package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js +2 -0
  101. package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js.map +1 -0
  102. package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js +2 -0
  103. package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js.map +1 -0
  104. package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js +2 -0
  105. package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js.map +1 -0
  106. package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js +3 -0
  107. package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js.map +1 -0
  108. package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js +2 -0
  109. package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js.map +1 -0
  110. package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js +3 -0
  111. package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js.map +1 -0
  112. package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js +2 -0
  113. package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js.map +1 -0
  114. package/dist/core/web/public/next/assets/Input-CsSZI8QC.js +2 -0
  115. package/dist/core/web/public/next/assets/Input-CsSZI8QC.js.map +1 -0
  116. package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js +9 -0
  117. package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js.map +1 -0
  118. package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js +2 -0
  119. package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js.map +1 -0
  120. package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js +3 -0
  121. package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js.map +1 -0
  122. package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js +2 -0
  123. package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js.map +1 -0
  124. package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js +2 -0
  125. package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js.map +1 -0
  126. package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js +2 -0
  127. package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js.map +1 -0
  128. package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js +2 -0
  129. package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js.map +1 -0
  130. package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js +2 -0
  131. package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js.map +1 -0
  132. package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js +2 -0
  133. package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js.map +1 -0
  134. package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js +3 -0
  135. package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js.map +1 -0
  136. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js +72 -0
  137. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js.map +1 -0
  138. package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js +2 -0
  139. package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js.map +1 -0
  140. package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js +2 -0
  141. package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js.map +1 -0
  142. package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js +3 -0
  143. package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js.map +1 -0
  144. package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js +2 -0
  145. package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js.map +1 -0
  146. package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js +2 -0
  147. package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js.map +1 -0
  148. package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js +3 -0
  149. package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js.map +1 -0
  150. package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js +2 -0
  151. package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js.map +1 -0
  152. package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js +7 -0
  153. package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js.map +1 -0
  154. package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js +2 -0
  155. package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js.map +1 -0
  156. package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js +3 -0
  157. package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js.map +1 -0
  158. package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js +2 -0
  159. package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js.map +1 -0
  160. package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js +2 -0
  161. package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js.map +1 -0
  162. package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js +2 -0
  163. package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js.map +1 -0
  164. package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js +4 -0
  165. package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js.map +1 -0
  166. package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js +3 -0
  167. package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js.map +1 -0
  168. package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js +3 -0
  169. package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js.map +1 -0
  170. package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js +9 -0
  171. package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js.map +1 -0
  172. package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js +2 -0
  173. package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js.map +1 -0
  174. package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js +2 -0
  175. package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js.map +1 -0
  176. package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js +2 -0
  177. package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js.map +1 -0
  178. package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js +2 -0
  179. package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js.map +1 -0
  180. package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js +2 -0
  181. package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js.map +1 -0
  182. package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js +2 -0
  183. package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js.map +1 -0
  184. package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js +2 -0
  185. package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js.map +1 -0
  186. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js +7 -0
  187. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js.map +1 -0
  188. package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js +3 -0
  189. package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js.map +1 -0
  190. package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js +3 -0
  191. package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js.map +1 -0
  192. package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js +2 -0
  193. package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js.map +1 -0
  194. package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js +2 -0
  195. package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js.map +1 -0
  196. package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js +2 -0
  197. package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js.map +1 -0
  198. package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js +3 -0
  199. package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js.map +1 -0
  200. package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js +3 -0
  201. package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js.map +1 -0
  202. package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js +2 -0
  203. package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js.map +1 -0
  204. package/dist/core/web/public/next/assets/Select-DjQDkPJU.js +2 -0
  205. package/dist/core/web/public/next/assets/Select-DjQDkPJU.js.map +1 -0
  206. package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js +2 -0
  207. package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js.map +1 -0
  208. package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js +2 -0
  209. package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js.map +1 -0
  210. package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js +2 -0
  211. package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js.map +1 -0
  212. package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js +2 -0
  213. package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js.map +1 -0
  214. package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js +2 -0
  215. package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js.map +1 -0
  216. package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js +3 -0
  217. package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js.map +1 -0
  218. package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js +2 -0
  219. package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js.map +1 -0
  220. package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js +2 -0
  221. package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js.map +1 -0
  222. package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js +3 -0
  223. package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js.map +1 -0
  224. package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js +2 -0
  225. package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js.map +1 -0
  226. package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js +2 -0
  227. package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js.map +1 -0
  228. package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js +2 -0
  229. package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js.map +1 -0
  230. package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js +2 -0
  231. package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js.map +1 -0
  232. package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js +2 -0
  233. package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js.map +1 -0
  234. package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js +2 -0
  235. package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js.map +1 -0
  236. package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js +2 -0
  237. package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js.map +1 -0
  238. package/dist/core/web/public/next/assets/Surface-BEToBKC3.js +2 -0
  239. package/dist/core/web/public/next/assets/Surface-BEToBKC3.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js +2 -0
  241. package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js.map +1 -0
  242. package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js +2 -0
  243. package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js.map +1 -0
  244. package/dist/core/web/public/next/assets/Tag-Chqolzxz.js +2 -0
  245. package/dist/core/web/public/next/assets/Tag-Chqolzxz.js.map +1 -0
  246. package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js +3 -0
  247. package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js.map +1 -0
  248. package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js +26 -0
  249. package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js.map +1 -0
  250. package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js +2 -0
  251. package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js.map +1 -0
  252. package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js +2 -0
  253. package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js.map +1 -0
  254. package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js +9 -0
  255. package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js.map +1 -0
  256. package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js +3 -0
  257. package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js.map +1 -0
  258. package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js +2 -0
  259. package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js.map +1 -0
  260. package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js +3 -0
  261. package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js.map +1 -0
  262. package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js +3 -0
  263. package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js.map +1 -0
  264. package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js +2 -0
  265. package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js.map +1 -0
  266. package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js +2 -0
  267. package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js.map +1 -0
  268. package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js +2 -0
  269. package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js.map +1 -0
  270. package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js +2 -0
  271. package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js.map +1 -0
  272. package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js +6 -0
  273. package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js.map +1 -0
  274. package/dist/core/web/public/next/assets/actions-BPyW8QC-.js +2 -0
  275. package/dist/core/web/public/next/assets/actions-BPyW8QC-.js.map +1 -0
  276. package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js +2 -0
  277. package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js.map +1 -0
  278. package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js +7 -0
  279. package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js.map +1 -0
  280. package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js +2 -0
  281. package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js.map +1 -0
  282. package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js +2 -0
  283. package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js.map +1 -0
  284. package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js +2 -0
  285. package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js.map +1 -0
  286. package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js +2 -0
  287. package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js.map +1 -0
  288. package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js +2 -0
  289. package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js.map +1 -0
  290. package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js +2 -0
  291. package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js.map +1 -0
  292. package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js +2 -0
  293. package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js.map +1 -0
  294. package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js +2 -0
  295. package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js.map +1 -0
  296. package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js +2 -0
  297. package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js.map +1 -0
  298. package/dist/core/web/public/next/assets/charts-Di0_Q980.js +2 -0
  299. package/dist/core/web/public/next/assets/charts-Di0_Q980.js.map +1 -0
  300. package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js +2 -0
  301. package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js.map +1 -0
  302. package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js +2 -0
  303. package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js.map +1 -0
  304. package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js +2 -0
  305. package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js.map +1 -0
  306. package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js +2 -0
  307. package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js.map +1 -0
  308. package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js +2 -0
  309. package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js.map +1 -0
  310. package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js +2 -0
  311. package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js.map +1 -0
  312. package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js +2 -0
  313. package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js.map +1 -0
  314. package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js +2 -0
  315. package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js.map +1 -0
  316. package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js +2 -0
  317. package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js.map +1 -0
  318. package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js +3 -0
  319. package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js.map +1 -0
  320. package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js +2 -0
  321. package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js.map +1 -0
  322. package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js +2 -0
  323. package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js.map +1 -0
  324. package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js +2 -0
  325. package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js.map +1 -0
  326. package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js +2 -0
  327. package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js.map +1 -0
  328. package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js +2 -0
  329. package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js.map +1 -0
  330. package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js +2 -0
  331. package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js.map +1 -0
  332. package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js +2 -0
  333. package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js.map +1 -0
  334. package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js +2 -0
  335. package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js.map +1 -0
  336. package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js +2 -0
  337. package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js.map +1 -0
  338. package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js +2 -0
  339. package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js.map +1 -0
  340. package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js +2 -0
  341. package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js.map +1 -0
  342. package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js +3 -0
  343. package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js.map +1 -0
  344. package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js +2 -0
  345. package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js.map +1 -0
  346. package/dist/core/web/public/next/assets/format-V6IiIMAL.js +2 -0
  347. package/dist/core/web/public/next/assets/format-V6IiIMAL.js.map +1 -0
  348. package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js +5 -0
  349. package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js.map +1 -0
  350. package/dist/core/web/public/next/assets/global-CYfRwH6t.js +3 -0
  351. package/dist/core/web/public/next/assets/global-CYfRwH6t.js.map +1 -0
  352. package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js +3 -0
  353. package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js.map +1 -0
  354. package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js +2 -0
  355. package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js.map +1 -0
  356. package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js +2 -0
  357. package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js.map +1 -0
  358. package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js +2 -0
  359. package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js.map +1 -0
  360. package/dist/core/web/public/next/assets/icons-BBm_Cy62.js +2 -0
  361. package/dist/core/web/public/next/assets/icons-BBm_Cy62.js.map +1 -0
  362. package/dist/core/web/public/next/assets/index-_izD07R9.js +11 -0
  363. package/dist/core/web/public/next/assets/index-_izD07R9.js.map +1 -0
  364. package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js +2 -0
  365. package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js.map +1 -0
  366. package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js +2 -0
  367. package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js.map +1 -0
  368. package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js +2 -0
  369. package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js.map +1 -0
  370. package/dist/core/web/public/next/assets/live-model-D97AfBFz.js +2 -0
  371. package/dist/core/web/public/next/assets/live-model-D97AfBFz.js.map +1 -0
  372. package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js +2 -0
  373. package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js.map +1 -0
  374. package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js +2 -0
  375. package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js.map +1 -0
  376. package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js +2 -0
  377. package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js.map +1 -0
  378. package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js +7 -0
  379. package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js.map +1 -0
  380. package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js +2 -0
  381. package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js.map +1 -0
  382. package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js +2 -0
  383. package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js.map +1 -0
  384. package/dist/core/web/public/next/assets/nav-DC0ynjdb.js +2 -0
  385. package/dist/core/web/public/next/assets/nav-DC0ynjdb.js.map +1 -0
  386. package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js +2 -0
  387. package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js.map +1 -0
  388. package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js +2 -0
  389. package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js.map +1 -0
  390. package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js +2 -0
  391. package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js.map +1 -0
  392. package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js +2 -0
  393. package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js.map +1 -0
  394. package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js +2 -0
  395. package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js.map +1 -0
  396. package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js +2 -0
  397. package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js.map +1 -0
  398. package/dist/core/web/public/next/assets/panes-DOXM13lF.js +3 -0
  399. package/dist/core/web/public/next/assets/panes-DOXM13lF.js.map +1 -0
  400. package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js +2 -0
  401. package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js.map +1 -0
  402. package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js +2 -0
  403. package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js.map +1 -0
  404. package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js +2 -0
  405. package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js.map +1 -0
  406. package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js +2 -0
  407. package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js.map +1 -0
  408. package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js +2 -0
  409. package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js.map +1 -0
  410. package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js +2 -0
  411. package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js.map +1 -0
  412. package/dist/core/web/public/next/assets/primitives-Bynv7bPl.js +1 -0
  413. package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js +2 -0
  414. package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js.map +1 -0
  415. package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js +2 -0
  416. package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js.map +1 -0
  417. package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js +2 -0
  418. package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js.map +1 -0
  419. package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js +3 -0
  420. package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js.map +1 -0
  421. package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js +2 -0
  422. package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js.map +1 -0
  423. package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js +2 -0
  424. package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js.map +1 -0
  425. package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js +2 -0
  426. package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js.map +1 -0
  427. package/dist/core/web/public/next/assets/rolldown-runtime-hePW80VL.js +1 -0
  428. package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js +2 -0
  429. package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js.map +1 -0
  430. package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js +2 -0
  431. package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js.map +1 -0
  432. package/dist/core/web/public/next/assets/sheet-BxZSmdad.js +2 -0
  433. package/dist/core/web/public/next/assets/sheet-BxZSmdad.js.map +1 -0
  434. package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js +2 -0
  435. package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js.map +1 -0
  436. package/dist/core/web/public/next/assets/slots-BJc3RJkV.js +3 -0
  437. package/dist/core/web/public/next/assets/slots-BJc3RJkV.js.map +1 -0
  438. package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js +4 -0
  439. package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js.map +1 -0
  440. package/dist/core/web/public/next/assets/sse-It4xa040.js +2 -0
  441. package/dist/core/web/public/next/assets/sse-It4xa040.js.map +1 -0
  442. package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js +2 -0
  443. package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js.map +1 -0
  444. package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js +2 -0
  445. package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js.map +1 -0
  446. package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js +2 -0
  447. package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js.map +1 -0
  448. package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js +2 -0
  449. package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js.map +1 -0
  450. package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js +2 -0
  451. package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js.map +1 -0
  452. package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js +6 -0
  453. package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js.map +1 -0
  454. package/dist/core/web/public/next/assets/thread-data-C8z55msn.js +2 -0
  455. package/dist/core/web/public/next/assets/thread-data-C8z55msn.js.map +1 -0
  456. package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js +2 -0
  457. package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js.map +1 -0
  458. package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js +2 -0
  459. package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js.map +1 -0
  460. package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js +2 -0
  461. package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js.map +1 -0
  462. package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js +2 -0
  463. package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js.map +1 -0
  464. package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js +2 -0
  465. package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js.map +1 -0
  466. package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js +2 -0
  467. package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js.map +1 -0
  468. package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js +2 -0
  469. package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js.map +1 -0
  470. package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js +2 -0
  471. package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js.map +1 -0
  472. package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js +2 -0
  473. package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js.map +1 -0
  474. package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js +2 -0
  475. package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js.map +1 -0
  476. package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js +2 -0
  477. package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js.map +1 -0
  478. package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js +2 -0
  479. package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js.map +1 -0
  480. package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js +2 -0
  481. package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js.map +1 -0
  482. package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js +2 -0
  483. package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js.map +1 -0
  484. package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js +2 -0
  485. package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js.map +1 -0
  486. package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js +3 -0
  487. package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js.map +1 -0
  488. package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js +2 -0
  489. package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js.map +1 -0
  490. package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js +2 -0
  491. package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js.map +1 -0
  492. package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js +2 -0
  493. package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js.map +1 -0
  494. package/dist/core/web/public/next/index.html +2 -1
  495. package/dist/core/web/remote-gateway-policy.js +5 -0
  496. package/dist/core/web/remote-gateway-policy.js.map +1 -1
  497. package/dist/core/web/static.d.ts +4 -3
  498. package/dist/core/web/static.js +8 -5
  499. package/dist/core/web/static.js.map +1 -1
  500. package/dist/release-dependency-inventory.json +1 -1
  501. package/node_modules/fast-uri/index.js +20 -5
  502. package/node_modules/fast-uri/lib/utils.js +8 -1
  503. package/node_modules/fast-uri/package.json +1 -1
  504. package/node_modules/fast-uri/test/component-safe-serialization.test.js +58 -0
  505. package/node_modules/fast-uri/test/ipv6-validation.test.js +34 -0
  506. package/node_modules/ip-address/README.md +134 -134
  507. package/node_modules/ip-address/dist/address-error.d.ts +11 -0
  508. package/node_modules/ip-address/dist/address-error.js.map +1 -1
  509. package/node_modules/ip-address/dist/ipv4.d.ts +22 -6
  510. package/node_modules/ip-address/dist/ipv4.js +22 -6
  511. package/node_modules/ip-address/dist/ipv4.js.map +1 -1
  512. package/node_modules/ip-address/dist/ipv6.d.ts +26 -8
  513. package/node_modules/ip-address/dist/ipv6.js +46 -29
  514. package/node_modules/ip-address/dist/ipv6.js.map +1 -1
  515. package/node_modules/ip-address/dist/v6/constants.js +1 -0
  516. package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  517. package/node_modules/ip-address/package.json +1 -1
  518. package/package.json +5 -4
  519. package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js +0 -2
  520. package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js.map +0 -1
  521. package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js +0 -2
  522. package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js.map +0 -1
  523. package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js +0 -2
  524. package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js.map +0 -1
  525. package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js +0 -2
  526. package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js.map +0 -1
  527. package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js +0 -2
  528. package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js.map +0 -1
  529. package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js +0 -2
  530. package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js.map +0 -1
  531. package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js +0 -3
  532. package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js.map +0 -1
  533. package/dist/core/web/public/next/assets/App-DebYuj1v.js +0 -8
  534. package/dist/core/web/public/next/assets/App-DebYuj1v.js.map +0 -1
  535. package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js +0 -2
  536. package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js.map +0 -1
  537. package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js +0 -2
  538. package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js.map +0 -1
  539. package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js +0 -2
  540. package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js.map +0 -1
  541. package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js +0 -3
  542. package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js.map +0 -1
  543. package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js +0 -2
  544. package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js.map +0 -1
  545. package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js +0 -2
  546. package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js.map +0 -1
  547. package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js +0 -2
  548. package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js.map +0 -1
  549. package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js +0 -7
  550. package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js.map +0 -1
  551. package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js +0 -2
  552. package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js.map +0 -1
  553. package/dist/core/web/public/next/assets/Button-DP2ImS5n.js +0 -2
  554. package/dist/core/web/public/next/assets/Button-DP2ImS5n.js.map +0 -1
  555. package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js +0 -2
  556. package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js.map +0 -1
  557. package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js +0 -16
  558. package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js.map +0 -1
  559. package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js +0 -2
  560. package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js.map +0 -1
  561. package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js +0 -2
  562. package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js.map +0 -1
  563. package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js +0 -3
  564. package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js.map +0 -1
  565. package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js +0 -5
  566. package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js.map +0 -1
  567. package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js +0 -2
  568. package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js.map +0 -1
  569. package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js +0 -3
  570. package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js.map +0 -1
  571. package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js +0 -3
  572. package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js.map +0 -1
  573. package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js +0 -9
  574. package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js.map +0 -1
  575. package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js +0 -3
  576. package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js.map +0 -1
  577. package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js +0 -4
  578. package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js.map +0 -1
  579. package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js +0 -2
  580. package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js.map +0 -1
  581. package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js +0 -2
  582. package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js.map +0 -1
  583. package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js +0 -2
  584. package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js.map +0 -1
  585. package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js +0 -2
  586. package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js.map +0 -1
  587. package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js +0 -2
  588. package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js.map +0 -1
  589. package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js +0 -2
  590. package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js.map +0 -1
  591. package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js +0 -2
  592. package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js.map +0 -1
  593. package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js +0 -2
  594. package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js.map +0 -1
  595. package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js +0 -2
  596. package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js.map +0 -1
  597. package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js +0 -2
  598. package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js.map +0 -1
  599. package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js +0 -2
  600. package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js.map +0 -1
  601. package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js +0 -2
  602. package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js.map +0 -1
  603. package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js +0 -2
  604. package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js.map +0 -1
  605. package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js +0 -5
  606. package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js.map +0 -1
  607. package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js +0 -2
  608. package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js.map +0 -1
  609. package/dist/core/web/public/next/assets/GearTray-Cc14h572.js +0 -2
  610. package/dist/core/web/public/next/assets/GearTray-Cc14h572.js.map +0 -1
  611. package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js +0 -2
  612. package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js.map +0 -1
  613. package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js +0 -3
  614. package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js.map +0 -1
  615. package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js +0 -2
  616. package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js.map +0 -1
  617. package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js +0 -3
  618. package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js.map +0 -1
  619. package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js +0 -2
  620. package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js.map +0 -1
  621. package/dist/core/web/public/next/assets/Input-BEF-ScuG.js +0 -2
  622. package/dist/core/web/public/next/assets/Input-BEF-ScuG.js.map +0 -1
  623. package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js +0 -9
  624. package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js.map +0 -1
  625. package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js +0 -2
  626. package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js.map +0 -1
  627. package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js +0 -3
  628. package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js.map +0 -1
  629. package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js +0 -2
  630. package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js.map +0 -1
  631. package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js +0 -2
  632. package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js.map +0 -1
  633. package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js +0 -2
  634. package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js.map +0 -1
  635. package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js +0 -2
  636. package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js.map +0 -1
  637. package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js +0 -2
  638. package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js.map +0 -1
  639. package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js +0 -2
  640. package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js.map +0 -1
  641. package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js +0 -3
  642. package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js.map +0 -1
  643. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js +0 -72
  644. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js.map +0 -1
  645. package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js +0 -2
  646. package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js.map +0 -1
  647. package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js +0 -2
  648. package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js.map +0 -1
  649. package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js +0 -3
  650. package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js.map +0 -1
  651. package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js +0 -2
  652. package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js.map +0 -1
  653. package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js +0 -2
  654. package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js.map +0 -1
  655. package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js +0 -3
  656. package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js.map +0 -1
  657. package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js +0 -2
  658. package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js.map +0 -1
  659. package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js +0 -7
  660. package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js.map +0 -1
  661. package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js +0 -2
  662. package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js.map +0 -1
  663. package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js +0 -3
  664. package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js.map +0 -1
  665. package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js +0 -2
  666. package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js.map +0 -1
  667. package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js +0 -2
  668. package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js.map +0 -1
  669. package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js +0 -2
  670. package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js.map +0 -1
  671. package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js +0 -4
  672. package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js.map +0 -1
  673. package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js +0 -3
  674. package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js.map +0 -1
  675. package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js +0 -3
  676. package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js.map +0 -1
  677. package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js +0 -9
  678. package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js.map +0 -1
  679. package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js +0 -2
  680. package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js.map +0 -1
  681. package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js +0 -2
  682. package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js.map +0 -1
  683. package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js +0 -2
  684. package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js.map +0 -1
  685. package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js +0 -2
  686. package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js.map +0 -1
  687. package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js +0 -2
  688. package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js.map +0 -1
  689. package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js +0 -2
  690. package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js.map +0 -1
  691. package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js +0 -2
  692. package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js.map +0 -1
  693. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js +0 -7
  694. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js.map +0 -1
  695. package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js +0 -3
  696. package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js.map +0 -1
  697. package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js +0 -3
  698. package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js.map +0 -1
  699. package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js +0 -2
  700. package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js.map +0 -1
  701. package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js +0 -2
  702. package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js.map +0 -1
  703. package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js +0 -2
  704. package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js.map +0 -1
  705. package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js +0 -3
  706. package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js.map +0 -1
  707. package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js +0 -3
  708. package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js.map +0 -1
  709. package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js +0 -2
  710. package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js.map +0 -1
  711. package/dist/core/web/public/next/assets/Select-zXMdgblm.js +0 -2
  712. package/dist/core/web/public/next/assets/Select-zXMdgblm.js.map +0 -1
  713. package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js +0 -2
  714. package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js.map +0 -1
  715. package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js +0 -2
  716. package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js.map +0 -1
  717. package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js +0 -2
  718. package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js.map +0 -1
  719. package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js +0 -2
  720. package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js.map +0 -1
  721. package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js +0 -2
  722. package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js.map +0 -1
  723. package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js +0 -3
  724. package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js.map +0 -1
  725. package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js +0 -2
  726. package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js.map +0 -1
  727. package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js +0 -2
  728. package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js.map +0 -1
  729. package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js +0 -3
  730. package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js.map +0 -1
  731. package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js +0 -2
  732. package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js.map +0 -1
  733. package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js +0 -2
  734. package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js.map +0 -1
  735. package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js +0 -2
  736. package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js.map +0 -1
  737. package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js +0 -2
  738. package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js.map +0 -1
  739. package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js +0 -2
  740. package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js.map +0 -1
  741. package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js +0 -2
  742. package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js.map +0 -1
  743. package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js +0 -2
  744. package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js.map +0 -1
  745. package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js +0 -2
  746. package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js.map +0 -1
  747. package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js +0 -2
  748. package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js.map +0 -1
  749. package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js +0 -2
  750. package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js.map +0 -1
  751. package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js +0 -2
  752. package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js.map +0 -1
  753. package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js +0 -26
  754. package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js.map +0 -1
  755. package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js +0 -3
  756. package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js.map +0 -1
  757. package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js +0 -2
  758. package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js.map +0 -1
  759. package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js +0 -2
  760. package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js.map +0 -1
  761. package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js +0 -9
  762. package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js.map +0 -1
  763. package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js +0 -3
  764. package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js.map +0 -1
  765. package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js +0 -2
  766. package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js.map +0 -1
  767. package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js +0 -3
  768. package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js.map +0 -1
  769. package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js +0 -3
  770. package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js.map +0 -1
  771. package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js +0 -2
  772. package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js.map +0 -1
  773. package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js +0 -2
  774. package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js.map +0 -1
  775. package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js +0 -2
  776. package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js.map +0 -1
  777. package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js +0 -2
  778. package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js.map +0 -1
  779. package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js +0 -6
  780. package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js.map +0 -1
  781. package/dist/core/web/public/next/assets/actions-CyO4R-IO.js +0 -2
  782. package/dist/core/web/public/next/assets/actions-CyO4R-IO.js.map +0 -1
  783. package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js +0 -2
  784. package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js.map +0 -1
  785. package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js +0 -7
  786. package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js.map +0 -1
  787. package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js +0 -2
  788. package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js.map +0 -1
  789. package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js +0 -2
  790. package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js.map +0 -1
  791. package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js +0 -2
  792. package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js.map +0 -1
  793. package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js +0 -2
  794. package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js.map +0 -1
  795. package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js +0 -2
  796. package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js.map +0 -1
  797. package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js +0 -2
  798. package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js.map +0 -1
  799. package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js +0 -2
  800. package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js.map +0 -1
  801. package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js +0 -2
  802. package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js.map +0 -1
  803. package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js +0 -2
  804. package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js.map +0 -1
  805. package/dist/core/web/public/next/assets/charts-D3I0q4hG.js +0 -2
  806. package/dist/core/web/public/next/assets/charts-D3I0q4hG.js.map +0 -1
  807. package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js +0 -2
  808. package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js.map +0 -1
  809. package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js +0 -2
  810. package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js.map +0 -1
  811. package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js +0 -2
  812. package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js.map +0 -1
  813. package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js +0 -2
  814. package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js.map +0 -1
  815. package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js +0 -2
  816. package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js.map +0 -1
  817. package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js +0 -2
  818. package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js.map +0 -1
  819. package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js +0 -2
  820. package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js.map +0 -1
  821. package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js +0 -2
  822. package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js.map +0 -1
  823. package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js +0 -2
  824. package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js.map +0 -1
  825. package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js +0 -3
  826. package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js.map +0 -1
  827. package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js +0 -2
  828. package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js.map +0 -1
  829. package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js +0 -2
  830. package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js.map +0 -1
  831. package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js +0 -2
  832. package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js.map +0 -1
  833. package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js +0 -2
  834. package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js.map +0 -1
  835. package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js +0 -2
  836. package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js.map +0 -1
  837. package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js +0 -2
  838. package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js.map +0 -1
  839. package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js +0 -2
  840. package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js.map +0 -1
  841. package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js +0 -2
  842. package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js.map +0 -1
  843. package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js +0 -2
  844. package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js.map +0 -1
  845. package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js +0 -2
  846. package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js.map +0 -1
  847. package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js +0 -2
  848. package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js.map +0 -1
  849. package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js +0 -3
  850. package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js.map +0 -1
  851. package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js +0 -2
  852. package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js.map +0 -1
  853. package/dist/core/web/public/next/assets/format-CcEKjUou.js +0 -2
  854. package/dist/core/web/public/next/assets/format-CcEKjUou.js.map +0 -1
  855. package/dist/core/web/public/next/assets/git-model-DL3MwN93.js +0 -5
  856. package/dist/core/web/public/next/assets/git-model-DL3MwN93.js.map +0 -1
  857. package/dist/core/web/public/next/assets/global-BWc2NPzv.js +0 -3
  858. package/dist/core/web/public/next/assets/global-BWc2NPzv.js.map +0 -1
  859. package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js +0 -3
  860. package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js.map +0 -1
  861. package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js +0 -2
  862. package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js.map +0 -1
  863. package/dist/core/web/public/next/assets/headroom-CP99UxyV.js +0 -2
  864. package/dist/core/web/public/next/assets/headroom-CP99UxyV.js.map +0 -1
  865. package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js +0 -2
  866. package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js.map +0 -1
  867. package/dist/core/web/public/next/assets/icons-U34oiN9M.js +0 -2
  868. package/dist/core/web/public/next/assets/icons-U34oiN9M.js.map +0 -1
  869. package/dist/core/web/public/next/assets/index-BbDqdepe.js +0 -11
  870. package/dist/core/web/public/next/assets/index-BbDqdepe.js.map +0 -1
  871. package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js +0 -2
  872. package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js.map +0 -1
  873. package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js +0 -2
  874. package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js.map +0 -1
  875. package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js +0 -2
  876. package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js.map +0 -1
  877. package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js +0 -2
  878. package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js.map +0 -1
  879. package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js +0 -2
  880. package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js.map +0 -1
  881. package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js +0 -2
  882. package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js.map +0 -1
  883. package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js +0 -2
  884. package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js.map +0 -1
  885. package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js +0 -7
  886. package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js.map +0 -1
  887. package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js +0 -2
  888. package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js.map +0 -1
  889. package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js +0 -2
  890. package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js.map +0 -1
  891. package/dist/core/web/public/next/assets/nav-CM-mJcSq.js +0 -2
  892. package/dist/core/web/public/next/assets/nav-CM-mJcSq.js.map +0 -1
  893. package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js +0 -2
  894. package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js.map +0 -1
  895. package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js +0 -2
  896. package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js.map +0 -1
  897. package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js +0 -2
  898. package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js.map +0 -1
  899. package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js +0 -2
  900. package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js.map +0 -1
  901. package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js +0 -2
  902. package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js.map +0 -1
  903. package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js +0 -2
  904. package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js.map +0 -1
  905. package/dist/core/web/public/next/assets/panes-BjUzIDw6.js +0 -3
  906. package/dist/core/web/public/next/assets/panes-BjUzIDw6.js.map +0 -1
  907. package/dist/core/web/public/next/assets/path-display-HyxETV-f.js +0 -2
  908. package/dist/core/web/public/next/assets/path-display-HyxETV-f.js.map +0 -1
  909. package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js +0 -2
  910. package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js.map +0 -1
  911. package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js +0 -2
  912. package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js.map +0 -1
  913. package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js +0 -2
  914. package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js.map +0 -1
  915. package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js +0 -2
  916. package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js.map +0 -1
  917. package/dist/core/web/public/next/assets/primitives-BEXDE-HP.js +0 -1
  918. package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js +0 -2
  919. package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js.map +0 -1
  920. package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js +0 -2
  921. package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js.map +0 -1
  922. package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js +0 -2
  923. package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js.map +0 -1
  924. package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js +0 -3
  925. package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js.map +0 -1
  926. package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js +0 -2
  927. package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js.map +0 -1
  928. package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js +0 -2
  929. package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js.map +0 -1
  930. package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js +0 -2
  931. package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js.map +0 -1
  932. package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js +0 -2
  933. package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js.map +0 -1
  934. package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js +0 -2
  935. package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js.map +0 -1
  936. package/dist/core/web/public/next/assets/sheet-D0ciShoy.js +0 -2
  937. package/dist/core/web/public/next/assets/sheet-D0ciShoy.js.map +0 -1
  938. package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js +0 -2
  939. package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js.map +0 -1
  940. package/dist/core/web/public/next/assets/slots-m3L6Ints.js +0 -3
  941. package/dist/core/web/public/next/assets/slots-m3L6Ints.js.map +0 -1
  942. package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js +0 -4
  943. package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js.map +0 -1
  944. package/dist/core/web/public/next/assets/sse-CK65-Cun.js +0 -2
  945. package/dist/core/web/public/next/assets/sse-CK65-Cun.js.map +0 -1
  946. package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js +0 -2
  947. package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js.map +0 -1
  948. package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js +0 -2
  949. package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js.map +0 -1
  950. package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js +0 -2
  951. package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js.map +0 -1
  952. package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js +0 -2
  953. package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js.map +0 -1
  954. package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js +0 -2
  955. package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js.map +0 -1
  956. package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js +0 -6
  957. package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js.map +0 -1
  958. package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js +0 -2
  959. package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js.map +0 -1
  960. package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js +0 -2
  961. package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js.map +0 -1
  962. package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js +0 -2
  963. package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js.map +0 -1
  964. package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js +0 -2
  965. package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js.map +0 -1
  966. package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js +0 -2
  967. package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js.map +0 -1
  968. package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js +0 -2
  969. package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js.map +0 -1
  970. package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js +0 -2
  971. package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js.map +0 -1
  972. package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js +0 -2
  973. package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js.map +0 -1
  974. package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js +0 -2
  975. package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js.map +0 -1
  976. package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js +0 -2
  977. package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js.map +0 -1
  978. package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js +0 -2
  979. package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js.map +0 -1
  980. package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js +0 -2
  981. package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js.map +0 -1
  982. package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js +0 -2
  983. package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js.map +0 -1
  984. package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js +0 -2
  985. package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js.map +0 -1
  986. package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js +0 -2
  987. package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js.map +0 -1
  988. package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js +0 -2
  989. package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js.map +0 -1
  990. package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js +0 -3
  991. package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js.map +0 -1
  992. package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js +0 -2
  993. package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js.map +0 -1
  994. package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js +0 -2
  995. package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js.map +0 -1
  996. package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js +0 -2
  997. package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js.map +0 -1
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/DockHost-BHbosAjM.js","assets/Button-DP2ImS5n.js","assets/ActionMenu-Bia8Re6u.js","assets/dock-icons-CRHjXBWm.js","assets/panes-BjUzIDw6.js","assets/slots-m3L6Ints.js","assets/EmptyState-BEXDoNZd.js","assets/chat-pane-data-DIDV7uIU.js","assets/SkipToContent-c02H5dmz.css","assets/global-1SED_aTT.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/VerseConsoleApp-C5481fH5.css","assets/Button-DrnKsvnQ.css","assets/ActionMenu-DPjsLU1g.css","assets/EmptyState-B3YUPGaa.css","assets/DockHost-CpfkAFut.css","assets/NewChatDialog-BL15LCaj.js","assets/Dialog-BYIKNPcH.js","assets/focus-trap-C8MiYlLZ.js","assets/verse-model-CkF3q2IH.js","assets/Segmented-CtwuFlbY.js","assets/context-queries-Cgb_XvRv.js","assets/format-CcEKjUou.js","assets/format-D7nBg2bn.js","assets/seat-readiness-CvEmMBol.js","assets/git-model-DL3MwN93.js","assets/context-model-C9EIuPJ_.js","assets/SeatSelector-DSd_pxg2.js","assets/seat-subscription-BClqZwau.js","assets/Composer.module-Cu7XM6fT.js","assets/CapacityStrip-ChYPcr23.js","assets/ProviderLogo-CWrojWjI.js","assets/Tag-CMFqY2MP.js","assets/budget-queries-q7mCG9Ek.js","assets/useSeatHealth-C08b9zut.js","assets/health-queries-D8TwNTDQ.js","assets/useSeatsRefresh-BGsdylUl.js","assets/capacity-strip-model-pdIEweaZ.js","assets/budget-model-CKd0d1Cj.js","assets/policy-CEIamUKN.js","assets/context-model-DU3OPiBC.js","assets/workspace-model-DRGckE8q.js","assets/folder-picker-C8zo3A56.js","assets/Dialog-tQ8kFulD.css","assets/Segmented-BnjHbKzH.css","assets/Composer-Dg7FDvoa.css","assets/Tag-D0rAEciH.css","assets/CapacityStrip-Cc28CyWk.css","assets/NewChatDialog-yyQpA9p_.css","assets/DevinStopDialog-CADdSqha.js","assets/DevinStopDialog-ylMtGeGY.css","assets/Workspace-BYT3iuNM.js","assets/MutationTokenDialog-D522NXsm.js","assets/diff-parser-BnW_HiQm.js","assets/highlight-BCNIvJ85.js","assets/DiffViewer-DjtLl7ro.js","assets/deep-link-Cgvchdy7.js","assets/Transcript.module-CzROOZJo.js","assets/tool-semantics-DtFU7rvB.js","assets/line-diff-B5Eonif2.js","assets/path-display-HyxETV-f.js","assets/LiveTimer-c18lVIBC.js","assets/icons-U34oiN9M.js","assets/verse-icons-BQxBZk9k.js","assets/command-catalog-BzHSIzIS.js","assets/tasks-model-BueAhEAf.js","assets/sidebar-model-BZ9Wh1lR.js","assets/composer-state-B4KVc2ZZ.js","assets/composer-queries-BEYuD6Qr.js","assets/use-token-gate-_JPjMD5z.js","assets/insert-text-BnF_Gm4r.js","assets/VoiceInput-B7yrGchr.js","assets/web-speech-q3gDv2ax.js","assets/palette-handoff-Bmq98lDl.js","assets/playbooks-queries-C8j1Aswo.js","assets/sources-queries-DeIlxb3A.js","assets/reasoning-pref-CWEri5xB.js","assets/ThinkingBlock-Db8qnuKz.js","assets/MessageMarkdown-Dkw4V24c.js","assets/ansi-B9NbRwnU.js","assets/verse-transcript-Dc-bk9l2.js","assets/Meter-dMqKBaVV.js","assets/useVerseTranscript-B6wLDOv8.js","assets/MutationTokenDialog-CrfJ0PdD.css","assets/DiffViewer-C8HHTnVE.css","assets/Transcript-DLeoLRca.css","assets/LiveTimer-1w9hA2-h.css","assets/VoiceInput-Do-EiHxj.css","assets/ThinkingBlock-C1hAYcr3.css","assets/Meter-CYt9KpM0.css","assets/Workspace-DpmV05IE.css","assets/Sidebar-CqOJle0q.js","assets/RefreshIndicator-CEMRNruu.js","assets/RefreshIndicator-CVv22U_j.css","assets/Sidebar-DTHF3Te9.css","assets/DeleteChatDialog-BT5y9cR2.js","assets/turn-files-BW0SiN39.js"])))=>i.map(i=>d[i]);
2
- import{l as e,n as t,s as n,t as r,u as i}from"./index-BbDqdepe.js";import{P as a,b as o,c as s,d as c,l,n as u,t as d,u as f}from"./global-BWc2NPzv.js";import{r as ee}from"./RouteErrorBoundary-Cc9GsjZz.js";import{i as p}from"./SkipToContent-C7UObcP2.js";import{B as te,D as ne,G as re,I as ie,L as m,P as ae,S as oe,Ut as se,V as ce,W as le,Y as ue,c as de,dt as fe,ft as pe,h,it as me,j as he,l as ge,nt as _e,o as ve,ot as g,rt as ye,s as be,st as xe,u as Se,ut as Ce,z as we}from"./VerseConsoleApp-kFOEmnGC.js";import{N as Te,T as Ee,_ as De,a as Oe,i as ke,m as Ae,p as je,r as Me,s as Ne,u as Pe,v as Fe,w as Ie}from"./VerseShared-_pMXKs8m.js";import{n as Le}from"./verse-bootstrap-query-BR5ypA8b.js";import{n as Re,t as _}from"./preloaded-CLDUOHXJ.js";import{l as ze,n as Be,u as Ve}from"./verse-store-DAqqNIyD.js";import{i as He,n as Ue,t as We}from"./use-chat-activity-BaNWmI2A.js";import{r as Ge}from"./useVerseSession-0MnfpcHg.js";var v=i(n(),1),y=new Map;function Ke(e,t){return y.set(e,t),()=>{y.get(e)===t&&y.delete(e)}}function b(e,t){let n=t.replace(/\s+$/,``);return e.trim()?`${e.replace(/\s+$/,``)}\n\n${n}`:n}function x(e=document){let t=e.querySelector(`textarea[aria-label="Message"]`);return t instanceof HTMLTextAreaElement?t:null}function qe(e,t){if(!t.trim())return!1;let n=y.get(e);if(n)return n(t),!0;let r=x();if(!r||r.disabled)return!1;let i=b(r.value,t),a=Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype,`value`)?.set;a?a.call(r,i):r.value=i,r.dispatchEvent(new Event(`input`,{bubbles:!0})),r.focus();let o=r.value.length;try{r.setSelectionRange(o,o)}catch{}return!0}function Je(e){return`verse-session-roots:${e}`}var Ye={key:`verse-session-roots:none`,fetch:async()=>null};function Xe(e){return e?[e.projectPath,...(e.extraRoots??[]).filter(t=>t!==e.projectPath)]:[]}function Ze(e){let t=e?.id??null,n=(0,v.useMemo)(()=>t?{key:Je(t),fetch:e=>Pe(t,e)}:Ye,[t]),r=l(n),i=f(n),a=e?.turnCount??0,o=(0,v.useRef)({id:t,turns:a});(0,v.useEffect)(()=>{let e=o.current;o.current={id:t,turns:a},e.id===t&&e.turns!==a&&t&&i()},[t,a,i]);let s=r.data??null,c=s!==null&&Array.isArray(s.roots)?s:null,u=(0,v.useMemo)(()=>Xe(e),[e?.projectPath,e?.extraRoots]),d=(0,v.useMemo)(()=>{if(!c||c.roots.length===0)return u;let e=c.roots.filter(e=>e.primary).map(e=>e.path),t=c.roots.filter(e=>!e.primary).map(e=>e.path);return[...e,...t]},[c,u]),ee=c?.roots.find(e=>e.primary)??c?.roots[0]??null;return{data:c,error:r.status===`error`?r.error?.message??`could not read this chat’s folders`:null,roots:d,branch:ee?.git?.branch??null}}var S=new Set;function Qe(e){return S.add(e),()=>S.delete(e)}function $e(e){let t=!1;for(let n of[...S])n(e)&&(t=!0);return t}var C=new Set;function et(e){return C.add(e),()=>C.delete(e)}function tt(){let e=!1;for(let t of[...C])t()&&(e=!0);return e}var w=new Set;function nt(e){return w.add(e),()=>w.delete(e)}function rt(e){let t=!1;for(let n of[...w])n(e)&&(t=!0);return t}var T={sidebar:{min:220,max:420,def:264},resources:{min:240,max:520,def:320}},it=1,at=`ashlr.verse.panels.v1`,ot=`ashlr.verse.ui.v2`,st={containerWidth:0,sidebarVisible:!0,resourcesVisible:!0};function E(e,t){let n=T[e],r=Number(t);return!Number.isFinite(r)||r<=0?n.def:Math.max(n.min,Math.min(n.max,Math.round(r)))}function ct(e,t){let n=E(`sidebar`,e.sidebar),r=E(`resources`,e.resources);if(!Number.isFinite(t.containerWidth)||t.containerWidth<=0)return{sidebar:n,resources:r};let i=(t.sidebarVisible?it:0)+(t.resourcesVisible?it:0),a=t.containerWidth-480-i,o=(t.sidebarVisible?n:0)+(t.resourcesVisible?r:0)-a;if(o<=0)return{sidebar:n,resources:r};if(t.resourcesVisible){let e=Math.min(o,r-T.resources.min);r-=e,o-=e}if(o>0&&t.sidebarVisible){let e=Math.min(o,n-T.sidebar.min);n-=e}return{sidebar:n,resources:r}}function lt(){return{sidebar:T.sidebar.def,resources:T.resources.def}}function D(e){if(e===null||e===``)return null;let t;try{t=JSON.parse(e)}catch{return null}if(!t||typeof t!=`object`||Array.isArray(t))return null;let n=t,r=n.sidebar??n.sidebarWidth,i=n.resources??n.resourcesWidth;return r===void 0&&i===void 0?null:{sidebar:E(`sidebar`,r),resources:E(`resources`,i)}}function O(){try{return D(localStorage.getItem(at))||(D(localStorage.getItem(ot))??lt())}catch{return lt()}}function ut(e){try{localStorage.setItem(at,JSON.stringify({sidebar:e.sidebar,resources:e.resources}))}catch{}}var k=O(),A=st,j={desired:k,effective:ct(k,A)},M=new Set;function N(e,t){return e.sidebar===t.sidebar&&e.resources===t.resources}function dt(){let e=ct(k,A);if(!(N(j.desired,k)&&N(j.effective,e))){j={desired:k,effective:e};for(let e of M)e()}}function P(e){return M.add(e),()=>{M.delete(e)}}function F(){return j}function ft(e){(A.containerWidth!==e.containerWidth||A.sidebarVisible!==e.sidebarVisible||A.resourcesVisible!==e.resourcesVisible)&&(A=e,dt())}function pt(e){N(k,e)||(k=e,ut(k),dt())}function I(e,t){pt({...k,[e]:E(e,t)})}function L(e,t){I(e,j.effective[e]+t)}function R(e){I(e,T[e].def)}var z=t();function mt(){return(0,v.useSyncExternalStore)(P,F,F)}var B=`verseResizing`;function V(e){try{e?document.body.dataset[B]=`true`:delete document.body.dataset[B]}catch{}}function ht({side:e,label:t,className:n}){let r=mt(),i=T[e],a=r.effective[e],o=(0,v.useRef)(null),[s,c]=(0,v.useState)(!1),l=(0,v.useCallback)(()=>{o.current&&(o.current=null,c(!1),V(!1))},[]),u=(0,v.useCallback)(e=>{if(e.button===0){e.preventDefault(),o.current={pointerId:e.pointerId,originX:e.clientX,startWidth:a},c(!0),V(!0);try{e.currentTarget.setPointerCapture?.(e.pointerId)}catch{}}},[a]);(0,v.useEffect)(()=>{if(!s)return;let t=t=>{let n=o.current;if(!n||t.pointerId!==n.pointerId)return;let r=t.clientX-n.originX;I(e,e===`sidebar`?n.startWidth+r:n.startWidth-r)},n=e=>{let t=o.current;t&&e.pointerId!==t.pointerId||l()},r=t=>{let n=o.current;n&&t.key===`Escape`&&(I(e,n.startWidth),l())},i=()=>l();return window.addEventListener(`pointermove`,t),window.addEventListener(`pointerup`,n),window.addEventListener(`pointercancel`,n),window.addEventListener(`keydown`,r),window.addEventListener(`blur`,i),()=>{window.removeEventListener(`pointermove`,t),window.removeEventListener(`pointerup`,n),window.removeEventListener(`pointercancel`,n),window.removeEventListener(`keydown`,r),window.removeEventListener(`blur`,i),V(!1)}},[s,e,l]);let d=(0,v.useCallback)(t=>{let n=t.shiftKey?64:16,r=e===`sidebar`?1:-1;switch(t.key){case`ArrowRight`:L(e,n*r);break;case`ArrowLeft`:L(e,-n*r);break;case`Home`:I(e,i.min);break;case`End`:I(e,i.max);break;case`Enter`:R(e);break;default:return}t.preventDefault()},[e,i.min,i.max]);return(0,z.jsx)(`div`,{className:n,"data-verse-resizer":e,"data-dragging":s?`true`:void 0,role:`separator`,"aria-orientation":`vertical`,"aria-label":t,"aria-valuemin":i.min,"aria-valuemax":i.max,"aria-valuenow":a,"aria-valuetext":`${a} pixels`,tabIndex:0,onPointerDown:u,onPointerUp:l,onPointerCancel:l,onLostPointerCapture:l,onKeyDown:d,onDoubleClick:()=>R(e)})}var H={chat:`_chat_nw6lr_13`,main:`_main_nw6lr_44`,banner:`_banner_nw6lr_66`,bannerWarn:`_bannerWarn_nw6lr_67`,resize:`_resize_nw6lr_110`,scrim:`_scrim_nw6lr_11`,dialogActions:`_dialogActions_nw6lr_177`,sidebarSkeleton:`_sidebarSkeleton_nw6lr_187`,workspaceSkeleton:`_workspaceSkeleton_nw6lr_195`,skeletonHeader:`_skeletonHeader_nw6lr_201`,skeletonBody:`_skeletonBody_nw6lr_209`,skeletonComposer:`_skeletonComposer_nw6lr_219`},U=e({ChatSection:()=>Y,describeChatError:()=>Nt,escClosesDockSheet:()=>Bt,preloadChatSurface:()=>q}),gt=(0,v.lazy)(()=>r(()=>import(`./DockHost-BHbosAjM.js`).then(e=>({default:e.DockHost})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]))),_t=(0,v.lazy)(()=>r(()=>import(`./NewChatDialog-BL15LCaj.js`).then(e=>({default:e.NewChatDialog})),__vite__mapDeps([16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,9,43,44,45,46,47,48]))),vt=(0,v.lazy)(()=>r(()=>import(`./DevinStopDialog-CADdSqha.js`).then(e=>({default:e.DevinStopDialog})),__vite__mapDeps([49,17,18,1,43,12,50]))),yt=_(()=>r(()=>import(`./Workspace-BYT3iuNM.js`).then(e=>e.Workspace),__vite__mapDeps([51,18,17,52,31,53,54,55,56,57,19,24,22,23,21,28,29,33,35,34,36,37,38,39,40,1,2,58,59,60,61,3,62,63,64,65,66,67,68,69,70,71,72,73,74,4,5,6,75,76,77,78,79,80,81,82,9,43,83,8,84,10,11,85,45,12,13,86,87,14,88,89,90]))),bt=yt.Slot,W=_(()=>r(()=>import(`./Sidebar-CqOJle0q.js`).then(e=>e.Sidebar),__vite__mapDeps([91,17,18,92,19,28,24,22,23,41,42,1,2,61,60,58,59,66,3,63,62,64,9,43,93,8,10,11,12,13,86,94]))),xt=W.Slot,G=_(()=>r(()=>import(`./DeleteChatDialog-BT5y9cR2.js`).then(e=>e.DeleteChatDialog),__vite__mapDeps([95,17,18,1,43,12]))),St=G.Slot,K=_(()=>r(()=>import(`./MutationTokenDialog-D522NXsm.js`).then(e=>e.n).then(e=>e.MutationTokenDialog),__vite__mapDeps([52,17,18,9,43,83]))),Ct=K.Slot,wt=Re(()=>Promise.all([r(()=>import(`./tasks-model-BueAhEAf.js`),__vite__mapDeps([65,19,58,59,66,9])),r(()=>import(`./turn-files-BW0SiN39.js`),__vite__mapDeps([96,58,59]))]).then(([e,t])=>({otherRunningChats:e.otherRunningChats,lastTurnFiles:t.lastTurnFiles}))),Tt=Re(()=>r(()=>import(`./verse-model-CkF3q2IH.js`).then(e=>e.k).then(e=>({firstRunnableModel:e.firstRunnableModel,seatById:e.seatById})),__vite__mapDeps([19,9]))),Et=Re(()=>r(()=>import(`./panes-BjUzIDw6.js`).then(e=>e.t).then(e=>({matchPaneShortcut:e.matchPaneShortcut,preloadPaneIds:e.preloadPaneIds})),__vite__mapDeps([4,3,5,1,6,9,10,8,11,12,14]))),Dt=[],Ot=[];function q(){return Promise.all([yt.ready(),W.ready(),G.ready(),K.ready(),wt.ready(),Tt.ready()])}function kt(){return(0,z.jsx)(`nav`,{className:H.sidebarSkeleton,"aria-busy":`true`,"aria-label":`Loading chat list`,children:[64,82,58,76,70].map(e=>(0,z.jsx)(p,{width:`${e}%`},e))})}function At(){return(0,z.jsxs)(`div`,{className:H.workspaceSkeleton,role:`status`,"aria-label":`Loading chat`,children:[(0,z.jsx)(`div`,{className:H.skeletonHeader,children:(0,z.jsx)(p,{width:`32%`})}),(0,z.jsxs)(`div`,{className:H.skeletonBody,children:[(0,z.jsx)(p,{width:`72%`}),(0,z.jsx)(p,{width:`88%`}),(0,z.jsx)(p,{width:`64%`})]}),(0,z.jsx)(`div`,{className:H.skeletonComposer,children:(0,z.jsx)(p,{width:`100%`})})]})}var jt=`ashlr.verse.selected.v1`;function Mt(){try{return localStorage.getItem(jt)}catch{return null}}function Nt(e){return e instanceof u?"This server was started without dispatch — run `ashlr verse` to chat.":e instanceof d?e.code===`VERSE_MODEL_UNAVAILABLE`?`${(e.detail??`This chat's model cannot run on its seat.`).replace(/\.?$/,`.`)} Continue in a fresh chat on a model this seat can run, or re-pin the seat's CLI (\`ashlr resources profile repin\`).`:e.status===409&&(e.code===null||e.code===`VERSE_SESSION_BUSY`)?`A turn is already running in this chat. Stop it first.`:e.status===413?`That message is too large (64 KB max).`:e.status===401?`Mutation token was rejected. Unlock again with the token ashlr verse printed.`:e.detail??e.message:e instanceof Error?e.message:`Something went wrong.`}function Pt(){let[e,t]=(0,v.useState)(()=>typeof window>`u`?1440:window.innerWidth||1440);return(0,v.useEffect)(()=>{let e=()=>t(window.innerWidth||1440);return window.addEventListener(`resize`,e),()=>window.removeEventListener(`resize`,e)},[]),e}function Ft(){requestAnimationFrame(()=>{document.querySelector(`textarea[aria-label="Message"]`)?.focus()})}function It(e){return e instanceof Element&&!!e.closest(`input, textarea, select, [contenteditable="true"], [data-dock-pane="terminal"]`)}function Lt(e){return e instanceof Element&&e.closest(`[role="dialog"], [role="menu"], [role="listbox"], [aria-modal="true"]`)!==null}function J(e){if(ve()){be(!1),re(e);return}ye(e)}function Rt(e){return e instanceof Element&&e.closest(`textarea[aria-label="Message"]`)!==null}function zt(){return document.querySelector(`[data-dock-layer] [role="dialog"][aria-modal="true"]`)}function Bt(e){if(e.key!==`Escape`||e.defaultPrevented||e.metaKey||e.ctrlKey||e.altKey||e.shiftKey||ve())return!1;let t=zt();return!t||e.target instanceof Node&&t.contains(e.target)?!1:Rt(e.target)||!It(e.target)}function Y(){let e=l(Le),t=l(Ie),n=c(Ie),r=c(Le),i=s(),u=ee(),d=Se(),f=Te(),p=g(e=>e.open&&e.tabs.length>0),re=g(e=>e.placement),Pe=g(e=>e.width),Re=g(e=>e.height),_=g(e=>e.open&&(e.active===`terminal`||e.splitWith===`terminal`)),y=Ue(),Ke=Pt(),b=ge(),[x,Je]=(0,v.useState)(Mt),[Ye,Xe]=(0,v.useState)(``),[S,Qe]=(0,v.useState)({open:!1}),[$e,C]=(0,v.useState)(!1),[et,w]=(0,v.useState)(null),[nt,it]=(0,v.useState)(0),[at,ot]=(0,v.useState)({open:!1,reason:``}),[st,E]=(0,v.useState)(null),[ct,lt]=(0,v.useState)(null),[D,O]=(0,v.useState)(null),[ut,k]=(0,v.useState)(0),[A,j]=(0,v.useState)(0),M=(0,v.useRef)(null),N=(0,v.useRef)(null),dt=mt(),P=(0,v.useMemo)(()=>e.data?.seats??[],[e.data]),F=(0,v.useMemo)(()=>e.data?.projects??[],[e.data]),pt=l(Ee),I=(0,v.useMemo)(()=>pt.data?.workspaces??[],[pt.data]),L=e.data?.dispatchEnabled??!0,R=Ge(x,nt),B=Ze(R.session),V=(0,v.useMemo)(()=>{let n=t.data??e.data?.sessions??[];if(!R.session)return n;let r=R.session;return n.some(e=>e.id===r.id)?n.map(e=>e.id===r.id?r:e):[r,...n]},[t.data,e.data,R.session]),U=(0,v.useCallback)(e=>{Je(e);try{e?localStorage.setItem(jt,e):localStorage.removeItem(jt)}catch{}},[]);(0,v.useEffect)(()=>{x&&t.data&&!t.data.some(e=>e.id===x)&&!R.session&&U(null)},[x,t.data,R.session,U]),(0,v.useEffect)(()=>He(),[]);let yt=(0,v.useRef)(x);(0,v.useEffect)(()=>{ae(x),we(x),yt.current!==x&&(yt.current=x,te())},[x]);let W=R.session?.turnCount??null;(0,v.useEffect)(()=>{f&&x&&W!==null&&(typeof document>`u`||document.visibilityState!==`hidden`)&&We(x,W)},[f,x,W]);let G=(0,v.useCallback)((e,t)=>i.hasHold?t():new Promise((n,r)=>{M.current={run:()=>{t().then(n,r)},cancel:()=>n(null)},ot({open:!0,reason:e})}),[i.hasHold]),K=(0,v.useCallback)(e=>{e instanceof Me||u.show(Nt(e),`danger`)},[u]),q=(0,v.useCallback)((e={})=>{w(null);let t=R.session,n=e.projectPath===void 0?t?.projectPath??null:e.projectPath,r=t&&n===t.projectPath?{seatId:t.seatId,model:t.model}:null,i=e.seat??r??ne(n);Qe({open:!0,projectPath:n,seat:i})},[R.session]),Rt=(0,v.useCallback)(async e=>{await G(`Starting a chat spawns an agent process for this project.`,async()=>{C(!0),w(null);try{let t=await Oe(e);he(t.projectPath,{seatId:t.seatId,model:t.model}),ze(t.id,t),Qe({open:!1}),U(t.id),u.show(`Started “${t.title}”`,`success`)}catch(e){w(Nt(e))}finally{C(!1)}})},[G,U,u]),zt=(0,v.useCallback)(async e=>{let t=x;return t?await G(`Sending a message runs the agent against this project.`,async()=>{Ve(t,`running`);try{let n=await Ae(t,e);return ze(t,n.session,n.turnId),!0}catch(e){return Ve(t,`idle`),K(e),!1}})===!0:!1},[x,G,K]),Y=(0,v.useCallback)(e=>{G(`Stopping the running turn.`,async()=>{try{await ke(e)}catch(e){K(e)}})},[G,K]),Vt=(0,v.useCallback)((e=x)=>{if(!e)return;let t=R.session&&R.session.id===e?R.session:null;if(t&&t.engine===`devin`&&t.seatId!==`devin-cli`&&t.nativeSessionId){O(t);return}Y(e)},[x,R.session,Y]),Ht=(0,v.useCallback)(e=>{G(`Terminating the Devin session.`,async()=>{try{await Fe(e)}catch(e){K(e)}})},[G,K]),Ut=(0,v.useCallback)(async(e,t)=>await G(`Renaming a chat.`,async()=>{try{let n=await je(e,t);return ze(e,n),!0}catch(e){return K(e),!1}})===!0,[G,K]),Wt=(0,v.useCallback)(async e=>await G(`Deleting a chat removes its transcript from disk.`,async()=>{try{return await Ne(e),Be(e),a(e),e===x&&U(null),u.show(`Chat deleted.`,`neutral`),!0}catch(e){return K(e),!1}})===!0,[G,K,U,u,x]),Gt=(0,v.useCallback)((e,t,n)=>{G(n,async()=>{try{await De(e,t)}catch(e){K(e)}})},[G,K]),Kt=(0,v.useCallback)(e=>{let t=R.session;t&&(q({projectPath:t.projectPath,seat:e}),u.show(`Chats are bound to one seat — starting a new chat on the same project.`,`neutral`))},[R.session,q,u]),qt=(0,v.useCallback)(e=>{let t=V.find(t=>t.id===e)??null;t&&lt(t)},[V]),Jt=(0,v.useCallback)(e=>{e!==x&&U(e),E(e)},[x,U]),Yt=(0,v.useCallback)(e=>{U(e),window.matchMedia?.(`(max-width: 760px)`)?.matches===!0&&m(!0)},[U]),Xt=(0,v.useCallback)(()=>m(!d.sidebarCollapsed),[d.sidebarCollapsed]),Zt=(0,v.useCallback)(()=>{if(ve())be(!1);else if(_){ye(`terminal`);return}ue({})},[_]),Qt=(0,v.useCallback)(()=>ue({newTab:!0}),[]),$t=(0,v.useRef)(0),en=Tt.useLoaded();(0,v.useEffect)(()=>{let e=d.command;if(e&&e.nonce!==$t.current&&(e.name!==`new-chat`||en)){switch($t.current=e.nonce,e.name){case`open-session`:e.sessionId&&U(e.sessionId);break;case`focus-composer`:Ft();break;case`new-chat`:{let{seatById:t,firstRunnableModel:n}=en,r=e.seatId?t(P,e.seatId):void 0,i=ne(e.projectPath??null),a=r?i?.seatId===r.id?i.model:n(r)?.id:void 0;q({...e.projectPath===void 0?{}:{projectPath:e.projectPath},...r&&a?{seat:{seatId:r.id,model:a}}:{}});break}}oe()}},[d.command,q,P,U,en]);let X=new Map([[`chat.sidebar`,Xt],[`chat.find`,()=>tt()],[`chat.turn-prev`,()=>rt(-1)],[`chat.turn-next`,()=>rt(1)],[`dock.toggle`,_e],[`dock.terminal`,Zt],[`dock.terminal-new`,Qt],[`dock.preview`,()=>J(`browser`)],[`dock.diff`,()=>J(`diff`)],[`dock.files`,()=>J(`files`)],[`dock.sources`,()=>J(`sources`)],[`dock.reasoning`,()=>J(`reasoning`)],[`dock.placement`,me],[`chat.focus-mode`,de]]);h(`chat.sidebar`,X.get(`chat.sidebar`)),h(`chat.find`,X.get(`chat.find`)),h(`chat.turn-prev`,X.get(`chat.turn-prev`)),h(`chat.turn-next`,X.get(`chat.turn-next`)),h(`dock.toggle`,X.get(`dock.toggle`)),h(`dock.terminal`,X.get(`dock.terminal`)),h(`dock.terminal-new`,X.get(`dock.terminal-new`)),h(`dock.preview`,X.get(`dock.preview`)),h(`dock.diff`,X.get(`dock.diff`)),h(`dock.files`,X.get(`dock.files`)),h(`dock.sources`,X.get(`dock.sources`)),h(`dock.reasoning`,X.get(`dock.reasoning`)),h(`dock.placement`,X.get(`dock.placement`)),h(`chat.focus-mode`,X.get(`chat.focus-mode`));let tn=(0,v.useRef)(X);tn.current=X;let Z=Et.useLoaded(),nn=(0,v.useRef)(Z);nn.current=Z,(0,v.useEffect)(()=>{Z&&Z.preloadPaneIds([...le().tabs,`tasks`])},[Z]),(0,v.useEffect)(()=>{if(!f)return;let e=e=>{if(e.defaultPrevented||Lt(e.target))return;if(Bt(e)){e.preventDefault(),ce();return}if(e.key===`Escape`&&ve()&&!It(e.target)){e.preventDefault(),be(!1);return}let t=se(e,[`chat`]);if(!t){let t=nn.current?.matchPaneShortcut(e);t&&(e.preventDefault(),J(t.id));return}if(t.scope!==`chat`||t.id===`chat.find`||t.id===`chat.turn-prev`||t.id===`chat.turn-next`)return;let n=tn.current.get(t.id);n&&(e.preventDefault(),n())};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[f]);let rn=e.data?!e.data.dispatchEnabled:!1,Q=d.sidebarCollapsed;(0,v.useEffect)(()=>{!f&&b&&be(!1)},[f,b]);let an=pe(Ke,re),on=p,sn=on&&an===`column`&&!b,cn=on&&an===`bottom`&&!b,ln=cn?Ce(Re,A):0,un=Q?0:T.sidebar.min,dn=ut>0?ut-480-un:1/0,fn=sn?Math.max(xe.minWidth,Math.min(fe(Pe,Ke),dn)):0;(0,v.useEffect)(()=>{let e=N.current;if(!e)return;let t=()=>{k(e.clientWidth),j(e.clientHeight),ft({containerWidth:Math.max(0,e.clientWidth-fn),sidebarVisible:!Q,resourcesVisible:!1})};t();let n=typeof ResizeObserver==`function`?new ResizeObserver(t):null;return n?.observe(e),window.addEventListener(`resize`,t),()=>{n?.disconnect(),window.removeEventListener(`resize`,t)}},[Q,fn]);let pn={"--verse-sidebar-width":`${dt.effective.sidebar}px`,"--verse-dock-width":`${fn}px`,"--verse-dock-height":`${ln}px`},mn=(0,v.useCallback)(e=>{(!x||!qe(x,e))&&u.show(`Open a chat to send this to it.`,`neutral`)},[x,u]),hn=(0,v.useCallback)(e=>{(!x||!qe(x,e))&&u.show(`Open a chat to add this to its message.`,`neutral`)},[x,u]),gn=(0,v.useCallback)(()=>ie(`apps`),[]),$=wt.useLoaded(),_n=(0,v.useMemo)(()=>$?$.otherRunningChats(V,y.activity,x):Dt,[$,V,y.activity,x]),vn=(0,v.useMemo)(()=>$?$.lastTurnFiles(R.events,B.roots):Ot,[$,B.roots,R.events]),yn={setPinned:(e,t)=>Gt(e,{pinned:t},t?`Pinning a chat.`:`Unpinning a chat.`),setArchived:(e,t)=>Gt(e,{archived:t},t?`Archiving a chat.`:`Unarchiving a chat.`),rename:Ut,handoff:Jt,requestDelete:qt,dispatchEnabled:L};return(0,z.jsxs)(`div`,{ref:N,className:H.chat,style:pn,"data-sidebar":Q||b?`collapsed`:`open`,"data-dock":sn?`open`:cn?`bottom`:`closed`,"data-focus":b?`on`:void 0,children:[(0,z.jsx)(v.Suspense,{fallback:(0,z.jsx)(kt,{}),children:(0,z.jsx)(xt,{sessions:V,sessionsStatus:t.status,sessionsError:t.error?.message??null,projects:F,seats:P,selectedId:x,query:Ye,onQuery:Xe,onSelect:Yt,onNew:()=>q(),onRetry:()=>{n(),r()},onCollapse:()=>m(!0),onDisconnect:()=>{o()},activity:y.activity,meta:y.meta,metaError:y.metaError,localSeen:y.localSeen,actions:yn})}),Q?null:(0,z.jsx)(ht,{side:`sidebar`,label:`Resize chat list`,className:H.resize}),(0,z.jsx)(`button`,{type:`button`,className:H.scrim,"aria-label":`Close chat list`,tabIndex:-1,onClick:()=>m(!0)}),(0,z.jsxs)(`div`,{className:H.main,children:[e.status===`error`&&!e.data?(0,z.jsxs)(`div`,{role:`alert`,className:H.banner,children:[(0,z.jsx)(`span`,{children:e.error?.message??`Could not load Verse.`}),(0,z.jsx)(`button`,{type:`button`,onClick:r,children:`Retry`})]}):rn?(0,z.jsxs)(`div`,{role:`status`,className:H.bannerWarn,children:[`Read-only: this server was started without dispatch. Run `,(0,z.jsx)(`code`,{children:`ashlr verse`}),` to send messages.`]}):null,(0,z.jsx)(v.Suspense,{fallback:(0,z.jsx)(At,{}),children:(0,z.jsx)(bt,{view:R,seats:P,projects:F,dispatchEnabled:L,locked:!i.hasHold,hasAnySessions:V.length>0,onSend:zt,onStop:()=>Vt(),onRename:e=>x?Ut(x,e):Promise.resolve(!1),onRequestDelete:()=>{x&&qt(x)},onRequestDevinStop:()=>{R.session&&O(R.session)},onSeatChange:Kt,onNew:()=>q(),onRetry:()=>it(e=>e+1),sidebarCollapsed:Q,onToggleSidebar:()=>m(!Q),onOpenSession:U,handoffOpen:st!==null&&st===x,onHandoffOpenChange:e=>E(e?x:null),otherRunning:_n})})]}),on?(0,z.jsx)(v.Suspense,{fallback:null,children:(0,z.jsx)(gt,{presentation:an,windowWidth:Ke,columnWidth:fn,columnMax:dn,columnHeight:A,session:R.session,seats:P,events:R.events,roots:B.roots,rootsData:B.data,rootsError:B.error,turnFiles:vn,otherRunning:_n,dispatchEnabled:L,onOpenSession:U,onHandoff:E,onOpenAccounts:gn,onSendToChat:mn,onAddToMessage:hn})}):null,S.open?(0,z.jsx)(v.Suspense,{fallback:null,children:(0,z.jsx)(_t,{open:!0,onClose:()=>Qe({open:!1}),projects:F,seats:P,workspaces:I,initialProjectPath:S.projectPath??null,initialSeat:S.seat??null,busy:$e,error:et,onCreate:Rt,runMutation:G})}):null,D?(0,z.jsx)(v.Suspense,{fallback:null,children:(0,z.jsx)(vt,{open:!0,chatLabel:D.title,running:D.status===`running`,onCancel:()=>O(null),onStopWatching:()=>{let e=D.id;O(null),Y(e)},onTerminate:()=>{let e=D.id;O(null),Ht(e)}})}):null,(0,z.jsxs)(v.Suspense,{fallback:null,children:[(0,z.jsx)(St,{target:ct,onClose:()=>lt(null),onDelete:Wt,actionsClassName:H.dialogActions}),(0,z.jsx)(Ct,{open:at.open,reason:at.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:()=>{ot({open:!1,reason:``});let e=M.current;e&&setTimeout(()=>{M.current===e&&(M.current=null,e.cancel())},0)},onUnlocked:()=>{let e=M.current;M.current=null,e?.run()}})]})]})}export{Y as ChatSection,$e as a,qe as c,Nt as describeChatError,Bt as escClosesDockSheet,nt as i,Ke as l,et as n,Ze as o,q as preloadChatSurface,Qe as r,b as s,U as t};
3
- //# sourceMappingURL=ChatSection-DV9smoPe.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/composer-bridge.ts","../../../../../../src/web-ui/routes/verse/chat/use-session-roots.ts","../../../../../../src/web-ui/routes/verse/chat/transcript-jump.ts","../../../../../../src/web-ui/routes/verse/chat-panel-sizing.ts","../../../../../../src/web-ui/routes/verse/ChatResizer.tsx","../../../../../../src/web-ui/routes/verse/sections/ChatSection.tsx"],"sourcesContent":["/**\n * routes/verse/chat/composer-bridge.ts — how the chat's other surfaces put\n * text INTO the composer without sending it (unit C2).\n *\n * Three dock actions draft into the message box and leave the send to the\n * operator (the first spend is always their press):\n * - Terminal ▸ \"Send selection to chat\" — the selection as a fenced block;\n * - Review ▸ \"Add to message\" — `path:line: note`;\n * - anything later that \"drafts a follow-up\".\n *\n * The composer is C3's component and owns its text state. The clean seam is\n * for it to register an inserter here (`registerComposerInserter`) — that is\n * a cross-unit request. Until it does, the fallback types into the composer's\n * textarea the way a paste would: the native value setter plus an `input`\n * event, which React's controlled textarea treats as the operator's own\n * edit (so its draft persistence, cost hint and undo stack all see it).\n * Either way the text is APPENDED on its own paragraph and never sent.\n */\n\nexport type ComposerInserter = (text: string) => void;\n\nconst inserters = new Map<string, ComposerInserter>();\n\n/** C3: `useEffect(() => registerComposerInserter(sessionId, insert), [sessionId])`. Returns the unregister. */\nexport function registerComposerInserter(sessionId: string, insert: ComposerInserter): () => void {\n inserters.set(sessionId, insert);\n return () => {\n if (inserters.get(sessionId) === insert) inserters.delete(sessionId);\n };\n}\n\n/** Join an insertion onto existing text: its own paragraph, never glued to a half-typed word. */\nexport function appendParagraph(current: string, text: string): string {\n const addition = text.replace(/\\s+$/, '');\n if (!current.trim()) return addition;\n return `${current.replace(/\\s+$/, '')}\\n\\n${addition}`;\n}\n\n/** The composer's message box in the chat surface (C3's `aria-label=\"Message\"`). */\nfunction findComposerBox(root: ParentNode = document): HTMLTextAreaElement | null {\n const node = root.querySelector('textarea[aria-label=\"Message\"]');\n return node instanceof HTMLTextAreaElement ? node : null;\n}\n\n/**\n * Append `text` to `sessionId`'s composer and focus it. False when there is\n * no composer to write into (no chat open, or it is disabled) — the caller\n * then says so rather than dropping the text silently.\n */\nexport function insertIntoComposer(sessionId: string, text: string): boolean {\n if (!text.trim()) return false;\n const registered = inserters.get(sessionId);\n if (registered) {\n registered(text);\n return true;\n }\n const box = findComposerBox();\n if (!box || box.disabled) return false;\n const next = appendParagraph(box.value, text);\n const setter = Object.getOwnPropertyDescriptor(HTMLTextAreaElement.prototype, 'value')?.set;\n if (setter) setter.call(box, next);\n else box.value = next;\n box.dispatchEvent(new Event('input', { bubbles: true }));\n box.focus();\n const end = box.value.length;\n try {\n box.setSelectionRange(end, end);\n } catch {\n /* a detached or hidden box has no selection; the text is in either way */\n }\n return true;\n}\n","/**\n * routes/verse/chat/use-session-roots.ts — one read of a chat's roots for\n * everything that needs them (unit C2): the header's `repo › branch`\n * breadcrumb, the Context pane's Folders list, and the roots handed to the\n * Branch bar, Terminal, Preview and Review slots.\n *\n * Before 3.10 only SessionRoots read `/sessions/:id/roots`, fetching on its\n * own. With four consumers that would be four requests per chat switch (each\n * one `git status` per root on the server), so the read goes through the\n * shared query cache under one key per chat. A branch goes stale the moment\n * a turn commits, so the read is refreshed whenever the chat's turnCount\n * moves — exactly as SessionRoots' `refreshKey` did.\n */\nimport { useEffect, useMemo, useRef } from 'react';\nimport type { VerseSession, VerseSessionRootsResponse } from '../../../data/api-types.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { fetchVerseSessionRoots } from '../verse-queries.js';\n\nexport function sessionRootsKey(sessionId: string): string {\n return `verse-session-roots:${sessionId}`;\n}\n\nconst NO_SESSION: QueryDef<VerseSessionRootsResponse | null> = {\n key: 'verse-session-roots:none',\n fetch: async () => null,\n};\n\nexport interface SessionRootsView {\n data: VerseSessionRootsResponse | null;\n error: string | null;\n /** Roots in priority order: the primary first, then the pinned extras. Known before the read lands. */\n roots: readonly string[];\n /** The primary root's branch, when it is a git repo and the read landed. */\n branch: string | null;\n}\n\n/** Roots as the session RECORD states them — usable before (and without) the status read. */\nexport function recordRoots(session: Pick<VerseSession, 'projectPath' | 'extraRoots'> | null): string[] {\n if (!session) return [];\n return [session.projectPath, ...(session.extraRoots ?? []).filter((r) => r !== session.projectPath)];\n}\n\nexport function useSessionRoots(session: Pick<VerseSession, 'id' | 'projectPath' | 'extraRoots' | 'turnCount'> | null): SessionRootsView {\n const sessionId = session?.id ?? null;\n const def = useMemo<QueryDef<VerseSessionRootsResponse | null>>(\n () => (sessionId\n ? { key: sessionRootsKey(sessionId), fetch: (signal) => fetchVerseSessionRoots(sessionId, signal) }\n : NO_SESSION),\n [sessionId],\n );\n const query = useQuery(def);\n const refetch = useRefetch(def);\n\n // A finished turn may have committed or switched branch: re-read. The\n // first value for a chat is the mount's own fetch, not a change.\n const turnCount = session?.turnCount ?? 0;\n const seen = useRef<{ id: string | null; turns: number }>({ id: sessionId, turns: turnCount });\n useEffect(() => {\n const prev = seen.current;\n seen.current = { id: sessionId, turns: turnCount };\n if (prev.id === sessionId && prev.turns !== turnCount && sessionId) refetch();\n }, [sessionId, turnCount, refetch]);\n\n // A reply without a roots list (an older server, a stub) is treated as no\n // reading at all rather than trusted into a crash.\n const raw = query.data ?? null;\n const data = raw !== null && Array.isArray(raw.roots) ? raw : null;\n const fromRecord = useMemo(() => recordRoots(session), [session?.projectPath, session?.extraRoots]); // eslint-disable-line react-hooks/exhaustive-deps -- the two fields ARE the dependency\n const roots = useMemo(() => {\n if (!data || data.roots.length === 0) return fromRecord;\n const primary = data.roots.filter((r) => r.primary).map((r) => r.path);\n const rest = data.roots.filter((r) => !r.primary).map((r) => r.path);\n return [...primary, ...rest];\n }, [data, fromRecord]);\n const primary = data?.roots.find((r) => r.primary) ?? data?.roots[0] ?? null;\n return {\n data,\n error: query.status === 'error' ? query.error?.message ?? 'could not read this chat’s folders' : null,\n roots,\n branch: primary?.git?.branch ?? null,\n };\n}\n","/**\n * routes/verse/chat/transcript-jump.ts — \"scroll the open transcript to this\n * tool call\", from outside the transcript (unit C2).\n *\n * The dock's Tasks pane lists this turn's calls and a click must land on\n * the call in the transcript — but the pane is a different subtree (and, as\n * a sheet, a different layer). The mounted Transcript subscribes here and\n * performs the jump with its own machinery (opening a folded activity group,\n * the locator flash, focus). A tiny module, so the dock does not import the\n * transcript.\n */\ntype JumpListener = (anchorId: string) => boolean;\n\nconst listeners = new Set<JumpListener>();\n\nexport function onTranscriptJump(listener: JumpListener): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n}\n\n/** True when a mounted transcript took the jump. */\nexport function requestTranscriptJump(anchorId: string): boolean {\n let handled = false;\n for (const listener of [...listeners]) if (listener(anchorId)) handled = true;\n return handled;\n}\n\n// ⌘F from the palette (\"Find in chat\"): focus the transcript's own search.\nconst findListeners = new Set<() => boolean>();\n\nexport function onTranscriptFind(listener: () => boolean): () => void {\n findListeners.add(listener);\n return () => findListeners.delete(listener);\n}\n\nexport function requestTranscriptFind(): boolean {\n let handled = false;\n for (const listener of [...findListeners]) if (listener()) handled = true;\n return handled;\n}\n\n// ⌥↑ / ⌥↓ routed through the command bus (palette, native menu).\nconst stepListeners = new Set<(delta: 1 | -1) => boolean>();\n\nexport function onTranscriptStep(listener: (delta: 1 | -1) => boolean): () => void {\n stepListeners.add(listener);\n return () => stepListeners.delete(listener);\n}\n\nexport function requestTranscriptStep(delta: 1 | -1): boolean {\n let handled = false;\n for (const listener of [...stepListeners]) if (listener(delta)) handled = true;\n return handled;\n}\n","/**\n * routes/verse/chat-panel-sizing.ts — how wide the two side panels of the\n * Chat section are, and what the viewport will actually let them be.\n *\n * WHY THIS IS NOT `ashlr.verse.ui.v2`. That key's shape is the shell contract\n * (docs/VERSE-CONTRACT-V2.md) and verse-ui-store.test pins it field for\n * field; the same precedent that put `resources-collapse.ts` under its own\n * key applies here. This module also needs something the shell store cannot\n * express: a width is not a single number but a PAIR — what the operator\n * asked for, and what the window is currently wide enough to give them.\n *\n * DESIRED vs EFFECTIVE. A sidebar dragged to 420px on a 1900px display must\n * not strand the transcript when the same window is later 1100px wide. So the\n * operator's choice (`desired`) is what persists, and `effective` is that\n * choice re-fitted to the container on every layout change. Shrinking the\n * window narrows the panel; widening it gives the width back, because the\n * transient value was never written down.\n *\n * Pure aside from the two localStorage functions, and framework-free — the\n * React glue lives in ChatResizer.tsx, the same split as\n * verse-ui-store.ts / useVerseUi.ts.\n */\n\nexport type ChatPanelSide = 'sidebar' | 'resources';\n\nexport interface ChatPanelRange {\n readonly min: number;\n readonly max: number;\n readonly def: number;\n}\n\n/**\n * Minimum and maximum are both load-bearing. The minimum is the width below\n * which the panel stops being a panel and becomes a sliver of truncated\n * text; the maximum keeps a wide display from turning the transcript into a\n * column. Defaults match what the shell has always opened at, so nothing\n * moves for an operator who never drags anything.\n */\nexport const CHAT_PANEL_RANGES: Readonly<Record<ChatPanelSide, ChatPanelRange>> = {\n sidebar: { min: 220, max: 420, def: 264 },\n resources: { min: 240, max: 520, def: 320 },\n};\n\n/**\n * The transcript's floor. Below `--measure-read` (720px) reading is already\n * compromised; 480px is where the composer's own controls start wrapping, and\n * it is the point past which a side panel must give width back instead of\n * taking more. The narrow-width media queries in ChatSection.module.css take\n * over below that — this number only decides who yields first.\n */\nexport const MIN_TRANSCRIPT_WIDTH = 480;\n\n/** The 1px hairline track each visible resizer occupies. */\nconst HAIRLINE = 1;\n\n/** Arrow-key step, and the coarse step Shift asks for. */\nexport const CHAT_PANEL_STEP = 16;\nexport const CHAT_PANEL_STEP_COARSE = 64;\n\nexport const CHAT_PANEL_SIZING_KEY = 'ashlr.verse.panels.v1';\n\n/**\n * Read-only migration source. Panel widths lived in the shell store before\n * they were draggable; seeding from it once means an upgrade does not reset\n * a width the operator had already chosen. Never written to from here.\n */\nconst LEGACY_SHELL_KEY = 'ashlr.verse.ui.v2';\n\nexport interface ChatPanelWidths {\n readonly sidebar: number;\n readonly resources: number;\n}\n\n/** What the chat grid can currently afford. */\nexport interface ChatPanelFit {\n /**\n * Width in px of the chat grid itself (NOT the window): rail excluded,\n * because the rail is not the section's to spend. Zero or unknown — jsdom,\n * a hidden section, the first paint — disables viewport fitting entirely\n * rather than guessing, so a width is never clamped against a measurement\n * that does not exist.\n */\n readonly containerWidth: number;\n readonly sidebarVisible: boolean;\n readonly resourcesVisible: boolean;\n}\n\nexport const UNKNOWN_FIT: ChatPanelFit = {\n containerWidth: 0,\n sidebarVisible: true,\n resourcesVisible: true,\n};\n\nexport interface ChatPanelSizing {\n /** The operator's choice. This is what persists. */\n readonly desired: ChatPanelWidths;\n /** That choice, re-fitted to the current container. This is what renders. */\n readonly effective: ChatPanelWidths;\n}\n\n/**\n * Clamp one width into its own range. Nonsense — NaN, a string, a negative\n * number out of a hand-edited localStorage entry — resolves to the default\n * rather than to the minimum, so a corrupt value reads as \"never chosen\".\n */\nexport function clampPanelWidth(side: ChatPanelSide, value: unknown): number {\n const range = CHAT_PANEL_RANGES[side];\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/**\n * Re-fit a chosen pair of widths to the container.\n *\n * The resources panel yields first: it is the optional one (it has a toggle,\n * the sidebar's collapse is an overlay at phone width), so on a narrowing\n * window the operator loses reference material before they lose navigation.\n * Neither panel is ever pushed below its own minimum — past that point the\n * media queries hide a panel outright, which is a better answer than a 40px\n * stub of clipped text.\n */\nexport function fitChatPanels(widths: ChatPanelWidths, fit: ChatPanelFit): ChatPanelWidths {\n let sidebar = clampPanelWidth('sidebar', widths.sidebar);\n let resources = clampPanelWidth('resources', widths.resources);\n if (!Number.isFinite(fit.containerWidth) || fit.containerWidth <= 0) return { sidebar, resources };\n\n const hairlines = (fit.sidebarVisible ? HAIRLINE : 0) + (fit.resourcesVisible ? HAIRLINE : 0);\n const budget = fit.containerWidth - MIN_TRANSCRIPT_WIDTH - hairlines;\n const spent = (fit.sidebarVisible ? sidebar : 0) + (fit.resourcesVisible ? resources : 0);\n let over = spent - budget;\n if (over <= 0) return { sidebar, resources };\n\n if (fit.resourcesVisible) {\n const give = Math.min(over, resources - CHAT_PANEL_RANGES.resources.min);\n resources -= give;\n over -= give;\n }\n if (over > 0 && fit.sidebarVisible) {\n const give = Math.min(over, sidebar - CHAT_PANEL_RANGES.sidebar.min);\n sidebar -= give;\n }\n return { sidebar, resources };\n}\n\n// ---------------------------------------------------------------------------\n// Persistence\n// ---------------------------------------------------------------------------\n\nexport function defaultChatPanelWidths(): ChatPanelWidths {\n return { sidebar: CHAT_PANEL_RANGES.sidebar.def, resources: CHAT_PANEL_RANGES.resources.def };\n}\n\n/** Parse either this module's payload or the legacy shell payload. */\nexport function parseChatPanelWidths(raw: string | null): ChatPanelWidths | null {\n if (raw === null || raw === '') return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return null;\n }\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) return null;\n const record = parsed as Record<string, unknown>;\n // `sidebarWidth`/`resourcesWidth` is the legacy shell spelling.\n const sidebar = record.sidebar ?? record.sidebarWidth;\n const resources = record.resources ?? record.resourcesWidth;\n if (sidebar === undefined && resources === undefined) return null;\n return {\n sidebar: clampPanelWidth('sidebar', sidebar),\n resources: clampPanelWidth('resources', resources),\n };\n}\n\nexport function readChatPanelWidths(): ChatPanelWidths {\n try {\n const own = parseChatPanelWidths(localStorage.getItem(CHAT_PANEL_SIZING_KEY));\n if (own) return own;\n // First run after the upgrade: inherit whatever the shell store had.\n return parseChatPanelWidths(localStorage.getItem(LEGACY_SHELL_KEY)) ?? defaultChatPanelWidths();\n } catch {\n return defaultChatPanelWidths();\n }\n}\n\nexport function writeChatPanelWidths(widths: ChatPanelWidths): void {\n try {\n localStorage.setItem(CHAT_PANEL_SIZING_KEY, JSON.stringify({\n sidebar: widths.sidebar,\n resources: widths.resources,\n }));\n } catch {\n /* a private window without storage still runs the app */\n }\n}\n\n// ---------------------------------------------------------------------------\n// Store\n// ---------------------------------------------------------------------------\n\nlet desired: ChatPanelWidths = readChatPanelWidths();\nlet fit: ChatPanelFit = UNKNOWN_FIT;\nlet snapshot: ChatPanelSizing = { desired, effective: fitChatPanels(desired, fit) };\nconst listeners = new Set<() => void>();\n\nfunction sameWidths(a: ChatPanelWidths, b: ChatPanelWidths): boolean {\n return a.sidebar === b.sidebar && a.resources === b.resources;\n}\n\n/** Snapshot identity changes only when a number actually changed. */\nfunction publish(): void {\n const effective = fitChatPanels(desired, fit);\n if (sameWidths(snapshot.desired, desired) && sameWidths(snapshot.effective, effective)) return;\n snapshot = { desired, effective };\n for (const listener of listeners) listener();\n}\n\nexport function subscribeChatPanels(listener: () => void): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\nexport function getChatPanelSizing(): ChatPanelSizing {\n return snapshot;\n}\n\n/**\n * Publish what the layout can afford. Called on mount, on window resize and\n * whenever a panel is shown or hidden. Deliberately does NOT persist: a\n * narrow window borrows width, it does not take it.\n */\nexport function setChatPanelFit(next: ChatPanelFit): void {\n if (\n fit.containerWidth === next.containerWidth\n && fit.sidebarVisible === next.sidebarVisible\n && fit.resourcesVisible === next.resourcesVisible\n ) return;\n fit = next;\n publish();\n}\n\nfunction commit(next: ChatPanelWidths): void {\n if (sameWidths(desired, next)) return;\n desired = next;\n writeChatPanelWidths(desired);\n publish();\n}\n\n/** A drag or a direct set. Range-clamped; the fit is applied on read. */\nexport function setChatPanelWidth(side: ChatPanelSide, value: number): void {\n commit({ ...desired, [side]: clampPanelWidth(side, value) });\n}\n\n/**\n * An arrow key. Steps from the EFFECTIVE width, so a keypress moves the\n * handle the operator can see rather than an off-screen remembered one.\n */\nexport function nudgeChatPanelWidth(side: ChatPanelSide, delta: number): void {\n setChatPanelWidth(side, snapshot.effective[side] + delta);\n}\n\n/** Double-click, and the Home/End extremes. */\nexport function resetChatPanelWidth(side: ChatPanelSide): void {\n setChatPanelWidth(side, CHAT_PANEL_RANGES[side].def);\n}\n\n/** Test hygiene — mirrors resetVerseUi(). */\nexport function resetChatPanelSizing(): void {\n desired = defaultChatPanelWidths();\n fit = UNKNOWN_FIT;\n snapshot = { desired, effective: fitChatPanels(desired, fit) };\n try {\n localStorage.removeItem(CHAT_PANEL_SIZING_KEY);\n } catch {\n /* ignore */\n }\n for (const listener of listeners) listener();\n}\n\n/** Re-read storage into the store (a fresh tab, or a test that seeded a key). */\nexport function reloadChatPanelSizing(): void {\n desired = readChatPanelWidths();\n snapshot = { desired, effective: fitChatPanels(desired, fit) };\n for (const listener of listeners) listener();\n}\n","/**\n * routes/verse/ChatResizer.tsx — the drag handle between the chat\n * transcript and a side panel.\n *\n * A 1px hairline that behaves like a 9px target: the hairline is the design\n * (DESIGN-V2 has no chrome), the grab area is the ergonomics. Three things\n * about it are not obvious and are all deliberate:\n *\n * 1. IT IS A CONTROL, NOT A DECORATION. `role=\"separator\"` with a tabindex is\n * the ARIA window-splitter pattern: arrow keys move it, Home/End take it\n * to its limits, and a double-click restores the default. A pointer-only\n * resizer simply does not exist for a keyboard operator.\n *\n * 2. IT MUST NOT EAT THE macOS DRAG STRIP. The grab area overhangs ±4px into\n * the panels either side, and the top 48px of those panels is the window's\n * own drag region (Sidebar `.headDragStrip`, Workspace `.header`\n * data-app-region=\"drag\"). It is painted after them, so without the\n * `--app-titlebar-height` inset in the stylesheet it would steal 4px of\n * the strip AND turn the macOS double-click-to-zoom into a width reset.\n * See desktop/README.md \"Desktop shell contract\".\n *\n * 3. THE DRAG IS RELEASED FROM `window`, NOT FROM THE ELEMENT. Pointer\n * capture is requested, but it is not relied on: a capture that fails, a\n * pointer that leaves the window, a button released over another app and\n * a mid-drag unmount all have to end the drag, because a stuck drag state\n * (everything selects, the cursor sticks) is the most visible bug this\n * control can have.\n */\nimport { useCallback, useEffect, useRef, useState, useSyncExternalStore, type KeyboardEvent, type PointerEvent } from 'react';\nimport {\n CHAT_PANEL_RANGES,\n CHAT_PANEL_STEP,\n CHAT_PANEL_STEP_COARSE,\n getChatPanelSizing,\n nudgeChatPanelWidth,\n resetChatPanelWidth,\n setChatPanelWidth,\n subscribeChatPanels,\n type ChatPanelSide,\n type ChatPanelSizing,\n} from './chat-panel-sizing.js';\n\n/** The React glue over chat-panel-sizing.ts (same split as useVerseUi.ts). */\nexport function useChatPanelSizing(): ChatPanelSizing {\n return useSyncExternalStore(subscribeChatPanels, getChatPanelSizing, getChatPanelSizing);\n}\n\n/**\n * Marks the body for the duration of a drag so the stylesheet can suppress\n * selection app-wide. An attribute rather than an inline style: it survives\n * React re-renders, it is one line of CSS, and a test can see it.\n */\nconst BODY_FLAG = 'verseResizing';\n\nfunction markBody(on: boolean): void {\n try {\n if (on) document.body.dataset[BODY_FLAG] = 'true';\n else delete document.body.dataset[BODY_FLAG];\n } catch {\n /* a detached document in a test teardown is not worth throwing over */\n }\n}\n\nexport interface ChatResizerProps {\n side: ChatPanelSide;\n /** The control's accessible name — what it resizes, in the operator's words. */\n label: string;\n className?: string;\n}\n\ninterface DragState {\n pointerId: number;\n originX: number;\n startWidth: number;\n}\n\nexport function ChatResizer({ side, label, className }: ChatResizerProps) {\n const sizing = useChatPanelSizing();\n const range = CHAT_PANEL_RANGES[side];\n const width = sizing.effective[side];\n const drag = useRef<DragState | null>(null);\n const [dragging, setDragging] = useState(false);\n\n /** The one way a drag ends. Idempotent, so every path can call it. */\n const endDrag = useCallback(() => {\n if (!drag.current) return;\n drag.current = null;\n setDragging(false);\n markBody(false);\n }, []);\n\n const onPointerDown = useCallback((event: PointerEvent<HTMLDivElement>) => {\n // Primary button only: a right-click here belongs to the context menu,\n // and a middle-click must not start a drag nobody asked for.\n if (event.button !== 0) return;\n event.preventDefault();\n drag.current = { pointerId: event.pointerId, originX: event.clientX, startWidth: width };\n setDragging(true);\n markBody(true);\n // Best-effort: it keeps the cursor and the events on the handle while the\n // pointer wanders. The window listeners below are the actual contract.\n try {\n event.currentTarget.setPointerCapture?.(event.pointerId);\n } catch {\n /* unsupported, or the pointer is already gone — the window listeners cover it */\n }\n }, [width]);\n\n // Move/end listeners live on the window for the whole drag, so a pointer\n // that leaves the viewport or a button released over another window still\n // lands here. Unmounting mid-drag runs the cleanup and clears the body flag.\n useEffect(() => {\n if (!dragging) return undefined;\n\n const onMove = (event: globalThis.PointerEvent) => {\n const state = drag.current;\n if (!state || event.pointerId !== state.pointerId) return;\n const delta = event.clientX - state.originX;\n // The sidebar grows to the right, the resources panel to the left.\n setChatPanelWidth(side, side === 'sidebar' ? state.startWidth + delta : state.startWidth - delta);\n };\n const onEnd = (event: globalThis.PointerEvent) => {\n const state = drag.current;\n if (state && event.pointerId !== state.pointerId) return;\n endDrag();\n };\n /** Escape puts the width back where the drag started. */\n const onKey = (event: globalThis.KeyboardEvent) => {\n const state = drag.current;\n if (!state || event.key !== 'Escape') return;\n setChatPanelWidth(side, state.startWidth);\n endDrag();\n };\n // The window losing focus (⌘-tab mid-drag, an OS dialog) never delivers a\n // pointerup, so treat it as one rather than staying stuck.\n const onBlur = () => endDrag();\n\n window.addEventListener('pointermove', onMove);\n window.addEventListener('pointerup', onEnd);\n window.addEventListener('pointercancel', onEnd);\n window.addEventListener('keydown', onKey);\n window.addEventListener('blur', onBlur);\n return () => {\n window.removeEventListener('pointermove', onMove);\n window.removeEventListener('pointerup', onEnd);\n window.removeEventListener('pointercancel', onEnd);\n window.removeEventListener('keydown', onKey);\n window.removeEventListener('blur', onBlur);\n markBody(false);\n };\n }, [dragging, side, endDrag]);\n\n const onKeyDown = useCallback((event: KeyboardEvent<HTMLDivElement>) => {\n const step = event.shiftKey ? CHAT_PANEL_STEP_COARSE : CHAT_PANEL_STEP;\n // Left/Right are screen directions, so which one GROWS depends on which\n // edge of the transcript this handle is.\n const toward = side === 'sidebar' ? 1 : -1;\n switch (event.key) {\n case 'ArrowRight':\n nudgeChatPanelWidth(side, step * toward);\n break;\n case 'ArrowLeft':\n nudgeChatPanelWidth(side, -step * toward);\n break;\n case 'Home':\n setChatPanelWidth(side, range.min);\n break;\n case 'End':\n setChatPanelWidth(side, range.max);\n break;\n case 'Enter':\n resetChatPanelWidth(side);\n break;\n default:\n return;\n }\n event.preventDefault();\n }, [side, range.min, range.max]);\n\n return (\n <div\n className={className}\n data-verse-resizer={side}\n data-dragging={dragging ? 'true' : undefined}\n role=\"separator\"\n aria-orientation=\"vertical\"\n aria-label={label}\n aria-valuemin={range.min}\n aria-valuemax={range.max}\n aria-valuenow={width}\n aria-valuetext={`${width} pixels`}\n tabIndex={0}\n onPointerDown={onPointerDown}\n onPointerUp={endDrag}\n onPointerCancel={endDrag}\n onLostPointerCapture={endDrag}\n onKeyDown={onKeyDown}\n // The thing people reach for after over-dragging. In the desktop app a\n // double-click on a DRAG region zooms the window instead — which is why\n // the stylesheet keeps this handle's grab area out of the title bar.\n onDoubleClick={() => resetChatPanelWidth(side)}\n />\n );\n}\n","/**\n * routes/verse/sections/ChatSection.tsx — the Chat surface (⌘5):\n *\n * [sessions 264 | transcript ≤720 | dock 440 (tabs, or two panes split)]\n *\n * plus the new-chat dialog, the delete confirmation, and every mutation the\n * chat surface makes (SPEC-310C §2–§3, unit C2).\n *\n * Takes NO props (the shell contract): the shell lazily mounts it. The ways\n * INTO it from elsewhere in the workbench arrive two ways, both C1's:\n * - the shell's one-shot command (verse-ui-store): `new-chat` (⌘N, \"New\n * chat on…\", with a seat or project), `open-session` (a Needs-you item, a\n * notification, ⌃Tab, ⌘[ / ⌘]), `focus-composer` (⌃⌥Space);\n * - the command bus (shell/command-bus.ts): this section serves the\n * catalog's chat-scope commands — `dock.*`, `chat.sidebar`, `chat.find`,\n * `chat.turn-prev/next` — for the palette, the native menu and keys.\n * And it reports which chat is open (setVerseActiveSession), which feeds\n * ⌃Tab's recent list and back/forward.\n *\n * 3.10 changes, briefly:\n * - the resources column became the DOCK (dock/Dock.tsx): Terminal,\n * Preview and Review through C0's slots, Tasks and Context of its own;\n * below 1024px it is a sheet, below 480px a bottom sheet;\n * - the chat list gained filters, pins, archive, unread and a live second\n * line (C1's activity + session-meta routes, tolerated when absent);\n * - the ⌘K chat switcher is gone — ⌘K is the shell's command palette;\n * - the chat-scope keys (⌘\\ ⌃` ⌃⇧` ⇧⌘B ⇧⌘D ⌘B) run the same handlers,\n * matched from C0's catalog while this surface is visible — and only when\n * the shell's own key handler has not already taken the event.\n *\n * Mutations go through one guard: if no mutation token is held,\n * MutationTokenDialog opens and the action re-runs once unlocked.\n */\nimport { lazy, Suspense, useCallback, useEffect, useMemo, useRef, useState, type ComponentProps, type CSSProperties } from 'react';\nimport type { VerseCreateSessionRequest, VerseSession } from '../../../data/api-types.js';\nimport type { MutationTokenDialog as MutationTokenDialogComponent } from '../../../components/auth/MutationTokenDialog.js';\nimport { useToast } from '../../../components/primitives/Toast.js';\nimport { clearReadSession } from '../../../data/auth-store.js';\nimport { ApiError, DispatchDisabledError } from '../../../data/client.js';\nimport { useMutationHold, useQuery, useRefresh } from '../../../data/hooks.js';\nimport type { DeleteChatDialog as DeleteChatDialogComponent } from '../chat/DeleteChatDialog.js';\nimport { insertIntoComposer } from '../chat/composer-bridge.js';\nimport { forgetComposerMemory } from '../chat/composer-memory.js';\nimport type { ChatTask } from '../chat/tasks-model.js';\nimport { requestTranscriptFind, requestTranscriptStep } from '../chat/transcript-jump.js';\nimport { noteSessionSeen, useChatActivity } from '../chat/use-chat-activity.js';\nimport { useSessionRoots } from '../chat/use-session-roots.js';\nimport { ChatResizer, useChatPanelSizing } from '../ChatResizer.js';\nimport { CHAT_PANEL_RANGES, MIN_TRANSCRIPT_WIDTH, setChatPanelFit } from '../chat-panel-sizing.js';\nimport { activateDockChat, clearDockRequests, closeDock, getDockState, openDockPane, requestTerminal, toggleDock, toggleDockPane, toggleDockPlacement, useDockValue } from '../dock/dock-store.js';\nimport type { DockPaneId } from '../shell/dock-catalog.js';\nimport type { SeatChoice } from '../SeatSelector.js';\nimport { clampDockHeight, clampDockWidth, DOCK_LAYOUT, dockPresentation } from '../shell/dock-catalog.js';\nimport { isFocusMode, setFocusMode, toggleFocusMode, useFocusMode } from '../shell/focus-mode.js';\nimport { useCommandHandler } from '../shell/command-bus.js';\nimport { matchKey } from '../shell/command-keys.js';\nimport { preloadedLazy, preloadedModule } from '../shell/preloaded.js';\nimport { useSectionVisible } from '../shell/section-visibility.js';\nimport type { TurnFileChange } from '../shell/slots.js';\nimport type { Sidebar as SidebarComponent, SidebarRowActions } from '../Sidebar.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { useVerseSession } from '../useVerseSession.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { openVerseListChannel } from '../verse-events.js';\nimport {\n cancelVerseTurn,\n createVerseSession,\n deleteVerseSession,\n renameVerseSession,\n sendVerseTurn,\n setVerseSessionMeta,\n terminateVerseDevinSession,\n verseBootstrapQuery,\n verseSessionsQuery,\n verseWorkspacesQuery,\n VerseMutationLockedError,\n} from '../verse-queries.js';\nimport { forgetVerseSession, setVerseSession, setVerseSessionStatus } from '../verse-store.js';\nimport {\n clearVerseCommand,\n lastVerseSeat,\n rememberVerseSeat,\n setVerseActiveSession,\n setVerseSection,\n setVerseSidebarCollapsed,\n} from '../verse-ui-store.js';\nimport type { Workspace as WorkspaceComponent } from '../Workspace.js';\nimport styles from './ChatSection.module.css';\n\n// Loaded on first use, not with the chat: the dock starts closed and the\n// new-chat dialog opens on request (SPEC-310C budget: chat critical JS).\nconst DockHost = lazy(() => import('../dock/DockHost.js').then((m) => ({ default: m.DockHost })));\nconst NewChatDialog = lazy(() => import('../NewChatDialog.js').then((m) => ({ default: m.NewChatDialog })));\n// 3.15: Stop in a Devin (cloud) chat asks \"stop watching or terminate?\" — lazy, never first paint.\nconst DevinStopDialog = lazy(() => import('../devin/DevinStopDialog.js').then((m) => ({ default: m.DevinStopDialog })));\n\nconst WorkspaceModule = preloadedLazy<ComponentProps<typeof WorkspaceComponent>>(() => import('../Workspace.js').then((m) => m.Workspace));\nconst Workspace = WorkspaceModule.Slot;\nconst SidebarModule = preloadedLazy<ComponentProps<typeof SidebarComponent>>(() => import('../Sidebar.js').then((m) => m.Sidebar));\nconst Sidebar = SidebarModule.Slot;\n/**\n * The delete confirmation and the token prompt draw nothing until an\n * operator acts, and as static imports they (with the dialog primitive and\n * its focus trap, ~4 KB, and the button primitive) sat in the chat\n * first-paint critical JS. Preloaded (chat/DeleteChatDialog.tsx):\n * by the time anyone can click Delete the chunk is in and they mount in the\n * same render that opens them; the two share the dialog primitive's chunk.\n */\nconst DeleteDialogModule = preloadedLazy<ComponentProps<typeof DeleteChatDialogComponent>>(() => import('../chat/DeleteChatDialog.js').then((m) => m.DeleteChatDialog));\nconst DeleteChatDialog = DeleteDialogModule.Slot;\nconst TokenDialogModule = preloadedLazy<ComponentProps<typeof MutationTokenDialogComponent>>(\n () => import('../../../components/auth/MutationTokenDialog.js').then((m) => m.MutationTokenDialog),\n);\nconst MutationTokenDialog = TokenDialogModule.Slot;\n\n/**\n * The two derivations only the workspace's tasks row and the dock read\n * (tool-semantics, sidebar-model and line-diff come with them, ~12 KB). Both\n * consumers are lazy chunks that import these modules themselves, so the\n * download is shared and the values are in before either consumer mounts;\n * until then there is honestly nothing to show.\n */\nconst DERIVATIONS = preloadedModule(() => Promise.all([import('../chat/tasks-model.js'), import('../chat/turn-files.js')])\n .then(([tasks, files]) => ({ otherRunningChats: tasks.otherRunningChats, lastTurnFiles: files.lastTurnFiles })));\n/** Seat lookups for ⌘N \"New chat on…\" — the only first-paint-path use of verse-model (5.6 KB). */\nconst SEAT_MODEL = preloadedModule(() => import('../verse-model.js').then((m) => ({ firstRunnableModel: m.firstRunnableModel, seatById: m.seatById })));\n/**\n * The pane registry, for panes that bring their OWN shortcut (a unit's\n * `registerPane({ shortcut })`): loaded just after first paint, never on it.\n * Until it is in, such a key does nothing — a few milliseconds after paint.\n */\nconst PANES = preloadedModule(() => import('../panes/index.js').then((m) => ({ matchPaneShortcut: m.matchPaneShortcut, preloadPaneIds: m.preloadPaneIds })));\nconst NO_TASKS: readonly ChatTask[] = [];\nconst NO_TURN_FILES: TurnFileChange[] = [];\n\n/**\n * Resolves when the chat's own chunks (workspace, chat list) are in. Tests\n * await it so a mount renders the whole surface synchronously; nothing in the\n * app needs to — the Suspense skeletons cover the gap.\n */\nexport function preloadChatSurface(): Promise<unknown> {\n return Promise.all([\n WorkspaceModule.ready(), SidebarModule.ready(), DeleteDialogModule.ready(), TokenDialogModule.ready(), DERIVATIONS.ready(), SEAT_MODEL.ready(),\n ]);\n}\n\n/**\n * The chat list's shape while its chunk loads. A <nav> like the real one, so\n * the grid rules written against `.chat > nav` (collapsed = display:none, the\n * phone-width overlay) hold for it too — but NOT named \"Chats\": that name is\n * the loaded list's, and a placeholder answering to it would be a lie.\n */\nfunction SidebarSkeleton() {\n return (\n <nav className={styles.sidebarSkeleton} aria-busy=\"true\" aria-label=\"Loading chat list\">\n {[64, 82, 58, 76, 70].map((w) => <SkeletonLine key={w} width={`${w}%`} />)}\n </nav>\n );\n}\n\n/** The workspace column's shape while its chunk loads: header, a few lines, the composer bar. */\nfunction WorkspaceSkeleton() {\n return (\n <div className={styles.workspaceSkeleton} role=\"status\" aria-label=\"Loading chat\">\n <div className={styles.skeletonHeader}><SkeletonLine width=\"32%\" /></div>\n <div className={styles.skeletonBody}>\n <SkeletonLine width=\"72%\" />\n <SkeletonLine width=\"88%\" />\n <SkeletonLine width=\"64%\" />\n </div>\n <div className={styles.skeletonComposer}><SkeletonLine width=\"100%\" /></div>\n </div>\n );\n}\n\nconst SELECTED_KEY = 'ashlr.verse.selected.v1';\n\nfunction loadSelected(): string | null {\n try {\n return localStorage.getItem(SELECTED_KEY);\n } catch {\n return null;\n }\n}\n\n/**\n * Every chat-surface failure in one sentence, branching on the route's CODE\n * before its status.\n *\n * A 409 is not always \"busy\": POST …/turns also answers 409\n * VERSE_MODEL_UNAVAILABLE when the chat's model cannot run on its seat.\n * Mapping every 409 to \"a turn is already running\" told the operator to press\n * a Stop that does nothing, with the server's actual reason thrown away.\n */\nexport function describeChatError(err: unknown): string {\n if (err instanceof DispatchDisabledError) return 'This server was started without dispatch — run `ashlr verse` to chat.';\n if (err instanceof ApiError) {\n if (err.code === 'VERSE_MODEL_UNAVAILABLE') {\n const why = err.detail ?? \"This chat's model cannot run on its seat.\";\n return `${why.replace(/\\.?$/, '.')} Continue in a fresh chat on a model this seat can run, or re-pin the seat's CLI (\\`ashlr resources profile repin\\`).`;\n }\n if (err.status === 409 && (err.code === null || err.code === 'VERSE_SESSION_BUSY')) return 'A turn is already running in this chat. Stop it first.';\n if (err.status === 413) return 'That message is too large (64 KB max).';\n if (err.status === 401) return 'Mutation token was rejected. Unlock again with the token ashlr verse printed.';\n return err.detail ?? err.message;\n }\n return err instanceof Error ? err.message : 'Something went wrong.';\n}\n\n/** The window's width, for the dock's presentation and its 60% cap. */\nfunction useWindowWidth(): number {\n const [width, setWidth] = useState(() => (typeof window === 'undefined' ? 1440 : window.innerWidth || 1440));\n useEffect(() => {\n const onResize = () => setWidth(window.innerWidth || 1440);\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, []);\n return width;\n}\n\n/** ⌃⌥Space: the composer's message box, focused (C3's `aria-label=\"Message\"`). */\nfunction focusComposer(): void {\n // After the section has painted (the command may be what mounted it).\n requestAnimationFrame(() => {\n const box = document.querySelector<HTMLTextAreaElement>('textarea[aria-label=\"Message\"]');\n box?.focus();\n });\n}\n\n/** Is the key event aimed at something that takes typing (a field, the composer, a terminal)? Esc is theirs there. */\nfunction inTypingTarget(target: EventTarget | null): boolean {\n if (!(target instanceof Element)) return false;\n if (target.closest('input, textarea, select, [contenteditable=\"true\"], [data-dock-pane=\"terminal\"]')) return true;\n return false;\n}\n\n/** Is the key event aimed at an overlay that owns its own keys (a dialog, a menu, the palette)? */\nfunction inOverlay(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest('[role=\"dialog\"], [role=\"menu\"], [role=\"listbox\"], [aria-modal=\"true\"]') !== null;\n}\n\n/**\n * A pane key (⇧⌘B, ⇧⌘D, ⇧⌘O, ⇧⌘S, ⇧⌘Y, a registered pane's own key). Focus mode hides the\n * panel area, so toggling there flipped state nobody could see and the key looked dead:\n * in focus mode it leaves focus mode and SHOWS the pane (never hides it).\n */\nfunction showOrTogglePane(pane: DockPaneId): void {\n if (isFocusMode()) {\n setFocusMode(false);\n openDockPane(pane);\n return;\n }\n toggleDockPane(pane);\n}\n\n/** The composer's message box (Composer.tsx `aria-label=\"Message\"`). */\nfunction inComposerBox(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest('textarea[aria-label=\"Message\"]') !== null;\n}\n\n/** The dock drawn as a modal sheet (below 1024px — Dock.tsx), if one is on screen. */\nfunction openDockSheet(): Element | null {\n return document.querySelector('[data-dock-layer] [role=\"dialog\"][aria-modal=\"true\"]');\n}\n\n/**\n * Esc from outside an open dock SHEET closes it, when nothing else wanted the\n * key. A sheet takes focus when the operator opens it, but one RESTORED open —\n * on page load, or by a chat switch bringing back that chat's layout — mounts\n * alongside the composer, whose autofocus can win; the sheet only hears keys\n * from inside itself, so Esc in the composer did nothing and the modal needed\n * a click. The composer keeps every Esc it uses — dismissing its `!`/`@`\n * menu (stopPropagation) and stopping a running turn from an empty box\n * (preventDefault) never reach here — and ⌘. is untouched. Another field or a\n * terminal keeps its Esc. Pure over the DOM; exported for tests.\n */\nexport function escClosesDockSheet(event: Pick<KeyboardEvent, 'key' | 'defaultPrevented' | 'target' | 'metaKey' | 'ctrlKey' | 'altKey' | 'shiftKey'>): boolean {\n if (event.key !== 'Escape' || event.defaultPrevented || event.metaKey || event.ctrlKey || event.altKey || event.shiftKey) return false;\n if (isFocusMode()) return false; // focus mode hides the panel area; Esc leaves focus mode first\n const sheet = openDockSheet();\n if (!sheet || (event.target instanceof Node && sheet.contains(event.target))) return false;\n return inComposerBox(event.target) || !inTypingTarget(event.target);\n}\n\nexport function ChatSection() {\n const bootstrap = useQuery(verseBootstrapQuery);\n const sessionsQuery = useQuery(verseSessionsQuery);\n const refetchSessions = useRefresh(verseSessionsQuery);\n const refetchBootstrap = useRefresh(verseBootstrapQuery);\n const hold = useMutationHold();\n const toast = useToast();\n const ui = useVerseUi();\n const visible = useSectionVisible();\n // The dock fields the layout needs, each subscribed on its own: dragging the\n // split boundary, or a pane request, does not re-render the chat surface.\n const dockOpenState = useDockValue((s) => s.open && s.tabs.length > 0);\n const dockPlacement = useDockValue((s) => s.placement);\n const dockStoredWidth = useDockValue((s) => s.width);\n const dockStoredHeight = useDockValue((s) => s.height);\n const terminalShown = useDockValue((s) => s.open && (s.active === 'terminal' || s.splitWith === 'terminal'));\n const chatActivity = useChatActivity();\n const windowWidth = useWindowWidth();\n const focus = useFocusMode();\n\n const [selectedId, setSelectedIdState] = useState<string | null>(loadSelected);\n const [query, setQuery] = useState('');\n const [newChat, setNewChat] = useState<{ open: boolean; projectPath?: string | null; seat?: SeatChoice | null }>({ open: false });\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const [reload, setReload] = useState(0);\n const [tokenPrompt, setTokenPrompt] = useState<{ open: boolean; reason: string }>({ open: false, reason: '' });\n const [handoffFor, setHandoffFor] = useState<string | null>(null);\n const [deleteTarget, setDeleteTarget] = useState<VerseSession | null>(null);\n /** 3.15: the Devin chat whose Stop is being confirmed (stop watching / terminate). */\n const [devinStop, setDevinStop] = useState<VerseSession | null>(null);\n const [chatWidth, setChatWidth] = useState(0);\n const [chatHeight, setChatHeight] = useState(0);\n const pendingAction = useRef<{ run: () => void; cancel: () => void } | null>(null);\n const chatRef = useRef<HTMLDivElement>(null);\n const panels = useChatPanelSizing();\n\n const seats = useMemo(() => bootstrap.data?.seats ?? [], [bootstrap.data]);\n const projects = useMemo(() => bootstrap.data?.projects ?? [], [bootstrap.data]);\n // Workspaces come from their own route (live per-root status for the dialog).\n const workspacesQuery = useQuery(verseWorkspacesQuery);\n const workspaces = useMemo(() => workspacesQuery.data?.workspaces ?? [], [workspacesQuery.data]);\n const dispatchEnabled = bootstrap.data?.dispatchEnabled ?? true;\n\n const view = useVerseSession(selectedId, reload);\n const roots = useSessionRoots(view.session);\n\n // Sidebar list: the sessions query, else bootstrap's copy, with the live\n // store record overlaid for the open chat so its running dot is immediate.\n const sessions = useMemo<VerseSession[]>(() => {\n const base = sessionsQuery.data ?? bootstrap.data?.sessions ?? [];\n if (!view.session) return base;\n const live = view.session;\n return base.some((s) => s.id === live.id) ? base.map((s) => (s.id === live.id ? live : s)) : [live, ...base];\n }, [sessionsQuery.data, bootstrap.data, view.session]);\n\n const setSelectedId = useCallback((id: string | null) => {\n setSelectedIdState(id);\n try {\n if (id) localStorage.setItem(SELECTED_KEY, id);\n else localStorage.removeItem(SELECTED_KEY);\n } catch {\n /* best-effort */\n }\n }, []);\n\n // A remembered selection that no longer exists (deleted elsewhere) is dropped once the list is known.\n useEffect(() => {\n if (!selectedId || !sessionsQuery.data) return;\n if (!sessionsQuery.data.some((s) => s.id === selectedId) && !view.session) setSelectedId(null);\n }, [selectedId, sessionsQuery.data, view.session, setSelectedId]);\n\n // Sidebar digest channel (verse-sessions on /api/events).\n useEffect(() => openVerseListChannel(), []);\n\n // ---- recency + read state -------------------------------------------------\n // Pane requests (a pasted command, a diff to open) belong to the chat they\n // were raised in: switching chats drops them. A SWITCH only — the first run\n // of this effect is the section mounting, and that is exactly when Apps'\n // [Launch ▸] (raised on another surface, which then brings Chat forward)\n // has a terminal request waiting; clearing it here left an empty dock.\n const requestsFor = useRef(selectedId);\n useEffect(() => {\n setVerseActiveSession(selectedId);\n // Each chat keeps its own panel layout (which panes, which on top, split).\n activateDockChat(selectedId);\n if (requestsFor.current !== selectedId) {\n requestsFor.current = selectedId;\n clearDockRequests();\n }\n }, [selectedId]);\n\n // Reading a chat — its turns up to now — while this surface is on screen.\n const openTurnCount = view.session?.turnCount ?? null;\n useEffect(() => {\n if (!visible || !selectedId || openTurnCount === null) return;\n if (typeof document !== 'undefined' && document.visibilityState === 'hidden') return;\n noteSessionSeen(selectedId, openTurnCount);\n }, [visible, selectedId, openTurnCount]);\n\n // ---- mutation guard ---------------------------------------------------------\n const withToken = useCallback(<T,>(reason: string, action: () => Promise<T>): Promise<T | null> => {\n if (hold.hasHold) return action();\n return new Promise<T | null>((resolve, reject) => {\n pendingAction.current = {\n // Pass rejections through: a parked action that fails after the token\n // unlock must reach its caller's catch, not leave it awaiting forever.\n run: () => { action().then(resolve, reject); },\n cancel: () => resolve(null),\n };\n setTokenPrompt({ open: true, reason });\n });\n }, [hold.hasHold]);\n\n const fail = useCallback((err: unknown) => {\n if (err instanceof VerseMutationLockedError) return;\n toast.show(describeChatError(err), 'danger');\n }, [toast]);\n\n // ---- actions ----------------------------------------------------------------\n /**\n * ONE resolution of what \"new chat\" pre-fills, for every entry point (the\n * sidebar \"+\", ⌘N, the empty state, the palette's \"New chat on…\"): an\n * explicit prefill wins, the open session is next, and the per-project\n * seat memory is the floor.\n */\n const openNewChat = useCallback((prefill: { projectPath?: string | null; seat?: SeatChoice | null } = {}) => {\n setCreateError(null);\n const current = view.session;\n const projectPath = prefill.projectPath !== undefined ? prefill.projectPath : current?.projectPath ?? null;\n // The open session's seat only carries forward onto its OWN project.\n const fromCurrent = current && projectPath === current.projectPath\n ? { seatId: current.seatId, model: current.model }\n : null;\n const seat = prefill.seat ?? fromCurrent ?? lastVerseSeat(projectPath);\n setNewChat({ open: true, projectPath, seat });\n }, [view.session]);\n\n const create = useCallback(async (req: VerseCreateSessionRequest) => {\n await withToken('Starting a chat spawns an agent process for this project.', async () => {\n setCreating(true);\n setCreateError(null);\n try {\n const session = await createVerseSession(req);\n rememberVerseSeat(session.projectPath, { seatId: session.seatId, model: session.model });\n setVerseSession(session.id, session);\n setNewChat({ open: false });\n setSelectedId(session.id);\n toast.show(`Started “${session.title}”`, 'success');\n } catch (err) {\n setCreateError(describeChatError(err));\n } finally {\n setCreating(false);\n }\n });\n }, [withToken, setSelectedId, toast]);\n\n const send = useCallback(async (text: string) => {\n const id = selectedId;\n if (!id) return false;\n const result = await withToken('Sending a message runs the agent against this project.', async () => {\n setVerseSessionStatus(id, 'running');\n try {\n const response = await sendVerseTurn(id, text);\n // The turn may already have settled by the time the 202 is applied;\n // the store checks the log for this turnId before trusting `running`.\n setVerseSession(id, response.session, response.turnId);\n return true;\n } catch (err) {\n setVerseSessionStatus(id, 'idle');\n fail(err);\n return false;\n }\n });\n return result === true;\n }, [selectedId, withToken, fail]);\n\n const cancelTurn = useCallback((id: string) => {\n void withToken('Stopping the running turn.', async () => {\n try {\n await cancelVerseTurn(id);\n } catch (err) {\n fail(err);\n }\n });\n }, [withToken, fail]);\n\n const stop = useCallback((id: string | null = selectedId) => {\n if (!id) return;\n // 3.15: a Devin (cloud) chat with a live session asks first — Stop could\n // mean \"stop watching\" or \"terminate the Devin session\" (irreversible).\n const open = view.session && view.session.id === id ? view.session : null;\n if (open && open.engine === 'devin' && open.seatId !== 'devin-cli' && open.nativeSessionId) {\n setDevinStop(open);\n return;\n }\n cancelTurn(id);\n }, [selectedId, view.session, cancelTurn]);\n\n const terminateDevin = useCallback((id: string) => {\n void withToken('Terminating the Devin session.', async () => {\n try {\n await terminateVerseDevinSession(id);\n } catch (err) {\n fail(err);\n }\n });\n }, [withToken, fail]);\n\n const renameChat = useCallback(async (id: string, title: string) => {\n const result = await withToken('Renaming a chat.', async () => {\n try {\n const session = await renameVerseSession(id, title);\n setVerseSession(id, session);\n return true;\n } catch (err) {\n fail(err);\n return false;\n }\n });\n return result === true;\n }, [withToken, fail]);\n\n const removeChat = useCallback(async (id: string) => {\n const result = await withToken('Deleting a chat removes its transcript from disk.', async () => {\n try {\n await deleteVerseSession(id);\n forgetVerseSession(id);\n // The transcript is gone from disk; the verbatim prompts must not\n // survive it in browser storage under a dead session id.\n forgetComposerMemory(id);\n if (id === selectedId) setSelectedId(null);\n toast.show('Chat deleted.', 'neutral');\n return true;\n } catch (err) {\n fail(err);\n return false;\n }\n });\n return result === true;\n }, [withToken, fail, setSelectedId, toast, selectedId]);\n\n const setMeta = useCallback((id: string, update: { pinned?: boolean; archived?: boolean }, reason: string) => {\n void withToken(reason, async () => {\n try {\n await setVerseSessionMeta(id, update);\n } catch (err) {\n fail(err);\n }\n });\n }, [withToken, fail]);\n\n /** Sessions are seat-bound: a different seat means a new chat on the same project. */\n const changeSeat = useCallback((choice: SeatChoice) => {\n const current = view.session;\n if (!current) return;\n openNewChat({ projectPath: current.projectPath, seat: choice });\n toast.show('Chats are bound to one seat — starting a new chat on the same project.', 'neutral');\n }, [view.session, openNewChat, toast]);\n\n const requestDelete = useCallback((id: string) => {\n const target = sessions.find((s) => s.id === id) ?? null;\n if (target) setDeleteTarget(target);\n }, [sessions]);\n\n const startHandoff = useCallback((id: string) => {\n if (id !== selectedId) setSelectedId(id);\n setHandoffFor(id);\n }, [selectedId, setSelectedId]);\n\n const selectFromList = useCallback((id: string) => {\n setSelectedId(id);\n // At phone width the list floats over the chat; picking a chat closes it.\n if (window.matchMedia?.('(max-width: 760px)')?.matches === true) setVerseSidebarCollapsed(true);\n }, [setSelectedId]);\n\n // ---- commands: the shell's hand-offs, the bus, and the chat's own keys ------\n const toggleSidebar = useCallback(() => setVerseSidebarCollapsed(!ui.sidebarCollapsed), [ui.sidebarCollapsed]);\n // ⌃` : a terminal, focused — the active tab, else one at the chat's root\n // (TerminalPane resolves an empty request that way). Pressed again while\n // Terminal is on screen it hides it, like every editor's ⌃`.\n const openTerminal = useCallback(() => {\n // In focus mode the panel is hidden, so \"shown\" is not what the operator sees.\n if (isFocusMode()) setFocusMode(false);\n else if (terminalShown) {\n toggleDockPane('terminal');\n return;\n }\n requestTerminal({});\n }, [terminalShown]);\n // ⌃⇧` : always a NEW tab, in the active tab's root (else the chat's primary).\n const newTerminalTab = useCallback(() => requestTerminal({ newTab: true }), []);\n\n // The shell's one-shot command, consumed once by nonce.\n const handledCommand = useRef(0);\n const seatModel = SEAT_MODEL.useLoaded();\n useEffect(() => {\n const command = ui.command;\n if (!command || command.nonce === handledCommand.current) return;\n // \"New chat on…\" resolves its seat through verse-model, which loads just\n // after first paint: leave the command pending (unconsumed) until it is\n // in — this effect re-runs when it lands.\n if (command.name === 'new-chat' && !seatModel) return;\n handledCommand.current = command.nonce;\n switch (command.name) {\n case 'open-session':\n if (command.sessionId) setSelectedId(command.sessionId);\n break;\n case 'focus-composer':\n focusComposer();\n break;\n case 'new-chat': {\n // \"New chat on…\" carries a seat (and maybe a project); ⌘N carries neither.\n const { seatById, firstRunnableModel } = seatModel!;\n const seat = command.seatId ? seatById(seats, command.seatId) : undefined;\n // The model this project last used on that seat, else the seat's first runnable one.\n const remembered = lastVerseSeat(command.projectPath ?? null);\n const model = !seat ? undefined : remembered?.seatId === seat.id ? remembered.model : firstRunnableModel(seat)?.id;\n openNewChat({\n ...(command.projectPath !== undefined ? { projectPath: command.projectPath } : {}),\n ...(seat && model ? { seat: { seatId: seat.id, model } } : {}),\n });\n break;\n }\n default:\n // 'quick-switcher' (pre-3.10): ⌘K is the shell's palette now.\n break;\n }\n clearVerseCommand();\n }, [ui.command, openNewChat, seats, setSelectedId, seatModel]);\n\n // The catalog's chat-scope commands, for the palette, the menu and keys.\n const handlers: ReadonlyArray<[string, () => void | boolean]> = [\n ['chat.sidebar', toggleSidebar],\n ['chat.find', () => requestTranscriptFind()],\n ['chat.turn-prev', () => requestTranscriptStep(-1)],\n ['chat.turn-next', () => requestTranscriptStep(1)],\n ['dock.toggle', toggleDock],\n ['dock.terminal', openTerminal],\n ['dock.terminal-new', newTerminalTab],\n ['dock.preview', () => showOrTogglePane('browser')],\n ['dock.diff', () => showOrTogglePane('diff')],\n ['dock.files', () => showOrTogglePane('files')],\n ['dock.sources', () => showOrTogglePane('sources')],\n ['dock.reasoning', () => showOrTogglePane('reasoning')],\n ['dock.placement', toggleDockPlacement],\n ['chat.focus-mode', toggleFocusMode],\n ];\n const handlerMap = new Map(handlers);\n useCommandHandler('chat.sidebar', handlerMap.get('chat.sidebar')!);\n useCommandHandler('chat.find', handlerMap.get('chat.find')!);\n useCommandHandler('chat.turn-prev', handlerMap.get('chat.turn-prev')!);\n useCommandHandler('chat.turn-next', handlerMap.get('chat.turn-next')!);\n useCommandHandler('dock.toggle', handlerMap.get('dock.toggle')!);\n useCommandHandler('dock.terminal', handlerMap.get('dock.terminal')!);\n useCommandHandler('dock.terminal-new', handlerMap.get('dock.terminal-new')!);\n useCommandHandler('dock.preview', handlerMap.get('dock.preview')!);\n useCommandHandler('dock.diff', handlerMap.get('dock.diff')!);\n useCommandHandler('dock.files', handlerMap.get('dock.files')!);\n useCommandHandler('dock.sources', handlerMap.get('dock.sources')!);\n useCommandHandler('dock.reasoning', handlerMap.get('dock.reasoning')!);\n useCommandHandler('dock.placement', handlerMap.get('dock.placement')!);\n useCommandHandler('chat.focus-mode', handlerMap.get('chat.focus-mode')!);\n\n // Keys, as a fallback: the shell's handler routes catalog keys through the\n // bus and marks the event handled (preventDefault); this listener acts only\n // on an event nobody took, and only while the surface is visible and no\n // overlay (a dialog, a menu, the palette) owns the keyboard. ⌘F and ⌥↑/↓\n // are the transcript's own listeners, which follow the same rule.\n const handlerRef = useRef(handlerMap);\n handlerRef.current = handlerMap;\n const panes = PANES.useLoaded();\n const panesRef = useRef(panes);\n panesRef.current = panes;\n // Once the registry is in, warm the code of the panes this chat is likely to\n // show — its open tabs, and Tasks (what an empty panel opens on) — so the\n // first ⌘\\ or tab click draws the pane, not its skeleton. The rest stay lazy.\n useEffect(() => {\n if (panes) panes.preloadPaneIds([...getDockState().tabs, 'tasks']);\n }, [panes]);\n useEffect(() => {\n if (!visible) return undefined;\n const onKey = (event: KeyboardEvent) => {\n if (event.defaultPrevented || inOverlay(event.target)) return;\n if (escClosesDockSheet(event)) {\n event.preventDefault();\n closeDock();\n return;\n }\n // Esc leaves focus mode — except where Esc already means something (the composer's Stop, a field, a terminal).\n if (event.key === 'Escape' && isFocusMode() && !inTypingTarget(event.target)) {\n event.preventDefault();\n setFocusMode(false);\n return;\n }\n const command = matchKey(event, ['chat']);\n if (!command) {\n // A registered pane's own key (the registry refused any that collide with the catalog).\n const pane = panesRef.current?.matchPaneShortcut(event);\n if (pane) {\n event.preventDefault();\n showOrTogglePane(pane.id);\n }\n return;\n }\n if (command.scope !== 'chat') return;\n if (command.id === 'chat.find' || command.id === 'chat.turn-prev' || command.id === 'chat.turn-next') return;\n const run = handlerRef.current.get(command.id);\n if (!run) return;\n event.preventDefault();\n run();\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [visible]);\n\n const dispatchOff = bootstrap.data ? !bootstrap.data.dispatchEnabled : false;\n const sidebarCollapsed = ui.sidebarCollapsed;\n\n // Focus mode belongs to the chat surface: leaving it (⌘1…) leaves focus too,\n // so no other surface ever opens without its rail.\n useEffect(() => {\n if (!visible && focus) setFocusMode(false);\n }, [visible, focus]);\n\n // ---- layout -------------------------------------------------------------------\n const presentation = dockPresentation(windowWidth, dockPlacement);\n const dockOpen = dockOpenState;\n const dockColumn = dockOpen && presentation === 'column' && !focus;\n const dockBottom = dockOpen && presentation === 'bottom' && !focus;\n const dockHeight = dockBottom ? clampDockHeight(dockStoredHeight, chatHeight) : 0;\n // The dock yields before the transcript does: never past the window's 60%,\n // and never so wide that the transcript (plus the chat list, when shown at\n // its minimum) drops under its floor. The floor for the dock is its 320px.\n const sidebarFloor = sidebarCollapsed ? 0 : CHAT_PANEL_RANGES.sidebar.min;\n const dockColumnMax = chatWidth > 0 ? chatWidth - MIN_TRANSCRIPT_WIDTH - sidebarFloor : Number.POSITIVE_INFINITY;\n const dockWidth = dockColumn\n ? Math.max(DOCK_LAYOUT.minWidth, Math.min(clampDockWidth(dockStoredWidth, windowWidth), dockColumnMax))\n : 0;\n\n useEffect(() => {\n const node = chatRef.current;\n if (!node) return undefined;\n const measure = () => {\n setChatWidth(node.clientWidth);\n setChatHeight(node.clientHeight);\n setChatPanelFit({\n // The dock's column is not the sidebar's to spend.\n containerWidth: Math.max(0, node.clientWidth - dockWidth),\n sidebarVisible: !sidebarCollapsed,\n resourcesVisible: false,\n });\n };\n measure();\n const observer = typeof ResizeObserver === 'function' ? new ResizeObserver(measure) : null;\n observer?.observe(node);\n window.addEventListener('resize', measure);\n return () => {\n observer?.disconnect();\n window.removeEventListener('resize', measure);\n };\n }, [sidebarCollapsed, dockWidth]);\n\n const style = {\n '--verse-sidebar-width': `${panels.effective.sidebar}px`,\n '--verse-dock-width': `${dockWidth}px`,\n '--verse-dock-height': `${dockHeight}px`,\n } as CSSProperties;\n\n // ---- dock data ------------------------------------------------------------------\n // Stable across renders: every pane gets these through one memoized `host`,\n // so a chat-surface render does not re-render every mounted pane.\n const sendToChat = useCallback((text: string) => {\n if (!selectedId || !insertIntoComposer(selectedId, text)) toast.show('Open a chat to send this to it.', 'neutral');\n }, [selectedId, toast]);\n const addToMessage = useCallback((text: string) => {\n if (!selectedId || !insertIntoComposer(selectedId, text)) toast.show('Open a chat to add this to its message.', 'neutral');\n }, [selectedId, toast]);\n // Accounts & capacity live in Apps & Accounts (C6) since 3.10.\n const openAccounts = useCallback(() => setVerseSection('apps'), []);\n const derive = DERIVATIONS.useLoaded();\n const otherRunning = useMemo(\n () => (derive ? derive.otherRunningChats(sessions, chatActivity.activity, selectedId) : NO_TASKS),\n [derive, sessions, chatActivity.activity, selectedId],\n );\n const turnFiles = useMemo<TurnFileChange[]>(\n () => (derive ? derive.lastTurnFiles(view.events, roots.roots) : NO_TURN_FILES),\n [derive, roots.roots, view.events],\n );\n\n const actions: SidebarRowActions = {\n setPinned: (id, pinned) => setMeta(id, { pinned }, pinned ? 'Pinning a chat.' : 'Unpinning a chat.'),\n setArchived: (id, archived) => setMeta(id, { archived }, archived ? 'Archiving a chat.' : 'Unarchiving a chat.'),\n rename: renameChat,\n handoff: startHandoff,\n requestDelete,\n dispatchEnabled,\n };\n\n return (\n <div ref={chatRef} className={styles.chat} style={style}\n data-sidebar={sidebarCollapsed || focus ? 'collapsed' : 'open'} data-dock={dockColumn ? 'open' : dockBottom ? 'bottom' : 'closed'}\n data-focus={focus ? 'on' : undefined}>\n <Suspense fallback={<SidebarSkeleton />}>\n <Sidebar sessions={sessions} sessionsStatus={sessionsQuery.status} sessionsError={sessionsQuery.error?.message ?? null}\n projects={projects} seats={seats} selectedId={selectedId} query={query} onQuery={setQuery}\n onSelect={selectFromList} onNew={() => openNewChat()}\n onRetry={() => { refetchSessions(); refetchBootstrap(); }}\n onCollapse={() => setVerseSidebarCollapsed(true)} onDisconnect={() => { void clearReadSession(); }}\n activity={chatActivity.activity} meta={chatActivity.meta} metaError={chatActivity.metaError} localSeen={chatActivity.localSeen} actions={actions} />\n </Suspense>\n {sidebarCollapsed ? null : <ChatResizer side=\"sidebar\" label=\"Resize chat list\" className={styles.resize} />}\n {/* At phone width the sidebar floats over the transcript; the scrim dismisses it. */}\n <button type=\"button\" className={styles.scrim} aria-label=\"Close chat list\" tabIndex={-1}\n onClick={() => setVerseSidebarCollapsed(true)} />\n <div className={styles.main}>\n {bootstrap.status === 'error' && !bootstrap.data ? (\n <div role=\"alert\" className={styles.banner}>\n <span>{bootstrap.error?.message ?? 'Could not load Verse.'}</span>\n <button type=\"button\" onClick={refetchBootstrap}>Retry</button>\n </div>\n ) : dispatchOff ? (\n <div role=\"status\" className={styles.bannerWarn}>\n Read-only: this server was started without dispatch. Run <code>ashlr verse</code> to send messages.\n </div>\n ) : null}\n <Suspense fallback={<WorkspaceSkeleton />}>\n <Workspace view={view} seats={seats} projects={projects} dispatchEnabled={dispatchEnabled} locked={!hold.hasHold}\n hasAnySessions={sessions.length > 0} onSend={send} onStop={() => stop()}\n onRename={(title) => (selectedId ? renameChat(selectedId, title) : Promise.resolve(false))}\n onRequestDelete={() => { if (selectedId) requestDelete(selectedId); }}\n onRequestDevinStop={() => { if (view.session) setDevinStop(view.session); }}\n onSeatChange={changeSeat} onNew={() => openNewChat()} onRetry={() => setReload((n) => n + 1)}\n sidebarCollapsed={sidebarCollapsed} onToggleSidebar={() => setVerseSidebarCollapsed(!sidebarCollapsed)}\n onOpenSession={setSelectedId}\n handoffOpen={handoffFor !== null && handoffFor === selectedId}\n onHandoffOpenChange={(open) => setHandoffFor(open ? selectedId : null)}\n otherRunning={otherRunning} />\n </Suspense>\n </div>\n {dockOpen ? (\n <Suspense fallback={null}>\n <DockHost presentation={presentation} windowWidth={windowWidth} columnWidth={dockWidth} columnMax={dockColumnMax} columnHeight={chatHeight} session={view.session} seats={seats}\n events={view.events} roots={roots.roots} rootsData={roots.data} rootsError={roots.error} turnFiles={turnFiles}\n otherRunning={otherRunning} dispatchEnabled={dispatchEnabled} onOpenSession={setSelectedId}\n onHandoff={setHandoffFor}\n // Accounts & capacity live in Apps & Accounts (C6) since 3.10.\n onOpenAccounts={openAccounts} onSendToChat={sendToChat} onAddToMessage={addToMessage} />\n </Suspense>\n ) : null}\n\n {newChat.open ? (\n <Suspense fallback={null}>\n <NewChatDialog open onClose={() => setNewChat({ open: false })} projects={projects} seats={seats} workspaces={workspaces}\n initialProjectPath={newChat.projectPath ?? null} initialSeat={newChat.seat ?? null} busy={creating} error={createError} onCreate={create}\n // The dialog's one write of its own (a seat's default context mode)\n // goes through the same token guard as every other chat mutation.\n runMutation={withToken} />\n </Suspense>\n ) : null}\n {devinStop ? (\n <Suspense fallback={null}>\n <DevinStopDialog open chatLabel={devinStop.title} running={devinStop.status === 'running'}\n onCancel={() => setDevinStop(null)}\n onStopWatching={() => { const id = devinStop.id; setDevinStop(null); cancelTurn(id); }}\n onTerminate={() => { const id = devinStop.id; setDevinStop(null); terminateDevin(id); }} />\n </Suspense>\n ) : null}\n {/* Closed dialogs render nothing, so a not-yet-loaded one (fallback null) looks the same. */}\n <Suspense fallback={null}>\n <DeleteChatDialog target={deleteTarget} onClose={() => setDeleteTarget(null)} onDelete={removeChat}\n actionsClassName={styles.dialogActions} />\n <MutationTokenDialog open={tokenPrompt.open} reason={tokenPrompt.reason} tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\"\n onClose={() => {\n setTokenPrompt({ open: false, reason: '' });\n // The dialog calls onClose before onUnlocked on submit, so only treat\n // this as a dismissal if nothing has claimed the pending action by\n // the next tick.\n const pending = pendingAction.current;\n if (!pending) return;\n setTimeout(() => {\n if (pendingAction.current === pending) {\n pendingAction.current = null;\n pending.cancel();\n }\n }, 0);\n }}\n onUnlocked={() => {\n const pending = pendingAction.current;\n pendingAction.current = null;\n pending?.run();\n }} />\n </Suspense>\n </div>\n );\n}\n"],"file":"ChatSection-DV9smoPe.js"}
@@ -1,5 +0,0 @@
1
- import{l as e,n as t,s as n,u as r}from"./index-BbDqdepe.js";import{C as i,M as a,V as o,a as s,i as c}from"./global-BWc2NPzv.js";import{t as l}from"./MutationTokenDialog-D522NXsm.js";import{a as u,d,m as f,r as p,t as m}from"./VerseShared-_pMXKs8m.js";import{t as h}from"./Button-DP2ImS5n.js";import{n as g,t as _}from"./use-token-gate-_JPjMD5z.js";import{t as v}from"./Switch-BtEo9Cku.js";var y=r(n(),1),b=`/api/verse/agents`,x=[`working`,`needs-you`,`review`,`done`],S={working:`Working`,"needs-you":`Needs you`,review:`Ready for review`,done:`Done`},C=`verse-agents`,w=5e3,T={key:C,fetch:e=>c(b,e)};function E(){let e=i();if(!e)throw new p;return e}async function D(e,t){let n=await s(e,t,E());return a(),o(C),o(m),n}var O=(e,t)=>`${b}/${encodeURIComponent(e)}/${t}`;function k(e,t){return c(`${b}/config?root=${encodeURIComponent(e)}`,t)}function A(e,t,n){return c(`${O(e,`checks`)}${t?`?fresh=1`:``}`,n)}function j(e,t,n){return c(`${b}/${encodeURIComponent(e)}/scripts/${encodeURIComponent(t)}/log`,n)}var M=(e,t)=>D(O(e,`settings`),t).then(e=>e.agent),N=(e,t,n)=>D(O(e,`plan`),n===void 0?{action:t}:{action:t,text:n}).then(e=>e.agent),P=e=>D(O(e,`send-prompt`),{}).then(e=>e.agent),F=(e,t,n)=>D(O(e,`scripts`),n===void 0?{kind:t}:{kind:t,index:n}),I=(e,t)=>D(`${b}/${encodeURIComponent(e)}/scripts/${encodeURIComponent(t)}/stop`,{}),L=(e,t={})=>D(O(e,`pr`),t),R=e=>D(O(e,`archive`),{}).then(e=>e.agent),z=e=>D(O(e,`restore`),{}).then(e=>e.agent),B=e=>D(O(e,`resolve`),{});async function V(e,t){let n=await D(`${b}/bulk`,{action:e,ids:t});return d(),n.results}async function H(e){let t={planFirst:e.planFirst,spendCapUsd:e.spendCapUsd,autoFix:e.autoFix,autoMerge:e.autoMerge};if(e.isolate){let n=await D(`${b}/workspaces`,{root:e.root,title:e.title,...t}),r=n.agent.workspace?.path;if(!r)throw Error(`The workspace was not created.`);let i;try{i=(await u({projectPath:r,seatId:e.seatId,model:e.model,title:e.title})).id}catch(e){throw await D(O(n.agent.id,`discard`),{}).catch(()=>void 0),e}let a=await D(O(n.agent.id,`bind`),{sessionId:i,...e.prompt.trim()?{prompt:e.prompt}:{}});return d(),{agent:a.agent,sessionId:i,held:a.held,config:n.config,archivedForCap:n.archivedForCap}}let n=await u({projectPath:e.root,seatId:e.seatId,model:e.model,title:e.title}),r=await D(O((await D(`${b}/chat`,{sessionId:n.id,title:e.title,...t})).agent.id,`bind`),{sessionId:n.id,...e.prompt.trim()?{prompt:e.prompt}:{}});return d(),{agent:r.agent,sessionId:n.id,held:r.held,config:null,archivedForCap:[]}}var U={section:`_section_1t6z8_9`,header:`_header_1t6z8_20`,headerText:`_headerText_1t6z8_27`,headerActions:`_headerActions_1t6z8_33`,title:`_title_1t6z8_39`,lede:`_lede_1t6z8_48`,banner:`_banner_1t6z8_55`,bulkBar:`_bulkBar_1t6z8_70`,body:`_body_1t6z8_82`,board:`_board_1t6z8_94`,column:`_column_1t6z8_103`,columnHead:`_columnHead_1t6z8_114`,count:`_count_1t6z8_129`,cardList:`_cardList_1t6z8_133`,emptyColumn:`_emptyColumn_1t6z8_143`,card:`_card_1t6z8_133`,cardTop:`_cardTop_1t6z8_175`,cardCheck:`_cardCheck_1t6z8_181`,cardTitle:`_cardTitle_1t6z8_185`,unreadDot:`_unreadDot_1t6z8_196`,pin:`_pin_1t6z8_203`,cardMeta:`_cardMeta_1t6z8_206`,cardStats:`_cardStats_1t6z8_207`,seatChip:`_seatChip_1t6z8_213`,cardReason:`_cardReason_1t6z8_224`,flag:`_flag_1t6z8_243`,cardLast:`_cardLast_1t6z8_246`,muted:`_muted_1t6z8_253`,mono:`_mono_1t6z8_256`,keyHint:`_keyHint_1t6z8_261`,details:`_details_1t6z8_270`,detailsHead:`_detailsHead_1t6z8_284`,detailsTitle:`_detailsTitle_1t6z8_293`,detailsActions:`_detailsActions_1t6z8_300`,scriptButtons:`_scriptButtons_1t6z8_301`,formActions:`_formActions_1t6z8_302`,overview:`_overview_1t6z8_310`,facts:`_facts_1t6z8_315`,smallHead:`_smallHead_1t6z8_339`,planBox:`_planBox_1t6z8_348`,held:`_held_1t6z8_349`,capBox:`_capBox_1t6z8_350`,hint:`_hint_1t6z8_355`,loopNote:`_loopNote_1t6z8_364`,runRow:`_runRow_1t6z8_373`,setupLog:`_setupLog_1t6z8_379`,log:`_log_1t6z8_384`,checks:`_checks_1t6z8_400`,checksHead:`_checksHead_1t6z8_408`,checksBranch:`_checksBranch_1t6z8_414`,checkList:`_checkList_1t6z8_420`,checkDot:`_checkDot_1t6z8_434`,checkName:`_checkName_1t6z8_450`,loop:`_loop_1t6z8_364`,comments:`_comments_1t6z8_463`,commentMeta:`_commentMeta_1t6z8_471`,commentBody:`_commentBody_1t6z8_474`,panelNote:`_panelNote_1t6z8_481`,dockPane:`_dockPane_1t6z8_486`,dialogWidth:`_dialogWidth_1t6z8_494`,form:`_form_1t6z8_302`,field:`_field_1t6z8_502`,fieldLabel:`_fieldLabel_1t6z8_507`,textarea:`_textarea_1t6z8_512`,options:`_options_1t6z8_530`,seatList:`_seatList_1t6z8_536`,seatRow:`_seatRow_1t6z8_551`,formError:`_formError_1t6z8_561`},W=e({ChecksDockPane:()=>X,ChecksPanel:()=>Y,commentToAgentText:()=>J}),G=t(),K=3e4,q={passing:`All checks green`,failing:`Checks failing`,pending:`Checks running`,none:`No checks reported`,unknown:`Checks unknown`};function J(e){return[`Review comment from @${e.author}${e.path?` on ${e.path}`:``}:`,``,e.body.split(`
2
- `).map(e=>`> ${e}`).join(`
3
- `),``,`Address it in this workspace, then commit and push to the same branch.`].join(`
4
- `)}function Y({cardId:e,visible:t=!0,draftToChat:n,onChanged:r}){let[i,a]=(0,y.useState)(null),[o,s]=(0,y.useState)(null),[c,u]=(0,y.useState)(!1),[d,p]=(0,y.useState)(null),[m,b]=(0,y.useState)(null),x=g(),S=(0,y.useRef)(!0);(0,y.useEffect)(()=>()=>{S.current=!1},[]);let C=(0,y.useCallback)(t=>{let n=new AbortController;return u(!0),A(e,t,n.signal).then(e=>{S.current&&(a(e),s(null))},e=>{S.current&&!n.signal.aborted&&s(_(e))}).finally(()=>{S.current&&u(!1)}),n},[e]);(0,y.useEffect)(()=>{if(!t)return;let e=C(!1),n=setInterval(()=>C(!1),K);return()=>{e.abort(),clearInterval(n)}},[t,C]);let w=e.startsWith(`ag_`)?e:null,T=async(e,t,n)=>{p(e),b(null);try{let e=await x.run(t,n);e&&b(e),r?.(),C(!0)}catch(e){b(_(e))}finally{p(null)}},E=(e,t)=>{w&&T(e,e===`autoFix`?`Change Auto-fix CI for this agent`:`Change Auto-merge for this agent`,async()=>(await M(w,{[e]:t}),null))},D=e=>{let t=J(e);if(n){n(t),b(`Drafted into the chat — edit and send it.`);return}let r=i?.sessionId;r&&T(`comment:${e.at??e.body.slice(0,10)}`,`Send this review comment to the agent`,async()=>(await f(r,t),`Sent to the agent.`))};if(o&&!i)return(0,G.jsx)(`p`,{className:U.panelNote,role:`alert`,children:o});if(!i)return(0,G.jsx)(`p`,{className:U.panelNote,children:c?`Reading git and GitHub…`:`No checks yet.`});let O=i;return(0,G.jsxs)(`div`,{className:U.checks,"aria-label":`Checks`,children:[(0,G.jsxs)(`div`,{className:U.checksHead,children:[(0,G.jsxs)(`div`,{className:U.checksBranch,children:[(0,G.jsx)(`span`,{className:U.mono,children:O.branch??`detached HEAD`}),O.base?(0,G.jsxs)(`span`,{className:U.muted,children:[` → `,O.base]}):null]}),(0,G.jsx)(h,{size:`sm`,variant:`ghost`,onClick:()=>C(!0),busy:c,children:`Refresh`})]}),(0,G.jsxs)(`dl`,{className:U.facts,children:[(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:`Working tree`}),(0,G.jsx)(`dd`,{children:O.dirty===0?`Clean`:`${O.dirty} uncommitted`})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:`Branch`}),(0,G.jsxs)(`dd`,{children:[O.ahead,` ahead`,O.behind?` · ${O.behind} behind`:``,O.diffstat?` · +${O.diffstat.additions} −${O.diffstat.deletions} in ${O.diffstat.files} files`:``]})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:`PR`}),(0,G.jsxs)(`dd`,{children:[O.pr?(0,G.jsxs)(`a`,{href:O.pr.url,target:`_blank`,rel:`noreferrer`,children:[`#`,O.pr.number,` `,O.pr.title]}):O.unavailable?O.unavailable:`None yet`,O.pr?(0,G.jsxs)(`span`,{className:U.muted,children:[` · `,O.pr.state,O.pr.mergeable===!1?` · conflicts`:``]}):null]})]}),(0,G.jsxs)(`div`,{children:[(0,G.jsx)(`dt`,{children:`CI`}),(0,G.jsx)(`dd`,{"data-ci":O.ci,children:q[O.ci]})]})]}),!O.pr&&w&&O.ahead+O.dirty>0?(0,G.jsx)(h,{size:`sm`,variant:`subtle`,busy:d===`pr`,onClick:()=>void T(`pr`,`Push this agent’s branch and open a PR`,async()=>`Opened PR #${(await L(w)).pr.number}.`),children:`Push and open PR`}):null,O.checks.length>0?(0,G.jsx)(`ul`,{className:U.checkList,"aria-label":`CI checks`,children:O.checks.map((e,t)=>(0,G.jsxs)(`li`,{"data-state":e.state,children:[(0,G.jsx)(`span`,{className:U.checkDot,"aria-hidden":`true`}),(0,G.jsx)(`span`,{className:U.checkName,children:e.name}),(0,G.jsx)(`span`,{className:U.muted,children:e.state}),e.url?(0,G.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noreferrer`,children:`log`}):null]},`${e.name}-${t}`))}):null,w?(0,G.jsxs)(`div`,{className:U.loop,children:[(0,G.jsx)(v,{checked:O.autoFix,onChange:e=>E(`autoFix`,e),disabled:d!==null,label:`Auto-fix CI`}),(0,G.jsx)(`p`,{className:U.hint,children:`On a red check, the failing log goes back to this same seat — once per push, at most three times.`}),(0,G.jsx)(v,{checked:O.autoMerge,onChange:e=>E(`autoMerge`,e),disabled:d!==null,label:`Auto-merge when green`}),(0,G.jsx)(`p`,{className:U.hint,"data-allowed":O.mergeVerdict.allowed||void 0,children:O.mergeVerdict.reason}),O.loopNote?(0,G.jsx)(`p`,{className:U.loopNote,role:`status`,children:O.loopNote}):null]}):(0,G.jsx)(`p`,{className:U.hint,children:`This chat is not an agent: Auto-fix and Auto-merge belong to agents in their own workspace.`}),O.comments.length>0?(0,G.jsxs)(`section`,{className:U.comments,"aria-label":`Review comments`,children:[(0,G.jsx)(`h4`,{className:U.smallHead,children:`Comments`}),(0,G.jsx)(`ul`,{children:O.comments.map((e,t)=>(0,G.jsxs)(`li`,{children:[(0,G.jsxs)(`div`,{className:U.commentMeta,children:[(0,G.jsxs)(`strong`,{children:[`@`,e.author]}),e.path?(0,G.jsxs)(`span`,{className:U.mono,children:[` `,e.path]}):null]}),(0,G.jsx)(`p`,{className:U.commentBody,children:e.body}),O.sessionId?(0,G.jsx)(h,{size:`sm`,variant:`ghost`,onClick:()=>D(e),disabled:d!==null,children:n?`Add to message`:`Send to agent`}):null]},`${e.at??``}-${t}`))})]}):null,m?(0,G.jsx)(`p`,{className:U.panelNote,role:`status`,children:m}):null,(0,G.jsx)(l,{...x.dialog,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`})]})}function X({sessionId:e,visible:t,host:n}){let[r,i]=(0,y.useState)(null);return(0,y.useEffect)(()=>{if(!e)return;let t=!0;return c(b).then(n=>{t&&i(n.cards.find(t=>t.sessionId===e)?.id??`chat:${e}`)}).catch(()=>{t&&i(`chat:${e}`)}),()=>{t=!1}},[e]),e?r?(0,G.jsx)(`div`,{className:U.dockPane,children:(0,G.jsx)(Y,{cardId:r,visible:t,draftToChat:e=>n.addToMessage(e)})}):(0,G.jsx)(`p`,{className:U.panelNote,children:`Reading…`}):(0,G.jsx)(`p`,{className:U.panelNote,children:`Open a chat to see its checks.`})}export{M as _,T as a,N as c,B as d,z as f,I as g,H as h,w as i,j as l,P as m,W as n,R as o,F as p,U as r,V as s,Y as t,k as u,x as v,S as y};
5
- //# sourceMappingURL=ChecksPanel-B6T2sjc_.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ChecksPanel-B6T2sjc_.js","names":[],"sources":["../../../../../../src/core/verse/agents/types.ts","../../../../../../src/web-ui/routes/verse/agents/agents-queries.ts","../../../../../../src/web-ui/routes/verse/agents/Agents.module.css","../../../../../../src/web-ui/routes/verse/agents/ChecksPanel.tsx"],"sourcesContent":["/**\n * core/verse/agents/types.ts — \"run many agents\" (3.16): the wire contract\n * for the Agents board, one-click agent workspaces, the per-agent Checks tab,\n * Plan first and the per-agent spend cap.\n *\n * AN AGENT IS A CHAT PLUS (OPTIONALLY) A WORKSPACE. Every Verse chat shows on\n * the board; a chat started with \"New agent\" also owns a git worktree on a\n * `verse/<slug>` branch under the Verse-managed `~/.ashlr-worktrees`, the\n * repo's own setup / run / archive scripts (`.ashlr/verse/workspace.json`), a\n * block of ports, and the post-PR loop (Checks, Auto-fix CI, Auto-merge).\n *\n * NOTHING HERE STARTS A MODEL TURN ON ITS OWN AUTHORITY. Turns an agent makes\n * are the operator's: the prompt they typed (sent when setup finishes), the\n * plan they approved, or a CI failure log sent because THEY switched Auto-fix\n * on for that agent — each bounded by the agent's spend cap.\n *\n * BROWSER-SAFE: types and pure constants only.\n */\nimport type { VerseEngine } from '../types.js';\n\nexport const VERSE_AGENTS_PATH = '/api/verse/agents';\n\n// ===========================================================================\n// Workspace configuration — `.ashlr/verse/workspace.json` in the repo\n// ===========================================================================\n\n/** Where a repo describes its agent workspaces (repo-relative). */\nexport const WORKSPACE_CONFIG_RELATIVE_PATH = '.ashlr/verse/workspace.json';\n\n/** Ports a workspace gets by default (Conductor's convention: ten in a row). */\nexport const DEFAULT_WORKSPACE_PORTS = 10;\nexport const MAX_WORKSPACE_PORTS = 50;\n/** First port of the first block. Blocks are handed out upward from here. */\nexport const WORKSPACE_PORT_BASE = 41_000;\nexport const WORKSPACE_PORT_CEILING = 60_000;\n\n/** Live agent workspaces kept before the oldest unpinned, idle one is archived. */\nexport const DEFAULT_WORKSPACE_CAP = 25;\nexport const MAX_WORKSPACE_CAP = 200;\n\nexport const MAX_RUN_SCRIPTS = 8;\nexport const MAX_COPY_ENTRIES = 32;\nexport const MAX_SCRIPT_CHARS = 4_000;\n\nexport interface WorkspaceRunScript {\n /** Button label (\"Dev server\", \"Storybook\"). */\n name: string;\n command: string;\n}\n\n/** The parsed, validated `.ashlr/verse/workspace.json`. Every field optional in the file. */\nexport interface WorkspaceConfig {\n /** Runs once in a new workspace (install deps, seed a db). Gates the first prompt. */\n setup: string | null;\n /** Buttons on the agent (dev server, tests …), each run in a terminal tab. */\n run: WorkspaceRunScript[];\n /** Runs in the workspace just before it is archived (stop containers, drop a db). */\n archive: string | null;\n /** Repo-relative files copied from the main checkout into a new workspace (gitignored ones like `.env`). */\n copy: string[];\n /** Ports reserved for the workspace (ASHLR_PORT … ASHLR_PORT + ports − 1). */\n ports: number;\n}\n\n/** Where a config came from, so the UI can say \"no workspace.json: defaults\". */\nexport interface WorkspaceConfigRead {\n config: WorkspaceConfig;\n source: 'file' | 'default';\n /** Problems in the file (each field that was ignored, and why). Never a path. */\n warnings: string[];\n}\n\n/** The environment every workspace script (and the agent's terminal tabs) gets. */\nexport interface WorkspaceEnv {\n ASHLR_WORKSPACE_PATH: string;\n ASHLR_WORKSPACE_NAME: string;\n ASHLR_ROOT_PATH: string;\n ASHLR_PORT: string;\n ASHLR_PORT_COUNT: string;\n}\n\n// ===========================================================================\n// Agent records (persisted in ~/.ashlr/verse/agents/agents.json)\n// ===========================================================================\n\nexport type AgentPlanState = 'none' | 'drafting' | 'awaiting-approval' | 'approved';\n\nexport type ScriptKind = 'setup' | 'run' | 'archive';\nexport type ScriptState = 'running' | 'ok' | 'failed';\n\n/** One setup / run / archive execution. */\nexport interface ScriptRunRecord {\n id: string;\n kind: ScriptKind;\n /** The run script's name; the kind for setup / archive. */\n name: string;\n /** `terminal` = a Terminal tab in the agent's chat; `process` = a background child with a captured log. */\n via: 'terminal' | 'process';\n tabId: string | null;\n state: ScriptState;\n exitCode: number | null;\n startedAt: string;\n endedAt: string | null;\n}\n\nexport interface AgentWorkspaceRecord {\n /** The main checkout the worktree came from (absolute). */\n rootPath: string;\n /** The worktree (absolute, under ~/.ashlr-worktrees). */\n path: string;\n /** `verse/<slug>`. */\n branch: string;\n /** The slug (directory + branch segment). */\n name: string;\n portBase: number;\n portCount: number;\n /** HEAD the worktree started from. */\n baseSha: string | null;\n}\n\nexport interface AgentArchiveRecord {\n at: string;\n /** Private ref holding the snapshot (`refs/ashlr/verse-archive/<name>`). */\n ref: string | null;\n /** The snapshot commit (working changes included); null when there was nothing to keep. */\n sha: string | null;\n /** The branch head when it was archived (the snapshot's parent). */\n headSha: string | null;\n reason: 'manual' | 'merged' | 'cap';\n /** The branch was deleted (its commits live on in `ref`). */\n branchDeleted: boolean;\n}\n\nexport interface AgentRecord {\n /** `ag_<random>`. */\n id: string;\n /** The Verse chat; null between \"workspace created\" and \"chat bound\". */\n sessionId: string | null;\n title: string;\n createdAt: string;\n updatedAt: string;\n pinned: boolean;\n workspace: AgentWorkspaceRecord | null;\n /** The first prompt, held until setup finishes (then sent and cleared). */\n pendingPrompt: string | null;\n plan: {\n enabled: boolean;\n state: AgentPlanState;\n /** The plan text as the seat wrote it, then as the operator edited it. */\n text: string | null;\n /** turnCount of the turn that wrote the plan. */\n turn: number | null;\n };\n /** USD at API list price (an equivalent: subscriptions are not billed per token). null = no cap. */\n spendCapUsd: number | null;\n /** Spend already warned about (80%) / stopped at (100%), so each fires once per cap. */\n spendWarnedAt: number | null;\n spendStoppedAt: number | null;\n autoFix: boolean;\n autoMerge: boolean;\n /** Head SHAs already sent to the seat as a CI failure (one fix attempt per head). */\n autoFixSentFor: string[];\n autoFixAttempts: number;\n /** The last thing the post-PR loop did or refused, in one sentence. */\n loopNote: string | null;\n scripts: ScriptRunRecord[];\n archived: AgentArchiveRecord | null;\n /** turnCount at which a failed turn was resolved by the operator (Needs you → out). */\n resolvedFailureTurn: number | null;\n}\n\n/** Most auto-fix attempts per PR before the agent goes to Needs you. */\nexport const MAX_AUTO_FIX_ATTEMPTS = 3;\n/** Spend warning threshold (fraction of the cap). */\nexport const SPEND_WARN_FRACTION = 0.8;\n\n// ===========================================================================\n// The board (GET /api/verse/agents)\n// ===========================================================================\n\nexport const AGENT_COLUMNS = ['working', 'needs-you', 'review', 'done'] as const;\nexport type AgentColumn = (typeof AGENT_COLUMNS)[number];\n\nexport const AGENT_COLUMN_LABEL: Readonly<Record<AgentColumn, string>> = {\n working: 'Working',\n 'needs-you': 'Needs you',\n review: 'Ready for review',\n done: 'Done',\n};\n\n/** Why a card is where it is — the reason line the card shows. */\nexport type AgentReasonCode =\n | 'running'\n | 'setup-running'\n | 'ci-running'\n | 'plan-drafting'\n | 'failed'\n | 'plan-ready'\n | 'spend-cap'\n | 'setup-failed'\n | 'ci-failed'\n | 'merge-blocked'\n | 'unread'\n | 'changes'\n | 'pr-open'\n | 'merged'\n | 'archived'\n | 'idle';\n\nexport interface AgentChecksSummary {\n pr: { number: number; url: string; state: 'open' | 'draft' | 'merged' | 'closed'; title: string } | null;\n ci: 'passing' | 'failing' | 'pending' | 'none' | 'unknown';\n dirty: number;\n ahead: number;\n /** Unresolved review threads + change requests, when read. */\n comments: number | null;\n checkedAt: string | null;\n}\n\nexport interface AgentSpend {\n /** USD at API list price; null when the model has no list price (local, Grok, Devin). */\n usd: number | null;\n capUsd: number | null;\n /** 0–1+ of the cap; null without both. */\n fraction: number | null;\n tokens: number;\n}\n\nexport interface AgentCard {\n /** The agent id, or `chat:<sessionId>` for a chat with no agent record. */\n id: string;\n agentId: string | null;\n sessionId: string | null;\n title: string;\n column: AgentColumn;\n reason: AgentReasonCode;\n /** One line: why it is in this column, in operator language. */\n reasonText: string;\n seatId: string | null;\n engine: VerseEngine | null;\n model: string | null;\n repo: string | null;\n branch: string | null;\n workspacePath: string | null;\n status: 'idle' | 'running' | 'error' | 'setup' | 'archived';\n unread: boolean;\n pinned: boolean;\n createdAt: string;\n updatedAt: string;\n /** When the current run started (running cards); null otherwise. */\n startedAt: string | null;\n /** The last thing it said or did, one line. */\n lastActivity: string | null;\n turnCount: number;\n spend: AgentSpend;\n checks: AgentChecksSummary | null;\n autoFix: boolean;\n autoMerge: boolean;\n plan: AgentRecord['plan'] | null;\n ports: { base: number; count: number } | null;\n runScripts: string[];\n scripts: ScriptRunRecord[];\n loopNote: string | null;\n /** The first prompt is held (setup running or failed): \"Send anyway\" can release it. */\n heldPrompt: boolean;\n archived: boolean;\n /** Archived with a snapshot: Restore brings the workspace back. */\n restorable: boolean;\n}\n\nexport interface AgentBoardResponse {\n generatedAt: string;\n cards: AgentCard[];\n counts: Record<AgentColumn, number>;\n cap: number;\n /** Live (unarchived) agent workspaces. */\n liveWorkspaces: number;\n /** The post-PR loop is running in this server. */\n supervisor: boolean;\n}\n\n// ===========================================================================\n// Requests\n// ===========================================================================\n\n/** POST /api/verse/agents/workspaces — make the worktree (the chat is created next, by the page). */\nexport interface AgentWorkspaceCreateRequest {\n root: string;\n /** Optional slug; derived from the title otherwise. */\n name?: string;\n title: string;\n planFirst?: boolean;\n spendCapUsd?: number | null;\n autoFix?: boolean;\n autoMerge?: boolean;\n}\n\nexport interface AgentWorkspaceCreateResponse {\n agent: AgentRecord;\n config: WorkspaceConfigRead;\n /** Agents archived to stay under the cap. */\n archivedForCap: string[];\n}\n\n/** POST /api/verse/agents/:id/bind — attach the chat, and hand over the first prompt. */\nexport interface AgentBindRequest {\n sessionId: string;\n /** Held until setup finishes, then sent (as a plan request when Plan first is on). */\n prompt?: string;\n}\n\n/** POST /api/verse/agents/chat — adopt an existing chat (no workspace) so it can have toggles and a cap. */\nexport interface AgentAdoptRequest {\n sessionId: string;\n}\n\n/** POST /api/verse/agents/:id/settings */\nexport interface AgentSettingsUpdate {\n autoFix?: boolean;\n autoMerge?: boolean;\n spendCapUsd?: number | null;\n pinned?: boolean;\n title?: string;\n}\n\n/** POST /api/verse/agents/:id/plan — approve (optionally edited) or discard. */\nexport interface AgentPlanDecision {\n action: 'approve' | 'discard';\n text?: string;\n}\n\n/** GET /api/verse/agents/:id/checks */\nexport interface AgentChecksDetail {\n agentId: string | null;\n sessionId: string | null;\n root: string | null;\n branch: string | null;\n base: string | null;\n dirty: number;\n ahead: number;\n behind: number;\n diffstat: { files: number; additions: number; deletions: number } | null;\n pr: AgentChecksSummary['pr'] & { mergeable: boolean | null; headSha: string | null } | null;\n ci: AgentChecksSummary['ci'];\n checks: Array<{ name: string; state: 'passing' | 'failing' | 'pending' | 'skipped'; url: string | null }>;\n comments: Array<{ author: string; body: string; at: string | null; path: string | null; url: string | null }>;\n /** Auto-merge would do what, right now — in one sentence. */\n mergeVerdict: { allowed: boolean; reason: string };\n autoFix: boolean;\n autoMerge: boolean;\n loopNote: string | null;\n checkedAt: string;\n /** gh could not answer (signed out, no remote): the PR part is unknown, not \"none\". */\n unavailable: string | null;\n}\n\nexport interface AgentScriptLog {\n run: ScriptRunRecord;\n /** The captured output tail (process runs; a terminal run's lives in its tab). */\n text: string;\n truncated: boolean;\n}\n","/**\n * routes/verse/agents/agents-queries.ts — reads and writes behind the Agents\n * board (core/verse/agents-api.ts), and the one-action \"spawn\" that makes an\n * agent: workspace → chat → bind (+ the first prompt).\n *\n * The chat itself is created through the ORDINARY session route\n * (createVerseSession), so a new agent passes the same seat readiness, model\n * and local-only gates as a hand-made chat. Reads spend nothing; writes pull\n * the held mutation token, touch the hold, and invalidate the board.\n */\nimport type {\n AgentBoardResponse,\n AgentChecksDetail,\n AgentRecord,\n AgentScriptLog,\n AgentWorkspaceCreateResponse,\n ScriptRunRecord,\n WorkspaceConfigRead,\n} from '../../../../core/verse/agents/types.js';\nimport { VERSE_AGENTS_PATH } from '../../../../core/verse/agents/types.js';\nimport type { VerseGitPr } from '../../../../core/verse/workbench-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport { apiGet, apiPost } from '../../../data/client.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { createVerseSession, invalidateVerseLists, VerseMutationLockedError, VERSE_ACTIVITY_KEY } from '../verse-queries.js';\n\nexport const AGENTS_KEY = 'verse-agents';\n/** The board polls while visible; cards also move on the activity poll's completions. */\nexport const AGENTS_POLL_MS = 5_000;\n\nexport const agentsBoardQuery: QueryDef<AgentBoardResponse> = {\n key: AGENTS_KEY,\n fetch: (signal) => apiGet<AgentBoardResponse>(VERSE_AGENTS_PATH, signal),\n};\n\nfunction token(): string {\n const t = getMutationToken();\n if (!t) throw new VerseMutationLockedError();\n return t;\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const res = await apiPost<T>(path, body, token());\n touchMutationHold();\n invalidate(AGENTS_KEY);\n invalidate(VERSE_ACTIVITY_KEY);\n return res;\n}\n\nconst at = (id: string, verb: string): string => `${VERSE_AGENTS_PATH}/${encodeURIComponent(id)}/${verb}`;\n\nexport function fetchWorkspaceConfig(root: string, signal?: AbortSignal): Promise<WorkspaceConfigRead> {\n return apiGet<WorkspaceConfigRead>(`${VERSE_AGENTS_PATH}/config?root=${encodeURIComponent(root)}`, signal);\n}\n\nexport function fetchAgentChecks(cardId: string, fresh: boolean, signal?: AbortSignal): Promise<AgentChecksDetail> {\n return apiGet<AgentChecksDetail>(`${at(cardId, 'checks')}${fresh ? '?fresh=1' : ''}`, signal);\n}\n\nexport function fetchScriptLog(agentId: string, runId: string, signal?: AbortSignal): Promise<AgentScriptLog> {\n return apiGet<AgentScriptLog>(`${VERSE_AGENTS_PATH}/${encodeURIComponent(agentId)}/scripts/${encodeURIComponent(runId)}/log`, signal);\n}\n\nexport const updateAgentSettings = (id: string, patch: { autoFix?: boolean; autoMerge?: boolean; spendCapUsd?: number | null; pinned?: boolean; title?: string }) =>\n post<{ agent: AgentRecord }>(at(id, 'settings'), patch).then((r) => r.agent);\n\nexport const decideAgentPlan = (id: string, action: 'approve' | 'discard', text?: string) =>\n post<{ agent: AgentRecord }>(at(id, 'plan'), text === undefined ? { action } : { action, text }).then((r) => r.agent);\n\nexport const sendHeldPrompt = (id: string) => post<{ agent: AgentRecord }>(at(id, 'send-prompt'), {}).then((r) => r.agent);\n\nexport const runAgentScript = (id: string, kind: 'setup' | 'run', index?: number) =>\n post<{ agent: AgentRecord; run: ScriptRunRecord }>(at(id, 'scripts'), index === undefined ? { kind } : { kind, index });\n\nexport const stopAgentScript = (id: string, runId: string) =>\n post<{ agent: AgentRecord }>(`${VERSE_AGENTS_PATH}/${encodeURIComponent(id)}/scripts/${encodeURIComponent(runId)}/stop`, {});\n\nexport const openAgentPr = (id: string, input: { title?: string; body?: string; draft?: boolean } = {}) =>\n post<{ agent: AgentRecord; pr: VerseGitPr }>(at(id, 'pr'), input);\n\nexport const archiveAgentCard = (id: string) => post<{ agent: AgentRecord }>(at(id, 'archive'), {}).then((r) => r.agent);\nexport const restoreAgentCard = (id: string) => post<{ agent: AgentRecord }>(at(id, 'restore'), {}).then((r) => r.agent);\n/** Takes a failed turn out of Needs you. Works for `chat:<id>` cards too. */\nexport const resolveAgentCard = (cardId: string) => post<unknown>(at(cardId, 'resolve'), {});\n\nexport type BulkAction = 'read' | 'stop' | 'archive' | 'pin' | 'unpin';\nexport interface BulkResult {\n id: string;\n ok: boolean;\n skipped?: string;\n error?: string;\n}\n\nexport async function bulkAgents(action: BulkAction, ids: readonly string[]): Promise<BulkResult[]> {\n const res = await post<{ results: BulkResult[] }>(`${VERSE_AGENTS_PATH}/bulk`, { action, ids });\n // \"read\" and \"archive\" move chats in the sidebar too.\n invalidateVerseLists();\n return res.results;\n}\n\n// ---------------------------------------------------------------------------\n// Spawn — the one action behind ⌘N / ⇧⌘N on the board\n// ---------------------------------------------------------------------------\n\nexport interface SpawnInput {\n root: string;\n seatId: string;\n model: string;\n title: string;\n prompt: string;\n /** Own git worktree on `verse/<slug>` (default). Off: the agent works in `root` itself. */\n isolate: boolean;\n planFirst: boolean;\n spendCapUsd: number | null;\n autoFix: boolean;\n autoMerge: boolean;\n}\n\nexport interface SpawnResult {\n agent: AgentRecord;\n sessionId: string;\n held: boolean;\n config: WorkspaceConfigRead | null;\n archivedForCap: string[];\n}\n\n/**\n * Make one agent. A workspace whose chat could not be created is discarded\n * again (nothing is left behind); a chat that was created but could not be\n * bound keeps the chat (it is a normal chat) and reports the error.\n */\nexport async function spawnAgent(input: SpawnInput): Promise<SpawnResult> {\n const options = {\n planFirst: input.planFirst,\n spendCapUsd: input.spendCapUsd,\n autoFix: input.autoFix,\n autoMerge: input.autoMerge,\n };\n if (input.isolate) {\n const made = await post<AgentWorkspaceCreateResponse>(`${VERSE_AGENTS_PATH}/workspaces`, { root: input.root, title: input.title, ...options });\n const path = made.agent.workspace?.path;\n if (!path) throw new Error('The workspace was not created.');\n let sessionId: string;\n try {\n const session = await createVerseSession({ projectPath: path, seatId: input.seatId, model: input.model, title: input.title });\n sessionId = session.id;\n } catch (err) {\n await post(at(made.agent.id, 'discard'), {}).catch(() => undefined);\n throw err;\n }\n const bound = await post<{ agent: AgentRecord; held: boolean }>(at(made.agent.id, 'bind'), { sessionId, ...(input.prompt.trim() ? { prompt: input.prompt } : {}) });\n invalidateVerseLists();\n return { agent: bound.agent, sessionId, held: bound.held, config: made.config, archivedForCap: made.archivedForCap };\n }\n const session = await createVerseSession({ projectPath: input.root, seatId: input.seatId, model: input.model, title: input.title });\n const adopted = await post<{ agent: AgentRecord }>(`${VERSE_AGENTS_PATH}/chat`, { sessionId: session.id, title: input.title, ...options });\n const bound = await post<{ agent: AgentRecord; held: boolean }>(at(adopted.agent.id, 'bind'), { sessionId: session.id, ...(input.prompt.trim() ? { prompt: input.prompt } : {}) });\n invalidateVerseLists();\n return { agent: bound.agent, sessionId: session.id, held: bound.held, config: null, archivedForCap: [] };\n}\n","/*\n * Agents board (3.16) — four columns of cards (Working · Needs you · Ready for\n * review · Done), a detail panel on the right, a bulk bar, and the Checks\n * panel shared with the chat dock. Tokens only (DESIGN.md §13; style-scan-310\n * enforces it): no raw colour, no px font size. At the compact width the\n * columns scroll sideways and the detail panel overlays the board.\n */\n\n.section {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n padding: var(--space-4) var(--space-4) var(--space-2);\n padding-left: max(var(--space-4), calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px)));\n gap: var(--space-3);\n}\n\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n justify-content: space-between;\n gap: var(--space-3) var(--space-4);\n}\n.headerText {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n.headerActions {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n}\n.title {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n letter-spacing: var(--tracking-display);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.lede {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n\n.banner {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n.banner[data-tone='danger'] {\n color: var(--status-danger-fg);\n border-color: var(--status-danger-solid);\n}\n\n.bulkBar {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-md);\n background: var(--bg-selected);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n}\n\n.body {\n position: relative;\n display: grid;\n grid-template-columns: minmax(0, 1fr);\n gap: var(--space-3);\n flex: 1;\n min-height: 0;\n}\n.body[data-details='open'] {\n grid-template-columns: minmax(0, 1fr) minmax(300px, 380px);\n}\n\n.board {\n display: grid;\n grid-template-columns: repeat(4, minmax(220px, 1fr));\n gap: var(--space-3);\n min-height: 0;\n overflow-x: auto;\n overflow-y: hidden;\n}\n\n.column {\n display: flex;\n flex-direction: column;\n min-height: 0;\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n border: 1px solid var(--border-subtle);\n}\n.column[data-column='needs-you'] {\n border-color: var(--status-warning-solid);\n}\n.columnHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n margin: 0;\n padding: var(--space-2) var(--space-3);\n font-family: var(--font-display);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n font-weight: var(--font-weight-semibold);\n color: var(--text-secondary);\n border-bottom: 1px solid var(--border-subtle);\n}\n.count {\n font-variant-numeric: tabular-nums;\n color: var(--text-tertiary);\n}\n.cardList {\n list-style: none;\n margin: 0;\n padding: var(--space-2);\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n overflow-y: auto;\n min-height: 0;\n}\n.emptyColumn {\n padding: var(--space-3);\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n text-align: center;\n}\n\n.card {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-subtle);\n background: var(--bg-canvas);\n cursor: pointer;\n outline: none;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n.card:hover {\n background: var(--bg-hover);\n}\n.card:focus-visible,\n.card[data-active] {\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n.card[data-selected] {\n background: var(--bg-selected);\n}\n.cardTop {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n}\n.cardCheck {\n margin: 0;\n flex: none;\n}\n.cardTitle {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n}\n.unreadDot {\n flex: none;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n background: var(--text-link);\n}\n.pin {\n color: var(--text-tertiary);\n}\n.cardMeta,\n.cardStats {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-2);\n min-width: 0;\n}\n.seatChip {\n padding: 0 var(--space-1);\n border-radius: var(--radius-xs);\n background: var(--bg-surface);\n border: 1px solid var(--border-subtle);\n color: var(--text-secondary);\n max-width: 100%;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.cardReason {\n color: var(--text-primary);\n}\n.cardReason[data-reason='failed'],\n.cardReason[data-reason='spend-cap'],\n.cardReason[data-reason='setup-failed'],\n.cardReason[data-reason='ci-failed'],\n.cardReason[data-reason='merge-blocked'] {\n color: var(--status-danger-fg);\n}\n.cardReason[data-reason='plan-ready'] {\n color: var(--status-warning-fg);\n}\n.cardStats [data-tone='warning'] {\n color: var(--status-warning-fg);\n}\n.cardStats [data-tone='danger'] {\n color: var(--status-danger-fg);\n}\n.flag {\n color: var(--text-tertiary);\n}\n.cardLast {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--text-tertiary);\n}\n\n.muted {\n color: var(--text-tertiary);\n}\n.mono {\n font-family: var(--font-mono);\n word-break: break-all;\n}\n\n.keyHint {\n margin: 0;\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n}\n\n/* ── detail panel ──────────────────────────────────────────────────────── */\n\n.details {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n min-height: 0;\n overflow-y: auto;\n padding: var(--space-3);\n border-radius: var(--radius-md);\n border: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n.detailsHead {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-2);\n}\n.detailsHead p {\n margin: 0;\n}\n.detailsTitle {\n margin: 0;\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.detailsActions,\n.scriptButtons,\n.formActions {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-2);\n}\n.formActions {\n justify-content: flex-end;\n}\n.overview {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n}\n.facts {\n display: grid;\n gap: var(--space-1);\n margin: 0;\n}\n.facts > div {\n display: grid;\n grid-template-columns: 96px minmax(0, 1fr);\n gap: var(--space-2);\n}\n.facts dt {\n color: var(--text-tertiary);\n}\n.facts dd {\n margin: 0;\n color: var(--text-primary);\n min-width: 0;\n}\n.facts dd[data-ci='failing'] {\n color: var(--status-danger-fg);\n}\n.facts dd[data-ci='passing'] {\n color: var(--status-success-fg);\n}\n.smallHead {\n margin: 0 0 var(--space-1);\n font-family: var(--font-display);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-secondary);\n}\n.planBox,\n.held,\n.capBox {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n.hint {\n margin: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n.hint[data-allowed] {\n color: var(--status-success-fg);\n}\n.loopNote {\n margin: 0;\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--status-neutral-bg);\n color: var(--status-neutral-fg);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.runRow {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n}\n.setupLog {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n}\n.log {\n margin: 0;\n max-height: 240px;\n overflow: auto;\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n background: var(--bg-canvas);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n white-space: pre-wrap;\n color: var(--text-secondary);\n}\n\n/* ── checks ────────────────────────────────────────────────────────────── */\n\n.checks {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n.checksHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-2);\n}\n.checksBranch {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.checkList {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n}\n.checkList li {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n font-size: var(--text-xs-size);\n}\n.checkDot {\n flex: none;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n background: var(--status-neutral-fg);\n}\n.checkList li[data-state='passing'] .checkDot {\n background: var(--status-success-solid);\n}\n.checkList li[data-state='failing'] .checkDot {\n background: var(--status-danger-solid);\n}\n.checkList li[data-state='pending'] .checkDot {\n background: var(--status-warning-solid);\n}\n.checkName {\n flex: 1;\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n color: var(--text-primary);\n}\n.loop {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n}\n.comments ul {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n.commentMeta {\n font-size: var(--text-xs-size);\n}\n.commentBody {\n margin: var(--space-1) 0;\n white-space: pre-wrap;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-primary);\n}\n.panelNote {\n margin: 0;\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n.dockPane {\n padding: var(--space-3);\n overflow-y: auto;\n height: 100%;\n}\n\n/* ── new agent dialog ──────────────────────────────────────────────────── */\n\n.dialogWidth {\n width: min(640px, calc(100vw - var(--space-8)));\n}\n.form {\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n}\n.field {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n}\n.fieldLabel {\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n}\n.textarea {\n width: 100%;\n box-sizing: border-box;\n resize: vertical;\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n border: 1px solid var(--border-default);\n background: var(--bg-canvas);\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n.textarea:focus-visible {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n.options {\n display: grid;\n grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));\n gap: var(--space-2) var(--space-4);\n align-items: start;\n}\n.seatList {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-sm);\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n max-height: 220px;\n overflow-y: auto;\n}\n.seatList legend {\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n.seatRow {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n}\n.seatRow[data-disabled] {\n color: var(--text-tertiary);\n}\n.formError {\n margin: 0;\n font-size: var(--text-sm-size);\n color: var(--status-danger-fg);\n}\n\n@container (max-width: 720px) {\n .board {\n grid-template-columns: repeat(4, minmax(240px, 80%));\n }\n}\n\n@media (max-width: 900px) {\n .body[data-details='open'] {\n grid-template-columns: minmax(0, 1fr);\n }\n .details {\n position: absolute;\n inset: 0 0 0 auto;\n width: min(380px, 100%);\n z-index: 2;\n }\n}\n","/**\n * routes/verse/agents/ChecksPanel.tsx — one agent's Checks: git status, its\n * PR, every CI check, review comments, what Auto-merge would do right now —\n * and the two switches, Auto-fix CI and Auto-merge when green.\n *\n * Shown in the Agents board's detail panel and as the chat dock's \"Checks\"\n * pane (checks.pane.tsx). A chat that is not an agent gets the same read,\n * read-only (the switches live on agents: they need a workspace branch).\n *\n * A review comment can go back to the agent in one click (\"Send to agent\"):\n * it is drafted into the chat's composer when the dock hosts this panel, or\n * sent as a turn from the board (through the ordinary turn route).\n */\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { VERSE_AGENTS_PATH, type AgentBoardResponse, type AgentChecksDetail } from '../../../../core/verse/agents/types.js';\nimport { apiGet } from '../../../data/client.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { sendVerseTurn } from '../verse-queries.js';\nimport { fetchAgentChecks, openAgentPr, updateAgentSettings } from './agents-queries.js';\nimport styles from './Agents.module.css';\n\nconst REFRESH_MS = 30_000;\n\nexport interface ChecksPanelProps {\n /** An agent id (`ag_…`) or `chat:<sessionId>`. */\n cardId: string;\n visible?: boolean;\n /** Draft text into the chat's composer (dock pane); absent → \"Send to agent\" sends a turn. */\n draftToChat?: (text: string) => void;\n /** Called after a switch or PR changes something the board shows. */\n onChanged?: () => void;\n}\n\nconst CI_TEXT: Record<AgentChecksDetail['ci'], string> = {\n passing: 'All checks green',\n failing: 'Checks failing',\n pending: 'Checks running',\n none: 'No checks reported',\n unknown: 'Checks unknown',\n};\n\nexport function commentToAgentText(c: AgentChecksDetail['comments'][number]): string {\n return [`Review comment from @${c.author}${c.path ? ` on ${c.path}` : ''}:`, '', c.body.split('\\n').map((l) => `> ${l}`).join('\\n'), '', 'Address it in this workspace, then commit and push to the same branch.'].join('\\n');\n}\n\nexport function ChecksPanel({ cardId, visible = true, draftToChat, onChanged }: ChecksPanelProps) {\n const [detail, setDetail] = useState<AgentChecksDetail | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [loading, setLoading] = useState(false);\n const [busy, setBusy] = useState<string | null>(null);\n const [note, setNote] = useState<string | null>(null);\n const gate = useTokenGate();\n const alive = useRef(true);\n useEffect(() => () => { alive.current = false; }, []);\n\n const load = useCallback((fresh: boolean) => {\n const ctl = new AbortController();\n setLoading(true);\n fetchAgentChecks(cardId, fresh, ctl.signal).then(\n (d) => { if (alive.current) { setDetail(d); setError(null); } },\n (err: unknown) => { if (alive.current && !ctl.signal.aborted) setError(describeContextError(err)); },\n ).finally(() => { if (alive.current) setLoading(false); });\n return ctl;\n }, [cardId]);\n\n useEffect(() => {\n if (!visible) return undefined;\n const first = load(false);\n const timer = setInterval(() => load(false), REFRESH_MS);\n return () => { first.abort(); clearInterval(timer); };\n }, [visible, load]);\n\n const agentId = cardId.startsWith('ag_') ? cardId : null;\n const act = async (key: string, why: string, run: () => Promise<string | null>) => {\n setBusy(key);\n setNote(null);\n try {\n const message = await gate.run(why, run);\n if (message) setNote(message);\n onChanged?.();\n load(true);\n } catch (err) {\n setNote(describeContextError(err));\n } finally {\n setBusy(null);\n }\n };\n\n const toggle = (key: 'autoFix' | 'autoMerge', next: boolean) => {\n if (!agentId) return;\n void act(key, key === 'autoFix' ? 'Change Auto-fix CI for this agent' : 'Change Auto-merge for this agent', async () => {\n await updateAgentSettings(agentId, { [key]: next });\n return null;\n });\n };\n\n const sendComment = (c: AgentChecksDetail['comments'][number]) => {\n const text = commentToAgentText(c);\n if (draftToChat) {\n draftToChat(text);\n setNote('Drafted into the chat — edit and send it.');\n return;\n }\n const sessionId = detail?.sessionId;\n if (!sessionId) return;\n void act(`comment:${c.at ?? c.body.slice(0, 10)}`, 'Send this review comment to the agent', async () => {\n await sendVerseTurn(sessionId, text);\n return 'Sent to the agent.';\n });\n };\n\n if (error && !detail) return <p className={styles.panelNote} role=\"alert\">{error}</p>;\n if (!detail) return <p className={styles.panelNote}>{loading ? 'Reading git and GitHub…' : 'No checks yet.'}</p>;\n\n const d = detail;\n return (\n <div className={styles.checks} aria-label=\"Checks\">\n <div className={styles.checksHead}>\n <div className={styles.checksBranch}>\n <span className={styles.mono}>{d.branch ?? 'detached HEAD'}</span>\n {d.base ? <span className={styles.muted}> → {d.base}</span> : null}\n </div>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => load(true)} busy={loading}>Refresh</Button>\n </div>\n\n <dl className={styles.facts}>\n <div><dt>Working tree</dt><dd>{d.dirty === 0 ? 'Clean' : `${d.dirty} uncommitted`}</dd></div>\n <div><dt>Branch</dt><dd>{d.ahead} ahead{d.behind ? ` · ${d.behind} behind` : ''}{d.diffstat ? ` · +${d.diffstat.additions} −${d.diffstat.deletions} in ${d.diffstat.files} files` : ''}</dd></div>\n <div>\n <dt>PR</dt>\n <dd>\n {d.pr ? (\n <a href={d.pr.url} target=\"_blank\" rel=\"noreferrer\">#{d.pr.number} {d.pr.title}</a>\n ) : d.unavailable ? d.unavailable : 'None yet'}\n {d.pr ? <span className={styles.muted}> · {d.pr.state}{d.pr.mergeable === false ? ' · conflicts' : ''}</span> : null}\n </dd>\n </div>\n <div><dt>CI</dt><dd data-ci={d.ci}>{CI_TEXT[d.ci]}</dd></div>\n </dl>\n\n {!d.pr && agentId && d.ahead + d.dirty > 0 ? (\n <Button\n size=\"sm\"\n variant=\"subtle\"\n busy={busy === 'pr'}\n onClick={() => void act('pr', 'Push this agent’s branch and open a PR', async () => {\n const res = await openAgentPr(agentId);\n return `Opened PR #${res.pr.number}.`;\n })}\n >\n Push and open PR\n </Button>\n ) : null}\n\n {d.checks.length > 0 ? (\n <ul className={styles.checkList} aria-label=\"CI checks\">\n {d.checks.map((c, i) => (\n <li key={`${c.name}-${i}`} data-state={c.state}>\n <span className={styles.checkDot} aria-hidden=\"true\" />\n <span className={styles.checkName}>{c.name}</span>\n <span className={styles.muted}>{c.state}</span>\n {c.url ? <a href={c.url} target=\"_blank\" rel=\"noreferrer\">log</a> : null}\n </li>\n ))}\n </ul>\n ) : null}\n\n {agentId ? (\n <div className={styles.loop}>\n <Switch\n checked={d.autoFix}\n onChange={(v) => toggle('autoFix', v)}\n disabled={busy !== null}\n label=\"Auto-fix CI\"\n />\n <p className={styles.hint}>On a red check, the failing log goes back to this same seat — once per push, at most three times.</p>\n <Switch\n checked={d.autoMerge}\n onChange={(v) => toggle('autoMerge', v)}\n disabled={busy !== null}\n label=\"Auto-merge when green\"\n />\n <p className={styles.hint} data-allowed={d.mergeVerdict.allowed || undefined}>{d.mergeVerdict.reason}</p>\n {d.loopNote ? <p className={styles.loopNote} role=\"status\">{d.loopNote}</p> : null}\n </div>\n ) : (\n <p className={styles.hint}>This chat is not an agent: Auto-fix and Auto-merge belong to agents in their own workspace.</p>\n )}\n\n {d.comments.length > 0 ? (\n <section className={styles.comments} aria-label=\"Review comments\">\n <h4 className={styles.smallHead}>Comments</h4>\n <ul>\n {d.comments.map((c, i) => (\n <li key={`${c.at ?? ''}-${i}`}>\n <div className={styles.commentMeta}>\n <strong>@{c.author}</strong>\n {c.path ? <span className={styles.mono}> {c.path}</span> : null}\n </div>\n <p className={styles.commentBody}>{c.body}</p>\n {d.sessionId ? (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => sendComment(c)} disabled={busy !== null}>\n {draftToChat ? 'Add to message' : 'Send to agent'}\n </Button>\n ) : null}\n </li>\n ))}\n </ul>\n </section>\n ) : null}\n\n {note ? <p className={styles.panelNote} role=\"status\">{note}</p> : null}\n <MutationTokenDialog {...gate.dialog} tokenLabel=\"Mutation token\" tokenHelp=\"the mutation token ashlr verse printed\" />\n </div>\n );\n}\n\n/** The chat dock's Checks pane: the open chat's agent (or the chat itself, read-only). */\nexport function ChecksDockPane({ sessionId, visible, host }: { sessionId: string | null; visible: boolean; host: { addToMessage(text: string): void } }) {\n const [cardId, setCardId] = useState<string | null>(null);\n useEffect(() => {\n if (!sessionId) return;\n let live = true;\n // The board already knows which agent owns this chat.\n apiGet<AgentBoardResponse>(VERSE_AGENTS_PATH)\n .then((b) => { if (live) setCardId(b.cards.find((c) => c.sessionId === sessionId)?.id ?? `chat:${sessionId}`); })\n .catch(() => { if (live) setCardId(`chat:${sessionId}`); });\n return () => { live = false; };\n }, [sessionId]);\n if (!sessionId) return <p className={styles.panelNote}>Open a chat to see its checks.</p>;\n if (!cardId) return <p className={styles.panelNote}>Reading…</p>;\n return (\n <div className={styles.dockPane}>\n <ChecksPanel cardId={cardId} visible={visible} draftToChat={(t) => host.addToMessage(t)} />\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{n as e,s as t,u as n}from"./index-BbDqdepe.js";import{t as r}from"./seat-readiness-CvEmMBol.js";import{n as i}from"./format-CcEKjUou.js";import{t as a}from"./Button-DP2ImS5n.js";import{t as o}from"./Switch-BtEo9Cku.js";import{o as s,s as c,t as l}from"./cloud-model-DuboHWPT.js";import{t as u}from"./cloud.module-DOP-N4Ch.js";import{t as d}from"./Input-BEF-ScuG.js";import{i as f}from"./headroom-CP99UxyV.js";import{o as p,s as m}from"./why-seat-model-Dh4-Ty9n.js";var h=864e5,g=36e5;function _(e,t,n,r=0){let i=e.length-r,a=i-n;if(a<0||n<=0)return null;let o=0;for(let n=a;n<i;n++){let r=t(e[n]);if(r===null||!Number.isFinite(r))return null;o+=r}return o}function v(e,t,n){return e.slice(Math.max(0,e.length-n)).map(t)}function y(e){let t=e.filter(e=>e!==null&&Number.isFinite(e));return t.length?t.reduce((e,t)=>e+t,0)/t.length:null}function b(e){let t=e.meteredCostUsd;return typeof t==`number`&&Number.isFinite(t)&&t>=0?t:null}var ee=e=>e>0?`+${e}`:String(e),x=e=>`${e>0?`+`:``}${e.toFixed(1)}`,S=e=>`${e>0?`+`:e<0?`−`:``}$${Math.abs(e).toFixed(2)}`;function C(e){if(e===null||!Number.isFinite(e)||e<0)return`—`;let t=Math.round(e/6e4);if(t<60)return`${t}m`;let n=Math.floor(t/60);if(n<48)return t%60?`${n}h ${t%60}m`:`${n}h`;let r=Math.floor(n/24);return n%24?`${r}d ${n%24}h`:`${r}d`}function te(e){if(!e||e.repos.length===0)return[];let t=Math.max(...e.repos.map(e=>e.greenTrend.length));return Array.from({length:t},(n,r)=>y(e.repos.map(e=>e.greenTrend[r-(t-e.greenTrend.length)]??null)))}function w({fleet:e,history:t,learning:n,policy:r}){let i=t?.days??[],a=e=>e.merges.realized,o=b,s=e?.summary.merged7d??_(i,a,7),c=_(i,a,7,7),l=_(i,a,7),u=l!==null&&c!==null?l-c:null,d=e?.summary.postMergeGreenPct7d??null,f=te(e),p=f.length>=14?y(f.slice(-7)):null,m=f.length>=14?y(f.slice(-14,-7)):null,h=p!==null&&m!==null?p-m:null,g=_(i,o,7),w=_(i,o,7,7),T=r?r.spend.meteredUsdPerDay:null,E=g===null?`—`:`$${g.toFixed(2)}${T===null?``:` / $${(T*7).toFixed(0)}`}`,D=i.some(e=>b(e)!==null),O=T===null?`per-token APIs only`:T===0?`metered APIs off`:`cap $${T}/day`,k=D?O:`${O} · not reported yet`,A=n?.active??null,j=(A?.experimentId?n?.experiments.find(e=>e.id===A.experimentId)??null:null)?.lift??null;return[{id:`merged`,label:`Merged · 7d`,value:s===null?`—`:String(s),delta:u===null?null:{value:u,unit:Math.abs(u)===1?`merge`:`merges`,versus:`vs prior 7d`,goodWhenPositive:!0,format:ee},trend:i.length?v(i,a,14):void 0,trendLabel:`Merges per day, last 14 days`,caption:e?.summary.mergedToday==null?`fleet merges on default branches`:`${e.summary.mergedToday} today`},{id:`green`,label:`Post-merge green`,value:d===null?`—`:`${Math.round(d)}%`,delta:h===null?null:{value:h,unit:`pts`,versus:`vs prior 7d`,goodWhenPositive:!0,format:x},trend:f.length?f:void 0,trendLabel:`Post-merge green percent per day`,caption:d===null?`no completed post-merge watch yet`:`CI + suite 2 h after each merge`},{id:`cycle`,label:`Cycle time`,value:C(e?.summary.cycleTimeP50Ms7d??null),delta:null,trend:void 0,trendLabel:`Cycle time`,caption:`median, proposal → merge, 7d`},{id:`spend`,label:`Metered spend · 7d`,value:E,delta:g!==null&&w!==null?{value:g-w,versus:`vs prior 7d`,goodWhenPositive:!1,format:S}:null,trend:D?v(i,o,14):void 0,trendLabel:`Metered (per-token API) spend per day`,caption:k},{id:`lift`,label:`Lift`,value:j?`${x(j.mean)} pts`:`—`,delta:null,trend:void 0,trendLabel:`Harness lift`,caption:A?`harness ${A.id} vs baseline${j?` (95% ${x(j.ciLow)} to ${x(j.ciHigh)})`:``}`:`no harness adopted — defaults in force`}]}function T({fleet:e,history:t,learning:n}){let r=t?.days??[],i=e=>e.merges.realized,a=e?.summary.merged7d??_(r,i,7),o=_(r,i,7,7),s=n?.active??null,c=s?.experimentId?n?.experiments.find(e=>e.id===s.experimentId)?.lift??null:null;return(a??0)===0&&(o??0)===0&&(e?.summary.postMergeGreenPct7d??null)===null&&(e?.summary.cycleTimeP50Ms7d??null)===null&&(_(r,b,7)??0)===0&&c===null}var E=(e,t)=>e!==null&&Date.parse(e)>t;function D({lastLookedAt:e,fleet:t,leader:n,activity:r}){if(!e)return[];let i=Date.parse(e);if(!Number.isFinite(i))return[];let a=[],o=(t?.runs??[]).filter(e=>E(e.endedAt,i)),s=e=>o.filter(t=>t.outcome===e).length,c=s(`merged`),l=s(`reverted`),u=s(`failed`)+s(`refused`);c&&a.push({id:`merged`,text:`${c} merged`,tone:`success`}),l&&a.push({id:`reverted`,text:`${l} reverted`,tone:`danger`}),u&&a.push({id:`failed`,text:`${u} refused or failed`,tone:`warning`});let d=(n?.timeline??[]).filter(e=>Date.parse(e.at)>i&&e.status===`ok`).length;d&&a.push({id:`memos`,text:`${d} new memo${d===1?``:`s`}`,tone:`info`});let f=(r?.needsYou??[]).filter(e=>Date.parse(e.since)>i).length;return f&&a.push({id:`needs`,text:`${f} new for you`,tone:`warning`}),a}var O={high:0,warn:1,info:2};function k(e){return[...e].sort((e,t)=>O[e.severity]-O[t.severity]||Date.parse(t.since)-Date.parse(e.since))}function A(e,t){let n=new Map,r=(e,t)=>{typeof e==`string`&&typeof t==`string`&&t.trim().length>0&&n.set(e,t.trim())};for(let e of t?.seatInfo??[])r(e.seatId,e.label);for(let t of e??[])r(t.id,t.label);return n}function j(e){return e?Object.entries(e.sources).filter(([,e])=>e!==`ok`).map(([e])=>e):[]}function M(e,t){return`${e}#${t}`}var N=20;function P(e,t){let n=e.length;return n>=2&&e[n-1].used===t&&e[n-2].used===t}function F(e,t){if(!t)return{...e};let n=Date.parse(t.sampledAt);if(!Number.isFinite(n))return{...e};let r={...e};for(let e of t.headroom){let t=[[`session`,e.sessionUsedPercent],[`weekly`,e.weeklyUsedPercent]];for(let[i,a]of t){if(a===null||!Number.isFinite(a))continue;let t=M(e.seatId,i),o=r[t]??[];if(o.length&&o[o.length-1].t>=n)continue;let s=o.length&&a+N<o[o.length-1].used?[]:o;r[t]=[...P(s,a)?s.slice(0,-1):s,{t:n,used:a}].slice(-240)}}return r}function I(e,t){let n=typeof t?.generatedAt==`string`?Date.parse(t.generatedAt):NaN,r=new Map;for(let e of Array.isArray(t?.series)?t.series:[]){if(!e||typeof e.seatId!=`string`||e.window!==`session`&&e.window!==`weekly`||!Array.isArray(e.points))continue;let t=[];for(let n of e.points){if(!Array.isArray(n))continue;let[e,r]=n;typeof e==`number`&&Number.isFinite(e)&&typeof r==`number`&&Number.isFinite(r)&&r>=0&&r<=100&&t.push({t:e,used:r})}if(t.length===0)continue;let n=M(e.seatId,e.window);r.set(n,[...r.get(n)??[],...t])}let i={},a=new Set;for(let t of new Set([...Object.keys(e),...r.keys()])){let o=r.get(t)??[],s=e[t]??[];if(o.length>0){a.add(t);let e=Math.max(...o.map(e=>e.t)),r=Number.isFinite(n)?Math.max(n,e):e;s=s.filter(e=>e.t>r)}let c=new Map;for(let e of o)c.set(e.t,e);for(let e of s)c.set(e.t,e);let l=[...c.values()].sort((e,t)=>e.t-t.t),u=0;for(let e=1;e<l.length;e++)l[e].used+N<l[e-1].used&&(u=e);let d=[];for(let e of l.slice(u))P(d,e.used)&&d.pop(),d.push(e);i[t]=d.slice(-2e3)}return{readings:i,recorded:a}}var L={session:5*g,weekly:7*h};function ne(e,t){if(!t||e.bindingWindow===null)return null;let n=100-t.reservePercent,r=t.maxSessionWindowPercent??100,i,a;e.bindingWindow===`weekly`||e.weeklyUsedPercent===null&&n<r?(i=n,a=`Reserved for you`):(i=r,a=`5-hour ceiling`);let o=100-i;return o>0?{value:o,label:a}:null}function re(e){let t=e===`session`?{weekday:`short`,hour:`numeric`,minute:`2-digit`}:{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`};return e=>{let n=new Date(e);return Number.isNaN(n.getTime())?``:n.toLocaleString(`en-US`,t)}}function R(e,t,n,r){if(!e?.capacity||n===null||t===`local`)return null;for(let i of e.capacity.windows){let e=typeof i.resetDescription==`string`?i.resetDescription.trim():``;if(e.length!==0&&f(t,{id:i.id,usedPercent:i.usedPercent,resetsAt:i.resetsAt,resetDescription:i.resetDescription,limitReached:i.limitReached},r)===n)return e}return null}function z(e){return`resets ${e.replace(/^resets\s+/i,``)}`}var B=[`jan`,`feb`,`mar`,`apr`,`may`,`jun`,`jul`,`aug`,`sep`,`oct`,`nov`,`dec`],V=/^(?:resets\s+)?(?:([A-Za-z]{3}) ([1-9]|[12]\d|3[01]) at )?([1-9]|1[0-2])(?::([0-5]\d))?(am|pm) \(([A-Za-z0-9_+-]+(?:\/[A-Za-z0-9_+-]+){0,2})\)$/i;function H(e,t){let n=t.formatToParts(new Date(e)),r=e=>Number(n.find(t=>t.type===e)?.value),i={y:r(`year`),mo:r(`month`)-1,d:r(`day`),h:r(`hour`)%24,mi:r(`minute`)};return Object.values(i).every(Number.isFinite)?i:null}var U=e=>Date.UTC(e.y,e.mo,e.d,e.h,e.mi);function W(e,t){let n=U(e),r=n;for(let e=0;e<3;e++){let e=H(r,t);if(!e)return null;let i=n-U(e);if(i===0)return r;r+=i}return null}function G(e,t){let n=V.exec(e.trim());if(!n||!Number.isFinite(t))return null;let[,r,i,a,o,s,c]=n,l;try{l=new Intl.DateTimeFormat(`en-US`,{timeZone:c,hourCycle:`h23`,year:`numeric`,month:`numeric`,day:`numeric`,hour:`numeric`,minute:`numeric`})}catch{return null}let u=H(t,l);if(!u)return null;let d=Number(a)%12+(s.toLowerCase()===`pm`?12:0),f=o===void 0?0:Number(o),p=[];if(r!==void 0){let e=B.indexOf(r.toLowerCase()),t=Number(i);if(e<0)return null;for(let n of[u.y-1,u.y,u.y+1])new Date(Date.UTC(n,e,t)).getUTCDate()===t&&p.push({y:n,mo:e,d:t,h:d,mi:f})}else for(let e of[-1,0,1]){let t=new Date(Date.UTC(u.y,u.mo,u.d+e));p.push({y:t.getUTCFullYear(),mo:t.getUTCMonth(),d:t.getUTCDate(),h:d,mi:f})}let m=null;for(let e of p){let n=W(e,l);n!==null&&(m===null||Math.abs(n-t)<Math.abs(m-t))&&(m=n)}return m}var K=9e5,q=Date.UTC(2e3,0,1);function J(e,t,n,r){let i=e?Date.parse(e):NaN;if(Number.isFinite(i)&&i>=q)return{at:i,from:`provider`};if(t===null||n===null)return null;let a=G(t,r);return a===null||a<r-K||a>r+n+K?null:{at:a,from:`words`}}function Y(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`&&e.trim().length>0).map(m):[]}var ie=6e4,ae=new Set([`reserve`,`session-ceiling`]);function X(e){return typeof e==`string`?e.trim().replace(/^resets\s+/i,``):``}function Z(e){for(let t of e){if(!ae.has(t.kind))continue;let e=X(t.resetDescription);if(e)return e}return null}function oe(e,t,n){let i=typeof e.resetsAt==`string`?Date.parse(e.resetsAt):NaN;if(Number.isFinite(i))return t.resetAt!==null&&Math.abs(i-t.resetAt)<=ie?null:r(e.resetsAt,n);let a=X(e.resetDescription);return!a||t.resetText!==null&&X(t.resetText).toLowerCase()===a.toLowerCase()?null:a}function se(e,t,n){if(!e)return null;let r=i(p(e.text,n));if(!r)return null;let a=oe(e,t,n);return a?`${r} Resets ${a}.`:r}function ce(e,t,n,r){if(!e)return[];let i=new Map(e.seatInfo.map(e=>[e.seatId,e])),a=new Map((n??[]).map(e=>[e.id,e])),o=Date.parse(e.sampledAt),s=Number.isFinite(o)?o:Date.now();return e.headroom.map(n=>{let o=i.get(n.seatId),c=o?.engine??`local`,l=n.bindingWindow?L[n.bindingWindow]:null,u=Y(n.reasons),d=R(a.get(n.seatId),c,n.bindingWindow,s)??(n.bindingWindow===null||c===`local`?null:Z(u)),f=l===null?null:J(n.resetAt,d,l,s),p=f&&l!==null?f.at-l:null,m=n.bindingWindow?M(n.seatId,n.bindingWindow):null,h=m?t[m]??[]:[];return{seatId:n.seatId,label:o?.label??n.seatId,engine:c,window:n.bindingWindow,points:h.filter(e=>p===null||e.t>=p).map(e=>({t:e.t,remaining:Math.max(0,100-e.used)})),start:p,resetAt:f?.at??null,resetFrom:f?.from??null,resetText:d,reservePercent:e.effective[n.seatId]?.reservePercent??0,line:ne(n,e.effective[n.seatId]),enabled:e.effective[n.seatId]?.enabled??!1,free:o?.free??!1,eligible:n.eligibleForAutonomy,reason:se(u[0],{resetAt:f?.at??null,resetText:d},s),recorded:m!==null&&(r?.has(m)??!1)}}).sort((e,t)=>Number(e.free)-Number(t.free)||e.label.localeCompare(t.label))}function le(e){if(!e)return null;let t=e.seatInfo.find(e=>e.engine===`claude`);if(!t)return null;let n=e.effective[t.seatId];return n?{label:`Claude`,percent:n.reservePercent}:null}var Q=n(t(),1),$=e();function ue({budget:e,onSave:t,onCancel:n,busy:r,disabled:i=!1,idPrefix:f}){let[p,m]=(0,Q.useState)(()=>s(e)),[h,g]=(0,Q.useState)({}),[_,v]=(0,Q.useState)(null),y=(0,Q.useRef)(!1);(0,Q.useEffect)(()=>{y.current||m(s(e))},[e]);let b=e=>{y.current=!0,v(null),m(t=>({...t,...e}))};return(0,$.jsxs)(`form`,{className:u.form,onSubmit:n=>{n.preventDefault();let r=c(p,e);if(!r.ok){g(r.errors);return}if(g({}),!r.changed){v(`Nothing changed.`);return}y.current=!1,t(r.update)},noValidate:!0,"aria-label":`Cloud budget`,children:[(0,$.jsx)(`div`,{className:u.fieldGrid,children:l.map(e=>(0,$.jsx)(d,{id:`${f}-${e.field}`,label:e.label,hint:e.hint,error:h[e.field],size:`sm`,inputMode:e.integer?`numeric`:`decimal`,prefix:e.money?`$`:void 0,value:p[e.field],disabled:i||r,onChange:t=>b({[e.field]:t.target.value})},e.field))}),(0,$.jsx)(o,{checked:p.selfImprove,onChange:e=>b({selfImprove:e}),label:`Verse may launch self-improvement tasks on its own`,disabled:i||r}),_?(0,$.jsx)(`p`,{className:u.muted,role:`status`,children:_}):null,(0,$.jsxs)(`div`,{className:u.formActions,children:[n?(0,$.jsx)(a,{variant:`ghost`,size:`sm`,onClick:n,disabled:r,children:`Cancel`}):null,(0,$.jsx)(a,{type:`submit`,variant:`primary`,size:`sm`,busy:r,disabled:i,children:`Save budget`})]})]})}export{le as a,k as c,ce as d,A as f,re as i,F as l,D as m,L as n,T as o,j as p,w as r,I as s,ue as t,z as u};
2
- //# sourceMappingURL=CloudBudgetForm-D8RbdAC7.js.map