@ashlr/hub 3.16.0 → 3.16.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (997) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/README.md +2 -2
  3. package/dist/authority-surface.json +5 -5
  4. package/dist/build-identity.json +2 -2
  5. package/dist/core/daemon/loop.js +1 -0
  6. package/dist/core/daemon/loop.js.map +1 -1
  7. package/dist/core/daemon/tick-hooks.d.ts +2 -0
  8. package/dist/core/daemon/tick-hooks.js.map +1 -1
  9. package/dist/core/fleet/tick-hooks-live.d.ts +2 -1
  10. package/dist/core/fleet/tick-hooks-live.js +49 -7
  11. package/dist/core/fleet/tick-hooks-live.js.map +1 -1
  12. package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js +2 -0
  13. package/dist/core/web/public/next/assets/ActionMenu-Bv-kQxD4.js.map +1 -0
  14. package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js +2 -0
  15. package/dist/core/web/public/next/assets/Advanced-Be7Frv-G.js.map +1 -0
  16. package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js +2 -0
  17. package/dist/core/web/public/next/assets/AgentDetailScreen-DzqHmufO.js.map +1 -0
  18. package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js +2 -0
  19. package/dist/core/web/public/next/assets/AgentToolsSheet-D00kLnIq.js.map +1 -0
  20. package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js +2 -0
  21. package/dist/core/web/public/next/assets/AgentToolsStrip-CSus9Dr3.js.map +1 -0
  22. package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js +2 -0
  23. package/dist/core/web/public/next/assets/AgentsScreen-WoR0oSLZ.js.map +1 -0
  24. package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js +3 -0
  25. package/dist/core/web/public/next/assets/AgentsSection-D5mKoOhH.js.map +1 -0
  26. package/dist/core/web/public/next/assets/App-Uy6lDpKw.js +8 -0
  27. package/dist/core/web/public/next/assets/App-Uy6lDpKw.js.map +1 -0
  28. package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js +2 -0
  29. package/dist/core/web/public/next/assets/AppsSection-Cfhmc4r3.js.map +1 -0
  30. package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js +2 -0
  31. package/dist/core/web/public/next/assets/AreaTrend-Bz3ETKPk.js.map +1 -0
  32. package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js +2 -0
  33. package/dist/core/web/public/next/assets/AutomationsSection-D4K8db0o.js.map +1 -0
  34. package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js +3 -0
  35. package/dist/core/web/public/next/assets/AutonomyOffState-DUiNMgr8.js.map +1 -0
  36. package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js +2 -0
  37. package/dist/core/web/public/next/assets/AutonomySection-wxRZ7vSw.js.map +1 -0
  38. package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js +2 -0
  39. package/dist/core/web/public/next/assets/AutonomyStatus-B-PCVnFO.js.map +1 -0
  40. package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js +2 -0
  41. package/dist/core/web/public/next/assets/BranchBar-Bs4r_Vh6.js.map +1 -0
  42. package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js +7 -0
  43. package/dist/core/web/public/next/assets/BrowserPanel-BMQcviI1.js.map +1 -0
  44. package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js +2 -0
  45. package/dist/core/web/public/next/assets/BudgetControl-A4TEONtT.js.map +1 -0
  46. package/dist/core/web/public/next/assets/Button-CMR_Op-0.js +2 -0
  47. package/dist/core/web/public/next/assets/Button-CMR_Op-0.js.map +1 -0
  48. package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js +2 -0
  49. package/dist/core/web/public/next/assets/CapacityStrip-B-2NDrA5.js.map +1 -0
  50. package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js +16 -0
  51. package/dist/core/web/public/next/assets/ChangesPaneHost-CS5qGjwM.js.map +1 -0
  52. package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js +2 -0
  53. package/dist/core/web/public/next/assets/ChartFrame-sZTnZkVd.js.map +1 -0
  54. package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js +2 -0
  55. package/dist/core/web/public/next/assets/ChatPanes-CicgTVpN.js.map +1 -0
  56. package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js +3 -0
  57. package/dist/core/web/public/next/assets/ChatSection-Cc6sudpF.js.map +1 -0
  58. package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js +5 -0
  59. package/dist/core/web/public/next/assets/ChecksPanel-BGWgv8Zb.js.map +1 -0
  60. package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js +2 -0
  61. package/dist/core/web/public/next/assets/CloudBudgetForm-CqsidwfU.js.map +1 -0
  62. package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js +3 -0
  63. package/dist/core/web/public/next/assets/CommandPalette-rwEZ20MN.js.map +1 -0
  64. package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js +3 -0
  65. package/dist/core/web/public/next/assets/CommandSection-C2CLkVXN.js.map +1 -0
  66. package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js +9 -0
  67. package/dist/core/web/public/next/assets/CommandWorkflowForm-DAbPIdI3.js.map +1 -0
  68. package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js +3 -0
  69. package/dist/core/web/public/next/assets/CommandWorkflowPicker-fqHtzYXX.js.map +1 -0
  70. package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js +4 -0
  71. package/dist/core/web/public/next/assets/CompareDialog-Cwfpaa8I.js.map +1 -0
  72. package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js +2 -0
  73. package/dist/core/web/public/next/assets/ComputerControl-DU0cuVSY.js.map +1 -0
  74. package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js +2 -0
  75. package/dist/core/web/public/next/assets/ConfirmDialog-B_wCnbcC.js.map +1 -0
  76. package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js +2 -0
  77. package/dist/core/web/public/next/assets/DeleteChatDialog-CxMh53yX.js.map +1 -0
  78. package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js +2 -0
  79. package/dist/core/web/public/next/assets/DevinStopDialog-D9Bziccz.js.map +1 -0
  80. package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js +2 -0
  81. package/dist/core/web/public/next/assets/Dialog-DI5D6Is2.js.map +1 -0
  82. package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js +2 -0
  83. package/dist/core/web/public/next/assets/DiffPane-Buo19Bqr.js.map +1 -0
  84. package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js +2 -0
  85. package/dist/core/web/public/next/assets/DiffViewer-dO0RQoqA.js.map +1 -0
  86. package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js +2 -0
  87. package/dist/core/web/public/next/assets/DockHost-KJUHjoiG.js.map +1 -0
  88. package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js +2 -0
  89. package/dist/core/web/public/next/assets/EmptyState-C3BUt2Ev.js.map +1 -0
  90. package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js +2 -0
  91. package/dist/core/web/public/next/assets/Epistemic-DlG2QqKJ.js.map +1 -0
  92. package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js +2 -0
  93. package/dist/core/web/public/next/assets/EvidenceTimeline-D1GB9F-f.js.map +1 -0
  94. package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js +2 -0
  95. package/dist/core/web/public/next/assets/FilesPane-icSP5vPt.js.map +1 -0
  96. package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js +2 -0
  97. package/dist/core/web/public/next/assets/FleetScreen-V_X8SeD3.js.map +1 -0
  98. package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js +5 -0
  99. package/dist/core/web/public/next/assets/FleetSection-xyhfpRJy.js.map +1 -0
  100. package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js +2 -0
  101. package/dist/core/web/public/next/assets/Funnel-BlzQ5FOU.js.map +1 -0
  102. package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js +2 -0
  103. package/dist/core/web/public/next/assets/GearTray-Dvu-ee-h.js.map +1 -0
  104. package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js +2 -0
  105. package/dist/core/web/public/next/assets/GitDialogs-o0eCEqAN.js.map +1 -0
  106. package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js +3 -0
  107. package/dist/core/web/public/next/assets/GrowthSection-CyqJOzob.js.map +1 -0
  108. package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js +2 -0
  109. package/dist/core/web/public/next/assets/HandoffDialog-0uTNyK99.js.map +1 -0
  110. package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js +3 -0
  111. package/dist/core/web/public/next/assets/HomeBody-DJjN3GTV.js.map +1 -0
  112. package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js +2 -0
  113. package/dist/core/web/public/next/assets/HomeSeats-IJvjh9iH.js.map +1 -0
  114. package/dist/core/web/public/next/assets/Input-CsSZI8QC.js +2 -0
  115. package/dist/core/web/public/next/assets/Input-CsSZI8QC.js.map +1 -0
  116. package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js +9 -0
  117. package/dist/core/web/public/next/assets/LaunchDialog-DReYqlI0.js.map +1 -0
  118. package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js +2 -0
  119. package/dist/core/web/public/next/assets/LeaderCard-82indlOE.js.map +1 -0
  120. package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js +3 -0
  121. package/dist/core/web/public/next/assets/LeaderConversation-8hDF6Gh3.js.map +1 -0
  122. package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js +2 -0
  123. package/dist/core/web/public/next/assets/LeaderScreen-BxPiwHcT.js.map +1 -0
  124. package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js +2 -0
  125. package/dist/core/web/public/next/assets/LessonsPanel-BG558qil.js.map +1 -0
  126. package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js +2 -0
  127. package/dist/core/web/public/next/assets/LiveTimer-DUgUBr49.js.map +1 -0
  128. package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js +2 -0
  129. package/dist/core/web/public/next/assets/LocalSeatBadge-D6U4Q2P3.js.map +1 -0
  130. package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js +2 -0
  131. package/dist/core/web/public/next/assets/MatrixHeatmap-Brn70z84.js.map +1 -0
  132. package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js +2 -0
  133. package/dist/core/web/public/next/assets/McpSection-Dz8Ga2Rg.js.map +1 -0
  134. package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js +3 -0
  135. package/dist/core/web/public/next/assets/MessageMarkdown-CQfYQaXB.js.map +1 -0
  136. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js +72 -0
  137. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DPaNQMj8.js.map +1 -0
  138. package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js +2 -0
  139. package/dist/core/web/public/next/assets/Meter-TnD7Ris6.js.map +1 -0
  140. package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js +2 -0
  141. package/dist/core/web/public/next/assets/MicButton-Dc9g2Z_E.js.map +1 -0
  142. package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js +3 -0
  143. package/dist/core/web/public/next/assets/MindSection-DGpYq8c7.js.map +1 -0
  144. package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js +2 -0
  145. package/dist/core/web/public/next/assets/MobileComposer-DbSZ2rxa.js.map +1 -0
  146. package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js +2 -0
  147. package/dist/core/web/public/next/assets/MobileGuardSheet-qQJev_w3.js.map +1 -0
  148. package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js +3 -0
  149. package/dist/core/web/public/next/assets/MobileRuntime-BEnY4Uvs.js.map +1 -0
  150. package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js +2 -0
  151. package/dist/core/web/public/next/assets/MoreScreen-CG0E5S8G.js.map +1 -0
  152. package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js +7 -0
  153. package/dist/core/web/public/next/assets/MultiModelBar-DgMyP8IC.js.map +1 -0
  154. package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js +2 -0
  155. package/dist/core/web/public/next/assets/MutationTokenDialog-T3r9EtHi.js.map +1 -0
  156. package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js +3 -0
  157. package/dist/core/web/public/next/assets/NeedsYouDrawer-BDAcTlK8.js.map +1 -0
  158. package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js +2 -0
  159. package/dist/core/web/public/next/assets/NeedsYouList-BFubkjzF.js.map +1 -0
  160. package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js +2 -0
  161. package/dist/core/web/public/next/assets/NeedsYouScreen-B3Dk15T_.js.map +1 -0
  162. package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js +2 -0
  163. package/dist/core/web/public/next/assets/NewAgentScreen-zf1bqGYC.js.map +1 -0
  164. package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js +4 -0
  165. package/dist/core/web/public/next/assets/NewChatDialog-el95cRTF.js.map +1 -0
  166. package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js +3 -0
  167. package/dist/core/web/public/next/assets/OnboardingFlow-Bi8gZOuz.js.map +1 -0
  168. package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js +3 -0
  169. package/dist/core/web/public/next/assets/OnboardingGate-CRexmMn5.js.map +1 -0
  170. package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js +9 -0
  171. package/dist/core/web/public/next/assets/PlaybooksSection-R2_wyVpQ.js.map +1 -0
  172. package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js +2 -0
  173. package/dist/core/web/public/next/assets/PreviewPane-Djw_GJ20.js.map +1 -0
  174. package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js +2 -0
  175. package/dist/core/web/public/next/assets/ProviderLogo-DIfJXNWf.js.map +1 -0
  176. package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js +2 -0
  177. package/dist/core/web/public/next/assets/RailStatus-B3eI2AaD.js.map +1 -0
  178. package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js +2 -0
  179. package/dist/core/web/public/next/assets/ReasoningPane-ExT8XgQB.js.map +1 -0
  180. package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js +2 -0
  181. package/dist/core/web/public/next/assets/ReasoningSheet-YF4OS4lM.js.map +1 -0
  182. package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js +2 -0
  183. package/dist/core/web/public/next/assets/RefreshIndicator-BJoefKSa.js.map +1 -0
  184. package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js +2 -0
  185. package/dist/core/web/public/next/assets/RemoteMobileApp-C2SflRkm.js.map +1 -0
  186. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js +7 -0
  187. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-FkAdn3Sv.js.map +1 -0
  188. package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js +3 -0
  189. package/dist/core/web/public/next/assets/ResourcesChrome-CFHrLqmA.js.map +1 -0
  190. package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js +3 -0
  191. package/dist/core/web/public/next/assets/ResourcesDrawer-DtnZgDr_.js.map +1 -0
  192. package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js +2 -0
  193. package/dist/core/web/public/next/assets/RouteErrorBoundary-DTz5-ndE.js.map +1 -0
  194. package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js +2 -0
  195. package/dist/core/web/public/next/assets/RunInCloudAction-DvoDMV54.js.map +1 -0
  196. package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js +2 -0
  197. package/dist/core/web/public/next/assets/RunInDevinAction-BwCkFxLX.js.map +1 -0
  198. package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js +3 -0
  199. package/dist/core/web/public/next/assets/ScreenHost-jdgnt5U2.js.map +1 -0
  200. package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js +3 -0
  201. package/dist/core/web/public/next/assets/SeatSelector-DnpH5D_D.js.map +1 -0
  202. package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js +2 -0
  203. package/dist/core/web/public/next/assets/Segmented-BECZDbsg.js.map +1 -0
  204. package/dist/core/web/public/next/assets/Select-DjQDkPJU.js +2 -0
  205. package/dist/core/web/public/next/assets/Select-DjQDkPJU.js.map +1 -0
  206. package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js +2 -0
  207. package/dist/core/web/public/next/assets/SessionGate-CWuI8dDR.js.map +1 -0
  208. package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js +2 -0
  209. package/dist/core/web/public/next/assets/SessionInsightChip-DRsIQu29.js.map +1 -0
  210. package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js +2 -0
  211. package/dist/core/web/public/next/assets/SessionSearch-Bya3EXJl.js.map +1 -0
  212. package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js +2 -0
  213. package/dist/core/web/public/next/assets/SettingsSection-CXjiHNQb.js.map +1 -0
  214. package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js +2 -0
  215. package/dist/core/web/public/next/assets/SetupChecklist-YUMOJNbk.js.map +1 -0
  216. package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js +3 -0
  217. package/dist/core/web/public/next/assets/ShadowDecisions-BP2WgGMi.js.map +1 -0
  218. package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js +2 -0
  219. package/dist/core/web/public/next/assets/Sheet-Czuz3h6A.js.map +1 -0
  220. package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js +2 -0
  221. package/dist/core/web/public/next/assets/ShortcutsOverlay-D_ICte5N.js.map +1 -0
  222. package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js +3 -0
  223. package/dist/core/web/public/next/assets/Sidebar-CcI1_B9Y.js.map +1 -0
  224. package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js +2 -0
  225. package/dist/core/web/public/next/assets/SkipToContent-B0GAKhYQ.js.map +1 -0
  226. package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js +2 -0
  227. package/dist/core/web/public/next/assets/Slider-Dzv55CNY.js.map +1 -0
  228. package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js +2 -0
  229. package/dist/core/web/public/next/assets/SourcesPane-rxRCi7cL.js.map +1 -0
  230. package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js +2 -0
  231. package/dist/core/web/public/next/assets/SourcesPanel-LyMp7aLt.js.map +1 -0
  232. package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js +2 -0
  233. package/dist/core/web/public/next/assets/StatTile-1_HPOflX.js.map +1 -0
  234. package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js +2 -0
  235. package/dist/core/web/public/next/assets/StatusBadge-zR7YgIa8.js.map +1 -0
  236. package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js +2 -0
  237. package/dist/core/web/public/next/assets/StepBand-BGX2RpFV.js.map +1 -0
  238. package/dist/core/web/public/next/assets/Surface-BEToBKC3.js +2 -0
  239. package/dist/core/web/public/next/assets/Surface-BEToBKC3.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js +2 -0
  241. package/dist/core/web/public/next/assets/Swimlane-DAf7u5p3.js.map +1 -0
  242. package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js +2 -0
  243. package/dist/core/web/public/next/assets/Switch-mvc9lQcT.js.map +1 -0
  244. package/dist/core/web/public/next/assets/Tag-Chqolzxz.js +2 -0
  245. package/dist/core/web/public/next/assets/Tag-Chqolzxz.js.map +1 -0
  246. package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js +3 -0
  247. package/dist/core/web/public/next/assets/TerminalPane-4wn3AxS0.js.map +1 -0
  248. package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js +26 -0
  249. package/dist/core/web/public/next/assets/TerminalPane-D7-O0ssr.js.map +1 -0
  250. package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js +2 -0
  251. package/dist/core/web/public/next/assets/ThinkingBlock-gWESdTxs.js.map +1 -0
  252. package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js +2 -0
  253. package/dist/core/web/public/next/assets/UniverseConsoleApp-XqJvgt7b.js.map +1 -0
  254. package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js +9 -0
  255. package/dist/core/web/public/next/assets/UniverseView-D0j9HVku.js.map +1 -0
  256. package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js +3 -0
  257. package/dist/core/web/public/next/assets/UsageSection-DnSPo4Ua.js.map +1 -0
  258. package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js +2 -0
  259. package/dist/core/web/public/next/assets/UsePlaybookAction-71M3gO7g.js.map +1 -0
  260. package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js +3 -0
  261. package/dist/core/web/public/next/assets/VerseConsoleApp-DO84Xscn.js.map +1 -0
  262. package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js +3 -0
  263. package/dist/core/web/public/next/assets/VerseMobileApp-CrCDQcw5.js.map +1 -0
  264. package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js +2 -0
  265. package/dist/core/web/public/next/assets/VerseShared-CFE5B-IY.js.map +1 -0
  266. package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js +2 -0
  267. package/dist/core/web/public/next/assets/VoiceHud-CumHX7If.js.map +1 -0
  268. package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js +2 -0
  269. package/dist/core/web/public/next/assets/VoiceInput-CWTVwTwV.js.map +1 -0
  270. package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js +2 -0
  271. package/dist/core/web/public/next/assets/WikiSection-BIGSx4z-.js.map +1 -0
  272. package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js +6 -0
  273. package/dist/core/web/public/next/assets/Workspace-5sa9Xggd.js.map +1 -0
  274. package/dist/core/web/public/next/assets/actions-BPyW8QC-.js +2 -0
  275. package/dist/core/web/public/next/assets/actions-BPyW8QC-.js.map +1 -0
  276. package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js +2 -0
  277. package/dist/core/web/public/next/assets/agent-tools-client-Si2ncqwV.js.map +1 -0
  278. package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js +7 -0
  279. package/dist/core/web/public/next/assets/agent-transcript-model-D-34Ll59.js.map +1 -0
  280. package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js +2 -0
  281. package/dist/core/web/public/next/assets/agents-focus-E_TBTTmZ.js.map +1 -0
  282. package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js +2 -0
  283. package/dist/core/web/public/next/assets/app-version-y5sfMXiE.js.map +1 -0
  284. package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js +2 -0
  285. package/dist/core/web/public/next/assets/apps-model-BnjwUIUH.js.map +1 -0
  286. package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js +2 -0
  287. package/dist/core/web/public/next/assets/ask-seat-CWE-jY2D.js.map +1 -0
  288. package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js +2 -0
  289. package/dist/core/web/public/next/assets/authority-model-DVMxkDV4.js.map +1 -0
  290. package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js +2 -0
  291. package/dist/core/web/public/next/assets/automations-focus-B-lklYid.js.map +1 -0
  292. package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js +2 -0
  293. package/dist/core/web/public/next/assets/budget-model-Bwv4MZSa.js.map +1 -0
  294. package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js +2 -0
  295. package/dist/core/web/public/next/assets/budget-queries-t-Bdoly3.js.map +1 -0
  296. package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js +2 -0
  297. package/dist/core/web/public/next/assets/capacity-strip-model-CJ5F-CtB.js.map +1 -0
  298. package/dist/core/web/public/next/assets/charts-Di0_Q980.js +2 -0
  299. package/dist/core/web/public/next/assets/charts-Di0_Q980.js.map +1 -0
  300. package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js +2 -0
  301. package/dist/core/web/public/next/assets/chat-pane-data-5MDEsLff.js.map +1 -0
  302. package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js +2 -0
  303. package/dist/core/web/public/next/assets/checkpoint-queries-6thqsAiE.js.map +1 -0
  304. package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js +2 -0
  305. package/dist/core/web/public/next/assets/cloud-model-CzKeuxfm.js.map +1 -0
  306. package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js +2 -0
  307. package/dist/core/web/public/next/assets/cloud-queries-DrR_QeUK.js.map +1 -0
  308. package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js +2 -0
  309. package/dist/core/web/public/next/assets/command-catalog-COH2G2xv.js.map +1 -0
  310. package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js +2 -0
  311. package/dist/core/web/public/next/assets/composer-queries-GxFt1UQm.js.map +1 -0
  312. package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js +2 -0
  313. package/dist/core/web/public/next/assets/composer-state-DTAoie2b.js.map +1 -0
  314. package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js +2 -0
  315. package/dist/core/web/public/next/assets/connectivity-zM4_O-XZ.js.map +1 -0
  316. package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js +2 -0
  317. package/dist/core/web/public/next/assets/context-model-CKXUZd0O.js.map +1 -0
  318. package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js +3 -0
  319. package/dist/core/web/public/next/assets/context-model-DYkDKK6C.js.map +1 -0
  320. package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js +2 -0
  321. package/dist/core/web/public/next/assets/context-queries-D0Aydl5L.js.map +1 -0
  322. package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js +2 -0
  323. package/dist/core/web/public/next/assets/control-queries-C5uQTzJi.js.map +1 -0
  324. package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js +2 -0
  325. package/dist/core/web/public/next/assets/copy-setup-IHGsNfkz.js.map +1 -0
  326. package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js +2 -0
  327. package/dist/core/web/public/next/assets/deep-link-DgTIAuc2.js.map +1 -0
  328. package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js +2 -0
  329. package/dist/core/web/public/next/assets/device-permissions-BplZgouU.js.map +1 -0
  330. package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js +2 -0
  331. package/dist/core/web/public/next/assets/devin-queries-Bltl6Jz2.js.map +1 -0
  332. package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js +2 -0
  333. package/dist/core/web/public/next/assets/dock-icons-DPXFt10d.js.map +1 -0
  334. package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js +2 -0
  335. package/dist/core/web/public/next/assets/dock-panes-DNSv-1Tq.js.map +1 -0
  336. package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js +2 -0
  337. package/dist/core/web/public/next/assets/fleet-control-queries-DZEa-aFz.js.map +1 -0
  338. package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js +2 -0
  339. package/dist/core/web/public/next/assets/fleet-model-D4n8ErhA.js.map +1 -0
  340. package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js +2 -0
  341. package/dist/core/web/public/next/assets/fleet-queries-BO1MHMFz.js.map +1 -0
  342. package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js +3 -0
  343. package/dist/core/web/public/next/assets/fleet-state-yM0mV9_P.js.map +1 -0
  344. package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js +2 -0
  345. package/dist/core/web/public/next/assets/focus-trap-C2rynI8q.js.map +1 -0
  346. package/dist/core/web/public/next/assets/format-V6IiIMAL.js +2 -0
  347. package/dist/core/web/public/next/assets/format-V6IiIMAL.js.map +1 -0
  348. package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js +5 -0
  349. package/dist/core/web/public/next/assets/git-model-rVA0Jd0g.js.map +1 -0
  350. package/dist/core/web/public/next/assets/global-CYfRwH6t.js +3 -0
  351. package/dist/core/web/public/next/assets/global-CYfRwH6t.js.map +1 -0
  352. package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js +3 -0
  353. package/dist/core/web/public/next/assets/guarded-action-A9ZsIE8S.js.map +1 -0
  354. package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js +2 -0
  355. package/dist/core/web/public/next/assets/guarded-runners-xMakDn92.js.map +1 -0
  356. package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js +2 -0
  357. package/dist/core/web/public/next/assets/headroom-C4dyfw7P.js.map +1 -0
  358. package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js +2 -0
  359. package/dist/core/web/public/next/assets/health-queries-BHoSyIcL.js.map +1 -0
  360. package/dist/core/web/public/next/assets/icons-BBm_Cy62.js +2 -0
  361. package/dist/core/web/public/next/assets/icons-BBm_Cy62.js.map +1 -0
  362. package/dist/core/web/public/next/assets/index-_izD07R9.js +11 -0
  363. package/dist/core/web/public/next/assets/index-_izD07R9.js.map +1 -0
  364. package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js +2 -0
  365. package/dist/core/web/public/next/assets/jev-queries-D-AMM0sw.js.map +1 -0
  366. package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js +2 -0
  367. package/dist/core/web/public/next/assets/ladder-queries-BIpJVqxu.js.map +1 -0
  368. package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js +2 -0
  369. package/dist/core/web/public/next/assets/leader-focus-Dh4gXTSi.js.map +1 -0
  370. package/dist/core/web/public/next/assets/live-model-D97AfBFz.js +2 -0
  371. package/dist/core/web/public/next/assets/live-model-D97AfBFz.js.map +1 -0
  372. package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js +2 -0
  373. package/dist/core/web/public/next/assets/mind.module-rVKz51LB.js.map +1 -0
  374. package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js +2 -0
  375. package/dist/core/web/public/next/assets/mobile-actions-V26-lGbH.js.map +1 -0
  376. package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js +2 -0
  377. package/dist/core/web/public/next/assets/mobile-toast-9-WQbWQu.js.map +1 -0
  378. package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js +7 -0
  379. package/dist/core/web/public/next/assets/multimodel-flows-D309YXSk.js.map +1 -0
  380. package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js +2 -0
  381. package/dist/core/web/public/next/assets/multimodel-queries-BuslyWtq.js.map +1 -0
  382. package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js +2 -0
  383. package/dist/core/web/public/next/assets/mutations-B9AZoqNR.js.map +1 -0
  384. package/dist/core/web/public/next/assets/nav-DC0ynjdb.js +2 -0
  385. package/dist/core/web/public/next/assets/nav-DC0ynjdb.js.map +1 -0
  386. package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js +2 -0
  387. package/dist/core/web/public/next/assets/needs-you-actions-BOHN9fg7.js.map +1 -0
  388. package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js +2 -0
  389. package/dist/core/web/public/next/assets/needs-you-model-ChGg3r5r.js.map +1 -0
  390. package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js +2 -0
  391. package/dist/core/web/public/next/assets/open-terminal-5F1FNUEB.js.map +1 -0
  392. package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js +2 -0
  393. package/dist/core/web/public/next/assets/open-terminal-request-SjPIZmAt.js.map +1 -0
  394. package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js +2 -0
  395. package/dist/core/web/public/next/assets/overnight-queries-Dc46kMfg.js.map +1 -0
  396. package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js +2 -0
  397. package/dist/core/web/public/next/assets/palette-handoff-xkWF9v2M.js.map +1 -0
  398. package/dist/core/web/public/next/assets/panes-DOXM13lF.js +3 -0
  399. package/dist/core/web/public/next/assets/panes-DOXM13lF.js.map +1 -0
  400. package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js +2 -0
  401. package/dist/core/web/public/next/assets/path-display-C6BmdnBS.js.map +1 -0
  402. package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js +2 -0
  403. package/dist/core/web/public/next/assets/percent-text-CSk89zQF.js.map +1 -0
  404. package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js +2 -0
  405. package/dist/core/web/public/next/assets/playbook-composer-Bz-fFxXW.js.map +1 -0
  406. package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js +2 -0
  407. package/dist/core/web/public/next/assets/playbook-focus-BXu0yrHF.js.map +1 -0
  408. package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js +2 -0
  409. package/dist/core/web/public/next/assets/playbooks-queries-Cpnl3avl.js.map +1 -0
  410. package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js +2 -0
  411. package/dist/core/web/public/next/assets/preloaded-E_jepvvg.js.map +1 -0
  412. package/dist/core/web/public/next/assets/primitives-Bynv7bPl.js +1 -0
  413. package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js +2 -0
  414. package/dist/core/web/public/next/assets/pwa-D2lyCiGV.js.map +1 -0
  415. package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js +2 -0
  416. package/dist/core/web/public/next/assets/queries-C0Bs3TOo.js.map +1 -0
  417. package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js +2 -0
  418. package/dist/core/web/public/next/assets/reasoning-pref-DDPtfTM3.js.map +1 -0
  419. package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js +3 -0
  420. package/dist/core/web/public/next/assets/remote-session-Dj27m1xb.js.map +1 -0
  421. package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js +2 -0
  422. package/dist/core/web/public/next/assets/resolved-store-B2iJa5C2.js.map +1 -0
  423. package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js +2 -0
  424. package/dist/core/web/public/next/assets/resources-queries-pVRhOTEt.js.map +1 -0
  425. package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js +2 -0
  426. package/dist/core/web/public/next/assets/reveal-anchor-BAMmxMeu.js.map +1 -0
  427. package/dist/core/web/public/next/assets/rolldown-runtime-hePW80VL.js +1 -0
  428. package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js +2 -0
  429. package/dist/core/web/public/next/assets/seat-readiness-a5B9iqP-.js.map +1 -0
  430. package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js +2 -0
  431. package/dist/core/web/public/next/assets/seat-subscription-Cut6eC-8.js.map +1 -0
  432. package/dist/core/web/public/next/assets/sheet-BxZSmdad.js +2 -0
  433. package/dist/core/web/public/next/assets/sheet-BxZSmdad.js.map +1 -0
  434. package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js +2 -0
  435. package/dist/core/web/public/next/assets/sidebar-model-COzIPSiP.js.map +1 -0
  436. package/dist/core/web/public/next/assets/slots-BJc3RJkV.js +3 -0
  437. package/dist/core/web/public/next/assets/slots-BJc3RJkV.js.map +1 -0
  438. package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js +4 -0
  439. package/dist/core/web/public/next/assets/sources-queries-DCKiXNAt.js.map +1 -0
  440. package/dist/core/web/public/next/assets/sse-It4xa040.js +2 -0
  441. package/dist/core/web/public/next/assets/sse-It4xa040.js.map +1 -0
  442. package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js +2 -0
  443. package/dist/core/web/public/next/assets/surface-data-NFl_uS--.js.map +1 -0
  444. package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js +2 -0
  445. package/dist/core/web/public/next/assets/surface-prefetch-jMaLNI6z.js.map +1 -0
  446. package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js +2 -0
  447. package/dist/core/web/public/next/assets/tasks-model-CbmPgWL8.js.map +1 -0
  448. package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js +2 -0
  449. package/dist/core/web/public/next/assets/terminal-client-DTXAf2-x.js.map +1 -0
  450. package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js +2 -0
  451. package/dist/core/web/public/next/assets/terminal-icons-qBCOwqu-.js.map +1 -0
  452. package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js +6 -0
  453. package/dist/core/web/public/next/assets/terminal-view-CksH3CsK.js.map +1 -0
  454. package/dist/core/web/public/next/assets/thread-data-C8z55msn.js +2 -0
  455. package/dist/core/web/public/next/assets/thread-data-C8z55msn.js.map +1 -0
  456. package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js +2 -0
  457. package/dist/core/web/public/next/assets/ui-parts-CcpmRBwj.js.map +1 -0
  458. package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js +2 -0
  459. package/dist/core/web/public/next/assets/usage-queries-BxrTLCaJ.js.map +1 -0
  460. package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js +2 -0
  461. package/dist/core/web/public/next/assets/use-chat-activity-O8I0Ho0m.js.map +1 -0
  462. package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js +2 -0
  463. package/dist/core/web/public/next/assets/use-guarded-action-BZ6Bye9l.js.map +1 -0
  464. package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js +2 -0
  465. package/dist/core/web/public/next/assets/use-ticker-CUsNALmP.js.map +1 -0
  466. package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js +2 -0
  467. package/dist/core/web/public/next/assets/use-token-gate-DgnO9fbv.js.map +1 -0
  468. package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js +2 -0
  469. package/dist/core/web/public/next/assets/useAutoSeat-CIEXM-Q5.js.map +1 -0
  470. package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js +2 -0
  471. package/dist/core/web/public/next/assets/useOnboarding-BAmRBxkI.js.map +1 -0
  472. package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js +2 -0
  473. package/dist/core/web/public/next/assets/useSeatHealth-DPkSSddF.js.map +1 -0
  474. package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js +2 -0
  475. package/dist/core/web/public/next/assets/useSeatsRefresh-CpsRhfmt.js.map +1 -0
  476. package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js +2 -0
  477. package/dist/core/web/public/next/assets/useVerseSession-DeW1iFpw.js.map +1 -0
  478. package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js +2 -0
  479. package/dist/core/web/public/next/assets/useVerseTranscript-CvUqjRmZ.js.map +1 -0
  480. package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js +2 -0
  481. package/dist/core/web/public/next/assets/verse-bootstrap-query-ANtL2OPN.js.map +1 -0
  482. package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js +2 -0
  483. package/dist/core/web/public/next/assets/verse-icons-C92Qt7rh.js.map +1 -0
  484. package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js +2 -0
  485. package/dist/core/web/public/next/assets/verse-model-DAOz9LrY.js.map +1 -0
  486. package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js +3 -0
  487. package/dist/core/web/public/next/assets/warmup-B2DWWeeC.js.map +1 -0
  488. package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js +2 -0
  489. package/dist/core/web/public/next/assets/why-seat-model-Bn6O26JJ.js.map +1 -0
  490. package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js +2 -0
  491. package/dist/core/web/public/next/assets/wiki-focus-CwC-yoT9.js.map +1 -0
  492. package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js +2 -0
  493. package/dist/core/web/public/next/assets/workspace-model-C-q_I8xN.js.map +1 -0
  494. package/dist/core/web/public/next/index.html +2 -1
  495. package/dist/core/web/remote-gateway-policy.js +5 -0
  496. package/dist/core/web/remote-gateway-policy.js.map +1 -1
  497. package/dist/core/web/static.d.ts +4 -3
  498. package/dist/core/web/static.js +8 -5
  499. package/dist/core/web/static.js.map +1 -1
  500. package/dist/release-dependency-inventory.json +1 -1
  501. package/node_modules/fast-uri/index.js +20 -5
  502. package/node_modules/fast-uri/lib/utils.js +8 -1
  503. package/node_modules/fast-uri/package.json +1 -1
  504. package/node_modules/fast-uri/test/component-safe-serialization.test.js +58 -0
  505. package/node_modules/fast-uri/test/ipv6-validation.test.js +34 -0
  506. package/node_modules/ip-address/README.md +134 -134
  507. package/node_modules/ip-address/dist/address-error.d.ts +11 -0
  508. package/node_modules/ip-address/dist/address-error.js.map +1 -1
  509. package/node_modules/ip-address/dist/ipv4.d.ts +22 -6
  510. package/node_modules/ip-address/dist/ipv4.js +22 -6
  511. package/node_modules/ip-address/dist/ipv4.js.map +1 -1
  512. package/node_modules/ip-address/dist/ipv6.d.ts +26 -8
  513. package/node_modules/ip-address/dist/ipv6.js +46 -29
  514. package/node_modules/ip-address/dist/ipv6.js.map +1 -1
  515. package/node_modules/ip-address/dist/v6/constants.js +1 -0
  516. package/node_modules/ip-address/dist/v6/constants.js.map +1 -1
  517. package/node_modules/ip-address/package.json +1 -1
  518. package/package.json +5 -4
  519. package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js +0 -2
  520. package/dist/core/web/public/next/assets/ActionMenu-Bia8Re6u.js.map +0 -1
  521. package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js +0 -2
  522. package/dist/core/web/public/next/assets/Advanced-C1LtnA8c.js.map +0 -1
  523. package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js +0 -2
  524. package/dist/core/web/public/next/assets/AgentDetailScreen-DuoXrbol.js.map +0 -1
  525. package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js +0 -2
  526. package/dist/core/web/public/next/assets/AgentToolsSheet-Bdfk4SF-.js.map +0 -1
  527. package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js +0 -2
  528. package/dist/core/web/public/next/assets/AgentToolsStrip-BN1otiqC.js.map +0 -1
  529. package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js +0 -2
  530. package/dist/core/web/public/next/assets/AgentsScreen-BxHFaI48.js.map +0 -1
  531. package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js +0 -3
  532. package/dist/core/web/public/next/assets/AgentsSection-mYIA8Lyk.js.map +0 -1
  533. package/dist/core/web/public/next/assets/App-DebYuj1v.js +0 -8
  534. package/dist/core/web/public/next/assets/App-DebYuj1v.js.map +0 -1
  535. package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js +0 -2
  536. package/dist/core/web/public/next/assets/AppsSection-W30duGQA.js.map +0 -1
  537. package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js +0 -2
  538. package/dist/core/web/public/next/assets/AreaTrend-ZnnIjBGU.js.map +0 -1
  539. package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js +0 -2
  540. package/dist/core/web/public/next/assets/AutomationsSection-B4N0V-vz.js.map +0 -1
  541. package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js +0 -3
  542. package/dist/core/web/public/next/assets/AutonomyOffState-C9S_FXc0.js.map +0 -1
  543. package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js +0 -2
  544. package/dist/core/web/public/next/assets/AutonomySection-oMQfNEQN.js.map +0 -1
  545. package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js +0 -2
  546. package/dist/core/web/public/next/assets/AutonomyStatus-CdHOyhrV.js.map +0 -1
  547. package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js +0 -2
  548. package/dist/core/web/public/next/assets/BranchBar-Bo5b8-hr.js.map +0 -1
  549. package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js +0 -7
  550. package/dist/core/web/public/next/assets/BrowserPanel-D02omBK0.js.map +0 -1
  551. package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js +0 -2
  552. package/dist/core/web/public/next/assets/BudgetControl-BtPTi8qI.js.map +0 -1
  553. package/dist/core/web/public/next/assets/Button-DP2ImS5n.js +0 -2
  554. package/dist/core/web/public/next/assets/Button-DP2ImS5n.js.map +0 -1
  555. package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js +0 -2
  556. package/dist/core/web/public/next/assets/CapacityStrip-ChYPcr23.js.map +0 -1
  557. package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js +0 -16
  558. package/dist/core/web/public/next/assets/ChangesPaneHost-C53_94Kn.js.map +0 -1
  559. package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js +0 -2
  560. package/dist/core/web/public/next/assets/ChartFrame-CtFLETWA.js.map +0 -1
  561. package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js +0 -2
  562. package/dist/core/web/public/next/assets/ChatPanes-CyAK9VAi.js.map +0 -1
  563. package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js +0 -3
  564. package/dist/core/web/public/next/assets/ChatSection-DV9smoPe.js.map +0 -1
  565. package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js +0 -5
  566. package/dist/core/web/public/next/assets/ChecksPanel-B6T2sjc_.js.map +0 -1
  567. package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js +0 -2
  568. package/dist/core/web/public/next/assets/CloudBudgetForm-D8RbdAC7.js.map +0 -1
  569. package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js +0 -3
  570. package/dist/core/web/public/next/assets/CommandPalette-C04gGTES.js.map +0 -1
  571. package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js +0 -3
  572. package/dist/core/web/public/next/assets/CommandSection-Be8VFAEU.js.map +0 -1
  573. package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js +0 -9
  574. package/dist/core/web/public/next/assets/CommandWorkflowForm-D5A7c2PE.js.map +0 -1
  575. package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js +0 -3
  576. package/dist/core/web/public/next/assets/CommandWorkflowPicker-CGrRWfzQ.js.map +0 -1
  577. package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js +0 -4
  578. package/dist/core/web/public/next/assets/CompareDialog-C2ryiEtF.js.map +0 -1
  579. package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js +0 -2
  580. package/dist/core/web/public/next/assets/ComputerControl-C4oW7Zim.js.map +0 -1
  581. package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js +0 -2
  582. package/dist/core/web/public/next/assets/ConfirmDialog-J8CszPmj.js.map +0 -1
  583. package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js +0 -2
  584. package/dist/core/web/public/next/assets/DeleteChatDialog-BT5y9cR2.js.map +0 -1
  585. package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js +0 -2
  586. package/dist/core/web/public/next/assets/DevinStopDialog-CADdSqha.js.map +0 -1
  587. package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js +0 -2
  588. package/dist/core/web/public/next/assets/Dialog-BYIKNPcH.js.map +0 -1
  589. package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js +0 -2
  590. package/dist/core/web/public/next/assets/DiffPane-D_CC9a5x.js.map +0 -1
  591. package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js +0 -2
  592. package/dist/core/web/public/next/assets/DiffViewer-DjtLl7ro.js.map +0 -1
  593. package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js +0 -2
  594. package/dist/core/web/public/next/assets/DockHost-BHbosAjM.js.map +0 -1
  595. package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js +0 -2
  596. package/dist/core/web/public/next/assets/EmptyState-BEXDoNZd.js.map +0 -1
  597. package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js +0 -2
  598. package/dist/core/web/public/next/assets/Epistemic-BPBAmLNh.js.map +0 -1
  599. package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js +0 -2
  600. package/dist/core/web/public/next/assets/EvidenceTimeline-D2nuo6Oo.js.map +0 -1
  601. package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js +0 -2
  602. package/dist/core/web/public/next/assets/FilesPane-BQBcWyxr.js.map +0 -1
  603. package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js +0 -2
  604. package/dist/core/web/public/next/assets/FleetScreen-YXDuVwKd.js.map +0 -1
  605. package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js +0 -5
  606. package/dist/core/web/public/next/assets/FleetSection-D2M7u9zG.js.map +0 -1
  607. package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js +0 -2
  608. package/dist/core/web/public/next/assets/Funnel-rnPUaoN7.js.map +0 -1
  609. package/dist/core/web/public/next/assets/GearTray-Cc14h572.js +0 -2
  610. package/dist/core/web/public/next/assets/GearTray-Cc14h572.js.map +0 -1
  611. package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js +0 -2
  612. package/dist/core/web/public/next/assets/GitDialogs-BSTlyNJR.js.map +0 -1
  613. package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js +0 -3
  614. package/dist/core/web/public/next/assets/GrowthSection-BK63EJn9.js.map +0 -1
  615. package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js +0 -2
  616. package/dist/core/web/public/next/assets/HandoffDialog-DD4M-C7v.js.map +0 -1
  617. package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js +0 -3
  618. package/dist/core/web/public/next/assets/HomeBody-OEhTpkk9.js.map +0 -1
  619. package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js +0 -2
  620. package/dist/core/web/public/next/assets/HomeSeats-CJCxRUlD.js.map +0 -1
  621. package/dist/core/web/public/next/assets/Input-BEF-ScuG.js +0 -2
  622. package/dist/core/web/public/next/assets/Input-BEF-ScuG.js.map +0 -1
  623. package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js +0 -9
  624. package/dist/core/web/public/next/assets/LaunchDialog-CERI717u.js.map +0 -1
  625. package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js +0 -2
  626. package/dist/core/web/public/next/assets/LeaderCard-3P95vgVU.js.map +0 -1
  627. package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js +0 -3
  628. package/dist/core/web/public/next/assets/LeaderConversation-DjZS2PrX.js.map +0 -1
  629. package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js +0 -2
  630. package/dist/core/web/public/next/assets/LeaderScreen-Dw5jDfWv.js.map +0 -1
  631. package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js +0 -2
  632. package/dist/core/web/public/next/assets/LessonsPanel-Wy6TVWEv.js.map +0 -1
  633. package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js +0 -2
  634. package/dist/core/web/public/next/assets/LiveTimer-c18lVIBC.js.map +0 -1
  635. package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js +0 -2
  636. package/dist/core/web/public/next/assets/LocalSeatBadge-BfUUuXE5.js.map +0 -1
  637. package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js +0 -2
  638. package/dist/core/web/public/next/assets/MatrixHeatmap-DTOumwCS.js.map +0 -1
  639. package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js +0 -2
  640. package/dist/core/web/public/next/assets/McpSection-D9eJislZ.js.map +0 -1
  641. package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js +0 -3
  642. package/dist/core/web/public/next/assets/MessageMarkdown-Dkw4V24c.js.map +0 -1
  643. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js +0 -72
  644. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-VOSfkJpd.js.map +0 -1
  645. package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js +0 -2
  646. package/dist/core/web/public/next/assets/Meter-dMqKBaVV.js.map +0 -1
  647. package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js +0 -2
  648. package/dist/core/web/public/next/assets/MicButton-92I_NsaT.js.map +0 -1
  649. package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js +0 -3
  650. package/dist/core/web/public/next/assets/MindSection-CaGckJiR.js.map +0 -1
  651. package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js +0 -2
  652. package/dist/core/web/public/next/assets/MobileComposer-BOFWmkku.js.map +0 -1
  653. package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js +0 -2
  654. package/dist/core/web/public/next/assets/MobileGuardSheet-CY3Iulte.js.map +0 -1
  655. package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js +0 -3
  656. package/dist/core/web/public/next/assets/MobileRuntime-C-GtV4jT.js.map +0 -1
  657. package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js +0 -2
  658. package/dist/core/web/public/next/assets/MoreScreen-BaH8iEnb.js.map +0 -1
  659. package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js +0 -7
  660. package/dist/core/web/public/next/assets/MultiModelBar-7DHuXGht.js.map +0 -1
  661. package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js +0 -2
  662. package/dist/core/web/public/next/assets/MutationTokenDialog-D522NXsm.js.map +0 -1
  663. package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js +0 -3
  664. package/dist/core/web/public/next/assets/NeedsYouDrawer-6ud1RHOU.js.map +0 -1
  665. package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js +0 -2
  666. package/dist/core/web/public/next/assets/NeedsYouList-E-yy-xKE.js.map +0 -1
  667. package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js +0 -2
  668. package/dist/core/web/public/next/assets/NeedsYouScreen-D13Q7iU8.js.map +0 -1
  669. package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js +0 -2
  670. package/dist/core/web/public/next/assets/NewAgentScreen-BLtU1u-d.js.map +0 -1
  671. package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js +0 -4
  672. package/dist/core/web/public/next/assets/NewChatDialog-BL15LCaj.js.map +0 -1
  673. package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js +0 -3
  674. package/dist/core/web/public/next/assets/OnboardingFlow-7LRC7FlX.js.map +0 -1
  675. package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js +0 -3
  676. package/dist/core/web/public/next/assets/OnboardingGate-DRlv8QZ5.js.map +0 -1
  677. package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js +0 -9
  678. package/dist/core/web/public/next/assets/PlaybooksSection-D_uQ-NB3.js.map +0 -1
  679. package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js +0 -2
  680. package/dist/core/web/public/next/assets/PreviewPane-DubyNi8H.js.map +0 -1
  681. package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js +0 -2
  682. package/dist/core/web/public/next/assets/ProviderLogo-CWrojWjI.js.map +0 -1
  683. package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js +0 -2
  684. package/dist/core/web/public/next/assets/RailStatus-xjOcjL0v.js.map +0 -1
  685. package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js +0 -2
  686. package/dist/core/web/public/next/assets/ReasoningPane-M7ZfvEc5.js.map +0 -1
  687. package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js +0 -2
  688. package/dist/core/web/public/next/assets/ReasoningSheet-RLLj2oys.js.map +0 -1
  689. package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js +0 -2
  690. package/dist/core/web/public/next/assets/RefreshIndicator-CEMRNruu.js.map +0 -1
  691. package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js +0 -2
  692. package/dist/core/web/public/next/assets/RemoteMobileApp-BcXsVw0z.js.map +0 -1
  693. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js +0 -7
  694. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-BC_Q_i0I.js.map +0 -1
  695. package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js +0 -3
  696. package/dist/core/web/public/next/assets/ResourcesChrome-CPcTYvZR.js.map +0 -1
  697. package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js +0 -3
  698. package/dist/core/web/public/next/assets/ResourcesDrawer-C6VzGCSv.js.map +0 -1
  699. package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js +0 -2
  700. package/dist/core/web/public/next/assets/RouteErrorBoundary-Cc9GsjZz.js.map +0 -1
  701. package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js +0 -2
  702. package/dist/core/web/public/next/assets/RunInCloudAction-P_hDsqjX.js.map +0 -1
  703. package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js +0 -2
  704. package/dist/core/web/public/next/assets/RunInDevinAction-CfNpQCP3.js.map +0 -1
  705. package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js +0 -3
  706. package/dist/core/web/public/next/assets/ScreenHost-BBYihlNQ.js.map +0 -1
  707. package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js +0 -3
  708. package/dist/core/web/public/next/assets/SeatSelector-DSd_pxg2.js.map +0 -1
  709. package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js +0 -2
  710. package/dist/core/web/public/next/assets/Segmented-CtwuFlbY.js.map +0 -1
  711. package/dist/core/web/public/next/assets/Select-zXMdgblm.js +0 -2
  712. package/dist/core/web/public/next/assets/Select-zXMdgblm.js.map +0 -1
  713. package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js +0 -2
  714. package/dist/core/web/public/next/assets/SessionGate-88QiSoXo.js.map +0 -1
  715. package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js +0 -2
  716. package/dist/core/web/public/next/assets/SessionInsightChip-CaPvisvI.js.map +0 -1
  717. package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js +0 -2
  718. package/dist/core/web/public/next/assets/SessionSearch-Ch3veGxY.js.map +0 -1
  719. package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js +0 -2
  720. package/dist/core/web/public/next/assets/SettingsSection-DLSYZEFc.js.map +0 -1
  721. package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js +0 -2
  722. package/dist/core/web/public/next/assets/SetupChecklist-DFAVVLpJ.js.map +0 -1
  723. package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js +0 -3
  724. package/dist/core/web/public/next/assets/ShadowDecisions-Gtrbo4US.js.map +0 -1
  725. package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js +0 -2
  726. package/dist/core/web/public/next/assets/Sheet-D72WH4mP.js.map +0 -1
  727. package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js +0 -2
  728. package/dist/core/web/public/next/assets/ShortcutsOverlay-DKetDlCR.js.map +0 -1
  729. package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js +0 -3
  730. package/dist/core/web/public/next/assets/Sidebar-CqOJle0q.js.map +0 -1
  731. package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js +0 -2
  732. package/dist/core/web/public/next/assets/SkipToContent-C7UObcP2.js.map +0 -1
  733. package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js +0 -2
  734. package/dist/core/web/public/next/assets/Slider-Bi5q-21C.js.map +0 -1
  735. package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js +0 -2
  736. package/dist/core/web/public/next/assets/SourcesPane-D7Raaor0.js.map +0 -1
  737. package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js +0 -2
  738. package/dist/core/web/public/next/assets/SourcesPanel-CCSdY5Os.js.map +0 -1
  739. package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js +0 -2
  740. package/dist/core/web/public/next/assets/StatTile-BS_dzInS.js.map +0 -1
  741. package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js +0 -2
  742. package/dist/core/web/public/next/assets/StatusBadge-CJbb9DhR.js.map +0 -1
  743. package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js +0 -2
  744. package/dist/core/web/public/next/assets/StepBand-Bfj1YYTl.js.map +0 -1
  745. package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js +0 -2
  746. package/dist/core/web/public/next/assets/Surface-CV-NXGIM.js.map +0 -1
  747. package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js +0 -2
  748. package/dist/core/web/public/next/assets/Swimlane-DbUp4tjD.js.map +0 -1
  749. package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js +0 -2
  750. package/dist/core/web/public/next/assets/Switch-BtEo9Cku.js.map +0 -1
  751. package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js +0 -2
  752. package/dist/core/web/public/next/assets/Tag-CMFqY2MP.js.map +0 -1
  753. package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js +0 -26
  754. package/dist/core/web/public/next/assets/TerminalPane-BCjlhc3t.js.map +0 -1
  755. package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js +0 -3
  756. package/dist/core/web/public/next/assets/TerminalPane-DIwGSCA9.js.map +0 -1
  757. package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js +0 -2
  758. package/dist/core/web/public/next/assets/ThinkingBlock-Db8qnuKz.js.map +0 -1
  759. package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js +0 -2
  760. package/dist/core/web/public/next/assets/UniverseConsoleApp-ksreONXM.js.map +0 -1
  761. package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js +0 -9
  762. package/dist/core/web/public/next/assets/UniverseView-CfT9Dsl7.js.map +0 -1
  763. package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js +0 -3
  764. package/dist/core/web/public/next/assets/UsageSection-DypcdQys.js.map +0 -1
  765. package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js +0 -2
  766. package/dist/core/web/public/next/assets/UsePlaybookAction-Bxwqrpwe.js.map +0 -1
  767. package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js +0 -3
  768. package/dist/core/web/public/next/assets/VerseConsoleApp-kFOEmnGC.js.map +0 -1
  769. package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js +0 -3
  770. package/dist/core/web/public/next/assets/VerseMobileApp-BTGF5yuZ.js.map +0 -1
  771. package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js +0 -2
  772. package/dist/core/web/public/next/assets/VerseShared-_pMXKs8m.js.map +0 -1
  773. package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js +0 -2
  774. package/dist/core/web/public/next/assets/VoiceHud-B_hiHfnQ.js.map +0 -1
  775. package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js +0 -2
  776. package/dist/core/web/public/next/assets/VoiceInput-B7yrGchr.js.map +0 -1
  777. package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js +0 -2
  778. package/dist/core/web/public/next/assets/WikiSection-BXu4aZyr.js.map +0 -1
  779. package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js +0 -6
  780. package/dist/core/web/public/next/assets/Workspace-BYT3iuNM.js.map +0 -1
  781. package/dist/core/web/public/next/assets/actions-CyO4R-IO.js +0 -2
  782. package/dist/core/web/public/next/assets/actions-CyO4R-IO.js.map +0 -1
  783. package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js +0 -2
  784. package/dist/core/web/public/next/assets/agent-tools-client-FgVNokGh.js.map +0 -1
  785. package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js +0 -7
  786. package/dist/core/web/public/next/assets/agent-transcript-model-CRa_I3eR.js.map +0 -1
  787. package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js +0 -2
  788. package/dist/core/web/public/next/assets/agents-focus-D2hd-RNJ.js.map +0 -1
  789. package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js +0 -2
  790. package/dist/core/web/public/next/assets/app-version-DDlXX8-W.js.map +0 -1
  791. package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js +0 -2
  792. package/dist/core/web/public/next/assets/apps-model-DLQgiczq.js.map +0 -1
  793. package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js +0 -2
  794. package/dist/core/web/public/next/assets/ask-seat-zMpqJABI.js.map +0 -1
  795. package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js +0 -2
  796. package/dist/core/web/public/next/assets/authority-model-BvLFgPaX.js.map +0 -1
  797. package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js +0 -2
  798. package/dist/core/web/public/next/assets/automations-focus-zqI9oIl8.js.map +0 -1
  799. package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js +0 -2
  800. package/dist/core/web/public/next/assets/budget-model-CKd0d1Cj.js.map +0 -1
  801. package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js +0 -2
  802. package/dist/core/web/public/next/assets/budget-queries-q7mCG9Ek.js.map +0 -1
  803. package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js +0 -2
  804. package/dist/core/web/public/next/assets/capacity-strip-model-pdIEweaZ.js.map +0 -1
  805. package/dist/core/web/public/next/assets/charts-D3I0q4hG.js +0 -2
  806. package/dist/core/web/public/next/assets/charts-D3I0q4hG.js.map +0 -1
  807. package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js +0 -2
  808. package/dist/core/web/public/next/assets/chat-pane-data-DIDV7uIU.js.map +0 -1
  809. package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js +0 -2
  810. package/dist/core/web/public/next/assets/checkpoint-queries-DjrDEsN-.js.map +0 -1
  811. package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js +0 -2
  812. package/dist/core/web/public/next/assets/cloud-model-DuboHWPT.js.map +0 -1
  813. package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js +0 -2
  814. package/dist/core/web/public/next/assets/cloud-queries-DQF1a_R-.js.map +0 -1
  815. package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js +0 -2
  816. package/dist/core/web/public/next/assets/command-catalog-BzHSIzIS.js.map +0 -1
  817. package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js +0 -2
  818. package/dist/core/web/public/next/assets/composer-queries-BEYuD6Qr.js.map +0 -1
  819. package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js +0 -2
  820. package/dist/core/web/public/next/assets/composer-state-B4KVc2ZZ.js.map +0 -1
  821. package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js +0 -2
  822. package/dist/core/web/public/next/assets/connectivity-Svn7iy2K.js.map +0 -1
  823. package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js +0 -2
  824. package/dist/core/web/public/next/assets/context-model-C9EIuPJ_.js.map +0 -1
  825. package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js +0 -3
  826. package/dist/core/web/public/next/assets/context-model-DU3OPiBC.js.map +0 -1
  827. package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js +0 -2
  828. package/dist/core/web/public/next/assets/context-queries-Cgb_XvRv.js.map +0 -1
  829. package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js +0 -2
  830. package/dist/core/web/public/next/assets/control-queries-Clgsy_eH.js.map +0 -1
  831. package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js +0 -2
  832. package/dist/core/web/public/next/assets/copy-setup-C-hDt9sS.js.map +0 -1
  833. package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js +0 -2
  834. package/dist/core/web/public/next/assets/deep-link-Cgvchdy7.js.map +0 -1
  835. package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js +0 -2
  836. package/dist/core/web/public/next/assets/device-permissions-JmqkyrDw.js.map +0 -1
  837. package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js +0 -2
  838. package/dist/core/web/public/next/assets/devin-queries-DKgeD4_S.js.map +0 -1
  839. package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js +0 -2
  840. package/dist/core/web/public/next/assets/dock-icons-CRHjXBWm.js.map +0 -1
  841. package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js +0 -2
  842. package/dist/core/web/public/next/assets/dock-panes-C98u13Bi.js.map +0 -1
  843. package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js +0 -2
  844. package/dist/core/web/public/next/assets/fleet-control-queries-BLoc5Gza.js.map +0 -1
  845. package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js +0 -2
  846. package/dist/core/web/public/next/assets/fleet-model-CPTadBFK.js.map +0 -1
  847. package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js +0 -2
  848. package/dist/core/web/public/next/assets/fleet-queries-69WuY-dt.js.map +0 -1
  849. package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js +0 -3
  850. package/dist/core/web/public/next/assets/fleet-state-CCdBRK-m.js.map +0 -1
  851. package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js +0 -2
  852. package/dist/core/web/public/next/assets/focus-trap-C8MiYlLZ.js.map +0 -1
  853. package/dist/core/web/public/next/assets/format-CcEKjUou.js +0 -2
  854. package/dist/core/web/public/next/assets/format-CcEKjUou.js.map +0 -1
  855. package/dist/core/web/public/next/assets/git-model-DL3MwN93.js +0 -5
  856. package/dist/core/web/public/next/assets/git-model-DL3MwN93.js.map +0 -1
  857. package/dist/core/web/public/next/assets/global-BWc2NPzv.js +0 -3
  858. package/dist/core/web/public/next/assets/global-BWc2NPzv.js.map +0 -1
  859. package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js +0 -3
  860. package/dist/core/web/public/next/assets/guarded-action-BK2_U5ho.js.map +0 -1
  861. package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js +0 -2
  862. package/dist/core/web/public/next/assets/guarded-runners-Q0UkoY3H.js.map +0 -1
  863. package/dist/core/web/public/next/assets/headroom-CP99UxyV.js +0 -2
  864. package/dist/core/web/public/next/assets/headroom-CP99UxyV.js.map +0 -1
  865. package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js +0 -2
  866. package/dist/core/web/public/next/assets/health-queries-D8TwNTDQ.js.map +0 -1
  867. package/dist/core/web/public/next/assets/icons-U34oiN9M.js +0 -2
  868. package/dist/core/web/public/next/assets/icons-U34oiN9M.js.map +0 -1
  869. package/dist/core/web/public/next/assets/index-BbDqdepe.js +0 -11
  870. package/dist/core/web/public/next/assets/index-BbDqdepe.js.map +0 -1
  871. package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js +0 -2
  872. package/dist/core/web/public/next/assets/jev-queries-CiQDnM5r.js.map +0 -1
  873. package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js +0 -2
  874. package/dist/core/web/public/next/assets/ladder-queries-Cf64JB04.js.map +0 -1
  875. package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js +0 -2
  876. package/dist/core/web/public/next/assets/leader-focus-azN19kfO.js.map +0 -1
  877. package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js +0 -2
  878. package/dist/core/web/public/next/assets/live-model-DHX_2gOu.js.map +0 -1
  879. package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js +0 -2
  880. package/dist/core/web/public/next/assets/mind.module-BJpuH2JT.js.map +0 -1
  881. package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js +0 -2
  882. package/dist/core/web/public/next/assets/mobile-actions-CvGouAAH.js.map +0 -1
  883. package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js +0 -2
  884. package/dist/core/web/public/next/assets/mobile-toast-C_UP13GQ.js.map +0 -1
  885. package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js +0 -7
  886. package/dist/core/web/public/next/assets/multimodel-flows-C377w9oZ.js.map +0 -1
  887. package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js +0 -2
  888. package/dist/core/web/public/next/assets/multimodel-queries-_Y1QXAqq.js.map +0 -1
  889. package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js +0 -2
  890. package/dist/core/web/public/next/assets/mutations-DL4u2kRQ.js.map +0 -1
  891. package/dist/core/web/public/next/assets/nav-CM-mJcSq.js +0 -2
  892. package/dist/core/web/public/next/assets/nav-CM-mJcSq.js.map +0 -1
  893. package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js +0 -2
  894. package/dist/core/web/public/next/assets/needs-you-actions-DF2zEltF.js.map +0 -1
  895. package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js +0 -2
  896. package/dist/core/web/public/next/assets/needs-you-model-DqmU5YOe.js.map +0 -1
  897. package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js +0 -2
  898. package/dist/core/web/public/next/assets/open-terminal-BAnwAOoA.js.map +0 -1
  899. package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js +0 -2
  900. package/dist/core/web/public/next/assets/open-terminal-request-f5_ItEpF.js.map +0 -1
  901. package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js +0 -2
  902. package/dist/core/web/public/next/assets/overnight-queries-BP6viiM5.js.map +0 -1
  903. package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js +0 -2
  904. package/dist/core/web/public/next/assets/palette-handoff-Bmq98lDl.js.map +0 -1
  905. package/dist/core/web/public/next/assets/panes-BjUzIDw6.js +0 -3
  906. package/dist/core/web/public/next/assets/panes-BjUzIDw6.js.map +0 -1
  907. package/dist/core/web/public/next/assets/path-display-HyxETV-f.js +0 -2
  908. package/dist/core/web/public/next/assets/path-display-HyxETV-f.js.map +0 -1
  909. package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js +0 -2
  910. package/dist/core/web/public/next/assets/playbook-composer-DwuBBP4I.js.map +0 -1
  911. package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js +0 -2
  912. package/dist/core/web/public/next/assets/playbook-focus-B9xzeUMw.js.map +0 -1
  913. package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js +0 -2
  914. package/dist/core/web/public/next/assets/playbooks-queries-C8j1Aswo.js.map +0 -1
  915. package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js +0 -2
  916. package/dist/core/web/public/next/assets/preloaded-CLDUOHXJ.js.map +0 -1
  917. package/dist/core/web/public/next/assets/primitives-BEXDE-HP.js +0 -1
  918. package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js +0 -2
  919. package/dist/core/web/public/next/assets/pwa-lVT_VRkK.js.map +0 -1
  920. package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js +0 -2
  921. package/dist/core/web/public/next/assets/queries-T7ZUVqyA.js.map +0 -1
  922. package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js +0 -2
  923. package/dist/core/web/public/next/assets/reasoning-pref-CWEri5xB.js.map +0 -1
  924. package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js +0 -3
  925. package/dist/core/web/public/next/assets/remote-session-BPULIfdG.js.map +0 -1
  926. package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js +0 -2
  927. package/dist/core/web/public/next/assets/resolved-store-Ba-W6Uhy.js.map +0 -1
  928. package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js +0 -2
  929. package/dist/core/web/public/next/assets/resources-queries-CKyXyaDY.js.map +0 -1
  930. package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js +0 -2
  931. package/dist/core/web/public/next/assets/reveal-anchor-Djk1vGLl.js.map +0 -1
  932. package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js +0 -2
  933. package/dist/core/web/public/next/assets/seat-readiness-CvEmMBol.js.map +0 -1
  934. package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js +0 -2
  935. package/dist/core/web/public/next/assets/seat-subscription-BClqZwau.js.map +0 -1
  936. package/dist/core/web/public/next/assets/sheet-D0ciShoy.js +0 -2
  937. package/dist/core/web/public/next/assets/sheet-D0ciShoy.js.map +0 -1
  938. package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js +0 -2
  939. package/dist/core/web/public/next/assets/sidebar-model-BZ9Wh1lR.js.map +0 -1
  940. package/dist/core/web/public/next/assets/slots-m3L6Ints.js +0 -3
  941. package/dist/core/web/public/next/assets/slots-m3L6Ints.js.map +0 -1
  942. package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js +0 -4
  943. package/dist/core/web/public/next/assets/sources-queries-DeIlxb3A.js.map +0 -1
  944. package/dist/core/web/public/next/assets/sse-CK65-Cun.js +0 -2
  945. package/dist/core/web/public/next/assets/sse-CK65-Cun.js.map +0 -1
  946. package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js +0 -2
  947. package/dist/core/web/public/next/assets/surface-data-DoN8peNV.js.map +0 -1
  948. package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js +0 -2
  949. package/dist/core/web/public/next/assets/surface-prefetch-CVNIptSl.js.map +0 -1
  950. package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js +0 -2
  951. package/dist/core/web/public/next/assets/tasks-model-BueAhEAf.js.map +0 -1
  952. package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js +0 -2
  953. package/dist/core/web/public/next/assets/terminal-client-DO0eRhRi.js.map +0 -1
  954. package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js +0 -2
  955. package/dist/core/web/public/next/assets/terminal-icons-COMoAiDd.js.map +0 -1
  956. package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js +0 -6
  957. package/dist/core/web/public/next/assets/terminal-view-DkVXx7Xk.js.map +0 -1
  958. package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js +0 -2
  959. package/dist/core/web/public/next/assets/thread-data-Dq7QugaD.js.map +0 -1
  960. package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js +0 -2
  961. package/dist/core/web/public/next/assets/ui-parts-2JLq2ZSq.js.map +0 -1
  962. package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js +0 -2
  963. package/dist/core/web/public/next/assets/usage-queries-CDKUE4e0.js.map +0 -1
  964. package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js +0 -2
  965. package/dist/core/web/public/next/assets/use-chat-activity-BaNWmI2A.js.map +0 -1
  966. package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js +0 -2
  967. package/dist/core/web/public/next/assets/use-guarded-action-D4m4Mlzr.js.map +0 -1
  968. package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js +0 -2
  969. package/dist/core/web/public/next/assets/use-ticker-PQ_oYxn5.js.map +0 -1
  970. package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js +0 -2
  971. package/dist/core/web/public/next/assets/use-token-gate-_JPjMD5z.js.map +0 -1
  972. package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js +0 -2
  973. package/dist/core/web/public/next/assets/useAutoSeat-CkyqgwX9.js.map +0 -1
  974. package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js +0 -2
  975. package/dist/core/web/public/next/assets/useOnboarding-3r8T1GBP.js.map +0 -1
  976. package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js +0 -2
  977. package/dist/core/web/public/next/assets/useSeatHealth-C08b9zut.js.map +0 -1
  978. package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js +0 -2
  979. package/dist/core/web/public/next/assets/useSeatsRefresh-BGsdylUl.js.map +0 -1
  980. package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js +0 -2
  981. package/dist/core/web/public/next/assets/useVerseSession-0MnfpcHg.js.map +0 -1
  982. package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js +0 -2
  983. package/dist/core/web/public/next/assets/useVerseTranscript-B6wLDOv8.js.map +0 -1
  984. package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js +0 -2
  985. package/dist/core/web/public/next/assets/verse-bootstrap-query-BR5ypA8b.js.map +0 -1
  986. package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js +0 -2
  987. package/dist/core/web/public/next/assets/verse-icons-BQxBZk9k.js.map +0 -1
  988. package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js +0 -2
  989. package/dist/core/web/public/next/assets/verse-model-CkF3q2IH.js.map +0 -1
  990. package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js +0 -3
  991. package/dist/core/web/public/next/assets/warmup-CqTK8yIn.js.map +0 -1
  992. package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js +0 -2
  993. package/dist/core/web/public/next/assets/why-seat-model-Dh4-Ty9n.js.map +0 -1
  994. package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js +0 -2
  995. package/dist/core/web/public/next/assets/wiki-focus-CisQb_pM.js.map +0 -1
  996. package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js +0 -2
  997. package/dist/core/web/public/next/assets/workspace-model-DRGckE8q.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"GitDialogs-BSTlyNJR.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/git/GitDialogs.module.css","../../../../../../src/web-ui/routes/verse/git/GitDialogs.tsx"],"sourcesContent":["/*\n * Git dialogs: a list of facts (what the click does), the fields, then the\n * actions. Facts read like a receipt — short lines, refs in mono.\n */\n.form {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n}\n\n.facts {\n list-style: none;\n margin: 0 0 var(--space-2);\n padding: var(--space-3);\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n}\n\n.fact {\n display: flex;\n gap: var(--space-2);\n align-items: baseline;\n color: var(--text-secondary);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n.fact strong { color: var(--text-primary); font-weight: var(--font-weight-semibold); }\n.fact[data-tone='warning'] { color: var(--text-primary); }\n\n.factWord {\n flex: none;\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--status-warning-fg);\n font-weight: var(--font-weight-semibold);\n}\n\n.ref {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-primary);\n padding: 0 var(--space-1);\n border-radius: var(--radius-xs);\n background: var(--bg-code);\n overflow-wrap: anywhere;\n}\n\n.label {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n margin-top: var(--space-1);\n}\n.optional {\n font-weight: var(--font-weight-regular);\n color: var(--text-tertiary);\n margin-left: var(--space-1);\n}\n\n.input,\n.textarea {\n width: 100%;\n box-sizing: border-box;\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n background: var(--bg-input);\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-base-size);\n line-height: var(--text-base-line);\n padding: var(--space-2) var(--space-3);\n}\n.input { min-height: var(--control-h-sm); }\n.textarea { resize: vertical; min-height: calc(var(--text-base-line) * 3 + var(--space-4)); }\n.input:focus-visible,\n.textarea:focus-visible { outline: none; border-color: var(--border-focus); box-shadow: var(--shadow-focus-ring); }\n.mono { font-family: var(--font-mono); font-size: var(--text-sm-size); }\n\n.row {\n display: flex;\n align-items: flex-end;\n gap: var(--space-3);\n flex-wrap: wrap;\n}\n.field {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n flex: 1 1 12rem;\n min-width: 0;\n}\n.check {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-sm);\n font-size: var(--text-sm-size);\n color: var(--text-primary);\n cursor: pointer;\n}\n.check input { accent-color: var(--accent-600); width: 16px; height: 16px; }\n\n.hint {\n margin: 0;\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.hint kbd {\n font-family: var(--font-mono);\n font-size: var(--text-2xs-size);\n padding: 0 var(--space-1);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-xs);\n margin-right: 2px;\n}\n\n.error {\n margin: 0;\n padding: var(--space-2) var(--space-3);\n border-left: 2px solid var(--status-danger-solid);\n background: var(--status-danger-bg);\n color: var(--status-danger-fg);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n border-radius: var(--radius-xs);\n}\n\n.actions {\n display: flex;\n justify-content: flex-end;\n gap: var(--space-2);\n margin-top: var(--space-3);\n}\n","/**\n * routes/verse/git/GitDialogs.tsx — Commit, Create PR and Merge, each a\n * short dialog that says exactly what the click will do BEFORE it happens\n * (unit C5; the before-click disclosure pattern of github-proposal.ts,\n * SPEC-310C research r5/panes.md §3).\n *\n * Push has no dialog: it never forces, it only publishes commits the operator\n * already made, and the button's own description says where they go.\n *\n * Keys: ⌘/Ctrl+Enter submits from any field; Escape closes (Dialog). The\n * submit button stays disabled while a request runs, so a double press is one\n * action — the server would refuse the second with a 409 anyway.\n */\nimport { useEffect, useId, useRef, useState, type FormEvent, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { defaultPrTitle, diffstatText, formatCount, mergeDrift, mergeHeadFact, type GitStatusView, type PinnedMerge } from './git-model.js';\nimport styles from './GitDialogs.module.css';\n\ninterface BaseProps {\n open: boolean;\n status: GitStatusView;\n onClose: () => void;\n /** The server's refusal, shown in the dialog so the operator can fix and retry. */\n error: string | null;\n busy: boolean;\n}\n\n/** ⌘Enter / Ctrl+Enter from any field in the form submits it. */\nfunction submitOnModEnter(e: ReactKeyboardEvent<HTMLFormElement>): void {\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n e.preventDefault();\n e.currentTarget.requestSubmit();\n }\n}\n\nfunction Facts({ children }: { children: ReactNode }) {\n return <ul className={styles.facts}>{children}</ul>;\n}\n\nfunction Fact({ tone = 'neutral', children }: { tone?: 'neutral' | 'warning'; children: ReactNode }) {\n return (\n <li className={styles.fact} data-tone={tone}>\n {tone === 'warning' ? <span className={styles.factWord}>Note</span> : null}\n <span>{children}</span>\n </li>\n );\n}\n\nfunction ErrorLine({ error }: { error: string | null }) {\n if (!error) return null;\n return (\n <p role=\"alert\" className={styles.error}>\n {error}\n </p>\n );\n}\n\nfunction Branch({ name }: { name: string | null }) {\n return <code className={styles.ref}>{name ?? 'HEAD'}</code>;\n}\n\n// ---------------------------------------------------------------------------\n// Commit\n// ---------------------------------------------------------------------------\n\nexport interface CommitDialogProps extends BaseProps {\n onSubmit: (message: string) => void;\n}\n\nexport function CommitDialog({ open, status, onClose, onSubmit, error, busy }: CommitDialogProps) {\n const titleId = useId();\n const messageId = useId();\n const [message, setMessage] = useState('');\n const ref = useRef<HTMLTextAreaElement>(null);\n useEffect(() => {\n if (open) setMessage('');\n }, [open]);\n\n const submit = (e: FormEvent) => {\n e.preventDefault();\n if (message.trim() && !busy) onSubmit(message.trim());\n };\n\n return (\n <Dialog open={open} onClose={onClose} titleId={titleId} title=\"Commit changes\" initialFocusRef={ref}>\n <form className={styles.form} onSubmit={submit} onKeyDown={submitOnModEnter}>\n <Facts>\n <Fact>\n {formatCount(status.dirty)} changed {status.dirty === 1 ? 'file' : 'files'} in <strong>{status.name}</strong> on <Branch name={status.branch} />, untracked files included.\n </Fact>\n </Facts>\n <label className={styles.label} htmlFor={messageId}>\n Message\n </label>\n <textarea\n id={messageId}\n ref={ref}\n className={styles.textarea}\n rows={4}\n value={message}\n onChange={(e) => setMessage(e.target.value)}\n placeholder=\"What changed, and why\"\n maxLength={10_000}\n required\n />\n <p className={styles.hint}>\n Git hooks in this repository run as usual. <kbd>⌘</kbd>\n <kbd>Enter</kbd> commits.\n </p>\n <ErrorLine error={error} />\n <div className={styles.actions}>\n <Button variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"primary\" busy={busy} disabled={!message.trim()}>\n Commit\n </Button>\n </div>\n </form>\n </Dialog>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Create PR\n// ---------------------------------------------------------------------------\n\nexport interface CreatePrDialogProps extends BaseProps {\n /** Opened from \"Create draft PR…\". */\n draft: boolean;\n onSubmit: (req: { title: string; body: string; base: string; draft: boolean }) => void;\n}\n\nexport function CreatePrDialog({ open, status, onClose, onSubmit, error, busy, draft: initialDraft }: CreatePrDialogProps) {\n const titleId = useId();\n const fieldTitle = useId();\n const fieldBody = useId();\n const fieldBase = useId();\n const [title, setTitle] = useState('');\n const [body, setBody] = useState('');\n const [base, setBase] = useState('');\n const [draft, setDraft] = useState(initialDraft);\n const ref = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!open) return;\n setTitle(defaultPrTitle(status));\n setBody('');\n setBase(status.base ?? '');\n setDraft(initialDraft);\n // Seeded once per open: a background status refresh must not wipe what the operator typed.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [open]);\n\n const needsPush = status.upstream === null || status.ahead > 0;\n const submit = (e: FormEvent) => {\n e.preventDefault();\n if (title.trim() && base.trim() && !busy) onSubmit({ title: title.trim(), body, base: base.trim(), draft });\n };\n\n return (\n <Dialog open={open} onClose={onClose} titleId={titleId} title={draft ? 'Create draft pull request' : 'Create pull request'} initialFocusRef={ref}>\n <form className={styles.form} onSubmit={submit} onKeyDown={submitOnModEnter}>\n <Facts>\n {needsPush ? (\n <Fact>\n Pushes <Branch name={status.branch} /> to {status.upstream ?? 'origin'} first\n {status.upstream && status.ahead > 0 ? ` (${formatCount(status.ahead)} ${status.ahead === 1 ? 'commit' : 'commits'})` : ''}.\n </Fact>\n ) : null}\n <Fact>\n Then opens a PR from <Branch name={status.branch} /> into <Branch name={base.trim() || null} />:{' '}\n {formatCount(status.diffstat.files)} {status.diffstat.files === 1 ? 'file' : 'files'}, {diffstatText(status.diffstat.additions, status.diffstat.deletions)}.\n </Fact>\n {status.dirty > 0 ? (\n <Fact tone=\"warning\">\n {formatCount(status.dirty)} uncommitted {status.dirty === 1 ? 'change is' : 'changes are'} not in the PR. Commit first to include {status.dirty === 1 ? 'it' : 'them'}.\n </Fact>\n ) : null}\n </Facts>\n <label className={styles.label} htmlFor={fieldTitle}>\n Title\n </label>\n <input id={fieldTitle} ref={ref} className={styles.input} value={title} onChange={(e) => setTitle(e.target.value)} maxLength={256} required />\n <label className={styles.label} htmlFor={fieldBody}>\n Description <span className={styles.optional}>optional</span>\n </label>\n <textarea id={fieldBody} className={styles.textarea} rows={4} value={body} onChange={(e) => setBody(e.target.value)} maxLength={60_000} />\n <div className={styles.row}>\n <div className={styles.field}>\n <label className={styles.label} htmlFor={fieldBase}>\n Base branch\n </label>\n <input\n id={fieldBase}\n className={`${styles.input} ${styles.mono}`}\n value={base}\n onChange={(e) => setBase(e.target.value)}\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n required\n />\n </div>\n <label className={styles.check}>\n <input type=\"checkbox\" checked={draft} onChange={(e) => setDraft(e.target.checked)} />\n Draft\n </label>\n </div>\n <ErrorLine error={error} />\n <div className={styles.actions}>\n <Button variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button type=\"submit\" variant=\"primary\" busy={busy} disabled={!title.trim() || !base.trim()}>\n {draft ? 'Create draft PR' : 'Create PR'}\n </Button>\n </div>\n </form>\n </Dialog>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Merge\n// ---------------------------------------------------------------------------\n\nexport interface MergeDialogProps extends Omit<BaseProps, 'status'> {\n /** The PR as it was when the dialog opened — what the operator is confirming (git-model.ts `pinMerge`). */\n pin: PinnedMerge;\n /** The latest polled status for the same root; only used to notice drift, never to change what is shown or sent. */\n live: GitStatusView | null;\n onSubmit: () => void;\n}\n\nexport function MergeDialog({ open, pin, live, onClose, onSubmit, error, busy }: MergeDialogProps) {\n const titleId = useId();\n const confirmRef = useRef<HTMLButtonElement>(null);\n const head = mergeHeadFact(pin);\n // Merge stays disabled when the pin itself is not verified (the facts line\n // then says what is missing) or when the live PR moved away from it.\n const drift = mergeDrift(pin, live);\n const blocked = drift ?? (head.verified ? null : 'This head has not passed every check GitHub needs to merge it.');\n return (\n <Dialog\n open={open}\n onClose={onClose}\n titleId={titleId}\n title={`Merge #${pin.number}?`}\n description={pin.title}\n initialFocusRef={confirmRef}\n >\n <form\n className={styles.form}\n onSubmit={(e) => {\n e.preventDefault();\n if (!busy && blocked === null) onSubmit();\n }}\n onKeyDown={submitOnModEnter}\n >\n <Facts>\n <Fact>\n Squash-merges <Branch name={pin.headRef || null} /> into <Branch name={pin.baseRef || null} /> on GitHub.\n </Fact>\n <Fact tone={head.verified ? 'neutral' : 'warning'}>\n Head <code className={styles.ref}>{head.sha}</code>, {head.detail}\n </Fact>\n <Fact>Only this head merges: GitHub re-checks it first, so if a commit landed after it, nothing merges. Admin overrides are never used.</Fact>\n {blocked !== null ? <Fact tone=\"warning\">{blocked}</Fact> : null}\n </Facts>\n <ErrorLine error={error} />\n <div className={styles.actions}>\n <Button variant=\"ghost\" onClick={onClose}>\n Cancel\n </Button>\n <Button ref={confirmRef} type=\"submit\" variant=\"primary\" busy={busy} disabled={blocked !== null}>\n Merge #{pin.number}\n </Button>\n </div>\n </form>\n </Dialog>\n );\n}\n"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/LessonsPanel-Wy6TVWEv.js","assets/StatusBadge-CJbb9DhR.js","assets/MutationTokenDialog-D522NXsm.js","assets/Dialog-BYIKNPcH.js","assets/focus-trap-C8MiYlLZ.js","assets/Tag-CMFqY2MP.js","assets/use-guarded-action-D4m4Mlzr.js","assets/types-0yEfFUjO.js","assets/global-1SED_aTT.css","assets/StatusBadge-BVi0IBb9.css","assets/Dialog-tQ8kFulD.css","assets/MutationTokenDialog-CrfJ0PdD.css","assets/ChartFrame-DyjmyV8N.css","assets/Tag-D0rAEciH.css","assets/Button-DrnKsvnQ.css","assets/RouteErrorBoundary-DdxhTdZ6.css","assets/SkipToContent-c02H5dmz.css","assets/VerseConsoleApp-C5481fH5.css","assets/Surface-e1z6GdZt.css","assets/LessonsPanel-D45qR45S.css"])))=>i.map(i=>d[i]);
2
- import{n as e,s as t,t as n,u as r}from"./index-BbDqdepe.js";import{l as i,u as a}from"./global-BWc2NPzv.js";import{p as o}from"./queries-T7ZUVqyA.js";import{t as s}from"./RefreshIndicator-CEMRNruu.js";import{c,y as l}from"./colors-DvK0wMHH.js";import{l as u,s as d}from"./format-D7nBg2bn.js";import{t as f}from"./AreaTrend-ZnnIjBGU.js";import{n as p,t as m}from"./Funnel-rnPUaoN7.js";import{n as h,r as g,t as ee}from"./StepBand-Bfj1YYTl.js";import{t as _}from"./calendar-day-BxBYHfX1.js";import{M as te}from"./VerseShared-_pMXKs8m.js";import{l as v,r as ne,t as y}from"./AutonomyOffState-C9S_FXc0.js";import{l as b,o as x}from"./surface-data-DoN8peNV.js";import{a as re,r as S}from"./Surface-CV-NXGIM.js";import{t as ie}from"./use-ticker-PQ_oYxn5.js";var C=r(t(),1),w={"oversized-file":`some records are over the size bound`,"invalid-file":`some records are malformed`,"unsafe-file":`some records were refused (symlink, shared or foreign-owned)`,"unsafe-directory":`the store directory is not private`,"io-error":`some records could not be read`,"file-limit":`the store has more records than one read covers`,"invalid-row":`some ledger rows are malformed`,"oversized-row":`some ledger rows are over the size bound`,"duplicate-canonical-realized-merge-identity":`two proposals claim the same merge, so merges are unknown`,"claim-integrity-verdicts-not-persisted":`claim-check verdicts are not recorded per proposal yet`,"scorecard-trend-pending":`the scorecard trend is still being collected`,"scorecard-worker-unavailable":`the scorecard trend could not be read this time`};function T(e){return w[e]??e.replace(/-/g,` `)}function E(e,t){if(t.complete||t.state===`not-recorded`||t.reasons.length===0)return;let n=t.recordsSkipped>0?` (${t.recordsSkipped} skipped)`:``;return`${e} are lower bounds: ${t.reasons.map(T).join(`; `)}${n}.`}function D(e,t){return t.state===`not-recorded`?{kind:`unknown`,reason:`${T(t.reasons[0]??`not recorded`)}.`}:t.state===`degraded`&&t.recordsRead===0?{kind:`unknown`,reason:`${T(t.reasons[0]??`io-error`)}.`}:e.darkSince?{kind:`dark`,since:e.darkSince}:{kind:`ready`}}function O(e){let t=e.funnel,n=E(`Pipeline counts`,e.sources.proposals)??E(`Pipeline counts`,e.sources.decisions);return{stages:[{id:`filed`,label:`Filed`,value:t.filed},{id:`verified`,label:`Verified`,value:t.verified},{id:`passed`,label:`Verification passed`,value:t.verificationPassed},{id:`ship`,label:`Judged ship`,value:t.judgedShip},{id:`merged`,label:`Merged`,value:t.merged}],status:D(e,e.sources.proposals),...n?{caveat:n}:{}}}function k(e,t){return e.days.map(e=>({day:e.day,value:t(e)}))}var A=Object.freeze({minPairs:8,ciLevel:.95,minLiftCiLow:0,maxCostIncreasePct:20,canaryHours:48,rollbackStandardErrors:1,minHeldOutTasks:12});function j(e){let t=[];for(let n=e.length;n-7>=0;n-=7){let r=e.slice(n-7,n),i=e=>{let t=0;for(let n of r){let r=e(n);if(r===null||!Number.isFinite(r))return null;t+=r}return t},a=r[r.length-1].day;t.unshift({end:_(a),endDay:a,merges:i(e=>e.merges.realized),costUsd:i(e=>e.estCostUsd)})}return t}function ae(e){return e.merges===null||e.costUsd===null||e.merges===0?null:e.costUsd/e.merges}var oe=[{id:`merged`,label:`Merged`,color:l(`success`)},{id:`ship`,label:`Judged ship, not merged`,color:l(`info`)},{id:`rejected`,label:`Judged not worth shipping`,color:l(`warning`)},{id:`unjudged`,label:`Not judged`,color:l(`neutral`)}],M=/[-@](?:\d{8}|\d{4}-\d{2}-\d{2})$/;function N(e,t=18){if(e.length<=t)return e;let n=e.slice(0,t),r=Math.max(n.lastIndexOf(` `),n.lastIndexOf(`-`),n.lastIndexOf(`:`));return r>0?`${e.slice(0,r)}…`:e}function P(e){let t=e.map(e=>{let t=e.model.includes(`/`)?e.model.split(`/`).pop():e.model,n=t.replace(M,``)||t;return[N(n),n,t,e.model,`${e.engine}:${e.model}`]}),n=e.map(()=>0),r=()=>t.map((e,t)=>e[n[t]]),i=t[0]?.length??0;for(let e=1;e<i;e++){let t=r(),i=new Map;for(let e of t)i.set(e,(i.get(e)??0)+1);let a=t.map(e=>i.get(e)>1);if(!a.includes(!0))break;a.forEach((t,r)=>{t&&(n[r]=e)})}let a=new Set;return r().map(e=>{let t=e;for(let n=2;a.has(t);n++)t=`${e} #${n}`;return a.add(t),t})}function se(e,t=6){let n=[...e].filter(e=>e.dispatches>0).sort((e,t)=>t.dispatches-e.dispatches).slice(0,t);return{categories:P(n),values:n.map(e=>{let t=Math.max(0,e.merged);return[t,Math.max(0,e.shipVerdicts-t),Math.max(0,e.judged-e.shipVerdicts),Math.max(0,e.dispatches-e.judged)]}),costPerMerged:n.map(e=>e.costPerMergedUsd),models:n}}var F=Date.UTC(2020,0,1),I=7776e6;function L(e){if(!e)return null;let t=Date.parse(e);return Number.isFinite(t)&&t>=F?t:null}function R(e,t,n){let r=L(t.createdAt);if(r!==null)return r;let i=[...e.versions.filter(e=>e.id!==t.id).flatMap(e=>[e.createdAt,e.adoptedAt,e.rolledBackAt]),...e.experiments.flatMap(e=>[e.startedAt,e.finishedAt])].map(L).filter(e=>e!==null);return i.length>0?Math.min(...i):n-I}function z(e,t){if(!e||e.versions.length===0)return{steps:[],markers:[]};let n=new Map(e.versions.map(e=>[e.id,e])),r=new Map(e.experiments.map(e=>[e.id,e])),i=new Map,a=[],o=[...e.versions].sort((e,t)=>e.seq-t.seq)[0];i.set(o.id,0);let s=R(e,o,t??L(e.generatedAt)??Date.now());a.push({at:s,step:{id:`${o.id}@base`,at:s,value:0,low:0,high:0,label:o.status===`baseline`?`Compiled defaults`:o.id,detail:`baseline`}});let c=e.versions.filter(e=>e.adoptedAt&&e.id!==o.id).sort((e,t)=>Date.parse(e.adoptedAt)-Date.parse(t.adoptedAt));for(let e of c){let t=e.experimentId?r.get(e.experimentId):void 0,s=t?.baseVersionId??e.parentId??o.id,c=i.get(s)??(n.has(s)?null:0),l=t?.lift??null,u=l&&c!=null?c+l.mean:null;i.set(e.id,u);let d=L(e.adoptedAt);if(d===null)continue;let f=e.status===`canary`?`canary`:e.status===`rolled-back`?`adopted, later rolled back`:`adopted`;if(a.push({at:d,step:{id:`${e.id}@adopt`,at:d,value:u,low:u!==null&&l?c+l.ciLow:null,high:u!==null&&l?c+l.ciHigh:null,label:e.id,detail:f}}),e.rolledBackAt){let t=L(e.rolledBackAt);if(t!==null){let r=i.get(s)??null,o=n.get(s);a.push({at:t,marker:{id:`${e.id}@rb`,at:t,kind:`rollback`,label:`${e.id}: ${e.rollbackReason??`rolled back`}`}}),a.push({at:t+1,step:{id:`${e.id}@rb-step`,at:t+1,value:r,low:null,high:null,label:o?.id??s,detail:`restored after ${e.id} rolled back`}})}}}return a.sort((e,t)=>e.at-t.at),{steps:a.flatMap(e=>e.step?[e.step]:[]),markers:a.flatMap(e=>e.marker?[e.marker]:[])}}var B={adopt:`passed the gate`,reject:`rejected`,inconclusive:`inconclusive`};function V(e){return e?e.experiments.map(e=>({id:e.id,label:`${e.candidateVersionId} vs ${e.baseVersionId}`,estimate:e.lift?.mean??null,low:e.lift?.ciLow??null,high:e.lift?.ciHigh??null,n:e.pairs,detail:e.status===`running`||e.status===`queued`?`${e.status} · ${e.pairs}/${A.minPairs} pairs`:e.verdict?B[e.verdict]??e.verdict:e.status})):[]}var H=e(),U=3e5,W=(0,C.lazy)(()=>n(()=>import(`./LessonsPanel-Wy6TVWEv.js`).then(e=>({default:e.LessonsPanel})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]))),G=o(`30d`),ce=[{id:`merges`,label:`Merges`,color:c}];function K(e,t){return{kind:`unknown`,reason:e??t}}function q(){let e=i(x,{freshMs:6e4}),t=i(b,{freshMs:6e4}),n=i(G,{freshMs:6e4}),r=a(x),o=a(b),l=a(G);te(()=>{r(),o(),l()},U);let _=ie(6e4),w=e.data?.value??null,T=t.data?.value??null,M=(0,C.useMemo)(()=>w?j(w.days):[],[w]),N=e.data?w?v(D(w,w.sources.runs)):K(e.data.reason,`fleet history did not answer.`):{kind:`loading`},P=N.kind===`ready`?M.length===0?{kind:`empty`,message:`Less than a week of history.`}:{kind:`ready`}:N,F=w?E(`Merge counts`,w.sources.decisions):void 0,I=w?O(w):null,L=(0,C.useMemo)(()=>se(n.data?.models??[]),[n.data]),R=n.status===`loading`?{kind:`loading`}:n.status===`error`||!n.data?{kind:`unknown`,reason:`per-model economics could not be read.`}:L.categories.length===0?{kind:`empty`,message:`No fleet dispatches in 30 days.`}:{kind:`ready`},B=(0,C.useMemo)(()=>z(T),[T]),q=(0,C.useMemo)(()=>V(T),[T]),J=(e,n)=>t.data?T?n?{kind:`ready`}:{kind:`empty`,message:e}:K(t.data.reason,`self-improvement did not answer.`):{kind:`loading`},Y=w?.darkSince??null,X=ne(Y),Z=Y!==null&&X!=null,Q=B.steps.length>1||B.markers.length>0,le=!Z||R.kind===`ready`,ue=!Z||Q,de=!Z||q.length>0,fe=Z&&R.kind!==`ready`&&!Q&&q.length===0,$=e=>`wk to ${d(e)}`;return(0,H.jsxs)(re,{title:`Growth`,actions:[e,t].some(e=>e.status===`refreshing`)?(0,H.jsx)(s,{}):null,children:[X?(0,H.jsx)(S,{span:12,children:(0,H.jsx)(y,{state:X,here:`growth`,title:fe?`Growth starts with the first fleet run.`:void 0})}):null,Z?null:(0,H.jsx)(S,{span:8,children:(0,H.jsx)(p,{title:`Merges per week`,description:`Rolling 7-day windows ending today`,caveat:F,status:P,categories:M.map(e=>$(e.end)),segments:ce,values:M.map(e=>[e.merges]),height:200})}),Z?null:(0,H.jsx)(S,{span:4,children:(0,H.jsx)(f,{title:`Cost per merge`,description:`Estimated run spend ÷ merges, per week`,status:P,series:[{id:`cpm`,label:`Cost per merge`,color:c,points:M.map(e=>({x:e.end,y:ae(e)}))}],formatX:$,formatY:u,height:200})}),Z?null:(0,H.jsx)(S,{span:4,children:(0,H.jsx)(m,{title:`Pipeline · 90d`,description:`Filed → verified → passed → judged ship → merged`,caveat:I?.caveat,status:I?v(I.status):N,stages:I?.stages??[]})}),le?(0,H.jsx)(S,{span:4,children:(0,H.jsx)(p,{title:`Model outcomes · 30d`,description:`What each model's dispatches became`,status:R,categories:L.categories,segments:oe,values:L.values,height:200})}):null,Z?null:(0,H.jsx)(S,{span:4,children:(0,H.jsx)(g,{title:`Merges by day`,description:`Last 90 days`,status:N,days:w?k(w,e=>e.merges.realized):[],unit:`merges`})}),ue?(0,H.jsx)(S,{span:8,children:(0,H.jsx)(`div`,{title:`Band = each step's own 95% interval. A new harness runs as a canary for ${A.canaryHours} h first.`,children:(0,H.jsx)(ee,{title:`Harness level`,description:`Pass-rate lift vs defaults`,status:J(`Compiled defaults in force.`,B.steps.length>0),steps:B.steps,markers:B.markers,now:_,baseline:{value:0,label:`Compiled defaults`},unit:`pts`})})}):null,de?(0,H.jsx)(S,{span:4,children:(0,H.jsx)(`div`,{title:`Adopted only when the interval's low end is above ${A.minLiftCiLow}, over at least ${A.minPairs} pairs.`,children:(0,H.jsx)(h,{title:`Experiments`,description:`Paired lift, 95% interval`,status:J(`No experiments yet.`,q.length>0),rows:q,unit:`pts`,unknownText:`under ${A.minPairs} pairs`})})}):null,(0,H.jsx)(S,{span:12,children:(0,H.jsx)(C.Suspense,{fallback:null,children:(0,H.jsx)(W,{})})})]})}export{U as GROWTH_POLL_MS,q as GrowthSection};
3
- //# sourceMappingURL=GrowthSection-BK63EJn9.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/components/charts/fleet-history-view.ts","../../../../../../src/core/learn/harness-types.ts","../../../../../../src/web-ui/routes/verse/growth/growth-model.ts","../../../../../../src/web-ui/routes/verse/sections/GrowthSection.tsx"],"sourcesContent":["/**\n * components/charts/fleet-history-view.ts — maps the `GET /api/verse/fleet/history`\n * payload (core/verse/fleet-history-types.ts) onto the chart kit's props, so\n * every surface that charts fleet history (Command, Fleet, Growth) makes the\n * same honesty decisions:\n *\n * - the fleet is DARK → every chart shows \"Fleet dark since <date>\", not\n * empty axes;\n * - a source could not be read at all → \"unknown\", not zeros;\n * - a source was only partly read → a caveat naming why (lower bounds);\n * - claim-check → always the not-recorded state, never a fabricated series.\n *\n * Pure functions over the wire type; no fetching here.\n */\nimport type {\n FleetHistoryDay,\n FleetHistoryResponse,\n FleetHistorySource,\n} from '../../../core/verse/fleet-history-types.js';\nimport type { ChartStatus } from './ChartFrame.js';\nimport type { BarStackProps } from './BarStack.js';\nimport type { FunnelStage } from './Funnel.js';\nimport type { SwimlaneLane } from './Swimlane.js';\nimport type { CalendarDatum } from './CalendarHeatmap.js';\nimport type { AreaTrendSeries } from './AreaTrend.js';\nimport { toneColor } from './colors.js';\nimport { formatDayLabel } from './format.js';\n\nconst REASON_TEXT: Record<string, string> = {\n 'oversized-file': 'some records are over the size bound',\n 'invalid-file': 'some records are malformed',\n 'unsafe-file': 'some records were refused (symlink, shared or foreign-owned)',\n 'unsafe-directory': 'the store directory is not private',\n 'io-error': 'some records could not be read',\n 'file-limit': 'the store has more records than one read covers',\n 'invalid-row': 'some ledger rows are malformed',\n 'oversized-row': 'some ledger rows are over the size bound',\n 'duplicate-canonical-realized-merge-identity': 'two proposals claim the same merge, so merges are unknown',\n 'claim-integrity-verdicts-not-persisted': 'claim-check verdicts are not recorded per proposal yet',\n 'scorecard-trend-pending': 'the scorecard trend is still being collected',\n 'scorecard-worker-unavailable': 'the scorecard trend could not be read this time',\n};\n\nfunction reasonText(reason: string): string {\n return REASON_TEXT[reason] ?? reason.replace(/-/g, ' ');\n}\n\n/** A caveat sentence for a partly-read source, or undefined when it is complete. */\nexport function sourceCaveat(label: string, source: FleetHistorySource): string | undefined {\n if (source.complete || source.state === 'not-recorded') return undefined;\n if (source.reasons.length === 0) return undefined;\n const skipped = source.recordsSkipped > 0 ? ` (${source.recordsSkipped} skipped)` : '';\n return `${label} are lower bounds: ${source.reasons.map(reasonText).join('; ')}${skipped}.`;\n}\n\n/**\n * The shared status for a chart over one source. Order matters: unreadable\n * beats dark (we cannot claim darkness from a store we cannot read), and dark\n * beats an all-zero window (the designed \"since\" message is more useful).\n */\nexport function historyStatus(history: FleetHistoryResponse, source: FleetHistorySource): ChartStatus {\n if (source.state === 'not-recorded') return { kind: 'unknown', reason: `${reasonText(source.reasons[0] ?? 'not recorded')}.` };\n if (source.state === 'degraded' && source.recordsRead === 0) {\n return { kind: 'unknown', reason: `${reasonText(source.reasons[0] ?? 'io-error')}.` };\n }\n if (history.darkSince) return { kind: 'dark', since: history.darkSince };\n return { kind: 'ready' };\n}\n\n/** \"Sep 3\" for a day row (the wire's days are already in the caller's zone). */\nexport function dayLabel(day: FleetHistoryDay): string {\n return formatDayLabel(day.day);\n}\n\n/** Runs per day as done / failed / aborted / unfinished — status tones, legend-labelled. */\nexport function runsByDay(history: FleetHistoryResponse): Pick<BarStackProps, 'categories' | 'segments' | 'values' | 'status' | 'caveat'> {\n return {\n categories: history.days.map(dayLabel),\n segments: [\n { id: 'done', label: 'Done', color: toneColor('success') },\n { id: 'failed', label: 'Failed', color: toneColor('danger') },\n { id: 'aborted', label: 'Aborted', color: toneColor('neutral') },\n { id: 'unfinished', label: 'Unfinished', color: toneColor('running') },\n ],\n values: history.days.map((d) => [d.runs.done, d.runs.failed, d.runs.aborted, d.runs.unfinished]),\n status: historyStatus(history, history.sources.runs),\n caveat: sourceCaveat('Run counts', history.sources.runs),\n };\n}\n\n/** Judge verdicts per day (the considered ones, plus failed judge calls). */\nexport function verdictsByDay(history: FleetHistoryResponse): Pick<BarStackProps, 'categories' | 'segments' | 'values' | 'status' | 'caveat'> {\n return {\n categories: history.days.map(dayLabel),\n segments: [\n { id: 'ship', label: 'Ship', color: toneColor('success') },\n { id: 'review', label: 'Review', color: toneColor('warning') },\n { id: 'noise', label: 'Noise', color: toneColor('neutral') },\n { id: 'harmful', label: 'Harmful', color: toneColor('danger') },\n { id: 'failed', label: 'Judge failed', color: toneColor('unknown') },\n ],\n values: history.days.map((d) => [d.judged.ship, d.judged.review, d.judged.noise, d.judged.harmful, d.judged.failed]),\n status: historyStatus(history, history.sources.decisions),\n caveat: sourceCaveat('Verdict counts', history.sources.decisions),\n };\n}\n\n/** Proposal pipeline for the window (cumulative stages — see FleetHistoryFunnel). */\nexport function pipelineFunnel(history: FleetHistoryResponse): { stages: FunnelStage[]; status: ChartStatus; caveat?: string } {\n const f = history.funnel;\n const caveat = sourceCaveat('Pipeline counts', history.sources.proposals) ?? sourceCaveat('Pipeline counts', history.sources.decisions);\n return {\n stages: [\n { id: 'filed', label: 'Filed', value: f.filed },\n { id: 'verified', label: 'Verified', value: f.verified },\n { id: 'passed', label: 'Verification passed', value: f.verificationPassed },\n { id: 'ship', label: 'Judged ship', value: f.judgedShip },\n { id: 'merged', label: 'Merged', value: f.merged },\n ],\n status: historyStatus(history, history.sources.proposals),\n ...(caveat ? { caveat } : {}),\n };\n}\n\n/** Swimlane lanes straight from the projection (runs → bars, engine as detail). */\nexport function runLanes(history: FleetHistoryResponse): { lanes: SwimlaneLane[]; from: number; to: number; status: ChartStatus; caveat?: string } {\n const truncated = history.swimlanesTruncated ? 'Showing the newest runs only; the full list is longer.' : undefined;\n const caveat = [sourceCaveat('Runs', history.sources.runs), truncated].filter(Boolean).join(' ') || undefined;\n return {\n lanes: history.swimlanes.map((lane) => ({\n id: lane.id,\n label: lane.label,\n items: lane.items.map((item) => ({\n id: item.id,\n start: item.startMs,\n end: item.endMs,\n status: item.status,\n detail: item.engine,\n stale: item.stale,\n })),\n })),\n from: Date.parse(history.window.from),\n to: Date.parse(history.window.to),\n status: historyStatus(history, history.sources.runs),\n ...(caveat ? { caveat } : {}),\n };\n}\n\n/** One number per day for the calendar heatmap. */\nexport function dailyValues(history: FleetHistoryResponse, pick: (day: FleetHistoryDay) => number | null): CalendarDatum[] {\n return history.days.map((d) => ({ day: d.day, value: pick(d) }));\n}\n\n/** Scorecard trend (daily snapshots of the trailing window) as AreaTrend series. */\nexport function scorecardSeries(history: FleetHistoryResponse, window: '7d' | '30d' = '7d'): { series: AreaTrendSeries[]; status: ChartStatus; caveat?: string } {\n const points = window === '7d' ? history.scorecard.trend7d : history.scorecard.trend30d;\n const source = history.scorecard.source;\n const status: ChartStatus = points.length === 0\n ? source.state === 'degraded'\n ? { kind: 'unknown', reason: `${reasonText(source.reasons[0] ?? 'io-error')}.` }\n : { kind: 'empty', message: 'No scorecard snapshots yet — the first is taken today, then one a day.' }\n : { kind: 'ready' };\n const caveat = points.length > 0 ? sourceCaveat('Scorecard points', source) : undefined;\n return {\n series: [\n { id: 'merges', label: 'Merges', points: points.map((p) => ({ x: Date.parse(p.ts), y: p.merges.realized })) },\n { id: 'filed', label: 'Proposals filed', points: points.map((p) => ({ x: Date.parse(p.ts), y: p.proposalsFiled })) },\n ],\n status,\n ...(caveat ? { caveat } : {}),\n };\n}\n","/**\n * Harness registry + experiments — V3.10 Track B contract (unit B-U1, frozen day 0).\n *\n * A HARNESS is the config-only envelope around the fleet's models: prompt\n * overlays, effort, sampling, routing weights and enabled skills. The\n * self-improvement loop (unit U9) versions harnesses, A/B-tests a candidate\n * against the active version on free local slots (paired runs, 95% CI,\n * ≥ 8 pairs, held-out tasks), and adopts a winner only through the Leader's\n * class-B action, behind a 48 h canary with automatic rollback.\n *\n * WHY config-only: a harness can never carry code, so adopting one can never\n * change authority (SPEC-310B I2). Code self-improvement arrives as ordinary\n * fleet PRs that pass every merge gate and only run after Mason deploys them.\n *\n * Honesty rule: `null` = unknown / not measured, never zero.\n *\n * BROWSER-SAFE: the Growth surface imports this — type-only imports, plain consts.\n */\nimport type { RoutingDifficulty } from '../routing/types.js';\nimport type { FleetEngine } from '../fleet/fleet-types.js';\n\nexport const VERSE_LEARNING_PATH = '/api/verse/learning';\n\n// ---------------------------------------------------------------------------\n// Harness config (what a version pins)\n// ---------------------------------------------------------------------------\n\nexport type HarnessEffort = 'low' | 'medium' | 'high' | 'xhigh' | 'max';\n\n/** Roles a prompt overlay can target. */\nexport type HarnessRole = 'producer' | 'judge' | 'leader' | 'planner';\n\nexport interface HarnessSampling {\n /** null = the engine's own default. */\n temperature: number | null;\n topP: number | null;\n maxOutputTokens: number | null;\n}\n\n/**\n * The dispatch router's tunables. Precedence at dispatch (U5): a Leader\n * `router.tune` override (LeaderDirectivesV1) › the active harness › the\n * router's compiled defaults. All λ are ≥ 0.\n */\nexport interface HarnessRoutingWeights {\n lambdaCost: number;\n lambdaPressure: number;\n lambdaLatency: number;\n /** Best-of-N runs at and above this difficulty. */\n bonThreshold: RoutingDifficulty;\n}\n\nexport interface HarnessConfigV1 {\n v: 1;\n /** Text appended to a role's system prompt; absent role = no overlay. Scrubbed, ≤ 4 KB each. */\n prompts: Partial<Record<HarnessRole, string>>;\n /** Effort per fleet engine; absent = engine default. */\n effort: Partial<Record<FleetEngine, HarnessEffort>>;\n /** Sampling per fleet engine; absent = engine default. */\n sampling: Partial<Record<FleetEngine, HarnessSampling>>;\n routing: HarnessRoutingWeights;\n /** Enabled skill ids, sorted. */\n skills: string[];\n}\n\n/** A config change. Top-level fields present here REPLACE the base's field wholesale (no deep merge). */\nexport type HarnessConfigPatch = Partial<Omit<HarnessConfigV1, 'v'>>;\n\n// ---------------------------------------------------------------------------\n// Versions\n// ---------------------------------------------------------------------------\n\n/**\n * - `baseline` — version 0: the compiled defaults.\n * - `candidate` — under experiment.\n * - `canary` — adopted, inside its 48 h canary.\n * - `adopted` — canary passed; the active version.\n * - `rolled-back` — canary fell below baseline − 1 SE (or vetoed).\n * - `rejected` — failed the adoption gate.\n */\nexport type HarnessVersionStatus = 'baseline' | 'candidate' | 'canary' | 'adopted' | 'rolled-back' | 'rejected';\n\nexport interface HarnessVersion {\n v: 1;\n /** Stable id, e.g. `h-0007`. */\n id: string;\n /** Monotonic; baseline = 0. */\n seq: number;\n parentId: string | null;\n createdAt: string;\n status: HarnessVersionStatus;\n config: HarnessConfigV1;\n /** sha256 hex of the canonical config — what experiments and ledger rows bind to. */\n configDigest: string;\n source: { kind: 'baseline' | 'hypothesis' | 'manual'; hypothesisId: string | null };\n /** The experiment whose verdict justified adoption; null for baseline / manual. */\n experimentId: string | null;\n adoptedAt: string | null;\n /** End of the 48 h canary; null when not in canary. */\n canaryUntil: string | null;\n rolledBackAt: string | null;\n rollbackReason: string | null;\n}\n\n// ---------------------------------------------------------------------------\n// Hypotheses and experiments\n// ---------------------------------------------------------------------------\n\nexport type HarnessTarget = 'prompt' | 'effort' | 'sampling' | 'routing' | 'skill';\n\n/** A typed, testable claim about a config change (the Leader emits ≤ 3 per memo; A7 insights may too). */\nexport interface HarnessHypothesis {\n v: 1;\n id: string;\n source: { kind: 'leader' | 'insight' | 'manual'; ref: string | null };\n target: HarnessTarget;\n /** Config only — never code. */\n patch: HarnessConfigPatch;\n /** The claim in one sentence. Untrusted model text: scrubbed, rendered as text. */\n statement: string;\n /** Metric it should move, e.g. `local-eval.pass-rate`. */\n metric: string;\n /** Predicted change, in the metric's units. */\n predictedDelta: number;\n createdAt: string;\n}\n\nexport type ExperimentVerdict = 'adopt' | 'reject' | 'inconclusive';\n\nexport type ExperimentStatus = 'queued' | 'running' | 'done' | 'cancelled' | 'failed';\n\nexport interface ExperimentLift {\n /** Paired pass-rate lift of candidate over base, in percentage points. */\n mean: number;\n ciLow: number;\n ciHigh: number;\n level: 0.95;\n}\n\nexport interface ExperimentResultV1 {\n v: 1;\n id: string;\n hypothesisId: string | null;\n baseVersionId: string;\n candidateVersionId: string;\n /** The held-out task set the pairs were drawn from. */\n taskSet: { id: string; digest: string };\n status: ExperimentStatus;\n /** Complete pairs so far. */\n pairs: number;\n wins: number;\n losses: number;\n ties: number;\n /** null until pairs ≥ HARNESS_ADOPTION_GATE.minPairs. */\n lift: ExperimentLift | null;\n /** Any `refuse`-class task regressed (blocks adoption). null = not measured yet. */\n refuseRegression: boolean | null;\n /** candidate − base count of `claimed-change-none-made` failures; must be ≤ 0 to adopt. */\n claimedChangeNoneMadeDelta: number | null;\n /** Wall-time / cost change in percent; must be ≤ +20 to adopt. */\n costDeltaPct: number | null;\n /** null while running. */\n verdict: ExperimentVerdict | null;\n /** Specific sentences behind the verdict. */\n reasons: string[];\n startedAt: string | null;\n finishedAt: string | null;\n}\n\n/**\n * The adoption gate (SPEC-310B §5) — frozen numbers. Adoption is a Leader\n * class-B action and requires ALL of: pairs ≥ minPairs, lift.ciLow >\n * minLiftCiLow, no refuse regression, claimedChangeNoneMadeDelta ≤ 0, and\n * costDeltaPct ≤ maxCostIncreasePct.\n */\nexport const HARNESS_ADOPTION_GATE = Object.freeze({\n minPairs: 8,\n ciLevel: 0.95,\n minLiftCiLow: 0,\n maxCostIncreasePct: 20,\n canaryHours: 48,\n /** Roll back when the canary pass rate falls below baseline − this many standard errors. */\n rollbackStandardErrors: 1,\n /** local-eval/tasks-heldout.ts must hold at least this many tasks (20 of 22 current tasks are saturated). */\n minHeldOutTasks: 12,\n} as const);\n\n/** Ledger payload for harness:adopted / harness:rolled-back / harness:rejected. */\nexport interface HarnessTransition {\n versionId: string;\n /** The version active before; null when none. */\n fromVersionId: string | null;\n configDigest: string;\n experimentId: string | null;\n reason: string;\n}\n\n// ---------------------------------------------------------------------------\n// Cross-unit request / result shapes (learn/{experiments,harness-registry}.ts)\n// ---------------------------------------------------------------------------\n\nexport type HarnessActor = 'mason' | 'leader' | 'daemon';\n\nexport interface StartExperimentRequest {\n hypothesis: HarnessHypothesis;\n requestedBy: HarnessActor;\n}\n\nexport type StartExperimentResult = { ok: true; experimentId: string } | { ok: false; reason: string };\n\nexport interface CancelExperimentRequest {\n experimentId: string;\n reason: string;\n actor: HarnessActor;\n}\n\n/** A finished experiment cannot be cancelled (ok: false). */\nexport type CancelExperimentResult = { ok: true } | { ok: false; reason: string };\n\nexport interface AdoptHarnessRequest {\n versionId: string;\n /** The experiment whose verdict passed the gate. */\n experimentId: string;\n actor: HarnessActor;\n}\n\nexport interface RollbackHarnessRequest {\n /** The version to make active again; null = back to the baseline defaults. */\n toVersionId: string | null;\n reason: string;\n actor: HarnessActor;\n}\n\n/** `before` is the version active before the call, so a veto can restore it exactly. */\nexport type HarnessChangeResult =\n | { ok: true; before: HarnessVersion | null; after: HarnessVersion | null }\n | { ok: false; reason: string };\n\n// ---------------------------------------------------------------------------\n// Learning API (U9) — GET /api/verse/learning\n// ---------------------------------------------------------------------------\n\nexport interface HarnessCanaryState {\n versionId: string;\n startedAt: string;\n until: string;\n baselinePassRate: number | null;\n baselineStandardError: number | null;\n currentPassRate: number | null;\n runs: number;\n}\n\nexport interface LearningStateV1 {\n v: 1;\n generatedAt: string;\n /** null = nothing adopted; the baseline defaults are in force. */\n active: HarnessVersion | null;\n canary: HarnessCanaryState | null;\n /** Oldest → newest (Growth step chart with CI band and rollback markers). */\n versions: HarnessVersion[];\n /** Newest first (ForestPlot). */\n experiments: ExperimentResultV1[];\n /** Open hypotheses not yet tested. */\n hypotheses: HarnessHypothesis[];\n}\n","/**\n * routes/verse/growth/growth-model.ts — \"is the output compounding?\" as pure\n * data (unit C7; SPEC-310B §6 Growth, SPEC-310C §5).\n *\n * weeklyBins rolling 7-day windows ENDING TODAY, so every point is a\n * complete week (a calendar week-to-date would dip every\n * Monday and read as a regression);\n * costPerMerge spend ÷ merges per window — undefined (null) for a week\n * with no merges, never $0 or ∞;\n * modelOutcomes what each model's dispatches became (ROI composition);\n * harnessSteps the active harness's level over time: each adoption\n * steps up by its experiment's lift, a rollback steps back\n * down with a ▼ marker; only real timestamps, never the\n * baseline's epoch stamp;\n * forestRows one row per experiment, newest first.\n *\n * Framework-free; tested directly.\n */\nimport type { FleetHistoryDay } from '../../../../core/verse/fleet-history-types.js';\nimport type { ExperimentResultV1, HarnessVersion, LearningStateV1 } from '../../../../core/learn/harness-types.js';\nimport { HARNESS_ADOPTION_GATE } from '../../../../core/learn/harness-types.js';\nimport type { ModelStats } from '../../../data/api-types.js';\nimport type { BarStackSegment } from '../../../components/charts/BarStack.js';\nimport { toneColor } from '../../../components/charts/colors.js';\nimport type { ForestRow } from '../../../components/charts/ForestPlot.js';\nimport type { StepMarker, StepPoint } from '../../../components/charts/StepBand.js';\nimport { calendarDayStart } from './calendar-day.js';\n\nexport interface WeekBin {\n /**\n * Epoch ms of the window's last day at the viewer's LOCAL midnight\n * (`calendarDayStart`), so every local time label names that day.\n */\n end: number;\n /** YYYY-MM-DD of the last day. */\n endDay: string;\n merges: number | null;\n costUsd: number | null;\n}\n\n/** Complete 7-day windows ending on the last day of `days`, oldest first. */\nexport function weeklyBins(days: readonly FleetHistoryDay[]): WeekBin[] {\n const bins: WeekBin[] = [];\n for (let end = days.length; end - 7 >= 0; end -= 7) {\n const week = days.slice(end - 7, end);\n const sum = (pick: (d: FleetHistoryDay) => number | null): number | null => {\n let total = 0;\n for (const d of week) {\n const v = pick(d);\n if (v === null || !Number.isFinite(v)) return null;\n total += v;\n }\n return total;\n };\n const lastDay = week[week.length - 1]!.day;\n bins.unshift({ end: calendarDayStart(lastDay), endDay: lastDay, merges: sum((d) => d.merges.realized), costUsd: sum((d) => d.estCostUsd) });\n }\n return bins;\n}\n\n/** Dollars per merge; null when either side is unknown or nothing merged. */\nexport function costPerMerge(bin: WeekBin): number | null {\n if (bin.merges === null || bin.costUsd === null || bin.merges === 0) return null;\n return bin.costUsd / bin.merges;\n}\n\n// ---------------------------------------------------------------------------\n// Model outcomes (ROI)\n// ---------------------------------------------------------------------------\n\nexport const OUTCOME_SEGMENTS: BarStackSegment[] = [\n { id: 'merged', label: 'Merged', color: toneColor('success') },\n { id: 'ship', label: 'Judged ship, not merged', color: toneColor('info') },\n { id: 'rejected', label: 'Judged not worth shipping', color: toneColor('warning') },\n { id: 'unjudged', label: 'Not judged', color: toneColor('neutral') },\n];\n\nexport interface ModelOutcomes {\n categories: string[];\n values: (number | null)[][];\n /** Per category, for the caption / table: dollars per merge. */\n costPerMerged: (number | null)[];\n models: ModelStats[];\n}\n\n/** The longest model name an axis category keeps before it is shortened. */\nexport const MODEL_LABEL_MAX = 18;\n\n/** A snapshot date at the end of a model id: `-20251001`, `-2025-10-01`, `@20251001`. */\nconst DATE_SUFFIX = /[-@](?:\\d{8}|\\d{4}-\\d{2}-\\d{2})$/;\n\n/**\n * `name` shortened to at most `max` characters by cutting at a word boundary\n * (a space, `-` or `:`) and closing with \"…\" — never mid-word\n * (`grok-4.7-fast-reasoning` → `grok-4.7-fast…`). A name with no boundary\n * early enough stays whole: a long label beats a broken word.\n */\nfunction cutAtBoundary(name: string, max = MODEL_LABEL_MAX): string {\n if (name.length <= max) return name;\n const head = name.slice(0, max);\n const at = Math.max(head.lastIndexOf(' '), head.lastIndexOf('-'), head.lastIndexOf(':'));\n return at > 0 ? `${name.slice(0, at)}…` : name;\n}\n\n/**\n * Each model's axis name, UNIQUE across the chart. A model reads as its id\n * without a vendor path or snapshot date (`claude-haiku-4-5`), shortened only\n * at a word boundary. Names that would read the same — two dated snapshots of\n * one model, two long ids sharing a prefix, one tag on two engines — step\n * down TOGETHER through the same fuller forms until they differ: the whole\n * name, the id with its date, the id with its vendor path, `engine:model`\n * (so `claude-haiku-4-5-20251001` and `claude-haiku-4-5` both keep plain\n * ids). An ordinal (\"#2\") is the last resort: two columns never share a label.\n */\nexport function modelLabels(models: readonly Pick<ModelStats, 'engine' | 'model'>[]): string[] {\n // One rung per form, the same rungs for every model (a form that adds\n // nothing for this model simply repeats), so a group steps in lockstep.\n const ladders = models.map((m) => {\n const id = m.model.includes('/') ? m.model.split('/').pop()! : m.model;\n const name = id.replace(DATE_SUFFIX, '') || id;\n return [cutAtBoundary(name), name, id, m.model, `${m.engine}:${m.model}`];\n });\n const level = models.map(() => 0);\n const current = () => ladders.map((l, i) => l[level[i]!]!);\n const rungs = ladders[0]?.length ?? 0;\n for (let rung = 1; rung < rungs; rung++) {\n const labels = current();\n const seen = new Map<string, number>();\n for (const l of labels) seen.set(l, (seen.get(l) ?? 0) + 1);\n const clashing = labels.map((l) => seen.get(l)! > 1);\n if (!clashing.includes(true)) break;\n clashing.forEach((clash, i) => {\n if (clash) level[i] = rung;\n });\n }\n const taken = new Set<string>();\n return current().map((l) => {\n let label = l;\n for (let n = 2; taken.has(label); n++) label = `${l} #${n}`;\n taken.add(label);\n return label;\n });\n}\n\n/** Top `limit` models by dispatches, each split into what its dispatches became. */\nexport function modelOutcomes(models: readonly ModelStats[], limit = 6): ModelOutcomes {\n const top = [...models].filter((m) => m.dispatches > 0).sort((a, b) => b.dispatches - a.dispatches).slice(0, limit);\n return {\n categories: modelLabels(top),\n values: top.map((m) => {\n const merged = Math.max(0, m.merged);\n const ship = Math.max(0, m.shipVerdicts - merged);\n const rejected = Math.max(0, m.judged - m.shipVerdicts);\n const unjudged = Math.max(0, m.dispatches - m.judged);\n return [merged, ship, rejected, unjudged];\n }),\n costPerMerged: top.map((m) => m.costPerMergedUsd),\n models: top,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Harness steps + experiments\n// ---------------------------------------------------------------------------\n\nexport interface HarnessSeries {\n steps: StepPoint[];\n markers: StepMarker[];\n}\n\n/**\n * Anything stamped before this is not a real harness event. The registry\n * stamps the compiled-defaults baseline `1970-01-01T00:00:00.000Z` (it has no\n * creation time — core/learn/harness-registry.ts `baselineVersion`), and a\n * step drawn there stretched the x-axis from \"Dec 31\" to today. No Ashlr\n * harness predates 2020, so the floor also catches any other zero-ish stamp.\n */\nexport const HARNESS_TIME_FLOOR_MS = Date.UTC(2020, 0, 1);\n\n/** With nothing but the compiled defaults on record, the chart shows this trailing window. */\nexport const HARNESS_BASELINE_WINDOW_MS = 90 * 86_400_000;\n\n/** Epoch ms of a real harness timestamp; null for missing, unparsable or pre-floor (epoch) stamps. */\nexport function harnessTime(iso: string | null | undefined): number | null {\n if (!iso) return null;\n const t = Date.parse(iso);\n return Number.isFinite(t) && t >= HARNESS_TIME_FLOOR_MS ? t : null;\n}\n\n/**\n * When the compiled-defaults step starts: the baseline's own time when it has\n * a real one, else the first real harness event (a candidate created, an\n * experiment started, an adoption, a rollback), else — nothing but the\n * defaults on record — `HARNESS_BASELINE_WINDOW_MS` before `now`.\n */\nfunction baselineStart(learning: LearningStateV1, baseline: HarnessVersion, now: number): number {\n const own = harnessTime(baseline.createdAt);\n if (own !== null) return own;\n const times = [\n ...learning.versions.filter((v) => v.id !== baseline.id).flatMap((v) => [v.createdAt, v.adoptedAt, v.rolledBackAt]),\n ...learning.experiments.flatMap((e) => [e.startedAt, e.finishedAt]),\n ]\n .map(harnessTime)\n .filter((t): t is number => t !== null);\n return times.length > 0 ? Math.min(...times) : now - HARNESS_BASELINE_WINDOW_MS;\n}\n\n/**\n * The level of the ACTIVE harness over time, in points of paired pass-rate\n * lift over the compiled defaults. Each adoption adds its own experiment's\n * lift to the level of the version it was measured against; its band is that\n * experiment's 95% interval (the step's own uncertainty, not a compounded\n * one — the caption says so). A rollback returns to the parent's level.\n *\n * Every step and marker carries a REAL timestamp (`harnessTime`): an event\n * without one is left out rather than drawn at the epoch. `now` (default: the\n * state's own `generatedAt`) only anchors the defaults-only window.\n */\nexport function harnessSteps(learning: LearningStateV1 | null, now?: number): HarnessSeries {\n if (!learning || learning.versions.length === 0) return { steps: [], markers: [] };\n const byId = new Map(learning.versions.map((v) => [v.id, v]));\n const exps = new Map(learning.experiments.map((e) => [e.id, e]));\n const level = new Map<string, number | null>();\n const events: { at: number; step?: StepPoint; marker?: StepMarker }[] = [];\n\n const baseline = [...learning.versions].sort((a, b) => a.seq - b.seq)[0]!;\n level.set(baseline.id, 0);\n const t0 = baselineStart(learning, baseline, now ?? harnessTime(learning.generatedAt) ?? Date.now());\n events.push({ at: t0, step: { id: `${baseline.id}@base`, at: t0, value: 0, low: 0, high: 0, label: baseline.status === 'baseline' ? 'Compiled defaults' : baseline.id, detail: 'baseline' } });\n\n const adopted = learning.versions\n .filter((v) => v.adoptedAt && v.id !== baseline.id)\n .sort((a, b) => Date.parse(a.adoptedAt!) - Date.parse(b.adoptedAt!));\n for (const v of adopted) {\n const exp: ExperimentResultV1 | undefined = v.experimentId ? exps.get(v.experimentId) : undefined;\n const baseId = exp?.baseVersionId ?? v.parentId ?? baseline.id;\n const baseLevel = level.get(baseId) ?? (byId.has(baseId) ? null : 0);\n const lift = exp?.lift ?? null;\n const value = lift && baseLevel !== null && baseLevel !== undefined ? baseLevel + lift.mean : null;\n level.set(v.id, value);\n const at = harnessTime(v.adoptedAt);\n if (at === null) continue;\n const detail = v.status === 'canary' ? 'canary' : v.status === 'rolled-back' ? 'adopted, later rolled back' : 'adopted';\n events.push({\n at,\n step: {\n id: `${v.id}@adopt`,\n at,\n value,\n low: value !== null && lift ? baseLevel! + lift.ciLow : null,\n high: value !== null && lift ? baseLevel! + lift.ciHigh : null,\n label: v.id,\n detail,\n },\n });\n if (v.rolledBackAt) {\n const back = harnessTime(v.rolledBackAt);\n if (back !== null) {\n const parentLevel = level.get(baseId) ?? null;\n const parent = byId.get(baseId);\n events.push({ at: back, marker: { id: `${v.id}@rb`, at: back, kind: 'rollback', label: `${v.id}: ${v.rollbackReason ?? 'rolled back'}` } });\n events.push({ at: back + 1, step: { id: `${v.id}@rb-step`, at: back + 1, value: parentLevel, low: null, high: null, label: parent?.id ?? baseId, detail: `restored after ${v.id} rolled back` } });\n }\n }\n }\n events.sort((a, b) => a.at - b.at);\n return {\n steps: events.flatMap((e) => (e.step ? [e.step] : [])),\n markers: events.flatMap((e) => (e.marker ? [e.marker] : [])),\n };\n}\n\nconst VERDICT_WORD: Record<string, string> = { adopt: 'passed the gate', reject: 'rejected', inconclusive: 'inconclusive' };\n\nexport function forestRows(learning: LearningStateV1 | null): ForestRow[] {\n if (!learning) return [];\n return learning.experiments.map((e) => ({\n id: e.id,\n label: `${e.candidateVersionId} vs ${e.baseVersionId}`,\n estimate: e.lift?.mean ?? null,\n low: e.lift?.ciLow ?? null,\n high: e.lift?.ciHigh ?? null,\n n: e.pairs,\n detail:\n e.status === 'running' || e.status === 'queued'\n ? `${e.status} · ${e.pairs}/${HARNESS_ADOPTION_GATE.minPairs} pairs`\n : e.verdict\n ? VERDICT_WORD[e.verdict] ?? e.verdict\n : e.status,\n }));\n}\n","/**\n * routes/verse/sections/GrowthSection.tsx — ⌘3 Growth: is the output\n * compounding? (SPEC-310B §6, SPEC-310C §5; unit C7)\n *\n * Merges / week (8) | Cost per merge (4)\n * Pipeline funnel (4) | Model outcomes (4) | Merges by day (4)\n * Harness level with 95% band + ▼ rollbacks (8) | Experiments forest plot (4)\n * Lessons (12, 3.15): recurring failure causes, suggested knowledge to\n * approve, recent retros, approved knowledge with hit counts — its own\n * lazy chunk and its own read, so Growth's first paint never waits on it.\n *\n * Sources: fleet history (A8), per-model economics (/api/models), learning\n * (B-U9). Each can be missing on its own; its cards say so. History and\n * learning change daily, so the surface refreshes every 5 minutes while\n * visible — never faster.\n *\n * Dormant fleet: when autonomy is off (or on but quiet) the shared\n * AutonomyOffState leads the grid. When history is also quiet (nothing\n * produced for 48 h), every history card would repeat the same \"since\" date,\n * so those five are left out, and the learning / model cards stay only if\n * they have something real to draw — one clear state instead of six\n * identical empty cards.\n */\nimport { lazy, Suspense, useMemo } from 'react';\nimport { AreaTrend } from '../../../components/charts/AreaTrend.js';\nimport { BarStack } from '../../../components/charts/BarStack.js';\nimport { CalendarHeatmap } from '../../../components/charts/CalendarHeatmap.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { CHART_SEQUENTIAL } from '../../../components/charts/colors.js';\nimport { ForestPlot } from '../../../components/charts/ForestPlot.js';\nimport { Funnel } from '../../../components/charts/Funnel.js';\nimport { StepBand } from '../../../components/charts/StepBand.js';\nimport { dailyValues, historyStatus, pipelineFunnel, sourceCaveat } from '../../../components/charts/fleet-history-view.js';\nimport { formatTimeLabel, formatUsd } from '../../../components/charts/format.js';\nimport { RefreshIndicator } from '../../../components/primitives/RefreshIndicator.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { AutonomyOffState, useAutonomyOff } from '../autonomy/AutonomyOffState.js';\nimport { modelsQuery } from '../../../data/queries.js';\nimport { useNow } from '../autonomy/use-ticker.js';\nimport { Cell, Surface } from '../command/Surface.js';\nimport { fleetHistoryQuery, learningQuery } from '../command/surface-data.js';\nimport { quietSinceStatus } from '../fleet/dark-since.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { OUTCOME_SEGMENTS, costPerMerge, forestRows, harnessSteps, modelOutcomes, weeklyBins } from '../growth/growth-model.js';\nimport { HARNESS_ADOPTION_GATE } from '../../../../core/learn/harness-types.js';\n\nexport const GROWTH_POLL_MS = 300_000;\n\n/** Lessons (3.15) is a separate chunk: loaded the first time Growth renders, never on app start. */\nconst LessonsPanel = lazy(() => import('../growth/LessonsPanel.js').then((m) => ({ default: m.LessonsPanel })));\n\nconst models30 = modelsQuery('30d');\n\n/** One series of weekly merge counts: the quantity ink, no legend needed. */\nconst MERGE_SEGMENTS = [{ id: 'merges', label: 'Merges', color: CHART_SEQUENTIAL }];\n\nfunction unknownFrom(reason: string | null | undefined, fallback: string): ChartStatus {\n return { kind: 'unknown', reason: reason ?? fallback };\n}\n\nexport function GrowthSection() {\n const history = useQuery(fleetHistoryQuery, { freshMs: 60_000 });\n const learning = useQuery(learningQuery, { freshMs: 60_000 });\n const models = useQuery(models30, { freshMs: 60_000 });\n const refetchHistory = useRefetch(fleetHistoryQuery);\n const refetchLearning = useRefetch(learningQuery);\n const refetchModels = useRefetch(models30);\n usePollWhileVisible(() => {\n refetchHistory();\n refetchLearning();\n refetchModels();\n }, GROWTH_POLL_MS);\n const now = useNow(60_000);\n\n const hist = history.data?.value ?? null;\n const learn = learning.data?.value ?? null;\n\n const bins = useMemo(() => (hist ? weeklyBins(hist.days) : []), [hist]);\n const histStatus: ChartStatus = !history.data ? { kind: 'loading' } : !hist ? unknownFrom(history.data.reason, 'fleet history did not answer.') : quietSinceStatus(historyStatus(hist, hist.sources.runs));\n const weeklyStatus: ChartStatus = histStatus.kind !== 'ready' ? histStatus : bins.length === 0 ? { kind: 'empty', message: 'Less than a week of history.' } : { kind: 'ready' };\n const mergesCaveat = hist ? sourceCaveat('Merge counts', hist.sources.decisions) : undefined;\n const funnel = hist ? pipelineFunnel(hist) : null;\n\n const outcomes = useMemo(() => modelOutcomes(models.data?.models ?? []), [models.data]);\n const modelStatus: ChartStatus = models.status === 'loading'\n ? { kind: 'loading' }\n : models.status === 'error' || !models.data\n ? { kind: 'unknown', reason: 'per-model economics could not be read.' }\n : outcomes.categories.length === 0\n ? { kind: 'empty', message: 'No fleet dispatches in 30 days.' }\n : { kind: 'ready' };\n\n const harness = useMemo(() => harnessSteps(learn), [learn]);\n const forest = useMemo(() => forestRows(learn), [learn]);\n const learnStatus = (emptyMessage: string, hasData: boolean): ChartStatus =>\n !learning.data ? { kind: 'loading' } : !learn ? unknownFrom(learning.data.reason, 'self-improvement did not answer.') : hasData ? { kind: 'ready' } : { kind: 'empty', message: emptyMessage };\n\n // History's \"quiet since\" (48 h without a run or proposal). The shared\n // state decides what is off and why; undefined until its reads answer.\n const quietSince = hist?.darkSince ?? null;\n const off = useAutonomyOff(quietSince);\n // Collapse only once the state can explain it — never six blank cells.\n const dormant = quietSince !== null && off != null;\n // A defaults-only harness is a flat line at 0: nothing to show while dormant.\n const harnessMoved = harness.steps.length > 1 || harness.markers.length > 0;\n const keepModels = !dormant || modelStatus.kind === 'ready';\n const keepHarness = !dormant || harnessMoved;\n const keepExperiments = !dormant || forest.length > 0;\n // Nothing left to draw: the state is the whole surface, and says so first.\n const onlyState = dormant && modelStatus.kind !== 'ready' && !harnessMoved && forest.length === 0;\n\n // A week bin sits at its last day's LOCAL midnight (growth-model\n // `weeklyBins`), so this label and the chart's own fallback rung (the\n // local `formatTimeLabel`) name the same calendar day in every zone.\n const weekLabel = (ms: number) => `wk to ${formatTimeLabel(ms)}`;\n\n return (\n <Surface title=\"Growth\" actions={[history, learning].some((q) => q.status === 'refreshing') ? <RefreshIndicator /> : null}>\n {off ? (\n <Cell span={12}>\n <AutonomyOffState state={off} here=\"growth\" title={onlyState ? 'Growth starts with the first fleet run.' : undefined} />\n </Cell>\n ) : null}\n {dormant ? null : (\n <Cell span={8}>\n {/* Columns, not an area: each week is a separate count, and a\n line between two weekly totals would draw merges that happened\n on no particular day. An unknown week is the kit's hatch. */}\n <BarStack\n title=\"Merges per week\"\n description=\"Rolling 7-day windows ending today\"\n caveat={mergesCaveat}\n status={weeklyStatus}\n categories={bins.map((b) => weekLabel(b.end))}\n segments={MERGE_SEGMENTS}\n values={bins.map((b) => [b.merges])}\n height={200}\n />\n </Cell>\n )}\n {dormant ? null : (\n <Cell span={4}>\n <AreaTrend\n title=\"Cost per merge\"\n description=\"Estimated run spend ÷ merges, per week\"\n status={weeklyStatus}\n series={[{ id: 'cpm', label: 'Cost per merge', color: CHART_SEQUENTIAL, points: bins.map((b) => ({ x: b.end, y: costPerMerge(b) })) }]}\n formatX={weekLabel}\n formatY={formatUsd}\n height={200}\n />\n </Cell>\n )}\n {dormant ? null : (\n <Cell span={4}>\n <Funnel\n title=\"Pipeline · 90d\"\n description=\"Filed → verified → passed → judged ship → merged\"\n caveat={funnel?.caveat}\n status={!funnel ? histStatus : quietSinceStatus(funnel.status)}\n stages={funnel?.stages ?? []}\n />\n </Cell>\n )}\n {keepModels ? (\n <Cell span={4}>\n <BarStack\n title=\"Model outcomes · 30d\"\n description=\"What each model's dispatches became\"\n status={modelStatus}\n categories={outcomes.categories}\n segments={OUTCOME_SEGMENTS}\n values={outcomes.values}\n height={200}\n />\n </Cell>\n ) : null}\n {dormant ? null : (\n <Cell span={4}>\n <CalendarHeatmap\n title=\"Merges by day\"\n description=\"Last 90 days\"\n status={histStatus}\n days={hist ? dailyValues(hist, (d) => d.merges.realized) : []}\n unit=\"merges\"\n />\n </Cell>\n )}\n {keepHarness ? (\n <Cell span={8}>\n {/* The rules live in the tooltip; the card says what it plots. */}\n <div title={`Band = each step's own 95% interval. A new harness runs as a canary for ${HARNESS_ADOPTION_GATE.canaryHours} h first.`}>\n <StepBand\n title=\"Harness level\"\n description=\"Pass-rate lift vs defaults\"\n status={learnStatus('Compiled defaults in force.', harness.steps.length > 0)}\n steps={harness.steps}\n markers={harness.markers}\n now={now}\n baseline={{ value: 0, label: 'Compiled defaults' }}\n unit=\"pts\"\n />\n </div>\n </Cell>\n ) : null}\n {keepExperiments ? (\n <Cell span={4}>\n <div title={`Adopted only when the interval's low end is above ${HARNESS_ADOPTION_GATE.minLiftCiLow}, over at least ${HARNESS_ADOPTION_GATE.minPairs} pairs.`}>\n <ForestPlot\n title=\"Experiments\"\n description=\"Paired lift, 95% interval\"\n status={learnStatus('No experiments yet.', forest.length > 0)}\n rows={forest}\n unit=\"pts\"\n unknownText={`under ${HARNESS_ADOPTION_GATE.minPairs} pairs`}\n />\n </div>\n </Cell>\n ) : null}\n <Cell span={12}>\n <Suspense fallback={null}>\n <LessonsPanel />\n </Suspense>\n </Cell>\n </Surface>\n );\n}\n"],"file":"GrowthSection-BK63EJn9.js"}
@@ -1,2 +0,0 @@
1
- import{n as e,s as t,u as n}from"./index-BbDqdepe.js";import{T as r,l as i}from"./global-BWc2NPzv.js";import{t as a}from"./Dialog-BYIKNPcH.js";import{t as ee}from"./MutationTokenDialog-D522NXsm.js";import{j as te}from"./VerseConsoleApp-kFOEmnGC.js";import{i as ne,l as re,m as ie}from"./VerseShared-_pMXKs8m.js";import{n as ae,x as o}from"./verse-model-CkF3q2IH.js";import{t as oe}from"./Segmented-CtwuFlbY.js";import{a as s,l as c,p as se,s as ce,u as l}from"./verse-store-DAqqNIyD.js";import{t as le,y as ue}from"./format-CcEKjUou.js";import{l as de,r as fe,t as pe}from"./context-queries-Cgb_XvRv.js";import{o as me,s as he}from"./context-model-C9EIuPJ_.js";import{t as ge}from"./SeatSelector-DSd_pxg2.js";import{C as _e,D as ve,E as u,S as ye,c as d,d as be,f as xe,g as Se,h as Ce,m as we,o as f,s as Te,w as Ee,y as p}from"./context-model-DU3OPiBC.js";import{o as De}from"./workspace-model-DRGckE8q.js";import{n as Oe,t as m}from"./use-token-gate-_JPjMD5z.js";import{t as h}from"./context.module-BijAfoJw.js";var g=n(t(),1),_=e();function v(e,t,n){if(!n)return d(e,t);if(e.length===0)return null;let r=e.find(e=>e.id===n.seatId);if(!r)return d(e,t);let i=Ce(r,n.model);if(i)return{seatId:r.id,model:i.id};let a=r.models.find(e=>!e.unavailableReason);return{seatId:r.id,model:a?a.id:n.model}}var ke=4e3,Ae="Building the handoff reads this chat’s log and runs `git diff --stat` on its folders. It spends nothing.",je=`Asking for a summary sends one turn to this chat’s seat.`,Me=`Stopping the summary turn.`,Ne=`Creating the chat records a new session on this machine. Nothing is sent to a model until you press Send in it.`;function Pe(e,t){let n=null,r=!1;for(let i of e)if(`turnId`in i&&i.turnId===t){if(i.type===`error`)n=i.message;else if(i.type===`assistant-message`||i.type===`text-delta`&&i.text.trim().length>0)r=!0;else if(i.type===`cancelled`)return{kind:`cancelled`};else if(i.type===`turn-done`)return i.ok?r?{kind:`ok`}:{kind:`empty`}:{kind:`failed`,message:n}}return null}function y(e){return e.open?(0,_.jsx)(b,{...e}):null}function b({session:e,seats:t,onClose:n,onCreated:d,initialTarget:y}){let b=(0,g.useId)(),x=(0,g.useId)(),S=(0,g.useId)(),C=(0,g.useId)(),Fe=(0,g.useId)(),w=(0,g.useId)(),T=(0,g.useId)(),E=(0,g.useRef)(null),D=Oe(),Ie=i(de),[O,Le]=(0,g.useState)(null),[k,A]=(0,g.useState)(`idle`),[j,Re]=(0,g.useState)(null),[M,ze]=(0,g.useState)(``),[N,Be]=(0,g.useState)(``),[Ve,He]=(0,g.useState)(!1),P=(0,g.useRef)(0),F=(0,g.useRef)(!0);(0,g.useEffect)(()=>(F.current=!0,()=>{F.current=!1}),[]);let Ue=(0,g.useRef)(null);Ue.current=O;let We=D.run,I=(0,g.useCallback)(async t=>{let n=P.current+=1;A(`loading`),Re(null);try{let r=await We(Ae,()=>fe(e.id,t));if(!F.current||n!==P.current)return;if(r===null){A(Ue.current?`ready`:`locked`);return}Le(r),ze(r.text),A(`ready`)}catch(e){if(!F.current||n!==P.current)return;Re(m(e)),A(`error`)}},[We,e.id]);(0,g.useEffect)(()=>{r()?I({includeLastAssistant:!1,focus:``}):A(`locked`)},[]);let L=O!==null&&M!==O.text,Ge=(0,g.useMemo)(()=>Ee(M)>65536||we({text:M})>65536,[M]),Ke=M.length>u,[R,qe]=(0,g.useState)(()=>v(t,e,y));(0,g.useEffect)(()=>{R===null&&t.length>0&&qe(v(t,e,y))},[R,t,e,y]);let z=R?o(t,R.seatId)??null:null,B=R?Ce(z,R.model):null,[V,Je]=(0,g.useState)(null),Ye=Te({option:B,target:R,source:e,preferences:Ie.data}),H=V!==null&&p(B,V)!==void 0?V:Ye,Xe=Se(B),U=ye(z,B),W=be(M.length,B,H,z?.engine??null),Ze=[he(B),me(z?.engine)].filter(Boolean).join(` `),Qe=1+(e.extraRoots?.filter(t=>t&&t!==e.projectPath).length??0),$e=De(z?.engine??null,Qe);function et(e){qe({seatId:e.seatId,model:e.model}),Je(null)}let[tt,nt]=(0,g.useState)(()=>xe(e.title)),[G,K]=(0,g.useState)({phase:`idle`}),q=o(t,e.seatId)?.label??ae[e.engine],J=G.phase===`sending`||G.phase===`waiting`||G.phase===`cancelling`,Y=e.status===`running`?`A turn is running in this chat. Wait for it to finish first.`:e.turnCount===0?`This chat has no turns yet, so there is nothing to summarize.`:null;async function rt(){K({phase:`sending`});try{let t=await D.run(je,async()=>{l(e.id,`running`);try{let t=await ie(e.id,ve);return c(e.id,t.session,t.turnId),t.turnId}catch(t){throw l(e.id,`idle`),t}});if(!F.current)return;K(t===null?{phase:`idle`}:{phase:`waiting`,turnId:t})}catch(e){F.current&&K({phase:`failed`,message:m(e)})}}async function it(){if(G.phase!==`waiting`)return;let t=G.turnId;K({phase:`cancelling`,turnId:t});try{await D.run(Me,()=>ne(e.id))===null&&F.current&&K({phase:`waiting`,turnId:t})}catch(e){F.current&&K({phase:`failed`,message:m(e)})}}let at=(0,g.useRef)(N);at.current=N,(0,g.useEffect)(()=>{if(G.phase!==`waiting`&&G.phase!==`cancelling`)return;let t=G.turnId,n=!1,r=()=>{if(n)return;let r=Pe(s(e.id).events,t);if(r!==null)switch(n=!0,r.kind){case`ok`:K({phase:`done`}),He(!0),I({includeLastAssistant:!0,focus:at.current});break;case`cancelled`:K({phase:`failed`,message:`Summary stopped. The automatic preview is unchanged.`});break;case`empty`:K({phase:`failed`,message:`${q} finished without writing a summary. The automatic preview is unchanged.`});break;default:K({phase:`failed`,message:`The summary turn failed${r.message?`: ${le(ue(r.message))}`:``}. The automatic preview is unchanged.`})}};r();let i=se(r),a=setInterval(()=>{let t=s(e.id).stream;t!==`open`&&t!==`connecting`&&t!==`reconnecting`&&re(e.id).then(t=>ce(e.id,t.session,t.events)).catch(()=>{})},ke);return()=>{n=!0,i(),clearInterval(a)}},[G,e.id]);let[X,ot]=(0,g.useState)(!1),[Z,st]=(0,g.useState)(null),ct=M.trim().length>0,Q=U??(O?null:`Build the handoff first.`)??(ct?null:`The handoff is empty — rebuild it or write one.`)??(Ge?`The handoff is over the 64 KB limit for one message. Trim it first.`:null)??(J?`Wait for the summary to finish, or stop it.`:null);async function lt(){if(!R||Q!==null||X)return;ot(!0),st(null);let t=M;try{let r=await D.run(Ne,()=>pe({source:e,seatId:R.seatId,model:R.model,contextMode:p(B,H),title:tt.trim()||void 0}));if(r===null)return;c(r.id,r),te(r.projectPath,{seatId:r.seatId,model:r.model}),d(r,t),n()}catch(e){F.current&&st(m(e))}finally{F.current&&ot(!1)}}let ut=()=>{D.dialog.open||n()},dt=Math.ceil(M.length/4),$=()=>void I({includeLastAssistant:Ve,focus:N});return(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(a,{open:!0,onClose:ut,titleId:b,title:`Continue in a fresh chat`,initialFocusRef:E,widthClassName:h.dialogWidth,description:(0,_.jsxs)(_.Fragment,{children:[`Start a new chat from a written handoff of “`,e.title||`Untitled chat`,`” instead of its full history.`]}),children:(0,_.jsxs)(`form`,{className:h.form,noValidate:!0,onSubmit:e=>{e.preventDefault(),lt()},children:[(0,_.jsxs)(`div`,{className:h.field,children:[(0,_.jsxs)(`label`,{className:h.label,htmlFor:x,children:[`Focus for the next chat `,(0,_.jsx)(`span`,{className:h.optional,children:`optional`})]}),(0,_.jsxs)(`div`,{className:h.row,children:[(0,_.jsx)(`input`,{id:x,ref:E,className:h.input,value:N,maxLength:500,placeholder:`e.g. finish the migration, then run the full test suite`,autoComplete:`off`,onChange:e=>Be(e.target.value),onKeyDown:e=>{e.key===`Enter`&&(e.preventDefault(),k!==`loading`&&$())}}),(0,_.jsx)(`button`,{type:`button`,className:h.secondary,onClick:$,disabled:k===`loading`||J,children:L?`Rebuild (replaces your edits)`:`Rebuild`})]})]}),(0,_.jsxs)(`div`,{className:h.field,children:[(0,_.jsx)(`label`,{className:h.label,htmlFor:S,children:`Handoff — becomes the new chat’s first message`}),k===`locked`&&!O?(0,_.jsxs)(`div`,{className:h.locked,role:`status`,children:[(0,_.jsxs)(`p`,{children:[`Building the handoff needs the mutation token: it reads this chat’s log and runs `,(0,_.jsx)(`code`,{children:`git diff --stat`}),`. It spends nothing.`]}),(0,_.jsx)(`button`,{type:`button`,className:h.secondary,onClick:$,children:`Unlock and build the handoff`})]}):(0,_.jsx)(`textarea`,{id:S,className:h.textarea,value:M,rows:12,spellCheck:!1,"aria-describedby":C,"aria-busy":k===`loading`||void 0,disabled:!O,placeholder:k===`loading`?`Building the handoff from this chat’s log…`:``,onChange:e=>ze(e.target.value)}),(0,_.jsx)(`p`,{id:C,className:h.hint,"aria-live":`polite`,children:k===`loading`?O?`Rebuilding…`:`Reading this chat’s log…`:O?(0,_.jsxs)(_.Fragment,{children:[M.length.toLocaleString(),` chars · ~`,dt.toLocaleString(),` tokens`,` · `,O.stats.turnsCovered,` `,O.stats.turnsCovered===1?`turn`:`turns`,` · `,O.stats.filesTouched,` `,O.stats.filesTouched===1?`file`:`files`,` touched`,L?` · edited`:``,Ve?` · includes ${q}’s own summary`:``]}):null}),O&&O.stats.truncated.length>0?(0,_.jsxs)(`p`,{className:h.hint,children:[`To stay under `,u.toLocaleString(),` characters these sections were left out: `,O.stats.truncated.join(`, `),`.`]}):null,Ge?(0,_.jsx)(`p`,{className:h.error,role:`alert`,children:`Over the 64 KB limit for one message (counted as it is sent, line breaks and quotes encoded) — the new chat could not send it. Trim it first.`}):Ke?(0,_.jsxs)(`p`,{className:h.warn,children:[`Longer than the `,u.toLocaleString(),`-character handoff budget. It can still be sent; the new chat just starts bigger.`]}):null,k===`error`&&j?(0,_.jsxs)(`p`,{className:h.error,role:`alert`,children:[`Could not build the handoff: `,j,` `,(0,_.jsx)(`button`,{type:`button`,className:h.link,onClick:$,children:`Try again`})]}):null]}),(0,_.jsxs)(`section`,{className:h.aside,"aria-labelledby":`${b}-summary`,children:[(0,_.jsxs)(`h3`,{id:`${b}-summary`,className:h.label,children:[`Better summary `,(0,_.jsx)(`span`,{className:h.optional,children:`optional, spends`})]}),(0,_.jsxs)(`p`,{className:h.hint,children:[`The handoff above is assembled from this chat’s log. For one in the agent’s own words, ask `,q,` to write it first — its reply is added to the handoff. `,_e(e.engine,q)]}),G.phase===`waiting`||G.phase===`cancelling`?(0,_.jsxs)(`div`,{className:h.row,role:`status`,children:[(0,_.jsx)(`span`,{className:h.pending,"aria-hidden":`true`}),(0,_.jsx)(`span`,{className:h.hint,children:G.phase===`cancelling`?`Stopping the summary…`:`Waiting for ${q} to finish its summary…`}),(0,_.jsx)(`button`,{type:`button`,className:h.secondary,onClick:()=>void it(),disabled:G.phase===`cancelling`,children:`Stop the summary`})]}):(0,_.jsxs)(`div`,{className:h.row,children:[(0,_.jsx)(`button`,{type:`button`,className:h.secondary,onClick:()=>void rt(),disabled:Y!==null||G.phase===`sending`,children:G.phase===`sending`?`Sending…`:G.phase===`done`?`Ask ${q} again`:`Ask ${q} to summarize first`}),G.phase===`done`?(0,_.jsx)(`span`,{className:h.hint,role:`status`,children:`Summary added.`}):null]}),Y!==null&&!J?(0,_.jsx)(`p`,{className:h.hint,children:Y}):null,Y===null&&G.phase===`idle`&&L?(0,_.jsx)(`p`,{className:h.hint,children:`The handoff is rebuilt with the summary, which replaces your edits above.`}):null,G.phase===`failed`?(0,_.jsx)(`p`,{className:h.error,role:`alert`,children:G.message}):null]}),(0,_.jsxs)(`div`,{className:h.field,children:[(0,_.jsx)(ge,{id:Fe,seats:t,value:R,onChange:et,label:`Continue on`,modeFor:(e,t)=>R&&e.id===R.seatId&&t.id===R.model?H:`standard`}),U?(0,_.jsx)(`p`,{className:h.error,role:`alert`,children:U}):null,$e?(0,_.jsx)(`p`,{className:h.hint,children:$e}):null]}),B&&!U?(0,_.jsxs)(`div`,{className:h.field,children:[Xe?(0,_.jsxs)(_.Fragment,{children:[(0,_.jsx)(`span`,{id:T,className:h.label,children:`Context mode`}),(0,_.jsx)(oe,{"aria-labelledby":T,size:`sm`,value:H,onChange:e=>Je(e),options:[{value:`standard`,label:`Standard`},{value:`expansive`,label:`Expansive`}]}),(0,_.jsxs)(`p`,{className:h.hint,children:[f(B,H),`.`,` `,H===`expansive`?`Expansive keeps far more of the conversation before compacting, but every turn re-sends all of it — each turn costs more usage.${Ze?` ${Ze}`:``}`:`Standard compacts sooner and keeps each turn cheaper. Expansive is one click away if the work needs it.`]})]}):f(B,`standard`)?(0,_.jsxs)(`p`,{className:h.hint,children:[f(B,`standard`),`.`]}):null,(0,_.jsx)(`p`,{className:`${h.fit} ${h[`fit-${W.tone}`]??``}`,"data-verdict":W.verdict??`unknown`,children:W.text})]}):null,(0,_.jsxs)(`div`,{className:h.field,children:[(0,_.jsx)(`label`,{className:h.label,htmlFor:w,children:`Title`}),(0,_.jsx)(`input`,{id:w,className:h.input,value:tt,maxLength:120,autoComplete:`off`,onChange:e=>nt(e.target.value)})]}),Z?(0,_.jsx)(`p`,{className:h.error,role:`alert`,children:Z}):null,(0,_.jsx)(`p`,{className:h.cost,children:`Creating the chat is free — nothing is sent to a model. The handoff goes into the new chat’s composer; read it, then press Send. That first turn is the first thing spent.`}),(0,_.jsxs)(`div`,{className:h.actions,children:[Q&&O?(0,_.jsx)(`span`,{className:h.blocked,children:Q}):null,(0,_.jsx)(`button`,{type:`button`,className:h.cancel,onClick:n,children:`Cancel`}),(0,_.jsx)(`button`,{type:`submit`,className:h.primary,disabled:Q!==null||X,children:X?`Creating…`:`Create chat`})]})]})}),(0,_.jsx)(ee,{open:D.dialog.open,reason:D.dialog.reason,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`,onClose:D.dialog.onClose,onUnlocked:D.dialog.onUnlocked})]})}export{y as HandoffDialog};
2
- //# sourceMappingURL=HandoffDialog-DD4M-C7v.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HandoffDialog-DD4M-C7v.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/context/HandoffDialog.tsx"],"sourcesContent":["/**\n * routes/verse/context/HandoffDialog.tsx — \"Continue in a fresh chat\".\n *\n * A long session gets expensive (every turn re-sends the whole prefix) and\n * forgetful (after a couple of compactions its early turns survive only as\n * summaries). The fix is a NEW session that starts from a written note\n * instead of the full history. This dialog builds that note, lets the\n * operator read and edit it, picks where it continues, and creates the\n * session — and then STOPS. The note is handed back through `onCreated` so\n * the caller can drop it into the new chat's composer; the operator presses\n * Send. That keeps the spending rule simple enough to say in one sentence:\n *\n * Building the preview and creating the chat spend nothing. The first\n * thing spent is the turn the operator sends, having read it.\n *\n * The one optional spend is \"Ask this seat to summarize first\": an ordinary\n * turn on the CURRENT session (through `sendVerseTurn`, so it passes the\n * engine's spend chokepoint and the local-only policy like any other turn),\n * after which the preview is rebuilt with `includeLastAssistant` so the\n * seat's own summary is carried over verbatim. It is a button, never a\n * default, and its cost is stated beside it in the seat's own name.\n *\n * Mounted only while open (the exported wrapper returns null otherwise), so\n * every open starts from a clean state and nothing is fetched for a dialog\n * nobody opened.\n */\nimport { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react';\nimport type { VerseEvent, VerseSeat, VerseSession } from '../../../data/api-types.js';\nimport {\n VERSE_HANDOFF_MAX_CHARS,\n VERSE_HANDOFF_SUMMARY_REQUEST,\n VERSE_MAX_TURN_TEXT_BYTES,\n type VerseContextMode,\n type VerseHandoffPreview,\n} from '../../../../core/verse/types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { Segmented } from '../../../components/primitives/Segmented.js';\nimport { hasMutationHold } from '../../../data/auth-store.js';\nimport { useQuery } from '../../../data/hooks.js';\nimport { SeatSelector, type SeatChoice } from '../SeatSelector.js';\nimport { ENGINE_LABEL, seatById } from '../verse-model.js';\nimport { cancelVerseTurn, fetchVerseSessionDetail, sendVerseTurn } from '../verse-queries.js';\nimport {\n getVerseSessionState,\n seedVerseSession,\n setVerseSession,\n setVerseSessionStatus,\n subscribeVerseStore,\n} from '../verse-store.js';\nimport { expansiveMeteringNote, expansiveRatioSentence } from '../usage/context-model.js';\nimport { rememberVerseSeat } from '../verse-ui-store.js';\nimport { extraRootsCaveat } from '../workspace-model.js';\nimport { asClause, tidyProse } from '../autonomy/format.js';\nimport {\n budgetLine,\n defaultHandoffMode,\n defaultHandoffTarget,\n handoffFit,\n handoffTitle,\n modelOption,\n offersExpansive,\n requestMode,\n targetUnavailableReason,\n TITLE_MAX_CHARS,\n turnCostSentence,\n utf8Bytes,\n API_BODY_MAX_BYTES,\n jsonBodyBytes,\n type HandoffTarget,\n} from './context-model.js';\nimport {\n createHandoffSession,\n fetchHandoffPreview,\n HANDOFF_FOCUS_MAX_CHARS,\n versePreferencesQuery,\n} from './context-queries.js';\nimport { describeContextError, useTokenGate } from './use-token-gate.js';\nimport styles from './context.module.css';\n\nexport interface HandoffDialogProps {\n /** The session being handed off (the live record — its status gates \"summarize\"). */\n session: VerseSession;\n seats: readonly VerseSeat[];\n open: boolean;\n onClose: () => void;\n /**\n * The new session exists. `text` is the handoff exactly as the operator left\n * it in the editor — pre-fill it into the new chat's composer; do NOT send it.\n */\n onCreated: (session: VerseSession, text: string) => void;\n /**\n * The seat + model to open on, when the operator already named one — the\n * composer's \"Continue on ‹seat›\" (Workspace). Absent = the usual default\n * (same seat and model, \"same agent, fresh context\"). See\n * `initialHandoffTarget` for how a stale choice is resolved.\n */\n initialTarget?: SeatChoice;\n}\n\n/**\n * Where the dialog opens. An explicit `initial` choice wins over the default\n * because the operator just picked it; the dialog must not silently swap it\n * for \"same seat\" and make them pick again.\n *\n * - The seat is in the roster → that seat, on the named model (matched\n * exactly, then by canonical id). If the model is gone, the seat's first\n * runnable model: the seat was the choice; the model id may be an alias the\n * roster has since renamed. If nothing on it runs, the named model stays\n * selected so `targetUnavailableReason` says WHY, rather than a different\n * seat appearing unasked.\n * - The roster is still empty (cold bootstrap) → null; the fill-once effect\n * retries with the same choice when seats arrive.\n * - The seat is not in a loaded roster (removed since) → the ordinary default.\n */\nexport function initialHandoffTarget(\n seats: readonly VerseSeat[],\n source: Pick<VerseSession, 'seatId' | 'model'>,\n initial: SeatChoice | undefined,\n): HandoffTarget | null {\n if (!initial) return defaultHandoffTarget(seats, source);\n if (seats.length === 0) return null;\n const seat = seats.find((s) => s.id === initial.seatId);\n if (!seat) return defaultHandoffTarget(seats, source);\n const named = modelOption(seat, initial.model);\n if (named) return { seatId: seat.id, model: named.id };\n const runnable = seat.models.find((m) => !m.unavailableReason);\n return { seatId: seat.id, model: runnable ? runnable.id : initial.model };\n}\n\n/** How often to re-read a session's log while waiting on a summary, when no live stream feeds the store. */\nexport const SUMMARY_POLL_MS = 4_000;\n\nconst PREVIEW_REASON = 'Building the handoff reads this chat’s log and runs `git diff --stat` on its folders. It spends nothing.';\nconst SUMMARY_REASON = 'Asking for a summary sends one turn to this chat’s seat.';\nconst CANCEL_REASON = 'Stopping the summary turn.';\nconst CREATE_REASON = 'Creating the chat records a new session on this machine. Nothing is sent to a model until you press Send in it.';\n\ntype PreviewStatus = 'idle' | 'locked' | 'loading' | 'ready' | 'error';\n\ntype SummaryState =\n | { phase: 'idle' }\n | { phase: 'sending' }\n | { phase: 'waiting'; turnId: string }\n | { phase: 'cancelling'; turnId: string }\n | { phase: 'done' }\n | { phase: 'failed'; message: string };\n\ntype TurnOutcome = { kind: 'ok' } | { kind: 'cancelled' } | { kind: 'failed'; message: string | null } | { kind: 'empty' };\n\n/**\n * How a turn ended, read from the session's event log; null while it runs.\n * Every terminal path in the engine emits `turn-done` (a stopped turn emits\n * `cancelled` first), so waiting for one of those two is sufficient.\n */\nexport function turnOutcome(events: readonly VerseEvent[], turnId: string): TurnOutcome | null {\n let lastError: string | null = null;\n let wroteReply = false;\n for (const e of events) {\n if (!('turnId' in e) || e.turnId !== turnId) continue;\n if (e.type === 'error') lastError = e.message;\n else if (e.type === 'assistant-message' || (e.type === 'text-delta' && e.text.trim().length > 0)) wroteReply = true;\n else if (e.type === 'cancelled') return { kind: 'cancelled' };\n else if (e.type === 'turn-done') {\n if (!e.ok) return { kind: 'failed', message: lastError };\n return wroteReply ? { kind: 'ok' } : { kind: 'empty' };\n }\n }\n return null;\n}\n\nexport function HandoffDialog(props: HandoffDialogProps) {\n if (!props.open) return null;\n return <HandoffDialogBody {...props} />;\n}\n\nfunction HandoffDialogBody({ session, seats, onClose, onCreated, initialTarget }: HandoffDialogProps) {\n const titleId = useId();\n const focusId = useId();\n const textId = useId();\n const statsId = useId();\n const seatId = useId();\n const nameId = useId();\n const modeLabelId = useId();\n const focusRef = useRef<HTMLInputElement>(null);\n const gate = useTokenGate();\n const prefs = useQuery(versePreferencesQuery);\n\n // ---- preview -----------------------------------------------------------\n const [preview, setPreview] = useState<VerseHandoffPreview | null>(null);\n const [previewStatus, setPreviewStatus] = useState<PreviewStatus>('idle');\n const [previewError, setPreviewError] = useState<string | null>(null);\n const [text, setText] = useState('');\n const [focus, setFocus] = useState('');\n const [includeLastAssistant, setIncludeLastAssistant] = useState(false);\n /** Only the newest preview request may land (a rebuild can race the first read). */\n const requestSeq = useRef(0);\n const mounted = useRef(true);\n useEffect(() => {\n mounted.current = true;\n return () => { mounted.current = false; };\n }, []);\n\n // Read through a ref by the async paths below, which outlive the render\n // that started them (a summary turn can take minutes).\n const previewRef = useRef<VerseHandoffPreview | null>(null);\n previewRef.current = preview;\n const runGated = gate.run;\n\n const requestPreview = useCallback(async (opts: { includeLastAssistant: boolean; focus: string }) => {\n const seq = (requestSeq.current += 1);\n setPreviewStatus('loading');\n setPreviewError(null);\n try {\n const result = await runGated(PREVIEW_REASON, () => fetchHandoffPreview(session.id, opts));\n if (!mounted.current || seq !== requestSeq.current) return;\n if (result === null) {\n // Token prompt dismissed: keep whatever preview is already on screen.\n setPreviewStatus(previewRef.current ? 'ready' : 'locked');\n return;\n }\n setPreview(result);\n setText(result.text);\n setPreviewStatus('ready');\n } catch (err) {\n if (!mounted.current || seq !== requestSeq.current) return;\n setPreviewError(describeContextError(err));\n setPreviewStatus('error');\n }\n }, [runGated, session.id]);\n\n // First build on open. With no token held it waits for an explicit unlock\n // rather than stacking a second dialog on top of this one uninvited.\n useEffect(() => {\n if (hasMutationHold()) void requestPreview({ includeLastAssistant: false, focus: '' });\n else setPreviewStatus('locked');\n // eslint-disable-next-line react-hooks/exhaustive-deps -- once per open; the body is mounted per open.\n }, []);\n\n const edited = preview !== null && text !== preview.text;\n // The new chat sends this as its first turn: it must fit the turn cap AND\n // the API's request-body cap once JSON-escaped, or the Send would be refused.\n const overTurnLimit = useMemo(\n () => utf8Bytes(text) > VERSE_MAX_TURN_TEXT_BYTES || jsonBodyBytes({ text }) > API_BODY_MAX_BYTES,\n [text],\n );\n const overBudget = text.length > VERSE_HANDOFF_MAX_CHARS;\n\n // ---- target ------------------------------------------------------------\n // The body mounts per open, so `initialTarget` is read once per open: a\n // later pick inside the dialog is never overwritten by the prop.\n const [target, setTarget] = useState<HandoffTarget | null>(() => initialHandoffTarget(seats, session, initialTarget));\n // Seats that arrive after the dialog opened (cold bootstrap) fill an empty target once.\n useEffect(() => {\n if (target === null && seats.length > 0) setTarget(initialHandoffTarget(seats, session, initialTarget));\n }, [target, seats, session, initialTarget]);\n const targetSeat = target ? seatById(seats, target.seatId) ?? null : null;\n const option = target ? modelOption(targetSeat, target.model) : null;\n const [modeChoice, setModeChoice] = useState<VerseContextMode | null>(null);\n const defaultMode = defaultHandoffMode({ option, target, source: session, preferences: prefs.data });\n const mode: VerseContextMode = modeChoice !== null && requestMode(option, modeChoice) !== undefined ? modeChoice : defaultMode;\n const expansiveOffered = offersExpansive(option);\n const unavailable = targetUnavailableReason(targetSeat, option);\n // The TARGET seat's engine: the new chat carries that CLI's fixed prompt, not the source's.\n const fit = handoffFit(text.length, option, mode, targetSeat?.engine ?? null);\n // Expansive's cost in the shared wording: the re-send ratio, then (codex\n // only) the reported >272k metering that multiplies it.\n const expansiveCost = [expansiveRatioSentence(option), expansiveMeteringNote(targetSeat?.engine)].filter(Boolean).join(' ');\n const rootCount = 1 + (session.extraRoots?.filter((r) => r && r !== session.projectPath).length ?? 0);\n const reachCaveat = extraRootsCaveat(targetSeat?.engine ?? null, rootCount);\n\n function chooseTarget(choice: SeatChoice) {\n setTarget({ seatId: choice.seatId, model: choice.model });\n // A new model re-derives its own default mode; a choice made for the old\n // model may not even exist on the new one.\n setModeChoice(null);\n }\n\n const [title, setTitle] = useState(() => handoffTitle(session.title));\n\n // ---- summarize first ---------------------------------------------------\n const [summary, setSummary] = useState<SummaryState>({ phase: 'idle' });\n const sourceSeat = seatById(seats, session.seatId);\n const sourceSeatLabel = sourceSeat?.label ?? ENGINE_LABEL[session.engine];\n const summarizing = summary.phase === 'sending' || summary.phase === 'waiting' || summary.phase === 'cancelling';\n const summarizeBlocked = session.status === 'running'\n ? 'A turn is running in this chat. Wait for it to finish first.'\n : session.turnCount === 0\n ? 'This chat has no turns yet, so there is nothing to summarize.'\n : null;\n\n async function summarize() {\n setSummary({ phase: 'sending' });\n try {\n const turnId = await gate.run(SUMMARY_REASON, async () => {\n setVerseSessionStatus(session.id, 'running');\n try {\n // The SHARED constant, verbatim: the handoff builder recognises this\n // exact text and keeps it out of the new chat's \"latest requests\".\n const response = await sendVerseTurn(session.id, VERSE_HANDOFF_SUMMARY_REQUEST);\n // Same reconciliation ChatSection's send uses: the turn may already\n // have settled by the time the 202 is applied.\n setVerseSession(session.id, response.session, response.turnId);\n return response.turnId;\n } catch (err) {\n setVerseSessionStatus(session.id, 'idle');\n throw err;\n }\n });\n if (!mounted.current) return;\n setSummary(turnId === null ? { phase: 'idle' } : { phase: 'waiting', turnId });\n } catch (err) {\n if (mounted.current) setSummary({ phase: 'failed', message: describeContextError(err) });\n }\n }\n\n async function stopSummary() {\n if (summary.phase !== 'waiting') return;\n const turnId = summary.turnId;\n setSummary({ phase: 'cancelling', turnId });\n try {\n const done = await gate.run(CANCEL_REASON, () => cancelVerseTurn(session.id));\n if (done === null && mounted.current) setSummary({ phase: 'waiting', turnId });\n // Otherwise the `cancelled` event settles it through the store watcher.\n } catch (err) {\n if (mounted.current) setSummary({ phase: 'failed', message: describeContextError(err) });\n }\n }\n\n // Watch the session's event log for the summary turn to finish. The open\n // chat's SSE stream feeds verse-store already; when nothing is streaming\n // this session (the dialog was opened for a chat that is not selected), a\n // slow poll of its detail feeds the SAME store path instead.\n const focusRefValue = useRef(focus);\n focusRefValue.current = focus;\n useEffect(() => {\n if (summary.phase !== 'waiting' && summary.phase !== 'cancelling') return undefined;\n const turnId = summary.turnId;\n let settled = false;\n const check = () => {\n if (settled) return;\n const outcome = turnOutcome(getVerseSessionState(session.id).events, turnId);\n if (outcome === null) return;\n settled = true;\n switch (outcome.kind) {\n case 'ok':\n setSummary({ phase: 'done' });\n setIncludeLastAssistant(true);\n void requestPreview({ includeLastAssistant: true, focus: focusRefValue.current });\n break;\n case 'cancelled':\n setSummary({ phase: 'failed', message: 'Summary stopped. The automatic preview is unchanged.' });\n break;\n case 'empty':\n setSummary({ phase: 'failed', message: `${sourceSeatLabel} finished without writing a summary. The automatic preview is unchanged.` });\n break;\n default:\n setSummary({\n phase: 'failed',\n // The engine's error is a sentence of its own: embedded as a\n // clause so it cannot close with \"..\", instants read as local time.\n message: `The summary turn failed${outcome.message ? `: ${asClause(tidyProse(outcome.message))}` : ''}. The automatic preview is unchanged.`,\n });\n }\n };\n check();\n const unsubscribe = subscribeVerseStore(check);\n const timer = setInterval(() => {\n const stream = getVerseSessionState(session.id).stream;\n if (stream === 'open' || stream === 'connecting' || stream === 'reconnecting') return;\n fetchVerseSessionDetail(session.id)\n .then((detail) => seedVerseSession(session.id, detail.session, detail.events))\n .catch(() => { /* the next tick retries; the operator can also stop waiting */ });\n }, SUMMARY_POLL_MS);\n return () => {\n settled = true;\n unsubscribe();\n clearInterval(timer);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps -- keyed on the turn being waited for, not on every render's callbacks.\n }, [summary, session.id]);\n\n // ---- create ------------------------------------------------------------\n const [creating, setCreating] = useState(false);\n const [createError, setCreateError] = useState<string | null>(null);\n const hasText = text.trim().length > 0;\n const createBlocked = unavailable\n ?? (!preview ? 'Build the handoff first.' : null)\n ?? (!hasText ? 'The handoff is empty — rebuild it or write one.' : null)\n ?? (overTurnLimit ? 'The handoff is over the 64 KB limit for one message. Trim it first.' : null)\n ?? (summarizing ? 'Wait for the summary to finish, or stop it.' : null);\n\n async function create() {\n if (!target || createBlocked !== null || creating) return;\n setCreating(true);\n setCreateError(null);\n const handoffText = text;\n try {\n const created = await gate.run(CREATE_REASON, () => createHandoffSession({\n source: session,\n seatId: target.seatId,\n model: target.model,\n contextMode: requestMode(option, mode),\n title: title.trim() || undefined,\n }));\n if (created === null) return;\n // Same bookkeeping ChatSection does for any new chat: the store knows\n // the record before its detail fetch lands, and the project remembers\n // the seat it was last started on.\n setVerseSession(created.id, created);\n rememberVerseSeat(created.projectPath, { seatId: created.seatId, model: created.model });\n onCreated(created, handoffText);\n onClose();\n } catch (err) {\n if (mounted.current) setCreateError(describeContextError(err));\n } finally {\n if (mounted.current) setCreating(false);\n }\n }\n\n // Escape on the token prompt must close only the prompt — both dialogs\n // listen on the document, so this one stands down while the prompt is up.\n const closeUnlessPrompting = () => {\n if (!gate.dialog.open) onClose();\n };\n\n const liveTokens = Math.ceil(text.length / 4);\n const rebuild = () => void requestPreview({ includeLastAssistant, focus });\n\n return (\n <>\n <Dialog open onClose={closeUnlessPrompting} titleId={titleId} title=\"Continue in a fresh chat\" initialFocusRef={focusRef}\n widthClassName={styles.dialogWidth}\n description={<>Start a new chat from a written handoff of “{session.title || 'Untitled chat'}” instead of its full history.</>}>\n <form className={styles.form} noValidate onSubmit={(event) => { event.preventDefault(); void create(); }}>\n {/* ---- the note ---- */}\n <div className={styles.field}>\n <label className={styles.label} htmlFor={focusId}>\n Focus for the next chat <span className={styles.optional}>optional</span>\n </label>\n <div className={styles.row}>\n <input id={focusId} ref={focusRef} className={styles.input} value={focus} maxLength={HANDOFF_FOCUS_MAX_CHARS}\n placeholder=\"e.g. finish the migration, then run the full test suite\" autoComplete=\"off\"\n onChange={(event) => setFocus(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n if (previewStatus !== 'loading') rebuild();\n }\n }} />\n <button type=\"button\" className={styles.secondary} onClick={rebuild}\n disabled={previewStatus === 'loading' || summarizing}>\n {edited ? 'Rebuild (replaces your edits)' : 'Rebuild'}\n </button>\n </div>\n </div>\n\n <div className={styles.field}>\n <label className={styles.label} htmlFor={textId}>Handoff — becomes the new chat’s first message</label>\n {previewStatus === 'locked' && !preview ? (\n <div className={styles.locked} role=\"status\">\n <p>Building the handoff needs the mutation token: it reads this chat’s log and runs <code>git diff --stat</code>. It spends nothing.</p>\n <button type=\"button\" className={styles.secondary} onClick={rebuild}>Unlock and build the handoff</button>\n </div>\n ) : (\n <textarea id={textId} className={styles.textarea} value={text} rows={12} spellCheck={false}\n aria-describedby={statsId} aria-busy={previewStatus === 'loading' ? true : undefined}\n disabled={!preview}\n placeholder={previewStatus === 'loading' ? 'Building the handoff from this chat’s log…' : ''}\n onChange={(event) => setText(event.target.value)} />\n )}\n <p id={statsId} className={styles.hint} aria-live=\"polite\">\n {previewStatus === 'loading'\n ? preview ? 'Rebuilding…' : 'Reading this chat’s log…'\n : preview ? (\n <>\n {text.length.toLocaleString()} chars · ~{liveTokens.toLocaleString()} tokens\n {' · '}{preview.stats.turnsCovered} {preview.stats.turnsCovered === 1 ? 'turn' : 'turns'}\n {' · '}{preview.stats.filesTouched} {preview.stats.filesTouched === 1 ? 'file' : 'files'} touched\n {edited ? ' · edited' : ''}\n {includeLastAssistant ? ` · includes ${sourceSeatLabel}’s own summary` : ''}\n </>\n ) : null}\n </p>\n {preview && preview.stats.truncated.length > 0 ? (\n <p className={styles.hint}>\n To stay under {VERSE_HANDOFF_MAX_CHARS.toLocaleString()} characters these sections were left out: {preview.stats.truncated.join(', ')}.\n </p>\n ) : null}\n {overTurnLimit ? (\n <p className={styles.error} role=\"alert\">\n Over the 64 KB limit for one message (counted as it is sent, line breaks and quotes encoded) — the new chat could\n not send it. Trim it first.\n </p>\n ) : overBudget ? (\n <p className={styles.warn}>\n Longer than the {VERSE_HANDOFF_MAX_CHARS.toLocaleString()}-character handoff budget. It can still be sent; the new chat just starts bigger.\n </p>\n ) : null}\n {previewStatus === 'error' && previewError ? (\n <p className={styles.error} role=\"alert\">\n Could not build the handoff: {previewError}{' '}\n <button type=\"button\" className={styles.link} onClick={rebuild}>Try again</button>\n </p>\n ) : null}\n </div>\n\n {/* ---- optional: the seat's own summary ---- */}\n <section className={styles.aside} aria-labelledby={`${titleId}-summary`}>\n <h3 id={`${titleId}-summary`} className={styles.label}>Better summary <span className={styles.optional}>optional, spends</span></h3>\n <p className={styles.hint}>\n The handoff above is assembled from this chat’s log. For one in the agent’s own words, ask {sourceSeatLabel} to\n write it first — its reply is added to the handoff. {turnCostSentence(session.engine, sourceSeatLabel)}\n </p>\n {summary.phase === 'waiting' || summary.phase === 'cancelling' ? (\n <div className={styles.row} role=\"status\">\n <span className={styles.pending} aria-hidden=\"true\" />\n <span className={styles.hint}>\n {summary.phase === 'cancelling' ? 'Stopping the summary…' : `Waiting for ${sourceSeatLabel} to finish its summary…`}\n </span>\n <button type=\"button\" className={styles.secondary} onClick={() => void stopSummary()}\n disabled={summary.phase === 'cancelling'}>Stop the summary</button>\n </div>\n ) : (\n <div className={styles.row}>\n <button type=\"button\" className={styles.secondary} onClick={() => void summarize()}\n disabled={summarizeBlocked !== null || summary.phase === 'sending'}>\n {summary.phase === 'sending' ? 'Sending…' : summary.phase === 'done' ? `Ask ${sourceSeatLabel} again` : `Ask ${sourceSeatLabel} to summarize first`}\n </button>\n {summary.phase === 'done' ? <span className={styles.hint} role=\"status\">Summary added.</span> : null}\n </div>\n )}\n {summarizeBlocked !== null && !summarizing ? <p className={styles.hint}>{summarizeBlocked}</p> : null}\n {summarizeBlocked === null && summary.phase === 'idle' && edited ? (\n <p className={styles.hint}>The handoff is rebuilt with the summary, which replaces your edits above.</p>\n ) : null}\n {summary.phase === 'failed' ? <p className={styles.error} role=\"alert\">{summary.message}</p> : null}\n </section>\n\n {/* ---- where it continues ---- */}\n <div className={styles.field}>\n <SeatSelector id={seatId} seats={seats} value={target} onChange={chooseTarget} label=\"Continue on\"\n modeFor={(seat, model) => (target && seat.id === target.seatId && model.id === target.model ? mode : 'standard')} />\n {unavailable ? <p className={styles.error} role=\"alert\">{unavailable}</p> : null}\n {reachCaveat ? <p className={styles.hint}>{reachCaveat}</p> : null}\n </div>\n\n {option && !unavailable ? (\n <div className={styles.field}>\n {expansiveOffered ? (\n <>\n <span id={modeLabelId} className={styles.label}>Context mode</span>\n <Segmented<VerseContextMode> aria-labelledby={modeLabelId} size=\"sm\" value={mode}\n onChange={(next) => setModeChoice(next)}\n options={[\n { value: 'standard', label: 'Standard' },\n { value: 'expansive', label: 'Expansive' },\n ]} />\n <p className={styles.hint}>\n {budgetLine(option, mode)}.{' '}\n {mode === 'expansive'\n ? `Expansive keeps far more of the conversation before compacting, but every turn re-sends all of it — each turn costs more usage.${expansiveCost ? ` ${expansiveCost}` : ''}`\n : 'Standard compacts sooner and keeps each turn cheaper. Expansive is one click away if the work needs it.'}\n </p>\n </>\n ) : budgetLine(option, 'standard') ? (\n <p className={styles.hint}>{budgetLine(option, 'standard')}.</p>\n ) : null}\n <p className={`${styles.fit} ${styles[`fit-${fit.tone}`] ?? ''}`} data-verdict={fit.verdict ?? 'unknown'}>\n {fit.text}\n </p>\n </div>\n ) : null}\n\n <div className={styles.field}>\n <label className={styles.label} htmlFor={nameId}>Title</label>\n <input id={nameId} className={styles.input} value={title} maxLength={TITLE_MAX_CHARS} autoComplete=\"off\"\n onChange={(event) => setTitle(event.target.value)} />\n </div>\n\n {createError ? <p className={styles.error} role=\"alert\">{createError}</p> : null}\n\n <p className={styles.cost}>\n Creating the chat is free — nothing is sent to a model. The handoff goes into the new chat’s composer; read it,\n then press Send. That first turn is the first thing spent.\n </p>\n <div className={styles.actions}>\n {createBlocked && preview ? <span className={styles.blocked}>{createBlocked}</span> : null}\n <button type=\"button\" className={styles.cancel} onClick={onClose}>Cancel</button>\n <button type=\"submit\" className={styles.primary} disabled={createBlocked !== null || creating}>\n {creating ? 'Creating…' : 'Create chat'}\n </button>\n </div>\n </form>\n </Dialog>\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 </>\n );\n}\n"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/HomeSeats-CJCxRUlD.js","assets/seat-subscription-BClqZwau.js","assets/verse-model-CkF3q2IH.js","assets/compaction-point-VL9oegWS.js","assets/seat-readiness-CvEmMBol.js","assets/format-CcEKjUou.js","assets/format-D7nBg2bn.js","assets/useSeatsRefresh-BGsdylUl.js","assets/health-queries-D8TwNTDQ.js","assets/resources-queries-CKyXyaDY.js","assets/capacity-strip-model-pdIEweaZ.js","assets/budget-model-CKd0d1Cj.js","assets/policy-CEIamUKN.js","assets/context-model-DU3OPiBC.js","assets/transient-events-nTLhMBND.js","assets/types-IYKrYLku.js","assets/local-model-C9xNi9fN.js","assets/global-1SED_aTT.css","assets/VerseMobileApp-CK62hnya.css","assets/parts-bRLxuRh-.css"])))=>i.map(i=>d[i]);
2
- import{n as e,s as t,t as n,u as r}from"./index-BbDqdepe.js";import{W as i,l as a,u as o}from"./global-BWc2NPzv.js";import{M as s}from"./VerseShared-_pMXKs8m.js";import{n as c}from"./verse-bootstrap-query-BR5ypA8b.js";import{a as l,f as u,n as d,p as f,r as p}from"./VerseMobileApp-BTGF5yuZ.js";import{f as m}from"./control-queries-Clgsy_eH.js";import{s as h}from"./surface-data-DoN8peNV.js";import{c as g,o as _,s as v,t as y}from"./ui-parts-2JLq2ZSq.js";import{i as b,r as x}from"./fleet-state-CCdBRK-m.js";var S=r(t(),1),C=e(),w=(0,S.lazy)(()=>n(()=>import(`./HomeSeats-CJCxRUlD.js`).then(e=>({default:e.HomeSeats})),__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19]))),T=15e3,E={running:`running`,paused:`warning`,stopped:`neutral`,blocked:`danger`,unknown:`neutral`};function D(e){return e==null||!Number.isFinite(e)?`—`:e>=100?`$${Math.round(e)}`:`$${e.toFixed(2)}`}function O(e,t=Date.now()){let n=e?Date.parse(e):NaN;if(!Number.isFinite(n))return null;let r=Math.max(0,Math.round((t-n)/6e4));return r<1?`just now`:r<60?`${r}m`:`${Math.floor(r/60)}h ${r%60}m`}function k(){return Promise.all([i(m.key,()=>m.fetch(),!0),i(h.key,()=>h.fetch(),!0),i(c.key,()=>c.fetch(),!0)])}function A({label:e,value:t,hint:n,onClick:r,tone:i}){let a=(0,C.jsxs)(C.Fragment,{children:[(0,C.jsx)(`span`,{className:d.statValue,"data-tone":i,children:t}),(0,C.jsx)(`span`,{className:d.statLabel,children:e}),n?(0,C.jsx)(`span`,{className:d.statHint,children:n}):null]});return r?(0,C.jsx)(`button`,{type:`button`,className:d.stat,onClick:r,children:a}):(0,C.jsx)(`div`,{className:d.stat,children:a})}function j(){let{activity:e,permissions:t,navigate:n,needsCount:r}=f(),i=a(m),c=a(h),k=o(m),j=o(h),M=(0,S.useCallback)(()=>{k(),j()},[k,j]);s(M,T);let N=e.data,P=x({control:i.data??null,live:c.data?.value??null,badge:N?.autonomy??null}),F=(i.status===`loading`||c.status===`loading`)&&P.headline===`unknown`,I=N?.running??[],L=i.data?.spend,R=u(t),z=P.action,B=z!==null&&(z.kind===`open-fleet`||R);return(0,C.jsxs)(C.Fragment,{children:[(0,C.jsxs)(`section`,{className:`${g.card} ${d.fleet}`,"aria-label":`Fleet`,children:[(0,C.jsxs)(`div`,{className:g.spread,children:[(0,C.jsx)(`span`,{className:d.fleetTitle,children:`Fleet`}),F?(0,C.jsx)(`span`,{className:`skeleton ${d.badgeSkeleton}`,"aria-hidden":`true`}):(0,C.jsx)(y,{tone:E[P.headline],dot:!0,pulse:P.headline===`running`&&(P.building??0)>0,children:P.label})]}),(0,C.jsx)(`p`,{className:d.fleetDetail,children:F?`Checking the fleet…`:P.detail}),B&&z?z.kind===`open-fleet`?(0,C.jsx)(p,{variant:`tinted`,block:!0,onClick:()=>n({screen:`fleet`}),children:z.label}):(0,C.jsx)(p,{variant:z.destructive?`destructiveTinted`:`tinted`,block:!0,onClick:()=>b(z),children:z.label}):null]}),(0,C.jsxs)(`div`,{className:d.stats,children:[(0,C.jsx)(A,{label:`Needs you`,value:r===null?`—`:String(r),tone:r?`alert`:void 0,onClick:()=>n({screen:`needs`})}),(0,C.jsx)(A,{label:`Working`,value:N?String(N.counts.running):`—`,onClick:()=>n({screen:`agents`})}),(0,C.jsx)(A,{label:`Spent today`,value:D(L?.todayUsd),hint:L&&L.dailyBudgetUsd>0?`of ${D(L.dailyBudgetUsd)}`:void 0})]}),(0,C.jsx)(v,{title:`Working now`,trailing:I.length>0?(0,C.jsx)(`button`,{type:`button`,className:`${g.btn} ${g.plain}`,onClick:()=>n({screen:`agents`}),children:`All`}):void 0,children:e.status===`loading`||e.status===`idle`?(0,C.jsx)(l,{rows:2,label:`Loading running agents`}):I.length===0?(0,C.jsx)(_,{title:`No agent is running`,subtitle:R?`Start one with + above.`:`Agents you start on your Mac show here.`}):I.slice(0,5).map(e=>{let t=e.live?.tool?`Using ${e.live.tool}`:e.live?.phase?e.live.phase:`Working`,r=O(e.startedAt);return(0,C.jsx)(_,{title:e.title||`Untitled chat`,subtitle:`${e.engine} · ${t}`,trailing:r??void 0,onClick:()=>n({screen:`agent`,id:e.sessionId,pane:`transcript`})},e.sessionId)})}),(0,C.jsx)(S.Suspense,{fallback:(0,C.jsx)(v,{title:`Seats`,flat:!0,children:(0,C.jsx)(l,{rows:3,label:`Loading seats`})}),children:(0,C.jsx)(w,{})})]})}export{T as HOME_POLL_MS,j as HomeBody,O as elapsedText,D as formatUsd,k as refreshHome};
3
- //# sourceMappingURL=HomeBody-OEhTpkk9.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/screens/HomeBody.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/screens/HomeBody.tsx — Home's cards: is the fleet\n * moving (and the one button that matters), what is waiting on you, who is\n * working right now, what today cost, and how much each seat has left.\n *\n * Reads, all shared with the workbench (same cache keys, so the Mac's own\n * views and this screen never disagree):\n * activity the shell's loop (useMobile().activity) — needs-you, running, autonomy badge\n * control GET /api/verse/control — daemon, pause, kill switch, today's spend\n * fleet live GET /api/verse/fleet/live — the fleet's state and reason\n * seats the bootstrap's seats (HomeSeats, a chunk of its own)\n *\n * A preloaded chunk of its own (HomeScreen.tsx): the frame paints at once\n * over skeletons in these cards' shape, and these arrive a beat later, the\n * same arrangement the workbench's Chat section uses for its workspace.\n *\n * Unknown is shown as unknown: a figure the Mac did not report is \"—\", never 0.\n */\nimport { lazy, Suspense, useCallback } from 'react';\nimport { refetchQuery } from '../../../../data/cache.js';\nimport { useQuery, useRefetch } from '../../../../data/hooks.js';\nimport { verseControlQuery } from '../../autonomy/control-queries.js';\nimport { fleetLiveQuery } from '../../command/surface-data.js';\nimport { usePollWhileVisible } from '../../shell/section-visibility.js';\nimport { verseBootstrapQuery } from '../../verse-bootstrap-query.js';\nimport { runFleetAction } from '../fleet-actions.js';\nimport { fleetStateView, type FleetHeadline } from '../fleet-state.js';\nimport { canShowActions, useMobile } from '../mobile-context.js';\nimport { Button, SkeletonList } from '../ui.js';\nimport { Badge, Row, Section, ui, type Tone } from '../ui-parts.js';\nimport styles from './HomeScreen.module.css';\n\nconst HomeSeats = lazy(() => import('./HomeSeats.js').then((m) => ({ default: m.HomeSeats })));\n\nexport const HOME_POLL_MS = 15_000;\n\nconst HEADLINE_TONE: Readonly<Record<FleetHeadline, Tone>> = {\n running: 'running',\n paused: 'warning',\n stopped: 'neutral',\n blocked: 'danger',\n unknown: 'neutral',\n};\n\nexport function formatUsd(value: number | null | undefined): string {\n if (value === null || value === undefined || !Number.isFinite(value)) return '—';\n return value >= 100 ? `$${Math.round(value)}` : `$${value.toFixed(2)}`;\n}\n\n/** \"3m\", \"1h 12m\" — how long a run has been going. */\nexport function elapsedText(startedAt: string | null, now: number = Date.now()): string | null {\n const t = startedAt ? Date.parse(startedAt) : NaN;\n if (!Number.isFinite(t)) return null;\n const m = Math.max(0, Math.round((now - t) / 60_000));\n if (m < 1) return 'just now';\n if (m < 60) return `${m}m`;\n return `${Math.floor(m / 60)}h ${m % 60}m`;\n}\n\n/** Pull-to-refresh on Home: every read the cards show, forced fresh. */\nexport function refreshHome(): Promise<unknown> {\n return Promise.all([\n refetchQuery(verseControlQuery.key, () => verseControlQuery.fetch(), true),\n refetchQuery(fleetLiveQuery.key, () => fleetLiveQuery.fetch(), true),\n refetchQuery(verseBootstrapQuery.key, () => verseBootstrapQuery.fetch(), true),\n ]);\n}\n\nfunction Stat({ label, value, hint, onClick, tone }: { label: string; value: string; hint?: string; onClick?: () => void; tone?: 'alert' }) {\n const body = (\n <>\n <span className={styles.statValue} data-tone={tone}>{value}</span>\n <span className={styles.statLabel}>{label}</span>\n {hint ? <span className={styles.statHint}>{hint}</span> : null}\n </>\n );\n return onClick ? (\n <button type=\"button\" className={styles.stat} onClick={onClick}>{body}</button>\n ) : (\n <div className={styles.stat}>{body}</div>\n );\n}\n\nexport function HomeBody() {\n const { activity, permissions, navigate, needsCount } = useMobile();\n const control = useQuery(verseControlQuery);\n const live = useQuery(fleetLiveQuery);\n const refetchControl = useRefetch(verseControlQuery);\n const refetchLive = useRefetch(fleetLiveQuery);\n const poll = useCallback(() => {\n refetchControl();\n refetchLive();\n }, [refetchControl, refetchLive]);\n usePollWhileVisible(poll, HOME_POLL_MS);\n\n const data = activity.data;\n const fleet = fleetStateView({\n control: control.data ?? null,\n live: live.data?.value ?? null,\n badge: data?.autonomy ?? null,\n });\n const fleetLoading = (control.status === 'loading' || live.status === 'loading') && fleet.headline === 'unknown';\n const running = data?.running ?? [];\n const spend = control.data?.spend;\n const canAct = canShowActions(permissions);\n const action = fleet.action;\n const showAction = action !== null && (action.kind === 'open-fleet' || canAct);\n\n return (\n <>\n <section className={`${ui.card} ${styles.fleet}`} aria-label=\"Fleet\">\n <div className={ui.spread}>\n <span className={styles.fleetTitle}>Fleet</span>\n {fleetLoading ? (\n <span className={`skeleton ${styles.badgeSkeleton}`} aria-hidden=\"true\" />\n ) : (\n <Badge tone={HEADLINE_TONE[fleet.headline]} dot pulse={fleet.headline === 'running' && (fleet.building ?? 0) > 0}>{fleet.label}</Badge>\n )}\n </div>\n <p className={styles.fleetDetail}>{fleetLoading ? 'Checking the fleet…' : fleet.detail}</p>\n {showAction && action ? (\n action.kind === 'open-fleet' ? (\n <Button variant=\"tinted\" block onClick={() => navigate({ screen: 'fleet' })}>{action.label}</Button>\n ) : (\n <Button variant={action.destructive ? 'destructiveTinted' : 'tinted'} block onClick={() => runFleetAction(action)}>{action.label}</Button>\n )\n ) : null}\n </section>\n\n <div className={styles.stats}>\n <Stat\n label=\"Needs you\"\n value={needsCount === null ? '—' : String(needsCount)}\n tone={needsCount ? 'alert' : undefined}\n onClick={() => navigate({ screen: 'needs' })}\n />\n <Stat label=\"Working\" value={data ? String(data.counts.running) : '—'} onClick={() => navigate({ screen: 'agents' })} />\n <Stat\n label=\"Spent today\"\n value={formatUsd(spend?.todayUsd)}\n hint={spend && spend.dailyBudgetUsd > 0 ? `of ${formatUsd(spend.dailyBudgetUsd)}` : undefined}\n />\n </div>\n\n <Section title=\"Working now\" trailing={running.length > 0 ? <button type=\"button\" className={`${ui.btn} ${ui.plain}`} onClick={() => navigate({ screen: 'agents' })}>All</button> : undefined}>\n {activity.status === 'loading' || activity.status === 'idle' ? (\n <SkeletonList rows={2} label=\"Loading running agents\" />\n ) : running.length === 0 ? (\n <Row title=\"No agent is running\" subtitle={canAct ? 'Start one with + above.' : 'Agents you start on your Mac show here.'} />\n ) : (\n running.slice(0, 5).map((r) => {\n const doing = r.live?.tool ? `Using ${r.live.tool}` : r.live?.phase ? r.live.phase : 'Working';\n const elapsed = elapsedText(r.startedAt);\n return (\n <Row\n key={r.sessionId}\n title={r.title || 'Untitled chat'}\n subtitle={`${r.engine} · ${doing}`}\n trailing={elapsed ?? undefined}\n onClick={() => navigate({ screen: 'agent', id: r.sessionId, pane: 'transcript' })}\n />\n );\n })\n )}\n </Section>\n\n <Suspense fallback={<Section title=\"Seats\" flat><SkeletonList rows={3} label=\"Loading seats\" /></Section>}>\n <HomeSeats />\n </Suspense>\n </>\n );\n}\n"],"file":"HomeBody-OEhTpkk9.js"}
@@ -1,2 +0,0 @@
1
- import{n as e}from"./index-BbDqdepe.js";import{l as t}from"./global-BWc2NPzv.js";import{n}from"./verse-bootstrap-query-BR5ypA8b.js";import{a as r,n as i}from"./VerseMobileApp-BTGF5yuZ.js";import{n as a}from"./seat-subscription-BClqZwau.js";import{t as o}from"./useSeatsRefresh-BGsdylUl.js";import{a as s,c,s as l}from"./ui-parts-2JLq2ZSq.js";import{n as u}from"./resources-queries-CKyXyaDY.js";var d=e(),f=[`claude`,`codex`,`grok`,`devin`,`local`];function p(e){let t=e=>{let t=f.indexOf(e.engine);return t===-1?f.length:t};return[...e].sort((e,n)=>t(e)-t(n)||e.label.localeCompare(n.label))}function m({seat:e}){let t=a(e);if(t.kind===`local`)return(0,d.jsx)(s,{label:e.label,percent:null,valueText:t.word,note:t.summary});let n=t.binding,r=n===null?t.word:n.limitReached?`limit reached`:n.usedPercent===null?`unknown`:`${Math.round(n.usedPercent)}% used`,i=[n?`${n.label} window`:null,n?.resetText?`resets ${n.resetText}`:null,t.credits].filter(Boolean);return(0,d.jsx)(s,{label:`${e.label}${t.plan?` · ${t.plan}`:``}`,percent:n?.limitReached?100:n?.usedPercent??null,valueText:r,note:i.length>0?i.join(` · `):t.summary})}function h(){o(!0);let e=t(n),a=t(u),f=e.data?p(e.data.seats):null,h=a.data?.credits??null;return(0,d.jsx)(l,{title:`Seats`,flat:!0,children:f===null?(0,d.jsx)(r,{rows:3,label:`Loading seats`}):(0,d.jsxs)(`div`,{className:`${c.card} ${i.seats}`,children:[f.length===0?(0,d.jsx)(`p`,{className:c.muted,children:`No seats are configured on your Mac.`}):null,f.map(e=>(0,d.jsx)(m,{seat:e},e.id)),h?(0,d.jsx)(s,{label:`Cloud credits`,percent:100-h.remainingPercent,valueText:`$${h.remainingUsd.toFixed(2)} left`,note:`${h.running} running · ${h.sessionsToday} today`}):a.data&&!a.data.available?null:a.status===`loading`?(0,d.jsx)(s,{label:`Cloud credits`,percent:null,valueText:`…`}):null]})})}export{h as HomeSeats};
2
- //# sourceMappingURL=HomeSeats-CJCxRUlD.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HomeSeats-CJCxRUlD.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/screens/HomeSeats.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/screens/HomeSeats.tsx — Home's seat meters: every seat\n * the Mac has (Claude, both Codex accounts, Grok, Devin, local models) plus\n * Claude cloud credits. A chunk of its own, below the fold, so the meters'\n * models never weigh on the first paint.\n *\n * Each meter is the workbench's own reading (seat-subscription.ts): the\n * BINDING window — the one that actually stops work — with the provider's\n * reset text. A seat with no reading shows \"unknown\", never an empty 0%;\n * a local model shows readiness, never a quota it does not have.\n */\nimport { useQuery } from '../../../../data/hooks.js';\nimport { cloudCreditsQuery } from '../../resources/resources-queries.js';\nimport { seatSubscription } from '../../seat-subscription.js';\nimport { useSeatsRefresh } from '../../useSeatsRefresh.js';\nimport { verseBootstrapQuery } from '../../verse-bootstrap-query.js';\nimport type { VerseSeat } from '../../../../data/api-types.js';\nimport { SkeletonList } from '../ui.js';\nimport { Meter, Section, ui } from '../ui-parts.js';\nimport styles from './HomeScreen.module.css';\n\nconst ENGINE_ORDER = ['claude', 'codex', 'grok', 'devin', 'local'] as const;\n\nexport function orderSeats(seats: readonly VerseSeat[]): VerseSeat[] {\n const rank = (s: VerseSeat) => {\n const i = (ENGINE_ORDER as readonly string[]).indexOf(s.engine);\n return i === -1 ? ENGINE_ORDER.length : i;\n };\n return [...seats].sort((a, b) => rank(a) - rank(b) || a.label.localeCompare(b.label));\n}\n\nfunction SeatMeter({ seat }: { seat: VerseSeat }) {\n const view = seatSubscription(seat);\n if (view.kind === 'local') {\n return <Meter label={seat.label} percent={null} valueText={view.word} note={view.summary} />;\n }\n const binding = view.binding;\n const valueText = binding === null\n ? view.word\n : binding.limitReached\n ? 'limit reached'\n : binding.usedPercent === null ? 'unknown' : `${Math.round(binding.usedPercent)}% used`;\n const noteParts = [binding ? `${binding.label} window` : null, binding?.resetText ? `resets ${binding.resetText}` : null, view.credits].filter(Boolean);\n return (\n <Meter\n label={`${seat.label}${view.plan ? ` · ${view.plan}` : ''}`}\n percent={binding?.limitReached ? 100 : binding?.usedPercent ?? null}\n valueText={valueText}\n note={noteParts.length > 0 ? noteParts.join(' · ') : view.summary}\n />\n );\n}\n\nexport function HomeSeats() {\n useSeatsRefresh(true);\n const bootstrap = useQuery(verseBootstrapQuery);\n const cloud = useQuery(cloudCreditsQuery);\n const seats = bootstrap.data ? orderSeats(bootstrap.data.seats) : null;\n const credits = cloud.data?.credits ?? null;\n\n return (\n <Section title=\"Seats\" flat>\n {seats === null ? (\n <SkeletonList rows={3} label=\"Loading seats\" />\n ) : (\n <div className={`${ui.card} ${styles.seats}`}>\n {seats.length === 0 ? <p className={ui.muted}>No seats are configured on your Mac.</p> : null}\n {seats.map((seat) => <SeatMeter key={seat.id} seat={seat} />)}\n {credits ? (\n <Meter\n label=\"Cloud credits\"\n percent={100 - credits.remainingPercent}\n valueText={`$${credits.remainingUsd.toFixed(2)} left`}\n note={`${credits.running} running · ${credits.sessionsToday} today`}\n />\n ) : cloud.data && !cloud.data.available ? null : cloud.status === 'loading' ? (\n <Meter label=\"Cloud credits\" percent={null} valueText=\"…\" />\n ) : null}\n </div>\n )}\n </Section>\n );\n}\n"],"mappings":"oZAqBM,EAAe,CAAC,SAAU,QAAS,OAAQ,QAAS,OAAO,EAEjE,SAAgB,EAAW,EAA0C,CACnE,IAAM,EAAQ,GAAiB,CAC7B,IAAM,EAAK,EAAmC,QAAQ,EAAE,MAAM,EAC9D,OAAO,IAAM,GAAK,EAAa,OAAS,CAC1C,EACA,MAAO,CAAC,GAAG,CAAK,CAAC,CAAC,MAAM,EAAG,IAAM,EAAK,CAAC,EAAI,EAAK,CAAC,GAAK,EAAE,MAAM,cAAc,EAAE,KAAK,CAAC,CACtF,CAEA,SAAS,EAAU,CAAE,QAA6B,CAChD,IAAM,EAAO,EAAiB,CAAI,EAClC,GAAI,EAAK,OAAS,QAChB,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAO,EAAK,MAAO,QAAS,KAAM,UAAW,EAAK,KAAM,KAAM,EAAK,OAAU,CAAA,EAE7F,IAAM,EAAU,EAAK,QACf,EAAY,IAAY,KAC1B,EAAK,KACL,EAAQ,aACN,gBACA,EAAQ,cAAgB,KAAO,UAAY,GAAG,KAAK,MAAM,EAAQ,WAAW,EAAE,QAC9E,EAAY,CAAC,EAAU,GAAG,EAAQ,MAAM,SAAW,KAAM,GAAS,UAAY,UAAU,EAAQ,YAAc,KAAM,EAAK,OAAO,CAAC,CAAC,OAAO,OAAO,EACtJ,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAO,GAAG,EAAK,QAAQ,EAAK,KAAO,MAAM,EAAK,OAAS,KACvD,QAAS,GAAS,aAAe,IAAM,GAAS,aAAe,KACpD,YACX,KAAM,EAAU,OAAS,EAAI,EAAU,KAAK,KAAK,EAAI,EAAK,OAC3D,CAAA,CAEL,CAEA,SAAgB,GAAY,CAC1B,EAAgB,EAAI,EACpB,IAAM,EAAY,EAAS,CAAmB,EACxC,EAAQ,EAAS,CAAiB,EAClC,EAAQ,EAAU,KAAO,EAAW,EAAU,KAAK,KAAK,EAAI,KAC5D,EAAU,EAAM,MAAM,SAAW,KAEvC,OACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,MAAM,QAAQ,KAAA,GACpB,SAAA,IAAU,MACT,EAAA,EAAA,IAAA,CAAC,EAAD,CAAc,KAAM,EAAG,MAAM,eAAiB,CAAA,GAE9C,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAG,KAAK,GAAG,EAAO,QAArC,SAAA,CACG,EAAM,SAAW,GAAI,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAG,MAAO,SAAA,sCAAuC,CAAA,EAAI,KACxF,EAAM,IAAK,IAAS,EAAA,EAAA,IAAA,CAAC,EAAD,CAA+B,MAAO,EAAtB,EAAK,EAAiB,CAAC,EAC3D,GACC,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,MAAM,gBACN,QAAS,IAAM,EAAQ,iBACvB,UAAW,IAAI,EAAQ,aAAa,QAAQ,CAAC,EAAE,OAC/C,KAAM,GAAG,EAAQ,QAAQ,aAAa,EAAQ,cAAc,OAC7D,CAAA,EACC,EAAM,MAAQ,CAAC,EAAM,KAAK,UAAY,KAAO,EAAM,SAAW,WAChE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAO,MAAM,gBAAgB,QAAS,KAAM,UAAU,GAAK,CAAA,EACzD,IACD,GAEA,CAAA,CAEb"}
@@ -1,2 +0,0 @@
1
- import{n as e,s as t,u as n}from"./index-BbDqdepe.js";var r=n(t(),1),i={field:`_field_ki2n9_1`,label:`_label_ki2n9_8`,shell:`_shell_ki2n9_15`,sm:`_sm_ki2n9_29`,input:`_input_ki2n9_33`,invalid:`_invalid_ki2n9_50`,mono:`_mono_ki2n9_80`,prefix:`_prefix_ki2n9_85`,hint:`_hint_ki2n9_91`,error:`_error_ki2n9_97`},a=e();function o({label:e,hint:t,error:n,size:o=`md`,mono:s=!1,prefix:c,className:l,id:u,...d}){let f=(0,r.useId)(),p=u??f,m=`${p}-hint`,h=`${p}-error`,g=[d[`aria-describedby`],t?m:null,n?h:null].filter(Boolean).join(` `);return(0,a.jsxs)(`div`,{className:`${i.field} ${l??``}`,children:[e?(0,a.jsx)(`label`,{className:i.label,htmlFor:p,children:e}):null,(0,a.jsxs)(`div`,{className:`${i.shell} ${i[o]} ${n?i.invalid:``}`,children:[c?(0,a.jsx)(`span`,{className:i.prefix,children:c}):null,(0,a.jsx)(`input`,{...d,id:p,className:`${i.input} ${s?i.mono:``}`,"aria-invalid":n?!0:d[`aria-invalid`],"aria-describedby":g||void 0})]}),t?(0,a.jsx)(`p`,{id:m,className:i.hint,children:t}):null,n?(0,a.jsx)(`p`,{id:h,className:i.error,role:`alert`,children:n}):null]})}export{o as t};
2
- //# sourceMappingURL=Input-BEF-ScuG.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"Input-BEF-ScuG.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/Input.module.css","../../../../../../src/web-ui/components/primitives/Input.tsx"],"sourcesContent":[".field {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.label {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n font-weight: var(--font-weight-medium);\n}\n\n.shell {\n display: flex;\n align-items: center;\n gap: var(--space-1);\n height: var(--density-row);\n padding: 0 var(--space-2);\n background: var(--bg-input);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-sm);\n transition:\n border-color var(--duration-fast) var(--ease-standard),\n box-shadow var(--duration-fast) var(--ease-standard);\n}\n\n.sm {\n height: var(--density-row-sm);\n}\n\n.shell:hover:not(:has(.input:disabled)) {\n border-color: var(--border-strong);\n}\n\n/* The field's own focus ring: the inner <input> has no visible outline, so\n the shell carries it (and :focus-visible keeps it keyboard-only). */\n/* The system ring, not an --accent-100 wash: that token is pinned at 92%\n lightness in light and 22% in dark (tokens.css), so hue and saturation\n follow the operator's accent but LIGHTNESS never does — every preset and\n every slider position produced the same 1.34:1 / 1.15:1 near-invisible\n ring. --shadow-focus-ring is already the 2px-gap + 2px-accent shape\n DESIGN-V2 §6 asks for, and --border-focus is contrast-tested. */\n.shell:has(.input:focus-visible) {\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n\n.invalid {\n border-color: var(--status-danger-solid);\n}\n\n.input {\n flex: 1;\n min-width: 0;\n height: 100%;\n border: none;\n background: none;\n color: var(--text-primary);\n font-family: var(--font-ui);\n font-size: var(--text-sm-size);\n}\n\n.input:focus,\n.input:focus-visible {\n outline: none;\n box-shadow: none;\n}\n\n.input::placeholder {\n color: var(--text-tertiary);\n}\n\n.input:disabled {\n color: var(--text-disabled);\n cursor: not-allowed;\n}\n\n.mono {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n\n.prefix {\n color: var(--text-tertiary);\n font-size: var(--text-xs-size);\n white-space: nowrap;\n}\n\n.hint {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.error {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--status-danger-fg);\n}\n","/**\n * components/primitives/Input.tsx — single-line text/number entry.\n *\n * Nothing here is a default browser control: hairline border, no inner card,\n * accent on focus. The accessible name comes from `label` when the field\n * stands alone, or from the caller's own `aria-label`/`aria-labelledby` when\n * it sits in a two-column settings row whose label lives on the other side.\n * An `error` is announced via role=\"alert\" and wired with aria-describedby —\n * red text alone never carries the message (design doc §6).\n */\nimport { useId, type InputHTMLAttributes, type ReactNode } from 'react';\nimport styles from './Input.module.css';\n\nexport interface InputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'size' | 'className' | 'prefix'> {\n label?: ReactNode;\n /** Quiet helper text under the field. */\n hint?: ReactNode;\n /** Error message; also flips the field into its invalid styling. */\n error?: ReactNode;\n size?: 'sm' | 'md';\n /** Paths, ids, tokens counts — anything that should not be kerned. */\n mono?: boolean;\n /** Non-interactive leading text (e.g. \"$\", \"http://\"). Shadows the rarely\n * used HTML `prefix` attribute on purpose — this is the useful meaning. */\n prefix?: ReactNode;\n className?: string;\n}\n\nexport function Input({\n label,\n hint,\n error,\n size = 'md',\n mono = false,\n prefix,\n className,\n id,\n ...rest\n}: InputProps) {\n const generatedId = useId();\n const inputId = id ?? generatedId;\n const hintId = `${inputId}-hint`;\n const errorId = `${inputId}-error`;\n const describedBy = [rest['aria-describedby'], hint ? hintId : null, error ? errorId : null]\n .filter(Boolean)\n .join(' ');\n\n return (\n <div className={`${styles.field} ${className ?? ''}`}>\n {label ? (\n <label className={styles.label} htmlFor={inputId}>\n {label}\n </label>\n ) : null}\n <div className={`${styles.shell} ${styles[size]} ${error ? styles.invalid : ''}`}>\n {prefix ? <span className={styles.prefix}>{prefix}</span> : null}\n <input\n {...rest}\n id={inputId}\n className={`${styles.input} ${mono ? styles.mono : ''}`}\n aria-invalid={error ? true : rest['aria-invalid']}\n aria-describedby={describedBy || undefined}\n />\n </div>\n {hint ? (\n <p id={hintId} className={styles.hint}>\n {hint}\n </p>\n ) : null}\n {error ? (\n <p id={errorId} className={styles.error} role=\"alert\">\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n"],"mappings":"yTC4BA,SAAgB,EAAM,CACpB,QACA,OACA,QACA,OAAO,KACP,OAAO,GACP,SACA,YACA,KACA,GAAG,GACU,CACb,IAAM,GAAA,EAAc,EAAA,MAAA,CAAM,EACpB,EAAU,GAAM,EAChB,EAAS,GAAG,EAAQ,OACpB,EAAU,GAAG,EAAQ,QACrB,EAAc,CAAC,EAAK,oBAAqB,EAAO,EAAS,KAAM,EAAQ,EAAU,IAAI,CAAC,CACzF,OAAO,OAAO,CAAC,CACf,KAAK,GAAG,EAEX,OACE,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,MAAM,GAAG,GAAa,KAAhD,SAAA,CACG,GACC,EAAA,EAAA,IAAA,CAAC,QAAD,CAAO,UAAW,EAAO,MAAO,QAAS,EACtC,SAAA,CACI,CAAA,EACL,MACJ,EAAA,EAAA,KAAA,CAAC,MAAD,CAAK,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,GAAM,GAAG,EAAQ,EAAO,QAAU,KAA5E,SAAA,CACG,GAAS,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,OAAS,SAAA,CAAa,CAAA,EAAI,MAC5D,EAAA,EAAA,IAAA,CAAC,QAAD,CACE,GAAI,EACJ,GAAI,EACJ,UAAW,GAAG,EAAO,MAAM,GAAG,EAAO,EAAO,KAAO,KACnD,eAAc,EAAQ,GAAO,EAAK,gBAClC,mBAAkB,GAAe,IAAA,EAClC,CAAA,CACE,IACJ,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,GAAI,EAAQ,UAAW,EAAO,KAC9B,SAAA,CACA,CAAA,EACD,KACH,GACC,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,GAAI,EAAS,UAAW,EAAO,MAAO,KAAK,QAC3C,SAAA,CACA,CAAA,EACD,IACD,GAET"}
@@ -1,9 +0,0 @@
1
- import{n as e,s as t,u as n}from"./index-BbDqdepe.js";import{t as r}from"./Dialog-BYIKNPcH.js";import{i}from"./SkipToContent-C7UObcP2.js";import{b as a}from"./verse-model-CkF3q2IH.js";import{t as o}from"./Button-DP2ImS5n.js";import{t as s}from"./EmptyState-BEXDoNZd.js";import{t as c}from"./TerminalPane-BCjlhc3t.js";var l=n(t(),1),u=e(),d=`{
2
- "version": 1,
3
- "configurations": [
4
- { "name": "Dev",
5
- "tabs": [
6
- { "split": "right", "panes": [ { "cwd": "web", "command": "npm run dev" },
7
- { "command": "npm test -- --watch" } ] },
8
- { "panes": [ { "agent": "claude-code" } ] } ] } ] }`;function f({load:e,onLaunch:t,onClose:n}){let f=(0,l.useId)(),[p,m]=(0,l.useState)(null),[h,g]=(0,l.useState)(null),[_,v]=(0,l.useState)(null);(0,l.useEffect)(()=>{let t=!1;return e().then(e=>{t||m(e)},e=>{t||g(e instanceof Error?e.message:`The launch configurations could not be read.`)}),()=>{t=!0}},[e]);let y=async e=>{v(`${e.root}\u0000${e.name}`);try{await t(e),n()}catch(e){g(e instanceof Error?e.message:`That configuration could not be launched.`)}finally{v(null)}};return(0,u.jsxs)(r,{open:!0,onClose:n,titleId:f,title:`Launch a terminal layout`,description:`From .ashlr/verse/launch.json in this chat’s folders. Each layout opens its tabs and types the commands shown — only when you launch it.`,children:[h?(0,u.jsx)(`p`,{className:c.launchError,role:`alert`,children:h}):null,p===null&&!h?(0,u.jsxs)(`div`,{role:`status`,"aria-label":`Loading`,children:[(0,u.jsx)(i,{width:`60%`}),(0,u.jsx)(i,{width:`40%`})]}):null,p&&p.errors.map(e=>(0,u.jsxs)(`p`,{className:c.launchError,role:`alert`,children:[a(e.root),`: `,e.error]},e.root)),p&&p.configs.length===0?(0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)(s,{compact:!0,title:`No launch configurations`,body:(0,u.jsxs)(u.Fragment,{children:[`Add `,(0,u.jsx)(`code`,{children:`.ashlr/verse/launch.json`}),` to a project, for example:`]})}),(0,u.jsx)(`pre`,{className:c.launchPanes,children:d})]}):null,p&&p.configs.length>0?(0,u.jsx)(`ul`,{className:c.launchList,"aria-label":`Launch configurations`,children:p.configs.map(e=>{let t=`${e.root}\u0000${e.name}`;return(0,u.jsxs)(`li`,{className:c.launchItem,children:[(0,u.jsxs)(`div`,{className:c.launchHead,children:[(0,u.jsx)(`span`,{className:c.launchName,children:e.name}),(0,u.jsx)(`span`,{className:c.barLabel,children:a(e.root)}),(0,u.jsx)(o,{size:`sm`,variant:`subtle`,busy:_===t,disabled:_!==null&&_!==t,"aria-label":`Launch ${e.name}`,onClick:()=>void y(e),children:`Launch`})]}),(0,u.jsx)(`ol`,{className:c.launchPanes,children:e.tabs.map((e,t)=>(0,u.jsxs)(`li`,{children:[`Tab `,t+1,e.panes.length>1?` (split ${e.split})`:``,`:`,` `,e.panes.map((e,t)=>(0,u.jsxs)(`span`,{children:[t>0?` · `:``,e.cwd?(0,u.jsxs)(u.Fragment,{children:[`in `,(0,u.jsx)(`code`,{children:e.cwd}),` `]}):null,e.agent?(0,u.jsxs)(u.Fragment,{children:[`start `,(0,u.jsx)(`code`,{children:e.agent})]}):e.command?(0,u.jsxs)(u.Fragment,{children:[`run `,(0,u.jsx)(`code`,{children:e.command})]}):`a shell`]},t))]},t))})]},t)})}):null]})}export{f as LaunchDialog};
9
- //# sourceMappingURL=LaunchDialog-CERI717u.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LaunchDialog-CERI717u.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/terminal/LaunchDialog.tsx"],"sourcesContent":["/**\n * terminal/LaunchDialog.tsx — launch configurations (3.15): the layouts a\n * repo's `.ashlr/verse/launch.json` names (a dev server + a test watcher +\n * Claude Code, say), each shown with EXACTLY what it would type, launched one\n * at a time by name. Opening this dialog types nothing; only [Launch] does,\n * and the commands come from the file on the server, never from this page.\n *\n * Loaded lazily (TerminalPanel), in its own small chunk.\n */\nimport { useEffect, useId, useState } from 'react';\nimport type { VerseTerminalLaunchConfig, VerseTerminalLaunchListResponse } from '../../../data/api-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Dialog } from '../../../components/primitives/Dialog.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { projectName } from '../verse-model.js';\nimport extra from './TerminalExtras.module.css';\n\nexport interface LaunchDialogProps {\n load: () => Promise<VerseTerminalLaunchListResponse>;\n onLaunch: (config: VerseTerminalLaunchConfig) => Promise<void>;\n onClose: () => void;\n}\n\nconst EXAMPLE = `{\n \"version\": 1,\n \"configurations\": [\n { \"name\": \"Dev\",\n \"tabs\": [\n { \"split\": \"right\", \"panes\": [ { \"cwd\": \"web\", \"command\": \"npm run dev\" },\n { \"command\": \"npm test -- --watch\" } ] },\n { \"panes\": [ { \"agent\": \"claude-code\" } ] } ] } ] }`;\n\nexport function LaunchDialog({ load, onLaunch, onClose }: LaunchDialogProps) {\n const titleId = useId();\n const [list, setList] = useState<VerseTerminalLaunchListResponse | null>(null);\n const [error, setError] = useState<string | null>(null);\n const [busy, setBusy] = useState<string | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n load().then(\n (res) => { if (!cancelled) setList(res); },\n (err: unknown) => { if (!cancelled) setError(err instanceof Error ? err.message : 'The launch configurations could not be read.'); },\n );\n return () => { cancelled = true; };\n }, [load]);\n\n const launch = async (config: VerseTerminalLaunchConfig) => {\n setBusy(`${config.root}\\u0000${config.name}`);\n try {\n await onLaunch(config);\n onClose();\n } catch (err) {\n setError(err instanceof Error ? err.message : 'That configuration could not be launched.');\n } finally {\n setBusy(null);\n }\n };\n\n return (\n <Dialog open onClose={onClose} titleId={titleId} title=\"Launch a terminal layout\"\n description=\"From .ashlr/verse/launch.json in this chat’s folders. Each layout opens its tabs and types the commands shown — only when you launch it.\">\n {error ? <p className={extra.launchError} role=\"alert\">{error}</p> : null}\n {list === null && !error ? <div role=\"status\" aria-label=\"Loading\"><SkeletonLine width=\"60%\" /><SkeletonLine width=\"40%\" /></div> : null}\n {list && list.errors.map((e) => (\n <p key={e.root} className={extra.launchError} role=\"alert\">{projectName(e.root)}: {e.error}</p>\n ))}\n {list && list.configs.length === 0 ? (\n <>\n <EmptyState compact title=\"No launch configurations\" body={<>Add <code>.ashlr/verse/launch.json</code> to a project, for example:</>} />\n <pre className={extra.launchPanes}>{EXAMPLE}</pre>\n </>\n ) : null}\n {list && list.configs.length > 0 ? (\n <ul className={extra.launchList} aria-label=\"Launch configurations\">\n {list.configs.map((config) => {\n const key = `${config.root}\\u0000${config.name}`;\n return (\n <li key={key} className={extra.launchItem}>\n <div className={extra.launchHead}>\n <span className={extra.launchName}>{config.name}</span>\n <span className={extra.barLabel}>{projectName(config.root)}</span>\n <Button size=\"sm\" variant=\"subtle\" busy={busy === key} disabled={busy !== null && busy !== key}\n aria-label={`Launch ${config.name}`} onClick={() => void launch(config)}>Launch</Button>\n </div>\n <ol className={extra.launchPanes}>\n {config.tabs.map((tab, i) => (\n <li key={i}>\n Tab {i + 1}{tab.panes.length > 1 ? ` (split ${tab.split})` : ''}:{' '}\n {tab.panes.map((pane, j) => (\n <span key={j}>\n {j > 0 ? ' · ' : ''}\n {pane.cwd ? <>in <code>{pane.cwd}</code> </> : null}\n {pane.agent ? <>start <code>{pane.agent}</code></> : pane.command ? <>run <code>{pane.command}</code></> : 'a shell'}\n </span>\n ))}\n </li>\n ))}\n </ol>\n </li>\n );\n })}\n </ul>\n ) : null}\n </Dialog>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{n as e}from"./index-BbDqdepe.js";import{l as t,u as n}from"./global-BWc2NPzv.js";import{M as r}from"./VerseShared-_pMXKs8m.js";import{n as i,u as a}from"./format-CcEKjUou.js";import{t as o}from"./Button-DP2ImS5n.js";import{p as s}from"./surface-data-DoN8peNV.js";import{n as c,t as l}from"./nav-CM-mJcSq.js";import{i as u,n as d,t as f}from"./Surface-CV-NXGIM.js";import{r as p}from"./actions-CyO4R-IO.js";import{t as m}from"./use-ticker-PQ_oYxn5.js";import{g as h,l as g,o as _,r as v,v as y}from"./thread-data-Dq7QugaD.js";import{i as b}from"./leader-focus-azN19kfO.js";import{a as x,c as S,i as C,n as w,o as T,r as E,u as D}from"./leader-model-CYyfrzNf.js";var O={line:`_line_4stg3_5`,preview:`_preview_4stg3_14`,meta:`_meta_4stg3_22`,text:`_text_4stg3_28`,ask:`_ask_4stg3_37`,askText:`_askText_4stg3_66`,where:`_where_4stg3_72`},k=e(),A=3e4;function j(){let e=t(_,{freshMs:15e3}),i=n(_);r(i,A);let o=h(e.data?.value?.messages??[]);return(0,k.jsxs)(`div`,{className:O.line,children:[o?(0,k.jsxs)(`p`,{className:O.preview,"aria-label":`The Leader's latest message`,children:[(0,k.jsxs)(`span`,{className:O.meta,children:[`Leader · `,g[o.channel],` · `,a(o.at)]}),(0,k.jsx)(`span`,{className:O.text,title:o.text,children:y(o.text)})]}):null,(0,k.jsxs)(`button`,{type:`button`,className:O.ask,onClick:()=>b({kind:`composer`}),children:[(0,k.jsx)(`span`,{className:O.askText,children:`Message the Leader…`}),(0,k.jsx)(`span`,{className:O.where,"aria-hidden":`true`,children:`opens Mind`})]})]})}var M=8,N=2*Math.PI*M;function P({action:e}){let t=m(1e3),n=D(e,t);if(n===null)return null;let r=E(e.applyAfter,t);return(0,k.jsxs)(`span`,{className:p.ring,role:`timer`,"aria-label":`Applies in ${r} unless vetoed`,children:[(0,k.jsxs)(`svg`,{width:20,height:20,viewBox:`0 0 20 20`,"aria-hidden":`true`,children:[(0,k.jsx)(`circle`,{cx:10,cy:10,r:M,className:p.ringTrack}),(0,k.jsx)(`circle`,{"data-role":`remaining`,cx:10,cy:10,r:M,className:p.ringFill,strokeDasharray:`${(N*n).toFixed(2)} ${N.toFixed(2)}`,transform:`rotate(-90 10 10)`})]}),(0,k.jsx)(`span`,{className:p.ringText,children:r})]})}function F(e){return{title:`Veto this action?`,body:e.status===`scheduled`?`“${e.summary}” will not apply. The Leader records the veto and learns from it.`:`“${e.summary}” is undone exactly as it was applied. The Leader records the veto and learns from it.`,confirmLabel:`Veto`,destructive:!0}}function I(e){return{title:`Approve this action?`,body:e.status===`scheduled`?`“${e.summary}” applies now instead of waiting out its veto window. You can still veto it afterwards.`:`“${e.summary}” is outside the standing grant. Approving tells the Leader to go ahead; the server still checks it against your authority.`,confirmLabel:`Approve`}}function L({action:e,actions:t,compact:n=!1,approve:r=!1,dryRun:i=!1,anchored:a=!0}){let c=!i&&T(e),u=r&&!i&&x(e);return(0,k.jsxs)(`li`,{className:p.actionRow,"data-status":e.status,id:a?l(`action-${e.id}`):void 0,children:[(0,k.jsx)(`span`,{className:p.classBadge,"data-class":e.class,title:`Class ${e.class}`,children:e.class}),(0,k.jsxs)(`span`,{className:p.actionText,children:[(0,k.jsx)(`span`,{className:p.actionSummary,children:e.summary}),n?null:(0,k.jsx)(`span`,{className:p.actionWhy,children:e.why})]}),(0,k.jsxs)(`span`,{className:p.actionState,children:[i?(0,k.jsx)(`span`,{className:p.statusWord,"data-status":`dry-run`,children:`Dry run`}):e.status===`scheduled`?(0,k.jsx)(P,{action:e}):(0,k.jsx)(`span`,{className:p.statusWord,"data-status":e.status,children:w[e.status]}),u?(0,k.jsx)(o,{size:`sm`,variant:`subtle`,disabled:t.busy||t.readOnly,"aria-label":`Approve: ${e.summary}`,onClick:()=>t.act(()=>v(e.id),`Approve “${e.summary}”`,{confirm:I(e)}),children:`Approve`}):null,c?(0,k.jsx)(o,{size:`sm`,variant:`ghost`,className:p.vetoChip,disabled:t.busy||t.readOnly,"aria-label":`Veto: ${e.summary}`,onClick:()=>t.act(()=>s({action:`veto`,actionId:e.id}),`Veto “${e.summary}”`,{confirm:F(e)}),children:`Veto`}):null]})]})}function R({read:e,loading:t,actions:n}){let r=e?.value??null,o=r?.latest??null,l=S(r),m=C(o?.move?.expectedDelta??null),h=l.some(T);return(0,k.jsxs)(f,{title:`Leader`,caption:o?`Memo ${a(o.at)}${o.seatId?` · ${o.seatId}`:``}${r?.nextRunAt?` · next run ${new Date(r.nextRunAt).toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`})}`:``}`:void 0,actions:(0,k.jsxs)(k.Fragment,{children:[o?.dryRun?(0,k.jsx)(`span`,{className:p.dryRun,children:`Dry run`}):null,(0,k.jsxs)(`button`,{type:`button`,className:p.linkButton,onClick:()=>c(`mind`,null),"aria-keyshortcuts":`Meta+4`,children:[`Open Mind `,(0,k.jsx)(`kbd`,{className:p.kbd,children:`⌘4`})]})]}),children:[t&&!e?(0,k.jsx)(`p`,{className:p.muted,"aria-busy":`true`,children:`Reading the Leader…`}):r?o?(0,k.jsxs)(k.Fragment,{children:[(0,k.jsxs)(`dl`,{className:p.memo,children:[(0,k.jsxs)(`div`,{className:p.memoRow,children:[(0,k.jsx)(`dt`,{children:(0,k.jsx)(u,{children:`Bottleneck`})}),(0,k.jsx)(`dd`,{className:p.memoText,children:o.bottleneck?.statement??`—`})]}),(0,k.jsxs)(`div`,{className:p.memoRow,children:[(0,k.jsx)(`dt`,{children:(0,k.jsx)(u,{children:`The move`})}),(0,k.jsxs)(`dd`,{className:p.memoText,children:[o.move?.statement??`—`,m?(0,k.jsx)(`span`,{className:p.delta,children:m}):null]})]})]}),l.length?(0,k.jsx)(`ul`,{className:p.actionList,"aria-label":`Leader actions`,children:l.map(e=>(0,k.jsx)(L,{action:e,actions:n},e.id))}):null,o.dryRun?(0,k.jsx)(`p`,{className:p.muted,children:`Shadow stage: these actions are shown, never applied.`}):null,h&&!o.dryRun?(0,k.jsx)(`button`,{type:`button`,className:p.moreLink,disabled:n.busy||n.readOnly,onClick:()=>n.act(()=>s({action:`veto-memo`,memoId:o.id}),`Veto the whole memo`,{confirm:{title:`Veto the whole memo?`,body:`Every applied action is undone exactly and every scheduled one is cancelled. The Leader records the veto.`,confirmLabel:`Veto memo`,destructive:!0}}),children:`Veto the whole memo`}):null]}):(0,k.jsxs)(d,{children:[i(`No memo yet${r.lastRun?` — last run ${a(r.lastRun.at)}: ${r.lastRun.reason??r.lastRun.outcome}`:``}`),r.nextRunAt?` Next run ${new Date(r.nextRunAt).toLocaleString(`en-US`,{weekday:`short`,hour:`numeric`,minute:`2-digit`})}.`:``]}):(0,k.jsx)(d,{tone:`unknown`,children:e?.reason??`The Leader did not answer.`}),(0,k.jsx)(j,{})]})}export{R as n,L as t};
2
- //# sourceMappingURL=LeaderCard-3P95vgVU.js.map