@ashlr/hub 3.22.0 → 3.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (929) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +5 -5
  3. package/dist/authority-surface.json +16 -11
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/verify-safety-sources.d.ts +4 -0
  6. package/dist/cli/verify-safety-sources.js +41 -0
  7. package/dist/cli/verify-safety-sources.js.map +1 -0
  8. package/dist/cli/verify-safety.js +16 -1
  9. package/dist/cli/verify-safety.js.map +1 -1
  10. package/dist/core/decide/needs-you.d.ts +3 -1
  11. package/dist/core/decide/needs-you.js +52 -28
  12. package/dist/core/decide/needs-you.js.map +1 -1
  13. package/dist/core/fleet/fleet-control-model.d.ts +2 -1
  14. package/dist/core/fleet/fleet-control-model.js +5 -0
  15. package/dist/core/fleet/fleet-control-model.js.map +1 -1
  16. package/dist/core/fleet/fleet-control-types.d.ts +11 -1
  17. package/dist/core/fleet/fleet-control.d.ts +4 -0
  18. package/dist/core/fleet/fleet-control.js +23 -1
  19. package/dist/core/fleet/fleet-control.js.map +1 -1
  20. package/dist/core/fleet/quota.js +1 -1
  21. package/dist/core/fleet/quota.js.map +1 -1
  22. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  23. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
  24. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
  25. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
  26. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
  27. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
  28. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
  29. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
  30. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
  31. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
  32. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
  33. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
  34. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
  35. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
  36. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
  37. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
  38. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
  39. package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
  40. package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
  41. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
  42. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
  43. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
  44. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
  45. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
  46. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
  47. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
  48. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
  49. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
  50. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
  51. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
  52. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
  53. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
  54. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
  55. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
  56. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
  57. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
  58. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
  59. package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
  60. package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
  61. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
  62. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
  63. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
  64. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
  65. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
  66. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
  67. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
  68. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
  69. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
  70. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
  71. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
  72. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
  73. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
  74. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
  75. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
  76. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
  77. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
  78. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
  79. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
  80. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
  81. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
  82. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
  83. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
  84. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
  85. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
  86. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
  87. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
  88. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
  89. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
  90. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
  91. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
  92. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
  93. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
  94. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
  95. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
  96. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
  97. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
  98. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
  99. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
  100. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
  101. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
  102. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
  103. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
  104. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
  105. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
  106. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
  107. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
  108. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
  109. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
  110. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
  111. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
  112. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
  113. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
  114. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
  115. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
  116. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
  117. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
  118. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
  119. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
  120. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
  121. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
  122. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
  123. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
  124. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
  125. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
  126. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
  127. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
  128. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
  129. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
  130. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
  131. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
  132. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
  133. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
  134. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
  135. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
  136. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
  137. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
  138. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
  139. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
  140. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
  141. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
  142. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
  143. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
  144. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
  145. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
  146. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
  147. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
  148. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
  149. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
  150. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
  151. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
  152. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
  153. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
  154. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
  155. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
  156. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
  157. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
  158. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
  159. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
  160. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
  161. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
  162. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
  163. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
  164. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
  165. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
  166. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
  167. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
  168. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
  169. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
  170. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
  171. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
  172. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
  173. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
  174. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
  175. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
  176. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
  177. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
  178. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
  179. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
  180. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
  181. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
  182. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
  183. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
  184. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
  185. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
  186. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
  187. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
  188. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
  189. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
  190. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
  191. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
  192. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
  193. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
  194. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
  195. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
  196. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
  197. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
  198. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
  199. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
  200. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
  201. package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
  202. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
  203. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
  204. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
  205. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
  206. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
  207. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
  208. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
  209. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
  210. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
  211. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
  212. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
  213. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
  214. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
  215. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
  216. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
  217. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
  218. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
  219. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
  220. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
  221. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
  222. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
  223. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
  224. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
  225. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
  226. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
  227. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
  228. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
  229. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
  230. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
  231. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
  232. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
  233. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
  234. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
  235. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
  236. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
  237. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
  238. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
  239. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
  241. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
  242. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
  243. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
  244. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
  245. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
  246. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
  247. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
  248. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
  249. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
  250. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
  251. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
  252. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
  253. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
  254. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
  255. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
  256. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
  257. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
  258. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
  259. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
  260. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
  261. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
  262. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
  263. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
  264. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
  265. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
  266. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
  267. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
  268. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
  269. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
  270. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
  271. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
  272. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
  273. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
  274. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
  275. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
  276. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
  277. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
  278. package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
  279. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
  280. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
  281. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
  282. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
  283. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
  284. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
  285. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
  286. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
  287. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
  288. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
  289. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
  290. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
  291. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
  292. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
  293. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
  294. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
  295. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
  296. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
  297. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
  298. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
  299. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
  300. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
  301. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
  302. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
  303. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
  304. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
  305. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
  306. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
  307. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
  308. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
  309. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
  310. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
  311. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
  312. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
  313. package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
  314. package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
  315. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
  316. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
  317. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
  318. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
  319. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
  320. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
  321. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
  322. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
  323. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
  324. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
  325. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
  326. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
  327. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
  328. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
  329. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
  330. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
  331. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
  332. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
  333. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
  334. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
  335. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
  336. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
  337. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
  338. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
  339. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
  340. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
  341. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
  342. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
  343. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
  344. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
  345. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
  346. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
  347. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
  348. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
  349. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
  350. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
  351. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
  352. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
  353. package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
  354. package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
  355. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
  356. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
  357. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
  358. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
  359. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
  360. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
  361. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
  362. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
  363. package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
  364. package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
  365. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
  366. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
  367. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
  368. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
  369. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
  370. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
  371. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
  372. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
  373. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
  374. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
  375. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
  376. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
  377. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
  378. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
  379. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
  380. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
  381. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
  382. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
  383. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
  384. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
  385. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
  386. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
  387. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
  388. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
  389. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
  390. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
  391. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
  392. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
  393. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
  394. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
  395. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
  396. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
  397. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
  398. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
  399. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
  400. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
  401. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
  402. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
  403. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
  404. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
  405. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
  406. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
  407. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
  408. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
  409. package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
  410. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
  411. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
  412. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
  413. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
  414. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
  415. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
  416. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
  417. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
  418. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
  419. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
  420. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
  421. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
  422. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
  423. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
  424. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
  425. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
  426. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
  427. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
  428. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
  429. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
  430. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
  431. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
  432. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
  433. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
  434. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
  435. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
  436. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
  437. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
  438. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
  439. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
  440. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
  441. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
  442. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
  443. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
  444. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
  445. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
  446. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
  447. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
  448. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
  449. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
  450. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
  451. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
  452. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
  453. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
  454. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
  455. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
  456. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
  457. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
  458. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
  459. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
  460. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
  461. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
  462. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
  463. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
  464. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
  465. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
  466. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
  467. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
  468. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
  469. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
  470. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
  471. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
  472. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
  473. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
  474. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
  475. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
  476. package/dist/core/web/public/next/index.html +1 -1
  477. package/dist/release-dependency-inventory.json +1 -1
  478. package/package.json +1 -1
  479. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
  480. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
  481. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
  482. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
  483. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
  484. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
  485. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
  486. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
  487. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
  488. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
  489. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
  490. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
  491. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
  492. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
  493. package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
  494. package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
  495. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
  496. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
  497. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
  498. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
  499. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
  500. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
  501. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
  502. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
  503. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
  504. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
  505. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
  506. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
  507. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
  508. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
  509. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
  510. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
  511. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
  512. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
  513. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
  514. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
  515. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
  516. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
  517. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
  518. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
  519. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
  520. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
  521. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
  522. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
  523. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
  524. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
  525. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
  526. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
  527. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
  528. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
  529. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
  530. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
  531. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
  532. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
  533. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
  534. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
  535. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
  536. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
  537. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
  538. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
  539. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
  540. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
  541. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
  542. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
  543. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
  544. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
  545. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
  546. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
  547. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
  548. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
  549. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
  550. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
  551. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
  552. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
  553. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
  554. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
  555. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
  556. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
  557. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
  558. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
  559. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
  560. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
  561. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
  562. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
  563. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
  564. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
  565. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
  566. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
  567. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
  568. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
  569. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
  570. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
  571. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
  572. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
  573. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
  574. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
  575. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
  576. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
  577. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
  578. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
  579. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
  580. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
  581. package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
  582. package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
  583. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
  584. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
  585. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
  586. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
  587. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
  588. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
  589. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
  590. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
  591. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
  592. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
  593. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
  594. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
  595. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
  596. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
  597. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
  598. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
  599. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
  600. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
  601. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
  602. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
  603. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
  604. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
  605. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
  606. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
  607. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
  608. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
  609. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
  610. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
  611. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
  612. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
  613. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
  614. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
  615. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
  616. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
  617. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
  618. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
  619. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
  620. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
  621. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
  622. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
  623. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
  624. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
  625. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
  626. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
  627. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
  628. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
  629. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
  630. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
  631. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
  632. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
  633. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
  634. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
  635. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
  636. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
  637. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
  638. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
  639. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
  640. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
  641. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
  642. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
  643. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
  644. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
  645. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
  646. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
  647. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
  648. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
  649. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
  650. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
  651. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
  652. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
  653. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
  654. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
  655. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
  656. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
  657. package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
  658. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
  659. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
  660. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
  661. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
  662. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
  663. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
  664. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
  665. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
  666. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
  667. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
  668. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
  669. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
  670. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
  671. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
  672. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
  673. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
  674. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
  675. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
  676. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
  677. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
  678. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
  679. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
  680. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
  681. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
  682. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
  683. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
  684. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
  685. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
  686. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
  687. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
  688. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
  689. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
  690. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
  691. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
  692. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
  693. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
  694. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
  695. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
  696. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
  697. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
  698. package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
  699. package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
  700. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
  701. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
  702. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
  703. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
  704. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
  705. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
  706. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
  707. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
  708. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
  709. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
  710. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
  711. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
  712. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
  713. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
  714. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
  715. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
  716. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
  717. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
  718. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
  719. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
  720. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
  721. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
  722. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
  723. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
  724. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
  725. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
  726. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
  727. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
  728. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
  729. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
  730. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
  731. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
  732. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
  733. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
  734. package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
  735. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
  736. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
  737. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
  738. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
  739. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
  740. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
  741. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
  742. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
  743. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
  744. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
  745. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
  746. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
  747. package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
  748. package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
  749. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
  750. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
  751. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
  752. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
  753. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
  754. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
  755. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
  756. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
  757. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
  758. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
  759. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
  760. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
  761. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
  762. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
  763. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
  764. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
  765. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
  766. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
  767. package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
  768. package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
  769. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
  770. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
  771. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
  772. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
  773. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
  774. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
  775. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
  776. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
  777. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
  778. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
  779. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
  780. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
  781. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
  782. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
  783. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
  784. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
  785. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
  786. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
  787. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
  788. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
  789. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
  790. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
  791. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
  792. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
  793. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
  794. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
  795. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
  796. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
  797. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
  798. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
  799. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
  800. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
  801. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
  802. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
  803. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
  804. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
  805. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
  806. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
  807. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
  808. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
  809. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
  810. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
  811. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
  812. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
  813. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
  814. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
  815. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
  816. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
  817. package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
  818. package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
  819. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
  820. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
  821. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
  822. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
  823. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
  824. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
  825. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
  826. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
  827. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
  828. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
  829. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
  830. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
  831. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
  832. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
  833. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
  834. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
  835. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
  836. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
  837. package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
  838. package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
  839. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
  840. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
  841. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
  842. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
  843. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
  844. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
  845. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
  846. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
  847. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
  848. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
  849. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
  850. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
  851. package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
  852. package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
  853. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
  854. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
  855. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
  856. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
  857. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
  858. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
  859. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
  860. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
  861. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
  862. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
  863. package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
  864. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
  865. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
  866. package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
  867. package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
  868. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
  869. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
  870. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
  871. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
  872. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
  873. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
  874. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
  875. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
  876. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
  877. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
  878. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
  879. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
  880. package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
  881. package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
  882. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
  883. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
  884. package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
  885. package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
  886. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
  887. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
  888. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
  889. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
  890. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
  891. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
  892. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
  893. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
  894. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
  895. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
  896. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
  897. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
  898. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
  899. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
  900. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
  901. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
  902. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
  903. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
  904. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
  905. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
  906. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
  907. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
  908. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
  909. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
  910. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
  911. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
  912. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
  913. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
  914. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
  915. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
  916. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
  917. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
  918. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
  919. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
  920. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
  921. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
  922. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
  923. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
  924. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
  925. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
  926. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
  927. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
  928. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
  929. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutomationsSection-BITmxjuB.js","names":[],"sources":["../../../../../../src/core/automations/types.ts","../../../../../../src/web-ui/routes/verse/automations/automations-model.ts","../../../../../../src/web-ui/routes/verse/automations/automations-queries.ts","../../../../../../src/web-ui/routes/verse/automations/Automations.module.css","../../../../../../src/web-ui/routes/verse/automations/AutomationsView.tsx","../../../../../../src/web-ui/routes/verse/sections/AutomationsSection.tsx"],"sourcesContent":["/**\n * Automations (3.15) — work that arrives on its own.\n *\n * An automation is a standing instruction: WHEN a trigger fires (a labelled\n * GitHub issue, a red default branch, a schedule, a local webhook, a Telegram\n * `/task`), route ONE task to ONE lane (fleet queue, Claude cloud session,\n * Devin session, or a review item in Needs-you) through that lane's EXISTING\n * entry point. Nothing here decides what the fleet may do: the standing grant,\n * KILL/Stop, the lane budgets and the merge gates all still apply, and a\n * firing that one of them refuses stays queued (or is recorded as refused) —\n * it never goes around them.\n *\n * Pure types + constants: no I/O, importable from the web UI.\n */\n\nexport const AUTOMATION_SCHEMA_VERSION = 1 as const;\nexport const AUTOMATION_STATE_SCHEMA_VERSION = 1 as const;\n\n/** Where a fired automation's task goes. */\nexport const AUTOMATION_LANES = ['fleet', 'cloud', 'devin', 'leader-review'] as const;\nexport type AutomationLane = (typeof AUTOMATION_LANES)[number];\n\nexport const AUTOMATION_TRIGGER_KINDS = ['github-issues', 'ci-red', 'schedule', 'webhook', 'telegram'] as const;\nexport type AutomationTriggerKind = (typeof AUTOMATION_TRIGGER_KINDS)[number];\n\n/** Issues (and optionally PRs) carrying ALL of `labels`, or matching a search `query`, on the automation's repos. */\nexport interface GithubIssuesTrigger {\n kind: 'github-issues';\n /** Every label must be present (GitHub's `labels=` semantics). Empty only when `query` is set. */\n labels: string[];\n /**\n * Optional GitHub search qualifiers (`is:issue is:open` and `repo:` are\n * added). With NO labels, only issues by the repo's owner, members or\n * collaborators fire — a label is endorsement, a query is not.\n */\n query: string | null;\n /** Also fire for pull requests carrying the labels (default false: issues only). */\n includePrs: boolean;\n /** Minutes between polls per repo (5–1440). */\n pollMinutes: number;\n}\n\n/** A failing check run on the head of the repo's default branch (or `branch`). */\nexport interface CiRedTrigger {\n kind: 'ci-red';\n /** null = the repo's default branch. */\n branch: string | null;\n pollMinutes: number;\n}\n\n/** An RFC 5545 RRULE subset (see rrule.ts), evaluated in local time. */\nexport interface ScheduleTrigger {\n kind: 'schedule';\n rrule: string;\n}\n\n/** POST /api/verse/automations/<id>/webhook on the local Verse server (loopback + mutation token). */\nexport interface WebhookTrigger {\n kind: 'webhook';\n}\n\n/** Telegram `/task <owner/repo> <text>` from the configured chat. */\nexport interface TelegramTrigger {\n kind: 'telegram';\n}\n\nexport type AutomationTrigger = GithubIssuesTrigger | CiRedTrigger | ScheduleTrigger | WebhookTrigger | TelegramTrigger;\n\n/** `repos: ['*']` = every repo in the standing grant (resolved at firing time). */\nexport const AUTOMATION_ALL_GRANT_REPOS = '*' as const;\n\nexport interface AutomationV1 {\n v: typeof AUTOMATION_SCHEMA_VERSION;\n /** `au_<slug>` — stable, url/branch safe. */\n id: string;\n name: string;\n enabled: boolean;\n trigger: AutomationTrigger;\n lane: AutomationLane;\n /**\n * A playbook (src/core/playbooks) every task runs under: `id` (latest) or\n * `id@vN` (pinned). Checked to exist on create/update; the lane resolves\n * and injects it (cloud/Devin explicitly, fleet via its `!macro`).\n */\n playbookId: string | null;\n /** owner/name list, or `['*']` for every repo in the standing grant. */\n repos: string[];\n /** The standing instruction put in front of every task this automation creates. */\n instructions: string;\n /** Firings in flight at once (dispatched and not yet settled, or awaiting review). */\n maxConcurrent: number;\n /** Firings dispatched per local calendar day. */\n maxPerDay: number;\n /** Firings allowed to wait in this automation's queue; more are dropped (and recorded). */\n queueDepth: number;\n /** Estimated USD this automation may spend per local calendar month (0 = only free lanes). */\n spendCapUsd: number;\n /**\n * Dedupe template: one task per rendered key, ever (within retention).\n * Placeholders: {repo} {number} {sha} {occurrence} {key}. null = the\n * trigger's default (issues `{repo}#{number}`, CI `{repo}@{sha}`,\n * schedule `{repo}@{occurrence}`, webhook `{key}`, telegram `{repo}:{key}`).\n */\n dedupeKey: string | null;\n /**\n * Optional triage (Jev decision layer, see triage.ts): per new firing, may\n * pick a lane from `lanes` and a playbook from `playbooks` when its\n * confidence ≥ `minConfidence`; below that — or offline/unkeyed — the\n * configured `lane`/`playbookId` apply. It can also ESCALATE a doubtful\n * item to leader-review; it can never drop work or pick a lane outside\n * `lanes`. null = deterministic (the configured lane, always).\n */\n triage: AutomationTriageConfig | null;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface AutomationTriageConfig {\n /** Lanes triage may choose between (must include the automation's `lane`). */\n lanes: AutomationLane[];\n /** Playbook ids triage may choose between (empty = keep `playbookId`). */\n playbooks: string[];\n /** 0.5–1; default 0.75 (same as the other Jev call sites). */\n minConfidence: number;\n}\n\n/** How a firing's lane/playbook was decided. */\nexport interface AutomationTriageRecord {\n source: 'rules' | 'jev';\n /** Jev's confidence in the chosen lane; null on the rules path. */\n confidence: number | null;\n /** P(worth working) from Jev; null when not asked / unavailable. */\n worth: number | null;\n /** Plain sentence (\"Jev picked devin at 0.91\", \"rules: Jev unavailable (no-key)\"). */\n note: string;\n}\n\n/** What a create/update carries (server fills id/v/timestamps). */\nexport type AutomationInput = Omit<AutomationV1, 'v' | 'id' | 'createdAt' | 'updatedAt'> & { id?: string };\n\n// ---------------------------------------------------------------------------\n// Limits\n// ---------------------------------------------------------------------------\n\nexport const AUTOMATION_LIMITS = Object.freeze({\n maxAutomations: 50,\n maxRepos: 20,\n maxLabels: 5,\n nameMaxChars: 80,\n instructionsMaxChars: 4_000,\n queryMaxChars: 200,\n /** Body text taken from an issue / webhook / Telegram message. */\n eventTextMaxChars: 4_000,\n eventTitleMaxChars: 160,\n pollMinutesMin: 5,\n pollMinutesMax: 1_440,\n maxConcurrentMax: 20,\n maxPerDayMax: 200,\n queueDepthMax: 100,\n spendCapUsdMax: 100_000,\n /** Issues read per repo per poll (one page). */\n issuesPerPoll: 50,\n /** Firings kept in state (open ones are always kept). */\n firingsKept: 1_000,\n /** Dedupe keys are remembered this long. */\n dedupeRetentionMs: 30 * 24 * 60 * 60_000,\n /** A queued firing older than this is dropped as stale. */\n queuedExpiryMs: 7 * 24 * 60 * 60_000,\n /** A firing stuck in `dispatching` this long (crash mid-launch) is marked failed, never re-sent. */\n dispatchingStaleMs: 15 * 60_000,\n /** Window for the success rate. */\n successWindowMs: 30 * 24 * 60 * 60_000,\n});\n\nexport const AUTOMATION_TRIAGE_DEFAULT_CONFIDENCE = 0.75;\n/** Below this P(worth working) at confidence, triage escalates to leader-review. */\nexport const AUTOMATION_TRIAGE_DOUBT = 0.2;\n\nexport const AUTOMATION_DEFAULTS = Object.freeze({\n pollMinutes: 15,\n maxConcurrent: 2,\n maxPerDay: 5,\n queueDepth: 10,\n spendCapUsd: 50,\n});\n\nexport const AUTOMATION_ID_PATTERN = /^au_[a-z0-9][a-z0-9-]{1,47}$/;\nexport const AUTOMATION_FIRING_ID_PATTERN = /^af_\\d{8}T\\d{6}_[a-z0-9]{6}$/;\nexport const AUTOMATION_REPO_PATTERN = /^[A-Za-z0-9-]+\\/[A-Za-z0-9._-]+$/;\nexport const AUTOMATION_LABEL_PATTERN = /^[A-Za-z0-9][A-Za-z0-9 :._/+-]{0,49}$/;\n/** A playbook ref as src/core/playbooks writes it: `id` or `id@vN` (validate.ts canonicalises `!macro` / `id@N`). */\nexport const AUTOMATION_PLAYBOOK_ID_PATTERN = /^[a-z0-9][a-z0-9-]{1,47}(?:@v\\d{1,6})?$/;\n\n// ---------------------------------------------------------------------------\n// Firings\n// ---------------------------------------------------------------------------\n\n/**\n * queued accepted; waiting for a slot (concurrency, per-day, spend,\n * lane budget, grant, KILL) — retried every tick until\n * AUTOMATION_LIMITS.queuedExpiryMs.\n * dispatching the lane call is in flight (claimed, never sent twice).\n * dispatched the lane accepted it (task id in laneRef); watched until it settles.\n * awaiting-review leader-review lane: waiting in Needs-you for Approve / Reject.\n * succeeded the lane's task finished well (PR merged, fleet task done).\n * failed the lane's task failed, or the launch itself failed.\n * refused a lane refused it for good (lane off, repo outside the grant…).\n * dropped the queue was full, or it waited too long.\n * rejected leader-review: rejected in Needs-you.\n */\nexport type AutomationFiringState =\n | 'queued'\n | 'dispatching'\n | 'dispatched'\n | 'awaiting-review'\n | 'succeeded'\n | 'failed'\n | 'refused'\n | 'dropped'\n | 'rejected';\n\nexport const AUTOMATION_OPEN_STATES: readonly AutomationFiringState[] = ['queued', 'dispatching', 'dispatched', 'awaiting-review'];\n/** Count against maxConcurrent. */\nexport const AUTOMATION_ACTIVE_STATES: readonly AutomationFiringState[] = ['dispatching', 'dispatched', 'awaiting-review'];\n\nexport type AutomationSourceKind = AutomationTriggerKind | 'manual';\n\n/** Where the work came from — always linkable back when there is a URL. */\nexport interface AutomationFiringSource {\n kind: AutomationSourceKind;\n /** https URL of the issue / PR / check run / webhook-supplied link; null when there is none. */\n url: string | null;\n /** Short ref: `#12`, a sha, an occurrence time, a webhook key. */\n ref: string;\n}\n\nexport interface AutomationLaneRef {\n lane: Exclude<AutomationLane, 'leader-review'>;\n /** Cloud `ct_…`, Devin `dv_…`, or a fleet task uuid. */\n id: string;\n /** Session / PR link when the lane gave one. */\n url: string | null;\n}\n\nexport interface AutomationFiringV1 {\n v: 1;\n id: string;\n automationId: string;\n /** The rendered dedupe key (unique per automation within retention). */\n dedupeKey: string;\n source: AutomationFiringSource;\n repo: string;\n /** One line, ≤ 160 chars. */\n title: string;\n /** The event text (untrusted DATA) — never the instructions. */\n text: string;\n lane: AutomationLane;\n playbookId: string | null;\n /** Absent on firings written before triage existed. */\n triage?: AutomationTriageRecord;\n state: AutomationFiringState;\n /** Plain sentence for the current state. */\n reason: string | null;\n laneRef: AutomationLaneRef | null;\n /** Estimated spend charged to the automation when the lane accepted it. */\n spendUsd: number;\n attempts: number;\n createdAt: string;\n dispatchedAt: string | null;\n settledAt: string | null;\n updatedAt: string;\n}\n\n/** Per-automation poll bookkeeping (bounded GitHub reads). */\nexport interface AutomationCursor {\n lastPolledAt: string | null;\n /** schedule: the next occurrence (ISO). */\n nextRunAt: string | null;\n /** github-issues: newest `updated_at` seen, per repo (the `since` cursor). */\n since: Record<string, string>;\n /** Last ETag per repo+endpoint, sent as If-None-Match. */\n etags: Record<string, string>;\n /** ci-red: default branch per repo (read once). */\n branches: Record<string, string>;\n /** Last poll error, plain sentence; null when the last poll worked. */\n lastError: string | null;\n}\n\nexport interface AutomationStateV1 {\n v: typeof AUTOMATION_STATE_SCHEMA_VERSION;\n cursors: Record<string, AutomationCursor>;\n firings: AutomationFiringV1[];\n /** `<automationId>\\u0000<dedupeKey>` → first seen (ms). */\n seen: Record<string, number>;\n}\n\n// ---------------------------------------------------------------------------\n// Views + HTTP contract (workbench family 'automations')\n// ---------------------------------------------------------------------------\n\nexport interface AutomationStats {\n lastFiredAt: string | null;\n /** schedule: next occurrence; polling triggers: next poll; null for push triggers. */\n nextRunAt: string | null;\n queued: number;\n active: number;\n firedToday: number;\n spentThisMonthUsd: number;\n /** succeeded / (succeeded + failed) over 30 days; null when nothing settled. */\n successRate: number | null;\n succeeded: number;\n failed: number;\n lastError: string | null;\n}\n\nexport interface AutomationView {\n automation: AutomationV1;\n stats: AutomationStats;\n /** Human sentence of the trigger (\"Issues labelled ashlr on 2 repos, every 15 min\"). */\n triggerSummary: string;\n}\n\nexport interface AutomationTemplate {\n id: string;\n name: string;\n blurb: string;\n input: AutomationInput;\n}\n\nexport const VERSE_AUTOMATIONS_PATH = '/api/verse/automations' as const;\n\n/** GET /api/verse/automations */\nexport interface AutomationsOverviewResponse {\n generatedAt: string;\n automations: AutomationView[];\n /** Newest first, at most 100. */\n firings: AutomationFiringV1[];\n templates: AutomationTemplate[];\n /** Why nothing will dispatch right now (KILL, no grant, scheduler off); null when clear. */\n blocked: string | null;\n schedulerRunning: boolean;\n}\n\n/** POST /api/verse/automations/<id>/fire { dryRun?, repo?, text?, title? } */\nexport interface AutomationFireRequest {\n dryRun?: boolean;\n repo?: string;\n title?: string;\n text?: string;\n}\n\nexport interface AutomationPlannedTask {\n dedupeKey: string;\n repo: string;\n title: string;\n lane: AutomationLane;\n /** What would happen: `dispatch`, `queue`, `dedupe`, `drop`, `defer: <reason>`. */\n verdict: string;\n}\n\nexport interface AutomationFireResponse {\n ok: boolean;\n dryRun: boolean;\n planned: AutomationPlannedTask[];\n firings: AutomationFiringV1[];\n error: string | null;\n}\n\n/** POST /api/verse/automations/<id>/webhook — a local tool (n8n, a Linear bridge) hands over work. */\nexport interface AutomationWebhookRequest {\n repo?: string;\n title?: string;\n text: string;\n /** Caller's idempotency key (e.g. the Linear issue id). */\n key?: string;\n /** https link back to the source. */\n url?: string;\n}\n","/**\n * routes/verse/automations/automations-model.ts — pure helpers for the\n * Automations section: the form ⇄ definition mapping, plain-language stats\n * and the tone of a firing's state. No React, no fetch.\n *\n * The form is deliberately simple (text fields, a few selects). The server\n * validates the whole definition and answers a plain sentence on a mistake,\n * so the form only shapes values — it never decides what is allowed.\n */\nimport type {\n AutomationFiringState,\n AutomationInput,\n AutomationLane,\n AutomationStats,\n AutomationTriggerKind,\n AutomationTriageConfig,\n AutomationV1,\n} from '../../../../core/automations/types.js';\nimport type { Tone } from '../../../components/primitives/StatusBadge.js';\n\nexport const LANE_LABEL: Readonly<Record<AutomationLane, string>> = {\n fleet: 'Fleet',\n cloud: 'Claude cloud',\n devin: 'Devin',\n 'leader-review': 'Review first',\n};\n\nexport const LANE_HINT: Readonly<Record<AutomationLane, string>> = {\n fleet: 'Queued for the local fleet — free, dispatched under the standing grant.',\n cloud: 'A Claude cloud session — spends credits; held to the self-improvement caps.',\n devin: 'A Devin session — spends ACUs; needs the Devin fleet opt-in.',\n 'leader-review': 'Waits in Needs-you until you approve it.',\n};\n\nexport const TRIGGER_LABEL: Readonly<Record<AutomationTriggerKind, string>> = {\n 'github-issues': 'GitHub issues with a label',\n 'ci-red': 'Red default branch (failing checks)',\n schedule: 'Schedule (RRULE)',\n webhook: 'Local webhook (n8n, Linear bridge…)',\n telegram: 'Telegram /task',\n};\n\nexport interface AutomationForm {\n id: string | null;\n name: string;\n enabled: boolean;\n triggerKind: AutomationTriggerKind;\n labels: string;\n query: string;\n includePrs: boolean;\n branch: string;\n rrule: string;\n pollMinutes: string;\n lane: AutomationLane;\n repos: string;\n instructions: string;\n playbookId: string;\n maxConcurrent: string;\n maxPerDay: string;\n queueDepth: string;\n spendCapUsd: string;\n dedupeKey: string;\n /** Not edited here (CLI / API); carried through unchanged on save. */\n triage: AutomationTriageConfig | null;\n}\n\nexport function formFrom(source: AutomationInput | AutomationV1, id: string | null = null): AutomationForm {\n const t = source.trigger;\n return {\n id,\n name: source.name,\n enabled: source.enabled,\n triggerKind: t.kind,\n labels: t.kind === 'github-issues' ? t.labels.join(', ') : 'ashlr',\n query: t.kind === 'github-issues' ? t.query ?? '' : '',\n includePrs: t.kind === 'github-issues' ? t.includePrs : false,\n branch: t.kind === 'ci-red' ? t.branch ?? '' : '',\n rrule: t.kind === 'schedule' ? t.rrule : 'FREQ=DAILY;BYHOUR=2;BYMINUTE=0',\n pollMinutes: String(t.kind === 'github-issues' || t.kind === 'ci-red' ? t.pollMinutes : 15),\n lane: source.lane,\n repos: source.repos.join(', '),\n instructions: source.instructions,\n playbookId: source.playbookId ?? '',\n maxConcurrent: String(source.maxConcurrent),\n maxPerDay: String(source.maxPerDay),\n queueDepth: String(source.queueDepth),\n spendCapUsd: String(source.spendCapUsd),\n dedupeKey: source.dedupeKey ?? '',\n triage: source.triage ?? null,\n };\n}\n\nconst list = (text: string): string[] => text.split(',').map((s) => s.trim()).filter((s) => s !== '');\n\nfunction num(text: string, name: string): number | string {\n const n = Number(text.trim());\n return text.trim() === '' || !Number.isFinite(n) ? `${name} must be a number.` : n;\n}\n\n/** Shape the form into a definition body; the server does the real validation. */\nexport function inputFromForm(form: AutomationForm): { ok: true; input: Record<string, unknown> } | { ok: false; error: string } {\n if (form.name.trim() === '') return { ok: false, error: 'Give the automation a name.' };\n const repos = list(form.repos);\n if (repos.length === 0) return { ok: false, error: 'List at least one repo (owner/name), or * for every repo in the standing grant.' };\n const numbers: Record<string, number> = {};\n for (const [key, label] of [['maxConcurrent', 'Max in flight'], ['maxPerDay', 'Max per day'], ['queueDepth', 'Queue depth'], ['spendCapUsd', 'Spend cap']] as const) {\n const v = num(form[key], label);\n if (typeof v === 'string') return { ok: false, error: v };\n numbers[key] = v;\n }\n let trigger: Record<string, unknown>;\n switch (form.triggerKind) {\n case 'github-issues': {\n const poll = num(form.pollMinutes, 'Check every');\n if (typeof poll === 'string') return { ok: false, error: poll };\n trigger = { kind: 'github-issues', labels: list(form.labels), query: form.query.trim() === '' ? null : form.query.trim(), includePrs: form.includePrs, pollMinutes: poll };\n break;\n }\n case 'ci-red': {\n const poll = num(form.pollMinutes, 'Check every');\n if (typeof poll === 'string') return { ok: false, error: poll };\n trigger = { kind: 'ci-red', branch: form.branch.trim() === '' ? null : form.branch.trim(), pollMinutes: poll };\n break;\n }\n case 'schedule':\n trigger = { kind: 'schedule', rrule: form.rrule.trim() };\n break;\n default:\n trigger = { kind: form.triggerKind };\n }\n return {\n ok: true,\n input: {\n name: form.name.trim(),\n enabled: form.enabled,\n trigger,\n lane: form.lane,\n playbookId: form.playbookId.trim() === '' ? null : form.playbookId.trim(),\n repos,\n instructions: form.instructions,\n ...numbers,\n dedupeKey: form.dedupeKey.trim() === '' ? null : form.dedupeKey.trim(),\n triage: form.triage,\n },\n };\n}\n\n/** \"in 12 min\", \"3 h ago\", \"just now\", \"—\". */\nexport function relativeTime(iso: string | null, nowMs: number): string {\n if (!iso) return '—';\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return '—';\n const diff = t - nowMs;\n const mins = Math.round(Math.abs(diff) / 60_000);\n if (mins < 1) return diff >= 0 ? 'now' : 'just now';\n const span = mins < 60 ? `${mins} min` : mins < 48 * 60 ? `${Math.round(mins / 60)} h` : `${Math.round(mins / 1440)} d`;\n return diff >= 0 ? `in ${span}` : `${span} ago`;\n}\n\nexport function successLabel(stats: AutomationStats): string {\n if (stats.successRate === null) return 'no results yet';\n return `${Math.round(stats.successRate * 100)}% (${stats.succeeded} of ${stats.succeeded + stats.failed})`;\n}\n\nexport function spendLabel(automation: Pick<AutomationV1, 'spendCapUsd' | 'lane'>, stats: AutomationStats): string {\n if (automation.lane === 'fleet' || automation.lane === 'leader-review') {\n return stats.spentThisMonthUsd > 0 ? `$${stats.spentThisMonthUsd.toFixed(2)} this month` : 'no paid spend';\n }\n return `$${stats.spentThisMonthUsd.toFixed(2)} of $${automation.spendCapUsd.toFixed(2)} this month`;\n}\n\nconst FIRING_TONE: Readonly<Record<AutomationFiringState, Tone>> = {\n queued: 'neutral',\n dispatching: 'running',\n dispatched: 'running',\n 'awaiting-review': 'warning',\n succeeded: 'success',\n failed: 'danger',\n refused: 'danger',\n dropped: 'neutral',\n rejected: 'neutral',\n};\n\nexport function firingTone(state: AutomationFiringState): Tone {\n return FIRING_TONE[state] ?? 'unknown';\n}\n\nexport const FIRING_LABEL: Readonly<Record<AutomationFiringState, string>> = {\n queued: 'Queued',\n dispatching: 'Sending',\n dispatched: 'Running',\n 'awaiting-review': 'Needs review',\n succeeded: 'Done',\n failed: 'Failed',\n refused: 'Refused',\n dropped: 'Dropped',\n rejected: 'Rejected',\n};\n\n/** https links only — a firing's source or lane link is shown as a link, never anything else. */\nexport function safeHref(url: string | null | undefined): string | null {\n return typeof url === 'string' && /^https:\\/\\/[^\\s]+$/.test(url) ? url : null;\n}\n","/**\n * routes/verse/automations/automations-queries.ts — reads and writes behind\n * the Automations section (core/verse/automations-api.ts).\n *\n * GET /api/verse/automations → AutomationsOverviewResponse\n * POST /api/verse/automations → 201 { automation } (create)\n * POST /api/verse/automations/<id> → { automation } (update)\n * POST /api/verse/automations/<id>/enable|disable → { automation }\n * POST /api/verse/automations/<id>/delete → { ok }\n * POST /api/verse/automations/<id>/fire → AutomationFireResponse\n *\n * Reads spend nothing. Writes pull the held mutation token, touch the hold,\n * and invalidate the overview.\n */\nimport type {\n AutomationFireResponse,\n AutomationsOverviewResponse,\n AutomationV1,\n} from '../../../../core/automations/types.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { apiGet, apiPost } from '../../../data/client.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const AUTOMATIONS_PATH = '/api/verse/automations';\nexport const AUTOMATIONS_KEY = 'verse-automations';\nexport const AUTOMATIONS_POLL_MS = 15_000;\n\nexport const automationsQuery: QueryDef<AutomationsOverviewResponse> = {\n key: AUTOMATIONS_KEY,\n fetch: (signal) => apiGet<AutomationsOverviewResponse>(AUTOMATIONS_PATH, signal),\n};\n\nfunction token(): string {\n const t = getMutationToken();\n if (!t) throw new VerseMutationLockedError();\n return t;\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const res = await apiPost<T>(path, body, token());\n touchMutationHold();\n invalidate(AUTOMATIONS_KEY);\n return res;\n}\n\nconst at = (id: string, verb?: string): string => `${AUTOMATIONS_PATH}/${encodeURIComponent(id)}${verb ? `/${verb}` : ''}`;\n\n/** Create (id null) or update (id set). The server validates the whole definition. */\nexport async function saveAutomationDefinition(id: string | null, input: Record<string, unknown>): Promise<AutomationV1> {\n const res = await post<{ automation: AutomationV1 }>(id ? at(id) : AUTOMATIONS_PATH, input);\n return res.automation;\n}\n\nexport async function setAutomationOn(id: string, enabled: boolean): Promise<AutomationV1> {\n return (await post<{ automation: AutomationV1 }>(at(id, enabled ? 'enable' : 'disable'), {})).automation;\n}\n\nexport async function removeAutomation(id: string): Promise<void> {\n await post<{ ok: true }>(at(id, 'delete'), {});\n}\n\nexport async function runAutomation(id: string, dryRun: boolean): Promise<AutomationFireResponse> {\n return post<AutomationFireResponse>(at(id, 'fire'), dryRun ? { dryRun: true } : {});\n}\n","/*\n * Automations (3.15) — the Apps & Accounts page frame (one centred column):\n * a list of automations with their numbers, a simple form, recent firings.\n * Tokens only (DESIGN.md §13; style-scan-310 enforces it): no raw colour, no\n * px font size. At the compact width the form grid and the stats stack.\n */\n\n.section {\n display: flex;\n flex-direction: column;\n min-height: 0;\n height: 100%;\n background: var(--bg-canvas);\n}\n\n.scroll {\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n padding: var(--space-6) var(--space-4) var(--space-12);\n /* Same traffic-light allowance as Apps (see Apps.module.css). */\n padding-left: max(var(--space-4), calc(var(--app-traffic-light-inset, 0px) - var(--rail-width, 56px)));\n}\n\n.page {\n container-type: inline-size;\n max-width: 960px;\n margin: 0 auto;\n display: flex;\n flex-direction: column;\n gap: var(--space-4);\n}\n\n.header {\n display: flex;\n flex-wrap: wrap;\n align-items: flex-end;\n justify-content: space-between;\n gap: var(--space-3) var(--space-4);\n margin-bottom: var(--space-2);\n}\n.headerText {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n max-width: var(--measure-read);\n}\n.title {\n margin: 0;\n font-family: var(--font-display);\n font-size: var(--text-xl-size);\n line-height: var(--text-xl-line);\n letter-spacing: var(--tracking-display);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.subtitle {\n margin: 0;\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n font-weight: var(--font-weight-semibold);\n color: var(--text-primary);\n}\n.lede {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n\n.banner {\n margin: 0;\n padding: var(--space-3) var(--space-4);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-secondary);\n}\n.banner[data-tone='danger'] {\n border-color: color-mix(in srgb, var(--status-danger-solid) 40%, var(--border-subtle));\n color: var(--status-danger-fg);\n}\n.banner[data-tone='warning'] {\n border-color: color-mix(in srgb, var(--status-warning-solid) 40%, var(--border-subtle));\n background: var(--status-warning-bg);\n color: var(--status-warning-fg);\n}\n\n.list,\n.plain,\n.firings {\n margin: 0;\n padding: 0;\n list-style: none;\n display: flex;\n flex-direction: column;\n gap: var(--space-3);\n}\n.plain {\n gap: var(--space-1);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n\n.row,\n.card,\n.editor {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--space-4);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n}\n.editor {\n gap: var(--space-3);\n border-color: var(--border-default);\n}\n\n.rowHead {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: var(--space-3);\n}\n.rowTitle {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n font-size: var(--text-md-size);\n line-height: var(--text-md-line);\n color: var(--text-primary);\n}\n\n.badge {\n display: inline-flex;\n align-items: center;\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border-radius: var(--radius-full);\n background: var(--status-neutral-bg);\n color: var(--status-neutral-fg);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n font-weight: var(--font-weight-medium);\n white-space: nowrap;\n}\n\n.meta {\n margin: 0;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n.stats {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(120px, 1fr));\n gap: var(--space-2) var(--space-4);\n margin: 0;\n}\n.stats div {\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.stats dt {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n.stats dd {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.actions,\n.templates {\n display: flex;\n flex-wrap: wrap;\n align-items: center;\n gap: var(--space-2);\n}\n\n.grid {\n display: grid;\n grid-template-columns: repeat(2, minmax(0, 1fr));\n gap: var(--space-3) var(--space-4);\n}\n\n.field {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n}\n.fieldLabel {\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n font-weight: var(--font-weight-medium);\n color: var(--text-primary);\n}\n.textarea {\n padding: var(--space-2);\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-sm-size);\n line-height: var(--text-sm-line);\n resize: vertical;\n}\n.textarea:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n}\n\n.firings li {\n display: flex;\n flex-wrap: wrap;\n align-items: baseline;\n gap: var(--space-1) var(--space-2);\n padding-bottom: var(--space-2);\n border-bottom: 1px solid var(--border-subtle);\n}\n.firings li:last-child {\n border-bottom: 0;\n}\n.firingTitle {\n flex: 1 1 240px;\n min-width: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n.firingTitle a,\n.meta a {\n color: var(--text-link);\n}\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n@container (max-width: 640px) {\n .grid {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n","/**\n * routes/verse/automations/AutomationsView.tsx — Automations (3.15): work\n * that arrives on its own. Labelled issues, a red default branch, a schedule,\n * a local webhook or a Telegram /task becomes one task for a lane (fleet,\n * Claude cloud, Devin, or review first) — through that lane's own gates.\n *\n * One page: the list (last fired, next run, queue, in flight, spend, success\n * rate; on/off; Run now; Dry run; Edit; Delete), a simple create/edit form\n * seeded from templates, and the recent firings with links back to their\n * sources. Every write goes through the mutation token; the server validates\n * and answers a plain sentence on a mistake.\n */\nimport { useEffect, useMemo, useState, useSyncExternalStore, type FormEvent } from 'react';\nimport type {\n AutomationFireResponse,\n AutomationFiringV1,\n AutomationLane,\n AutomationTemplate,\n AutomationTriggerKind,\n AutomationView,\n} from '../../../../core/automations/types.js';\nimport { AUTOMATION_LANES, AUTOMATION_TRIGGER_KINDS } from '../../../../core/automations/types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { Input } from '../../../components/primitives/Input.js';\nimport { Select } from '../../../components/primitives/Select.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { StatusBadge } from '../../../components/primitives/StatusBadge.js';\nimport { Switch } from '../../../components/primitives/Switch.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { describeContextError, useTokenGate } from '../context/use-token-gate.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { playbooksQuery } from '../playbooks/playbooks-queries.js';\nimport { playbookKindOf } from '../../../../core/playbooks/types.js';\nimport { getAutomationsFocus, isAutomationsFocusLive, subscribeAutomationsFocus, takeAutomationsFocus } from './automations-focus.js';\nimport {\n FIRING_LABEL,\n firingTone,\n formFrom,\n inputFromForm,\n LANE_HINT,\n LANE_LABEL,\n relativeTime,\n safeHref,\n spendLabel,\n successLabel,\n TRIGGER_LABEL,\n type AutomationForm,\n} from './automations-model.js';\nimport {\n AUTOMATIONS_POLL_MS,\n automationsQuery,\n removeAutomation,\n runAutomation,\n saveAutomationDefinition,\n setAutomationOn,\n} from './automations-queries.js';\nimport styles from './Automations.module.css';\n\ntype Notice = { tone: 'neutral' | 'danger'; text: string } | null;\n\nexport function AutomationsView() {\n const read = useQuery(automationsQuery);\n const refetch = useRefetch(automationsQuery);\n usePollWhileVisible(refetch, AUTOMATIONS_POLL_MS);\n const gate = useTokenGate();\n const [editing, setEditing] = useState<AutomationForm | null>(null);\n const [notice, setNotice] = useState<Notice>(null);\n const [busy, setBusy] = useState<string | null>(null);\n const [dryRun, setDryRun] = useState<{ name: string; result: AutomationFireResponse } | null>(null);\n const templates = useMemo(() => read.data?.templates ?? [], [read.data]);\n const views = read.data?.automations ?? [];\n const now = Date.now();\n\n // ⌘K \"New automation…\" hand-off.\n const focus = useSyncExternalStore(subscribeAutomationsFocus, getAutomationsFocus, getAutomationsFocus);\n useEffect(() => {\n if (!focus || !read.data) return;\n if (isAutomationsFocusLive(focus) && focus.kind === 'new' && templates[0]) setEditing(formFrom(templates[0].input));\n takeAutomationsFocus(focus.seq);\n }, [focus, read.data, templates]);\n\n const act = async (key: string, why: string, run: () => Promise<string | null>) => {\n setBusy(key);\n setNotice(null);\n try {\n const message = await gate.run(why, run);\n if (message) setNotice({ tone: 'neutral', text: message });\n refetch();\n } catch (err) {\n setNotice({ tone: 'danger', text: describeContextError(err) });\n } finally {\n setBusy(null);\n }\n };\n\n const save = (form: AutomationForm) => {\n const shaped = inputFromForm(form);\n if (!shaped.ok) {\n setNotice({ tone: 'danger', text: shaped.error });\n return;\n }\n void act('save', form.id ? `Save ${form.name}` : `Create ${form.name}`, async () => {\n const saved = await saveAutomationDefinition(form.id, shaped.input);\n setEditing(null);\n return `${form.id ? 'Saved' : 'Created'} ${saved.name}${saved.enabled ? '' : ' (off — switch it on when ready)'}.`;\n });\n };\n\n const fire = (view: AutomationView, dry: boolean) =>\n act(`${dry ? 'dry' : 'run'}:${view.automation.id}`, dry ? `Dry run ${view.automation.name}` : `Run ${view.automation.name} now`, async () => {\n const result = await runAutomation(view.automation.id, dry);\n if (dry) {\n setDryRun({ name: view.automation.name, result });\n return null;\n }\n const sent = result.firings.filter((f) => f.state === 'dispatched' || f.state === 'awaiting-review').length;\n const queued = result.firings.filter((f) => f.state === 'queued').length;\n return result.firings.length === 0 && result.planned.length === 0\n ? `${view.automation.name}: nothing to do right now.`\n : `${view.automation.name}: ${sent} sent, ${queued} queued, ${result.planned.length} already handled.`;\n });\n\n return (\n <section className={styles.section} aria-label=\"Automations\">\n <div className={styles.scroll}>\n <div className={styles.page}>\n <header className={styles.header}>\n <div className={styles.headerText}>\n <h2 className={styles.title}>Automations</h2>\n <p className={styles.lede}>\n Labelled issues, a red main, schedules and webhooks become work on their own — one task per issue, within your limits, through the standing grant, Stop and each lane&apos;s budget.\n </p>\n </div>\n {!editing && templates[0] ? (\n <Button variant=\"primary\" size=\"sm\" onClick={() => setEditing(formFrom(templates[0]!.input))}>New automation</Button>\n ) : null}\n </header>\n\n {read.data?.blocked ? <p className={styles.banner} data-tone=\"warning\" role=\"status\">{read.data.blocked}</p> : null}\n <p className={notice ? styles.banner : styles.visuallyHidden} data-tone={notice?.tone} role=\"status\" aria-live=\"polite\">{notice?.text ?? ''}</p>\n\n {editing ? (\n <AutomationEditor\n form={editing}\n templates={editing.id ? [] : templates}\n saving={busy === 'save'}\n onChange={setEditing}\n onSave={save}\n onCancel={() => setEditing(null)}\n />\n ) : null}\n\n {read.data === undefined && !read.error ? (\n <div aria-busy=\"true\" aria-label=\"Loading automations\">\n <SkeletonLine width=\"50%\" />\n <SkeletonLine width=\"80%\" />\n </div>\n ) : read.error ? (\n <p className={styles.banner} data-tone=\"danger\">{describeContextError(read.error)}</p>\n ) : views.length === 0 && !editing ? (\n <EmptyState\n title=\"No automations yet\"\n body=\"Start from a template — every new automation starts switched off.\"\n action={\n <div className={styles.templates}>\n {templates.map((t) => (\n <Button key={t.id} size=\"sm\" variant=\"subtle\" onClick={() => setEditing(formFrom(t.input))}>{t.name}</Button>\n ))}\n </div>\n }\n />\n ) : (\n <ul className={styles.list} aria-label=\"Automations\">\n {views.map((view) => (\n <AutomationRow\n key={view.automation.id}\n view={view}\n now={now}\n busy={busy}\n onToggle={(on) => void act(`toggle:${view.automation.id}`, `${on ? 'Turn on' : 'Turn off'} ${view.automation.name}`, async () => {\n await setAutomationOn(view.automation.id, on);\n return `${view.automation.name} is ${on ? 'on' : 'off'}.`;\n })}\n onRun={(dry) => void fire(view, dry)}\n onEdit={() => setEditing(formFrom(view.automation, view.automation.id))}\n onDelete={() => void act(`delete:${view.automation.id}`, `Delete ${view.automation.name}`, async () => {\n await removeAutomation(view.automation.id);\n return `Deleted ${view.automation.name} (its history stays in the journal).`;\n })}\n />\n ))}\n </ul>\n )}\n\n {dryRun ? <DryRunCard name={dryRun.name} result={dryRun.result} onDismiss={() => setDryRun(null)} /> : null}\n\n {read.data && read.data.firings.length > 0 ? <RecentFirings firings={read.data.firings.slice(0, 25)} views={views} now={now} /> : null}\n </div>\n </div>\n <MutationTokenDialog {...gate.dialog} tokenLabel=\"Mutation token\" tokenHelp=\"the mutation token ashlr verse printed\" />\n </section>\n );\n}\n\nfunction AutomationRow(props: {\n view: AutomationView;\n now: number;\n busy: string | null;\n onToggle: (on: boolean) => void;\n onRun: (dry: boolean) => void;\n onEdit: () => void;\n onDelete: () => void;\n}) {\n const { view, now, busy } = props;\n const { automation: a, stats: s } = view;\n const [confirmDelete, setConfirmDelete] = useState(false);\n return (\n <li className={styles.row} data-automation={a.id}>\n <div className={styles.rowHead}>\n <div className={styles.rowTitle}>\n <strong>{a.name}</strong>\n <span className={styles.badge}>{LANE_LABEL[a.lane]}</span>\n {a.playbookId ? <span className={styles.badge}>playbook {a.playbookId}</span> : null}\n </div>\n <Switch checked={a.enabled} onChange={props.onToggle} aria-label={`${a.name} on`} disabled={busy === `toggle:${a.id}`} />\n </div>\n <p className={styles.meta}>{view.triggerSummary}</p>\n <dl className={styles.stats}>\n <div><dt>Last fired</dt><dd>{relativeTime(s.lastFiredAt, now)}</dd></div>\n <div><dt>Next run</dt><dd>{a.enabled ? relativeTime(s.nextRunAt, now) : 'off'}</dd></div>\n <div><dt>Queue</dt><dd>{s.queued} of {a.queueDepth}</dd></div>\n <div><dt>In flight</dt><dd>{s.active} of {a.maxConcurrent}</dd></div>\n <div><dt>Today</dt><dd>{s.firedToday} of {a.maxPerDay}</dd></div>\n <div><dt>Spend</dt><dd>{spendLabel(a, s)}</dd></div>\n <div><dt>Success</dt><dd>{successLabel(s)}</dd></div>\n </dl>\n {s.lastError ? <p className={styles.banner} data-tone=\"warning\">{s.lastError}</p> : null}\n <div className={styles.actions}>\n <Button size=\"sm\" variant=\"subtle\" busy={busy === `run:${a.id}`} onClick={() => props.onRun(false)}>Run now</Button>\n <Button size=\"sm\" variant=\"ghost\" busy={busy === `dry:${a.id}`} onClick={() => props.onRun(true)}>Dry run</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={props.onEdit}>Edit</Button>\n {confirmDelete ? (\n <>\n <Button size=\"sm\" variant=\"danger\" busy={busy === `delete:${a.id}`} onClick={props.onDelete}>Delete {a.name}</Button>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setConfirmDelete(false)}>Keep</Button>\n </>\n ) : (\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setConfirmDelete(true)}>Delete</Button>\n )}\n </div>\n </li>\n );\n}\n\nfunction AutomationEditor(props: {\n form: AutomationForm;\n templates: readonly AutomationTemplate[];\n saving: boolean;\n onChange: (next: AutomationForm) => void;\n onSave: (form: AutomationForm) => void;\n onCancel: () => void;\n}) {\n const { form, onChange } = props;\n const set = <K extends keyof AutomationForm>(key: K, value: AutomationForm[K]) => onChange({ ...form, [key]: value });\n const polling = form.triggerKind === 'github-issues' || form.triggerKind === 'ci-red';\n const submit = (event: FormEvent) => {\n event.preventDefault();\n props.onSave(form);\n };\n return (\n <form className={styles.editor} onSubmit={submit} aria-label={form.id ? `Edit ${form.name}` : 'New automation'}>\n <h3 className={styles.subtitle}>{form.id ? `Edit ${form.name}` : 'New automation'}</h3>\n {props.templates.length > 0 ? (\n <div className={styles.templates} role=\"group\" aria-label=\"Templates\">\n {props.templates.map((t) => (\n <Button key={t.id} type=\"button\" size=\"sm\" variant=\"subtle\" title={t.blurb} onClick={() => onChange(formFrom(t.input))}>{t.name}</Button>\n ))}\n </div>\n ) : null}\n <div className={styles.grid}>\n <Input label=\"Name\" value={form.name} maxLength={80} onChange={(e) => set('name', e.target.value)} />\n <Select label=\"When\" value={form.triggerKind} onChange={(e) => set('triggerKind', e.target.value as AutomationTriggerKind)}>\n {AUTOMATION_TRIGGER_KINDS.map((k) => <option key={k} value={k}>{TRIGGER_LABEL[k]}</option>)}\n </Select>\n {form.triggerKind === 'github-issues' ? (\n <>\n <Input label=\"Labels (all required)\" hint=\"Comma separated, e.g. ashlr or ashlr:devin\" value={form.labels} onChange={(e) => set('labels', e.target.value)} />\n <Input label=\"Search query (optional)\" hint=\"GitHub qualifiers, e.g. no:assignee — the repos below are added\" value={form.query} onChange={(e) => set('query', e.target.value)} />\n </>\n ) : null}\n {form.triggerKind === 'ci-red' ? (\n <Input label=\"Branch\" hint=\"Empty = the repo's default branch\" value={form.branch} onChange={(e) => set('branch', e.target.value)} />\n ) : null}\n {form.triggerKind === 'schedule' ? (\n <Input label=\"Schedule (RRULE, local time)\" mono hint=\"e.g. FREQ=DAILY;BYHOUR=2 or FREQ=WEEKLY;BYDAY=MO;BYHOUR=6\" value={form.rrule} onChange={(e) => set('rrule', e.target.value)} />\n ) : null}\n {polling ? <Input label=\"Check every (minutes)\" type=\"number\" min={5} max={1440} value={form.pollMinutes} onChange={(e) => set('pollMinutes', e.target.value)} /> : null}\n <Select label=\"Send to\" hint={LANE_HINT[form.lane]} value={form.lane} onChange={(e) => set('lane', e.target.value as AutomationLane)}>\n {AUTOMATION_LANES.map((l) => <option key={l} value={l}>{LANE_LABEL[l]}</option>)}\n </Select>\n <Input label=\"Repos\" hint=\"owner/name, comma separated — or * for every repo in the standing grant\" value={form.repos} onChange={(e) => set('repos', e.target.value)} />\n <PlaybookField value={form.playbookId} onChange={(v) => set('playbookId', v)} />\n <Input label=\"Max in flight\" type=\"number\" min={1} value={form.maxConcurrent} onChange={(e) => set('maxConcurrent', e.target.value)} />\n <Input label=\"Max per day\" type=\"number\" min={1} value={form.maxPerDay} onChange={(e) => set('maxPerDay', e.target.value)} />\n <Input label=\"Queue depth\" type=\"number\" min={0} value={form.queueDepth} onChange={(e) => set('queueDepth', e.target.value)} />\n <Input label=\"Spend cap ($ per month)\" type=\"number\" min={0} prefix=\"$\" value={form.spendCapUsd} onChange={(e) => set('spendCapUsd', e.target.value)} />\n </div>\n <label className={styles.field}>\n <span className={styles.fieldLabel}>Instructions</span>\n <textarea className={styles.textarea} rows={4} maxLength={4000} value={form.instructions} onChange={(e) => set('instructions', e.target.value)} />\n </label>\n {form.triggerKind === 'github-issues' ? (\n <Switch label=\"Also pull requests with these labels\" checked={form.includePrs} onChange={(v) => set('includePrs', v)} />\n ) : null}\n <Switch label=\"On\" checked={form.enabled} onChange={(v) => set('enabled', v)} />\n <div className={styles.actions}>\n <Button type=\"submit\" variant=\"primary\" size=\"sm\" busy={props.saving}>{form.id ? 'Save' : 'Create'}</Button>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={props.onCancel}>Cancel</Button>\n </div>\n </form>\n );\n}\n\n/**\n * The playbook every task from this automation runs under (src/core/playbooks).\n * A picker over the library; free text (`id` or `id@vN`) when the library\n * cannot be read, so a pinned version is always expressible.\n */\nfunction PlaybookField({ value, onChange }: { value: string; onChange: (next: string) => void }) {\n const read = useQuery(playbooksQuery);\n // Agent playbooks only: a command workflow is pasted into a terminal, never a task's procedure.\n const all = read.data?.value ?? null;\n const rows = all === null ? null : all.filter((p) => playbookKindOf(p) === 'agent');\n const pinned = value !== '' && rows !== null && !rows.some((p) => p.id === value);\n if (rows === null || pinned) {\n return <Input label=\"Playbook (optional)\" hint=\"A playbook id, e.g. fix-issue or fix-issue@v2\" value={value} onChange={(e) => onChange(e.target.value)} />;\n }\n return (\n <Select label=\"Playbook (optional)\" hint=\"Every task runs under this playbook's procedure\" value={value} onChange={(e) => onChange(e.target.value)}>\n <option value=\"\">None</option>\n {rows.map((p) => <option key={p.id} value={p.id}>{p.name} ({p.macro})</option>)}\n </Select>\n );\n}\n\nfunction DryRunCard({ name, result, onDismiss }: { name: string; result: AutomationFireResponse; onDismiss: () => void }) {\n return (\n <section className={styles.card} aria-label={`Dry run: ${name}`}>\n <div className={styles.rowHead}>\n <h3 className={styles.subtitle}>Dry run · {name}</h3>\n <Button size=\"sm\" variant=\"ghost\" onClick={onDismiss}>Dismiss</Button>\n </div>\n {result.planned.length === 0 ? (\n <p className={styles.meta}>Nothing would fire right now.</p>\n ) : (\n <ul className={styles.plain}>\n {result.planned.map((p) => (\n <li key={p.dedupeKey}><strong>{p.title}</strong> <span className={styles.meta}>({p.repo})</span> → {p.verdict}</li>\n ))}\n </ul>\n )}\n <p className={styles.meta}>Nothing was sent or recorded.</p>\n </section>\n );\n}\n\nfunction RecentFirings({ firings, views, now }: { firings: readonly AutomationFiringV1[]; views: readonly AutomationView[]; now: number }) {\n const names = new Map(views.map((v) => [v.automation.id, v.automation.name]));\n return (\n <section aria-label=\"Recent firings\" className={styles.card}>\n <h3 className={styles.subtitle}>Recent firings</h3>\n <ul className={styles.firings}>\n {firings.map((f) => {\n const source = safeHref(f.source.url);\n const lane = safeHref(f.laneRef?.url);\n return (\n <li key={f.id} data-firing={f.id}>\n <StatusBadge status={f.state} tone={firingTone(f.state)}>{FIRING_LABEL[f.state]}</StatusBadge>\n <span className={styles.firingTitle}>\n {source ? <a href={source} target=\"_blank\" rel=\"noopener noreferrer\">{f.title}</a> : f.title}\n </span>\n <span className={styles.meta}>\n {names.get(f.automationId) ?? f.automationId} · {f.repo} · {LANE_LABEL[f.lane]} · {relativeTime(f.createdAt, now)}\n {lane ? <> · <a href={lane} target=\"_blank\" rel=\"noopener noreferrer\">open task</a></> : null}\n </span>\n {f.reason ? <span className={styles.meta}>{f.reason}</span> : null}\n </li>\n );\n })}\n </ul>\n </section>\n );\n}\n","/**\n * routes/verse/sections/AutomationsSection.tsx — the Automations tray\n * section (3.15). Takes no props, per the shell contract; its own lazy chunk\n * (the section glob in shell/section-modules.ts). Reached from the gear tray\n * and from ⌘K (\"Open Automations\", \"New automation…\").\n */\nimport { AutomationsView } from '../automations/AutomationsView.js';\n\nexport function AutomationsSection() {\n return <AutomationsView />;\n}\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/SetupChecklist-DAbAdrX4.js","assets/global-1SED_aTT.css","assets/SetupChecklist-BhZpFLsj.css"])))=>i.map(i=>d[i]);
2
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n,t as r}from"./index-BC5Uslm5.js";import{B as i,K as a,l as o,u as s,z as c}from"./global-w7KDTTi0.js";import{j as l}from"./VerseShared-Bf-XTHCh.js";import{n as u}from"./format-V6IiIMAL.js";import{t as d}from"./Button-CstSJwha.js";import{n as f,s as p}from"./icons-C3G-y5j2.js";import{a as m,s as h,u as ee}from"./surface-data-hufdOfpz.js";import{n as g}from"./nav-CUXtg-Iw.js";import{t as _}from"./clipboard-DkZdqlxf.js";var v=e(n(),1),y=`/api/verse/authority/setup`,b=`ashlr authority setup`,x=3e4,S=6e4;function C(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function w(e){return!C(e)||e.schema!==`ashlr.authority-setup.v1`||!Array.isArray(e.steps)?null:e.steps.every(e=>C(e)&&typeof e.id==`string`&&typeof e.step==`string`&&typeof e.status==`string`&&Array.isArray(e.needs))?e:null}function T(e){if(e)return e.value?e.value.next===`standing-grant`?`ready`:`setup`:`unknown`}var E=Object.freeze({sudo:`sudo`,"touch-id":`Touch ID`,browser:`Browser`,github:`GitHub`,terminal:`Terminal`});function D(e){return e.length>0?e[0].toUpperCase()+e.slice(1):e}function O(e,t){return e.status===`done`||e.status===`already`?`done`:e.id===t?e.status===`failed`?`failed`:e.status===`blocked`?`blocked`:`next`:e.status===`failed`?`failed`:e.status===`blocked`?`blocked`:`todo`}function k(e){return e.steps.map(t=>({id:t.id,label:D(t.step),mark:O(t,e.next),needs:t.needs.filter(e=>e in E).map(e=>({id:e,label:E[e]})),detail:t.detail,command:t.command??null,link:t.link??null}))}function A(e){let t=e.split(/`([^`\n]+)`/u).map((e,t)=>({text:e,code:t%2==1})).filter(e=>e.text.length>0),n=t[0];return n&&!n.code&&(t[0]={text:n.text[0].toUpperCase()+n.text.slice(1),code:!1}),t}function j(e){if(!e)return null;try{let t=new URL(e);return t.protocol===`https:`&&t.hostname===`github.com`&&!t.username&&!t.password?t.href:null}catch{return null}}function M(e){return{ready:e.steps.filter(e=>e.status===`done`||e.status===`already`).length,total:e.steps.length}}function N(e){return k(e).find(t=>t.id===e.next)??null}function P(e){if(!e)return b;let t=N(e);return t?t.mark===`blocked`?t.command:t.command??`ashlr authority setup`:null}function F(e){return e?e.darkSince===void 0?e.state===`dark`?e.lastActivityAt:null:e.darkSince:null}function I(e){let t=new Date(e);return`${t.getFullYear()}-${String(t.getMonth()+1).padStart(2,`0`)}-${String(t.getDate()).padStart(2,`0`)}`}function L(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleDateString(`en-US`,{month:`short`,day:`numeric`}):`an unknown day`}function R(e){let t=Date.parse(e);return Number.isFinite(t)?I(t):e}function z(e){let t=F(e),n=e.stateReason?.trim()||void 0;return t!==null&&Number.isFinite(Date.parse(t))?{kind:`dark`,since:R(t),detail:n}:n?{kind:`empty`,message:`Fleet dark. ${u(n)}`}:{kind:`empty`,message:`Fleet dark.`}}function B(e){return e.kind===`dark`?{kind:`empty`,message:`Nothing produced since ${L(e.since)}.`}:e}var V={section:`fleet`,anchor:null,label:`Open Fleet`},H={section:`fleet`,anchor:`fleet-control`};function U(e){let t=e?.trim();return t?/[.!?…]$/.test(t)?t:`${t}.`:null}var W={paused:`Grant paused`,expired:`Grant expired`,revoked:`Grant revoked`,invalid:`Grant invalid`};function G({authority:e,live:t,quietSince:n=null,readiness:r=`unknown`,setup:i=null}){if(!e&&!t)return null;let a=F(t),o={since:a?`Fleet dark since ${L(a)}`:n?`Nothing produced since ${L(n)}`:null,tone:`neutral`,command:null,go:null,grant:null,setup:null};if(e?.kill||t?.state===`stopped`)return{...o,kind:`stopped`,tone:`danger`,title:`Fleet stopped`,why:`Nothing new starts until you resume it.`,go:{...H,label:`Start in Fleet`}};if(e){let t=e.grant.state;if(t===`none`&&r===`setup`)return{...o,kind:`setup`,title:`Autonomy is off`,why:`Nothing runs or merges on its own until the one-time setup is done.`,command:P(i)??`ashlr authority setup`,setup:i};if(t===`none`)return{...o,kind:`grant`,title:`Autonomy is off`,why:`Approve a standing grant to let the fleet work.`,go:{...H,label:`Approve in Fleet`},grant:{intent:`grant`,label:`Approve grant`},setup:i};if(t!==`active`){let e=t===`paused`;return{...o,kind:`grant`,tone:`warning`,title:W[t],why:e?`Autonomy is off until you re-approve it.`:`Autonomy is off until you approve a new grant.`,go:{...H,label:e?`Re-approve in Fleet`:`Approve in Fleet`},grant:e?{intent:`re-approve`,label:`Re-approve grant`}:{intent:`grant`,label:`Approve grant`}}}if(e.effectiveSwitch===`off`)return{...o,kind:`off`,title:`Autonomy is off`,why:e.switch===`off`?`Switch it to Propose or Autonomous to start the fleet.`:U(e.effectiveReason)??`Something holds the switch at Off.`,go:{...H,label:`Start in Fleet`}}}return t?.state===`dark`?{...o,kind:`dark`,title:`Fleet is dark`,why:U(t.stateReason)??`The daemon runs nothing on its own.`,go:V}:t?.state===`paused`?{...o,kind:`paused`,tone:`warning`,title:`Fleet paused`,why:U(t.stateReason)??`The daemon is parked; your own tools still work.`,go:V}:n&&t?.state!==`running`?{...o,kind:`quiet`,title:`Fleet is quiet`,why:`Autonomy is on, but no runs or proposals were filed.`,go:V}:null}var K={state:`_state_pnun3_8`,head:`_head_pnun3_20`,titleRow:`_titleRow_pnun3_29`,dot:`_dot_pnun3_36`,title:`_title_pnun3_29`,since:`_since_pnun3_61`,why:`_why_pnun3_69`,command:`_command_pnun3_78`,code:`_code_pnun3_92`,prompt:`_prompt_pnun3_102`,action:`_action_pnun3_107`,visuallyHidden:`_visuallyHidden_pnun3_111`},q=t(),J=(0,v.lazy)(()=>r(()=>import(`./SetupChecklist-DAbAdrX4.js`),__vite__mapDeps([0,1,2]))),Y=1200,X=6e4,Z=ee(`verse-authority-setup`,y,`The setup checklist`,w);function Q(e){let t=Z.key,n=(0,v.useSyncExternalStore)((0,v.useCallback)(e=>a(t,e),[t]),()=>i(t),()=>i(t));(0,v.useEffect)(()=>{e&&c(t,()=>Z.fetch(),x)},[e,t]);let r=s(Z);return l(r,S,{enabled:e,refreshOnShow:!1}),e?{readiness:T(n.data),report:n.data?.value??null}:{readiness:`unknown`,report:null}}function te(e=null){let t=o(m,{freshMs:3e4}),n=o(h,{freshMs:1e4}),r=s(m),i=s(h);l(()=>{r(),i()},X);let a=Q(t.data?.value?.grant.state===`none`);if(t.data&&n.data&&a.readiness!==void 0)return G({authority:t.data.value,live:n.data.value,quietSince:e,readiness:a.readiness,setup:a.report})}function $({command:e}){let[t,n]=(0,v.useState)(`idle`),r=(0,v.useRef)(null);(0,v.useEffect)(()=>()=>{r.current&&clearTimeout(r.current)},[]);let i=async()=>{let t=await _(e);n(t?`copied`:`failed`),r.current&&clearTimeout(r.current),r.current=setTimeout(()=>n(`idle`),Y)};return(0,q.jsxs)(`div`,{className:K.command,"data-state":t,children:[(0,q.jsxs)(`code`,{className:K.code,children:[(0,q.jsx)(`span`,{className:K.prompt,"aria-hidden":`true`,children:`$ `}),e]}),(0,q.jsx)(d,{variant:`primary`,size:`sm`,icon:t===`copied`?(0,q.jsx)(f,{}):(0,q.jsx)(p,{}),onClick:()=>void i(),"aria-label":`Copy the command: ${e}`,children:t===`copied`?`Copied`:`Copy`}),(0,q.jsx)(`span`,{className:K.visuallyHidden,role:`status`,"aria-live":`polite`,children:t===`copied`?`Copied`:t===`failed`?`Copy failed. Select the command and copy it yourself.`:``})]})}function ne({state:e,here:t,title:n,why:r,onGrant:i}){let a=(0,v.useId)(),o=e?.go&&e.go.section!==t?e.go:null,s=i&&e?.grant?e.grant:null,c=null;e?.command?c=(0,q.jsx)($,{command:e.command}):s?c=(0,q.jsx)(`div`,{className:K.action,children:(0,q.jsx)(d,{variant:`primary`,size:`sm`,onClick:()=>i?.(s.intent),children:s.label})}):o&&(c=(0,q.jsx)(`div`,{className:K.action,children:(0,q.jsx)(d,{variant:`primary`,size:`sm`,onClick:()=>g(o.section,o.anchor),children:o.label})}));let l=r===void 0?e?n?`${e.title}. ${e.why}`:e.why:null:r;return(0,q.jsxs)(`section`,{className:K.state,"aria-labelledby":a,"data-kind":e?.kind??`none`,"data-testid":`autonomy-off`,children:[(0,q.jsxs)(`header`,{className:K.head,children:[(0,q.jsxs)(`span`,{className:K.titleRow,children:[(0,q.jsx)(`span`,{className:K.dot,"data-tone":e?.tone??`neutral`,"aria-hidden":`true`}),(0,q.jsx)(`h3`,{id:a,className:K.title,children:n??e?.title??``})]}),e?.since?(0,q.jsx)(`span`,{className:K.since,children:e.since}):null]}),l?(0,q.jsx)(`p`,{className:K.why,children:l}):null,e?.setup?(0,q.jsx)(v.Suspense,{fallback:c,children:(0,q.jsx)(J,{report:e.setup,action:c})}):c]})}export{G as a,z as c,P as d,N as f,k as h,Q as i,B as l,M as m,$ as n,L as o,j as p,te as r,F as s,ne as t,A as u};
3
+ //# sourceMappingURL=AutonomyOffState-nO9lIcCv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/autonomy/setup-checklist-model.ts","../../../../../../src/web-ui/routes/verse/fleet/dark-since.ts","../../../../../../src/web-ui/routes/verse/autonomy/autonomy-off-model.ts","../../../../../../src/web-ui/routes/verse/autonomy/AutonomyOffState.tsx"],"sourcesContent":["/**\n * routes/verse/autonomy/setup-checklist-model.ts — the live setup checklist,\n * read from GET /api/verse/authority/setup (the server's own\n * `ashlr authority setup --dry-run --json`, AuthoritySetupReportV1).\n *\n * It answers three things for the \"Autonomy is off\" state and onboarding:\n * - how far setup is (every step, done ✓ or not, what each needs from you);\n * - the ONE next step and the exact command that moves it on;\n * - whether the next step is approving the grant — the only time Verse asks\n * the server to draft one (the Touch ID sheet, on click). Before that the\n * draft route answers 409 `no-trust-roots`, so it is never read on load.\n *\n * Framework-free; tested directly.\n */\nimport type { AuthoritySetupNeed, AuthoritySetupReportV1, AuthoritySetupStepV1 } from '../../../../core/authority/types.js';\n\nexport const AUTHORITY_SETUP_PATH = '/api/verse/authority/setup';\n\n/** The one command that walks every step, resuming where the last run stopped. */\nexport const SETUP_COMMAND = 'ashlr authority setup';\n\n/** Reruns of setup happen in a terminal; a minute-old checklist is fine, and the server caches 30 s. */\nexport const SETUP_FRESH_MS = 30_000;\nexport const SETUP_POLL_MS = 60_000;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/** Structural guard: the schema tag, and steps shaped enough to render. */\nexport function narrowSetupReport(raw: unknown): AuthoritySetupReportV1 | null {\n if (!isRecord(raw) || raw['schema'] !== 'ashlr.authority-setup.v1' || !Array.isArray(raw['steps'])) return null;\n const ok = (raw['steps'] as unknown[]).every((s) => isRecord(s) && typeof s['id'] === 'string' && typeof s['step'] === 'string' && typeof s['status'] === 'string' && Array.isArray(s['needs']));\n return ok ? (raw as unknown as AuthoritySetupReportV1) : null;\n}\n\n/**\n * Where setup stands, as the \"Autonomy is off\" state needs it:\n * `ready` — everything before the standing grant is in place, so approving\n * it (Touch ID, on Command) is the next step;\n * `setup` — an earlier step is open: the checklist's next action;\n * `unknown` — the checklist did not answer.\n * Undefined while the read is in flight.\n */\nexport type SetupReadiness = 'ready' | 'setup' | 'unknown';\n\nexport function setupReadiness(read: { value: AuthoritySetupReportV1 | null } | undefined): SetupReadiness | undefined {\n if (!read) return undefined;\n if (!read.value) return 'unknown';\n return read.value.next === 'standing-grant' ? 'ready' : 'setup';\n}\n\nexport const NEED_LABEL: Readonly<Record<AuthoritySetupNeed, string>> = Object.freeze({\n sudo: 'sudo',\n 'touch-id': 'Touch ID',\n browser: 'Browser',\n github: 'GitHub',\n terminal: 'Terminal',\n});\n\nexport type SetupRowMark = 'done' | 'next' | 'todo' | 'blocked' | 'failed';\n\nexport interface SetupRow {\n id: string;\n /** \"GitHub App\", \"Custody helper\" — the CLI's step name, sentence-cased. */\n label: string;\n mark: SetupRowMark;\n needs: { id: AuthoritySetupNeed; label: string }[];\n detail: string;\n command: string | null;\n link: string | null;\n}\n\nfunction label(step: string): string {\n return step.length > 0 ? step[0]!.toUpperCase() + step.slice(1) : step;\n}\n\nfunction markOf(step: AuthoritySetupStepV1, next: string | null): SetupRowMark {\n if (step.status === 'done' || step.status === 'already') return 'done';\n if (step.id === next) return step.status === 'failed' ? 'failed' : step.status === 'blocked' ? 'blocked' : 'next';\n if (step.status === 'failed') return 'failed';\n if (step.status === 'blocked') return 'blocked';\n return 'todo';\n}\n\nexport function setupRows(report: AuthoritySetupReportV1): SetupRow[] {\n return report.steps.map((step) => ({\n id: step.id,\n label: label(step.step),\n mark: markOf(step, report.next),\n needs: step.needs.filter((n): n is AuthoritySetupNeed => n in NEED_LABEL).map((n) => ({ id: n, label: NEED_LABEL[n] })),\n detail: step.detail,\n command: step.command ?? null,\n link: step.link ?? null,\n }));\n}\n\n/**\n * A step's detail as the CLI wrote it (\"run `sudo scripts/install-custody.sh`\n * from …\"), split so commands in backticks render as code, first letter\n * capitalised — the CLI prints it after \"step: \", Verse on its own line.\n */\nexport function detailParts(detail: string): { text: string; code: boolean }[] {\n const pieces = detail.split(/`([^`\\n]+)`/u);\n const parts = pieces.map((text, i) => ({ text, code: i % 2 === 1 })).filter((p) => p.text.length > 0);\n const first = parts[0];\n if (first && !first.code) parts[0] = { text: first.text[0]!.toUpperCase() + first.text.slice(1), code: false };\n return parts;\n}\n\n/** A step's page, only when it is a plain https://github.com/ address (the App's install page, the trust-root PR). */\nexport function safeSetupLink(link: string | null): string | null {\n if (!link) return null;\n try {\n const url = new URL(link);\n return url.protocol === 'https:' && url.hostname === 'github.com' && !url.username && !url.password ? url.href : null;\n } catch {\n return null;\n }\n}\n\n/** \"6 of 15 ready\" — steps done or already in place. */\nexport function setupProgress(report: AuthoritySetupReportV1): { ready: number; total: number } {\n return { ready: report.steps.filter((s) => s.status === 'done' || s.status === 'already').length, total: report.steps.length };\n}\n\n/** The next step's row, or null when every step is in place. */\nexport function nextRow(report: AuthoritySetupReportV1): SetupRow | null {\n return setupRows(report).find((row) => row.id === report.next) ?? null;\n}\n\n/**\n * The command to copy for the next step: the step's own (sudo for the\n * helper, the build after the trust-root PR, …), else the setup command\n * (rerun-safe, it resumes where it stopped). A blocked step offers only the\n * command it names itself (e.g. the grant that unblocks the resident step);\n * null when nothing on this Mac moves it (not a compiled release, …).\n */\nexport function nextCommand(report: AuthoritySetupReportV1 | null): string | null {\n if (!report) return SETUP_COMMAND;\n const row = nextRow(report);\n if (!row) return null;\n if (row.mark === 'blocked') return row.command;\n return row.command ?? SETUP_COMMAND;\n}\n","/**\n * routes/verse/fleet/dark-since.ts — the ONE \"Fleet dark since …\" (3.10.1).\n *\n * 3.10.0 said it three ways: Command and Fleet took the live snapshot's\n * `lastActivityAt` (\"Sep 1\"), Growth took fleet history's `darkSince` (\"Aug\n * 18\"), and Command fell back to history whenever the live read was not dark.\n * Those are two different facts:\n *\n * dark since — autonomy is shut (no standing grant, or no daemon) and\n * the fleet last showed any sign of life then. Served once,\n * as `FleetLiveSnapshotV1.darkSince` (core/verse/\n * fleet-live-api.ts `fleetDarkSince`). Only this value may be\n * worded \"Fleet dark since …\".\n * quiet since — fleet history's `darkSince`: the last run started or\n * proposal filed. Worded \"Nothing produced since …\"\n * (`quietSinceStatus`), never \"dark\".\n *\n * Dates are the viewer's LOCAL calendar day everywhere (\"Sep 1\"), so the\n * verdict line and the chart beside it can never name different days.\n *\n * Framework-free; tested directly.\n */\nimport type { FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { ChartStatus } from '../../../components/charts/ChartFrame.js';\nimport { asSentence } from '../autonomy/format.js';\n\n/**\n * The fleet's dark-since instant, or null when the fleet is not dark. A\n * pre-3.10.1 server sends no `darkSince`; the same rule is applied to what it\n * does send.\n */\nexport function fleetDarkSince(live: FleetLiveSnapshotV1 | null | undefined): string | null {\n if (!live) return null;\n if (live.darkSince !== undefined) return live.darkSince;\n return live.state === 'dark' ? live.lastActivityAt : null;\n}\n\n/** The viewer's local calendar day for an instant, as `YYYY-MM-DD`. */\nfunction localDay(ms: number): string {\n const d = new Date(ms);\n return `${d.getFullYear()}-${String(d.getMonth() + 1).padStart(2, '0')}-${String(d.getDate()).padStart(2, '0')}`;\n}\n\n/** \"Sep 1\" — the viewer's local day for `iso`. */\nexport function darkSinceLabel(iso: string): string {\n const ms = Date.parse(iso);\n if (!Number.isFinite(ms)) return 'an unknown day';\n return new Date(ms).toLocaleDateString('en-US', { month: 'short', day: 'numeric' });\n}\n\n/**\n * `iso` as the viewer's local `YYYY-MM-DD`, for ChartFrame's dark state:\n * ChartFrame labels the day it is GIVEN (a bare ISO instant would be cut to\n * its UTC day, which an evening west of UTC turns into tomorrow).\n */\nexport function darkSinceDay(iso: string): string {\n const ms = Date.parse(iso);\n return Number.isFinite(ms) ? localDay(ms) : iso;\n}\n\n/**\n * The chart state for a DARK live fleet, from THE dark-since instant: \"Fleet\n * dark since Sep 1\" (the viewer's local day). When the server knows the fleet\n * is dark but not since when (`darkSince: null` — a fresh install, a cleared\n * ledger and journal), it says just \"Fleet dark.\", as Command's line does —\n * never \"since <today>\" from the snapshot's own `generatedAt`.\n */\nexport function fleetDarkStatus(live: FleetLiveSnapshotV1): ChartStatus {\n const since = fleetDarkSince(live);\n const detail = live.stateReason?.trim() || undefined;\n if (since !== null && Number.isFinite(Date.parse(since))) return { kind: 'dark', since: darkSinceDay(since), detail };\n if (!detail) return { kind: 'empty', message: 'Fleet dark.' };\n return { kind: 'empty', message: `Fleet dark. ${asSentence(detail)}` };\n}\n\n/**\n * A chart status built over fleet HISTORY, re-worded: history's `darkSince`\n * is \"quiet since\" (the last run or proposal), so its dark state becomes a\n * plain \"Nothing produced since Aug 18.\" Every other status passes\n * through untouched.\n */\nexport function quietSinceStatus(status: ChartStatus): ChartStatus {\n if (status.kind !== 'dark') return status;\n return { kind: 'empty', message: `Nothing produced since ${darkSinceLabel(status.since)}.` };\n}\n","/**\n * routes/verse/autonomy/autonomy-off-model.ts — the ONE \"autonomy is off\"\n * decision every fleet surface (Command, Fleet, Growth, Mind) renders.\n *\n * Before this, a dormant fleet showed up as a wall of identical empty cards\n * (\"No fleet runs or proposals since Aug 18.\" six times on Growth, five dashes\n * on Command). Each surface now asks this model once and, when it answers,\n * shows a single state that says what is off, why it matters, and the one\n * thing that turns it back on.\n *\n * Precedence (first match wins):\n * stopped — Stop is in force (authority `kill`, or the live view says so);\n * setup — no grant, and the setup checklist (GET /api/verse/authority/\n * setup) says a step before the grant is still open: its next\n * step's command (setup is rerun-safe, it resumes);\n * grant — no grant, and everything before it is in place (or the\n * checklist did not answer), or it is paused, expired, revoked\n * or invalid: approve it (Touch ID, on Command);\n * off — a grant is in force but the switch holds autonomy at Off;\n * dark — the live view is dark for another reason (daemon not running);\n * paused — the daemon is parked;\n * quiet — autonomy is on but nothing was produced lately (fleet\n * history's \"quiet since\"); never worded \"dark\".\n * null — autonomy is on and producing (or nothing has answered yet).\n *\n * Only the live snapshot's `darkSince` may be worded \"Fleet dark since …\"\n * (fleet/dark-since.ts); history's date is \"Nothing produced since …\".\n *\n * Framework-free; tested directly.\n */\nimport type { AuthoritySetupReportV1, AuthorityStatusV1 } from '../../../../core/authority/types.js';\nimport type { FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { WorkbenchSectionId } from '../../../../core/verse/workbench-types.js';\nimport { darkSinceLabel, fleetDarkSince } from '../fleet/dark-since.js';\nimport { SETUP_COMMAND, nextCommand, type SetupReadiness } from './setup-checklist-model.js';\n\nexport { SETUP_COMMAND } from './setup-checklist-model.js';\n\nexport type AutonomyOffKind = 'stopped' | 'setup' | 'grant' | 'off' | 'dark' | 'paused' | 'quiet';\n\nexport interface AutonomyOffState {\n kind: AutonomyOffKind;\n /** The dot: neutral for a fleet that was never switched on, warning for a lapse, danger for Stop. */\n tone: 'neutral' | 'warning' | 'danger';\n /** \"Autonomy is off\" — what is off, in three or four words. */\n title: string;\n /** Why it matters, one line. */\n why: string;\n /** \"Fleet dark since Sep 1\" / \"Nothing produced since Aug 18\"; null when no date is known. */\n since: string | null;\n /** The primary action when it is a command to run (copied, never executed). */\n command: string | null;\n /** The primary action when it is a place in the app. */\n go: { section: WorkbenchSectionId; anchor: string | null; label: string } | null;\n /** Command's own action: open the Touch ID sheet with this intent (it holds the sheet). */\n grant: { intent: 'grant' | 're-approve'; label: string } | null;\n /** The live setup checklist while there is no grant; null when it is not known or not relevant. */\n setup: AuthoritySetupReportV1 | null;\n}\n\nexport interface AutonomyOffInputs {\n /** The authority read's value; null = the service did not answer. */\n authority: AuthorityStatusV1 | null;\n /** The live fleet read's value; null = the view did not answer. */\n live: FleetLiveSnapshotV1 | null;\n /** Fleet history's `darkSince` (\"quiet since\"); null = produced within 48 h, or unknown. */\n quietSince?: string | null;\n /** Where setup stands (`setupReadiness`); only consulted when there is no grant. */\n readiness?: SetupReadiness;\n /** The checklist itself, when it answered. */\n setup?: AuthoritySetupReportV1 | null;\n}\n\n// 3.15: the fleet is operated on the Fleet tab (its control surface: Start,\n// the grant sheet and editor, the daemon), so every off state points there.\nconst GO_FLEET = { section: 'fleet', anchor: null, label: 'Open Fleet' } as const;\nconst GO_FLEET_CONTROL = { section: 'fleet', anchor: 'fleet-control' } as const;\n\nfunction sentence(text: string | null | undefined): string | null {\n const t = text?.trim();\n if (!t) return null;\n return /[.!?…]$/.test(t) ? t : `${t}.`;\n}\n\nconst GRANT_TITLE = { paused: 'Grant paused', expired: 'Grant expired', revoked: 'Grant revoked', invalid: 'Grant invalid' } as const;\n\nexport function autonomyOffState({ authority, live, quietSince = null, readiness = 'unknown', setup = null }: AutonomyOffInputs): AutonomyOffState | null {\n if (!authority && !live) return null;\n const dark = fleetDarkSince(live);\n const since = dark\n ? `Fleet dark since ${darkSinceLabel(dark)}`\n : quietSince\n ? `Nothing produced since ${darkSinceLabel(quietSince)}`\n : null;\n const base = { since, tone: 'neutral' as const, command: null, go: null, grant: null, setup: null };\n\n if (authority?.kill || live?.state === 'stopped') {\n return { ...base, kind: 'stopped', tone: 'danger', title: 'Fleet stopped', why: 'Nothing new starts until you resume it.', go: { ...GO_FLEET_CONTROL, label: 'Start in Fleet' } };\n }\n\n if (authority) {\n const grant = authority.grant.state;\n if (grant === 'none' && readiness === 'setup') {\n return {\n ...base,\n kind: 'setup',\n title: 'Autonomy is off',\n why: 'Nothing runs or merges on its own until the one-time setup is done.',\n command: nextCommand(setup) ?? SETUP_COMMAND,\n setup,\n };\n }\n if (grant === 'none') {\n return {\n ...base,\n kind: 'grant',\n title: 'Autonomy is off',\n why: 'Approve a standing grant to let the fleet work.',\n go: { ...GO_FLEET_CONTROL, label: 'Approve in Fleet' },\n grant: { intent: 'grant', label: 'Approve grant' },\n setup,\n };\n }\n if (grant !== 'active') {\n const paused = grant === 'paused';\n return {\n ...base,\n kind: 'grant',\n tone: 'warning',\n title: GRANT_TITLE[grant],\n why: paused ? 'Autonomy is off until you re-approve it.' : 'Autonomy is off until you approve a new grant.',\n go: { ...GO_FLEET_CONTROL, label: paused ? 'Re-approve in Fleet' : 'Approve in Fleet' },\n grant: paused ? { intent: 're-approve', label: 'Re-approve grant' } : { intent: 'grant', label: 'Approve grant' },\n };\n }\n if (authority.effectiveSwitch === 'off') {\n return {\n ...base,\n kind: 'off',\n title: 'Autonomy is off',\n why: authority.switch === 'off' ? 'Switch it to Propose or Autonomous to start the fleet.' : (sentence(authority.effectiveReason) ?? 'Something holds the switch at Off.'),\n go: { ...GO_FLEET_CONTROL, label: 'Start in Fleet' },\n };\n }\n }\n\n if (live?.state === 'dark') {\n return { ...base, kind: 'dark', title: 'Fleet is dark', why: sentence(live.stateReason) ?? 'The daemon runs nothing on its own.', go: GO_FLEET };\n }\n if (live?.state === 'paused') {\n return { ...base, kind: 'paused', tone: 'warning', title: 'Fleet paused', why: sentence(live.stateReason) ?? 'The daemon is parked; your own tools still work.', go: GO_FLEET };\n }\n if (quietSince && live?.state !== 'running') {\n return { ...base, kind: 'quiet', title: 'Fleet is quiet', why: 'Autonomy is on, but no runs or proposals were filed.', go: GO_FLEET };\n }\n return null;\n}\n","/**\n * routes/verse/autonomy/AutonomyOffState.tsx — the one \"autonomy is off\"\n * state Command, Fleet, Growth and Mind show in place of their empty cards.\n *\n * ● Autonomy is off Fleet dark since Sep 1\n * Nothing runs or merges on its own until the one-time setup is done.\n * NEXT GitHub App Browser · GitHub\n * The ashlr-fleet key is in custody, but the App is not installed on …\n * [ $ ashlr authority setup ⧉ Copy ]\n * ▸ 6 of 15 ready ✓✓✓✓✓✓●○○○○○○○×\n *\n * One title, one line of why, ONE primary action: copy the next step's\n * command, approve the grant, or go to the surface that has the control (left\n * out when that surface is the one showing the state — its control is already\n * on screen). The decision is autonomy-off-model.ts; the checklist is\n * GET /api/verse/authority/setup (setup-checklist-model.ts), rendered by the\n * lazily loaded SetupChecklist. The grant draft is never read here: only the\n * Touch ID sheet drafts, when the operator opens it.\n */\nimport { lazy, Suspense, useCallback, useEffect, useId, useRef, useState, useSyncExternalStore, type ReactNode } from 'react';\nimport type { AuthoritySetupReportV1 } from '../../../../core/authority/types.js';\nimport type { WorkbenchSectionId } from '../../../../core/verse/workbench-types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { copyText } from '../../../components/primitives/clipboard.js';\nimport { IconCheck, IconCopy } from '../../../components/primitives/icons.js';\nimport { ensureQuery, getQuerySnapshot, subscribeQuery } from '../../../data/cache.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { goToSection } from '../command/nav.js';\nimport { authorityQuery, fleetLiveQuery, optionalQuery, type OptionalRead } from '../command/surface-data.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { autonomyOffState, type AutonomyOffState as OffState } from './autonomy-off-model.js';\nimport {\n AUTHORITY_SETUP_PATH,\n narrowSetupReport,\n SETUP_FRESH_MS,\n SETUP_POLL_MS,\n setupReadiness,\n type SetupReadiness,\n} from './setup-checklist-model.js';\nimport styles from './autonomy-off.module.css';\n\n// Split off the state's own chunk: the checklist renders only while autonomy\n// is off, and never on the chat first-paint path.\nconst SetupChecklist = lazy(() => import('./SetupChecklist.js'));\n\n/** How long \"Copied\" stays on the button (SPEC-310C §4's copy-pill timing). */\nconst COPIED_MS = 1_200;\n\n/** Authority and the live view move slowly while autonomy is off; a minute is plenty for a state. */\nexport const AUTONOMY_OFF_POLL_MS = 60_000;\n\n/** GET /api/verse/authority/setup — the server's own `ashlr authority setup --dry-run --json`. */\nexport const authoritySetupQuery = optionalQuery('verse-authority-setup', AUTHORITY_SETUP_PATH, 'The setup checklist', narrowSetupReport);\n\nexport interface SetupChecklistRead {\n /** Undefined while the first read is in flight; 'unknown' when not enabled or unanswered. */\n readiness: SetupReadiness | undefined;\n report: AuthoritySetupReportV1 | null;\n}\n\n/**\n * The live setup checklist — read ONLY while `enabled` (there is no grant),\n * refreshed every minute while it is on screen, so reruns of setup in a\n * terminal show up without a reload. An active fleet never reads it.\n */\nexport function useSetupChecklist(enabled: boolean): SetupChecklistRead {\n const key = authoritySetupQuery.key;\n const snap = useSyncExternalStore(\n useCallback((listener: () => void) => subscribeQuery(key, listener), [key]),\n () => getQuerySnapshot<OptionalRead<AuthoritySetupReportV1>>(key),\n () => getQuerySnapshot<OptionalRead<AuthoritySetupReportV1>>(key),\n );\n useEffect(() => {\n if (enabled) void ensureQuery(key, () => authoritySetupQuery.fetch(), SETUP_FRESH_MS);\n }, [enabled, key]);\n const refetch = useRefetch(authoritySetupQuery);\n usePollWhileVisible(refetch, SETUP_POLL_MS, { enabled, refreshOnShow: false });\n if (!enabled) return { readiness: 'unknown', report: null };\n return { readiness: setupReadiness(snap.data), report: snap.data?.value ?? null };\n}\n\n/**\n * The state for a surface that does not hold the authority / live reads\n * itself. Undefined until everything it needs has answered (so a loading\n * surface never flashes \"off\"); null when autonomy is on.\n */\nexport function useAutonomyOff(quietSince: string | null = null): OffState | null | undefined {\n const authority = useQuery(authorityQuery, { freshMs: 30_000 });\n const live = useQuery(fleetLiveQuery, { freshMs: 10_000 });\n const refetchAuthority = useRefetch(authorityQuery);\n const refetchLive = useRefetch(fleetLiveQuery);\n usePollWhileVisible(() => {\n refetchAuthority();\n refetchLive();\n }, AUTONOMY_OFF_POLL_MS);\n const noGrant = authority.data?.value?.grant.state === 'none';\n const setup = useSetupChecklist(noGrant);\n if (!authority.data || !live.data || setup.readiness === undefined) return undefined;\n return autonomyOffState({ authority: authority.data.value, live: live.data.value, quietSince, readiness: setup.readiness, setup: setup.report });\n}\n\nexport function CopyCommand({ command }: { command: string }) {\n const [state, setState] = useState<'idle' | 'copied' | 'failed'>('idle');\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n useEffect(() => () => { if (timer.current) clearTimeout(timer.current); }, []);\n const copy = async () => {\n const ok = await copyText(command);\n setState(ok ? 'copied' : 'failed');\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setState('idle'), COPIED_MS);\n };\n return (\n <div className={styles.command} data-state={state}>\n <code className={styles.code}>\n <span className={styles.prompt} aria-hidden=\"true\">$ </span>\n {command}\n </code>\n <Button\n variant=\"primary\"\n size=\"sm\"\n icon={state === 'copied' ? <IconCheck /> : <IconCopy />}\n onClick={() => void copy()}\n aria-label={`Copy the command: ${command}`}\n >\n {state === 'copied' ? 'Copied' : 'Copy'}\n </Button>\n <span className={styles.visuallyHidden} role=\"status\" aria-live=\"polite\">\n {state === 'copied' ? 'Copied' : state === 'failed' ? 'Copy failed. Select the command and copy it yourself.' : ''}\n </span>\n </div>\n );\n}\n\nexport interface AutonomyOffStateProps {\n /** The autonomy state; null = autonomy is on (a surface's own empty line, no action). */\n state: OffState | null;\n /** The surface showing it: a \"go to\" action pointing here is left out. */\n here: WorkbenchSectionId;\n /** A surface's own headline in place of the state's (\"Growth starts with the first fleet run.\"). */\n title?: string;\n /** A surface's own line in place of the state's why. */\n why?: string | null;\n /**\n * Command only: opens its Touch ID sheet. When given and the state carries\n * a grant action, that button is the primary action instead of \"go to\".\n */\n onGrant?: (intent: 'grant' | 're-approve') => void;\n}\n\nexport function AutonomyOffState({ state, here, title, why, onGrant }: AutonomyOffStateProps) {\n const titleId = useId();\n const go = state?.go && state.go.section !== here ? state.go : null;\n const grant = onGrant && state?.grant ? state.grant : null;\n let action: ReactNode = null;\n if (state?.command) action = <CopyCommand command={state.command} />;\n else if (grant) {\n action = (\n <div className={styles.action}>\n <Button variant=\"primary\" size=\"sm\" onClick={() => onGrant?.(grant.intent)}>\n {grant.label}\n </Button>\n </div>\n );\n } else if (go) {\n action = (\n <div className={styles.action}>\n <Button variant=\"primary\" size=\"sm\" onClick={() => goToSection(go.section, go.anchor)}>\n {go.label}\n </Button>\n </div>\n );\n }\n // A surface headline takes the title's place, so the state's own title\n // becomes the start of the line: \"Autonomy is off. Approve a standing grant…\"\n const line = why !== undefined ? why : !state ? null : title ? `${state.title}. ${state.why}` : state.why;\n return (\n <section className={styles.state} aria-labelledby={titleId} data-kind={state?.kind ?? 'none'} data-testid=\"autonomy-off\">\n <header className={styles.head}>\n <span className={styles.titleRow}>\n <span className={styles.dot} data-tone={state?.tone ?? 'neutral'} aria-hidden=\"true\" />\n <h3 id={titleId} className={styles.title}>{title ?? state?.title ?? ''}</h3>\n </span>\n {state?.since ? <span className={styles.since}>{state.since}</span> : null}\n </header>\n {line ? <p className={styles.why}>{line}</p> : null}\n {state?.setup ? (\n // Until the checklist chunk arrives, the action stands alone (never a blank gap).\n <Suspense fallback={action}>\n <SetupChecklist report={state.setup} action={action} />\n </Suspense>\n ) : action}\n </section>\n );\n}\n"],"file":"AutonomyOffState-nO9lIcCv.js"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./index-BC5Uslm5.js";import{n as t}from"./Advanced-fUyq-fpH.js";var n=e();function r(){return(0,n.jsx)(t,{})}export{r as AutonomySection};
2
+ //# sourceMappingURL=AutonomySection-DWYUPDP6.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutonomySection-DWYUPDP6.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/sections/AutonomySection.tsx"],"sourcesContent":["/**\n * routes/verse/sections/AutonomySection.tsx — the 3.9 rail entry for the\n * legacy Autonomy cockpit. 3.10 moved the cockpit to Fleet ▸ Advanced\n * (fleet/Advanced.tsx; SPEC-310C §5, unit C7); stored `autonomy` sections\n * migrate to Fleet (workbench-types migrateSectionId).\n *\n * WHY this wrapper still exists: the shell (C1) retires the old rail entry in\n * the same release, and until it lands the current rail still lazy-loads\n * `sections/AutonomySection.tsx` by name — deleting it first would turn the\n * rail item into a MissingSection. Delete this file once C1's rail no longer\n * lists `autonomy` (follow-up noted in the C7 report).\n */\nimport { FleetAdvanced } from '../fleet/Advanced.js';\n\nexport function AutonomySection() {\n return <FleetAdvanced />;\n}\n"],"mappings":"6FAcA,SAAgB,GAAkB,CAChC,OAAO,EAAA,EAAA,IAAA,CAAC,EAAD,CAAgB,CAAA,CACzB"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{l as r,u as i}from"./global-w7KDTTi0.js";import{wt as a}from"./VerseConsoleApp-DjPpZLo1.js";import{j as o}from"./VerseShared-Bf-XTHCh.js";import{t as s}from"./Button-CstSJwha.js";import{t as c}from"./Meter-VXI75VNe.js";import{t as l}from"./authority-model-BeDDHF22.js";import{a as u,c as d,d as f,l as p,n as m,t as h,u as g}from"./ladder-queries-BnYWjJoi.js";import{n as _}from"./nav-CUXtg-Iw.js";import{h as v}from"./live-model-BPyZCTr1.js";import{t as y}from"./autonomy-ladder.module-DDhzYLrs.js";var b=e(n(),1),x=t();function S({rung:e}){return(0,x.jsx)(`li`,{className:y.rungItem,children:(0,x.jsx)(a,{placement:`bottom`,content:(0,x.jsxs)(`span`,{className:y.rungTip,children:[(0,x.jsx)(`strong`,{children:e.label}),(0,x.jsx)(`span`,{children:e.mergeLine}),e.proposeLine?(0,x.jsx)(`span`,{children:e.proposeLine}):null,(0,x.jsx)(`span`,{children:e.capLine}),(0,x.jsx)(`span`,{children:e.exitLine})]}),children:(0,x.jsx)(`span`,{className:y.rung,"data-state":e.state,tabIndex:0,"aria-label":e.aria,"aria-current":e.state===`current`?`step`:void 0,children:e.label})})})}function C(e){return e.kill?{text:`Stopped`,tone:`danger`}:e.effectiveSwitch===`autonomous`?{text:l.autonomous,tone:`success`}:e.effectiveSwitch===`propose`?{text:`Propose only`,tone:`neutral`}:{text:`Off`,tone:`warning`}}function w({status:e,now:t,onReapprove:n,blocked:a}){let l=(0,b.useId)(),w=(0,b.useMemo)(()=>p(e),[e]),T=(0,b.useMemo)(()=>f(e),[e]),E=r(m,{freshMs:15e3}),D=i(m);if(o(D,h,{enabled:w!==null}),!w)return null;let O=d(e,t),k=C(e),A=g(T,E.data?E.data.value:void 0),j=e.effectiveSwitch!==e.switch&&e.effectiveReason?e.effectiveReason:null,M=O?`The standing grant has ${O.text.replace(/ left$/,``)} left. Re-approving continues the ladder from ${w.stageName}.`:``;return(0,x.jsxs)(`section`,{className:y.panel,"aria-labelledby":l,children:[(0,x.jsxs)(`header`,{className:y.head,children:[(0,x.jsx)(`span`,{id:l,className:y.micro,children:`Autonomy`}),(0,x.jsxs)(`span`,{className:y.stage,children:[w.stageName,` `,(0,x.jsxs)(`span`,{className:y.position,children:[`· `,w.position]})]}),(0,x.jsxs)(`span`,{className:y.switchState,"data-tone":k.tone,title:j??void 0,children:[(0,x.jsx)(v,{tone:k.tone}),k.text,j?(0,x.jsxs)(`span`,{className:y.held,children:[` — `,j.replace(/[.]$/,``)]}):null]}),(0,x.jsx)(`span`,{className:y.spacer}),O?(0,x.jsxs)(`span`,{className:y.grant,"data-tone":O.tone,title:`Grant active until ${O.until}`,children:[`Grant `,O.text,O.warn?(0,x.jsx)(s,{size:`sm`,variant:O.tone===`danger`?`primary`:`subtle`,disabled:a!==null,title:a??void 0,onClick:()=>n(M),children:`Re-approve`}):null]}):null]}),(0,x.jsx)(`ol`,{className:y.ladder,"aria-label":`Rollout ladder: stage ${w.position}`,children:w.rungs.map(e=>(0,x.jsx)(S,{rung:e},e.id))}),(0,x.jsx)(`div`,{className:y.progress,children:w.nextStageName?(0,x.jsxs)(x.Fragment,{children:[w.bars.map(e=>(0,x.jsx)(c,{className:y.meter,value:e.value,max:e.max,label:e.label,valueText:e.text,tone:e.met?`running`:`accent`,"aria-label":`${e.label}: ${e.text}${e.met?`, met`:``}`},e.key)),(0,x.jsxs)(`p`,{className:y.next,children:[w.met?`Every criterion met — ${w.nextStageName} on the next tick.`:w.nextLine?`Next: ${w.nextLine}.`:`Next: ${w.nextStageName}.`,w.otherUnmet.length>0?(0,x.jsxs)(`span`,{className:y.unmet,children:[` Also waiting on `,w.otherUnmet.join(`; `),`.`]}):null]})]}):(0,x.jsx)(`p`,{className:y.next,children:`Last signed stage — the ladder climbs no further under this grant.`})}),(0,x.jsxs)(`p`,{className:y.last,"data-tone":A.tone,role:`status`,children:[(0,x.jsx)(`span`,{className:y.micro,children:`Last`}),(0,x.jsxs)(`span`,{className:y.lastText,children:[A.text,A.at?(0,x.jsxs)(`span`,{className:y.when,children:[` · `,u(A.at,t)]}):null]}),(0,x.jsx)(`button`,{type:`button`,className:y.linkButton,onClick:()=>_(`fleet`,`shadow-decisions`),children:`All decisions →`})]})]})}export{w as AutonomyStatus,w as default};
2
+ //# sourceMappingURL=AutonomyStatus-C4Yp1JTY.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutonomyStatus-C4Yp1JTY.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/AutonomyStatus.tsx"],"sourcesContent":["/**\n * routes/verse/command/AutonomyStatus.tsx — what the ACTIVE fleet is doing\n * on its rollout ladder, on Command (3.14). It stands where the \"Autonomy is\n * off\" banner stands while autonomy is off, under the top bar (whose switch\n * and Stop it does not repeat):\n *\n * AUTONOMY Shadow · 1 of 8 ● Autonomous Grant 23 d left\n * [Shadow][2a][2b][2c][3a][3b][3c][3d] ← hover / focus: who merges, caps, exit\n * Would-merge digests 2 / 5 ▓▓░░░ Hours in stage 3.5 h / 12 h ▓░░ Next: 2a lets …\n * Last Would merge ashlrcode #12 — every gate passed. · 2 h ago All decisions →\n *\n * Every number is the server's (authority/rollout.ts evaluates the criteria;\n * core/verse/autonomy-ladder.ts shapes the ladder). Under 7 days the grant\n * line offers Re-approve, which opens the bar's ONE Touch ID sheet.\n *\n * LAZY: CommandSection loads this with React.lazy, only while a grant is\n * active — none of it is on the chat first-paint path.\n */\nimport { useId, useMemo } from 'react';\nimport type { AuthorityStatusV1 } from '../../../../core/authority/types.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { Meter } from '../../../components/primitives/Meter.js';\nimport { Tooltip } from '../../../components/primitives/Tooltip.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { usePollWhileVisible } from '../shell/section-visibility.js';\nimport { SWITCH_LABEL } from './authority-model.js';\nimport { ago, grantExpiry, ladderView, lastEvent, narrowLadder, type RungView } from './ladder-model.js';\nimport { DECISIONS_POLL_MS, decisionsQuery } from './ladder-queries.js';\nimport { goToSection } from './nav.js';\nimport { ChipDot } from './AutonomyBar.js';\nimport styles from './autonomy-ladder.module.css';\n\nexport interface AutonomyStatusProps {\n status: AuthorityStatusV1;\n now: number;\n /** Opens the bar's Touch ID sheet with the re-approve intent. */\n onReapprove: (why: string) => void;\n /** Read-only session or another action in flight: Re-approve is disabled, with this reason. */\n blocked: string | null;\n}\n\nfunction Rung({ rung }: { rung: RungView }) {\n return (\n <li className={styles.rungItem}>\n <Tooltip\n placement=\"bottom\"\n content={\n <span className={styles.rungTip}>\n <strong>{rung.label}</strong>\n <span>{rung.mergeLine}</span>\n {rung.proposeLine ? <span>{rung.proposeLine}</span> : null}\n <span>{rung.capLine}</span>\n <span>{rung.exitLine}</span>\n </span>\n }\n >\n <span className={styles.rung} data-state={rung.state} tabIndex={0} aria-label={rung.aria} aria-current={rung.state === 'current' ? 'step' : undefined}>\n {rung.label}\n </span>\n </Tooltip>\n </li>\n );\n}\n\nfunction switchWord(status: AuthorityStatusV1): { text: string; tone: 'success' | 'neutral' | 'danger' | 'warning' } {\n if (status.kill) return { text: 'Stopped', tone: 'danger' };\n if (status.effectiveSwitch === 'autonomous') return { text: SWITCH_LABEL.autonomous, tone: 'success' };\n if (status.effectiveSwitch === 'propose') return { text: 'Propose only', tone: 'neutral' };\n return { text: 'Off', tone: 'warning' };\n}\n\nexport function AutonomyStatus({ status, now, onReapprove, blocked }: AutonomyStatusProps) {\n const titleId = useId();\n const view = useMemo(() => ladderView(status), [status]);\n const ladder = useMemo(() => narrowLadder(status), [status]);\n const decisions = useQuery(decisionsQuery, { freshMs: 15_000 });\n const refetch = useRefetch(decisionsQuery);\n usePollWhileVisible(refetch, DECISIONS_POLL_MS, { enabled: view !== null });\n if (!view) return null;\n\n const expiry = grantExpiry(status, now);\n const sw = switchWord(status);\n const last = lastEvent(ladder, decisions.data ? decisions.data.value : undefined);\n const held = status.effectiveSwitch !== status.switch && status.effectiveReason ? status.effectiveReason : null;\n const reapproveWhy = expiry ? `The standing grant has ${expiry.text.replace(/ left$/, '')} left. Re-approving continues the ladder from ${view.stageName}.` : '';\n\n return (\n <section className={styles.panel} aria-labelledby={titleId}>\n <header className={styles.head}>\n <span id={titleId} className={styles.micro}>Autonomy</span>\n <span className={styles.stage}>\n {view.stageName} <span className={styles.position}>· {view.position}</span>\n </span>\n <span className={styles.switchState} data-tone={sw.tone} title={held ?? undefined}>\n <ChipDot tone={sw.tone} />\n {sw.text}\n {held ? <span className={styles.held}> — {held.replace(/[.]$/, '')}</span> : null}\n </span>\n <span className={styles.spacer} />\n {expiry ? (\n <span className={styles.grant} data-tone={expiry.tone} title={`Grant active until ${expiry.until}`}>\n Grant {expiry.text}\n {expiry.warn ? (\n <Button\n size=\"sm\"\n variant={expiry.tone === 'danger' ? 'primary' : 'subtle'}\n disabled={blocked !== null}\n title={blocked ?? undefined}\n onClick={() => onReapprove(reapproveWhy)}\n >\n Re-approve\n </Button>\n ) : null}\n </span>\n ) : null}\n </header>\n\n <ol className={styles.ladder} aria-label={`Rollout ladder: stage ${view.position}`}>\n {view.rungs.map((r) => <Rung key={r.id} rung={r} />)}\n </ol>\n\n <div className={styles.progress}>\n {view.nextStageName ? (\n <>\n {view.bars.map((bar) => (\n <Meter\n key={bar.key}\n className={styles.meter}\n value={bar.value}\n max={bar.max}\n label={bar.label}\n valueText={bar.text}\n tone={bar.met ? 'running' : 'accent'}\n aria-label={`${bar.label}: ${bar.text}${bar.met ? ', met' : ''}`}\n />\n ))}\n <p className={styles.next}>\n {view.met ? `Every criterion met — ${view.nextStageName} on the next tick.` : view.nextLine ? `Next: ${view.nextLine}.` : `Next: ${view.nextStageName}.`}\n {view.otherUnmet.length > 0 ? <span className={styles.unmet}> Also waiting on {view.otherUnmet.join('; ')}.</span> : null}\n </p>\n </>\n ) : (\n <p className={styles.next}>Last signed stage — the ladder climbs no further under this grant.</p>\n )}\n </div>\n\n <p className={styles.last} data-tone={last.tone} role=\"status\">\n <span className={styles.micro}>Last</span>\n <span className={styles.lastText}>\n {last.text}\n {last.at ? <span className={styles.when}> · {ago(last.at, now)}</span> : null}\n </span>\n <button type=\"button\" className={styles.linkButton} onClick={() => goToSection('fleet', 'shadow-decisions')}>\n All decisions →\n </button>\n </p>\n </section>\n );\n}\n\nexport default AutonomyStatus;\n"],"mappings":"knBAyCA,SAAS,EAAK,CAAE,QAA4B,CAC1C,OACE,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,SACpB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,UAAU,SACV,SACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAxB,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,SAAD,CAAA,SAAS,EAAK,KAAc,CAAA,GAC5B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAK,SAAgB,CAAA,EAC3B,EAAK,aAAc,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAK,WAAkB,CAAA,EAAI,MACtD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAK,OAAc,CAAA,GAC1B,EAAA,EAAA,IAAA,CAAC,OAAD,CAAA,SAAO,EAAK,QAAe,CAAA,CACvB,IAGR,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,aAAY,EAAK,MAAO,SAAU,EAAG,aAAY,EAAK,KAAM,eAAc,EAAK,QAAU,UAAY,OAAS,IAAA,GACzI,SAAA,EAAK,KACF,CAAA,CACC,CAAA,CACP,CAAA,CAER,CAEA,SAAS,EAAW,EAAiG,CAInH,OAHI,EAAO,KAAa,CAAE,KAAM,UAAW,KAAM,QAAS,EACtD,EAAO,kBAAoB,aAAqB,CAAE,KAAM,EAAa,WAAY,KAAM,SAAU,EACjG,EAAO,kBAAoB,UAAkB,CAAE,KAAM,eAAgB,KAAM,SAAU,EAClF,CAAE,KAAM,MAAO,KAAM,SAAU,CACxC,CAEA,SAAgB,EAAe,CAAE,SAAQ,MAAK,cAAa,WAAgC,CACzF,IAAM,GAAA,EAAU,EAAA,MAAA,CAAM,EAChB,GAAA,EAAO,EAAA,QAAA,KAAc,EAAW,CAAM,EAAG,CAAC,CAAM,CAAC,EACjD,GAAA,EAAS,EAAA,QAAA,KAAc,EAAa,CAAM,EAAG,CAAC,CAAM,CAAC,EACrD,EAAY,EAAS,EAAgB,CAAE,QAAS,IAAO,CAAC,EACxD,EAAU,EAAW,CAAc,EAEzC,GADA,EAAoB,EAAS,EAAmB,CAAE,QAAS,IAAS,IAAK,CAAC,EACtE,CAAC,EAAM,OAAO,KAElB,IAAM,EAAS,EAAY,EAAQ,CAAG,EAChC,EAAK,EAAW,CAAM,EACtB,EAAO,EAAU,EAAQ,EAAU,KAAO,EAAU,KAAK,MAAQ,IAAA,EAAS,EAC1E,EAAO,EAAO,kBAAoB,EAAO,QAAU,EAAO,gBAAkB,EAAO,gBAAkB,KACrG,EAAe,EAAS,0BAA0B,EAAO,KAAK,QAAQ,SAAU,EAAE,EAAE,gDAAgD,EAAK,UAAU,GAAK,GAE9J,OACE,EAAA,EAAA,KAAA,CAAC,UAAD,CAAS,UAAW,EAAO,MAAO,kBAAiB,EAAnD,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,KAA1B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,GAAI,EAAS,UAAW,EAAO,MAAO,SAAA,UAAc,CAAA,GAC1D,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,SAAA,CACG,EAAK,UAAU,KAAC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAxB,SAAA,CAAkC,KAAG,EAAK,QAAe,GACtE,KACN,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAa,YAAW,EAAG,KAAM,MAAO,GAAQ,IAAA,GAAxE,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,EAAD,CAAS,KAAM,EAAG,IAAO,CAAA,EACxB,EAAG,KACH,GAAO,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAxB,SAAA,CAA8B,MAAI,EAAK,QAAQ,OAAQ,EAAE,CAAQ,CAAI,CAAA,EAAA,IACzE,KACN,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAS,CAAA,EAChC,GACC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,YAAW,EAAO,KAAM,MAAO,sBAAsB,EAAO,QAA3F,SAAA,CAAoG,SAC3F,EAAO,KACb,EAAO,MACN,EAAA,EAAA,IAAA,CAAC,EAAD,CACE,KAAK,KACL,QAAS,EAAO,OAAS,SAAW,UAAY,SAChD,SAAU,IAAY,KACtB,MAAO,GAAW,IAAA,GAClB,YAAe,EAAY,CAAY,EACxC,SAAA,YAEO,CAAA,EACN,IACA,CACJ,CAAA,EAAA,IACE,KAER,EAAA,EAAA,IAAA,CAAC,KAAD,CAAI,UAAW,EAAO,OAAQ,aAAY,yBAAyB,EAAK,WACrE,SAAA,EAAK,MAAM,IAAK,IAAM,EAAA,EAAA,IAAA,CAAC,EAAD,CAAiB,KAAM,CAAI,EAAhB,EAAE,EAAc,CAAC,CACjD,CAAA,GAEJ,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,SACpB,SAAA,EAAK,eACJ,EAAA,EAAA,KAAA,CAAA,EAAA,SAAA,CAAA,SAAA,CACG,EAAK,KAAK,IAAK,IACd,EAAA,EAAA,IAAA,CAAC,EAAD,CAEE,UAAW,EAAO,MAClB,MAAO,EAAI,MACX,IAAK,EAAI,IACT,MAAO,EAAI,MACX,UAAW,EAAI,KACf,KAAM,EAAI,IAAM,UAAY,SAC5B,aAAY,GAAG,EAAI,MAAM,IAAI,EAAI,OAAO,EAAI,IAAM,QAAU,IAC7D,EARM,EAAI,GAQV,CACF,GACD,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAArB,SAAA,CACG,EAAK,IAAM,yBAAyB,EAAK,cAAc,oBAAsB,EAAK,SAAW,SAAS,EAAK,SAAS,GAAK,SAAS,EAAK,cAAc,GACrJ,EAAK,WAAW,OAAS,GAAI,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAxB,SAAA,CAA+B,oBAAkB,EAAK,WAAW,KAAK,IAAI,EAAE,GAAO,CAAI,CAAA,EAAA,IACpH,CACH,CAAA,CAAA,CAAA,CAAA,GAEF,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,SAAA,oEAAqE,CAAA,CAE/F,CAAA,GAEL,EAAA,EAAA,KAAA,CAAC,IAAD,CAAG,UAAW,EAAO,KAAM,YAAW,EAAK,KAAM,KAAK,SAAtD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,MAAO,SAAA,MAAU,CAAA,GACzC,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,SAAxB,SAAA,CACG,EAAK,KACL,EAAK,IAAK,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAxB,SAAA,CAA8B,MAAI,EAAI,EAAK,GAAI,CAAG,CAAQ,CAAI,CAAA,EAAA,IACrE,KACN,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,WAAY,YAAe,EAAY,QAAS,kBAAkB,EAAG,SAAA,iBAErG,CAAA,CACP,GACI,GAEb"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{t as r}from"./MutationTokenDialog-DlY2VLVh.js";import{g as i,gt as a}from"./VerseConsoleApp-DjPpZLo1.js";import{M as o,j as s}from"./VerseShared-Bf-XTHCh.js";import{n as c}from"./format-V6IiIMAL.js";import{C as l,S as u,_ as d,a as f,b as p,c as m,d as h,f as g,g as _,h as v,m as y,o as b,r as x,u as S,w as C,x as w}from"./git-model-C1I4z_iQ.js";import{i as T}from"./icons-C3G-y5j2.js";import{n as E}from"./use-token-gate-h5QAERLT.js";import{n as D,r as O,t as k}from"./GitDialogs-ekwzxl76.js";var A=e(n(),1),j={bar:`_bar_1j44k_8`,rows:`_rows_1j44k_15`,row:`_row_1j44k_15`,ident:`_ident_1j44k_39`,glyph:`_glyph_1j44k_47`,repo:`_repo_1j44k_48`,branch:`_branch_1j44k_57`,drift:`_drift_1j44k_66`,stat:`_stat_1j44k_72`,add:`_add_1j44k_90`,del:`_del_1j44k_91`,checking:`_checking_1j44k_93`,conflicts:`_conflicts_1j44k_94`,spacer:`_spacer_1j44k_101`,split:`_split_1j44k_105`,primary:`_primary_1j44k_113`,menuButton:`_menuButton_1j44k_114`,visuallyHidden:`_visuallyHidden_1j44k_148`,primaryLabel:`_primaryLabel_1j44k_162`,spinner:`_spinner_1j44k_163`,"branch-spin":`_branch-spin_1j44k_1`,menu:`_menu_1j44k_114`,"menu-in":`_menu-in_1j44k_1`,menuItem:`_menuItem_1j44k_204`,menuLabel:`_menuLabel_1j44k_224`,menuReason:`_menuReason_1j44k_225`,more:`_more_1j44k_233`,notice:`_notice_1j44k_248`},M=t();function N({primary:e,items:t,onSelect:n,menuLabel:r,disabled:i=!1}){let[a,o]=(0,A.useState)(!1),[s,c]=(0,A.useState)(-1),l=(0,A.useId)(),u=(0,A.useId)(),d=(0,A.useRef)(null),f=(0,A.useRef)(null),p=(0,A.useRef)([]),m=t.map((e,t)=>e.disabledReason===null?t:-1).filter(e=>e>=0),h=(0,A.useCallback)(e=>{o(!1),c(-1),e&&d.current?.focus()},[]),g=e=>{o(!0),c(m.length===0?-1:e===`first`?m[0]:m[m.length-1])};(0,A.useEffect)(()=>{a&&(s>=0?p.current[s]?.focus():f.current?.focus())},[a,s]),(0,A.useEffect)(()=>{if(!a)return;let e=e=>{let t=e.target;f.current?.contains(t)||d.current?.contains(t)||h(!1)};return document.addEventListener(`mousedown`,e),()=>document.removeEventListener(`mousedown`,e)},[a,h]);let _=e=>{if(m.length===0)return;let t=m.indexOf(s),n=t===-1?e===1?0:m.length-1:(t+e+m.length)%m.length;c(m[n])},v=e=>{e.key===`ArrowDown`?(e.preventDefault(),g(`first`)):e.key===`ArrowUp`&&(e.preventDefault(),g(`last`))},y=e=>{switch(e.key){case`ArrowDown`:e.preventDefault(),_(1);break;case`ArrowUp`:e.preventDefault(),_(-1);break;case`Home`:e.preventDefault(),m.length&&c(m[0]);break;case`End`:e.preventDefault(),m.length&&c(m[m.length-1]);break;case`Escape`:e.preventDefault(),e.stopPropagation(),h(!0);break;case`Tab`:h(!1)}},b=e=>{e.disabledReason===null&&(h(!0),n(e.id))};return(0,M.jsxs)(`div`,{className:j.split,"data-open":a?`true`:`false`,children:[e?(0,M.jsxs)(`button`,{type:`button`,className:j.primary,"data-tone":e.tone??`primary`,onClick:e.onClick,disabled:i||e.busy,"aria-busy":e.busy||void 0,"aria-describedby":u,title:e.disclosure,children:[e.busy?(0,M.jsx)(`span`,{className:j.spinner,"aria-hidden":`true`}):null,(0,M.jsx)(`span`,{className:j.primaryLabel,children:e.label})]}):null,(0,M.jsx)(`span`,{id:u,className:j.visuallyHidden,children:e?.disclosure??``}),(0,M.jsx)(`button`,{ref:d,type:`button`,className:j.menuButton,"data-alone":e?`false`:`true`,"aria-haspopup":`menu`,"aria-expanded":a,"aria-controls":a?l:void 0,"aria-label":r,title:r,disabled:i,onClick:()=>a?h(!1):g(`first`),onKeyDown:v,children:(0,M.jsx)(T,{width:14,height:14,"aria-hidden":`true`})}),a?(0,M.jsx)(`div`,{ref:f,id:l,role:`menu`,"aria-label":r,className:j.menu,tabIndex:-1,onKeyDown:y,children:t.map((e,t)=>(0,M.jsxs)(`button`,{ref:e=>{p.current[t]=e},type:`button`,role:`menuitem`,className:j.menuItem,tabIndex:t===s?0:-1,"aria-disabled":e.disabledReason!==null||void 0,onClick:()=>b(e),onKeyDown:t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),b(e))},children:[(0,M.jsx)(`span`,{className:j.menuLabel,children:e.label}),e.disabledReason?(0,M.jsx)(`span`,{className:j.menuReason,children:e.disabledReason}):null]},e.id))}):null]})}var P={chip:`_chip_1sdua_5`,glyph:`_glyph_1sdua_26`,state:`_state_1sdua_30`,checks:`_checks_1sdua_33`,number:`_number_1sdua_37`,title:`_title_1sdua_43`,pulse:`_pulse_1sdua_65`,"pr-pulse":`_pr-pulse_1sdua_1`};function F({pr:e,counts:t=null,showTitle:n=!0}){let r=v(e,t);return(0,M.jsxs)(`a`,{className:P.chip,"data-tone":r.tone,href:e.url,target:`_blank`,rel:`noopener noreferrer`,"aria-label":`${r.label}. Opens on GitHub.`,title:`${r.label}. Opens on GitHub.`,children:[(0,M.jsx)(I,{tone:r.tone,state:e.state}),(0,M.jsx)(`span`,{className:P.number,children:r.number}),n&&e.title?(0,M.jsx)(`span`,{className:P.title,children:e.title}):null,(0,M.jsxs)(`span`,{className:P.state,children:[r.state,e.state===`merged`?` ✓`:``]}),r.checks?(0,M.jsx)(`span`,{className:P.checks,children:r.checks}):null]})}function I({tone:e,state:t}){let n={width:12,height:12,viewBox:`0 0 16 16`,"aria-hidden":!0,className:P.glyph};return t===`merged`?(0,M.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`,children:[(0,M.jsx)(`circle`,{cx:`4`,cy:`3.5`,r:`1.8`}),(0,M.jsx)(`circle`,{cx:`4`,cy:`12.5`,r:`1.8`}),(0,M.jsx)(`circle`,{cx:`12`,cy:`8`,r:`1.8`}),(0,M.jsx)(`path`,{d:`M4 5.3v5.4M5.2 4.6c1.4 2.2 3.2 3.4 5 3.4`})]}):t===`closed`?(0,M.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`,children:[(0,M.jsx)(`circle`,{cx:`4`,cy:`3.5`,r:`1.8`}),(0,M.jsx)(`circle`,{cx:`4`,cy:`12.5`,r:`1.8`}),(0,M.jsx)(`path`,{d:`M4 5.3v5.4M10 3l4 4M14 3l-4 4`})]}):e===`running`?(0,M.jsx)(`span`,{className:P.pulse,"aria-hidden":`true`}):e===`danger`?(0,M.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,children:[(0,M.jsx)(`circle`,{cx:`8`,cy:`8`,r:`6`}),(0,M.jsx)(`path`,{d:`M5.8 5.8l4.4 4.4M10.2 5.8l-4.4 4.4`})]}):e===`success`?(0,M.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.8`,strokeLinecap:`round`,strokeLinejoin:`round`,children:[(0,M.jsx)(`circle`,{cx:`8`,cy:`8`,r:`6`}),(0,M.jsx)(`path`,{d:`M5.2 8.2l2 2 3.6-4`})]}):(0,M.jsxs)(`svg`,{...n,fill:`none`,stroke:`currentColor`,strokeWidth:`1.6`,strokeLinecap:`round`,strokeDasharray:t===`draft`?`2 2`:void 0,children:[(0,M.jsx)(`circle`,{cx:`4`,cy:`3.5`,r:`1.8`}),(0,M.jsx)(`circle`,{cx:`4`,cy:`12.5`,r:`1.8`}),(0,M.jsx)(`circle`,{cx:`12`,cy:`12.5`,r:`1.8`}),(0,M.jsx)(`path`,{d:`M4 5.3v5.4M12 10.7V6.5c0-1.4-.8-2.2-2.2-2.2H7.5`})]})}var L=1e4,R=2500;function ee(e,t={}){let n=t.fetchStatus??p,r=t.enabled??!0,i=o(),a=e.join(`\0`),c=(0,A.useMemo)(()=>a===``?[]:a.split(`\0`),[a]),[l,u]=(0,A.useState)({}),[d,f]=(0,A.useState)(new Set),[m,h]=(0,A.useState)(null),g=(0,A.useRef)(new Set),_=(0,A.useRef)(null),v=(0,A.useRef)(null),y=(0,A.useRef)(!0),b=(0,A.useCallback)(()=>{_.current?.abort();let e=new AbortController;_.current=e;let t=c.filter(e=>!g.current.has(e));if(t.length===0){f(new Set(c));return}Promise.all(t.map(async t=>{try{return{root:t,status:await n(t,e.signal),err:null}}catch(e){return{root:t,status:null,err:e}}})).then(t=>{if(!y.current||e.signal.aborted)return;let n=null,r=!1,i={},a=[];for(let e of t)e.status?(i[e.root]=e.status,e.status.prLookup===`pending`&&(r=!0)):w(e.err)?(g.current.add(e.root),a.push(e.root)):(console.warn(`[verse] git status failed`,e.err),n=`Could not read git status.`);u(e=>{let t={...e,...i};for(let e of a)delete t[e];return t}),f(new Set(c)),h(n),r&&v.current===null&&(v.current=setTimeout(()=>{v.current=null,y.current&&x.current()},R))})},[c,n]),x=(0,A.useRef)(b);x.current=b,(0,A.useEffect)(()=>{g.current=new Set,u({}),f(new Set),h(null)},[a]);let S=(0,A.useRef)(i);S.current=i,(0,A.useEffect)(()=>{r&&S.current&&b()},[b,r]),s(b,L,{enabled:r}),(0,A.useEffect)(()=>(y.current=!0,()=>{y.current=!1,_.current?.abort(),v.current!==null&&clearTimeout(v.current)}),[]);let C=(0,A.useCallback)((e,t)=>{u(n=>({...n,[e]:{...t,root:e}}))},[]);return{statuses:(0,A.useMemo)(()=>c.map(e=>l[e]).filter(e=>e!==void 0),[c,l]),loading:c.some(e=>!d.has(e)),error:m,refresh:b,replace:C}}var te=6e3;function z({roots:e,onOpenDiff:t,statusOptions:n}){let{statuses:o,loading:s,replace:p}=ee(e,n),{compact:m}=a(),_=E(),[v,b]=(0,A.useState)(!1),[w,T]=(0,A.useState)(null),[N,P]=(0,A.useState)(null),[F,I]=(0,A.useState)(null),[L,R]=(0,A.useState)(null),[z,V]=(0,A.useState)(null),H=(0,A.useId)();(0,A.useEffect)(()=>{if(L?.tone!==`ok`)return;let e=setTimeout(()=>R(null),te);return()=>clearTimeout(e)},[L]);let U=x(o).filter(S),W=e=>o.find(t=>t.root===e)??null,G=(0,A.useCallback)(async(e,t,n,r,i)=>{P(e),I(null),R(null);try{let i=await _.run(t,n);if(i===null)return;p(e,i.status),T(null),R({text:r(i.status),tone:`ok`})}catch(e){console.warn(`[verse] git action failed`,e);let t=f(e);i?I(t):R({text:t,tone:`error`})}finally{P(null)}},[_,p]),K=e=>G(e.root,`Push ${e.branch??`this branch`} to ${e.upstream??`origin`}.`,()=>C(e.root),e=>`Pushed ${e.branch??`the branch`} to ${e.upstream??`origin`}.`,!1),q=e=>t(e),J=e=>{let t=y(e);t&&(I(null),T({kind:`merge`,root:e.root,pin:t}))},ne=e=>{switch(e.suggested){case`commit`:I(null),T({kind:`commit`,root:e.root});break;case`push`:K(e);break;case`create-pr`:I(null),T({kind:`pr`,root:e.root,draft:!1});break;case`merge`:J(e);break;case`view-pr`:e.pr&&window.open(e.pr.url,`_blank`,`noopener,noreferrer`)}},re=(e,t)=>{switch(t){case`draft-pr`:I(null),T({kind:`pr`,root:e.root,draft:!0});break;case`commit`:I(null),T({kind:`commit`,root:e.root});break;case`push`:K(e);break;case`open-github`:e.pr&&window.open(e.pr.url,`_blank`,`noopener,noreferrer`);break;case`copy-branch`:e.branch&&navigator.clipboard?.writeText(e.branch).then(()=>R({text:`Copied ${e.branch}.`,tone:`ok`}),()=>R({text:`Could not copy the branch name.`,tone:`error`}));break;case`review`:q({root:e.root,scope:e.dirty>0&&e.diffstat.files===0?`working`:`branch`})}},Y=e=>{if(I(null),e===`create-pr`){let e=U.find(e=>e.suggested===`create-pr`)??U.find(e=>h(e).find(e=>e.id===`draft-pr`)?.disabledReason===null);if(e){R(null),T({kind:`pr`,root:e.root,draft:!1});return}let t=U.length>0?h(U[0]).find(e=>e.id===`draft-pr`)?.disabledReason:null;R({text:t?`Can't open a pull request: ${c(t)}`:`No branch in this chat has changes to open a pull request from.`,tone:`error`});return}let t=U.find(e=>e.suggested===`merge`&&e.pr!==null);if(t){R(null),J(t);return}let n=U.find(e=>e.pr!==null&&(e.pr.state===`open`||e.pr.state===`draft`));R({text:n?.pr?`#${n.pr.number} isn't ready to merge yet — its checks haven't passed or it isn't mergeable.`:`No pull request in this chat is ready to merge.`,tone:`error`})},X=e=>{s?V(e):Y(e)};i(`git.create-pr`,()=>X(`create-pr`)),i(`git.merge-pr`,()=>X(`merge`));let Z=(0,A.useRef)(Y);if(Z.current=Y,(0,A.useEffect)(()=>{z===null||s||(V(null),Z.current(z))},[z,s]),U.length===0&&!L)return null;let Q=v?U:U.slice(0,1),ie=U.length-Q.length,$=w?W(w.root):null;return(0,M.jsxs)(`section`,{className:j.bar,"aria-label":`Branches`,"data-compact":m?`true`:`false`,children:[(0,M.jsx)(`ul`,{id:H,className:j.rows,children:Q.map(e=>(0,M.jsx)(B,{status:e,compact:m,busy:N===e.root,onPrimary:()=>ne(e),onMenu:t=>re(e,t),onOpenDiff:()=>q({root:e.root,scope:`branch`})},e.gitRoot??e.root))}),U.length>1?(0,M.jsx)(`button`,{type:`button`,className:j.more,"aria-expanded":v,"aria-controls":H,onClick:()=>b(e=>!e),children:v?`Show fewer`:`Show ${ie} more`}):null,(0,M.jsx)(`p`,{className:j.notice,role:L?.tone===`error`?`alert`:`status`,"aria-live":L?.tone===`error`?`assertive`:`polite`,"data-tone":L?.tone??`ok`,children:L?.text??``}),$&&w?.kind===`commit`?(0,M.jsx)(k,{open:!0,status:$,busy:N===w.root,error:F,onClose:()=>T(null),onSubmit:e=>void G(w.root,`Commit ${$.dirty} changed files on ${$.branch??`this branch`}.`,()=>d({root:w.root,message:e}),e=>`Committed on ${e.branch??`the branch`}.`,!0)}):null,$&&w?.kind===`pr`?(0,M.jsx)(D,{open:!0,draft:w.draft,status:$,busy:N===w.root,error:F,onClose:()=>T(null),onSubmit:e=>void G(w.root,`Push ${$.branch??`this branch`} and open a pull request into ${e.base}.`,async()=>{let t=await l({root:w.root,title:e.title,base:e.base,...e.body.trim()?{body:e.body}:{},...e.draft?{draft:!0}:{}});return{status:{...t.status,pr:t.pr??t.status.pr}}},e=>e.pr?`Opened #${e.pr.number}.`:`Opened the pull request.`,!0)}):null,w?.kind===`merge`?(0,M.jsx)(O,{open:!0,pin:w.pin,live:$,busy:N===w.root,error:F,onClose:()=>T(null),onSubmit:()=>{let{pin:e}=w;e.headSha!==null&&g(e,W(w.root))===null&&G(w.root,`Squash-merge #${e.number} (head ${e.headSha.slice(0,7)}) into ${e.baseRef}.`,async()=>{let t=await u({root:w.root,number:e.number,headSha:e.headSha});return{status:{...t.status,pr:t.pr??t.status.pr}}},()=>`Merged #${e.number} into ${e.baseRef}.`,!0)}}):null,(0,M.jsx)(r,{..._.dialog,tokenLabel:`Mutation token`,tokenHelp:`the mutation token ashlr verse printed`})]})}function B({status:e,compact:t,busy:n,onPrimary:r,onMenu:i,onOpenDiff:a}){let o=_(e),s=h(e),c=e.diffstat.files>0,l=e.pr===null&&e.prLookup===`pending`&&e.branch!==null&&e.suggested===`none`;return(0,M.jsxs)(`li`,{className:j.row,"aria-label":`${e.name}, ${e.branch?`branch ${e.branch}`:`detached HEAD`}`,children:[(0,M.jsxs)(`span`,{className:j.ident,children:[(0,M.jsx)(V,{}),(0,M.jsx)(`span`,{className:j.repo,title:e.gitRoot??e.root,children:e.name}),(0,M.jsx)(`span`,{className:j.branch,title:e.branch??void 0,children:e.branch??`detached HEAD`}),e.behind>0?(0,M.jsxs)(`span`,{className:j.drift,children:[e.behind,` behind`]}):null]}),c?(0,M.jsxs)(`button`,{type:`button`,className:j.stat,onClick:a,"aria-label":`${b(e.diffstat.files,e.diffstat.additions,e.diffstat.deletions)}. Open the branch diff.`,title:`Open the branch diff`,children:[(0,M.jsxs)(`span`,{className:j.add,children:[`+`,m(e.diffstat.additions)]}),(0,M.jsxs)(`span`,{className:j.del,children:[`−`,m(e.diffstat.deletions)]})]}):null,e.pr?(0,M.jsx)(F,{pr:e.pr,counts:e.prCheckCounts??null,showTitle:!t}):null,l?(0,M.jsx)(`span`,{className:j.checking,children:`Checking GitHub…`}):null,(e.conflicts??0)>0?(0,M.jsxs)(`span`,{className:j.conflicts,children:[e.conflicts,` conflicted`]}):null,(0,M.jsx)(`span`,{className:j.spacer}),(0,M.jsx)(N,{primary:o?{label:o.label,disclosure:o.disclosure,onClick:r,busy:n,tone:o.action===`view-pr`?`subtle`:`primary`}:null,items:s,onSelect:i,menuLabel:`More git actions for ${e.name}`,disabled:n})]})}function V(){return(0,M.jsxs)(`svg`,{className:j.glyph,width:`14`,height:`14`,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:`1.5`,strokeLinecap:`round`,"aria-hidden":`true`,children:[(0,M.jsx)(`circle`,{cx:`4.5`,cy:`3.5`,r:`1.7`}),(0,M.jsx)(`circle`,{cx:`4.5`,cy:`12.5`,r:`1.7`}),(0,M.jsx)(`circle`,{cx:`11.5`,cy:`5`,r:`1.7`}),(0,M.jsx)(`path`,{d:`M4.5 5.2v5.6M11.5 6.7c0 3-3.5 2.7-6.3 4.6`})]})}export{z as BranchBar};
2
+ //# sourceMappingURL=BranchBar-CkiZSNqB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BranchBar-CkiZSNqB.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/git/BranchBar.module.css","../../../../../../src/web-ui/routes/verse/git/ActionMenu.tsx","../../../../../../src/web-ui/routes/verse/git/PrChip.module.css","../../../../../../src/web-ui/routes/verse/git/PrChip.tsx","../../../../../../src/web-ui/routes/verse/git/useGitStatuses.ts","../../../../../../src/web-ui/routes/verse/git/BranchBar.tsx"],"sourcesContent":["/*\n * Branch bar (SPEC-310C §2): one quiet line above the composer. Identity in\n * secondary text, the ± counts as a button in the diff's own add/remove\n * colours (with the +/− glyph carrying the meaning), the PR chip, and one\n * primary split button pinned right. At compact width the row wraps: the\n * identity takes the first line, counts + chip + button the second.\n */\n.bar {\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n min-width: 0;\n}\n\n.rows {\n list-style: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-direction: column;\n gap: var(--space-1);\n}\n\n.row {\n display: flex;\n align-items: center;\n flex-wrap: wrap;\n gap: var(--space-2);\n min-width: 0;\n min-height: var(--control-h-sm);\n padding: var(--space-1) var(--space-1) var(--space-1) var(--space-3);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-md);\n background: var(--bg-surface);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n\n.ident {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n flex: 0 1 auto;\n overflow: hidden;\n}\n.glyph { flex: none; color: var(--text-tertiary); }\n.repo {\n flex: none;\n color: var(--text-primary);\n font-weight: var(--font-weight-semibold);\n max-width: 18ch;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.branch {\n min-width: 0;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n color: var(--text-secondary);\n}\n.drift {\n flex: none;\n font-size: var(--text-xs-size);\n color: var(--status-warning-fg);\n}\n\n.stat {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 1px solid transparent;\n border-radius: var(--radius-sm);\n background: transparent;\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n font-variant-numeric: tabular-nums;\n cursor: pointer;\n transition: background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);\n}\n.stat:hover { background: var(--bg-hover); border-color: var(--border-default); }\n.stat:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n.add { color: var(--status-success-fg); }\n.del { color: var(--status-danger-fg); }\n\n.checking,\n.conflicts {\n flex: none;\n font-size: var(--text-xs-size);\n color: var(--text-tertiary);\n}\n.conflicts { color: var(--status-danger-fg); font-weight: var(--font-weight-medium); }\n\n.spacer { flex: 1 1 0; min-width: 0; }\n\n/* ---- split button ------------------------------------------------------ */\n\n.split {\n position: relative;\n flex: none;\n display: inline-flex;\n align-items: stretch;\n margin-left: auto;\n}\n\n.primary,\n.menuButton {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: var(--space-2);\n min-height: var(--control-h-sm);\n border: 1px solid var(--accent-600);\n background: var(--accent-600);\n color: var(--text-on-accent);\n font: inherit;\n font-size: var(--text-sm-size);\n font-weight: var(--font-weight-semibold);\n cursor: pointer;\n transition: background var(--duration-fast) var(--ease-standard), border-color var(--duration-fast) var(--ease-standard);\n}\n.primary {\n padding: 0 var(--space-3);\n border-radius: var(--radius-sm) 0 0 var(--radius-sm);\n}\n.menuButton {\n width: var(--control-h-sm);\n padding: 0;\n border-left-color: color-mix(in srgb, var(--text-on-accent) 35%, var(--accent-600));\n border-radius: 0 var(--radius-sm) var(--radius-sm) 0;\n}\n.primary:hover,\n.menuButton:hover { background: var(--accent-700); border-color: var(--accent-700); }\n.primary:focus-visible,\n.menuButton:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); z-index: 1; }\n.primary:disabled,\n.menuButton:disabled { cursor: default; opacity: 0.6; }\n\n/* View PR (and a lone ▾) is a quiet action: the work is done, nothing to push. */\n.primary[data-tone='subtle'],\n.primary[data-tone='subtle'] + .visuallyHidden + .menuButton,\n.menuButton[data-alone='true'] {\n background: var(--bg-surface-raised);\n border-color: var(--border-default);\n color: var(--text-primary);\n}\n.primary[data-tone='subtle']:hover,\n.primary[data-tone='subtle'] + .visuallyHidden + .menuButton:hover,\n.menuButton[data-alone='true']:hover { background: var(--bg-hover); border-color: var(--border-strong); }\n.menuButton[data-alone='true'] { border-radius: var(--radius-sm); }\n\n.primary { position: relative; }\n/* In flight: the label stays (for width and for its accessible name) but\n goes transparent, and the spinner sits centred on top of it. */\n.primary[aria-busy='true'] .primaryLabel { color: transparent; }\n.spinner {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 12px;\n height: 12px;\n margin: -6px 0 0 -6px;\n border: 2px solid color-mix(in srgb, currentColor 35%, transparent);\n border-top-color: currentColor;\n border-radius: var(--radius-full);\n animation: branch-spin 0.8s linear infinite;\n}\n@keyframes branch-spin { to { transform: rotate(360deg); } }\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .spinner { animation-duration: 2.4s; }\n}\n\n.menu {\n position: absolute;\n right: 0;\n bottom: calc(100% + var(--space-1));\n z-index: var(--z-dropdown);\n min-width: 15rem;\n max-width: min(20rem, calc(100vw - var(--space-8)));\n padding: var(--space-1);\n display: flex;\n flex-direction: column;\n background: var(--bg-surface-raised);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-md);\n box-shadow: var(--shadow-menu);\n animation: menu-in var(--duration-fast) var(--ease-decelerate);\n}\n.menu:focus { outline: none; }\n@keyframes menu-in {\n from { opacity: 0; transform: translateY(2px); }\n}\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .menu { animation: none; }\n}\n\n.menuItem {\n display: flex;\n flex-direction: column;\n align-items: flex-start;\n gap: 2px;\n width: 100%;\n padding: var(--space-2) var(--space-3);\n border: 0;\n border-radius: var(--radius-sm);\n background: transparent;\n color: var(--text-primary);\n font: inherit;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n text-align: left;\n cursor: pointer;\n}\n.menuItem:hover:not([aria-disabled='true']),\n.menuItem:focus-visible { background: var(--bg-hover); outline: none; }\n.menuItem[aria-disabled='true'] { cursor: default; color: var(--text-tertiary); }\n.menuLabel { font-weight: var(--font-weight-medium); }\n.menuReason {\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n/* ---- footer lines ------------------------------------------------------ */\n\n.more {\n align-self: flex-start;\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 0;\n background: transparent;\n color: var(--text-link);\n font: inherit;\n font-size: var(--text-xs-size);\n cursor: pointer;\n border-radius: var(--radius-sm);\n}\n.more:hover { text-decoration: underline; }\n.more:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.notice {\n margin: 0;\n padding: 0 var(--space-3);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n.notice:empty { display: none; }\n.notice[data-tone='error'] { color: var(--status-danger-fg); }\n\n.visuallyHidden {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0 0 0 0);\n white-space: nowrap;\n border: 0;\n}\n\n/* ---- compact (< 480) ---------------------------------------------------- */\n\n.bar[data-compact='true'] .row { padding-left: var(--space-2); }\n.bar[data-compact='true'] .ident { flex: 1 1 100%; }\n.bar[data-compact='true'] .repo { max-width: 14ch; }\n","/**\n * routes/verse/git/ActionMenu.tsx — the branch bar's split button: one\n * primary action beside a ▾ menu of the rest (unit C5; SPEC-310C §2).\n *\n * WAI-ARIA menu-button pattern, keyboard first:\n * ▾ / Enter / Space / ↓ open the menu on the first enabled item, ↑ on the\n * last; ↑ ↓ Home End move; Enter or Space runs; Escape closes and returns\n * focus to ▾; Tab closes and lets focus move on; a click outside closes.\n *\n * A disabled item stays in the menu with its reason as visible text under\n * the label (never colour alone, never only a tooltip) and is skipped by the\n * arrow keys — so the operator can always see why Push is not offered.\n */\nimport { useCallback, useEffect, useId, useRef, useState, type KeyboardEvent as ReactKeyboardEvent, type ReactNode } from 'react';\nimport { IconChevronDown } from '../../../components/primitives/icons.js';\nimport styles from './BranchBar.module.css';\n\nexport interface ActionMenuItem<Id extends string> {\n id: Id;\n label: string;\n disabledReason: string | null;\n}\n\nexport interface ActionMenuProps<Id extends string> {\n /** The primary button; null renders the menu button alone. */\n primary: { label: string; disclosure: string; onClick: () => void; busy?: boolean; tone?: 'primary' | 'subtle' } | null;\n items: ReadonlyArray<ActionMenuItem<Id>>;\n onSelect: (id: Id) => void;\n /** Names the menu button for screen readers (\"More git actions for ashlr-hub\"). */\n menuLabel: string;\n disabled?: boolean;\n children?: ReactNode;\n}\n\nexport function ActionMenu<Id extends string>({ primary, items, onSelect, menuLabel, disabled = false }: ActionMenuProps<Id>) {\n const [open, setOpen] = useState(false);\n const [active, setActive] = useState(-1);\n const menuId = useId();\n const disclosureId = useId();\n const buttonRef = useRef<HTMLButtonElement>(null);\n const menuRef = useRef<HTMLDivElement>(null);\n const itemRefs = useRef<Array<HTMLButtonElement | null>>([]);\n\n const enabled = items.map((it, i) => (it.disabledReason === null ? i : -1)).filter((i) => i >= 0);\n\n const close = useCallback((refocus: boolean) => {\n setOpen(false);\n setActive(-1);\n if (refocus) buttonRef.current?.focus();\n }, []);\n\n const openAt = (which: 'first' | 'last') => {\n setOpen(true);\n setActive(enabled.length === 0 ? -1 : which === 'first' ? enabled[0]! : enabled[enabled.length - 1]!);\n };\n\n useEffect(() => {\n if (!open) return;\n if (active >= 0) itemRefs.current[active]?.focus();\n else menuRef.current?.focus();\n }, [open, active]);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n const t = e.target as Node;\n if (menuRef.current?.contains(t) || buttonRef.current?.contains(t)) return;\n close(false);\n };\n document.addEventListener('mousedown', onDown);\n return () => document.removeEventListener('mousedown', onDown);\n }, [open, close]);\n\n const move = (delta: 1 | -1) => {\n if (enabled.length === 0) return;\n const at = enabled.indexOf(active);\n const next = at === -1 ? (delta === 1 ? 0 : enabled.length - 1) : (at + delta + enabled.length) % enabled.length;\n setActive(enabled[next]!);\n };\n\n const onButtonKey = (e: ReactKeyboardEvent<HTMLButtonElement>) => {\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n openAt('first');\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n openAt('last');\n }\n };\n\n const onMenuKey = (e: ReactKeyboardEvent<HTMLDivElement>) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault();\n move(1);\n break;\n case 'ArrowUp':\n e.preventDefault();\n move(-1);\n break;\n case 'Home':\n e.preventDefault();\n if (enabled.length) setActive(enabled[0]!);\n break;\n case 'End':\n e.preventDefault();\n if (enabled.length) setActive(enabled[enabled.length - 1]!);\n break;\n case 'Escape':\n e.preventDefault();\n e.stopPropagation();\n close(true);\n break;\n case 'Tab':\n close(false);\n break;\n default:\n break;\n }\n };\n\n const run = (item: ActionMenuItem<Id>) => {\n if (item.disabledReason !== null) return;\n close(true);\n onSelect(item.id);\n };\n\n return (\n <div className={styles.split} data-open={open ? 'true' : 'false'}>\n {primary ? (\n <button\n type=\"button\"\n className={styles.primary}\n data-tone={primary.tone ?? 'primary'}\n onClick={primary.onClick}\n disabled={disabled || primary.busy}\n aria-busy={primary.busy || undefined}\n aria-describedby={disclosureId}\n title={primary.disclosure}\n >\n {/* Busy draws the spinner OVER the label (kept, transparent) so the\n button keeps its width and the row does not shift. */}\n {primary.busy ? <span className={styles.spinner} aria-hidden=\"true\" /> : null}\n <span className={styles.primaryLabel}>{primary.label}</span>\n </button>\n ) : null}\n <span id={disclosureId} className={styles.visuallyHidden}>{primary?.disclosure ?? ''}</span>\n <button\n ref={buttonRef}\n type=\"button\"\n className={styles.menuButton}\n data-alone={primary ? 'false' : 'true'}\n aria-haspopup=\"menu\"\n aria-expanded={open}\n aria-controls={open ? menuId : undefined}\n aria-label={menuLabel}\n title={menuLabel}\n disabled={disabled}\n onClick={() => (open ? close(false) : openAt('first'))}\n onKeyDown={onButtonKey}\n >\n <IconChevronDown width={14} height={14} aria-hidden=\"true\" />\n </button>\n {open ? (\n <div ref={menuRef} id={menuId} role=\"menu\" aria-label={menuLabel} className={styles.menu} tabIndex={-1} onKeyDown={onMenuKey}>\n {items.map((item, i) => (\n <button\n key={item.id}\n ref={(el) => { itemRefs.current[i] = el; }}\n type=\"button\"\n role=\"menuitem\"\n className={styles.menuItem}\n tabIndex={i === active ? 0 : -1}\n aria-disabled={item.disabledReason !== null || undefined}\n onClick={() => run(item)}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n run(item);\n }\n }}\n >\n <span className={styles.menuLabel}>{item.label}</span>\n {item.disabledReason ? <span className={styles.menuReason}>{item.disabledReason}</span> : null}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n","/*\n * PR chip: one line, icon + number + state word (+ checks). The tone tints\n * the text and hairline only; the word carries the meaning (DESIGN §13.2).\n */\n.chip {\n display: inline-flex;\n align-items: center;\n gap: var(--space-1);\n min-width: 0;\n max-width: 100%;\n min-height: var(--control-h-xs);\n padding: 0 var(--space-2);\n border: 1px solid var(--border-subtle);\n border-radius: var(--radius-full);\n background: var(--bg-surface);\n color: var(--text-secondary);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n text-decoration: none;\n white-space: nowrap;\n transition: border-color var(--duration-fast) var(--ease-standard), background var(--duration-fast) var(--ease-standard);\n}\n.chip:hover { background: var(--bg-hover); border-color: var(--border-default); }\n.chip:focus-visible { outline: none; box-shadow: var(--shadow-focus-ring); }\n\n.glyph { flex: none; }\n\n.chip[data-tone='success'] .glyph,\n.chip[data-tone='merged'] .glyph,\n.chip[data-tone='success'] .state,\n.chip[data-tone='merged'] .state { color: var(--status-success-fg); }\n.chip[data-tone='danger'] .glyph,\n.chip[data-tone='danger'] .checks { color: var(--status-danger-fg); }\n.chip[data-tone='running'] .checks { color: var(--status-running-fg); }\n.chip[data-tone='warning'] .glyph { color: var(--status-warning-fg); }\n\n.number {\n font-family: var(--font-mono);\n color: var(--text-primary);\n font-variant-numeric: tabular-nums;\n}\n\n.title {\n min-width: 0;\n max-width: 22ch;\n overflow: hidden;\n text-overflow: ellipsis;\n color: var(--text-secondary);\n}\n\n.state { font-weight: var(--font-weight-medium); color: var(--text-primary); }\n.state::before,\n.checks::before {\n content: '·';\n margin-right: var(--space-1);\n color: var(--text-tertiary);\n font-weight: var(--font-weight-regular);\n}\n/* The checks phrase is status, not decoration: it never truncates mid-word\n (the title gives way first, and it carries the full text as a tooltip). */\n.checks { flex: none; color: var(--text-secondary); }\n.number,\n.state { flex: none; }\n\n.pulse {\n flex: none;\n width: 8px;\n height: 8px;\n margin: 0 2px;\n border-radius: var(--radius-full);\n background: var(--status-running-solid);\n animation: pr-pulse var(--duration-pulse) var(--ease-standard) infinite;\n}\n\n@keyframes pr-pulse {\n 50% { opacity: 0.35; }\n}\n","/**\n * routes/verse/git/PrChip.tsx — a pull request as one chip: an icon WITH a\n * word (`#463 · Merged ✓`, `#481 · Open · 2 of 9 checks failing`) — never a\n * colour alone (DESIGN §13.2 status rule; SPEC-310C §2 \"PR chips\").\n *\n * It is a link to the PR on GitHub (a new window; the desktop shell hands it\n * to the browser). The title is shown at wide widths and folded into the\n * accessible name at narrow ones.\n */\nimport type { VerseGitPr } from '../../../data/api-types.js';\nimport { prChip, type GitCheckCounts, type PrTone } from './git-model.js';\nimport styles from './PrChip.module.css';\n\nexport interface PrChipProps {\n pr: VerseGitPr;\n counts?: GitCheckCounts | null;\n /** Show the PR title (wide layouts). */\n showTitle?: boolean;\n}\n\nexport function PrChip({ pr, counts = null, showTitle = true }: PrChipProps) {\n const model = prChip(pr, counts);\n return (\n <a\n className={styles.chip}\n data-tone={model.tone}\n href={pr.url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`${model.label}. Opens on GitHub.`}\n title={`${model.label}. Opens on GitHub.`}\n >\n <PrGlyph tone={model.tone} state={pr.state} />\n <span className={styles.number}>{model.number}</span>\n {showTitle && pr.title ? <span className={styles.title}>{pr.title}</span> : null}\n <span className={styles.state}>\n {model.state}\n {pr.state === 'merged' ? ' ✓' : ''}\n </span>\n {model.checks ? <span className={styles.checks}>{model.checks}</span> : null}\n </a>\n );\n}\n\n/** Small state glyph, drawn in currentColor so it follows the tone token. */\nfunction PrGlyph({ tone, state }: { tone: PrTone; state: VerseGitPr['state'] }) {\n const common = { width: 12, height: 12, viewBox: '0 0 16 16', 'aria-hidden': true as const, className: styles.glyph };\n if (state === 'merged') {\n return (\n <svg {...common} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\">\n <circle cx=\"4\" cy=\"3.5\" r=\"1.8\" />\n <circle cx=\"4\" cy=\"12.5\" r=\"1.8\" />\n <circle cx=\"12\" cy=\"8\" r=\"1.8\" />\n <path d=\"M4 5.3v5.4M5.2 4.6c1.4 2.2 3.2 3.4 5 3.4\" />\n </svg>\n );\n }\n if (state === 'closed') {\n return (\n <svg {...common} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\">\n <circle cx=\"4\" cy=\"3.5\" r=\"1.8\" />\n <circle cx=\"4\" cy=\"12.5\" r=\"1.8\" />\n <path d=\"M4 5.3v5.4M10 3l4 4M14 3l-4 4\" />\n </svg>\n );\n }\n if (tone === 'running') return <span className={styles.pulse} aria-hidden=\"true\" />;\n if (tone === 'danger') {\n return (\n <svg {...common} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"M5.8 5.8l4.4 4.4M10.2 5.8l-4.4 4.4\" />\n </svg>\n );\n }\n if (tone === 'success') {\n return (\n <svg {...common} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"8\" cy=\"8\" r=\"6\" />\n <path d=\"M5.2 8.2l2 2 3.6-4\" />\n </svg>\n );\n }\n // Open or draft with nothing to report: the pull-request glyph (dashed for a draft).\n return (\n <svg {...common} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\" strokeDasharray={state === 'draft' ? '2 2' : undefined}>\n <circle cx=\"4\" cy=\"3.5\" r=\"1.8\" />\n <circle cx=\"4\" cy=\"12.5\" r=\"1.8\" />\n <circle cx=\"12\" cy=\"12.5\" r=\"1.8\" />\n <path d=\"M4 5.3v5.4M12 10.7V6.5c0-1.4-.8-2.2-2.2-2.2H7.5\" />\n </svg>\n );\n}\n","/**\n * routes/verse/git/useGitStatuses.ts — one git status per chat root, kept\n * fresh while the chat is on screen (unit C5).\n *\n * Freshness without waste:\n * - one read per root on mount and whenever the root list changes;\n * - a poll every GIT_POLL_MS through `usePollWhileVisible`, so a hidden\n * surface or a minimised window costs nothing and a returning one\n * re-reads on sight (the server caches 5 s, so a poll is cheap);\n * - ONE extra read GIT_PR_RECHECK_MS after a status that says GitHub has\n * not answered yet (`prLookup: 'pending'`), so \"Checking GitHub…\" turns\n * into the real button in about two seconds instead of one poll later;\n * - `replace` after an action — the POST already answered with the fresh\n * status, so there is no second round trip.\n *\n * A root that is not a repository (or not one Verse knows) is dropped for the\n * life of the root list: it can never have a bar, and re-asking every poll\n * would be noise in the server log.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { usePollWhileVisible, useSectionVisible } from '../shell/section-visibility.js';\nimport type { GitStatusView } from './git-model.js';\nimport { fetchGitStatus, isRootUnavailable } from './git-queries.js';\n\nexport const GIT_POLL_MS = 10_000;\nexport const GIT_PR_RECHECK_MS = 2_500;\n\nexport interface GitStatusesState {\n /** Statuses in the chat's root order, for roots that are repositories. */\n statuses: GitStatusView[];\n /** True until every root has answered once. */\n loading: boolean;\n /** A read failure other than \"not a repository\" (the newest one), or null. */\n error: string | null;\n refresh: () => void;\n /** Swap in the status a git action answered with, keyed by the root that was asked. */\n replace: (root: string, status: GitStatusView) => void;\n}\n\nexport interface GitStatusesOptions {\n /** Test seam. */\n fetchStatus?: (root: string, signal?: AbortSignal) => Promise<GitStatusView>;\n enabled?: boolean;\n}\n\nexport function useGitStatuses(roots: readonly string[], options: GitStatusesOptions = {}): GitStatusesState {\n const fetchStatus = options.fetchStatus ?? fetchGitStatus;\n const enabled = options.enabled ?? true;\n const visible = useSectionVisible();\n const key = roots.join('\\0');\n // Stable across renders that pass an equal-but-new array.\n const stableRoots = useMemo(() => (key === '' ? [] : key.split('\\0')), [key]);\n\n const [byRoot, setByRoot] = useState<Record<string, GitStatusView>>({});\n const [answered, setAnswered] = useState<ReadonlySet<string>>(new Set());\n const [error, setError] = useState<string | null>(null);\n const unavailable = useRef(new Set<string>());\n const inFlight = useRef<AbortController | null>(null);\n const recheck = useRef<ReturnType<typeof setTimeout> | null>(null);\n const alive = useRef(true);\n\n const readAll = useCallback(() => {\n inFlight.current?.abort();\n const controller = new AbortController();\n inFlight.current = controller;\n const targets = stableRoots.filter((r) => !unavailable.current.has(r));\n if (targets.length === 0) {\n setAnswered(new Set(stableRoots));\n return;\n }\n void Promise.all(\n targets.map(async (root) => {\n try {\n const status = await fetchStatus(root, controller.signal);\n return { root, status, err: null as unknown };\n } catch (err) {\n return { root, status: null, err };\n }\n }),\n ).then((results) => {\n if (!alive.current || controller.signal.aborted) return;\n // Decided from the results, not inside the state updater: React may run\n // an updater later (or twice), so nothing read after it may be set in it.\n let failure: string | null = null;\n let pending = false;\n const fresh: Record<string, GitStatusView> = {};\n const dropped: string[] = [];\n for (const r of results) {\n if (r.status) {\n fresh[r.root] = r.status;\n if (r.status.prLookup === 'pending') pending = true;\n } else if (isRootUnavailable(r.err)) {\n unavailable.current.add(r.root);\n dropped.push(r.root);\n } else {\n // The console, not the page, gets the details (DESIGN §13.8).\n console.warn('[verse] git status failed', r.err);\n failure = 'Could not read git status.';\n }\n }\n setByRoot((prev) => {\n const next = { ...prev, ...fresh };\n for (const root of dropped) delete next[root];\n return next;\n });\n setAnswered(new Set(stableRoots));\n setError(failure);\n if (pending && recheck.current === null) {\n recheck.current = setTimeout(() => {\n recheck.current = null;\n // The newest readAll: the root list may have changed meanwhile.\n if (alive.current) latestRead.current();\n }, GIT_PR_RECHECK_MS);\n }\n });\n }, [stableRoots, fetchStatus]);\n const latestRead = useRef(readAll);\n latestRead.current = readAll;\n\n // A new root list starts clean: rows for roots the chat no longer has go.\n useEffect(() => {\n unavailable.current = new Set();\n setByRoot({});\n setAnswered(new Set());\n setError(null);\n }, [key]);\n\n // First read on mount and on a new root list. Coming back into view is the\n // poll's job (refreshOnShow), so visibility is read, not depended on.\n const visibleRef = useRef(visible);\n visibleRef.current = visible;\n useEffect(() => {\n if (!enabled || !visibleRef.current) return;\n readAll();\n }, [readAll, enabled]);\n\n usePollWhileVisible(readAll, GIT_POLL_MS, { enabled });\n\n useEffect(() => {\n alive.current = true;\n return () => {\n alive.current = false;\n inFlight.current?.abort();\n if (recheck.current !== null) clearTimeout(recheck.current);\n };\n }, []);\n\n const replace = useCallback((root: string, status: GitStatusView) => {\n setByRoot((prev) => ({ ...prev, [root]: { ...status, root } }));\n }, []);\n\n const statuses = useMemo(\n () => stableRoots.map((r) => byRoot[r]).filter((s): s is GitStatusView => s !== undefined),\n [stableRoots, byRoot],\n );\n const loading = stableRoots.some((r) => !answered.has(r));\n\n return { statuses, loading, error, refresh: readAll, replace };\n}\n","/**\n * routes/verse/git/BranchBar.tsx — the row above the composer that turns a\n * chat's edits into a merged PR (unit C5; SPEC-310C §2 item 4):\n *\n * ashlr-hub v310-foundation +35,079 −1,074 #463 · Open · 9/9 checks passed [Merge ▾]\n *\n * Mounted by C2 through the `branch-bar` slot (shell/slots.tsx) with exactly\n * BranchBarProps. One row per REPOSITORY with something to do (two chat roots\n * inside one repo share a row), the first shown and the rest behind\n * \"Show N more\". Renders nothing at all when no root has changes — the space\n * above the composer is the chat's, not an empty toolbar's.\n *\n * The primary button is the server's `suggested` action (git-ops.ts\n * `suggestGitAction`: commit → push → create PR → merge → view), so the bar\n * never has to re-derive the ladder and can never offer Merge on a PR whose\n * checks the server has not seen pass. The ▾ menu holds the rest, each item\n * disabled WITH its reason rather than hidden.\n *\n * Every write goes through the mutation-token gate (the unlock dialog opens\n * with a sentence saying what the click will do) and answers with the fresh\n * status, which replaces the row — no refetch. Outcomes are announced in a\n * polite live region; failures in an alert, in the server's own words.\n */\nimport { useCallback, useEffect, useId, useRef, useState } from 'react';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { asSentence } from '../autonomy/format.js';\nimport { useTokenGate } from '../context/use-token-gate.js';\nimport { useCommandHandler } from '../shell/command-bus.js';\nimport type { BranchBarProps, DiffPaneRequest } from '../shell/slots.js';\nimport { useViewport } from '../shell/viewport.js';\nimport { ActionMenu } from './ActionMenu.js';\nimport { CommitDialog, CreatePrDialog, MergeDialog } from './GitDialogs.js';\nimport {\n dedupeByRepo,\n describeGitError,\n diffstatLabel,\n formatCount,\n hasBranchActivity,\n menuItems,\n mergeDrift,\n pinMerge,\n primaryAction,\n type GitStatusView,\n type PinnedMerge,\n type MenuActionId,\n} from './git-model.js';\nimport { commitGit, mergeGitPr, openGitPr, pushGit } from './git-queries.js';\nimport { PrChip } from './PrChip.js';\nimport { useGitStatuses, type GitStatusesOptions } from './useGitStatuses.js';\nimport styles from './BranchBar.module.css';\n\n/** How long \"Pushed feat/x to origin.\" stays before the line clears. */\nconst NOTICE_MS = 6_000;\n\n/** The palette commands this bar serves (command-catalog.ts `git.*`). */\ntype PaletteGitCommand = 'create-pr' | 'merge';\n\ntype DialogState =\n | { kind: 'commit'; root: string }\n | { kind: 'pr'; root: string; draft: boolean }\n // `pin` is the PR as shown when the dialog opened (git-model.ts pinMerge):\n // the dialog asserts and submits THAT head, never whatever the 10 s poll\n // brought in while it was open.\n | { kind: 'merge'; root: string; pin: PinnedMerge }\n | null;\n\nexport interface BranchBarTestProps {\n /** Test seam for the status reads. */\n statusOptions?: GitStatusesOptions;\n}\n\nexport function BranchBar({ roots, onOpenDiff, statusOptions }: BranchBarProps & BranchBarTestProps) {\n const { statuses, loading, replace } = useGitStatuses(roots, statusOptions);\n const { compact } = useViewport();\n const gate = useTokenGate();\n const [expanded, setExpanded] = useState(false);\n const [dialog, setDialog] = useState<DialogState>(null);\n const [busyRoot, setBusyRoot] = useState<string | null>(null);\n const [dialogError, setDialogError] = useState<string | null>(null);\n const [notice, setNotice] = useState<{ text: string; tone: 'ok' | 'error' } | null>(null);\n // A palette command that arrived before the first status read answered.\n const [pendingCommand, setPendingCommand] = useState<PaletteGitCommand | null>(null);\n const listId = useId();\n\n // A confirmation fades after a few seconds; an error stays until the next action.\n useEffect(() => {\n if (notice?.tone !== 'ok') return;\n const id = setTimeout(() => setNotice(null), NOTICE_MS);\n return () => clearTimeout(id);\n }, [notice]);\n\n const rows = dedupeByRepo(statuses).filter(hasBranchActivity);\n const statusFor = (root: string) => statuses.find((s) => s.root === root) ?? null;\n\n /**\n * Run one git write: token gate → request → swap in the answered status.\n * From a dialog, a refusal stays IN the dialog (the operator fixes and\n * retries); from a one-click action it goes to the bar's alert line.\n */\n const act = useCallback(\n async (root: string, reason: string, request: () => Promise<{ status: GitStatusView }>, done: (s: GitStatusView) => string, inDialog: boolean) => {\n setBusyRoot(root);\n setDialogError(null);\n setNotice(null);\n try {\n const result = await gate.run(reason, request);\n if (result === null) return; // unlock dismissed: nothing happened\n replace(root, result.status);\n setDialog(null);\n setNotice({ text: done(result.status), tone: 'ok' });\n } catch (err) {\n console.warn('[verse] git action failed', err);\n const text = describeGitError(err);\n if (inDialog) setDialogError(text);\n else setNotice({ text, tone: 'error' });\n } finally {\n setBusyRoot(null);\n }\n },\n [gate, replace],\n );\n\n const push = (s: GitStatusView) =>\n act(s.root, `Push ${s.branch ?? 'this branch'} to ${s.upstream ?? 'origin'}.`, () => pushGit(s.root), (next) => `Pushed ${next.branch ?? 'the branch'} to ${next.upstream ?? 'origin'}.`, false);\n\n const openDiff = (request: DiffPaneRequest) => onOpenDiff(request);\n\n const openMerge = (s: GitStatusView) => {\n const pin = pinMerge(s);\n if (!pin) return;\n setDialogError(null);\n setDialog({ kind: 'merge', root: s.root, pin });\n };\n\n const onPrimary = (s: GitStatusView) => {\n switch (s.suggested) {\n case 'commit':\n setDialogError(null);\n setDialog({ kind: 'commit', root: s.root });\n break;\n case 'push':\n void push(s);\n break;\n case 'create-pr':\n setDialogError(null);\n setDialog({ kind: 'pr', root: s.root, draft: false });\n break;\n case 'merge':\n openMerge(s);\n break;\n case 'view-pr':\n if (s.pr) window.open(s.pr.url, '_blank', 'noopener,noreferrer');\n break;\n default:\n break;\n }\n };\n\n const onMenu = (s: GitStatusView, id: MenuActionId) => {\n switch (id) {\n case 'draft-pr':\n setDialogError(null);\n setDialog({ kind: 'pr', root: s.root, draft: true });\n break;\n case 'commit':\n setDialogError(null);\n setDialog({ kind: 'commit', root: s.root });\n break;\n case 'push':\n void push(s);\n break;\n case 'open-github':\n if (s.pr) window.open(s.pr.url, '_blank', 'noopener,noreferrer');\n break;\n case 'copy-branch':\n if (s.branch) {\n void navigator.clipboard?.writeText(s.branch).then(\n () => setNotice({ text: `Copied ${s.branch}.`, tone: 'ok' }),\n () => setNotice({ text: 'Could not copy the branch name.', tone: 'error' }),\n );\n }\n break;\n case 'review':\n openDiff({ root: s.root, scope: s.dirty > 0 && s.diffstat.files === 0 ? 'working' : 'branch' });\n break;\n }\n };\n\n /**\n * ⌘K \"Create pull request…\" / \"Merge pull request…\" (command-catalog.ts\n * `git.create-pr` / `git.merge-pr`). The palette only OPENS the same dialog\n * the row's button would — the disclosure, the token gate and the server's\n * own checks all still stand between the operator and the write. It never\n * declines: a declined command from the palette vanishes without a word,\n * so when no row can take the action the bar says why instead.\n */\n const servePaletteCommand = (command: PaletteGitCommand) => {\n setDialogError(null);\n if (command === 'create-pr') {\n // The server's suggestion first; otherwise any row whose \"Create draft\n // PR…\" item is enabled — the same preconditions the ▾ menu applies, so\n // the palette offers nothing the bar itself would refuse.\n const target =\n rows.find((s) => s.suggested === 'create-pr') ??\n rows.find((s) => menuItems(s).find((item) => item.id === 'draft-pr')?.disabledReason === null);\n if (target) {\n setNotice(null);\n setDialog({ kind: 'pr', root: target.root, draft: false });\n return;\n }\n const reason = rows.length > 0 ? menuItems(rows[0]!).find((item) => item.id === 'draft-pr')?.disabledReason : null;\n setNotice({ text: reason ? `Can't open a pull request: ${asSentence(reason)}` : 'No branch in this chat has changes to open a pull request from.', tone: 'error' });\n return;\n }\n // Merge only where the server suggests it: that is the one place its\n // checks are known to have passed (see the header).\n const target = rows.find((s) => s.suggested === 'merge' && s.pr !== null);\n if (target) {\n setNotice(null);\n openMerge(target);\n return;\n }\n const open = rows.find((s) => s.pr !== null && (s.pr.state === 'open' || s.pr.state === 'draft'));\n setNotice({\n text: open?.pr ? `#${open.pr.number} isn't ready to merge yet — its checks haven't passed or it isn't mergeable.` : 'No pull request in this chat is ready to merge.',\n tone: 'error',\n });\n };\n\n // A command parked while the operator was on another surface is delivered\n // the moment this bar mounts — before its first status read answers. Hold\n // it until the read lands rather than answering \"nothing to merge\" from an\n // empty list.\n const onPaletteCommand = (command: PaletteGitCommand) => {\n if (loading) setPendingCommand(command);\n else servePaletteCommand(command);\n };\n useCommandHandler('git.create-pr', () => onPaletteCommand('create-pr'));\n useCommandHandler('git.merge-pr', () => onPaletteCommand('merge'));\n const serveRef = useRef(servePaletteCommand);\n serveRef.current = servePaletteCommand;\n useEffect(() => {\n if (pendingCommand === null || loading) return;\n setPendingCommand(null);\n serveRef.current(pendingCommand);\n }, [pendingCommand, loading]);\n\n if (rows.length === 0 && !notice) return null;\n\n const shown = expanded ? rows : rows.slice(0, 1);\n const hiddenCount = rows.length - shown.length;\n const dialogStatus = dialog ? statusFor(dialog.root) : null;\n\n return (\n <section className={styles.bar} aria-label=\"Branches\" data-compact={compact ? 'true' : 'false'}>\n <ul id={listId} className={styles.rows}>\n {shown.map((s) => (\n <BranchRow\n key={s.gitRoot ?? s.root}\n status={s}\n compact={compact}\n busy={busyRoot === s.root}\n onPrimary={() => onPrimary(s)}\n onMenu={(id) => onMenu(s, id)}\n onOpenDiff={() => openDiff({ root: s.root, scope: 'branch' })}\n />\n ))}\n </ul>\n {rows.length > 1 ? (\n <button type=\"button\" className={styles.more} aria-expanded={expanded} aria-controls={listId} onClick={() => setExpanded((v) => !v)}>\n {expanded ? 'Show fewer' : `Show ${hiddenCount} more`}\n </button>\n ) : null}\n <p className={styles.notice} role={notice?.tone === 'error' ? 'alert' : 'status'} aria-live={notice?.tone === 'error' ? 'assertive' : 'polite'} data-tone={notice?.tone ?? 'ok'}>\n {notice?.text ?? ''}\n </p>\n\n {dialogStatus && dialog?.kind === 'commit' ? (\n <CommitDialog\n open\n status={dialogStatus}\n busy={busyRoot === dialog.root}\n error={dialogError}\n onClose={() => setDialog(null)}\n onSubmit={(message) =>\n void act(dialog.root, `Commit ${dialogStatus.dirty} changed files on ${dialogStatus.branch ?? 'this branch'}.`, () => commitGit({ root: dialog.root, message }), (next) => `Committed on ${next.branch ?? 'the branch'}.`, true)\n }\n />\n ) : null}\n {dialogStatus && dialog?.kind === 'pr' ? (\n <CreatePrDialog\n open\n draft={dialog.draft}\n status={dialogStatus}\n busy={busyRoot === dialog.root}\n error={dialogError}\n onClose={() => setDialog(null)}\n onSubmit={(req) =>\n void act(\n dialog.root,\n `Push ${dialogStatus.branch ?? 'this branch'} and open a pull request into ${req.base}.`,\n async () => {\n const res = await openGitPr({ root: dialog.root, title: req.title, base: req.base, ...(req.body.trim() ? { body: req.body } : {}), ...(req.draft ? { draft: true } : {}) });\n return { status: { ...res.status, pr: res.pr ?? res.status.pr } };\n },\n (next) => (next.pr ? `Opened #${next.pr.number}.` : 'Opened the pull request.'),\n true,\n )\n }\n />\n ) : null}\n {dialog?.kind === 'merge' ? (\n // Rendered from the pin even if the live PR vanished from the poll:\n // the dialog then says so and keeps Merge disabled, rather than\n // closing under the operator's cursor.\n <MergeDialog\n open\n pin={dialog.pin}\n live={dialogStatus}\n busy={busyRoot === dialog.root}\n error={dialogError}\n onClose={() => setDialog(null)}\n onSubmit={() => {\n const { pin } = dialog;\n // Belt and braces: the dialog disables Merge on drift, and this\n // re-check covers a poll that lands between render and click.\n if (pin.headSha === null || mergeDrift(pin, statusFor(dialog.root)) !== null) return;\n void act(\n dialog.root,\n `Squash-merge #${pin.number} (head ${pin.headSha.slice(0, 7)}) into ${pin.baseRef}.`,\n async () => {\n const res = await mergeGitPr({ root: dialog.root, number: pin.number, headSha: pin.headSha! });\n return { status: { ...res.status, pr: res.pr ?? res.status.pr } };\n },\n () => `Merged #${pin.number} into ${pin.baseRef}.`,\n true,\n );\n }}\n />\n ) : null}\n <MutationTokenDialog {...gate.dialog} tokenLabel=\"Mutation token\" tokenHelp=\"the mutation token ashlr verse printed\" />\n </section>\n );\n}\n\ninterface BranchRowProps {\n status: GitStatusView;\n compact: boolean;\n busy: boolean;\n onPrimary: () => void;\n onMenu: (id: MenuActionId) => void;\n onOpenDiff: () => void;\n}\n\nfunction BranchRow({ status: s, compact, busy, onPrimary, onMenu, onOpenDiff }: BranchRowProps) {\n const primary = primaryAction(s);\n const items = menuItems(s);\n const hasStat = s.diffstat.files > 0;\n const checking = s.pr === null && s.prLookup === 'pending' && s.branch !== null && s.suggested === 'none';\n return (\n <li className={styles.row} aria-label={`${s.name}, ${s.branch ? `branch ${s.branch}` : 'detached HEAD'}`}>\n <span className={styles.ident}>\n <BranchGlyph />\n <span className={styles.repo} title={s.gitRoot ?? s.root}>{s.name}</span>\n <span className={styles.branch} title={s.branch ?? undefined}>\n {s.branch ?? 'detached HEAD'}\n </span>\n {s.behind > 0 ? <span className={styles.drift}>{s.behind} behind</span> : null}\n </span>\n {hasStat ? (\n <button\n type=\"button\"\n className={styles.stat}\n onClick={onOpenDiff}\n aria-label={`${diffstatLabel(s.diffstat.files, s.diffstat.additions, s.diffstat.deletions)}. Open the branch diff.`}\n title=\"Open the branch diff\"\n >\n <span className={styles.add}>+{formatCount(s.diffstat.additions)}</span>\n <span className={styles.del}>{'\\u2212'}{formatCount(s.diffstat.deletions)}</span>\n </button>\n ) : null}\n {s.pr ? <PrChip pr={s.pr} counts={s.prCheckCounts ?? null} showTitle={!compact} /> : null}\n {checking ? <span className={styles.checking}>Checking GitHub…</span> : null}\n {(s.conflicts ?? 0) > 0 ? <span className={styles.conflicts}>{s.conflicts} conflicted</span> : null}\n <span className={styles.spacer} />\n <ActionMenu\n primary={primary ? { label: primary.label, disclosure: primary.disclosure, onClick: onPrimary, busy, tone: primary.action === 'view-pr' ? 'subtle' : 'primary' } : null}\n items={items}\n onSelect={onMenu}\n menuLabel={`More git actions for ${s.name}`}\n disabled={busy}\n />\n </li>\n );\n}\n\nfunction BranchGlyph() {\n return (\n <svg className={styles.glyph} width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" aria-hidden=\"true\">\n <circle cx=\"4.5\" cy=\"3.5\" r=\"1.7\" />\n <circle cx=\"4.5\" cy=\"12.5\" r=\"1.7\" />\n <circle cx=\"11.5\" cy=\"5\" r=\"1.7\" />\n <path d=\"M4.5 5.2v5.6M11.5 6.7c0 3-3.5 2.7-6.3 4.6\" />\n </svg>\n );\n}\n"],"mappings":"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"}