@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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChartFrame-sZTnZkVd.js","names":[],"sources":["../../../../../../src/web-ui/components/charts/chart-tokens.css","../../../../../../src/web-ui/components/charts/plot.module.css","../../../../../../src/web-ui/components/charts/ChartParts.tsx","../../../../../../src/web-ui/components/charts/chart-math.ts","../../../../../../src/web-ui/components/charts/motion.ts","../../../../../../src/web-ui/components/charts/useChartWidth.ts","../../../../../../src/web-ui/components/charts/useTextScale.ts","../../../../../../src/web-ui/components/charts/TableView.module.css","../../../../../../src/web-ui/components/charts/TableView.tsx","../../../../../../src/web-ui/components/charts/ChartFrame.module.css","../../../../../../src/web-ui/components/charts/ChartFrame.tsx"],"sourcesContent":["/**\n * components/charts/chart-tokens.css — chart-only aliases over the design\n * tokens (owner: unit C0, with colors.ts; the chart components are C7's).\n * Every value below is `var(--existing-token)`, never a hex: the raw values\n * and their light/dark variants live in design/tokens.css, so theming is\n * inherited and can never drift out of sync with the rest of the app.\n *\n * V3.10 COLOUR ROLES (SPEC-310C §6), one meaning per hue:\n *\n * QUANTITY — `--chart-seq-1..7`, the fixed azure ramp at 214°\n * (tokens.css --data-seq-*). Every magnitude — heat cells, a single\n * nominal series, gauge fills, the positive diverging pole — is azure.\n * It is NEVER the accent: the accent is interaction-only and the\n * operator can drag it to any hue, which used to re-colour every chart\n * (tokens-310.test.ts fails if a data token here points at --accent-*).\n *\n * CATEGORICAL — `--chart-series-1..6` (tokens.css --data-cat-*). Six\n * identity inks chosen to avoid every engine, status and quantity hue,\n * with the validator scores recorded in tokens.css. Order is identity,\n * never rank: a series keeps its slot even when others are filtered out.\n * A seventh series goes to `--chart-neutral` (\"Other\") — colors.ts never\n * cycles, because a repeated colour would say two series are one.\n *\n * UNKNOWN — gray, drawn as a 45° HATCH with an outline, never a solid\n * fill on a data ramp (a solid gray would read as \"zero\" or \"neutral\").\n * `--chart-unknown-hatch` for CSS fills; colors.ts UNKNOWN_HATCH for SVG.\n *\n * QUEUED / PARKED — a neutral OUTLINE with no fill (Fleet Gantt, Swimlane).\n *\n * ENGINES — identity only, and only in charts that show nothing else\n * (runs by engine, usage bars); passed explicitly via colors.ts\n * engineColor(), never picked by index.\n *\n * STATUS — unchanged; always travels with a text label.\n *\n * Mandatory secondary encoding (direct or legend labels, and the TableView\n * twin every chart has) stays in place whatever the palette scores — colour\n * is never the only carrier of meaning.\n */\n:root {\n /* Categorical identity (fixed order; see tokens.css for the derivation). */\n --chart-series-1: var(--data-cat-1); /* steel */\n --chart-series-2: var(--data-cat-2); /* olive */\n --chart-series-3: var(--data-cat-3); /* wine */\n --chart-series-4: var(--data-cat-4); /* purple */\n --chart-series-5: var(--data-cat-5); /* green */\n --chart-series-6: var(--data-cat-6); /* pink */\n\n /* Overflow \"Other\" bucket — never part of the identity rotation above. */\n --chart-neutral: var(--status-neutral-solid);\n\n /* Quantity: the fixed azure ramp, low → high. */\n --chart-seq-1: var(--data-seq-1);\n --chart-seq-2: var(--data-seq-2);\n --chart-seq-3: var(--data-seq-3);\n --chart-seq-4: var(--data-seq-4);\n --chart-seq-5: var(--data-seq-5);\n --chart-seq-6: var(--data-seq-6);\n --chart-seq-7: var(--data-seq-7);\n\n /* The single hue for magnitude and for one nominal series (one series\n needs no legend box — it takes this colour and a direct label). */\n --chart-sequential: var(--chart-seq-5);\n --chart-sequential-soft: var(--chart-seq-3);\n\n /* Diverging pair around a neutral midpoint: azure reads \"up / better\",\n danger reads \"down / worse\" (ForestPlot effect sizes, deltas). */\n --chart-diverging-pos: var(--chart-seq-5);\n --chart-diverging-neg: var(--status-danger-solid);\n --chart-diverging-mid: var(--border-strong);\n\n /* Unknown: gray, hatched at 45°, outlined. */\n --chart-unknown: var(--status-unknown-solid);\n --chart-unknown-hatch: repeating-linear-gradient(135deg, var(--chart-unknown) 0 1px, transparent 1px 5px);\n\n /* Queued / parked: an outline, no fill. */\n --chart-queued-outline: var(--status-neutral-solid);\n\n /* Chart chrome — hairline grid/axis, one step off the surface. */\n --chart-grid: var(--border-subtle);\n --chart-axis: var(--border-strong);\n --chart-surface: var(--bg-surface);\n --chart-tooltip-bg: var(--bg-surface-raised);\n --chart-tooltip-border: var(--border-default);\n\n /* Heat (CalendarHeatmap, MatrixHeatmap): four steps of the quantity ramp.\n Step 0 is a TRUE ZERO; \"no data\" is the unknown hatch or an outlined\n empty cell, never a colour on this ramp. */\n --chart-heat-0: var(--chart-grid);\n --chart-heat-1: var(--chart-seq-2);\n --chart-heat-2: var(--chart-seq-3);\n --chart-heat-3: var(--chart-seq-5);\n --chart-heat-4: var(--chart-seq-7);\n\n /* Gauge/meter track: the lightest step of the fill's own ramp. */\n --chart-track: var(--chart-seq-1);\n\n /* Ink for a number printed on a NEAR-surface quantity cell (colors.ts\n quantityInk, steps 1–4). The END of the gray ramp, not --text-primary:\n the two are the same #09090b in light, but in dark --text-primary is\n #f4f4f5, which measured 4.49:1 on --chart-seq-4 (rgb 31 110 214) — just\n under AA for 12 px digits. --gray-950 flips to #fafafa there: 4.72:1.\n Asserted per step and theme in charts/chart-contrast.test.ts. */\n --chart-quantity-ink: var(--gray-950);\n}\n","/* Shared plot chrome for the V3.10 charts: recessive hairline grid/axes,\n text in text tokens (never the series colour), one tooltip style. */\n.plotWrap {\n position: relative;\n width: 100%;\n min-width: 0;\n}\n\n.svg {\n display: block;\n overflow: visible;\n max-width: 100%;\n /* Every number drawn in a plot — ticks, direct labels, funnel counts —\n aligns digit for digit (inherited by each <text>). */\n font-variant-numeric: tabular-nums;\n}\n\n.grid {\n stroke: var(--chart-grid);\n stroke-width: 1;\n shape-rendering: crispEdges;\n}\n\n.axis {\n stroke: var(--chart-axis);\n stroke-width: 1;\n shape-rendering: crispEdges;\n}\n\n.tick {\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n fill: var(--text-tertiary);\n font-variant-numeric: tabular-nums;\n}\n\n.label {\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n fill: var(--text-secondary);\n}\n\n.labelStrong {\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n font-weight: var(--font-weight-medium);\n fill: var(--text-primary);\n}\n\n.line {\n fill: none;\n stroke-width: 2;\n stroke-linecap: round;\n stroke-linejoin: round;\n}\n\n.wash {\n stroke: none;\n opacity: 0.1;\n}\n\n.reference {\n fill: none;\n stroke: var(--text-tertiary);\n stroke-width: 1;\n stroke-dasharray: 4 3;\n}\n\n.projection {\n fill: none;\n stroke-width: 2;\n stroke-dasharray: 5 4;\n stroke-linecap: round;\n}\n\n.marker {\n stroke: var(--chart-surface);\n stroke-width: 2;\n}\n\n.crosshair {\n stroke: var(--chart-axis);\n stroke-width: 1;\n shape-rendering: crispEdges;\n pointer-events: none;\n}\n\n/* The gradient wash under a line (fill is url(#AreaGradient)). */\n.area {\n stroke: none;\n}\n\n/* The hovered / focused column's slot, behind its bars (BarStack). */\n.hoverBand {\n fill: var(--bg-hover);\n pointer-events: none;\n}\n\n/* BurnDown: the reserve kept for interactive use, as a band from empty up\n to the reserve line — the region autonomy must stay out of, not just a\n line to squint at. The line and its label still carry the meaning. */\n.reserveBand {\n fill: var(--status-warning-bg);\n pointer-events: none;\n}\n\n/* \"Now\" on a time window: a quiet dashed rule with its label. */\n.now {\n stroke: var(--text-tertiary);\n stroke-width: 1;\n stroke-dasharray: 2 3;\n shape-rendering: crispEdges;\n pointer-events: none;\n}\n\n/* The last reading's dot: a ring of surface around the series ink. */\n.endDot {\n stroke: var(--chart-surface);\n stroke-width: 2;\n}\n\n.hit {\n fill: transparent;\n cursor: default;\n}\n\n.hit:focus {\n outline: none;\n}\n\n.hit:focus-visible {\n stroke: var(--border-focus);\n stroke-width: 2;\n}\n\n.focusable:focus {\n outline: none;\n}\n\n.focusable:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 2px;\n border-radius: var(--radius-sm);\n}\n\n.track {\n fill: var(--chart-track);\n}\n\n/* V3.10.1 — the empty part of a bar that is a share of something (Funnel):\n NEUTRAL, because the azure --chart-track reads as \"a little\" — at zero a\n whole row of it read as 100%. It is the app's empty-meter token, not the\n heat-0 hairline gray it first borrowed: that measured 1.18:1 / 1.14:1 on\n the card, so a zero stage was blank space and a bar's length had nothing\n to be read against. --meter-track is 1.83:1 light / 2.06:1 dark (the\n floor tokens.css holds an empty meter to) while the azure fill stays\n 2.66:1 / 2.50:1 against it — a 3:1 track would cut that data edge to\n ~1.6:1, and each stage's count and rate are printed beside its bar.\n Asserted in charts/chart-contrast.test.ts. */\n.trackEmpty {\n fill: var(--meter-track);\n}\n\n.noData {\n fill: none;\n stroke: var(--chart-grid);\n stroke-width: 1;\n stroke-dasharray: 2 2;\n}\n\n.tooltip {\n position: absolute;\n z-index: var(--z-dropdown);\n pointer-events: none;\n transform: translate(-50%, calc(-100% - 8px));\n min-width: 140px;\n padding: var(--space-2) var(--space-3);\n border: 1px solid var(--chart-tooltip-border);\n border-radius: var(--radius-md);\n background: var(--chart-tooltip-bg);\n box-shadow: var(--shadow-menu);\n color: var(--text-primary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-variant-numeric: tabular-nums;\n white-space: nowrap;\n /* Opacity only: `transform` is the positioning. The duration token\n collapses to 1 ms under reduced motion. */\n animation: chart-tooltip-in var(--duration-fast) var(--ease-decelerate);\n}\n\n/* Beside the crosshair, inside the plot (ChartParts tooltipSide). */\n.tooltipRight {\n transform: translate(12px, 0);\n}\n\n.tooltipLeft {\n transform: translate(calc(-100% - 12px), 0);\n}\n\n@keyframes chart-tooltip-in {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n.tooltipTitle {\n color: var(--text-tertiary);\n font-weight: var(--font-weight-medium);\n margin-bottom: var(--space-1);\n}\n\n.tooltipRow {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n min-height: calc(var(--text-xs-line) + 2px);\n}\n\n.tooltipLabel {\n color: var(--text-secondary);\n}\n\n/* A summary row (Total): a hairline above, the label at full ink. */\n.tooltipTotal {\n margin-top: var(--space-1);\n padding-top: var(--space-1);\n border-top: 1px solid var(--border-subtle);\n}\n\n.tooltipTotal .tooltipLabel {\n color: var(--text-primary);\n font-weight: var(--font-weight-medium);\n}\n\n.tooltipKey {\n width: 8px;\n height: 8px;\n border-radius: 2px;\n flex: none;\n}\n\n/* A line series' key: the stroke it is drawn with, not a filled square. */\n.tooltipKeyLine {\n width: 10px;\n height: 2px;\n border-radius: 1px;\n flex: none;\n}\n\n.tooltipValue {\n margin-left: auto;\n padding-left: var(--space-3);\n font-weight: var(--font-weight-semibold);\n font-variant-numeric: tabular-nums;\n}\n\n.tooltipMuted {\n color: var(--text-tertiary);\n font-style: italic;\n}\n\n.legend {\n display: flex;\n flex-wrap: wrap;\n gap: var(--space-1) var(--space-3);\n margin: var(--space-2) 0 0;\n padding: 0;\n list-style: none;\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n\n.legendItem {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n}\n\n.swatch {\n width: 10px;\n height: 10px;\n border-radius: 2px;\n flex: none;\n}\n\n.swatchLine {\n width: 12px;\n height: 2px;\n flex: none;\n}\n\n.swatchEmpty {\n width: 10px;\n height: 10px;\n border-radius: 2px;\n flex: none;\n border: 1px dashed var(--chart-axis);\n}\n\n.note {\n margin: var(--space-2) 0 0;\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n\n.srOnly {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* ---------------------------------------------------------------------------\n Entrance (verse-visual-quality) — once, on mount, never on hover or refetch.\n Keyed off the plot wrapper's data-motion=\"enter\", which motion.ts only\n writes when neither Settings (data-motion=\"reduce\" on <html>) nor the OS\n asks for reduced motion. Durations are the motion tokens, so they also\n collapse to ~1 ms under reduced motion (the entrance is three times the\n slow token: long enough to read as a line being drawn); the media block\n below is the same\n two-trigger guard as the skeleton shimmer in design/global.css.\n ------------------------------------------------------------------------- */\n\n/* A solid line draws itself left to right (the path carries pathLength=1). */\n[data-motion='enter'] .draw {\n animation: chart-draw calc(var(--duration-slow) * 3) var(--ease-decelerate) both;\n}\n\n/* A wash, a band or a label fades up just behind the line. */\n[data-motion='enter'] .fadeIn {\n animation: chart-fade calc(var(--duration-slow) * 3) var(--ease-standard) both;\n animation-delay: var(--duration-fast);\n}\n\n/* Columns rise from the baseline, staggered by --chart-i (their index). */\n[data-motion='enter'] .rise {\n transform-box: fill-box;\n transform-origin: 50% 100%;\n animation: chart-rise calc(var(--duration-slow) * 3) var(--ease-decelerate) both;\n animation-delay: calc(var(--chart-i, 0) * var(--duration-instant) / 5);\n}\n\n/* Horizontal bars (Funnel stages) grow from their start edge. */\n[data-motion='enter'] .grow {\n transform-box: fill-box;\n transform-origin: 0 50%;\n animation: chart-grow calc(var(--duration-slow) * 3) var(--ease-decelerate) both;\n animation-delay: calc(var(--chart-i, 0) * var(--duration-instant) / 2);\n}\n\n@keyframes chart-draw {\n /* 1.02, not 1: at exactly 1 a round cap still paints a dot at the start. */\n from {\n stroke-dasharray: 1 1;\n stroke-dashoffset: 1.02;\n }\n to {\n stroke-dasharray: 1 1;\n stroke-dashoffset: 0;\n }\n}\n\n@keyframes chart-fade {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n@keyframes chart-rise {\n from {\n transform: scaleY(0);\n }\n to {\n transform: scaleY(1);\n }\n}\n\n@keyframes chart-grow {\n from {\n transform: scaleX(0);\n }\n to {\n transform: scaleX(1);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :global(:root:not([data-motion='full'])) .draw,\n :global(:root:not([data-motion='full'])) .fadeIn,\n :global(:root:not([data-motion='full'])) .rise,\n :global(:root:not([data-motion='full'])) .grow,\n :global(:root:not([data-motion='full'])) .tooltip,\n :global(:root:not([data-motion='full'])) .skeleton {\n animation: none;\n }\n}\n\n:global(:root[data-motion='reduce']) .draw,\n:global(:root[data-motion='reduce']) .fadeIn,\n:global(:root[data-motion='reduce']) .rise,\n:global(:root[data-motion='reduce']) .grow,\n:global(:root[data-motion='reduce']) .tooltip,\n:global(:root[data-motion='reduce']) .skeleton {\n animation: none;\n}\n\n/* ---------------------------------------------------------------------------\n Loading skeleton (ChartParts ChartSkeleton) — the final chart's outline in\n the neutral hover tint, breathing slowly; static under reduced motion.\n ------------------------------------------------------------------------- */\n.skeleton {\n display: block;\n animation: chart-skeleton-pulse 1.6s var(--ease-standard) infinite;\n}\n\n.skeletonMark {\n fill: var(--bg-active);\n}\n\n.skeletonTrack {\n fill: var(--bg-hover);\n}\n\n.skeletonGrid {\n stroke: var(--chart-grid);\n stroke-width: 1;\n vector-effect: non-scaling-stroke;\n shape-rendering: crispEdges;\n}\n\n@keyframes chart-skeleton-pulse {\n 0%,\n 100% {\n opacity: 1;\n }\n 50% {\n opacity: 0.55;\n }\n}\n\n/* V3.10 — engine monogram beside a lane label (EngineTick). */\n.monogram {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n fill: var(--text-secondary);\n /* 3.11.1: the tick draws a provider mark (nested svg, currentColor). */\n color: var(--text-secondary);\n}\n\n/* V3.10 — an unknown mark: hatch fill (set inline via url(#id)) + outline. */\n.unknownMark {\n stroke: var(--chart-unknown);\n stroke-width: 1;\n}\n\n/* A swatch in a legend that stands for \"unknown / not measured\". */\n.swatchHatch {\n width: 10px;\n height: 10px;\n border-radius: 2px;\n flex: none;\n border: 1px solid var(--chart-unknown);\n background: var(--chart-unknown-hatch);\n}\n\n/* Text laid over the plot (reference labels): a surface-coloured halo keeps it\n legible where it crosses a line, in both themes. */\n.halo {\n paint-order: stroke;\n stroke: var(--chart-surface);\n stroke-width: 3px;\n stroke-linejoin: round;\n}\n","/**\n * components/charts/ChartParts.tsx — small shared pieces of the V3.10 charts:\n * the legend list, the tooltip, the unknown hatch, the engine tick, the area\n * gradient and the shaped loading skeleton.\n * Identity is never colour alone: every swatch sits beside its text label,\n * and text always wears text tokens.\n */\nimport type { ReactNode } from 'react';\nimport { UNKNOWN_HATCH, engineColor, type ChartEngine } from './colors.js';\nimport plot from './plot.module.css';\nimport { ProviderLogo } from '../primitives/ProviderLogo.js';\n\nexport interface ChartLegendItem {\n label: string;\n color?: string;\n /** `hatch` = the unknown texture (not measured), never a colour. */\n kind?: 'swatch' | 'line' | 'empty' | 'hatch';\n}\n\n/** Renders nothing for fewer than `min` items (a lone series is named by the title). */\nexport function ChartLegend({ items, min = 2 }: { items: ChartLegendItem[]; min?: number }): ReactNode {\n if (items.length < min) return null;\n return (\n <ul className={plot.legend}>\n {items.map((item) => (\n <li key={item.label} className={plot.legendItem}>\n <span\n aria-hidden=\"true\"\n className={\n item.kind === 'line' ? plot.swatchLine : item.kind === 'empty' ? plot.swatchEmpty : item.kind === 'hatch' ? plot.swatchHatch : plot.swatch\n }\n style={item.kind === 'empty' || item.kind === 'hatch' ? undefined : { background: item.color }}\n />\n {item.label}\n </li>\n ))}\n </ul>\n );\n}\n\nexport interface TooltipRow {\n key: string;\n label: string;\n value: string | null;\n color?: string;\n /** The key's shape: a short stroke for a line series, a square for a filled mark (default). */\n kind?: 'line' | 'swatch';\n /** A summary row (Total): set apart by a hairline above it. */\n total?: boolean;\n}\n\n/**\n * Positioned in the plot's own pixel space (the plot wrapper is\n * position:relative). `left` is clamped by the caller so it never overflows.\n * The title is the exact moment or category (local time on a time axis —\n * format.ts tooltipTimeFormatter); values are the exact figures, never the\n * axis's rounded tick. Presentation only: the same text reaches a screen\n * reader through each chart's live region, and the Table twin.\n */\nexport function ChartTooltip({\n left,\n top,\n title,\n rows,\n side,\n}: {\n left: number;\n top: number;\n title: string;\n rows: TooltipRow[];\n /**\n * Beside the crosshair instead of centred above the mark: `right` / `left`\n * of `left`, top-aligned at `top` INSIDE the plot (tooltipSide picks one).\n * A time series uses this so the tooltip never covers the card's title or\n * the point being read, and is never clipped by a scrolling container.\n */\n side?: 'left' | 'right';\n}) {\n const cls = side === 'right' ? `${plot.tooltip} ${plot.tooltipRight}` : side === 'left' ? `${plot.tooltip} ${plot.tooltipLeft}` : plot.tooltip;\n return (\n <div className={cls} style={{ left, top }} role=\"presentation\" data-chart-tooltip={side ?? 'above'}>\n <div className={plot.tooltipTitle}>{title}</div>\n {rows.map((row) => (\n <div key={row.key} className={row.total ? `${plot.tooltipRow} ${plot.tooltipTotal}` : plot.tooltipRow}>\n {row.color ? (\n <span\n className={row.kind === 'line' ? plot.tooltipKeyLine : plot.tooltipKey}\n style={{ background: row.color }}\n aria-hidden=\"true\"\n />\n ) : null}\n <span className={plot.tooltipLabel}>{row.label}</span>\n {row.value === null ? (\n <span className={`${plot.tooltipValue} ${plot.tooltipMuted}`}>no data</span>\n ) : (\n <span className={plot.tooltipValue}>{row.value}</span>\n )}\n </div>\n ))}\n </div>\n );\n}\n\n/** Estimated width of a tooltip, for choosing its side (it grows with its rows' text). */\nconst TOOLTIP_EST_W = 172;\nconst TOOLTIP_GAP = 12;\n\n/**\n * Which side of the crosshair at `x` a tooltip fits on in a `width`-wide plot:\n * right while it fits, else left, else undefined (centred above, clamped).\n */\nexport function tooltipSide(x: number, width: number, estimate = TOOLTIP_EST_W): 'left' | 'right' | undefined {\n if (x + TOOLTIP_GAP + estimate <= width) return 'right';\n if (x - TOOLTIP_GAP - estimate >= 0) return 'left';\n return undefined;\n}\n\n/** Keep a centred tooltip inside [margin, width - margin]. */\nexport function clampTooltipLeft(x: number, width: number, margin = 70): number {\n return Math.min(Math.max(x, Math.min(margin, width / 2)), Math.max(width - margin, width / 2));\n}\n\n// ---------------------------------------------------------------------------\n// Unknown hatch (V3.10) — one <pattern> per chart instance\n// ---------------------------------------------------------------------------\n\n/**\n * The 45° unknown hatch as an SVG <pattern>. Render it inside the chart's own\n * <svg><defs> with an id from `hatchPatternId(useId())` (colors.ts) — ids are\n * document-global, so a shared literal id would let one chart's unmount blank\n * another's hatch — then fill unknown marks with `url(#id)` and outline them\n * with CHART_UNKNOWN. Texture, not hue, is what separates \"not measured\" from\n * a low value, so it survives colour-blindness and greyscale print.\n */\nexport function HatchPattern({ id }: { id: string }) {\n const { size, angle, strokeWidth, stroke } = UNKNOWN_HATCH;\n return (\n <pattern id={id} width={size} height={size} patternUnits=\"userSpaceOnUse\" patternTransform={`rotate(${angle})`}>\n <line x1={0} y1={0} x2={0} y2={size} stroke={stroke} strokeWidth={strokeWidth} />\n </pattern>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Engine identity (V3.10) — a 2px tick plus a one-letter monogram\n// ---------------------------------------------------------------------------\n\nconst ENGINE_LETTER: Readonly<Record<ChartEngine, string>> = { claude: 'C', codex: 'X', grok: 'G', local: 'L', devin: 'D' };\n\n/** The monogram letter for an engine (mirrors workbench-types ENGINE_MONOGRAM; charts stay core-free). */\nexport function engineLetter(engine: ChartEngine): string {\n return ENGINE_LETTER[engine];\n}\n\n/**\n * SVG engine mark for a lane label: the 2px identity tick and the provider's\n * mark (3.11.1, ProviderLogo). The engine's NAME still travels in the lane's\n * spoken summary and the table — the mark is a glance aid only.\n */\nexport function EngineTick({ engine, x, y, height }: { engine: ChartEngine; x: number; y: number; height: number }) {\n return (\n <g data-engine={engine} aria-hidden=\"true\">\n <rect x={x} y={y} width={2} height={height} rx={1} fill={engineColor(engine)} />\n <ProviderLogo engine={engine} x={x + 5} y={y + height / 2 - 6} size={12} className={plot.monogram} />\n </g>\n );\n}\n\n/** A quiet ⋯ glyph (three dots), currentColor, 16px. */\nexport function MoreGlyph() {\n return (\n <svg width={16} height={16} viewBox=\"0 0 16 16\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx={3.5} cy={8} r={1.4} fill=\"currentColor\" />\n <circle cx={8} cy={8} r={1.4} fill=\"currentColor\" />\n <circle cx={12.5} cy={8} r={1.4} fill=\"currentColor\" />\n </svg>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Area gradient (verse-visual-quality)\n// ---------------------------------------------------------------------------\n\n/**\n * The wash under a line: the series' own ink fading from `from` opacity at\n * the top of the plot to nothing at the baseline. Replaces the flat 10%\n * wash: the line stays the strongest mark (it IS the data) while the fill\n * still says \"area = volume\", and it reads the same in both themes because\n * the stop colour is the series token itself. Render once per series inside\n * the chart's own <defs>, with an id from `gradientId(useId(), key)` —\n * document-global ids, same reason as the hatch.\n *\n * `userSpaceOnUse`, pinned to the plot's top and baseline rather than each\n * path's bounding box: two series then fade on ONE scale, so a small series\n * is not painted as darkly as a large one.\n */\nexport function AreaGradient({ id, color, top, bottom, from = 0.22 }: { id: string; color: string; top: number; bottom: number; from?: number }) {\n return (\n <linearGradient id={id} gradientUnits=\"userSpaceOnUse\" x1={0} x2={0} y1={top} y2={bottom} data-area-gradient=\"\">\n <stop offset=\"0%\" style={{ stopColor: color, stopOpacity: from }} />\n <stop offset=\"65%\" style={{ stopColor: color, stopOpacity: from * 0.3 }} />\n <stop offset=\"100%\" style={{ stopColor: color, stopOpacity: 0 }} />\n </linearGradient>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Loading skeletons (verse-visual-quality)\n// ---------------------------------------------------------------------------\n\n/** The outline a loading chart holds, so the card does not jump when data lands. */\nexport type ChartSkeletonShape = 'line' | 'bars' | 'lanes' | 'funnel' | 'heat' | 'gauge';\n\n/* Deterministic placeholder \"data\" — never random, so a skeleton is the same\n on every render and in every test. */\nconst SKELETON_BARS = [0.42, 0.58, 0.35, 0.7, 0.52, 0.8, 0.46, 0.64, 0.55, 0.74, 0.5, 0.62];\nconst SKELETON_LINE = [0.55, 0.6, 0.48, 0.52, 0.4, 0.46, 0.36, 0.42, 0.3, 0.34, 0.28];\nconst SKELETON_W = 600;\n\nfunction skeletonBody(shape: ChartSkeletonShape, H: number): ReactNode {\n const W = SKELETON_W;\n const grid = [0.25, 0.5, 0.75].map((f) => (\n <line key={`g${f}`} className={plot.skeletonGrid} x1={0} x2={W} y1={H * f} y2={H * f} />\n ));\n switch (shape) {\n case 'bars': {\n const slot = W / SKELETON_BARS.length;\n return (\n <>\n {grid}\n {SKELETON_BARS.map((f, i) => (\n <rect key={i} className={plot.skeletonMark} x={i * slot + slot * 0.25} width={slot * 0.5} y={H - H * f * 0.9} height={H * f * 0.9} rx={3} />\n ))}\n </>\n );\n }\n case 'lanes': {\n const rows = Math.max(2, Math.min(6, Math.floor(H / 32)));\n const rowH = H / rows;\n return Array.from({ length: rows }, (_, i) => (\n <g key={i}>\n <rect className={plot.skeletonMark} x={0} y={i * rowH + rowH * 0.3} width={90} height={rowH * 0.4} rx={3} />\n <rect className={plot.skeletonMark} x={130 + ((i * 97) % 180)} y={i * rowH + rowH * 0.25} width={120 + ((i * 53) % 200)} height={rowH * 0.5} rx={3} />\n </g>\n ));\n }\n case 'funnel': {\n const rows = 5;\n const rowH = H / rows;\n return Array.from({ length: rows }, (_, i) => (\n <g key={i}>\n <rect className={plot.skeletonTrack} x={140} y={i * rowH + rowH * 0.2} width={W - 240} height={rowH * 0.6} rx={4} />\n <rect className={plot.skeletonMark} x={140} y={i * rowH + rowH * 0.2} width={(W - 240) * (1 - i * 0.18)} height={rowH * 0.6} rx={4} />\n </g>\n ));\n }\n case 'heat': {\n const cols = 20;\n const rows = 7;\n const cw = W / cols;\n const ch = H / rows;\n return Array.from({ length: cols * rows }, (_, i) => (\n <rect\n key={i}\n className={(i * 7) % 5 === 0 ? plot.skeletonMark : plot.skeletonTrack}\n x={(i % cols) * cw + 1.5}\n y={Math.floor(i / cols) * ch + 1.5}\n width={cw - 3}\n height={ch - 3}\n rx={2}\n />\n ));\n }\n case 'gauge':\n return <circle className={plot.skeletonMark} cx={W / 2} cy={H / 2} r={H / 2} />;\n case 'line':\n default: {\n const step = W / (SKELETON_LINE.length - 1);\n const top = SKELETON_LINE.map((f, i) => `${i === 0 ? 'M' : 'L'}${i * step},${H * f}`).join(' ');\n return (\n <>\n {grid}\n <path className={plot.skeletonMark} d={`${top} L${W},${H} L0,${H} Z`} />\n </>\n );\n }\n }\n}\n\n/**\n * A placeholder in the final chart's shape and height — gridlines where the\n * gridlines will be, columns where columns will be, lanes where lanes will\n * be — in the neutral hover tint, with a slow pulse that stops under reduced\n * motion. Presentation only (aria-hidden): ChartFrame announces \"Loading…\".\n */\nexport function ChartSkeleton({ shape = 'line', height = 200 }: { shape?: ChartSkeletonShape; height?: number }) {\n const H = Math.max(48, height);\n return (\n <svg\n className={plot.skeleton}\n data-chart-skeleton={shape}\n width=\"100%\"\n height={H}\n viewBox={`0 0 ${SKELETON_W} ${H}`}\n preserveAspectRatio={shape === 'gauge' ? 'xMidYMid meet' : 'none'}\n aria-hidden=\"true\"\n focusable=\"false\"\n >\n {skeletonBody(shape, H)}\n </svg>\n );\n}\n","/**\n * components/charts/chart-math.ts — the pure geometry and statistics behind\n * the V3.10 chart kit (AreaTrend, BarStack, Swimlane, Funnel, CalendarHeatmap,\n * BurnDown, Gauge). No React, no DOM: every function here is unit tested\n * directly, so a chart component is only layout glue around numbers that are\n * already proven.\n *\n * Honesty rule shared with types.ts: `null` is UNKNOWN and is never coerced to\n * 0 by anything in this file. Functions that need a number skip nulls and say\n * so in their return value.\n */\nimport { formatTick, tickUnit } from './format.js';\n\n// ---------------------------------------------------------------------------\n// Scales and ticks\n// ---------------------------------------------------------------------------\n\nexport interface NiceTickOptions {\n /**\n * The data are whole counts: ticks land on integers only (a max of 1 run\n * gives 0 and 1, never 0 / 0.25 / 0.5 / 0.75 / 1 of a run).\n */\n integer?: boolean;\n /**\n * Never step finer than this (pass a power of ten). axisTicks raises it\n * one decade at a time to reach a resolution a caller's formatter can\n * print — 0.01 for a two-decimal \"$\" formatter — before it ever resorts\n * to integer ticks.\n */\n minStep?: number;\n}\n\n/**\n * \"Nice\" axis ticks: a step of 1, 2 or 5 × 10^n (and 25 × 10^n from 25 up)\n * chosen so there are about `count` intervals, starting at or below `min`\n * and ending at or above `max`. Clean numbers (0 / 250 / 500), never\n * 0 / 233.3 / 466.7.\n *\n * V3.10.1: a 2.5 step is only taken where it stays a whole number (25, 250,\n * …). 0.25 or 2.5 needs one more decimal than its magnitude, and every\n * one-decimal formatter in the app printed a 0–1 axis as\n * \"0 / 0.3 / 0.5 / 0.8 / 1\" — 0.2 steps say the same thing in clean numbers.\n */\nexport function niceTicks(min: number, max: number, count = 4, opts: NiceTickOptions = {}): number[] {\n if (!Number.isFinite(min) || !Number.isFinite(max)) return [0];\n if (max < min) [min, max] = [max, min];\n if (max === min) {\n if (max === 0) return [0, 1];\n const pad = Math.abs(max) * 0.5;\n return niceTicks(Math.min(0, min - pad), max + pad, count, opts);\n }\n const rawStep = (max - min) / Math.max(1, count);\n const magnitude = 10 ** Math.floor(Math.log10(rawStep));\n const residual = rawStep / magnitude;\n const allowQuarter = magnitude >= 10;\n const nice = residual <= 1 ? 1 : residual <= 2 ? 2 : residual <= 2.5 ? (allowQuarter ? 2.5 : 2) : residual <= 5 ? 5 : 10;\n let step = nice * magnitude;\n if (opts.integer && step < 1) step = 1;\n if (opts.minStep !== undefined && Number.isFinite(opts.minStep) && step < opts.minStep) step = opts.minStep;\n const start = Math.floor(min / step) * step;\n const end = Math.ceil(max / step) * step;\n const n = Math.round((end - start) / step);\n // Round away float drift (0.1 + 0.2) so labels stay clean; index-based so\n // the error never accumulates across a long axis.\n const decimals = Math.max(0, -Math.floor(Math.log10(step)) + 1);\n const ticks: number[] = [];\n for (let i = 0; i <= n; i++) ticks.push(Number((start + i * step).toFixed(decimals)) || 0);\n return ticks;\n}\n\n/** True when every value is a whole number — counts, not measurements. */\nexport function allIntegers(values: ReadonlyArray<number>): boolean {\n return values.every((v) => Number.isInteger(v));\n}\n\n/**\n * Does a caller's tick formatter print these ticks honestly? A formatter\n * that rounds (`${Math.round(v)}%`, one decimal, \"13K\") can print two ticks\n * the same, or print 0.25 as \"0.3\". Each label's first number must equal\n * its tick up to a power-of-ten unit change (50 % of 0.5, 12.5K of 12500);\n * labels with no number in them are taken at their word.\n */\nexport function labelsFaithful(ticks: ReadonlyArray<number>, labels: ReadonlyArray<string>): boolean {\n if (new Set(labels).size !== labels.length) return false;\n return ticks.every((tick, i) => {\n if (tick === 0) return true;\n const match = /\\d[\\d,]*(?:\\.\\d+)?/.exec(labels[i] ?? '');\n if (!match) return true;\n const shown = Number(match[0].replace(/,/g, ''));\n if (!Number.isFinite(shown) || shown === 0) return false;\n const ratio = shown / Math.abs(tick);\n const unit = 10 ** Math.round(Math.log10(ratio));\n return Math.abs(ratio / unit - 1) < 1e-6;\n });\n}\n\nexport interface AxisTicks {\n ticks: number[];\n labels: string[];\n step: number;\n}\n\n/**\n * Ticks AND their labels for a numeric axis. With no `format` the labels\n * take their precision from the step and share ONE unit, chosen from the\n * largest tick (format.ts tickUnit / formatTick). With a caller's `format`\n * (units: \"%\", \"$\", \"pts\") the ticks are coarsened until that formatter\n * prints every one of them faithfully — never a rounded label on a precise\n * tick.\n *\n * Coarsening order (V3.10.1 review): fewer ticks at the same resolution,\n * then one decade coarser at a time, and integer ticks only as the last\n * resort. Jumping straight to integers put a day of spend under half a cent\n * on a $0.00–$1.00 axis (the line drawn ~0.6 px off the baseline, reading as\n * a flat zero) when a $0.01 step prints faithfully.\n */\nexport function axisTicks(\n min: number,\n max: number,\n opts: { count?: number; integer?: boolean; format?: (v: number) => string } = {},\n): AxisTicks {\n const count = Math.max(1, opts.count ?? 4);\n const integer = opts.integer === true;\n const format = opts.format;\n const build = (c: number, asInteger: boolean, minStep?: number): AxisTicks => {\n const ticks = niceTicks(min, max, c, { integer: asInteger, minStep });\n const step = ticks.length > 1 ? ticks[1]! - ticks[0]! : 1;\n // One argument only: formatPercent(v, digits) must never get an index.\n if (format) return { ticks, labels: ticks.map((t) => format(t)), step };\n const unit = tickUnit(ticks, step);\n return { ticks, labels: ticks.map((t) => formatTick(t, step, unit)), step };\n };\n const first = build(count, integer);\n if (!opts.format || labelsFaithful(first.ticks, first.labels)) return first;\n if (!Number.isFinite(min) || !Number.isFinite(max) || !(first.step > 0)) return first;\n const faithfulAt = (asInteger: boolean, minStep?: number): AxisTicks | null => {\n for (let c = count; c >= 1; c--) {\n const candidate = build(c, asInteger, minStep);\n if (labelsFaithful(candidate.ticks, candidate.labels)) return candidate;\n }\n return null;\n };\n const sameResolution = faithfulAt(integer);\n if (sameResolution) return sameResolution;\n // One decade coarser at a time, up to ten times the data's own extent (a\n // step past that only draws the data flatter; the integer pass follows).\n const extent = Math.max(Math.abs(min), Math.abs(max), 1);\n for (let decade = Math.floor(Math.log10(first.step)) + 1; 10 ** decade <= extent * 10; decade++) {\n const coarser = faithfulAt(integer, Number((10 ** decade).toPrecision(1)));\n if (coarser) return coarser;\n }\n return faithfulAt(true) ?? first;\n}\n\n/**\n * What a formatter's \"%\" means: 100 when it prints 50 as \"50%\" (values are\n * percent points), 1 when it prints 0.5 as \"50%\" (values are fractions),\n * null when it is not a percent formatter at all.\n */\nexport function percentScale(format: (v: number) => string): 100 | 1 | null {\n const asPercent = (v: number): number | null => {\n const s = format(v).trim();\n if (!s.endsWith('%')) return null;\n const n = Number(s.slice(0, -1).replace(/[,\\s+]/g, ''));\n return Number.isFinite(n) ? n : null;\n };\n if (asPercent(50) === 50) return 100;\n if (asPercent(0.5) === 50) return 1;\n return null;\n}\n\n// ---------------------------------------------------------------------------\n// Time domains (V3.10.1)\n// ---------------------------------------------------------------------------\n\n/**\n * 2000-01-01T00:00:00Z. On a time axis anything earlier — 0 from a null\n * timestamp, a NaN from a failed parse — is a leak, not data: it drew an\n * axis starting \"Dec 31\" (1969, in the viewer's zone) on the live Verse.\n */\nexport const MIN_PLAUSIBLE_TIME = 946_684_800_000;\n\nexport function isPlausibleTime(ms: number): boolean {\n return Number.isFinite(ms) && ms >= MIN_PLAUSIBLE_TIME;\n}\n\n/**\n * An x axis is a time axis when any of its values is a plausible epoch-ms\n * timestamp. Small ordinals (0, 1, 2 — an index axis) are not, and keep\n * every finite value.\n */\nexport function isTimeAxis(xs: ReadonlyArray<number>): boolean {\n return xs.some(isPlausibleTime);\n}\n\n/** A filter for x values: on a time axis only plausible timestamps, otherwise any finite value. */\nexport function xKeeper(xs: ReadonlyArray<number>): (x: number) => boolean {\n return isTimeAxis(xs) ? isPlausibleTime : Number.isFinite;\n}\n\n/**\n * The narrowest time domain a chart draws: 10 minutes. A burst of readings\n * a few seconds apart used to stretch across the full width with three\n * identical time labels stacked on each other; widened, it sits as the\n * short cluster it is, on an axis whose ends read as two different times.\n */\nexport const MIN_TIME_SPAN_MS = 10 * 60_000;\n\n/**\n * Widen [min, max] to at least `minSpan`, around its middle ('center') or\n * keeping its right edge ('end' — for axes that end at now or a reset).\n */\nexport function ensureSpan(min: number, max: number, minSpan: number, align: 'center' | 'end' = 'center'): [number, number] {\n if (max < min) [min, max] = [max, min];\n if (max - min >= minSpan) return [min, max];\n if (align === 'end') return [max - minSpan, max];\n const mid = (min + max) / 2;\n return [mid - minSpan / 2, mid + minSpan / 2];\n}\n\n// ---------------------------------------------------------------------------\n// Label layout (V3.10.1): collision-free axis labels and dodged end labels\n// ---------------------------------------------------------------------------\n\n/**\n * Estimated advance of one label character at the DEFAULT display size:\n * --text-xs-size (12 px) × 0.6, the UI sans's average advance at medium\n * weight, rounded up so estimates err wide rather than letting two labels\n * touch.\n *\n * --text-xs-size is `12px * var(--ui-text-scale)`, and Appearance → Display\n * size sets that multiplier to 1.125 (Large) or 1.25 (XLarge). A chart must\n * budget at the size the text really renders — labelCharPx(useTextScale()) —\n * or the layout accepts a pair of 15 px labels as if they were 12 px ones\n * and prints them over each other (V3.10.1 review).\n */\nexport const LABEL_CHAR_PX = 12 * 0.6;\n\n/** A usable display text multiplier: anything non-finite or non-positive is the default, 1. */\nexport function validTextScale(textScale: number): number {\n return Number.isFinite(textScale) && textScale > 0 ? textScale : 1;\n}\n\n/** LABEL_CHAR_PX at a display text scale (1 Default, 1.125 Large, 1.25 XLarge). */\nexport function labelCharPx(textScale = 1): number {\n return LABEL_CHAR_PX * validTextScale(textScale);\n}\n\nexport function estimateTextWidth(text: string, charPx = LABEL_CHAR_PX): number {\n return text.length * charPx;\n}\n\n/**\n * Per-character budget of the y-axis tick gutters at 12 px — a shade under\n * LABEL_CHAR_PX because tick labels are mostly tabular digits.\n */\nconst TICK_CHAR_PX = 7;\n\n/**\n * Left gutter for right-aligned y tick labels: the widest label plus 10 px,\n * clamped to [floor, cap]. The per-character budget AND the cap scale with\n * the display text size (the cap was chosen for 12 px text); the floor is a\n * minimum, not a fit, and does not.\n */\nexport function tickGutter(labels: ReadonlyArray<string>, floor: number, cap: number, textScale = 1): number {\n const s = validTextScale(textScale);\n const widest = Math.max(0, ...labels.map((l) => l.length));\n return Math.min(cap * s, Math.max(floor, widest * TICK_CHAR_PX * s + 10));\n}\n\nexport type LabelAnchor = 'start' | 'middle' | 'end';\n\nexport interface AxisLabelSpec {\n key: string;\n /** Where the label points. */\n x: number;\n /** How it would like to hang off `x`. */\n anchor: LabelAnchor;\n /** Higher survives a collision: a marker / reset > the end > the start > interior ticks. */\n priority: number;\n /** The label at each detail level, most detailed first; the last entry repeats for deeper levels. */\n variants: ReadonlyArray<string>;\n /**\n * Required labels (the ends, markers) decide how far down the detail\n * ladder the axis goes; optional ones (interior ticks) are simply dropped\n * when they collide.\n */\n required?: boolean;\n}\n\nexport interface PlacedAxisLabel {\n key: string;\n text: string;\n x: number;\n anchor: LabelAnchor;\n}\n\nexport interface AxisLabelBounds {\n /** Leftmost / rightmost extent a label may occupy. */\n min: number;\n max: number;\n /** Minimum clear space between two labels. */\n gap?: number;\n charPx?: number;\n}\n\nfunction placeLevel(specs: ReadonlyArray<AxisLabelSpec>, level: number, bounds: AxisLabelBounds): PlacedAxisLabel[] {\n const gap = bounds.gap ?? 8;\n const order = specs.map((s, i) => ({ s, i })).sort((a, b) => b.s.priority - a.s.priority || a.i - b.i);\n const boxes: { left: number; right: number; text: string; i: number; label: PlacedAxisLabel }[] = [];\n for (const { s, i } of order) {\n const text = s.variants[Math.min(level, s.variants.length - 1)] ?? '';\n if (!text) continue;\n const w = estimateTextWidth(text, bounds.charPx);\n if (w > bounds.max - bounds.min) continue;\n let left = s.anchor === 'start' ? s.x : s.anchor === 'end' ? s.x - w : s.x - w / 2;\n let x = s.x;\n let anchor: LabelAnchor = s.anchor;\n // Keep the label inside the axis: pinned to an edge, it hangs off that edge.\n if (left < bounds.min) {\n left = bounds.min;\n x = bounds.min;\n anchor = 'start';\n } else if (left + w > bounds.max) {\n left = bounds.max - w;\n x = bounds.max;\n anchor = 'end';\n }\n const right = left + w;\n // Two labels that say the same thing are one label too many, wherever they sit.\n const clash = boxes.some((b) => b.text === text || (left < b.right + gap && b.left < right + gap));\n if (clash) continue;\n boxes.push({ left, right, text, i, label: { key: s.key, text, x, anchor } });\n }\n return boxes.sort((a, b) => a.i - b.i).map((b) => b.label);\n}\n\n/**\n * Lay out one axis's labels so none overlap. Every label at a level uses\n * the same rung of its detail ladder; the chosen level is the most detailed\n * one that places as many REQUIRED labels as any level can. Within a level,\n * higher priority wins a collision and the loser is dropped — so a tight\n * burn-down keeps \"Resets Sep 25\" and shortens or drops the start, rather\n * than printing the two over each other.\n */\nexport function layoutAxisLabels(specs: ReadonlyArray<AxisLabelSpec>, bounds: AxisLabelBounds): PlacedAxisLabel[] {\n if (specs.length === 0) return [];\n const levels = Math.max(1, ...specs.map((s) => s.variants.length));\n const requiredKeys = new Set(specs.filter((s) => s.required !== false).map((s) => s.key));\n let best: PlacedAxisLabel[] = [];\n let bestScore = -1;\n for (let level = 0; level < levels; level++) {\n const placed = placeLevel(specs, level, bounds);\n const score = placed.filter((p) => requiredKeys.has(p.key)).length;\n if (score > bestScore) {\n best = placed;\n bestScore = score;\n }\n if (bestScore === requiredKeys.size) break;\n }\n return best;\n}\n\n/**\n * Spread direct labels (end-of-line series names) vertically so none\n * overlaps: labels closer than `gap` merge into a cluster centred on their\n * own targets, clamped inside [top, bottom]. Returns each key's y, or null\n * when they cannot all fit — the caller then falls back to the legend\n * alone rather than drawing labels over each other. Ties keep input order.\n */\nexport function dodgeLabels(\n items: ReadonlyArray<{ key: string; y: number }>,\n gap: number,\n top: number,\n bottom: number,\n): Map<string, number> | null {\n if (items.length === 0) return new Map();\n if ((items.length - 1) * gap > bottom - top + 1e-9) return null;\n const sorted = items.map((it, i) => ({ ...it, i })).sort((a, b) => a.y - b.y || a.i - b.i);\n interface Cluster { members: typeof sorted; top: number }\n const place = (members: typeof sorted): Cluster => {\n const mean = members.reduce((s, m) => s + m.y, 0) / members.length;\n const extent = (members.length - 1) * gap;\n return { members, top: clamp(mean - extent / 2, top, bottom - extent) };\n };\n let clusters: Cluster[] = sorted.map((m) => place([m]));\n for (let merged = true; merged; ) {\n merged = false;\n for (let i = 0; i + 1 < clusters.length; i++) {\n const a = clusters[i]!;\n const b = clusters[i + 1]!;\n if (a.top + a.members.length * gap > b.top + 1e-9) {\n clusters = [...clusters.slice(0, i), place([...a.members, ...b.members]), ...clusters.slice(i + 2)];\n merged = true;\n break;\n }\n }\n }\n const out = new Map<string, number>();\n for (const c of clusters) c.members.forEach((m, k) => out.set(m.key, c.top + k * gap));\n return out;\n}\n\n/** Linear map from [d0, d1] to [r0, r1]; a zero-width domain maps to the range midpoint. */\nexport function linearScale(d0: number, d1: number, r0: number, r1: number): (v: number) => number {\n const span = d1 - d0;\n if (span === 0) return () => (r0 + r1) / 2;\n return (v: number) => r0 + ((v - d0) / span) * (r1 - r0);\n}\n\n/** Evenly thinned indexes so at most `max` labels are drawn, always keeping the last one. */\nexport function thinIndexes(length: number, max: number): number[] {\n if (length <= 0) return [];\n if (max <= 1) return [length - 1];\n if (length <= max) return Array.from({ length }, (_, i) => i);\n const step = Math.ceil((length - 1) / (max - 1));\n const out: number[] = [];\n for (let i = length - 1; i >= 0; i -= step) out.push(i);\n return out.reverse();\n}\n\n/** Clamp to [lo, hi]. */\nexport function clamp(v: number, lo: number, hi: number): number {\n return Math.min(hi, Math.max(lo, v));\n}\n\n// ---------------------------------------------------------------------------\n// Runs (null-aware line segments)\n// ---------------------------------------------------------------------------\n\nexport interface XY {\n x: number;\n y: number;\n}\n\n/** Split a series at nulls so a gap renders as a break, never as a dip to zero. */\nexport function splitRuns(points: ReadonlyArray<{ x: number; y: number | null }>): XY[][] {\n const runs: XY[][] = [];\n let current: XY[] = [];\n for (const p of points) {\n if (p.y === null || !Number.isFinite(p.y)) {\n if (current.length) runs.push(current);\n current = [];\n continue;\n }\n current.push({ x: p.x, y: p.y });\n }\n if (current.length) runs.push(current);\n return runs;\n}\n\nexport function linePath(run: ReadonlyArray<XY>): string {\n return run.map((p, i) => `${i === 0 ? 'M' : 'L'}${round(p.x)},${round(p.y)}`).join(' ');\n}\n\n/** Closed area under (or between) a run and a baseline run of equal length. */\nexport function areaPath(top: ReadonlyArray<XY>, bottom: ReadonlyArray<XY>): string {\n if (top.length === 0) return '';\n const back = [...bottom].reverse();\n return `${linePath(top)} ${back.map((p) => `L${round(p.x)},${round(p.y)}`).join(' ')} Z`;\n}\n\nexport function round(v: number): number {\n return Math.round(v * 10) / 10;\n}\n\n/**\n * A 1 px hairline's coordinate, snapped to the pixel grid: a 1 px stroke\n * centred on an integer straddles two device pixels and paints as a blurry\n * 2 px gray; centred on a half pixel it fills exactly one. Used for every\n * gridline, axis and crosshair so they stay crisp at any measured size.\n */\nexport function crisp(v: number): number {\n return Math.floor(v) + 0.5;\n}\n\n// ---------------------------------------------------------------------------\n// Monotone curves (visual polish that cannot lie)\n// ---------------------------------------------------------------------------\n\n/** One cubic Bézier segment: start, two control points, end. */\nexport interface CurveSegment {\n from: XY;\n c1: XY;\n c2: XY;\n to: XY;\n}\n\nfunction sign(v: number): number {\n return v < 0 ? -1 : 1;\n}\n\n/** Tangent at p1 from its two neighbours (Steffen / Fritsch–Carlson, as d3's curveMonotoneX). */\nfunction interiorTangent(p0: XY, p1: XY, p2: XY): number {\n const h0 = p1.x - p0.x;\n const h1 = p2.x - p1.x;\n if (h0 === 0 || h1 === 0) return 0;\n const s0 = (p1.y - p0.y) / h0;\n const s1 = (p2.y - p1.y) / h1;\n const p = (s0 * h1 + s1 * h0) / (h0 + h1);\n return (sign(s0) + sign(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;\n}\n\n/** Tangent at an end point, from its one neighbour and that neighbour's tangent. */\nfunction endTangent(p0: XY, p1: XY, t: number): number {\n const h = p1.x - p0.x;\n return h ? (3 * (p1.y - p0.y) / h - t) / 2 : t;\n}\n\n/**\n * A monotone cubic through every point of a run (x ascending). WHY this curve\n * and not a Catmull-Rom or basis spline: it passes EXACTLY through each\n * reading and never overshoots between two of them — a segment's y always\n * stays inside [y(i), y(i+1)] — so smoothing can never invent a peak, a dip\n * below zero, or a crossing of the reserve line that the data does not have.\n * Two points are a straight segment; one point has no segments.\n */\nexport function monotoneSegments(run: ReadonlyArray<XY>): CurveSegment[] {\n const n = run.length;\n if (n < 2) return [];\n if (n === 2) {\n const [a, b] = [run[0]!, run[1]!];\n return [{ from: a, c1: { x: a.x + (b.x - a.x) / 3, y: a.y + (b.y - a.y) / 3 }, c2: { x: b.x - (b.x - a.x) / 3, y: b.y - (b.y - a.y) / 3 }, to: b }];\n }\n const t: number[] = new Array(n).fill(0);\n for (let i = 1; i < n - 1; i++) t[i] = interiorTangent(run[i - 1]!, run[i]!, run[i + 1]!);\n t[0] = endTangent(run[0]!, run[1]!, t[1]!);\n t[n - 1] = endTangent(run[n - 1]!, run[n - 2]!, t[n - 2]!);\n const out: CurveSegment[] = [];\n for (let i = 0; i < n - 1; i++) {\n const a = run[i]!;\n const b = run[i + 1]!;\n const dx = (b.x - a.x) / 3;\n out.push({ from: a, c1: { x: a.x + dx, y: a.y + dx * t[i]! }, c2: { x: b.x - dx, y: b.y - dx * t[i + 1]! }, to: b });\n }\n return out;\n}\n\nfunction pt(p: XY): string {\n return `${round(p.x)},${round(p.y)}`;\n}\n\n/** SVG path of the monotone curve through `run` (a lone point is just its M). */\nexport function smoothPath(run: ReadonlyArray<XY>): string {\n if (run.length === 0) return '';\n return `M${pt(run[0]!)}` + monotoneSegments(run).map((s) => ` C${pt(s.c1)} ${pt(s.c2)} ${pt(s.to)}`).join('');\n}\n\n/**\n * Closed area between a curved top run and a curved bottom run of equal x\n * (a stacked layer's base is the layer below's top, so both edges use the\n * SAME curve and adjacent layers meet without a sliver). The bottom is walked\n * backwards by reversing each segment exactly — end, swapped controls, start.\n */\nexport function smoothAreaPath(top: ReadonlyArray<XY>, bottom: ReadonlyArray<XY>): string {\n if (top.length === 0) return '';\n const back = monotoneSegments(bottom).reverse();\n const tail = back.length\n ? `L${pt(back[0]!.to)}` + back.map((s) => ` C${pt(s.c2)} ${pt(s.c1)} ${pt(s.from)}`).join('')\n : bottom.length ? `L${pt(bottom[0]!)}` : '';\n return `${smoothPath(top)} ${tail} Z`;\n}\n\n// ---------------------------------------------------------------------------\n// Stacking\n// ---------------------------------------------------------------------------\n\nexport interface StackSegment {\n /** Segment index in the caller's segment list. */\n index: number;\n value: number;\n y0: number;\n y1: number;\n}\n\nexport interface StackedColumn {\n segments: StackSegment[];\n /** Sum of known values. */\n total: number;\n /** True when at least one segment value is null (the total is a lower bound). */\n incomplete: boolean;\n /** True when every segment value is null (nothing is known). */\n unknown: boolean;\n}\n\n/** Stack one column's values bottom-up. Nulls are skipped and flagged, zeros take no height. */\nexport function stackColumn(values: ReadonlyArray<number | null>): StackedColumn {\n let acc = 0;\n let incomplete = false;\n let known = 0;\n const segments: StackSegment[] = [];\n values.forEach((value, index) => {\n if (value === null || !Number.isFinite(value)) {\n incomplete = true;\n return;\n }\n known++;\n const v = Math.max(0, value);\n if (v > 0) segments.push({ index, value: v, y0: acc, y1: acc + v });\n acc += v;\n });\n return { segments, total: acc, incomplete, unknown: known === 0 && values.length > 0 };\n}\n\n// ---------------------------------------------------------------------------\n// Rounded-end bars (4 px data end, square at the baseline)\n// ---------------------------------------------------------------------------\n\n/**\n * Path for a vertical bar whose TOP corners are rounded by `r` (the data end)\n * and whose bottom sits square on the baseline. `r` shrinks for short bars so\n * the corners never cross.\n */\nexport function roundedTopBar(x: number, y: number, w: number, h: number, r = 4): string {\n if (h <= 0 || w <= 0) return '';\n const rr = Math.max(0, Math.min(r, w / 2, h));\n return [\n `M${round(x)},${round(y + h)}`,\n `L${round(x)},${round(y + rr)}`,\n `Q${round(x)},${round(y)} ${round(x + rr)},${round(y)}`,\n `L${round(x + w - rr)},${round(y)}`,\n `Q${round(x + w)},${round(y)} ${round(x + w)},${round(y + rr)}`,\n `L${round(x + w)},${round(y + h)}`,\n 'Z',\n ].join(' ');\n}\n\n/** Horizontal twin: RIGHT corners rounded (the data end), left square on the baseline. */\nexport function roundedRightBar(x: number, y: number, w: number, h: number, r = 4): string {\n if (h <= 0 || w <= 0) return '';\n const rr = Math.max(0, Math.min(r, h / 2, w));\n return [\n `M${round(x)},${round(y)}`,\n `L${round(x + w - rr)},${round(y)}`,\n `Q${round(x + w)},${round(y)} ${round(x + w)},${round(y + rr)}`,\n `L${round(x + w)},${round(y + h - rr)}`,\n `Q${round(x + w)},${round(y + h)} ${round(x + w - rr)},${round(y + h)}`,\n `L${round(x)},${round(y + h)}`,\n 'Z',\n ].join(' ');\n}\n\n// ---------------------------------------------------------------------------\n// Funnel\n// ---------------------------------------------------------------------------\n\nexport interface FunnelStep {\n value: number | null;\n /** Share of the FIRST stage (0..1), null when either side is unknown or the first is 0. */\n ofFirst: number | null;\n /** Share of the PREVIOUS stage (0..1), null for the first stage or when unknown. */\n ofPrevious: number | null;\n}\n\nexport function funnelSteps(values: ReadonlyArray<number | null>): FunnelStep[] {\n const first = values[0] ?? null;\n return values.map((value, i) => {\n const previous = i > 0 ? values[i - 1] ?? null : null;\n return {\n value,\n ofFirst: value !== null && first !== null && first > 0 ? value / first : null,\n ofPrevious: i > 0 && value !== null && previous !== null && previous > 0 ? value / previous : null,\n };\n });\n}\n\n// ---------------------------------------------------------------------------\n// Calendar heatmap\n// ---------------------------------------------------------------------------\n\nexport interface CalendarCell {\n day: string;\n value: number | null;\n /** Column (week index from the first rendered week). */\n week: number;\n /** Row, 0 = weekStart. */\n weekday: number;\n /** True for days before the first datum / after the last (padding cells). */\n outside: boolean;\n}\n\nexport interface CalendarGrid {\n cells: CalendarCell[];\n weeks: number;\n /** Week index where each month first appears, for the month labels. */\n months: { week: number; label: string }[];\n}\n\nconst MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n\nfunction utcDayMs(day: string): number | null {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(day)) return null;\n const ms = Date.parse(`${day}T00:00:00Z`);\n return Number.isFinite(ms) && new Date(ms).toISOString().slice(0, 10) === day ? ms : null;\n}\n\n/**\n * Lay out consecutive days on a weeks × weekdays grid. Input days may be\n * sparse or unordered; missing days in the span become `value: null`\n * (unknown), never 0. `weekStart` 1 = Monday (ISO), 0 = Sunday.\n */\nexport function calendarGrid(\n days: ReadonlyArray<{ day: string; value: number | null }>,\n weekStart: 0 | 1 = 1,\n): CalendarGrid {\n const byDay = new Map<string, number | null>();\n let minMs = Infinity;\n let maxMs = -Infinity;\n for (const d of days) {\n const ms = utcDayMs(d.day);\n // A pre-2000 day is a null/zero date that leaked through, not a datum —\n // one would stretch the grid back to 1970.\n if (ms === null || ms < MIN_PLAUSIBLE_TIME) continue;\n byDay.set(d.day, d.value);\n minMs = Math.min(minMs, ms);\n maxMs = Math.max(maxMs, ms);\n }\n if (!Number.isFinite(minMs)) return { cells: [], weeks: 0, months: [] };\n const DAY = 86_400_000;\n const firstWeekday = (new Date(minMs).getUTCDay() - weekStart + 7) % 7;\n const gridStart = minMs - firstWeekday * DAY;\n const lastWeekday = (new Date(maxMs).getUTCDay() - weekStart + 7) % 7;\n const gridEnd = maxMs + (6 - lastWeekday) * DAY;\n const cells: CalendarCell[] = [];\n const months: { week: number; label: string }[] = [];\n let lastMonth = -1;\n for (let ms = gridStart, i = 0; ms <= gridEnd; ms += DAY, i++) {\n const day = new Date(ms).toISOString().slice(0, 10);\n const week = Math.floor(i / 7);\n const weekday = i % 7;\n const outside = ms < minMs || ms > maxMs;\n cells.push({ day, value: outside ? null : byDay.has(day) ? byDay.get(day)! : null, week, weekday, outside });\n const month = new Date(ms).getUTCMonth();\n // First rendered week of each month; the component drops a label that\n // would collide with the previous one.\n if (!outside && month !== lastMonth) {\n months.push({ week, label: MONTHS[month]! });\n lastMonth = month;\n }\n }\n return { cells, weeks: Math.floor((gridEnd - gridStart) / DAY / 7) + 1, months };\n}\n\n/**\n * Bucket a value into 0..steps for a sequential ramp: 0 is reserved for a\n * true zero, 1..steps split (0, max] evenly. null → null (unknown).\n */\nexport function heatBucket(value: number | null, max: number, steps = 4): number | null {\n if (value === null || !Number.isFinite(value)) return null;\n if (value <= 0 || max <= 0) return 0;\n return clamp(Math.ceil((value / max) * steps), 1, steps);\n}\n\n// ---------------------------------------------------------------------------\n// Burn-down projection\n// ---------------------------------------------------------------------------\n\nexport interface BurnPoint {\n t: number;\n remaining: number | null;\n}\n\nexport interface BurnProjection {\n /** Units per millisecond (negative while burning). Null with fewer than two known points. */\n slopePerMs: number | null;\n /** When the projection crosses 0, if it does before `resetAt`. */\n exhaustAt: number | null;\n /** When it crosses `reserve`, if a reserve is set and it does before `resetAt`. */\n reserveAt: number | null;\n /** Projected remaining at reset (clamped at 0), or null when there is no slope. */\n remainingAtReset: number | null;\n /** The last known point the projection starts from. */\n from: { t: number; remaining: number } | null;\n}\n\n/**\n * Least-squares slope over the most recent `window` known points, projected\n * forward from the last known point. A flat or rising series never\n * \"exhausts\". Pure: the caller supplies `resetAt`.\n *\n * `resetAt` null (or non-finite) is an UNKNOWN reset: nothing is projected\n * forward — there is no moment to project to — so only a line the window\n * has ALREADY crossed is reported, and remainingAtReset is null. (An\n * epoch-0 reset used to fail every `at <= resetAt` check and come back as\n * \"no crossing, current remaining at reset\": a green verdict for a seat\n * burning 10%/h.)\n */\nexport function projectBurnDown(\n points: ReadonlyArray<BurnPoint>,\n resetAtIn: number | null,\n opts: { window?: number; reserve?: number | null } = {},\n): BurnProjection {\n const resetAt = resetAtIn !== null && Number.isFinite(resetAtIn) ? resetAtIn : null;\n const known = points\n .filter((p): p is { t: number; remaining: number } => p.remaining !== null && Number.isFinite(p.remaining) && Number.isFinite(p.t))\n .sort((a, b) => a.t - b.t);\n const from = known.length ? known[known.length - 1]! : null;\n const recent = known.slice(-(opts.window ?? 6));\n if (!from || recent.length < 2) {\n return { slopePerMs: null, exhaustAt: null, reserveAt: null, remainingAtReset: null, from };\n }\n const n = recent.length;\n const meanT = recent.reduce((s, p) => s + p.t, 0) / n;\n const meanR = recent.reduce((s, p) => s + p.remaining, 0) / n;\n let num = 0;\n let den = 0;\n for (const p of recent) {\n num += (p.t - meanT) * (p.remaining - meanR);\n den += (p.t - meanT) ** 2;\n }\n const slope = den === 0 ? 0 : num / den;\n const crossing = (level: number): number | null => {\n if (from.remaining <= level) return from.t;\n if (slope >= 0 || resetAt === null) return null;\n const at = from.t + (level - from.remaining) / slope;\n return at <= resetAt ? at : null;\n };\n const reserve = opts.reserve ?? null;\n return {\n slopePerMs: slope,\n exhaustAt: crossing(0),\n reserveAt: reserve === null ? null : crossing(reserve),\n remainingAtReset: resetAt === null ? null : Math.max(0, from.remaining + slope * Math.max(0, resetAt - from.t)),\n from,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Gauge arcs\n// ---------------------------------------------------------------------------\n\n/** Point on a circle; angle in radians, 0 = +x axis, measured counter-clockwise (SVG y flipped). */\nexport function polar(cx: number, cy: number, r: number, angle: number): XY {\n return { x: cx + r * Math.cos(angle), y: cy - r * Math.sin(angle) };\n}\n\n/**\n * SVG arc for a 180° gauge from fraction `f0` to `f1` (0 = left end, 1 =\n * right end, sweeping over the top). Fractions are clamped to [0, 1].\n */\nexport function gaugeArc(cx: number, cy: number, r: number, f0: number, f1: number): string {\n const a = clamp(f0, 0, 1);\n const b = clamp(f1, 0, 1);\n if (b <= a) return '';\n const start = polar(cx, cy, r, Math.PI * (1 - a));\n const end = polar(cx, cy, r, Math.PI * (1 - b));\n // A 180° gauge never needs the large-arc flag (the span is at most π).\n return `M${round(start.x)},${round(start.y)} A${r},${r} 0 0 1 ${round(end.x)},${round(end.y)}`;\n}\n\nexport type GaugeSeverity = 'ok' | 'warn' | 'danger' | 'unknown';\n\nexport function gaugeSeverity(value: number | null, warn: number, danger: number): GaugeSeverity {\n if (value === null || !Number.isFinite(value)) return 'unknown';\n if (value >= danger) return 'danger';\n if (value >= warn) return 'warn';\n return 'ok';\n}\n","/**\n * components/charts/motion.ts — whether a chart may play its entrance (a line\n * drawing itself in, columns rising, a wash fading up).\n *\n * The same two triggers as the duration tokens (design/tokens.css) and the\n * skeleton shimmer (design/global.css), resolved once at mount:\n *\n * - `data-motion=\"reduce\"` on <html> (Settings → Reduce motion) → static;\n * - `data-motion=\"full\"` (Settings explicitly asked for motion) → animate,\n * whatever the OS says;\n * - otherwise the OS `prefers-reduced-motion: reduce` → static.\n *\n * The chart writes the answer to its plot wrapper as `data-motion=\"enter\" |\n * \"static\"`, and plot.module.css keys every entrance animation off\n * `[data-motion='enter']` — so a reduced-motion reader gets a plot that is\n * simply THERE, and the DOM says which one they got (charts/motion.test.tsx).\n * The durations also read var(--duration-*), which collapse to 1 ms under\n * reduced motion — a second, CSS-only guard if the attribute were ever lost.\n *\n * Entrance only: a hover, a refetch or a 7d → 30d switch never replays it\n * (the SVG elements persist; only their geometry changes).\n */\nimport { useState } from 'react';\n\nexport type ChartMotion = 'enter' | 'static';\n\nexport function prefersReducedMotion(): boolean {\n if (typeof document !== 'undefined') {\n const pref = document.documentElement.getAttribute('data-motion');\n if (pref === 'reduce') return true;\n if (pref === 'full') return false;\n }\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') return false;\n try {\n return window.matchMedia('(prefers-reduced-motion: reduce)').matches;\n } catch {\n return false;\n }\n}\n\n/** Resolved once per chart mount — an entrance is a one-time event, not a subscription. */\nexport function useChartMotion(): ChartMotion {\n const [motion] = useState<ChartMotion>(() => (prefersReducedMotion() ? 'static' : 'enter'));\n return motion;\n}\n","/**\n * components/charts/useChartWidth.ts — the measured pixel width of a chart's\n * container, so the V3.10 charts draw at their REAL size (text stays 12 px at\n * 375 px wide) instead of scaling a fixed viewBox down until labels are\n * unreadable. Falls back to `fallback` until measured (jsdom, SSR, first paint).\n */\nimport { useLayoutEffect, useState, type RefObject } from 'react';\n\n/** Narrowest width any chart lays itself out for (a 375 px phone minus padding). */\nexport const MIN_CHART_WIDTH = 280;\n\nexport function useChartWidth(ref: RefObject<HTMLElement | null>, fixed: number | undefined, fallback = 640): number {\n const [measured, setMeasured] = useState<number | null>(null);\n // WHY track the node: a chart whose frame starts in a non-ready state\n // (loading / empty / dark) mounts its plot — and so this ref — LATER than\n // the hook. An effect keyed only on the ref object never re-ran, so every\n // chart that first rendered \"Loading…\" stayed at the 640 px fallback and\n // was scaled down by CSS (V3.10 fix, found in the 1440 harness).\n const [node, setNode] = useState<HTMLElement | null>(null);\n // Runs after every render on purpose (ref.current is not a dependency React\n // can see); the equality guard makes it settle in one pass, never a loop.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n useLayoutEffect(() => {\n if (ref.current !== node) setNode(ref.current);\n });\n useLayoutEffect(() => {\n if (fixed !== undefined) return undefined;\n const el = node;\n if (!el) return undefined;\n const read = (): void => {\n const w = Math.floor(el.getBoundingClientRect().width);\n // 0 means \"not laid out yet\" (hidden tab, jsdom) — keep the fallback.\n if (w > 0) setMeasured((prev) => (prev === w ? prev : w));\n };\n read();\n if (typeof ResizeObserver === 'undefined') return undefined;\n // rAF-coalesced: a drag-resize fires many entries per frame.\n let frame = 0;\n const observer = new ResizeObserver(() => {\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(read);\n });\n observer.observe(el);\n return () => {\n cancelAnimationFrame(frame);\n observer.disconnect();\n };\n }, [node, fixed]);\n return Math.max(MIN_CHART_WIDTH, fixed ?? measured ?? fallback);\n}\n","/**\n * components/charts/useTextScale.ts — the operator's Display size, as the\n * multiplier every type token carries: --ui-text-scale is 1 at Default,\n * 1.125 at Large and 1.25 at XLarge (clamped back to 1.125 for XLarge under\n * 1100 px — see the [data-ui-scale] blocks in design/tokens.css).\n *\n * Charts lay labels out from WIDTH ESTIMATES (chart-math layoutAxisLabels,\n * dodgeLabels, tickGutter) written for 12 px text. This is what they\n * multiply those estimates by, so the no-overlap guarantee holds at the size\n * the labels actually render instead of only at Default (V3.10.1 review:\n * at XLarge a weekly burn-down's start and reset labels overprinted).\n *\n * Read from <html>, where data/appearance-store.ts sets data-ui-scale and\n * tokens.css resolves --ui-text-scale. ONE shared subscription for every\n * chart on screen — a MutationObserver for the setting and a resize\n * listener for the narrow-window clamp (a media query) — not one per chart.\n */\nimport { useSyncExternalStore } from 'react';\nimport { validTextScale } from './chart-math.js';\n\n/** --ui-text-scale as computed on `root` (default <html>); 1 when unset or unreadable. */\nexport function readTextScale(root: Element | null = typeof document === 'undefined' ? null : document.documentElement): number {\n if (!root || typeof getComputedStyle !== 'function') return 1;\n return validTextScale(Number.parseFloat(getComputedStyle(root).getPropertyValue('--ui-text-scale')));\n}\n\nconst listeners = new Set<() => void>();\nlet current: number | null = null;\nlet stopWatching: (() => void) | null = null;\n\nfunction refresh(): void {\n const next = readTextScale();\n if (next === current) return;\n current = next;\n for (const listener of listeners) listener();\n}\n\nfunction watch(): () => void {\n current = readTextScale();\n const root = document.documentElement;\n // `style` as well as the attribute: an inline --ui-text-scale is the same\n // setting, and the check is one computed-style read per mutation batch.\n const observer = typeof MutationObserver === 'undefined' ? null : new MutationObserver(refresh);\n observer?.observe(root, { attributes: true, attributeFilter: ['data-ui-scale', 'style'] });\n const raf = typeof requestAnimationFrame === 'function';\n let frame = 0;\n const onResize = (): void => {\n if (!raf) return refresh();\n cancelAnimationFrame(frame);\n frame = requestAnimationFrame(refresh);\n };\n window.addEventListener('resize', onResize);\n return () => {\n observer?.disconnect();\n if (raf) cancelAnimationFrame(frame);\n window.removeEventListener('resize', onResize);\n };\n}\n\nfunction subscribe(listener: () => void): () => void {\n listeners.add(listener);\n if (listeners.size === 1 && typeof document !== 'undefined') stopWatching = watch();\n return () => {\n listeners.delete(listener);\n if (listeners.size > 0) return;\n stopWatching?.();\n stopWatching = null;\n current = null;\n };\n}\n\nfunction getSnapshot(): number {\n return current ?? readTextScale();\n}\n\n/** The display text multiplier; re-renders the caller when the operator changes Display size. */\nexport function useTextScale(): number {\n return useSyncExternalStore(subscribe, getSnapshot, () => 1);\n}\n",".table {\n width: 100%;\n border-collapse: collapse;\n font-size: var(--text-xs-size);\n}\n\n.table th,\n.table td {\n text-align: left;\n padding: var(--space-1) var(--space-2);\n border-bottom: 1px solid var(--border-subtle);\n}\n\n.table th {\n color: var(--text-tertiary);\n font-weight: var(--font-weight-medium);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n font-size: var(--text-xs-size);\n}\n\n.numeric {\n text-align: right;\n font-variant-numeric: tabular-nums;\n}\n\n.empty {\n color: var(--text-tertiary);\n text-align: center;\n}\n","/**\n * components/charts/TableView.tsx — the WCAG-clean accessibility twin every\n * chart should ship (dataviz skill: \"no table view / color-only encoding on\n * a continuous scale\" is an anti-pattern). Every value a chart's tooltip or\n * direct label shows must also be reachable here without hovering anything.\n */\nimport type { ReactNode } from 'react';\nimport styles from './TableView.module.css';\n\nexport interface TableColumn<T> {\n key: string;\n label: string;\n numeric?: boolean;\n render: (row: T) => ReactNode;\n}\n\nexport function TableView<T>({\n caption,\n columns,\n rows,\n rowKey,\n emptyMessage = 'No rows.',\n}: {\n caption: string;\n columns: TableColumn<T>[];\n rows: T[];\n rowKey: (row: T, index: number) => string;\n /** Shown as a single full-width row when `rows` is empty (V3.10). */\n emptyMessage?: string;\n}) {\n return (\n <table className={styles.table}>\n <caption className=\"visually-hidden\">{caption}</caption>\n <thead>\n <tr>\n {columns.map((c) => (\n <th key={c.key} scope=\"col\" className={c.numeric ? styles.numeric : undefined}>\n {c.label}\n </th>\n ))}\n </tr>\n </thead>\n <tbody>\n {rows.length === 0 ? (\n <tr>\n <td colSpan={Math.max(1, columns.length)} className={styles.empty}>\n {emptyMessage}\n </td>\n </tr>\n ) : null}\n {rows.map((row, i) => (\n <tr key={rowKey(row, i)}>\n {columns.map((c) => (\n <td key={c.key} className={c.numeric ? styles.numeric : undefined}>\n {c.render(row)}\n </td>\n ))}\n </tr>\n ))}\n </tbody>\n </table>\n );\n}\n",".frame {\n margin: 0;\n min-width: 0;\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-lg);\n background: var(--bg-surface);\n /* V3.10: 16px (12px compact density) — the card-pad token follows density. */\n padding: var(--card-pad, var(--space-4));\n}\n\n.header {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: var(--space-3);\n /* Never wrap: the actions (and the ⋯ view menu) stay in the head beside the\n title at every width; a long description wraps inside .heading instead of\n pushing the menu below the caption (audit 16). */\n flex-wrap: nowrap;\n margin-bottom: var(--space-3);\n}\n\n.actions {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n margin-left: auto;\n}\n\n.menuWrap {\n position: relative;\n display: inline-flex;\n}\n\n/* The ⋯ button: quiet until hovered or focused, but always a real control. */\n.more {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: calc(var(--control-h-xs, 20px) + 4px);\n height: calc(var(--control-h-xs, 20px) + 4px);\n padding: 0;\n border: 1px solid transparent;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n transition: background-color var(--duration-fast) var(--ease-standard), color var(--duration-fast) var(--ease-standard);\n}\n\n.more:hover,\n.more[aria-expanded='true'] {\n background: var(--bg-hover);\n color: var(--text-primary);\n}\n\n.more:focus-visible {\n outline: 2px solid var(--border-focus);\n outline-offset: 1px;\n}\n\n.menu {\n position: absolute;\n top: calc(100% + var(--space-1));\n right: 0;\n z-index: var(--z-dropdown);\n display: flex;\n flex-direction: column;\n min-width: 176px;\n padding: var(--space-1);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-md);\n background: var(--bg-surface-raised);\n box-shadow: var(--shadow-menu);\n}\n\n.menuItem {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n padding: var(--space-1) var(--space-2);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n text-align: left;\n cursor: pointer;\n}\n\n.menuItem:hover,\n.menuItem:focus-visible {\n background: var(--bg-hover);\n outline: none;\n}\n\n.check {\n width: 1em;\n color: var(--text-secondary);\n}\n\n.hint {\n margin-left: auto;\n padding: 0 var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs, 3px);\n color: var(--text-tertiary);\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n}\n\n.heading {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n gap: 2px;\n min-width: 0;\n}\n\n.title {\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n\n.description {\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n\n.plot {\n position: relative;\n width: 100%;\n min-width: 0;\n}\n\n.table {\n max-height: 360px;\n overflow: auto;\n}\n\n.caveat {\n margin: 0 0 var(--space-3);\n padding: var(--space-2) var(--space-3);\n border-radius: var(--radius-md);\n background: var(--status-unknown-bg);\n color: var(--status-unknown-fg);\n font-size: var(--text-xs-size);\n line-height: var(--text-sm-line);\n}\n\n.state {\n margin: 0;\n padding: var(--space-6) var(--space-3);\n text-align: center;\n color: var(--text-tertiary);\n font-size: var(--text-sm-size);\n}\n\n/* The loading skeleton sits exactly where the plot will. */\n.loading {\n position: relative;\n width: 100%;\n min-width: 0;\n}\n\n.dark {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n align-items: center;\n}\n\n.darkTitle {\n margin: 0;\n color: var(--text-secondary);\n font-weight: var(--font-weight-semibold);\n}\n\n.darkBody {\n margin: 0;\n font-size: var(--text-xs-size);\n max-width: 44ch;\n}\n\n.unknown {\n color: var(--status-unknown-fg);\n}\n","/**\n * components/charts/ChartFrame.tsx — the shell every V3.10 chart renders in:\n * title + description, an honest caveat, the Table twin (the WCAG-clean view,\n * reachable without hovering anything), and the designed non-ready states. A\n * chart never draws empty axes: it says what the emptiness means.\n *\n * loading — the previous render is held when there is one (no skeleton\n * flash on refetch); otherwise a skeleton in the chart's own\n * shape and height (`skeleton`), so the card does not jump\n * when the data lands, announced as \"Loading…\".\n * empty — \"No runs in this window.\" A genuine, known zero.\n * dark — \"Fleet dark since Sep 1\": nothing has happened since a date.\n * unknown — the source could not be read. Never drawn as zeros.\n *\n * V3.10 (SPEC-310C §6 \"Table toggle: moves into ⋯\"): the Chart | Table\n * segmented control used to sit beside every title — noise on a KPI-sized\n * card, and it wrapped against long titles (\"Memo hit rate\"). It is now a\n * quiet ⋯ menu button (still a real, labelled button: the table stays one\n * Tab + Enter away) plus the `T` key anywhere inside the card, which is the\n * `chart.table` command in routes/verse/shell/command-catalog.ts. The key is\n * matched here directly rather than through the catalog so this shared kit\n * (also used by the legacy console) never imports a route module; the chart\n * tests assert the two stay the same key.\n */\nimport { useCallback, useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from 'react';\nimport { ChartSkeleton, MoreGlyph, type ChartSkeletonShape } from './ChartParts.js';\nimport { formatDayLabel, formatTimeLabel } from './format.js';\nimport './chart-tokens.css';\nimport styles from './ChartFrame.module.css';\n\nexport type ChartStatus =\n | { kind: 'ready' }\n | { kind: 'loading' }\n | { kind: 'empty'; message?: string }\n | { kind: 'dark'; since: string; subject?: string; detail?: string }\n | { kind: 'unknown'; reason?: string };\n\nexport type ChartView = 'chart' | 'table';\n\n/** The key that flips a focused chart card between plot and table (catalog `chart.table`). */\nexport const CHART_TABLE_KEY = 't';\n\nexport interface ChartFrameProps {\n title: string;\n description?: string;\n caveat?: string;\n status?: ChartStatus;\n /** Start on the table (e.g. a screen-reader-first surface, or a matrix at 375 px). */\n defaultView?: ChartView;\n /** Hide the view menu (only for a chart that already IS its numbers). */\n hideToggle?: boolean;\n /** Extra header controls (a facet picker), rendered before the ⋯ menu. */\n actions?: ReactNode;\n /** The plot. */\n children: ReactNode;\n table: ReactNode;\n /** Rendered under the plot in chart view (legends, notes). */\n footer?: ReactNode;\n /** The loading placeholder's outline — the chart's own shape (default: line). */\n skeleton?: ChartSkeletonShape;\n /** The loading placeholder's height in px — the plot's own height. */\n skeletonHeight?: number;\n}\n\n/**\n * \"Sep 1\" from a YYYY-MM-DD calendar day (printed as written) or an ISO\n * instant (its day in the VIEWER's zone). The instant used to be cut to its\n * UTC date, so fleet history's `darkSince` — an ISO instant — read \"dark\n * since Sep 26\" on a Sep 25 evening anywhere west of UTC.\n */\nexport function sinceLabel(since: string): string {\n if (/^\\d{4}-\\d{2}-\\d{2}$/.test(since)) return formatDayLabel(since);\n const ms = Date.parse(since);\n return Number.isFinite(ms) ? formatTimeLabel(ms) : formatDayLabel(since.slice(0, 10));\n}\n\nfunction StatusMessage({\n status,\n skeleton,\n skeletonHeight,\n}: {\n status: Exclude<ChartStatus, { kind: 'ready' }>;\n skeleton?: ChartSkeletonShape;\n skeletonHeight?: number;\n}): ReactNode {\n switch (status.kind) {\n case 'loading':\n return (\n <div className={styles.loading} role=\"status\" aria-busy=\"true\">\n <ChartSkeleton shape={skeleton} height={skeletonHeight} />\n <span className=\"visually-hidden\">Loading…</span>\n </div>\n );\n case 'empty':\n return <p className={styles.state}>{status.message ?? 'Nothing happened in this window.'}</p>;\n case 'dark':\n return (\n <div className={`${styles.state} ${styles.dark}`}>\n <p className={styles.darkTitle}>\n {status.subject ?? 'Fleet'} dark since {sinceLabel(status.since)}\n </p>\n <p className={styles.darkBody}>{status.detail ?? 'No runs or proposals have been recorded since then.'}</p>\n </div>\n );\n case 'unknown':\n return (\n <p className={`${styles.state} ${styles.unknown}`} role=\"note\">\n Unknown — {status.reason ?? 'the data source could not be read.'} Nothing is shown rather than a guess.\n </p>\n );\n }\n}\n\n/** True when a key press is typing into a field — never steal it for the T shortcut. */\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n const tag = target.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || target.isContentEditable;\n}\n\nconst VIEW_ITEMS: ReadonlyArray<{ view: ChartView; label: string; hint: string | null }> = [\n { view: 'chart', label: 'Show as chart', hint: null },\n { view: 'table', label: 'Show as table', hint: 'T' },\n];\n\n/**\n * The ⋯ menu: a menu button (WAI-ARIA menu-button pattern) with two\n * menuitemradio entries. Arrow keys move, Enter / Space pick, Escape and Tab\n * close; focus returns to the button on every close so the keyboard user is\n * never dropped at the top of the document.\n */\nfunction ViewMenu({ title, view, onPick }: { title: string; view: ChartView; onPick: (view: ChartView) => void }) {\n const [open, setOpen] = useState(false);\n const [active, setActive] = useState(0);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const menuId = useId();\n\n const close = useCallback((refocus: boolean) => {\n setOpen(false);\n if (refocus) buttonRef.current?.focus();\n }, []);\n\n useEffect(() => {\n if (!open) return undefined;\n const onDown = (e: PointerEvent): void => {\n const t = e.target as Node | null;\n if (t && (menuRef.current?.contains(t) || buttonRef.current?.contains(t))) return;\n setOpen(false);\n };\n document.addEventListener('pointerdown', onDown);\n return () => document.removeEventListener('pointerdown', onDown);\n }, [open]);\n\n useEffect(() => {\n if (!open) return;\n menuRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitemradio\"]')[active]?.focus();\n }, [open, active]);\n\n function openAt(index: number): void {\n setActive(index);\n setOpen(true);\n }\n\n function onButtonKey(e: KeyboardEvent<HTMLButtonElement>): void {\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n openAt(e.key === 'ArrowUp' ? VIEW_ITEMS.length - 1 : 0);\n }\n }\n\n function onMenuKey(e: KeyboardEvent<HTMLDivElement>): void {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setActive((a) => (a + 1) % VIEW_ITEMS.length);\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setActive((a) => (a - 1 + VIEW_ITEMS.length) % VIEW_ITEMS.length);\n } else if (e.key === 'Home') {\n e.preventDefault();\n setActive(0);\n } else if (e.key === 'End') {\n e.preventDefault();\n setActive(VIEW_ITEMS.length - 1);\n } else if (e.key === 'Escape') {\n e.preventDefault();\n e.stopPropagation();\n close(true);\n } else if (e.key === 'Tab') {\n close(false);\n }\n }\n\n return (\n <span className={styles.menuWrap}>\n <button\n ref={buttonRef}\n type=\"button\"\n className={styles.more}\n aria-label={`${title}: view options`}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n title=\"View options (T toggles the table)\"\n onClick={() => (open ? close(false) : openAt(Math.max(0, VIEW_ITEMS.findIndex((i) => i.view === view))))}\n onKeyDown={onButtonKey}\n >\n <MoreGlyph />\n </button>\n {open ? (\n <div ref={menuRef} id={menuId} role=\"menu\" aria-label={`${title} view`} className={styles.menu} onKeyDown={onMenuKey}>\n {VIEW_ITEMS.map((item, i) => (\n <button\n key={item.view}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={view === item.view}\n tabIndex={i === active ? 0 : -1}\n className={styles.menuItem}\n onClick={() => {\n onPick(item.view);\n close(true);\n }}\n >\n <span className={styles.check} aria-hidden=\"true\">{view === item.view ? '✓' : ''}</span>\n <span>{item.label}</span>\n {item.hint ? <kbd className={styles.hint}>{item.hint}</kbd> : null}\n </button>\n ))}\n </div>\n ) : null}\n </span>\n );\n}\n\nexport function ChartFrame({\n title,\n description,\n caveat,\n status = { kind: 'ready' },\n defaultView = 'chart',\n hideToggle = false,\n actions,\n children,\n table,\n footer,\n skeleton,\n skeletonHeight,\n}: ChartFrameProps) {\n const [view, setView] = useState<ChartView>(defaultView);\n const titleId = useId();\n const ready = status.kind === 'ready';\n const canToggle = ready && !hideToggle;\n\n function onKeyDown(e: KeyboardEvent<HTMLElement>): void {\n if (!canToggle || e.defaultPrevented) return;\n if (e.metaKey || e.ctrlKey || e.altKey || e.shiftKey) return;\n if (e.key.toLowerCase() !== CHART_TABLE_KEY || isEditableTarget(e.target)) return;\n e.preventDefault();\n setView((v) => (v === 'chart' ? 'table' : 'chart'));\n }\n\n return (\n <figure className={styles.frame} aria-labelledby={titleId} data-chart-card=\"\" data-view={view} onKeyDown={onKeyDown}>\n <figcaption className={styles.header}>\n <span className={styles.heading}>\n <span id={titleId} className={styles.title}>{title}</span>\n {description ? <span className={styles.description}>{description}</span> : null}\n </span>\n {actions || canToggle ? (\n <span className={styles.actions}>\n {actions}\n {canToggle ? <ViewMenu title={title} view={view} onPick={setView} /> : null}\n </span>\n ) : null}\n </figcaption>\n {caveat ? (\n <p className={styles.caveat} role=\"note\">\n {caveat}\n </p>\n ) : null}\n {!ready ? (\n <StatusMessage status={status} skeleton={skeleton} skeletonHeight={skeletonHeight} />\n ) : view === 'table' ? (\n <div className={styles.table}>{table}</div>\n ) : (\n <>\n <div className={styles.plot}>{children}</div>\n {footer}\n </>\n )}\n </figure>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-_izD07R9.js";import{d as r,l as i,t as a}from"./global-CYfRwH6t.js";import{t as o}from"./MutationTokenDialog-T3r9EtHi.js";import{i as s}from"./SkipToContent-B0GAKhYQ.js";import{t as c}from"./ProviderLogo-DIfJXNWf.js";import{Bt as l}from"./VerseConsoleApp-DO84Xscn.js";import{A as u,M as d,b as f,c as p,j as m,l as h,s as g}from"./verse-model-DAOz9LrY.js";import{p as _}from"./format-V6IiIMAL.js";import{a as v,c as ee,d as te,l as ne,u as re}from"./context-queries-D0Aydl5L.js";import{T as y,f as b,t as x,v as S,w as ie}from"./context-model-CKXUZd0O.js";import{_ as ae,a as oe,i as se,k as ce,l as C,m as le,n as w,r as ue,v as T,w as de,x as fe}from"./context-model-DYkDKK6C.js";import{d as pe,p as E,u as D}from"./workspace-model-C-q_I8xN.js";import{s as O}from"./tool-semantics-DtFU7rvB.js";import{n as k}from"./path-display-C6BmdnBS.js";import{t as A}from"./LiveTimer-DUgUBr49.js";import{a as j}from"./command-catalog-COH2G2xv.js";import{currentTurnTasks as M}from"./tasks-model-CbmPgWL8.js";import{n as me,t as N}from"./use-token-gate-DgnO9fbv.js";import{t as P}from"./useVerseTranscript-CvUqjRmZ.js";import{t as he}from"./Switch-mvc9lQcT.js";import{n as F}from"./chat-pane-data-5MDEsLff.js";import{t as I}from"./context.module-BijAfoJw.js";import{a as L}from"./ChatSection-Cc6sudpF.js";var R=e(n(),1),z={usage:`_usage_1xfeo_5`,muted:`_muted_1xfeo_21`,subTitle:`_subTitle_1xfeo_23`,idleWarn:`_idleWarn_1xfeo_35`},B=t();function V({session:e,seats:t,events:n,now:r}){let i=e.usage,a=ie(e,t),o=y(n??[]),s=i.inputTokens+i.cacheReadTokens+i.cacheCreationTokens,c=S(i),l=e.compactionCount??o.compactions,f=b(e,a.tokens,r,d(n??[])),p=a.exact?``:`≤`,v=o.exact?``:`≤`;return(0,B.jsxs)(B.Fragment,{children:[(0,B.jsxs)(`dl`,{className:z.usage,children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Input`}),(0,B.jsx)(`dd`,{children:m(i.inputTokens)})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Output`}),(0,B.jsx)(`dd`,{children:m(i.outputTokens)})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Cache read`}),(0,B.jsx)(`dd`,{children:m(i.cacheReadTokens)})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Cache write`}),(0,B.jsx)(`dd`,{children:m(i.cacheCreationTokens)})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Turns`}),(0,B.jsx)(`dd`,{children:e.turnCount})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Context`}),(0,B.jsxs)(`dd`,{title:a.exact?void 0:`An upper bound: the CLI reported only the turn total, which sums every call.`,children:[p,m(a.tokens),a.window===null?``:` / ${g(a.window)}`]})]})]}),(0,B.jsx)(`h4`,{className:z.subTitle,children:`Efficiency`}),(0,B.jsxs)(`dl`,{className:z.usage,"aria-label":`Context efficiency`,children:[(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Cache hit`}),(0,B.jsx)(`dd`,{title:`Share of prompt tokens served from the provider's cache: cache read ÷ (input + cache read + cache write).`,children:c===null?s>0?`none reported`:`—`:_(c)})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Compactions`}),(0,B.jsx)(`dd`,{children:l})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Avg context / turn`}),(0,B.jsx)(`dd`,{children:o.average===null?`—`:`${v}${m(o.average)}`})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Peak context`}),(0,B.jsx)(`dd`,{children:o.peak===null?`—`:`${v}${m(o.peak)}`})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Mode`}),(0,B.jsx)(`dd`,{children:x[a.mode]})]}),(0,B.jsxs)(`div`,{children:[(0,B.jsx)(`dt`,{children:`Compacts at`}),(0,B.jsx)(`dd`,{children:a.autoCompactAt===null?`—`:`≈${m(a.autoCompactAt)}`})]})]}),(0,B.jsxs)(`p`,{className:z.muted,children:[a.source===null?a.window===null?`Window unknown for this chat.`:`Window as stored when this chat was created; how it was known was not recorded.`:`Window ${u(a.source,e.engine)}.`,o.turns>0&&!o.exact?` Figures marked ≤ are upper bounds: the CLI reported only turn totals.`:``]}),(0,B.jsx)(`p`,{className:z.muted,children:e.memoryEnabled===!0?e.engine===`local`?`Shared project memory was given to this chat’s agent when it started.`:`Shared project memory was given to this chat’s agent when it started: a block of up to ${w/1024} KB in its system prompt, re-sent every turn (cached after the first), plus the agent’s own reads and updates of MEMORY.md — a little of this seat’s usage.`:`This chat started without shared project memory.`}),f===null?null:(0,B.jsx)(`p`,{role:`status`,className:z.idleWarn,children:f.local?`Idle for ${h(f.idleMs)}: the local model has likely dropped this chat from its cache, so the next turn re-processes ~${m(f.tokens)} tokens before it replies — time, not spend.`:`Idle for ${h(f.idleMs)}, past the ~1 h prompt-cache lifetime: the next turn likely re-reads ~${m(f.tokens)} tokens uncached, at full price.`})]})}function H({projectPath:e,refreshKey:t}){let n=(0,R.useId)();return e?(0,B.jsx)(U,{projectPath:e,refreshKey:t},e):(0,B.jsxs)(`section`,{className:I.memory,"aria-labelledby":n,children:[(0,B.jsx)(`h3`,{id:n,className:I.memoryHead,children:`Project memory`}),(0,B.jsx)(`p`,{className:I.hint,children:`Open a chat to see the memory its project shares across seats.`})]})}var ge=`Saving writes MEMORY.md for this project. Every seat on it reads this file.`,_e=`Clearing empties MEMORY.md for every chat on this project.`,ve=`This changes whether new chats on this project are given shared memory.`,ye=`This changes whether new chats on ANY project are given shared memory.`;function U({projectPath:e,refreshKey:t}){let n=(0,R.useId)(),c=(0,R.useId)(),l=(0,R.useId)(),u=(0,R.useMemo)(()=>re(e),[e]),d=i(u),p=r(u),m=i(ne),h=me(),g=f(e),[_,y]=(0,R.useState)(`view`),[b,x]=(0,R.useState)(``),[S,ie]=(0,R.useState)(``),[w,pe]=(0,R.useState)(!1),[E,D]=(0,R.useState)(null),[O,k]=(0,R.useState)(null),[A,j]=(0,R.useState)(null),[M,P]=(0,R.useState)(null),F=(0,R.useRef)(null),L=(0,R.useRef)(t);(0,R.useEffect)(()=>{t!==L.current&&(L.current=t,p())},[t,p]),(0,R.useEffect)(()=>{let e=F.current;_===`edit`&&e&&(e.focus(),e.setSelectionRange(e.value.length,e.value.length))},[_]);let[z,V]=(0,R.useState)(null);(0,R.useEffect)(()=>{z!==null&&d.status===`success`&&V(null)},[z,d.status]);let H=z!==null&&d.status!==`success`?z:d.data,U=d.error instanceof a&&d.error.status===404,W=m.data?!m.data.memory.enabled:!1,G=(0,R.useMemo)(()=>de(b),[b]),K=G>ce,q=(0,R.useMemo)(()=>le({projectPath:e,content:b}),[e,b]),J=!K&&q>ue,Y=_===`edit`?fe(b):null,X=_===`edit`&&w?ae(b):0;function Z(e,t){x(e),ie(e),pe(t),D(null),j(null),P(null),y(`edit`)}async function Q(t=!1){if(!O){k(`saving`),j(null);try{let n=await v(e);if(!t&&n.content!==S){D(n);return}let r=await h.run(ge,()=>te(e,b));if(r===null)return;V(r),D(null),y(`view`),P(r.content.length===0?`Saved — MEMORY.md is now empty.`:`Saved.`)}catch(e){j(N(e))}finally{k(null)}}}async function be(){if(!O){k(`clearing`),j(null);try{let t=await h.run(_e,()=>te(e,``));if(t===null)return;V(t),y(`view`),P(`Cleared. Agents start MEMORY.md afresh on their next write.`)}catch(e){j(N(e))}finally{k(null)}}}async function xe(t){if(!O){k(`toggling`),j(null),P(null);try{await h.run(ve,()=>ee({projectPath:e,memoryEnabled:t}))!==null&&P(t?`New chats on ${g} will get shared memory. Chats already open keep what they started with.`:`New chats on ${g} will start without shared memory. The file is kept.`)}catch(e){j(N(e))}finally{k(null)}}}async function $(e){if(!O){k(`toggling`),j(null),P(null);try{await h.run(ye,()=>ee({memoryEnabled:e}))}catch(e){j(N(e))}finally{k(null)}}}let Se=H?W?`off everywhere`:H.enabled?`on`:`off`:null;return(0,B.jsxs)(`section`,{className:I.memory,"aria-labelledby":n,"data-project":e,children:[(0,B.jsxs)(`h3`,{id:n,className:I.memoryHead,children:[(0,B.jsx)(`span`,{children:`Project memory`}),Se?(0,B.jsx)(`span`,{className:I.memoryState,children:Se}):null,U?null:(0,B.jsx)(`button`,{type:`button`,className:I.memoryHeadAction,onClick:p,"aria-label":`Refresh project memory`,children:`Refresh`})]}),(0,B.jsxs)(`p`,{className:I.hint,children:[`One `,(0,B.jsx)(`code`,{children:`MEMORY.md`}),` shared by every chat on `,(0,B.jsx)(`strong`,{title:e,children:g}),`, whichever seat runs it. Agents keep it current — decisions and why, conventions, gotchas, plan status.`]}),U?(0,B.jsxs)(`p`,{className:I.hint,children:[`This server has no project memory yet — update Ashlr and restart `,(0,B.jsx)(`code`,{children:`ashlr verse`}),`.`]}):d.status===`loading`||d.status===`idle`&&!H?(0,B.jsxs)(`div`,{"aria-busy":`true`,children:[(0,B.jsx)(s,{width:`80%`}),(0,B.jsx)(s,{width:`60%`}),(0,B.jsx)(s,{width:`70%`})]}):H?(0,B.jsxs)(B.Fragment,{children:[W?(0,B.jsxs)(`div`,{className:I.field,children:[(0,B.jsx)(`p`,{className:I.hint,children:`Shared memory is off for every project, so new chats start without it.`}),(0,B.jsx)(`div`,{className:I.memoryActions,children:(0,B.jsx)(`button`,{type:`button`,className:`${I.secondary} ${I.small}`,disabled:O!==null,onClick:()=>void $(!0),children:`Turn memory on`})})]}):(0,B.jsx)(he,{checked:H.enabled,disabled:O!==null||!m.data,onChange:e=>void xe(e),label:`Give new chats on ${g} this memory`}),_===`edit`?(0,B.jsxs)(`div`,{className:I.field,children:[(0,B.jsx)(`label`,{className:I.label,htmlFor:c,children:`Edit MEMORY.md`}),(0,B.jsx)(`textarea`,{id:c,ref:F,className:I.textarea,value:b,rows:12,spellCheck:!1,"aria-describedby":l,"aria-invalid":K||J?!0:void 0,onChange:e=>x(e.target.value)}),(0,B.jsxs)(`p`,{id:l,className:`${I.hint} ${I.counter} ${K||J?I.counterOver:``}`,children:[C(G),` of `,C(ce),K?` — over the limit; trim it to save.`:``,J?` — ${C(q)} once line breaks and quotes are encoded for sending, over the ${C(ue)} request limit; trim it to save.`:``]}),Y?(0,B.jsxs)(`p`,{className:I.warn,role:`alert`,children:[`This looks like it contains `,Y,`. MEMORY.md is sent to every seat’s model — remove it before saving.`]}):null,X>0?(0,B.jsxs)(`p`,{className:I.warn,role:`alert`,children:[X===1?`One`:X,` `,(0,B.jsx)(`code`,{children:oe}),` placeholder`,X===1?` stands`:`s stand`,` in for secret-looking text that is still in MEMORY.md. Saving `,X===1?`it`:`them`,` would replace the real value`,X===1?``:`s`,`, so Save stays off until `,X===1?`it is`:`they are`,` gone. Deleting a placeholder drops that value from the file; to keep it, edit MEMORY.md directly under `,(0,B.jsx)(`code`,{children:`~/.ashlr/verse/memory`}),`.`]}):w?(0,B.jsxs)(`p`,{className:I.hint,children:[`This copy was sanitized for the browser, so a home-folder path appears as `,(0,B.jsx)(`code`,{children:`~`}),`. Saving writes the text as shown; `,(0,B.jsx)(`code`,{children:`~`}),` names the same folder for every reader.`]}):null,E?(0,B.jsxs)(`div`,{className:I.warn,role:`alert`,children:[(0,B.jsxs)(`p`,{className:I.hint,children:[`An agent changed MEMORY.md while you were editing`,T(E.updatedAt)?` (${T(E.updatedAt)})`:``,`.`]}),(0,B.jsxs)(`div`,{className:I.memoryActions,children:[(0,B.jsx)(`button`,{type:`button`,className:`${I.secondary} ${I.small}`,disabled:O!==null||X>0,onClick:()=>void Q(!0),children:`Overwrite with mine`}),(0,B.jsx)(`button`,{type:`button`,className:`${I.cancel} ${I.small}`,disabled:O!==null,onClick:()=>Z(E.content,E.contentSanitized===!0),children:`Start over from theirs`})]})]}):null,(0,B.jsxs)(`div`,{className:I.memoryActions,children:[(0,B.jsx)(`button`,{type:`button`,className:`${I.primary} ${I.small}`,disabled:O!==null||K||J||b===S||E!==null||X>0,onClick:()=>void Q(!1),children:O===`saving`?`Saving…`:`Save`}),(0,B.jsx)(`button`,{type:`button`,className:`${I.cancel} ${I.small}`,disabled:O===`saving`,onClick:()=>{y(`view`),D(null),j(null)},children:`Cancel`})]})]}):H.content.length===0?(0,B.jsxs)(`div`,{className:I.field,children:[(0,B.jsx)(`p`,{className:I.hint,children:`MEMORY.md is empty. Agents add to it as they work, or write the first entries yourself.`}),(0,B.jsx)(`div`,{className:I.memoryActions,children:(0,B.jsx)(`button`,{type:`button`,className:`${I.secondary} ${I.small}`,onClick:()=>Z(``,!1),children:`Write it`})})]}):(0,B.jsxs)(`div`,{className:I.field,children:[(0,B.jsx)(`pre`,{className:I.memoryBody,tabIndex:0,"aria-label":`MEMORY.md for ${g}`,children:H.content}),(0,B.jsxs)(`p`,{className:`${I.hint} ${I.memoryMeta}`,children:[(0,B.jsx)(`span`,{children:C(H.bytes)}),T(H.updatedAt)?(0,B.jsxs)(`span`,{children:[`updated `,T(H.updatedAt)]}):null]}),H.contentSanitized?(0,B.jsxs)(`p`,{className:I.hint,children:[`Shown sanitized for the browser: a home-folder path appears as `,(0,B.jsx)(`code`,{children:`~`}),` and secret-looking text as`,` `,(0,B.jsx)(`code`,{children:oe}),`.`,ae(H.content)>0?` The real values are still in the file.`:``]}):null,_===`confirm-clear`?(0,B.jsxs)(`div`,{className:I.warn,role:`alert`,children:[(0,B.jsxs)(`p`,{className:I.hint,children:[`Clear MEMORY.md for `,g,`? Every chat on this project loses what it says. Other files in the folder stay.`]}),(0,B.jsxs)(`div`,{className:I.memoryActions,children:[(0,B.jsx)(`button`,{type:`button`,className:`${I.secondary} ${I.small} ${I.danger}`,disabled:O!==null,onClick:()=>void be(),children:O===`clearing`?`Clearing…`:`Clear it`}),(0,B.jsx)(`button`,{type:`button`,className:`${I.cancel} ${I.small}`,onClick:()=>y(`view`),children:`Keep`})]})]}):(0,B.jsxs)(`div`,{className:I.memoryActions,children:[(0,B.jsx)(`button`,{type:`button`,className:`${I.secondary} ${I.small}`,onClick:()=>Z(H.content,H.contentSanitized===!0),children:`Edit`}),(0,B.jsx)(`button`,{type:`button`,className:`${I.cancel} ${I.small}`,onClick:()=>{P(null),y(`confirm-clear`)},children:`Clear…`})]})]}),H.files.length>0?(0,B.jsxs)(`div`,{className:I.field,children:[(0,B.jsx)(`span`,{className:I.label,children:`Also in this folder`}),(0,B.jsx)(`ul`,{className:I.memoryFiles,children:H.files.map(e=>(0,B.jsx)(`li`,{children:(0,B.jsx)(`code`,{children:e})},e))})]}):null,M?(0,B.jsx)(`p`,{className:I.hint,role:`status`,children:M}):null,A?(0,B.jsx)(`p`,{className:I.error,role:`alert`,children:A}):null,(0,B.jsxs)(`details`,{children:[(0,B.jsx)(`summary`,{className:I.hint,children:`How project memory works`}),(0,B.jsxs)(`div`,{className:I.field,children:[(0,B.jsx)(`p`,{className:I.hint,children:`Claude, Codex and local seats can read and edit the file. Grok’s CLI can reach only its working folder, so a Grok seat is given the text and can only read it.`}),(0,B.jsx)(`p`,{className:I.hint,children:`A chat copies the memory into its instructions when it starts, so every turn re-sends the same prefix and the provider’s prompt cache keeps working. Chats already open see your edits when they next read the file; the switch above applies to new chats.`}),(0,B.jsxs)(`p`,{className:I.hint,children:[`It lives on this machine under `,(0,B.jsx)(`code`,{children:`~/.ashlr/verse/memory`}),`, readable only by you. It is sent to every seat’s model, so never put secrets in it.`]}),(0,B.jsx)(`p`,{className:I.hint,children:se}),W?null:(0,B.jsxs)(`p`,{className:I.hint,children:[`Memory is on for every project unless switched off per project.`,` `,(0,B.jsx)(`button`,{type:`button`,className:I.link,disabled:O!==null,onClick:()=>void $(!1),children:`Turn it off for every project`})]})]})]})]}):(0,B.jsxs)(`div`,{className:I.searchError,role:`alert`,children:[(0,B.jsxs)(`span`,{children:[`Could not read this project’s memory: `,N(d.error)]}),(0,B.jsx)(`button`,{type:`button`,className:`${I.secondary} ${I.small}`,onClick:p,children:`Retry`})]}),(0,B.jsx)(o,{open:h.dialog.open,reason:h.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:h.dialog.onClose,onUnlocked:h.dialog.onUnlocked})]})}var W={roots:`_roots_afeac_8`,title:`_title_afeac_10`,count:`_count_afeac_22`,workspace:`_workspace_afeac_30`,list:`_list_afeac_36`,root:`_root_afeac_8`,rootHead:`_rootHead_afeac_57`,name:`_name_afeac_64`,badge:`_badge_afeac_72`,path:`_path_afeac_84`,git:`_git_afeac_97`,remote:`_remote_afeac_98`,caveat:`_caveat_afeac_99`,note:`_note_afeac_116`,error:`_error_afeac_117`};function G({session:e,data:t,error:n=null}){return!e||t!==null&&t.roots.length<=1&&t.workspaceId===null?null:(0,B.jsxs)(`section`,{className:W.roots,"aria-labelledby":`verse-res-roots`,children:[(0,B.jsxs)(`h3`,{id:`verse-res-roots`,className:W.title,children:[`Folders`,t?(0,B.jsx)(`span`,{className:W.count,children:t.roots.length}):null]}),t?.workspaceName?(0,B.jsxs)(`p`,{className:W.workspace,children:[`Workspace `,(0,B.jsx)(`strong`,{children:t.workspaceName})]}):null,n?(0,B.jsx)(`p`,{role:`alert`,className:W.error,children:n}):null,(0,B.jsx)(`ul`,{className:W.list,children:(t?.roots??[]).map(e=>{let t=pe(e),n=D(e);return(0,B.jsxs)(`li`,{className:W.root,"data-tone":E(e),children:[(0,B.jsxs)(`div`,{className:W.rootHead,children:[(0,B.jsx)(`span`,{className:W.name,children:e.name}),(0,B.jsx)(`span`,{className:W.badge,children:e.primary?`primary`:`added`})]}),(0,B.jsx)(`p`,{className:W.path,title:e.path,children:k(e.path)}),(0,B.jsx)(`p`,{className:W.git,children:t??`not a git repo`}),e.git?.remote?(0,B.jsx)(`p`,{className:W.remote,children:e.git.remote}):null,n?(0,B.jsx)(`p`,{className:W.caveat,children:n}):null]},e.path)})}),(t?.notes??[]).map(e=>(0,B.jsx)(`p`,{className:W.note,children:e},e))]})}var K={pane:`_pane_1gw6a_6`,section:`_section_1gw6a_13`,sectionTitle:`_sectionTitle_1gw6a_19`,count:`_count_1gw6a_31`,muted:`_muted_1gw6a_37`,action:`_action_1gw6a_43`,hint:`_hint_1gw6a_46`,reserve:`_reserve_1gw6a_54`,link:`_link_1gw6a_73`,task:`_task_1gw6a_74`,taskList:`_taskList_1gw6a_88`,taskMark:`_taskMark_1gw6a_113`,"pane-pulse":`_pane-pulse_1gw6a_1`,taskName:`_taskName_1gw6a_125`,taskDetail:`_taskDetail_1gw6a_134`,taskTime:`_taskTime_1gw6a_142`,engineTick:`_engineTick_1gw6a_152`},q=3e4;function J(e){let[t,n]=(0,R.useState)(()=>Date.now());return(0,R.useEffect)(()=>{if(!e)return;n(Date.now());let t=setInterval(()=>n(Date.now()),q);return()=>clearInterval(t)},[e]),t}function Y({session:e,seats:t,events:n,roots:r,rootsError:i,onHandoff:a,handoffDisabledReason:o=null,onOpenAccounts:s,visible:c}){let l=J(c&&e!==null);return(0,B.jsxs)(`div`,{className:K.pane,"aria-label":`Context`,children:[(0,B.jsxs)(`section`,{className:K.section,"aria-labelledby":`dock-context-chat`,children:[(0,B.jsx)(`h3`,{id:`dock-context-chat`,className:K.sectionTitle,children:`This chat`}),e?(0,B.jsx)(V,{session:e,seats:t,events:n,now:l}):(0,B.jsx)(`p`,{className:K.muted,children:`Open a chat to see its usage and context.`})]}),e?(0,B.jsx)(`div`,{className:K.section,children:(0,B.jsx)(G,{session:e,data:r,error:i})}):null,e&&a?(0,B.jsxs)(`section`,{className:K.section,"aria-labelledby":`dock-context-handoff`,children:[(0,B.jsx)(`h3`,{id:`dock-context-handoff`,className:K.sectionTitle,children:`Handoff`}),(0,B.jsx)(`p`,{className:K.muted,children:`Verse drafts a note from this chat's log — free — and opens a fresh chat with it in the message box. Nothing is sent until you press Send.`}),(0,B.jsx)(`button`,{type:`button`,className:K.action,onClick:a,disabled:o!==null,title:o??void 0,children:`Continue in a fresh chat…`}),(0,B.jsx)(`p`,{className:`${K.muted} ${K.reserve}`,children:o??``})]}):null,(0,B.jsx)(`div`,{className:K.section,children:(0,B.jsx)(H,{projectPath:e?.projectPath??null,refreshKey:e?.turnCount??0})}),(0,B.jsx)(`div`,{className:K.section,children:(0,B.jsx)(`button`,{type:`button`,className:K.link,onClick:s,children:`Accounts & capacity →`})})]})}var X=20,Z={running:`running`,done:`done`,failed:`failed`};function Q({turnTasks:e,otherChats:t,hasSession:n,onOpenSession:r}){let i=j(`chat.new`)?.keys[0],a=i?l(i):null,o=e.filter(e=>e.status===`running`),s=e.filter(e=>e.status!==`running`).slice(0,X);return(0,B.jsxs)(`div`,{className:K.pane,"aria-label":`Tasks`,children:[(0,B.jsxs)(`section`,{className:K.section,"aria-labelledby":`dock-tasks-turn`,children:[(0,B.jsxs)(`h3`,{id:`dock-tasks-turn`,className:K.sectionTitle,children:[`This chat `,(0,B.jsx)(`span`,{className:K.count,children:o.length>0?`${o.length} running`:``})]}),n?e.length===0?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`p`,{className:K.muted,children:`No tool calls in the latest turn.`}),(0,B.jsx)(`p`,{className:K.hint,children:`Send a message: each tool the agent runs shows up here, and a click jumps to it in the chat.`})]}):(0,B.jsx)(`ul`,{className:K.taskList,children:[...o,...s].map(e=>(0,B.jsx)(`li`,{children:(0,B.jsxs)(`button`,{type:`button`,className:K.task,"data-status":e.status,onClick:()=>{L(O(e.toolUseId))},"aria-label":`${e.kind===`subagent`?`Subagent`:e.name}: ${e.detail}, ${Z[e.status]}. Jump to it in the chat.`,children:[(0,B.jsx)(`span`,{className:K.taskMark,"data-status":e.status,"aria-hidden":`true`}),(0,B.jsx)(`span`,{className:K.taskName,title:e.kind===`subagent`?`Subagent`:e.name,children:e.kind===`subagent`?`Subagent`:e.name}),(0,B.jsx)(`span`,{className:K.taskDetail,title:e.detail,children:e.detail}),(0,B.jsx)(`span`,{className:K.taskTime,children:e.status===`running`?(0,B.jsx)(A,{since:e.startedAt}):e.status===`failed`?`failed`:e.durationMs!==null&&e.durationMs>0?p(e.durationMs):`done`})]})},e.toolUseId))}):(0,B.jsx)(`p`,{className:K.muted,children:`Open a chat to see its tool calls here.`})]}),(0,B.jsxs)(`section`,{className:K.section,"aria-labelledby":`dock-tasks-chats`,children:[(0,B.jsxs)(`h3`,{id:`dock-tasks-chats`,className:K.sectionTitle,children:[`Other chats `,(0,B.jsx)(`span`,{className:K.count,children:t.length>0?`${t.length} running`:``})]}),t.length===0?(0,B.jsxs)(B.Fragment,{children:[(0,B.jsx)(`p`,{className:K.muted,children:`No other chat is running.`}),(0,B.jsxs)(`p`,{className:K.hint,children:[a?`Start another with ${a}`:`Start another chat`,` and it shows here while it works, one click away.`]})]}):(0,B.jsx)(`ul`,{className:K.taskList,children:t.map(e=>(0,B.jsx)(`li`,{children:(0,B.jsxs)(`button`,{type:`button`,className:K.task,"data-status":`running`,onClick:()=>r(e.sessionId),"aria-label":`${e.title||`Untitled chat`}, running${e.live?`: ${e.live}`:``}. Open this chat.`,children:[(0,B.jsx)(be,{engine:e.engine}),(0,B.jsx)(`span`,{className:K.taskName,title:e.title||`Untitled chat`,children:e.title||`Untitled chat`}),(0,B.jsx)(`span`,{className:K.taskDetail,title:e.live??void 0,children:e.live??``}),(0,B.jsx)(`span`,{className:K.taskTime,children:e.startedAt?(0,B.jsx)(A,{since:e.startedAt}):`running`})]})},e.sessionId))})]})]})}function be({engine:e}){return(0,B.jsx)(`span`,{className:K.engineTick,"data-engine":e,"aria-hidden":`true`,children:(0,B.jsx)(c,{engine:e,size:12})})}function xe({sessionId:e,host:t}){let{otherRunning:n}=F(),r=P(e),i=(0,R.useMemo)(()=>M(r.items),[r.items]);return(0,B.jsx)(Q,{turnTasks:i,otherChats:n,hasSession:e!==null,onOpenSession:t.openSession})}function $({session:e,events:t,visible:n}){let{seats:r,rootsData:i,rootsError:a,dispatchEnabled:o,onHandoff:s,onOpenAccounts:c}=F(),l=o?e?.status===`running`?`Available when the current turn finishes.`:null:`Sending is disabled on this server.`;return(0,B.jsx)(Y,{session:e,seats:r,events:t,roots:i,rootsError:a,visible:n,onHandoff:e?()=>s(e.id):void 0,handoffDisabledReason:l,onOpenAccounts:c})}export{$ as ContextPaneBody,xe as TasksPaneBody};
2
+ //# sourceMappingURL=ChatPanes-CicgTVpN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ChatPanes-CicgTVpN.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/context/ChatUsage.module.css","../../../../../../src/web-ui/routes/verse/context/ChatUsage.tsx","../../../../../../src/web-ui/routes/verse/context/MemoryPanel.tsx","../../../../../../src/web-ui/routes/verse/SessionRoots.module.css","../../../../../../src/web-ui/routes/verse/SessionRoots.tsx","../../../../../../src/web-ui/routes/verse/dock/panes.module.css","../../../../../../src/web-ui/routes/verse/dock/ContextPane.tsx","../../../../../../src/web-ui/routes/verse/dock/TasksPane.tsx","../../../../../../src/web-ui/routes/verse/panes/builtin/ChatPanes.tsx"],"sourcesContent":["/**\n * context/ChatUsage.module.css — the figure grid for one chat's usage and\n * context efficiency (moved with ChatUsage from ResourcesPanel in 3.10).\n */\n.usage { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2) var(--space-4); margin: 0; }\n.usage > div { display: flex; flex-direction: column; gap: 1px; min-width: 0; }\n.usage dt {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.usage dd {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-sm-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-primary);\n}\n.usage + .muted { margin-top: var(--space-2); }\n.usage + .muted + .muted { margin-top: var(--space-1); }\n.subTitle {\n margin: var(--space-3) 0 var(--space-2);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-regular);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.muted { color: var(--text-tertiary); font-size: var(--text-xs-size); line-height: var(--text-xs-line); }\n/* Idle past the prompt-cache lifetime. A status, in words, on the warning\n hairline — the colour repeats the sentence, it never replaces it. */\n.idleWarn {\n margin-top: var(--space-2);\n padding-left: var(--space-2);\n border-left: 2px solid var(--status-warning-solid);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--status-warning-fg);\n}\n","/**\n * routes/verse/context/ChatUsage.tsx — the open chat's usage and context\n * efficiency (moved out of ResourcesPanel in 3.10, unit C2).\n *\n * The resources column is gone: accounts and seat capacity moved to Apps &\n * Accounts (C6), and what was about THIS CHAT moved into the dock's Context\n * pane. This block came with it unchanged — every figure is still derived\n * from the session record and its own event log, with no request and no\n * spend, and every number the CLI did not report still reads \"—\" or \"≤\".\n */\nimport type { VerseEvent, VerseSeat, VerseSession } from '../../../data/api-types.js';\nimport { MEMORY_BLOCK_MAX_BYTES } from './context-model.js';\nimport {\n CONTEXT_MODE_LABEL,\n idleCacheWarning,\n reportedCacheHitRatio,\n sessionContext,\n turnContextStats,\n} from '../usage/context-model.js';\nimport { formatContextWindow, formatElapsed, windowSourceText } from '../verse-model.js';\nimport { formatWholePercent } from '../autonomy/format.js';\nimport { formatTokens, lastTurnActivityAt } from '../verse-readouts.js';\nimport styles from './ChatUsage.module.css';\n\n/**\n * The open chat's usage and context efficiency. Every figure is derived from\n * the session record and its own event log — no request, no spend.\n */\nexport function ChatUsage({\n session,\n seats,\n events,\n now,\n}: {\n session: VerseSession;\n seats: readonly VerseSeat[];\n events: readonly VerseEvent[] | undefined;\n now: number;\n}) {\n const usage = session.usage;\n const ctx = sessionContext(session, seats);\n const stats = turnContextStats(events ?? []);\n const promptTokens = usage.inputTokens + usage.cacheReadTokens + usage.cacheCreationTokens;\n const hit = reportedCacheHitRatio(usage);\n // The record's count is the durable one (a long log may be truncated); the\n // log's own count stands in only when the record predates the field.\n const compactions = session.compactionCount ?? stats.compactions;\n const idle = idleCacheWarning(session, ctx.tokens, now, lastTurnActivityAt(events ?? []));\n const bound = ctx.exact ? '' : '≤';\n const statBound = stats.exact ? '' : '≤';\n\n return (\n <>\n <dl className={styles.usage}>\n <div><dt>Input</dt><dd>{formatTokens(usage.inputTokens)}</dd></div>\n <div><dt>Output</dt><dd>{formatTokens(usage.outputTokens)}</dd></div>\n <div><dt>Cache read</dt><dd>{formatTokens(usage.cacheReadTokens)}</dd></div>\n <div><dt>Cache write</dt><dd>{formatTokens(usage.cacheCreationTokens)}</dd></div>\n <div><dt>Turns</dt><dd>{session.turnCount}</dd></div>\n <div>\n <dt>Context</dt>\n <dd title={ctx.exact ? undefined : 'An upper bound: the CLI reported only the turn total, which sums every call.'}>\n {bound}{formatTokens(ctx.tokens)}{ctx.window === null ? '' : ` / ${formatContextWindow(ctx.window)}`}\n </dd>\n </div>\n </dl>\n\n <h4 className={styles.subTitle}>Efficiency</h4>\n <dl className={styles.usage} aria-label=\"Context efficiency\">\n <div>\n <dt>Cache hit</dt>\n <dd title=\"Share of prompt tokens served from the provider's cache: cache read ÷ (input + cache read + cache write).\">\n {/* Whole percent, \"<1%\" for a sliver — never \"0%\" beside real cache reads. */}\n {hit !== null ? formatWholePercent(hit) : promptTokens > 0 ? 'none reported' : '—'}\n </dd>\n </div>\n <div><dt>Compactions</dt><dd>{compactions}</dd></div>\n <div>\n <dt>Avg context / turn</dt>\n <dd>{stats.average === null ? '—' : `${statBound}${formatTokens(stats.average)}`}</dd>\n </div>\n <div>\n <dt>Peak context</dt>\n <dd>{stats.peak === null ? '—' : `${statBound}${formatTokens(stats.peak)}`}</dd>\n </div>\n <div><dt>Mode</dt><dd>{CONTEXT_MODE_LABEL[ctx.mode]}</dd></div>\n <div>\n <dt>Compacts at</dt>\n <dd>{ctx.autoCompactAt === null ? '—' : `≈${formatTokens(ctx.autoCompactAt)}`}</dd>\n </div>\n </dl>\n <p className={styles.muted}>\n {ctx.source !== null\n ? `Window ${windowSourceText(ctx.source, session.engine)}.`\n : ctx.window !== null\n ? 'Window as stored when this chat was created; how it was known was not recorded.'\n : 'Window unknown for this chat.'}\n {stats.turns > 0 && !stats.exact ? ' Figures marked ≤ are upper bounds: the CLI reported only turn totals.' : ''}\n </p>\n {/* Pinned per chat at creation, like its roots: the memory panel below\n edits the PROJECT's file, not what this conversation was offered.\n On a paid seat memory is not free — its block rides in the system\n prompt of every turn — so the sentence says what it adds rather than\n leaving the operator to assume it costs nothing. */}\n <p className={styles.muted}>\n {session.memoryEnabled !== true\n ? 'This chat started without shared project memory.'\n : session.engine === 'local'\n ? 'Shared project memory was given to this chat’s agent when it started.'\n : `Shared project memory was given to this chat’s agent when it started: a block of up to ${MEMORY_BLOCK_MAX_BYTES / 1024} KB in its system prompt, re-sent every turn (cached after the first), plus the agent’s own reads and updates of MEMORY.md — a little of this seat’s usage.`}\n </p>\n {idle === null ? null : (\n <p role=\"status\" className={styles.idleWarn}>\n {idle.local\n ? `Idle for ${formatElapsed(idle.idleMs)}: the local model has likely dropped this chat from its cache, so the next turn re-processes ~${formatTokens(idle.tokens)} tokens before it replies — time, not spend.`\n : `Idle for ${formatElapsed(idle.idleMs)}, past the ~1 h prompt-cache lifetime: the next turn likely re-reads ~${formatTokens(idle.tokens)} tokens uncached, at full price.`}\n </p>\n )}\n </>\n );\n}\n","/**\n * routes/verse/context/MemoryPanel.tsx — shared project memory, as a section\n * of the resources panel.\n *\n * Every seat on a project — Claude, Codex, Grok, local, any account — is\n * pointed at ONE Verse-owned `MEMORY.md` for that project\n * (`~/.ashlr/verse/memory/<project>-<hash>/`). The agents keep it current;\n * this panel is where the operator sees what they wrote, corrects it, clears\n * it, or turns it off for the project.\n *\n * Three facts are stated rather than implied, because each one changes what\n * the operator should do:\n *\n * - SCOPE. The file is per PROJECT, shared across seats and accounts — not\n * per chat. Clearing it clears it for every chat on the project.\n * - WHO CAN WRITE. Claude, Codex and local seats are given the directory;\n * Grok's CLI can reach only its cwd, so a Grok seat gets the text and\n * cannot edit the file.\n * - WHEN IT APPLIES. A chat snapshots the memory block into its instructions\n * when it is CREATED (so the prompt prefix — and the provider's prompt\n * cache — stays byte-identical every turn). Chats already open see an edit\n * when they next read the file; the on/off switch affects new chats only.\n *\n * Saving is guarded against the one race this surface has: an agent can\n * write the file while the operator is editing it. The current file is\n * re-read before every save, and a change since editing began is shown as a\n * conflict instead of being silently overwritten.\n *\n * And against the one LOSSY read it has: every API response is sanitized, so\n * the text shown can have `~` for the home folder and `[REDACTED]` over\n * secret-shaped values that are still in the file (`contentSanitized`). Saving\n * that text back would write the placeholders over the real values — the\n * server refuses it (409 VERSE_MEMORY_REDACTED), and the editor says so first\n * and keeps Save off while any placeholder remains.\n *\n * The panel itself spends nothing (memory is a file on this machine), but\n * USING memory does on paid seats — the block rides in every new chat's\n * system prompt — and the panel says so (MEMORY_SPEND_NOTE).\n */\nimport { useEffect, useId, useMemo, useRef, useState } from 'react';\nimport { VERSE_MEMORY_MAX_BYTES } from '../../../../core/verse/types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { ApiError } from '../../../data/client.js';\nimport { useQuery, useRefresh } from '../../../data/hooks.js';\nimport { projectName } from '../verse-model.js';\nimport {\n formatBytes,\n jsonBodyBytes,\n MEMORY_BODY_MAX_BYTES,\n MEMORY_SPEND_NOTE,\n REDACTION_MARKER,\n redactionMarkers,\n relativePhrase,\n secretLike,\n utf8Bytes,\n} from './context-model.js';\nimport {\n fetchProjectMemory,\n updatePreferences,\n versePreferencesQuery,\n verseProjectMemoryQuery,\n writeProjectMemory,\n type VerseProjectMemoryView,\n} from './context-queries.js';\nimport { describeContextError, useTokenGate } from './use-token-gate.js';\nimport styles from './context.module.css';\n\nexport interface MemoryPanelProps {\n /** The project whose memory to show — the open chat's primary folder. Null when no chat is open. */\n projectPath: string | null;\n /**\n * Bump to re-read the file — e.g. the open chat's `turnCount`, since agents\n * write memory during turns. Optional; the panel also has a Refresh button.\n */\n refreshKey?: number | string;\n}\n\nexport function MemoryPanel({ projectPath, refreshKey }: MemoryPanelProps) {\n const headingId = useId();\n if (!projectPath) {\n return (\n <section className={styles.memory} aria-labelledby={headingId}>\n <h3 id={headingId} className={styles.memoryHead}>Project memory</h3>\n <p className={styles.hint}>Open a chat to see the memory its project shares across seats.</p>\n </section>\n );\n }\n // Keyed by path: switching projects discards any half-finished edit of the\n // previous project's file instead of letting it be saved onto the new one.\n return <MemoryPanelBody key={projectPath} projectPath={projectPath} refreshKey={refreshKey} />;\n}\n\ntype Mode = 'view' | 'edit' | 'confirm-clear';\ntype Busy = 'saving' | 'clearing' | 'toggling' | null;\n\nconst SAVE_REASON = 'Saving writes MEMORY.md for this project. Every seat on it reads this file.';\nconst CLEAR_REASON = 'Clearing empties MEMORY.md for every chat on this project.';\nconst TOGGLE_REASON = 'This changes whether new chats on this project are given shared memory.';\nconst GLOBAL_REASON = 'This changes whether new chats on ANY project are given shared memory.';\n\nfunction MemoryPanelBody({ projectPath, refreshKey }: { projectPath: string; refreshKey?: number | string }) {\n const headingId = useId();\n const editorId = useId();\n const counterId = useId();\n const def = useMemo(() => verseProjectMemoryQuery(projectPath), [projectPath]);\n const memory = useQuery(def);\n const refresh = useRefresh(def);\n const prefs = useQuery(versePreferencesQuery);\n const gate = useTokenGate();\n const name = projectName(projectPath);\n\n const [mode, setMode] = useState<Mode>('view');\n const [draft, setDraft] = useState('');\n /** The file as it was when editing began — what a save must still find on disk. */\n const [base, setBase] = useState('');\n /** Whether the text editing began from was sanitized — a placeholder in it stands for a real value on disk. */\n const [baseSanitized, setBaseSanitized] = useState(false);\n const [conflict, setConflict] = useState<VerseProjectMemoryView | null>(null);\n const [busy, setBusy] = useState<Busy>(null);\n const [error, setError] = useState<string | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const editorRef = useRef<HTMLTextAreaElement>(null);\n\n // A finished turn may have changed the file; re-read on the caller's signal\n // (never on first render — useQuery already read it).\n const firstKey = useRef(refreshKey);\n useEffect(() => {\n if (refreshKey === firstKey.current) return;\n firstKey.current = refreshKey;\n refresh();\n }, [refreshKey, refresh]);\n\n // Entering the editor lands the caret at the END: the common edit is adding\n // a line, and a caret at offset 0 would prepend it above the heading.\n useEffect(() => {\n const editor = editorRef.current;\n if (mode !== 'edit' || !editor) return;\n editor.focus();\n editor.setSelectionRange(editor.value.length, editor.value.length);\n }, [mode]);\n\n // The record a write just returned, shown until the re-read it triggered\n // lands — otherwise \"Saved.\" would sit over the OLD text for a round trip.\n const [lastWritten, setLastWritten] = useState<VerseProjectMemoryView | null>(null);\n useEffect(() => {\n if (lastWritten !== null && memory.status === 'success') setLastWritten(null);\n }, [lastWritten, memory.status]);\n const data = lastWritten !== null && memory.status !== 'success' ? lastWritten : memory.data;\n const unsupported = memory.error instanceof ApiError && memory.error.status === 404;\n const globalOff = prefs.data ? !prefs.data.memory.enabled : false;\n const draftBytes = useMemo(() => utf8Bytes(draft), [draft]);\n const overCap = draftBytes > VERSE_MEMORY_MAX_BYTES;\n // Under the memory cap is not enough: the request that carries it must fit\n // POST /memory's body cap once JSON-escaped. That route's cap is sized for\n // a full 64 KB file (MEMORY_BODY_MAX_BYTES, the server's own figure) — the\n // 64 KB default every other POST uses would block saves the server accepts.\n // In practice this only trips on text that escapes to more than 2 bytes a\n // character (control characters), which the server would refuse too.\n const requestBytes = useMemo(() => jsonBodyBytes({ projectPath, content: draft }), [projectPath, draft]);\n const overBody = !overCap && requestBytes > MEMORY_BODY_MAX_BYTES;\n const secret = mode === 'edit' ? secretLike(draft) : null;\n // Only a sanitized base makes a placeholder dangerous: in an unsanitized\n // file a literal \"[REDACTED]\" is just text the file already had.\n const placeholders = mode === 'edit' && baseSanitized ? redactionMarkers(draft) : 0;\n\n function startEdit(from: string, sanitized: boolean) {\n setDraft(from);\n setBase(from);\n setBaseSanitized(sanitized);\n setConflict(null);\n setError(null);\n setNotice(null);\n setMode('edit');\n }\n\n async function save(overwrite = false) {\n if (busy) return;\n setBusy('saving');\n setError(null);\n try {\n // Re-read first: an agent may have written the file since editing began.\n const latest = await fetchProjectMemory(projectPath);\n if (!overwrite && latest.content !== base) {\n setConflict(latest);\n return;\n }\n const saved = await gate.run(SAVE_REASON, () => writeProjectMemory(projectPath, draft));\n if (saved === null) return;\n setLastWritten(saved);\n setConflict(null);\n setMode('view');\n setNotice(saved.content.length === 0 ? 'Saved — MEMORY.md is now empty.' : 'Saved.');\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n async function clear() {\n if (busy) return;\n setBusy('clearing');\n setError(null);\n try {\n const saved = await gate.run(CLEAR_REASON, () => writeProjectMemory(projectPath, ''));\n if (saved === null) return;\n setLastWritten(saved);\n setMode('view');\n setNotice('Cleared. Agents start MEMORY.md afresh on their next write.');\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n async function setProjectEnabled(next: boolean) {\n if (busy) return;\n setBusy('toggling');\n setError(null);\n setNotice(null);\n try {\n const result = await gate.run(TOGGLE_REASON, () => updatePreferences({ projectPath, memoryEnabled: next }));\n if (result !== null) {\n setNotice(next\n ? `New chats on ${name} will get shared memory. Chats already open keep what they started with.`\n : `New chats on ${name} will start without shared memory. The file is kept.`);\n }\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n async function setGlobalEnabled(next: boolean) {\n if (busy) return;\n setBusy('toggling');\n setError(null);\n setNotice(null);\n try {\n await gate.run(GLOBAL_REASON, () => updatePreferences({ memoryEnabled: next }));\n } catch (err) {\n setError(describeContextError(err));\n } finally {\n setBusy(null);\n }\n }\n\n const state = data ? (globalOff ? 'off everywhere' : data.enabled ? 'on' : 'off') : null;\n\n return (\n <section className={styles.memory} aria-labelledby={headingId} data-project={projectPath}>\n <h3 id={headingId} className={styles.memoryHead}>\n <span>Project memory</span>\n {state ? <span className={styles.memoryState}>{state}</span> : null}\n {unsupported ? null : (\n <button type=\"button\" className={styles.memoryHeadAction} onClick={refresh}\n aria-label=\"Refresh project memory\">Refresh</button>\n )}\n </h3>\n\n <p className={styles.hint}>\n One <code>MEMORY.md</code> shared by every chat on <strong title={projectPath}>{name}</strong>, whichever seat runs it. Agents keep it\n current — decisions and why, conventions, gotchas, plan status.\n </p>\n\n {unsupported ? (\n <p className={styles.hint}>This server has no project memory yet — update Ashlr and restart <code>ashlr verse</code>.</p>\n ) : memory.status === 'loading' || (memory.status === 'idle' && !data) ? (\n <div aria-busy=\"true\"><SkeletonLine width=\"80%\" /><SkeletonLine width=\"60%\" /><SkeletonLine width=\"70%\" /></div>\n ) : !data ? (\n <div className={styles.searchError} role=\"alert\">\n <span>Could not read this project’s memory: {describeContextError(memory.error)}</span>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} onClick={refresh}>Retry</button>\n </div>\n ) : (\n <>\n {/* ---- on / off ---- */}\n {globalOff ? (\n <div className={styles.field}>\n <p className={styles.hint}>Shared memory is off for every project, so new chats start without it.</p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} disabled={busy !== null}\n onClick={() => void setGlobalEnabled(true)}>Turn memory on</button>\n </div>\n </div>\n ) : (\n <Switch checked={data.enabled} disabled={busy !== null || !prefs.data}\n onChange={(next) => void setProjectEnabled(next)}\n label={`Give new chats on ${name} this memory`} />\n )}\n\n {/* ---- the file ---- */}\n {mode === 'edit' ? (\n <div className={styles.field}>\n <label className={styles.label} htmlFor={editorId}>Edit MEMORY.md</label>\n <textarea id={editorId} ref={editorRef} className={styles.textarea} value={draft} rows={12} spellCheck={false}\n aria-describedby={counterId} aria-invalid={overCap || overBody ? true : undefined}\n onChange={(event) => setDraft(event.target.value)} />\n <p id={counterId} className={`${styles.hint} ${styles.counter} ${overCap || overBody ? styles.counterOver : ''}`}>\n {formatBytes(draftBytes)} of {formatBytes(VERSE_MEMORY_MAX_BYTES)}\n {overCap ? ' — over the limit; trim it to save.' : ''}\n {overBody ? ` — ${formatBytes(requestBytes)} once line breaks and quotes are encoded for sending, over the ${formatBytes(MEMORY_BODY_MAX_BYTES)} request limit; trim it to save.` : ''}\n </p>\n {secret ? (\n <p className={styles.warn} role=\"alert\">\n This looks like it contains {secret}. MEMORY.md is sent to every seat’s model — remove it before saving.\n </p>\n ) : null}\n {placeholders > 0 ? (\n <p className={styles.warn} role=\"alert\">\n {placeholders === 1 ? 'One' : placeholders} <code>{REDACTION_MARKER}</code> placeholder{placeholders === 1 ? ' stands' : 's stand'} in\n for secret-looking text that is still in MEMORY.md. Saving {placeholders === 1 ? 'it' : 'them'} would replace the real\n value{placeholders === 1 ? '' : 's'}, so Save stays off until {placeholders === 1 ? 'it is' : 'they are'} gone. Deleting a\n placeholder drops that value from the file; to keep it, edit MEMORY.md directly under <code>~/.ashlr/verse/memory</code>.\n </p>\n ) : baseSanitized ? (\n <p className={styles.hint}>\n This copy was sanitized for the browser, so a home-folder path appears as <code>~</code>. Saving writes the text as\n shown; <code>~</code> names the same folder for every reader.\n </p>\n ) : null}\n {conflict ? (\n <div className={styles.warn} role=\"alert\">\n <p className={styles.hint}>\n An agent changed MEMORY.md while you were editing\n {relativePhrase(conflict.updatedAt) ? ` (${relativePhrase(conflict.updatedAt)})` : ''}.\n </p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} disabled={busy !== null || placeholders > 0}\n onClick={() => void save(true)}>Overwrite with mine</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`} disabled={busy !== null}\n onClick={() => startEdit(conflict.content, conflict.contentSanitized === true)}>Start over from theirs</button>\n </div>\n </div>\n ) : null}\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.primary} ${styles.small}`}\n disabled={busy !== null || overCap || overBody || draft === base || conflict !== null || placeholders > 0}\n onClick={() => void save(false)}>{busy === 'saving' ? 'Saving…' : 'Save'}</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`} disabled={busy === 'saving'}\n onClick={() => { setMode('view'); setConflict(null); setError(null); }}>Cancel</button>\n </div>\n </div>\n ) : data.content.length === 0 ? (\n <div className={styles.field}>\n <p className={styles.hint}>\n MEMORY.md is empty. Agents add to it as they work, or write the first entries yourself.\n </p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`} onClick={() => startEdit('', false)}>Write it</button>\n </div>\n </div>\n ) : (\n <div className={styles.field}>\n <pre className={styles.memoryBody} tabIndex={0} aria-label={`MEMORY.md for ${name}`}>{data.content}</pre>\n <p className={`${styles.hint} ${styles.memoryMeta}`}>\n <span>{formatBytes(data.bytes)}</span>\n {relativePhrase(data.updatedAt) ? <span>updated {relativePhrase(data.updatedAt)}</span> : null}\n </p>\n {data.contentSanitized ? (\n <p className={styles.hint}>\n Shown sanitized for the browser: a home-folder path appears as <code>~</code> and secret-looking text as{' '}\n <code>{REDACTION_MARKER}</code>.{redactionMarkers(data.content) > 0 ? ' The real values are still in the file.' : ''}\n </p>\n ) : null}\n {mode === 'confirm-clear' ? (\n <div className={styles.warn} role=\"alert\">\n <p className={styles.hint}>Clear MEMORY.md for {name}? Every chat on this project loses what it says. Other files in the folder stay.</p>\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small} ${styles.danger}`} disabled={busy !== null}\n onClick={() => void clear()}>{busy === 'clearing' ? 'Clearing…' : 'Clear it'}</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`} onClick={() => setMode('view')}>Keep</button>\n </div>\n </div>\n ) : (\n <div className={styles.memoryActions}>\n <button type=\"button\" className={`${styles.secondary} ${styles.small}`}\n onClick={() => startEdit(data.content, data.contentSanitized === true)}>Edit</button>\n <button type=\"button\" className={`${styles.cancel} ${styles.small}`}\n onClick={() => { setNotice(null); setMode('confirm-clear'); }}>Clear…</button>\n </div>\n )}\n </div>\n )}\n\n {data.files.length > 0 ? (\n <div className={styles.field}>\n <span className={styles.label}>Also in this folder</span>\n <ul className={styles.memoryFiles}>\n {data.files.map((file) => <li key={file}><code>{file}</code></li>)}\n </ul>\n </div>\n ) : null}\n\n {notice ? <p className={styles.hint} role=\"status\">{notice}</p> : null}\n {error ? <p className={styles.error} role=\"alert\">{error}</p> : null}\n\n <details>\n <summary className={styles.hint}>How project memory works</summary>\n <div className={styles.field}>\n <p className={styles.hint}>\n Claude, Codex and local seats can read and edit the file. Grok’s CLI can reach only its working folder, so a\n Grok seat is given the text and can only read it.\n </p>\n <p className={styles.hint}>\n A chat copies the memory into its instructions when it starts, so every turn re-sends the same prefix and the\n provider’s prompt cache keeps working. Chats already open see your edits when they next read the file; the\n switch above applies to new chats.\n </p>\n <p className={styles.hint}>\n It lives on this machine under <code>~/.ashlr/verse/memory</code>, readable only by you. It is sent to every\n seat’s model, so never put secrets in it.\n </p>\n <p className={styles.hint}>{MEMORY_SPEND_NOTE}</p>\n {globalOff ? null : (\n <p className={styles.hint}>\n Memory is on for every project unless switched off per project.{' '}\n <button type=\"button\" className={styles.link} disabled={busy !== null}\n onClick={() => void setGlobalEnabled(false)}>Turn it off for every project</button>\n </p>\n )}\n </div>\n </details>\n </>\n )}\n\n <MutationTokenDialog open={gate.dialog.open} reason={gate.dialog.reason} tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\" onClose={gate.dialog.onClose} onUnlocked={gate.dialog.onUnlocked} />\n </section>\n );\n}\n","/**\n * SessionRoots.module.css — one row per folder this chat can reach.\n *\n * Tone is carried by a left border AND by words (the badge and the caveat\n * line), never by colour alone — DESIGN-V2 §6.\n */\n\n.roots { padding: var(--space-4) var(--space-4) 0; }\n\n.title {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n margin: 0 0 var(--space-2);\n font-size: var(--text-xs);\n font-weight: 600;\n text-transform: uppercase;\n letter-spacing: 0.06em;\n color: var(--text-muted);\n}\n\n.count {\n padding: 0 var(--space-1);\n border-radius: var(--radius-sm);\n background: var(--surface-raised);\n font-variant-numeric: tabular-nums;\n letter-spacing: 0;\n}\n\n.workspace {\n margin: 0 0 var(--space-2);\n font-size: var(--text-xs);\n color: var(--text-muted);\n}\n\n.list {\n margin: 0;\n padding: 0;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n\n.root {\n padding: var(--space-2);\n border-radius: var(--radius-sm);\n border-left: 3px solid var(--border-subtle);\n background: var(--surface-raised);\n}\n\n.root[data-tone='primary'] { border-left-color: var(--accent); }\n.root[data-tone='extra'] { border-left-color: var(--border-strong, var(--border-subtle)); }\n.root[data-tone='unreachable'] { border-left-color: var(--warning, #b7791f); }\n.root[data-tone='missing'] { border-left-color: var(--danger, #c53030); }\n\n.rootHead {\n display: flex;\n align-items: baseline;\n justify-content: space-between;\n gap: var(--space-2);\n}\n\n.name {\n font-size: var(--text-sm);\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.badge {\n flex: none;\n font-size: var(--text-2xs, 0.6875rem);\n text-transform: uppercase;\n letter-spacing: 0.04em;\n color: var(--text-muted);\n}\n\n/* The full path, shown rather than hovered. `direction: rtl` with the text\n isolated flips only WHICH END the ellipsis eats — the head, so the tail\n that actually disambiguates two same-named checkouts survives. The bdi\n isolation keeps the path itself rendering left-to-right. */\n.path {\n margin: var(--space-1) 0 0;\n direction: rtl;\n text-align: left;\n unicode-bidi: plaintext;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-xs);\n color: var(--text-muted);\n}\n\n.git,\n.remote,\n.caveat {\n margin: var(--space-1) 0 0;\n font-size: var(--text-xs);\n color: var(--text-muted);\n}\n\n.git { font-variant-numeric: tabular-nums; }\n\n.remote {\n font-family: var(--font-mono);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.caveat { color: var(--text-strong, var(--text-default)); }\n\n.note,\n.error {\n margin: var(--space-2) 0 0;\n font-size: var(--text-xs);\n line-height: 1.45;\n color: var(--text-muted);\n}\n\n.error { color: var(--danger, #c53030); }\n","/**\n * routes/verse/SessionRoots.tsx — the folders THIS chat can reach, each with\n * its own git identity.\n *\n * WHY PER-ROOT IDENTITY IS THE POINT. A turn that edits two repositories\n * produces two diffs. Without a branch and a dirty count per root, the\n * transcript cannot attribute them, and \"3 files changed\" silently spans two\n * repositories on two different branches. So every root gets its own line:\n * branch, how many entries are dirty, and how far it has drifted from its\n * upstream.\n *\n * WHAT IT REFUSES TO IMPLY:\n * - A root the engine cannot reach (a Grok seat takes no additional-directory\n * flag) is LISTED and marked, never hidden — the operator chose it.\n * - A root that is not enrolled is marked as refused BY THE AUTONOMOUS LANE,\n * not as unusable here. This chat can edit it; the fleet cannot.\n * - A root with no repo says so, rather than leaving a gap that would read as\n * \"clean, on the default branch\".\n *\n * The read itself lives in chat/use-session-roots.ts (3.10): shared by every\n * consumer of a chat's roots, and refreshed each time a turn finishes,\n * because a branch is stale the moment a turn commits.\n */\nimport type { VerseSession, VerseSessionRootsResponse } from '../../data/api-types.js';\nimport { abbreviateHome } from './chat/path-display.js';\nimport { rootCaveat, rootGitLine, rootTone } from './workspace-model.js';\nimport styles from './SessionRoots.module.css';\n\nexport interface SessionRootsProps {\n session: VerseSession | null;\n /**\n * 3.10: the roots read, from the chat's shared `useSessionRoots` (one\n * request feeds the header breadcrumb, the dock panes and this list). It is\n * refreshed there whenever the chat's turnCount moves.\n */\n data: VerseSessionRootsResponse | null;\n error?: string | null;\n}\n\nexport function SessionRoots({ session, data, error = null }: SessionRootsProps) {\n if (!session) return null;\n\n // A single-folder chat is the overwhelmingly common case and already says\n // which folder it is everywhere else. Showing a one-row \"Folders\" list for\n // it would be noise, so this surfaces only when there is something to\n // attribute between.\n if (data !== null && data.roots.length <= 1 && data.workspaceId === null) return null;\n\n return (\n <section className={styles.roots} aria-labelledby=\"verse-res-roots\">\n <h3 id=\"verse-res-roots\" className={styles.title}>\n Folders\n {data ? <span className={styles.count}>{data.roots.length}</span> : null}\n </h3>\n\n {data?.workspaceName ? (\n <p className={styles.workspace}>\n Workspace <strong>{data.workspaceName}</strong>\n </p>\n ) : null}\n\n {error ? <p role=\"alert\" className={styles.error}>{error}</p> : null}\n\n <ul className={styles.list}>\n {(data?.roots ?? []).map((root) => {\n const git = rootGitLine(root);\n const caveat = rootCaveat(root);\n return (\n <li key={root.path} className={styles.root} data-tone={rootTone(root)}>\n <div className={styles.rootHead}>\n <span className={styles.name}>{root.name}</span>\n <span className={styles.badge}>{root.primary ? 'primary' : 'added'}</span>\n </div>\n {/* The path was a hover `title` on the folder name. This card is\n the one place in the app that exists to ATTRIBUTE a diff to a\n repository, and two checkouts of the same repo share a name —\n so the thing that tells them apart cannot be the one fact you\n have to hover to read. It is shown, directory-first, with the\n head clipping so the tail that disambiguates stays visible;\n `~`-abbreviated (3.10.1), the absolute path in the tooltip. */}\n <p className={styles.path} title={root.path}>{abbreviateHome(root.path)}</p>\n <p className={styles.git}>{git ?? 'not a git repo'}</p>\n {root.git?.remote ? <p className={styles.remote}>{root.git.remote}</p> : null}\n {caveat ? <p className={styles.caveat}>{caveat}</p> : null}\n </li>\n );\n })}\n </ul>\n\n {(data?.notes ?? []).map((note) => (\n <p key={note} className={styles.note}>{note}</p>\n ))}\n </section>\n );\n}\n","/**\n * dock/panes.module.css — the dock's own panes (Tasks, Context). Section\n * grammar matches the rest of the chat surface: micro-label headings, 16px\n * padding, hairline separators. Tokens only (style-scan-310).\n */\n.pane {\n display: flex;\n flex-direction: column;\n min-height: 0;\n padding-bottom: var(--space-6);\n}\n\n.section { padding: var(--space-4) var(--card-pad, var(--space-4)) 0; }\n.section + .section {\n margin-top: var(--space-4);\n padding-top: var(--space-4);\n border-top: 1px solid var(--border-subtle);\n}\n.sectionTitle {\n display: flex;\n align-items: baseline;\n gap: var(--space-2);\n margin: 0 0 var(--space-3);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n.count {\n font-variant-numeric: tabular-nums;\n text-transform: none;\n letter-spacing: 0;\n color: var(--text-secondary);\n}\n.muted {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.muted + .action,\n.action + .muted { margin-top: var(--space-2); }\n/* The next step under an empty line (\"No tool calls…\" → what to do). */\n.hint {\n margin: var(--space-1) 0 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n/* A line that comes and goes with the turn keeps its row, so the sections\n below it do not jump every time a turn starts or ends. */\n.reserve { min-height: var(--text-xs-line); }\n\n.action {\n display: inline-flex;\n align-items: center;\n min-height: var(--control-h-sm);\n margin-top: var(--space-2);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-surface);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n cursor: pointer;\n}\n.action:hover:not(:disabled) { background: var(--bg-hover); border-color: var(--border-strong); }\n.action:disabled { color: var(--text-disabled); cursor: not-allowed; }\n.action:focus-visible,\n.link:focus-visible,\n.task:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.link {\n padding: 0;\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-sm-size);\n cursor: pointer;\n}\n.link:hover { text-decoration: underline; }\n\n/* ---- tasks ---------------------------------------------------------------- */\n.taskList {\n display: flex;\n flex-direction: column;\n margin: 0 calc(-1 * var(--space-2));\n padding: 0;\n list-style: none;\n}\n.task {\n display: grid;\n grid-template-columns: minmax(12px, auto) auto minmax(0, 1fr) auto;\n align-items: center;\n gap: var(--space-2);\n width: 100%;\n min-height: var(--density-row-sm);\n padding: 0 var(--space-2);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n text-align: left;\n cursor: pointer;\n}\n.task:hover { background: var(--bg-hover); }\n.taskMark {\n justify-self: center;\n width: 6px;\n height: 6px;\n border-radius: var(--radius-full);\n background: var(--border-strong);\n}\n.taskMark[data-status='running'] {\n background: var(--status-running-solid);\n animation: pane-pulse var(--duration-pulse) ease-in-out infinite;\n}\n.taskMark[data-status='failed'] { border-radius: 1px; background: var(--status-danger-solid); }\n.taskName {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n max-width: 18ch;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n.taskDetail {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n.task:hover .taskDetail { color: var(--text-secondary); }\n.taskTime {\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-variant-numeric: tabular-nums;\n color: var(--text-tertiary);\n white-space: nowrap;\n}\n.task[data-status='failed'] .taskTime { color: var(--status-danger-fg); }\n\n/* Engine identity: a 2px tick + monogram (SPEC-310C §6), never a logo. */\n.engineTick {\n justify-self: center;\n display: inline-flex;\n align-items: center;\n gap: 2px;\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n color: var(--text-secondary);\n}\n.engineTick::before {\n content: '';\n width: 2px;\n height: 10px;\n border-radius: 1px;\n background: var(--text-tertiary);\n}\n.engineTick[data-engine='claude']::before { background: var(--engine-claude); }\n.engineTick[data-engine='codex']::before { background: var(--engine-codex); }\n.engineTick[data-engine='grok']::before { background: var(--engine-grok); }\n.engineTick[data-engine='local']::before { background: var(--engine-local); }\n.engineTick[data-engine='devin']::before { background: var(--engine-devin); }\n\n@keyframes pane-pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .taskMark { animation: none; }\n}\n:root[data-motion='reduce'] .taskMark { animation: none; }\n","/**\n * routes/verse/dock/ContextPane.tsx — everything about THIS chat's context,\n * in the dock (SPEC-310C §3 \"Context\", unit C2).\n *\n * It is the old resources column minus the accounts: seat meters, the local\n * runtime and the running list moved to Apps & Accounts (C6) and the Tasks\n * pane, because they were never about the chat you were reading. What stays:\n *\n * This chat usage, context efficiency, the idle-cache warning (ChatUsage)\n * Folders each root with its branch and dirty count (SessionRoots)\n * Handoff \"Continue in a fresh chat…\" — the same dialog the notice offers\n * Memory the project's shared MEMORY.md (MemoryPanel)\n * → Accounts & capacity\n *\n * Every figure is read from the session record, its event log and the\n * shared roots read — the pane itself makes no request except MemoryPanel's\n * own, and spends nothing.\n */\nimport { useEffect, useState } from 'react';\nimport type { VerseEvent, VerseSeat, VerseSession, VerseSessionRootsResponse } from '../../../data/api-types.js';\nimport { ChatUsage } from '../context/ChatUsage.js';\nimport { MemoryPanel } from '../context/MemoryPanel.js';\nimport { SessionRoots } from '../SessionRoots.js';\nimport styles from './panes.module.css';\n\n/** The idle-cache warning only has to notice an hour passing. */\nconst IDLE_TICK_MS = 30_000;\n\nexport interface ContextPaneProps {\n session: VerseSession | null;\n seats: readonly VerseSeat[];\n events: readonly VerseEvent[];\n roots: VerseSessionRootsResponse | null;\n rootsError: string | null;\n /** Opens the handoff dialog; absent → the action is not offered here. */\n onHandoff?: () => void;\n /** Why handoff is unavailable right now (a turn is running, dispatch is off); null = available. */\n handoffDisabledReason?: string | null;\n onOpenAccounts: () => void;\n /** False while this pane is a background tab: its clock stops. */\n visible: boolean;\n}\n\nfunction useSlowNow(active: boolean): number {\n const [now, setNow] = useState(() => Date.now());\n useEffect(() => {\n if (!active) return undefined;\n setNow(Date.now());\n const id = setInterval(() => setNow(Date.now()), IDLE_TICK_MS);\n return () => clearInterval(id);\n }, [active]);\n return now;\n}\n\nexport function ContextPane({ session, seats, events, roots, rootsError, onHandoff, handoffDisabledReason = null, onOpenAccounts, visible }: ContextPaneProps) {\n const now = useSlowNow(visible && session !== null);\n return (\n <div className={styles.pane} aria-label=\"Context\">\n <section className={styles.section} aria-labelledby=\"dock-context-chat\">\n <h3 id=\"dock-context-chat\" className={styles.sectionTitle}>This chat</h3>\n {session\n ? <ChatUsage session={session} seats={seats} events={events} now={now} />\n : <p className={styles.muted}>Open a chat to see its usage and context.</p>}\n </section>\n\n {session ? (\n <div className={styles.section}>\n <SessionRoots session={session} data={roots} error={rootsError} />\n </div>\n ) : null}\n\n {session && onHandoff ? (\n <section className={styles.section} aria-labelledby=\"dock-context-handoff\">\n <h3 id=\"dock-context-handoff\" className={styles.sectionTitle}>Handoff</h3>\n <p className={styles.muted}>\n Verse drafts a note from this chat&apos;s log — free — and opens a fresh chat with it in the message box. Nothing is sent until you press Send.\n </p>\n <button type=\"button\" className={styles.action} onClick={onHandoff} disabled={handoffDisabledReason !== null}\n title={handoffDisabledReason ?? undefined}>\n Continue in a fresh chat…\n </button>\n {/* Always mounted: the reason comes and goes with every turn, and\n an unmounting line would shift Memory below it each time. */}\n <p className={`${styles.muted} ${styles.reserve}`}>{handoffDisabledReason ?? ''}</p>\n </section>\n ) : null}\n\n <div className={styles.section}>\n <MemoryPanel projectPath={session?.projectPath ?? null} refreshKey={session?.turnCount ?? 0} />\n </div>\n\n <div className={styles.section}>\n <button type=\"button\" className={styles.link} onClick={onOpenAccounts}>Accounts &amp; capacity →</button>\n </div>\n </div>\n );\n}\n","/**\n * routes/verse/dock/TasksPane.tsx — what is running, and where (SPEC-310C §3\n * \"Tasks\", unit C2; model: chat/tasks-model.ts).\n *\n * THIS CHAT ● Bash npm test running 1m 02s\n * ● Task review the auth module running 12s (subagent)\n * ✓ Read src/core/api.ts 0.4s\n * OTHER CHATS ● Fix the login bug · claude-a npm run build · 3m 10s\n *\n * Click a call to jump to it in the transcript (a folded group opens itself);\n * click another chat to open it. Finished calls of this turn stay listed\n * under the running ones (newest first, the last 20) so \"what did it just\n * do\" is answerable without scrolling the transcript.\n */\nimport type { VerseEngine } from '../../../data/api-types.js';\nimport { LiveTimer } from '../chat/LiveTimer.js';\nimport type { ChatTask, TurnTask } from '../chat/tasks-model.js';\nimport { toolAnchorId } from '../chat/tool-semantics.js';\nimport { requestTranscriptJump } from '../chat/transcript-jump.js';\nimport { findCommand, formatChord } from '../shell/command-catalog.js';\nimport { formatDuration } from '../verse-model.js';\nimport styles from './panes.module.css';\nimport { ProviderLogo } from '../../../components/primitives/ProviderLogo.js';\n\nconst FINISHED_SHOWN = 20;\n\nexport interface TasksPaneProps {\n /** This chat's calls since its last ask (running first). */\n turnTasks: readonly TurnTask[];\n otherChats: readonly ChatTask[];\n /** Whether a chat is open at all. */\n hasSession: boolean;\n onOpenSession: (sessionId: string) => void;\n}\n\nconst STATUS_WORD: Record<TurnTask['status'], string> = { running: 'running', done: 'done', failed: 'failed' };\n\nexport function TasksPane({ turnTasks, otherChats, hasSession, onOpenSession }: TasksPaneProps) {\n const newChatKey = findCommand('chat.new')?.keys[0];\n const newChat = newChatKey ? formatChord(newChatKey) : null;\n const running = turnTasks.filter((t) => t.status === 'running');\n const finished = turnTasks.filter((t) => t.status !== 'running').slice(0, FINISHED_SHOWN);\n\n return (\n <div className={styles.pane} aria-label=\"Tasks\">\n <section className={styles.section} aria-labelledby=\"dock-tasks-turn\">\n <h3 id=\"dock-tasks-turn\" className={styles.sectionTitle}>\n This chat <span className={styles.count}>{running.length > 0 ? `${running.length} running` : ''}</span>\n </h3>\n {!hasSession ? (\n <p className={styles.muted}>Open a chat to see its tool calls here.</p>\n ) : turnTasks.length === 0 ? (\n <>\n <p className={styles.muted}>No tool calls in the latest turn.</p>\n <p className={styles.hint}>Send a message: each tool the agent runs shows up here, and a click jumps to it in the chat.</p>\n </>\n ) : (\n <ul className={styles.taskList}>\n {[...running, ...finished].map((task) => (\n <li key={task.toolUseId}>\n <button type=\"button\" className={styles.task} data-status={task.status}\n onClick={() => { requestTranscriptJump(toolAnchorId(task.toolUseId)); }}\n aria-label={`${task.kind === 'subagent' ? 'Subagent' : task.name}: ${task.detail}, ${STATUS_WORD[task.status]}. Jump to it in the chat.`}>\n <span className={styles.taskMark} data-status={task.status} aria-hidden=\"true\" />\n <span className={styles.taskName} title={task.kind === 'subagent' ? 'Subagent' : task.name}>{task.kind === 'subagent' ? 'Subagent' : task.name}</span>\n <span className={styles.taskDetail} title={task.detail}>{task.detail}</span>\n <span className={styles.taskTime}>\n {task.status === 'running'\n ? <LiveTimer since={task.startedAt} />\n : task.status === 'failed'\n ? 'failed'\n : task.durationMs !== null && task.durationMs > 0 ? formatDuration(task.durationMs) : 'done'}\n </span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n\n <section className={styles.section} aria-labelledby=\"dock-tasks-chats\">\n <h3 id=\"dock-tasks-chats\" className={styles.sectionTitle}>\n Other chats <span className={styles.count}>{otherChats.length > 0 ? `${otherChats.length} running` : ''}</span>\n </h3>\n {otherChats.length === 0 ? (\n <>\n <p className={styles.muted}>No other chat is running.</p>\n <p className={styles.hint}>\n {newChat ? `Start another with ${newChat}` : 'Start another chat'} and it shows here while it works, one click away.\n </p>\n </>\n ) : (\n <ul className={styles.taskList}>\n {otherChats.map((chat) => (\n <li key={chat.sessionId}>\n <button type=\"button\" className={styles.task} data-status=\"running\" onClick={() => onOpenSession(chat.sessionId)}\n aria-label={`${chat.title || 'Untitled chat'}, running${chat.live ? `: ${chat.live}` : ''}. Open this chat.`}>\n <EngineTick engine={chat.engine} />\n <span className={styles.taskName} title={chat.title || 'Untitled chat'}>{chat.title || 'Untitled chat'}</span>\n <span className={styles.taskDetail} title={chat.live ?? undefined}>{chat.live ?? ''}</span>\n <span className={styles.taskTime}>{chat.startedAt ? <LiveTimer since={chat.startedAt} /> : 'running'}</span>\n </button>\n </li>\n ))}\n </ul>\n )}\n </section>\n </div>\n );\n}\n\n/** Engine identity: a 2px tick plus the provider's mark (3.11.1). */\nexport function EngineTick({ engine }: { engine: VerseEngine }) {\n return <span className={styles.engineTick} data-engine={engine} aria-hidden=\"true\"><ProviderLogo engine={engine} size={12} /></span>;\n}\n","/**\n * routes/verse/panes/builtin/ChatPanes.tsx — the chat's own Tasks and\n * Context panes as registry panes. Lazy (with the memory editor behind\n * Context) — loaded the first time either tab opens.\n */\nimport { useMemo } from 'react';\nimport { currentTurnTasks } from '../../chat/tasks-model.js';\nimport { ContextPane } from '../../dock/ContextPane.js';\nimport { TasksPane } from '../../dock/TasksPane.js';\nimport { useVerseTranscript } from '../../useVerseTranscript.js';\nimport { useChatPaneData } from '../chat-pane-data.js';\nimport type { PaneProps } from '../pane-registry.js';\n\n/** Subscribed to the open chat's transcript on its own: a streamed token re-renders this, not the dock. */\nexport function TasksPaneBody({ sessionId, host }: PaneProps) {\n const { otherRunning } = useChatPaneData();\n const transcript = useVerseTranscript(sessionId);\n const turnTasks = useMemo(() => currentTurnTasks(transcript.items), [transcript.items]);\n return <TasksPane turnTasks={turnTasks} otherChats={otherRunning} hasSession={sessionId !== null} onOpenSession={host.openSession} />;\n}\n\nexport function ContextPaneBody({ session, events, visible }: PaneProps) {\n const { seats, rootsData, rootsError, dispatchEnabled, onHandoff, onOpenAccounts } = useChatPaneData();\n const handoffReason = !dispatchEnabled\n ? 'Sending is disabled on this server.'\n : session?.status === 'running' ? 'Available when the current turn finishes.' : null;\n return (\n <ContextPane session={session} seats={seats} events={events} roots={rootsData} rootsError={rootsError} visible={visible}\n onHandoff={session ? () => onHandoff(session.id) : undefined} handoffDisabledReason={handoffReason}\n onOpenAccounts={onOpenAccounts} />\n );\n}\n"],"mappings":"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"}