@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
@@ -1 +0,0 @@
1
- {"version":3,"file":"PlaybooksSection-hhNpXnsR.js","names":[],"sources":["../../../../../../src/core/playbooks/parse.ts","../../../../../../src/web-ui/routes/verse/playbooks/command-workflow-paste.ts","../../../../../../src/web-ui/routes/verse/playbooks/PlaybooksView.tsx","../../../../../../src/web-ui/routes/verse/sections/PlaybooksSection.tsx"],"sourcesContent":["/**\n * Playbook markdown ⇄ structure — parsing, validation, canonical form.\n *\n * PURE and BROWSER-SAFE (the editor validates as you type): no I/O, no Node.\n *\n * Format:\n *\n * ---\n * id: fix-issue\n * name: Fix a reported bug\n * macro: !fix-bug\n * description: Reproduce, fix at the root, prove it with a test.\n * kinds: [fix]\n * repos: []\n * globs: []\n * auto: false\n * budget-usd: 5\n * budget-minutes: 60\n * done-when:\n * - A regression test fails before the fix and passes after it\n * ---\n * ## Outcome\n * …\n * ## Procedure\n * …\n *\n * A COMMAND WORKFLOW (`kind: command`, 3.15) has a smaller shape: the same\n * id / name / description, and one `## Command` section holding one fenced\n * code block — the shell command template with `{{param:default}}` holes\n * (command-template.ts). Outcome / Procedure are not required (nor allowed);\n * `auto: true` is refused (no lane ever resolves a command workflow); the\n * agent-only keys (kinds, repos, globs, budget, done-when) are dropped with\n * a warning.\n *\n * ---\n * id: new-branch\n * name: New branch from main\n * kind: command\n * ---\n * ## Command\n *\n * ```sh\n * git switch main && git pull && git switch -c {{branch}}\n * ```\n *\n * WHY a hand-rolled front-matter reader instead of YAML: the grammar is a\n * dozen flat keys, `yaml` is a dev dependency only, and a strict small reader\n * gives precise errors (\"line 4: unknown key\") instead of YAML's surprises\n * (`macro: !fix-bug` is a YAML tag; `no` is a boolean).\n *\n * The STORED form is always `serializePlaybook(parse(source))`, so two edits\n * that differ only in spacing or key order produce the same sha.\n */\nimport { TASK_KINDS, type TaskKind } from '../learn/retro/types.js';\nimport { commandFenceFor, extractCommandFence, parseCommandTemplate } from './command-template.js';\nimport {\n COMMAND_SECTION,\n PLAYBOOK_KINDS,\n PLAYBOOK_ID_PATTERN,\n PLAYBOOK_MACRO_PATTERN,\n PLAYBOOK_MAX_BYTES,\n PLAYBOOK_SECTIONS,\n REQUIRED_PLAYBOOK_SECTIONS,\n type PlaybookKind,\n type PlaybookMeta,\n type PlaybookParseResult,\n type PlaybookSectionName,\n type PlaybookSections,\n type PlaybookValidationIssue,\n} from './types.js';\n\nconst KNOWN_KEYS = new Set([\n 'id', 'name', 'macro', 'description', 'kind', 'kinds', 'repos', 'globs', 'auto', 'budget-usd', 'budget-minutes', 'done-when',\n]);\nconst LIST_KEYS = new Set(['kinds', 'repos', 'globs', 'done-when']);\n\nconst REPO_PATTERN = /^[A-Za-z0-9_.-]{1,100}\\/[A-Za-z0-9_.-]{1,100}$/;\nconst MAX_NAME = 80;\nconst MAX_DESCRIPTION = 200;\nconst MAX_LIST = 20;\nconst MAX_ITEM = 200;\n\nfunction utf8Length(s: string): number {\n // TextEncoder exists in browsers and Node alike.\n return new TextEncoder().encode(s).length;\n}\n\nfunction unquote(value: string): string {\n const v = value.trim();\n if (v.length >= 2 && ((v.startsWith('\"') && v.endsWith('\"')) || (v.startsWith(\"'\") && v.endsWith(\"'\")))) {\n return v.slice(1, -1);\n }\n return v;\n}\n\nfunction inlineList(value: string): string[] {\n const inner = value.trim().slice(1, -1).trim();\n if (!inner) return [];\n return inner.split(',').map(unquote).filter((s) => s.length > 0);\n}\n\ninterface RawFrontMatter {\n scalars: Map<string, string>;\n lists: Map<string, string[]>;\n}\n\nfunction readFrontMatter(lines: string[], errors: PlaybookValidationIssue[]): { raw: RawFrontMatter; bodyStart: number } | null {\n if (lines[0]?.trim() !== '---') {\n errors.push({ field: 'front-matter', message: 'A playbook starts with a `---` front-matter block.' });\n return null;\n }\n const end = lines.findIndex((l, i) => i > 0 && l.trim() === '---');\n if (end === -1) {\n errors.push({ field: 'front-matter', message: 'The front-matter block is not closed with `---`.' });\n return null;\n }\n const raw: RawFrontMatter = { scalars: new Map(), lists: new Map() };\n let openList: string | null = null;\n for (let i = 1; i < end; i += 1) {\n const line = lines[i]!;\n if (!line.trim() || line.trim().startsWith('#')) continue;\n const item = /^\\s+-\\s+(.*)$/.exec(line) ?? /^-\\s+(.*)$/.exec(line);\n if (item) {\n if (!openList) {\n errors.push({ field: 'front-matter', message: `Line ${i + 1}: a list item needs a key above it.` });\n continue;\n }\n raw.lists.get(openList)!.push(unquote(item[1]!));\n continue;\n }\n const kv = /^([A-Za-z][A-Za-z0-9-]*)\\s*:\\s*(.*)$/.exec(line);\n if (!kv) {\n errors.push({ field: 'front-matter', message: `Line ${i + 1}: expected \\`key: value\\`.` });\n continue;\n }\n const key = kv[1]!.toLowerCase();\n const value = kv[2]!.trim();\n openList = null;\n if (!KNOWN_KEYS.has(key)) {\n errors.push({ field: key, message: `Line ${i + 1}: unknown key \\`${key}\\`.` });\n continue;\n }\n if (raw.scalars.has(key) || raw.lists.has(key)) {\n errors.push({ field: key, message: `Line ${i + 1}: \\`${key}\\` appears twice.` });\n continue;\n }\n if (LIST_KEYS.has(key)) {\n if (value === '') {\n raw.lists.set(key, []);\n openList = key;\n } else if (value.startsWith('[') && value.endsWith(']')) {\n raw.lists.set(key, inlineList(value));\n } else {\n raw.lists.set(key, [unquote(value)]);\n }\n } else {\n raw.scalars.set(key, unquote(value));\n }\n }\n return { raw, bodyStart: end + 1 };\n}\n\ntype SectionName = PlaybookSectionName | typeof COMMAND_SECTION;\n\nfunction canonicalSection(heading: string): SectionName | null {\n const h = heading.trim().replace(/:$/, '').toLowerCase();\n if (h === COMMAND_SECTION.toLowerCase()) return COMMAND_SECTION;\n return PLAYBOOK_SECTIONS.find((s) => s.toLowerCase() === h) ?? null;\n}\n\n/** A fence line: its character, run length, and whether nothing follows the run. */\nfunction fenceOf(line: string): { ch: string; len: number; bare: boolean } | null {\n const m = /^\\s*(`{3,}|~{3,})(.*)$/.exec(line);\n return m ? { ch: m[1]![0]!, len: m[1]!.length, bare: !m[2]!.trim() } : null;\n}\n\n/**\n * Every `## ` section by canonical name (`Command` included — the caller\n * decides per kind whether it belongs). A `##` inside a fenced block is\n * text. A fence closes only on the same character, at least as long, with\n * nothing after it (CommonMark), so a ```` block can quote a ``` one.\n */\nfunction readSections(lines: string[], start: number, errors: PlaybookValidationIssue[], warnings: PlaybookValidationIssue[]): Partial<Record<SectionName, string>> {\n const sections: Partial<Record<SectionName, string>> = {};\n let current: SectionName | null = null;\n let buf: string[] = [];\n const flush = () => {\n if (current) {\n const text = buf.join('\\n').replace(/^\\s*\\n/, '').trimEnd();\n if (text.trim()) sections[current] = text;\n }\n buf = [];\n };\n let preamble = false;\n let fence: { ch: string; len: number } | null = null;\n for (let i = start; i < lines.length; i += 1) {\n const line = lines[i]!;\n const f = fenceOf(line);\n let fenceLine = false;\n if (fence) {\n if (f && f.ch === fence.ch && f.len >= fence.len && f.bare) {\n fence = null;\n fenceLine = true;\n }\n } else if (f) {\n fence = { ch: f.ch, len: f.len };\n fenceLine = true;\n }\n const h2 = fence || fenceLine ? null : /^##\\s+(.+?)\\s*#*\\s*$/.exec(line);\n if (h2 && !/^###/.test(line)) {\n flush();\n const name = canonicalSection(h2[1]!);\n if (!name) {\n errors.push({ field: 'sections', message: `Unknown section “## ${h2[1]}”. Use: ${PLAYBOOK_SECTIONS.join(', ')}.` });\n current = null;\n continue;\n }\n if (sections[name] !== undefined) {\n errors.push({ field: name, message: `“## ${name}” appears twice.` });\n }\n current = name;\n continue;\n }\n if (current) buf.push(line);\n else if (line.trim() && !/^#\\s/.test(line)) preamble = true;\n }\n flush();\n if (preamble) warnings.push({ field: 'sections', message: 'Text before the first `##` section is ignored.' });\n return sections;\n}\n\nfunction numberOrNull(raw: string | undefined, field: string, max: number, errors: PlaybookValidationIssue[]): number | null {\n if (raw === undefined || raw === '' || raw === 'null') return null;\n const n = Number(raw);\n if (!Number.isFinite(n) || n <= 0 || n > max) {\n errors.push({ field, message: `\\`${field}\\` must be a number between 0 and ${max}.` });\n return null;\n }\n return Math.round(n * 100) / 100;\n}\n\nfunction cleanList(values: string[] | undefined, field: string, errors: PlaybookValidationIssue[]): string[] {\n const list = (values ?? []).map((s) => s.trim()).filter(Boolean);\n if (list.length > MAX_LIST) errors.push({ field, message: `\\`${field}\\` has more than ${MAX_LIST} entries.` });\n for (const v of list) {\n if (v.length > MAX_ITEM) errors.push({ field, message: `An entry in \\`${field}\\` is longer than ${MAX_ITEM} characters.` });\n }\n return [...new Set(list)].slice(0, MAX_LIST);\n}\n\n/** Parse and validate one playbook source. Never throws. */\nexport function parsePlaybook(source: string): PlaybookParseResult {\n const errors: PlaybookValidationIssue[] = [];\n const warnings: PlaybookValidationIssue[] = [];\n if (typeof source !== 'string' || !source.trim()) {\n return { ok: false, errors: [{ field: 'source', message: 'The playbook is empty.' }] };\n }\n if (utf8Length(source) > PLAYBOOK_MAX_BYTES) {\n return { ok: false, errors: [{ field: 'source', message: `A playbook is at most ${PLAYBOOK_MAX_BYTES / 1024} KiB.` }] };\n }\n const lines = source.replace(/\\r\\n?/g, '\\n').split('\\n');\n const fm = readFrontMatter(lines, errors);\n if (!fm) return { ok: false, errors };\n const { scalars, lists } = fm.raw;\n\n const id = (scalars.get('id') ?? '').trim();\n if (!PLAYBOOK_ID_PATTERN.test(id)) {\n errors.push({ field: 'id', message: '`id` is required: 2–48 lowercase letters, digits or dashes.' });\n }\n const name = (scalars.get('name') ?? '').trim();\n if (!name) errors.push({ field: 'name', message: '`name` is required.' });\n else if (name.length > MAX_NAME) errors.push({ field: 'name', message: `\\`name\\` is at most ${MAX_NAME} characters.` });\n const kindRaw = (scalars.get('kind') ?? '').trim().toLowerCase() || 'agent';\n if (!(PLAYBOOK_KINDS as readonly string[]).includes(kindRaw)) {\n errors.push({ field: 'kind', message: `\\`kind\\` is ${PLAYBOOK_KINDS.map((k) => `\\`${k}\\``).join(' or ')}.` });\n }\n const kind: PlaybookKind = kindRaw === 'command' ? 'command' : 'agent';\n const macroRaw = (scalars.get('macro') ?? '').trim();\n const macro = (macroRaw ? (macroRaw.startsWith('!') ? macroRaw : `!${macroRaw}`) : `!${id}`).toLowerCase();\n if (!PLAYBOOK_MACRO_PATTERN.test(macro)) {\n errors.push({ field: 'macro', message: '`macro` is `!` followed by 2–48 lowercase letters, digits or dashes.' });\n }\n const description = (scalars.get('description') ?? '').trim();\n if (description.length > MAX_DESCRIPTION) {\n errors.push({ field: 'description', message: `\\`description\\` is at most ${MAX_DESCRIPTION} characters.` });\n }\n const kinds = cleanList(lists.get('kinds'), 'kinds', errors).map((k) => k.toLowerCase());\n const badKind = kinds.find((k) => !(TASK_KINDS as readonly string[]).includes(k));\n if (badKind) errors.push({ field: 'kinds', message: `Unknown task kind \\`${badKind}\\`. Use: ${TASK_KINDS.join(', ')}.` });\n const repos = cleanList(lists.get('repos'), 'repos', errors);\n const badRepo = repos.find((r) => !REPO_PATTERN.test(r));\n if (badRepo) errors.push({ field: 'repos', message: `\\`${badRepo}\\` is not an \\`owner/name\\` repo.` });\n const globs = cleanList(lists.get('globs'), 'globs', errors).map((g) => g.replace(/^\\.\\//, ''));\n if (globs.some((g) => g.startsWith('/') || g.split('/').includes('..'))) {\n errors.push({ field: 'globs', message: 'Globs are repo-relative (no leading `/`, no `..`).' });\n }\n const autoRaw = (scalars.get('auto') ?? 'false').toLowerCase();\n if (autoRaw !== 'true' && autoRaw !== 'false') errors.push({ field: 'auto', message: '`auto` is `true` or `false`.' });\n const auto = autoRaw === 'true';\n const doneWhen = cleanList(lists.get('done-when'), 'done-when', errors);\n const budget = {\n usd: numberOrNull(scalars.get('budget-usd'), 'budget-usd', 1000, errors),\n minutes: numberOrNull(scalars.get('budget-minutes'), 'budget-minutes', 24 * 60, errors),\n };\n const found = readSections(lines, fm.bodyStart, errors, warnings);\n if (kind === 'command') {\n return finishCommandWorkflow({ id, name, macro, description, auto, kinds, repos, globs, doneWhen, budget }, found, errors, warnings);\n }\n\n if (auto && kinds.length === 0 && repos.length === 0) {\n errors.push({ field: 'auto', message: '`auto: true` needs `kinds` or `repos` — a playbook that matches every task is not a playbook.' });\n }\n if (found[COMMAND_SECTION] !== undefined) {\n errors.push({ field: 'sections', message: `“## ${COMMAND_SECTION}” belongs to a command workflow — add \\`kind: command\\` to the front matter.` });\n }\n const sections: PlaybookSections = {};\n for (const name of PLAYBOOK_SECTIONS) {\n const text = found[name];\n if (text !== undefined) sections[name] = text;\n }\n for (const required of REQUIRED_PLAYBOOK_SECTIONS) {\n if (!sections[required]) errors.push({ field: required, message: `“## ${required}” is required.` });\n }\n\n if (errors.length > 0) return { ok: false, errors };\n const meta: PlaybookMeta = {\n id,\n name,\n macro,\n description,\n appliesTo: { repos, globs },\n taskKinds: kinds as TaskKind[],\n doneWhen,\n budget,\n auto,\n kind: 'agent',\n };\n return { ok: true, meta, sections, warnings };\n}\n\ninterface CommonFrontMatter {\n id: string;\n name: string;\n macro: string;\n description: string;\n auto: boolean;\n kinds: string[];\n repos: string[];\n globs: string[];\n doneWhen: string[];\n budget: PlaybookMeta['budget'];\n}\n\n/**\n * The `kind: command` half of parsePlaybook: one `## Command` section with\n * one code block, a template that parses, never auto; agent-only keys are\n * dropped (with a warning) so the stored form round-trips exactly.\n */\nfunction finishCommandWorkflow(\n fm: CommonFrontMatter,\n found: Partial<Record<SectionName, string>>,\n errors: PlaybookValidationIssue[],\n warnings: PlaybookValidationIssue[],\n): PlaybookParseResult {\n if (fm.auto) {\n errors.push({ field: 'auto', message: 'A command workflow is never auto-matched — it is pasted into a terminal by hand. Remove `auto: true`.' });\n }\n const agentOnly = [\n fm.kinds.length ? 'kinds' : null, fm.repos.length ? 'repos' : null, fm.globs.length ? 'globs' : null,\n fm.doneWhen.length ? 'done-when' : null, fm.budget.usd !== null ? 'budget-usd' : null, fm.budget.minutes !== null ? 'budget-minutes' : null,\n ].filter((k): k is string => k !== null);\n if (agentOnly.length > 0) {\n warnings.push({\n field: 'kind',\n message: `${agentOnly.map((k) => `\\`${k}\\``).join(', ')} ${agentOnly.length === 1 ? 'does' : 'do'} not apply to a command workflow and will be dropped.`,\n });\n }\n const extra = PLAYBOOK_SECTIONS.filter((name) => found[name] !== undefined);\n if (extra.length > 0) {\n errors.push({ field: 'sections', message: `A command workflow has one section, “## ${COMMAND_SECTION}” — not ${extra.map((n) => `“## ${n}”`).join(', ')}.` });\n }\n const body = found[COMMAND_SECTION];\n let command: PlaybookMeta['command'];\n if (body === undefined) {\n errors.push({ field: COMMAND_SECTION, message: `“## ${COMMAND_SECTION}” is required: one fenced code block with the command.` });\n } else {\n const fence = extractCommandFence(body);\n if (!fence.ok) {\n errors.push({ field: COMMAND_SECTION, message: fence.error });\n } else {\n const template = parseCommandTemplate(fence.template);\n for (const message of template.errors) errors.push({ field: COMMAND_SECTION, message });\n command = { template: fence.template, params: template.params };\n }\n }\n if (errors.length > 0 || !command) return { ok: false, errors };\n const meta: PlaybookMeta = {\n id: fm.id,\n name: fm.name,\n macro: fm.macro,\n description: fm.description,\n appliesTo: { repos: [], globs: [] },\n taskKinds: [],\n doneWhen: [],\n budget: { usd: null, minutes: null },\n auto: false,\n kind: 'command',\n command,\n };\n return { ok: true, meta, sections: {}, warnings };\n}\n\nfunction listLines(key: string, values: readonly string[]): string[] {\n if (values.length === 0) return [`${key}: []`];\n return [`${key}:`, ...values.map((v) => ` - ${v}`)];\n}\n\n/** The canonical markdown for a playbook. Pure; `parse(serialize(x))` round-trips. */\nexport function serializePlaybook(meta: PlaybookMeta, sections: PlaybookSections): string {\n if (meta.kind === 'command' && meta.command) {\n // Only what a command workflow uses; the macro only when it is not the default.\n const fence = commandFenceFor(meta.command.template);\n const head = [\n '---',\n `id: ${meta.id}`,\n `name: ${meta.name}`,\n ...(meta.macro !== `!${meta.id}` ? [`macro: ${meta.macro}`] : []),\n ...(meta.description ? [`description: ${meta.description}`] : []),\n 'kind: command',\n '---',\n ];\n return `${head.join('\\n')}\\n\\n## ${COMMAND_SECTION}\\n\\n${fence}sh\\n${meta.command.template}\\n${fence}\\n`;\n }\n const fm = [\n '---',\n `id: ${meta.id}`,\n `name: ${meta.name}`,\n `macro: ${meta.macro}`,\n ...(meta.description ? [`description: ${meta.description}`] : []),\n `kinds: [${meta.taskKinds.join(', ')}]`,\n `repos: [${meta.appliesTo.repos.join(', ')}]`,\n // A glob like `src/{a,b}/**` carries commas: the block form keeps it whole.\n ...(meta.appliesTo.globs.some((g) => /[,[\\]]/.test(g))\n ? listLines('globs', meta.appliesTo.globs)\n : [`globs: [${meta.appliesTo.globs.join(', ')}]`]),\n `auto: ${meta.auto ? 'true' : 'false'}`,\n ...(meta.budget.usd !== null ? [`budget-usd: ${meta.budget.usd}`] : []),\n ...(meta.budget.minutes !== null ? [`budget-minutes: ${meta.budget.minutes}`] : []),\n ...listLines('done-when', meta.doneWhen),\n '---',\n ];\n const body: string[] = [];\n for (const name of PLAYBOOK_SECTIONS) {\n const text = sections[name];\n if (!text) continue;\n body.push(`## ${name}`, '', text.trim(), '');\n }\n return `${fm.join('\\n')}\\n\\n${body.join('\\n').trimEnd()}\\n`;\n}\n\n/** Parse then re-serialize. The form the store writes. */\nexport function canonicalizePlaybook(source: string): PlaybookParseResult & { source?: string } {\n const parsed = parsePlaybook(source);\n if (!parsed.ok) return parsed;\n return { ...parsed, source: serializePlaybook(parsed.meta, parsed.sections) };\n}\n\n/** A blank playbook for \"New playbook\" (with `kind: 'command'`, for \"New command workflow\"). Pure. */\nexport function playbookTemplate(id = 'my-playbook', kind: PlaybookKind = 'agent'): string {\n if (kind === 'command') {\n const template = 'git switch -c {{branch}} && git push -u {{remote:origin}} {{branch}}';\n return serializePlaybook(\n {\n id,\n name: 'New command workflow',\n macro: `!${id}`,\n description: 'What this command does, in one line. It is pasted into your terminal, never run.',\n appliesTo: { repos: [], globs: [] },\n taskKinds: [],\n doneWhen: [],\n budget: { usd: null, minutes: null },\n auto: false,\n kind: 'command',\n command: { template, params: parseCommandTemplate(template).params },\n },\n {},\n );\n }\n return serializePlaybook(\n {\n id,\n name: 'New playbook',\n macro: `!${id}`,\n description: 'What this playbook is for, in one line.',\n appliesTo: { repos: [], globs: [] },\n taskKinds: [],\n doneWhen: ['The project’s own test command passes'],\n budget: { usd: null, minutes: null },\n auto: false,\n },\n {\n Outcome: 'What is true when this is done.',\n Procedure: '1. First step.\\n2. Second step.',\n Specifications: '- Constraints the result must meet.',\n Advice: '- Tips that make this go well.',\n 'Forbidden actions': '- Do not weaken or skip tests.',\n 'Required from user': '- What the task description must include.',\n },\n );\n}\n","/**\n * routes/verse/playbooks/command-workflow-paste.ts — where a filled command\n * workflow goes from the Playbooks section: the open chat's Terminal pane,\n * PASTED at the prompt through the dock's one-shot request\n * (dock-store.ts `requestTerminal({ paste })`). The Terminal pane types it\n * (bracketed paste; a multi-line command without bracketed paste is copied\n * instead — TerminalLeaf.tsx) and never presses Enter: running it is the\n * operator's keystroke.\n *\n * The terminal panel's own menu mounts CommandWorkflowPicker with its own\n * `onPaste` (straight into the focused tab); this module is only the path\n * from the gear tray.\n */\nimport { openDockPane, requestTerminal } from '../dock/dock-store.js';\nimport { isSlotAvailable } from '../shell/slots.js';\nimport { setVerseSection } from '../verse-ui-store.js';\n\n/** Why a filled command cannot be pasted from here, or null when it can. Pure over its inputs. */\nexport function commandPasteUnavailableReason(input: { activeSessionId: string | null; terminalLanded?: boolean }): string | null {\n const landed = input.terminalLanded ?? isSlotAvailable('terminal-pane');\n if (!landed) return 'This build has no Verse terminal yet.';\n if (input.activeSessionId === null) return 'Open a chat first — the command is pasted into its terminal.';\n return null;\n}\n\n/**\n * Open the chat's Terminal pane and paste `text` at its prompt; bring Chat\n * forward. The request waits in the dock store until the pane serves it\n * (ChatSection clears requests only on a chat SWITCH, not its first mount).\n */\nexport function pasteIntoChatTerminal(text: string): void {\n // Never a trailing newline: a paste must not submit.\n const paste = text.replace(/[\\r\\n]+$/, '');\n if (!paste) return;\n openDockPane('terminal');\n requestTerminal({ paste });\n setVerseSection('chat');\n}\n","/**\n * routes/verse/playbooks/PlaybooksView.tsx — versioned playbooks (3.15).\n *\n * A library you open, not a surface you watch (so it lives in the gear\n * tray, beside the Repo wiki): the list on the left; on the right one\n * playbook as an engine reads it, its versions with what each version's\n * runs ended as (merged / refused / reverted / failed, from retros), and\n * \"Run…\" — which writes its `!macro` into the chat message so the operator\n * describes the task and picks where it runs: sent in the chat (any seat\n * expands it — session-engine.ts), Run in cloud, Run in Devin, ….\n *\n * Command workflows (`kind: command`) live here too, badged \"Command\": a\n * shell command with `{{param}}` holes. Their \"Use…\" opens a small form\n * (CommandWorkflowForm) and pastes the filled command into the open chat's\n * Terminal pane — pasted at the prompt, never run.\n *\n * Editing never rewrites: Save writes the next version (the server refuses\n * if someone saved in between). Viewing an older version and choosing\n * \"Edit from vN\" is how a version is restored — as a new one.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, useSyncExternalStore } from 'react';\nimport { parsePlaybook, playbookTemplate } from '../../../../core/playbooks/parse.js';\nimport { playbookKindOf, type PlaybookDetailResponse, type PlaybookKind, type PlaybookSummary, type PlaybookValidationIssue } from '../../../../core/playbooks/types.js';\nimport { MutationTokenDialog } from '../../../components/auth/MutationTokenDialog.js';\nimport { Button } from '../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../components/primitives/EmptyState.js';\nimport { IconPlay, IconPlus } from '../../../components/primitives/icons.js';\nimport { SkeletonLine } from '../../../components/primitives/Skeleton.js';\nimport { useQuery, useRefetch } from '../../../data/hooks.js';\nimport { describeContextError, useTokenGate, type TokenGate } from '../context/use-token-gate.js';\nimport { renderMarkdown } from '../MessageMarkdownRenderer.js';\nimport { useVerseUi } from '../useVerseUi.js';\nimport { commandPasteUnavailableReason, pasteIntoChatTerminal } from './command-workflow-paste.js';\nimport { CommandWorkflowForm } from './CommandWorkflowForm.js';\nimport { putMacroInComposer } from './playbook-composer.js';\nimport { getPlaybookFocus, isPlaybookFocusLive, subscribePlaybookFocus, takePlaybookFocus } from './playbook-focus.js';\nimport { playbookDetailQuery, playbooksQuery, savePlaybookSource } from './playbooks-queries.js';\nimport styles from './Playbooks.module.css';\n\ntype Notice = { tone: 'neutral' | 'danger' | 'success'; text: string } | null;\ntype Editing = { mode: 'new'; kind: PlaybookKind } | { mode: 'edit'; id: string; baseVersion: number; source: string; from: number } | null;\n/** ⌘K hand-offs: \"Run playbook…\" (any playbook) or \"Run command workflow…\" (command workflows only). */\ntype PickMode = 'run' | 'workflows' | null;\n\nconst SELECTED_STORAGE_KEY = 'verse.playbooks.selected';\n\nfunction readStored(): string | null {\n try {\n return localStorage.getItem(SELECTED_STORAGE_KEY);\n } catch {\n return null;\n }\n}\n\nfunction writeStored(id: string): void {\n try {\n localStorage.setItem(SELECTED_STORAGE_KEY, id);\n } catch {\n // private mode / quota: the choice just is not remembered\n }\n}\n\n/** Case-insensitive filter over name, id, macro and description. Pure. */\nexport function filterPlaybooks(rows: readonly PlaybookSummary[], query: string): PlaybookSummary[] {\n const q = query.trim().toLowerCase().replace(/^!/, '');\n if (!q) return [...rows];\n return rows.filter((r) => [r.name, r.id, r.macro, r.description].some((s) => s.toLowerCase().includes(q)));\n}\n\nexport function PlaybooksView() {\n const list = useQuery(playbooksQuery, { freshMs: 30_000 });\n const refetchList = useRefetch(playbooksQuery);\n const gate = useTokenGate();\n const rows = useMemo(() => list.data?.value ?? [], [list.data]);\n const [chosen, setChosen] = useState<string | null>(() => readStored());\n const [filter, setFilter] = useState('');\n const [notice, setNotice] = useState<Notice>(null);\n const [editing, setEditing] = useState<Editing>(null);\n const [pickMode, setPickMode] = useState<PickMode>(null);\n const filterRef = useRef<HTMLInputElement>(null);\n\n const visible = useMemo(() => {\n const matching = filterPlaybooks(rows, filter);\n return pickMode === 'workflows' ? matching.filter((r) => playbookKindOf(r) === 'command') : matching;\n }, [rows, filter, pickMode]);\n const selected = (pickMode === 'workflows' ? visible.find((r) => r.id === chosen) ?? visible[0] : null)\n ?? rows.find((r) => r.id === chosen) ?? rows[0] ?? null;\n\n const choose = useCallback((id: string) => {\n setChosen(id);\n writeStored(id);\n setEditing(null);\n }, []);\n\n // ⌘K \"Run playbook…\": open in \"pick one to run\" mode, the filter focused.\n const focus = useSyncExternalStore(subscribePlaybookFocus, getPlaybookFocus, getPlaybookFocus);\n useEffect(() => {\n if (!focus) return;\n if (isPlaybookFocusLive(focus)) {\n setPickMode(focus.kind);\n setEditing(null);\n filterRef.current?.focus();\n }\n takePlaybookFocus(focus.seq);\n }, [focus]);\n\n const run = useCallback(async (macro: string) => {\n setNotice(null);\n const ok = await putMacroInComposer(macro);\n if (ok) setPickMode(null);\n else setNotice({ tone: 'neutral', text: `Open a chat first, then run ${macro} from its message box.` });\n }, []);\n\n const unavailable = list.data && !list.data.value ? list.data.reason : null;\n\n return (\n <section className={styles.section} aria-label=\"Playbooks\">\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}>Playbooks</h2>\n <p className={styles.lede}>\n Reusable, versioned task templates. Type <code>!macro</code> in any chat — Claude Code, Codex, Grok, local or Devin — or in a goal,\n Run in cloud or Run in Devin, and that run follows the playbook (a sent message shows which one). Every edit is a new version, and\n each version shows how its fleet, cloud and Devin runs ended.\n </p>\n </div>\n <div className={styles.actions}>\n <Button variant=\"subtle\" size=\"sm\" icon={<IconPlus size={14} />} onClick={() => { setEditing({ mode: 'new', kind: 'command' }); setNotice(null); }}>\n New command workflow\n </Button>\n <Button variant=\"subtle\" size=\"sm\" icon={<IconPlus size={14} />} onClick={() => { setEditing({ mode: 'new', kind: 'agent' }); setNotice(null); }}>\n New playbook\n </Button>\n </div>\n </header>\n\n {pickMode === 'run' ? (\n <p className={styles.banner} role=\"status\">\n Pick a playbook and choose <strong>Run…</strong>: its macro goes into your chat message, where you describe the task and choose where it runs.\n </p>\n ) : pickMode === 'workflows' ? (\n <p className={styles.banner} role=\"status\">\n Pick a command workflow and choose <strong>Use…</strong>: fill it in and it is pasted into your chat’s terminal — you press Enter.\n </p>\n ) : null}\n <p className={notice ? styles.banner : styles.visuallyHidden} data-tone={notice?.tone} role=\"status\" aria-live=\"polite\">{notice?.text ?? ''}</p>\n\n {list.data === undefined && !list.error ? (\n <div aria-busy=\"true\" aria-label=\"Loading playbooks\">\n <SkeletonLine width=\"40%\" />\n <SkeletonLine width=\"70%\" />\n </div>\n ) : list.error || unavailable ? (\n <p className={styles.banner} data-tone=\"danger\">{unavailable ?? describeContextError(list.error)}</p>\n ) : editing?.mode === 'new' ? (\n <PlaybookEditor\n key={`new:${editing.kind}`}\n initial={editing.kind === 'command' ? playbookTemplate('my-command', 'command') : playbookTemplate('my-playbook')}\n baseVersion={null}\n title={editing.kind === 'command' ? 'New command workflow' : 'New playbook'}\n gate={gate}\n onCancel={() => setEditing(null)}\n onSaved={(id, version) => {\n setEditing(null);\n refetchList();\n choose(id);\n setNotice({ tone: 'success', text: `Saved ${id}@v${version}.` });\n }}\n />\n ) : rows.length === 0 || !selected ? (\n <EmptyState title=\"No playbooks\" body=\"Create one with New playbook, or `ashlr playbook new <id>`.\" />\n ) : (\n <div className={styles.body}>\n <nav className={styles.list} aria-label=\"Playbooks\">\n <input\n ref={filterRef}\n className={styles.filter}\n type=\"search\"\n value={filter}\n placeholder=\"Filter playbooks\"\n aria-label=\"Filter playbooks\"\n onChange={(e) => setFilter(e.target.value)}\n />\n <ul>\n {visible.map((r) => (\n <li key={r.id}>\n <button type=\"button\" aria-current={selected.id === r.id ? 'page' : undefined} onClick={() => choose(r.id)}>\n <span className={styles.rowName}>{r.name}</span>\n <span className={styles.rowMeta}>\n {playbookKindOf(r) === 'command'\n ? <><span className={styles.kindBadge}>Command</span> · v{r.latest}</>\n : <><code>{r.macro}</code> · v{r.latest}{r.auto ? ' · auto' : ''}</>}\n {r.builtin ? ' · built-in' : ''}\n </span>\n </button>\n </li>\n ))}\n {visible.length === 0 ? (\n <li className={styles.meta}>\n {pickMode === 'workflows' && !filter.trim() ? 'No command workflows yet — create one with New command workflow.' : `No playbook matches “${filter}”.`}\n </li>\n ) : null}\n </ul>\n </nav>\n {editing?.mode === 'edit' && editing.id === selected.id ? (\n <PlaybookEditor\n key={`edit:${editing.id}:${editing.from}`}\n initial={editing.source}\n baseVersion={editing.baseVersion}\n title={editing.from === editing.baseVersion ? `Edit ${selected.name}` : `Edit ${selected.name} from v${editing.from}`}\n gate={gate}\n onCancel={() => setEditing(null)}\n onSaved={(id, version) => {\n setEditing(null);\n refetchList();\n setNotice({ tone: 'success', text: `Saved ${id}@v${version}.` });\n }}\n />\n ) : (\n <PlaybookPanel\n key={`${selected.id}:${selected.latest}`}\n summary={selected}\n onRun={(macro) => void run(macro)}\n onPasted={() => setPickMode(null)}\n onEdit={(source, from) => setEditing({ mode: 'edit', id: selected.id, baseVersion: selected.latest, source, from })}\n />\n )}\n </div>\n )}\n </div>\n </div>\n <MutationTokenDialog\n open={gate.dialog.open}\n reason={gate.dialog.reason}\n tokenLabel=\"Mutation token\"\n tokenHelp=\"the mutation token ashlr verse printed\"\n onClose={gate.dialog.onClose}\n onUnlocked={gate.dialog.onUnlocked}\n />\n </section>\n );\n}\n\n// ---------------------------------------------------------------------------\n// One playbook\n// ---------------------------------------------------------------------------\n\nfunction outcomeCell(n: number) {\n return n === 0 ? <span className={styles.zero}>0</span> : n;\n}\n\ninterface PanelProps {\n summary: PlaybookSummary;\n onRun: (macro: string) => void;\n onEdit: (source: string, from: number) => void;\n /** A command workflow was pasted into the chat's terminal. */\n onPasted: () => void;\n}\n\nfunction PlaybookPanel({ summary, onRun, onEdit, onPasted }: PanelProps) {\n const [version, setVersion] = useState<number | null>(null);\n const [using, setUsing] = useState(false);\n const { activeSessionId } = useVerseUi();\n const isCommand = playbookKindOf(summary) === 'command';\n const def = useMemo(() => playbookDetailQuery(summary.id, version), [summary.id, version]);\n const q = useQuery(def, { freshMs: 30_000 });\n const data: PlaybookDetailResponse | undefined = q.data;\n const html = useMemo(() => (data ? renderMarkdown(data.rendered) : ''), [data]);\n const shown = data?.playbook.version ?? summary.latest;\n const isLatest = shown === summary.latest;\n const macro = isLatest ? summary.macro : `${summary.macro}@v${shown}`;\n // The version on screen (an older one can be used too); the list row's until the detail arrives.\n const command = (data?.playbook.meta.kind === 'command' ? data.playbook.meta.command : undefined) ?? (isLatest ? summary.command : undefined);\n\n return (\n <article className={styles.detail} aria-label={summary.name}>\n <div className={styles.detailHead}>\n <div className={styles.detailTitle}>\n <h3>{summary.name}</h3>\n <p className={styles.meta}>\n {isCommand ? <span className={styles.kindBadge}>Command</span> : <code>{summary.macro}</code>}\n {' '}· {summary.id}@v{shown}{summary.auto ? ' · auto-matches' : ''}{summary.builtin ? ' · shipped with ashlr' : ''}\n </p>\n </div>\n <label className={styles.picker}>\n <span className={styles.visuallyHidden}>Version</span>\n <select aria-label=\"Version\" value={shown} onChange={(e) => setVersion(Number(e.target.value) === summary.latest ? null : Number(e.target.value))}>\n {[...(data?.versions ?? [{ version: summary.latest }])].reverse().map((v) => (\n <option key={v.version} value={v.version}>v{v.version}{v.version === summary.latest ? ' (latest)' : ''}</option>\n ))}\n </select>\n </label>\n {isCommand ? (\n <Button variant=\"primary\" size=\"sm\" icon={<IconPlay size={14} />} disabled={!command} aria-expanded={using} onClick={() => setUsing((u) => !u)}>\n Use…\n </Button>\n ) : (\n <Button variant=\"primary\" size=\"sm\" icon={<IconPlay size={14} />} onClick={() => onRun(macro)}>Run…</Button>\n )}\n <Button variant=\"subtle\" size=\"sm\" disabled={!data} onClick={() => data && onEdit(data.playbook.source, shown)}>\n {isLatest ? 'Edit' : `Edit from v${shown}`}\n </Button>\n </div>\n {summary.description ? <p className={styles.description}>{summary.description}</p> : null}\n {isCommand && using && command ? (\n <CommandWorkflowForm\n key={`${summary.id}@${shown}`}\n name={summary.name}\n template={command.template}\n params={command.params}\n pasteDisabledReason={commandPasteUnavailableReason({ activeSessionId })}\n onCancel={() => setUsing(false)}\n onPaste={(text) => {\n pasteIntoChatTerminal(text);\n setUsing(false);\n onPasted();\n }}\n />\n ) : null}\n\n {data === undefined && !q.error ? (\n <div aria-busy=\"true\">\n <SkeletonLine width=\"40%\" />\n <SkeletonLine width=\"90%\" />\n </div>\n ) : q.error || !data ? (\n <p className={styles.banner} data-tone=\"danger\">{q.error ? describeContextError(q.error) : 'This playbook could not be read.'}</p>\n ) : isCommand ? (\n <>\n <h4 className={styles.subhead}>The command</h4>\n <div className={styles.markdown} aria-label=\"Rendered playbook\" dangerouslySetInnerHTML={{ __html: html }} />\n </>\n ) : (\n <>\n <table className={styles.outcomes} aria-label=\"Outcomes by version\">\n <thead>\n <tr>\n <th scope=\"col\">Version</th>\n <th scope=\"col\">Written</th>\n <th scope=\"col\">Merged</th>\n <th scope=\"col\">Refused</th>\n <th scope=\"col\">Reverted</th>\n <th scope=\"col\">Failed</th>\n <th scope=\"col\">Note</th>\n </tr>\n </thead>\n <tbody>\n {[...data.versions].reverse().map((v) => (\n <tr key={v.version} aria-current={v.version === shown ? 'true' : undefined}>\n <th scope=\"row\">v{v.version}</th>\n <td>{v.createdAt.slice(0, 10)}</td>\n <td>{outcomeCell(v.outcomes.merged)}</td>\n <td>{outcomeCell(v.outcomes.refused)}</td>\n <td>{outcomeCell(v.outcomes.reverted)}</td>\n <td>{outcomeCell(v.outcomes.failed)}</td>\n <td className={styles.note}>{v.note ?? ''}{v.author ? <span className={styles.meta}> — {v.author}</span> : null}</td>\n </tr>\n ))}\n </tbody>\n </table>\n <p className={styles.meta}>Counts come from retros of finished runs; a run still in flight counts nowhere yet.</p>\n <h4 className={styles.subhead}>As an engine reads it</h4>\n <div className={styles.markdown} aria-label=\"Rendered playbook\" dangerouslySetInnerHTML={{ __html: html }} />\n </>\n )}\n </article>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Editor (create, or the next version)\n// ---------------------------------------------------------------------------\n\ninterface EditorProps {\n initial: string;\n /** null = create. */\n baseVersion: number | null;\n title: string;\n gate: TokenGate;\n onCancel: () => void;\n onSaved: (id: string, version: number) => void;\n}\n\nfunction PlaybookEditor({ initial, baseVersion, title, gate, onCancel, onSaved }: EditorProps) {\n const [source, setSource] = useState(initial);\n const [note, setNote] = useState('');\n const [busy, setBusy] = useState(false);\n const [serverErrors, setServerErrors] = useState<PlaybookValidationIssue[] | null>(null);\n const [failure, setFailure] = useState<string | null>(null);\n const parsed = useMemo(() => parsePlaybook(source), [source]);\n const errors = serverErrors ?? (parsed.ok ? [] : parsed.errors);\n const commandKind = parsed.ok ? parsed.meta.kind === 'command' : /^kind:\\s*command\\s*$/m.test(source);\n const warnings = parsed.ok ? parsed.warnings : [];\n\n const save = async () => {\n setBusy(true);\n setFailure(null);\n setServerErrors(null);\n try {\n const res = await gate.run(baseVersion === null ? 'Create this playbook' : 'Save a new version of this playbook', () =>\n savePlaybookSource({ source, ...(baseVersion !== null ? { baseVersion } : {}), ...(note.trim() ? { note: note.trim() } : {}) }),\n );\n if (res === null) return;\n if (res.ok) onSaved(res.playbook.meta.id, res.playbook.version);\n else setServerErrors(res.errors);\n } catch (err) {\n setFailure(describeContextError(err));\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <form className={styles.editor} aria-label={title} onSubmit={(e) => { e.preventDefault(); void save(); }}>\n <div className={styles.detailHead}>\n <div className={styles.detailTitle}>\n <h3>{title}</h3>\n <p className={styles.meta}>\n {baseVersion === null ? 'Saved as v1.' : `Saved as v${baseVersion + 1}; v${baseVersion} and earlier stay exactly as they were.`}\n {commandKind ? (\n <>\n {' '}One section, <code>## Command</code>, holding one code block; <code>{'{{name}}'}</code> and <code>{'{{name:default}}'}</code> become\n the form’s fields, each filled in as one quoted shell word.\n </>\n ) : ' Sections: Outcome, Procedure (required), Specifications, Advice, Forbidden actions, Required from user.'}\n </p>\n </div>\n </div>\n <textarea\n className={styles.source}\n value={source}\n spellCheck={false}\n aria-label=\"Playbook markdown\"\n aria-invalid={errors.length > 0}\n onChange={(e) => { setSource(e.target.value); setServerErrors(null); }}\n />\n {errors.length > 0 ? (\n <ul className={styles.errors} aria-label=\"Problems\">\n {errors.map((e, i) => <li key={`${e.field}:${i}`}>{e.message}</li>)}\n </ul>\n ) : warnings.length > 0 ? (\n <ul className={styles.warnings} aria-label=\"Warnings\">\n {warnings.map((w, i) => <li key={`${w.field}:${i}`}>{w.message}</li>)}\n </ul>\n ) : null}\n <label className={styles.noteField}>\n <span>What changed (optional)</span>\n <input type=\"text\" value={note} maxLength={200} onChange={(e) => setNote(e.target.value)} />\n </label>\n {failure ? <p className={styles.banner} data-tone=\"danger\" role=\"alert\">{failure}</p> : null}\n <div className={styles.actions}>\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>Cancel</Button>\n <Button type=\"submit\" variant=\"primary\" size=\"sm\" busy={busy} disabled={!parsed.ok}>\n {baseVersion === null ? 'Create' : `Save v${baseVersion + 1}`}\n </Button>\n </div>\n </form>\n );\n}\n","/**\n * routes/verse/sections/PlaybooksSection.tsx — the Playbooks tray section\n * (3.15). Takes no props, per the shell contract; its own lazy chunk (the\n * section glob in shell/section-modules.ts). Reached from the gear tray and\n * from ⌘K (\"Open Playbooks\", \"Run playbook…\").\n */\nimport { PlaybooksView } from '../playbooks/PlaybooksView.js';\n\nexport function PlaybooksSection() {\n return <PlaybooksView />;\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{O as r,i,t as a,w as o}from"./global-BJ_kVFpD.js";import{i as s}from"./SkipToContent-BjJE6yOo.js";import{gt as ee}from"./VerseConsoleApp-Cj6yPJo3.js";import{M as c,X as te,Z as l,j as ne,ut as u}from"./VerseShared-CH8mV5ew.js";import{t as re}from"./Segmented-Dokzywy8.js";import{n as d,t as f}from"./Button-DJY_Pu5B.js";import{T as p,l as ie,v as ae}from"./icons-MYfI6vZr.js";import{t as m}from"./EmptyState-Cwpga8L9.js";import{t as h}from"./MessageMarkdown-CQEqoMvf.js";import{t as oe}from"./pane-chrome.module-D7o-fVd0.js";import{a as se,c as ce,d as le,i as ue,l as de,n as fe,o as pe,s as g,t as me}from"./terminal-icons-BakeOpKV.js";var _=e(n(),1),v=`/api/verse/preview/ticket`;function y(e){return new URLSearchParams(e).toString()}var b={targets:(e,t)=>i(`${l}?${y({sessionId:e})}`,t),ticket:(e,t)=>i(`${v}?${y({sessionId:e,path:t})}`),text:async(e,t)=>{let n=`${te}?${y({sessionId:e,path:t})}`,i=await fetch(n,{credentials:`same-origin`,headers:{"x-ashlr-read-client":o()}});if(i.status===401)throw r(),new a(`Read session expired.`,401,n);if(!i.ok)throw new a(`GET ${n} failed (HTTP ${i.status}).`,i.status,n);return i.text()}};function x(e){return e.port||(e.protocol===`https:`?`443`:`80`)}function S(e,t){let n=e.trim();if(n.length===0||n.length>2048||/\s/.test(n))return{kind:`invalid`};let r=n;if(/^:?\d{2,5}$/.test(n))r=`http://localhost:${n.replace(`:`,``)}/`;else if(/^(?:localhost|127\.0\.0\.1)(?::\d{1,5})?(?:[/?#].*)?$/i.test(n))r=`http://${n}`;else if(!/^[a-z][a-z0-9+.-]*:/i.test(n)){if(!/^[\w-]+(?:\.[\w-]+)+(?::\d{1,5})?(?:[/?#].*)?$/.test(n))return{kind:`invalid`};r=`https://${n}`}let i;try{i=new URL(r)}catch{return{kind:`invalid`}}if(i.protocol!==`http:`&&i.protocol!==`https:`)return{kind:`invalid`};if(u(i.href)){let e=null;try{e=new URL(t)}catch{e=null}return e&&(e.hostname===`localhost`||e.hostname===`127.0.0.1`)&&x(e)===x(i)?{kind:`self`,url:i.href}:{kind:`loopback`,url:i.href}}return i.username||i.password?{kind:`invalid`}:{kind:`external`,url:i.href}}function C(e){try{let t=new URL(e),n=t.pathname===`/`?``:t.pathname;return`${t.host}${n}${t.search}`}catch{return e}}function w(e){return!Number.isFinite(e)||e<0?`—`:e<1024?`${e} B`:e<1048576?`${(e/1024).toFixed(+(e<10240))} KB`:`${(e/1048576).toFixed(1)} MB`}var T={pane:`_pane_k6hui_8`,strip:`_strip_k6hui_19`,tabs:`_tabs_k6hui_28`,tab:`_tab_k6hui_28`,tabButton:`_tabButton_k6hui_60`,tabClose:`_tabClose_k6hui_78`,noticeClose:`_noticeClose_k6hui_79`,external:`_external_k6hui_80`,tabTitle:`_tabTitle_k6hui_85`,newTab:`_newTab_k6hui_118`,toolbar:`_toolbar_k6hui_126`,nav:`_nav_k6hui_128`,addressForm:`_addressForm_k6hui_134`,address:`_address_k6hui_134`,addressNote:`_addressNote_k6hui_177`,notice:`_notice_k6hui_79`,waiting:`_waiting_k6hui_179`,waitingText:`_waitingText_k6hui_201`,pulse:`_pulse_k6hui_208`,body:`_body_k6hui_234`,loading:`_loading_k6hui_243`,stage:`_stage_k6hui_250`,frame:`_frame_k6hui_262`,frameHint:`_frameHint_k6hui_278`,imageStage:`_imageStage_k6hui_291`,image:`_image_k6hui_291`,markdown:`_markdown_k6hui_308`,launcher:`_launcher_k6hui_316`,section:`_section_k6hui_322`,sectionTitle:`_sectionTitle_k6hui_328`,muted:`_muted_k6hui_339`,rows:`_rows_k6hui_347`,row:`_row_k6hui_347`,dot:`_dot_k6hui_364`,fileIcon:`_fileIcon_k6hui_376`,rowMain:`_rowMain_k6hui_378`,rowTitle:`_rowTitle_k6hui_385`,rowMeta:`_rowMeta_k6hui_395`,rowCommand:`_rowCommand_k6hui_405`},E=t(),he={api:b,origin:()=>window.location.origin,now:()=>Date.now()},ge=12e4,_e=2e3,ve=5e3,D=`ashlr.verse.preview.v1:`,O={"launch-json":`launch.json`,"package-json":`package.json`,listening:`running`},ye={html:`HTML`,md:`Markdown`,svg:`SVG`,image:`Image`,pdf:`PDF`},k=0,A=0,j=()=>`p${++A}`;function M(){k=0,A=0}function N(e){let t=e.toLowerCase().slice(e.lastIndexOf(`.`));return t===`.html`||t===`.htm`?`html`:t===`.md`||t===`.markdown`?`md`:t===`.svg`?`svg`:t===`.pdf`?`pdf`:[`.png`,`.jpg`,`.jpeg`,`.gif`,`.webp`,`.avif`,`.bmp`,`.ico`].includes(t)?`image`:null}function P(e){return e.slice(e.lastIndexOf(`/`)+1)||e}function F(e){return e.kind===`launcher`?`New tab`:e.kind===`url`?C(e.history[e.index]??``):P(e.path)}function be(e){return e?.kind===`url`?e.history[e.index]??null:null}function xe(e,t){try{let n=localStorage.getItem(`${D}${e}`);if(!n)return null;let r=JSON.parse(n),i=[],a=null;return Array.isArray(r.tabs)&&r.tabs.slice(0,12).forEach((e,n)=>{if(!e||typeof e!=`object`)return;let o=e,s=j();if(o.url&&typeof o.url==`string`&&S(o.url,t).kind===`loopback`)i.push({id:s,kind:`url`,history:[o.url],index:0,reloadKey:0});else if(typeof o.path==`string`){let e=N(o.path);if(e)i.push({id:s,kind:`artifact`,path:o.path,artifactKind:e,reloadKey:0});else return}else return;r.active===n&&(a=s)}),{tabs:i,activeId:a??i.at(-1)?.id??null,device:r.device===`phone`?`phone`:`desktop`}}catch{return null}}function Se(e,t,n,r){try{let i=t.filter(e=>e.kind!==`launcher`);localStorage.setItem(`${D}${e}`,JSON.stringify({tabs:i.map(e=>e.kind===`url`?{url:e.history[e.index]}:e.kind===`artifact`?{path:e.path}:{}),active:i.findIndex(e=>e.id===n),device:r}))}catch{}}function I({sessionId:e,roots:t,request:n,onOpenTerminal:r,visible:i,deps:o}){let s=(0,_.useMemo)(()=>({...he,...o}),[o]),te=c(),l=i&&te,u=ee().compact,[m]=(0,_.useState)(()=>xe(e,s.origin())),[h,g]=(0,_.useState)(()=>m?.tabs??[]),[v,y]=(0,_.useState)(()=>m?.activeId??null),[b,x]=(0,_.useState)(()=>m?.device??`desktop`),[w,ge]=(0,_.useState)(e),[D,O]=(0,_.useState)(null),[ye,A]=(0,_.useState)(null),[M,P]=(0,_.useState)(``),[I,L]=(0,_.useState)(null),[R,z]=(0,_.useState)(null),[Ee,B]=(0,_.useState)(null),[V,H]=(0,_.useState)(()=>new Map),[De,Oe]=(0,_.useState)(()=>s.now()),U=(0,_.useRef)(!0),W=(0,_.useRef)(new Map),ke=(0,_.useRef)(null);if(w!==e){let t=xe(e,s.origin());ge(e),g(t?.tabs??[]),y(t?.activeId??null),O(null),z(null),B(null)}let G=h.find(e=>e.id===v)??null,K=be(G),q=!G||G.kind===`launcher`;(0,_.useEffect)(()=>(U.current=!0,()=>{U.current=!1}),[]),(0,_.useEffect)(()=>{w===e&&Se(e,h,v,b)},[w,e,h,v,b]),(0,_.useEffect)(()=>{P(G?.kind===`url`?G.history[G.index]??``:G?.kind===`artifact`?G.path:``),L(null)},[G]);let J=(0,_.useCallback)(async()=>{try{let t=await s.api.targets(e);return U.current?(O(t),A(null),t):null}catch(e){return U.current&&A(e instanceof a&&e.detail?e.detail:`Dev servers and files could not be listed.`),null}},[s.api,e]),Ae=(0,_.useRef)(null);(0,_.useEffect)(()=>{l&&Ae.current!==e&&(Ae.current=e,J())},[l,e,J]),ne(()=>{J()},R?_e:ve,{enabled:i&&(R!==null||q)});let Y=(0,_.useCallback)((e,t={})=>{B(null);let n=h.find(e=>e.id===v);if(!t.newTab&&n?.kind===`launcher`){g(h.map(t=>t.id===n.id?{id:t.id,kind:`url`,history:[e],index:0,reloadKey:0}:t));return}let r=h.find(t=>t.kind===`url`&&t.history[t.index]===e);if(r&&!t.newTab){y(r.id);return}let i=j();g([...h,{id:i,kind:`url`,history:[e],index:0,reloadKey:0}]),y(i)},[h,v]),je=(0,_.useCallback)(e=>{if(!G||G.kind!==`url`){Y(e);return}g(t=>t.map(t=>{if(t.id!==G.id||t.kind!==`url`)return t;let n=[...t.history.slice(0,t.index+1),e].slice(-50);return{...t,history:n,index:n.length-1}}))},[G,Y]),X=(0,_.useCallback)((e,t)=>{B(null);let n=h.find(t=>t.kind===`artifact`&&t.path===e);if(n){y(n.id);return}let r=h.find(e=>e.id===v);if(r?.kind===`launcher`){g(h.map(n=>n.id===r.id?{id:n.id,kind:`artifact`,path:e,artifactKind:t,reloadKey:0}:n));return}let i=j();g([...h,{id:i,kind:`artifact`,path:e,artifactKind:t,reloadKey:0}]),y(i)},[h,v]),Me=()=>{let e=h.find(e=>e.kind===`launcher`);if(e)y(e.id);else{let e=j();g(t=>[...t,{id:e,kind:`launcher`}]),y(e)}J()},Ne=e=>{let t=h.findIndex(t=>t.id===e.id),n=h.filter(t=>t.id!==e.id);g(n),H(t=>{let n=new Map(t);for(let r of t.keys())r.startsWith(`${e.id}:`)&&n.delete(r);return n}),v===e.id&&y((n[t]??n[t-1]??null)?.id??null)},Pe=(e,t)=>{let n=-1;if(e.key===`ArrowRight`?n=(t+1)%h.length:e.key===`ArrowLeft`?n=(t-1+h.length)%h.length:e.key===`Home`?n=0:e.key===`End`&&(n=h.length-1),n<0)return;e.preventDefault();let r=h[n];y(r.id),W.current.get(r.id)?.focus()},Fe=(0,_.useCallback)(e=>{B(null),r({root:e.root,devServerId:e.id}),z({server:e,since:s.now()})},[s,r]),Z=(0,_.useCallback)(e=>{e.running?Y(e.url):Fe(e)},[Y,Fe]);(0,_.useEffect)(()=>{if(R&&D){if(D.devServers.find(e=>e.running&&(e.id===R.server.id||e.port===R.server.port))){z(null),Y(R.server.url);return}s.now()-R.since>12e4&&(z(null),B(`Nothing answered on port ${R.server.port} within 2 minutes. Check the terminal for errors.`))}},[D,R,Y,s,De]),(0,_.useEffect)(()=>{if(!R)return;let e=setInterval(()=>Oe(s.now()),1e3);return()=>clearInterval(e)},[R,s]);let Q=(0,_.useCallback)(async e=>{if(e.url){let t=S(e.url,s.origin());t.kind===`loopback`?Y(t.url):L(t);return}if(e.artifactPath){let t=D?.artifacts.find(t=>t.path===e.artifactPath)?.kind??N(e.artifactPath);t?X(e.artifactPath,t):B(`That file cannot be previewed.`);return}if(e.devServerId){let t=(await J()??D)?.devServers.find(t=>t.id===e.devServerId);t?Z(t):B(`That dev server is no longer listed for this chat.`)}},[s,X,Z,Y,J,D]);(0,_.useEffect)(()=>{!n||n.nonce<=k||(k=n.nonce,Q(n))},[n,Q]);let $=G?.kind===`artifact`?`${G.id}:${G.reloadKey}`:null;(0,_.useEffect)(()=>{if(!l||!G||G.kind!==`artifact`||!$||V.has($))return;let t=G,n=$;H(e=>new Map(e).set(n,{status:`loading`})),(t.artifactKind===`md`?s.api.text(e,t.path).then(e=>({status:`text`,text:e})):s.api.ticket(e,t.path).then(e=>({status:`frame`,src:e.url}))).then(e=>{U.current&&H(t=>new Map(t).set(n,e))},e=>{let t=e instanceof a&&e.status===404?`This file is no longer in the chat's folder.`:e instanceof a&&e.status===413?`This file is larger than 5 MB, too large to preview.`:`This file could not be loaded.`;U.current&&H(e=>new Map(e).set(n,{status:`error`,message:t}))})},[l,G,$,V,s.api,e]);let Ie=e=>{G&&G.kind===`url`&&g(t=>t.map(t=>t.id===G.id&&t.kind===`url`?{...t,index:Math.min(t.history.length-1,Math.max(0,t.index+e))}:t))},Le=()=>{if(G){if(G.kind===`launcher`){J();return}g(e=>e.map(e=>e.id===G.id&&e.kind!==`launcher`?{...e,reloadKey:e.reloadKey+1}:e))}},Re=e=>{e.preventDefault();let t=S(M,s.origin());if(t.kind===`loopback`){L(null),G?.kind===`url`?je(t.url):Y(t.url);return}L(t)},ze=e=>{e.key===`Escape`&&(e.preventDefault(),P(K??(G?.kind===`artifact`?G.path:``)),L(null),e.currentTarget.blur())},Be=G?.kind===`url`&&G.index>0,Ve=G?.kind===`url`&&G.index<G.history.length-1;return(0,E.jsxs)(`div`,{className:T.pane,"data-compact":u||void 0,children:[(0,E.jsxs)(`div`,{className:T.strip,children:[(0,E.jsx)(`div`,{className:T.tabs,role:`tablist`,"aria-label":`Previews`,children:h.map((e,t)=>{let n=e.id===v,r=F(e);return(0,E.jsxs)(`div`,{className:T.tab,"data-selected":n||void 0,role:`presentation`,children:[(0,E.jsxs)(`button`,{ref:t=>{t?W.current.set(e.id,t):W.current.delete(e.id)},type:`button`,role:`tab`,id:`preview-tab-${e.id}`,"aria-selected":n,"aria-controls":`preview-panel`,tabIndex:n?0:-1,className:T.tabButton,title:e.kind===`url`?e.history[e.index]:e.kind===`artifact`?e.path:`Choose what to preview`,onClick:()=>y(e.id),onKeyDown:e=>Pe(e,t),children:[e.kind===`artifact`?(0,E.jsx)(se,{size:12}):e.kind===`url`?(0,E.jsx)(le,{size:12}):(0,E.jsx)(ce,{size:12}),(0,E.jsx)(`span`,{className:T.tabTitle,children:r})]}),(0,E.jsx)(`button`,{type:`button`,className:T.tabClose,"aria-label":`Close preview ${r}`,title:`Close`,onClick:()=>Ne(e),children:(0,E.jsx)(p,{size:12})})]},e.id)})}),(0,E.jsx)(d,{variant:`ghost`,size:`sm`,icon:(0,E.jsx)(ae,{}),"aria-label":`New preview tab`,title:`New preview tab`,className:T.newTab,onClick:Me})]}),(0,E.jsxs)(`div`,{className:`${oe.header} ${T.toolbar}`,children:[(0,E.jsxs)(`div`,{className:T.nav,children:[(0,E.jsx)(d,{variant:`ghost`,size:`sm`,icon:(0,E.jsx)(me,{}),"aria-label":`Back`,title:`Back`,disabled:!Be,onClick:()=>Ie(-1)}),(0,E.jsx)(d,{variant:`ghost`,size:`sm`,icon:(0,E.jsx)(fe,{}),"aria-label":`Forward`,title:`Forward`,disabled:!Ve,onClick:()=>Ie(1)}),(0,E.jsx)(d,{variant:`ghost`,size:`sm`,icon:(0,E.jsx)(de,{}),"aria-label":q?`Refresh the list`:`Reload`,title:q?`Refresh the list`:`Reload`,disabled:!G&&q&&D===null,onClick:Le})]}),(0,E.jsx)(`form`,{className:T.addressForm,onSubmit:Re,role:`search`,"aria-label":`Preview address`,children:(0,E.jsx)(`input`,{ref:ke,className:T.address,value:M,onChange:e=>P(e.target.value),onKeyDown:ze,onFocus:e=>e.currentTarget.select(),placeholder:`localhost:5173`,"aria-label":`Address`,spellCheck:!1,autoCapitalize:`off`,autoCorrect:`off`,inputMode:`url`,readOnly:G?.kind===`artifact`})}),(0,E.jsxs)(`div`,{className:oe.actions,children:[u?null:(0,E.jsx)(re,{"aria-label":`Frame width`,size:`sm`,value:b,onChange:x,options:[{value:`desktop`,label:(0,E.jsx)(ue,{size:14}),ariaLabel:`Desktop width`},{value:`phone`,label:(0,E.jsx)(pe,{size:14}),ariaLabel:`375 px width`}]}),K?(0,E.jsx)(`a`,{className:T.external,href:K,target:`_blank`,rel:`noopener noreferrer`,"aria-label":`Open in browser`,title:`Open in browser`,children:(0,E.jsx)(ie,{})}):(0,E.jsx)(`span`,{className:T.external,"data-placeholder":`true`,"aria-hidden":`true`})]})]}),I?(0,E.jsx)(Ce,{note:I,onDismiss:()=>L(null)}):null,R?(0,E.jsxs)(`div`,{className:T.waiting,role:`status`,children:[(0,E.jsx)(`span`,{className:T.pulse,"aria-hidden":`true`}),(0,E.jsxs)(`span`,{className:T.waitingText,children:[`Starting `,(0,E.jsx)(`code`,{children:R.server.command??R.server.label}),` — waiting for `,C(R.server.url),` · `,Math.max(0,Math.round((De-R.since)/1e3)),`s`]}),(0,E.jsx)(f,{size:`sm`,variant:`ghost`,onClick:()=>z(null),children:`Stop waiting`})]}):null,Ee?(0,E.jsxs)(`div`,{className:T.notice,role:`alert`,children:[(0,E.jsx)(`span`,{children:Ee}),(0,E.jsx)(`button`,{type:`button`,className:T.noticeClose,"aria-label":`Dismiss`,title:`Dismiss`,onClick:()=>B(null),children:(0,E.jsx)(p,{size:12})})]}):null,(0,E.jsx)(`div`,{className:T.body,id:`preview-panel`,role:`tabpanel`,"aria-labelledby":G?`preview-tab-${G.id}`:void 0,children:q?(0,E.jsx)(Te,{targets:D,error:ye,roots:t,onOpenServer:Z,onOpenArtifact:e=>X(e.path,e.kind),onRetry:()=>void J(),onOpenTerminal:()=>r(t[0]?{root:t[0]}:{}),waitingId:R?.server.id??null}):G?.kind===`url`?(0,E.jsxs)(`div`,{className:T.stage,"data-device":b,children:[(0,E.jsx)(`iframe`,{className:T.frame,src:G.history[G.index],title:`Preview of ${F(G)}`,sandbox:`allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-downloads`,referrerPolicy:`no-referrer`},`${G.id}:${G.index}:${G.reloadKey}`),(0,E.jsxs)(`p`,{className:T.frameHint,children:[`Blank page? Some servers refuse to be framed.`,` `,(0,E.jsx)(`a`,{href:G.history[G.index],target:`_blank`,rel:`noopener noreferrer`,children:`Open in browser ↗`})]})]}):G?.kind===`artifact`?(0,E.jsx)(we,{tab:G,content:$?V.get($)??{status:`loading`}:{status:`loading`},device:b,onRetry:Le}):null})]})}function Ce({note:e,onDismiss:t}){return(0,E.jsxs)(`div`,{className:T.addressNote,role:`status`,children:[e.kind===`external`?(0,E.jsxs)(`span`,{children:[`Only local dev servers open here.`,` `,(0,E.jsx)(`a`,{href:e.url,target:`_blank`,rel:`noopener noreferrer`,children:`Open in browser ↗`})]}):e.kind===`self`?(0,E.jsx)(`span`,{children:`That address is Verse itself.`}):(0,E.jsxs)(`span`,{children:[`Enter a local address, like `,(0,E.jsx)(`code`,{children:`localhost:5173`}),`.`]}),(0,E.jsx)(`button`,{type:`button`,className:T.noticeClose,"aria-label":`Dismiss`,title:`Dismiss`,onClick:t,children:(0,E.jsx)(p,{size:12})})]})}function we({tab:e,content:t,device:n,onRetry:r}){return t.status===`loading`?(0,E.jsxs)(`div`,{className:T.loading,"aria-busy":`true`,children:[(0,E.jsx)(s,{width:`50%`}),(0,E.jsx)(s,{width:`80%`})]}):t.status===`error`?(0,E.jsx)(m,{compact:!0,tone:`error`,title:`Preview unavailable`,body:t.message,action:(0,E.jsx)(f,{size:`sm`,variant:`subtle`,onClick:r,children:`Try again`})}):t.status===`text`?(0,E.jsx)(`article`,{className:T.markdown,"aria-label":e.path,children:(0,E.jsx)(h,{text:t.text})}):e.artifactKind===`image`?(0,E.jsx)(`div`,{className:T.imageStage,children:(0,E.jsx)(`img`,{className:T.image,src:t.src,alt:P(e.path)})}):(0,E.jsx)(`div`,{className:T.stage,"data-device":e.artifactKind===`pdf`?`desktop`:n,children:(0,E.jsx)(`iframe`,{className:T.frame,src:t.src,title:`Preview of ${e.path}`,...e.artifactKind===`pdf`?{}:{sandbox:`allow-scripts`},referrerPolicy:`no-referrer`},t.src)})}function Te({targets:e,error:t,roots:n,onOpenServer:r,onOpenArtifact:i,onRetry:a,onOpenTerminal:o,waitingId:ee}){if(!e)return t?(0,E.jsx)(m,{compact:!0,tone:`error`,title:`Could not list what to preview`,body:t,action:(0,E.jsx)(f,{size:`sm`,variant:`subtle`,onClick:a,children:`Try again`})}):(0,E.jsxs)(`div`,{className:T.loading,"aria-busy":`true`,children:[(0,E.jsx)(s,{width:`35%`}),(0,E.jsx)(s,{width:`70%`}),(0,E.jsx)(s,{width:`60%`})]});let c=n.length>1;return e.devServers.length===0&&e.artifacts.length===0?(0,E.jsx)(m,{compact:!0,icon:(0,E.jsx)(ce,{size:20}),title:`Nothing to preview yet`,body:`Start a dev server in the terminal, or ask for an HTML report. Local servers and the files this chat writes show up here.`,action:(0,E.jsx)(f,{size:`sm`,variant:`subtle`,onClick:o,children:`Open a terminal`})}):(0,E.jsxs)(`div`,{className:T.launcher,children:[(0,E.jsxs)(`section`,{className:T.section,"aria-labelledby":`preview-servers-title`,children:[(0,E.jsx)(`h3`,{className:T.sectionTitle,id:`preview-servers-title`,children:`Dev servers`}),e.devServers.length===0?(0,E.jsxs)(`p`,{className:T.muted,children:[`No dev server found in this chat's folders. Add one to `,(0,E.jsx)(`code`,{children:`.claude/launch.json`}),`, or start it in the terminal.`]}):(0,E.jsx)(`ul`,{className:T.rows,children:e.devServers.map(e=>(0,E.jsxs)(`li`,{className:T.row,children:[(0,E.jsx)(`span`,{className:T.dot,"data-running":e.running||void 0,"aria-hidden":`true`}),(0,E.jsxs)(`span`,{className:T.rowMain,children:[(0,E.jsx)(`span`,{className:T.rowTitle,title:e.label,children:e.label}),(0,E.jsxs)(`span`,{className:T.rowMeta,title:`${C(e.url)} · ${e.running?`running`:`stopped`} · ${O[e.source]}${c?` · ${e.root}`:``}`,children:[C(e.url),` · `,e.running?`running`:`stopped`,` · `,O[e.source],c?` · ${P(e.root)}`:``]}),!e.running&&e.command&&e.command!==e.label?(0,E.jsx)(`code`,{className:T.rowCommand,title:e.command,children:e.command}):null]}),e.running?(0,E.jsx)(f,{size:`sm`,variant:`subtle`,onClick:()=>r(e),"aria-label":`Open ${e.label}`,children:`Open`}):(0,E.jsx)(f,{size:`sm`,variant:`subtle`,icon:(0,E.jsx)(g,{size:12}),busy:ee===e.id,onClick:()=>r(e),"aria-label":`Start ${e.label}`,title:`Runs ${e.command??e.label} in a terminal tab`,children:`Start`})]},e.id))})]}),(0,E.jsxs)(`section`,{className:T.section,"aria-labelledby":`preview-files-title`,children:[(0,E.jsx)(`h3`,{className:T.sectionTitle,id:`preview-files-title`,children:`This chat's files`}),e.artifacts.length===0?(0,E.jsx)(`p`,{className:T.muted,children:`Ask the chat for a report or a page: HTML, Markdown, SVG, images and PDFs it writes appear here.`}):(0,E.jsx)(`ul`,{className:T.rows,children:e.artifacts.map(e=>{let t=e.bytes>5242880;return(0,E.jsxs)(`li`,{className:T.row,children:[(0,E.jsx)(se,{size:14,className:T.fileIcon}),(0,E.jsxs)(`span`,{className:T.rowMain,children:[(0,E.jsx)(`span`,{className:T.rowTitle,title:e.path,children:e.path}),(0,E.jsxs)(`span`,{className:T.rowMeta,children:[ye[e.kind],` · `,w(e.bytes)]})]}),(0,E.jsx)(f,{size:`sm`,variant:`subtle`,disabled:t,title:t?`Larger than 5 MB`:void 0,onClick:()=>i(e),"aria-label":`Open ${e.path}`,children:`Open`})]},e.path)})})]})]})}export{ge as PREVIEW_START_TIMEOUT_MS,I as PreviewPane,M as resetPreviewPaneForTest};
2
- //# sourceMappingURL=PreviewPane-BbXr63u2.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"PreviewPane-BbXr63u2.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/preview/preview-client.ts","../../../../../../src/web-ui/routes/verse/dock/preview/PreviewPane.module.css","../../../../../../src/web-ui/routes/verse/dock/preview/PreviewPane.tsx"],"sourcesContent":["/**\n * dock/preview/preview-client.ts — the Preview pane's reads (unit C4) and the\n * address-bar rule.\n *\n * Every call is a header-authenticated GET. An artifact shown in an <iframe>\n * or <img> goes through a short-lived FRAME TICKET (preview.ts \"WHY\n * TICKETS\"): the element's own request cannot carry the read-client header.\n */\nimport type { VersePreviewArtifactKind, VersePreviewTargetsResponse } from '../../../../data/api-types.js';\nimport { getReadClientProof, reportSessionExpired } from '../../../../data/auth-store.js';\nimport { ApiError, apiGet } from '../../../../data/client.js';\nimport {\n VERSE_PREVIEW_RAW_PATH,\n VERSE_PREVIEW_TARGETS_PATH,\n isLoopbackPreviewUrl,\n} from '../../../../../core/verse/workbench-types.js';\n\nexport const VERSE_PREVIEW_TICKET_PATH = '/api/verse/preview/ticket';\n\nexport interface PreviewTicket {\n url: string;\n expiresAt: string;\n kind: VersePreviewArtifactKind;\n}\n\nexport interface PreviewApi {\n targets(sessionId: string, signal?: AbortSignal): Promise<VersePreviewTargetsResponse>;\n ticket(sessionId: string, path: string): Promise<PreviewTicket>;\n /** A markdown artifact's text (rendered by the pane, sanitised). */\n text(sessionId: string, path: string): Promise<string>;\n}\n\nfunction query(params: Record<string, string>): string {\n return new URLSearchParams(params).toString();\n}\n\nexport const previewApi: PreviewApi = {\n targets: (sessionId, signal) => apiGet<VersePreviewTargetsResponse>(`${VERSE_PREVIEW_TARGETS_PATH}?${query({ sessionId })}`, signal),\n ticket: (sessionId, path) => apiGet<PreviewTicket>(`${VERSE_PREVIEW_TICKET_PATH}?${query({ sessionId, path })}`),\n text: async (sessionId, path) => {\n const url = `${VERSE_PREVIEW_RAW_PATH}?${query({ sessionId, path })}`;\n const res = await fetch(url, { credentials: 'same-origin', headers: { 'x-ashlr-read-client': getReadClientProof() } });\n if (res.status === 401) {\n reportSessionExpired();\n throw new ApiError('Read session expired.', 401, url);\n }\n if (!res.ok) throw new ApiError(`GET ${url} failed (HTTP ${res.status}).`, res.status, url);\n return res.text();\n },\n};\n\n// ---------------------------------------------------------------------------\n// The address bar\n// ---------------------------------------------------------------------------\n\nexport type PreviewAddress =\n | { kind: 'loopback'; url: string }\n /** Not loopback http: offered as \"Open in browser ↗\", never framed. */\n | { kind: 'external'; url: string }\n /** Verse's own server: it refuses to be framed, and framing it would only confuse. */\n | { kind: 'self'; url: string }\n | { kind: 'invalid' };\n\nfunction portOf(url: URL): string {\n return url.port || (url.protocol === 'https:' ? '443' : '80');\n}\n\n/**\n * What the operator typed → where it goes. Shorthands: `5173` and `:5173`\n * are localhost ports; `localhost:3000/x` gets `http://`. A bare domain is an\n * EXTERNAL https page. Anything that is not http(s) (javascript:, file:,\n * data:) is invalid. `verseOrigin` is `window.location.origin`.\n */\nexport function parsePreviewAddress(input: string, verseOrigin: string): PreviewAddress {\n const raw = input.trim();\n if (raw.length === 0 || raw.length > 2048 || /\\s/.test(raw)) return { kind: 'invalid' };\n let candidate = raw;\n if (/^:?\\d{2,5}$/.test(raw)) candidate = `http://localhost:${raw.replace(':', '')}/`;\n else if (/^(?:localhost|127\\.0\\.0\\.1)(?::\\d{1,5})?(?:[/?#].*)?$/i.test(raw)) candidate = `http://${raw}`;\n else if (!/^[a-z][a-z0-9+.-]*:/i.test(raw)) {\n if (!/^[\\w-]+(?:\\.[\\w-]+)+(?::\\d{1,5})?(?:[/?#].*)?$/.test(raw)) return { kind: 'invalid' };\n candidate = `https://${raw}`;\n }\n let url: URL;\n try {\n url = new URL(candidate);\n } catch {\n return { kind: 'invalid' };\n }\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return { kind: 'invalid' };\n if (isLoopbackPreviewUrl(url.href)) {\n let verse: URL | null = null;\n try { verse = new URL(verseOrigin); } catch { verse = null; }\n const loopbackVerse = verse && (verse.hostname === 'localhost' || verse.hostname === '127.0.0.1');\n if (loopbackVerse && portOf(verse!) === portOf(url)) return { kind: 'self', url: url.href };\n return { kind: 'loopback', url: url.href };\n }\n if (url.username || url.password) return { kind: 'invalid' };\n return { kind: 'external', url: url.href };\n}\n\n/** \"localhost:5173/admin\" — the tab and history label for a loopback URL. */\nexport function shortUrl(href: string): string {\n try {\n const url = new URL(href);\n const path = url.pathname === '/' ? '' : url.pathname;\n return `${url.host}${path}${url.search}`;\n } catch {\n return href;\n }\n}\n\nexport function formatBytes(bytes: number): string {\n if (!Number.isFinite(bytes) || bytes < 0) return '—';\n if (bytes < 1024) return `${bytes} B`;\n if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(bytes < 10 * 1024 ? 1 : 0)} KB`;\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n}\n","/*\n * dock/preview/PreviewPane.module.css — the Preview pane (unit C4).\n * Tokens only (design/style-scan-310: no raw hex, no px font sizes). The\n * chrome (tab strip, toolbar) matches the Terminal pane so the two read as\n * one dock when split.\n */\n\n.pane {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 0;\n background: var(--bg-canvas);\n color: var(--text-primary);\n}\n\n/* ---- tab strip ------------------------------------------------------------ */\n\n.strip {\n display: flex;\n align-items: stretch;\n flex: none;\n min-height: var(--control-h-sm);\n border-bottom: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n}\n\n.tabs {\n display: flex;\n align-items: stretch;\n min-width: 0;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.tabs::-webkit-scrollbar { display: none; }\n\n.tab {\n position: relative;\n display: flex;\n align-items: center;\n flex: none;\n max-width: 220px;\n border-right: 1px solid var(--border-subtle);\n color: var(--text-secondary);\n}\n.tab[data-selected] {\n color: var(--text-primary);\n background: var(--bg-canvas);\n}\n.tab[data-selected]::after {\n content: '';\n position: absolute;\n left: 0;\n right: 0;\n bottom: -1px;\n height: 2px;\n background: var(--accent-500);\n}\n\n.tabButton {\n display: inline-flex;\n align-items: center;\n gap: var(--space-2);\n min-width: 0;\n height: 100%;\n padding: 0 var(--space-1) 0 var(--space-3);\n border: 0;\n background: transparent;\n color: inherit;\n font-family: var(--font-ui);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n cursor: pointer;\n}\n.tabButton > svg { flex: none; color: var(--text-tertiary); }\n.tabButton:hover { color: var(--text-primary); }\n.tabButton:focus-visible,\n.tabClose:focus-visible,\n.noticeClose:focus-visible,\n.external:focus-visible {\n outline: none;\n box-shadow: var(--shadow-focus-ring);\n}\n\n.tabTitle {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.tabClose {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n /* One step under the xs control: 20px comfortable, 16px compact. A literal\n 20px stayed comfortable when Density went compact and outgrew the\n shrunken tab row (control-density.test.ts, DESIGN-V2 §2). */\n width: calc(var(--control-h-xs) - var(--space-1));\n height: calc(var(--control-h-xs) - var(--space-1));\n margin-right: var(--space-1);\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: var(--text-tertiary);\n cursor: pointer;\n opacity: 0;\n transition: opacity var(--duration-fast) var(--ease-standard);\n}\n.tab:hover .tabClose,\n.tab[data-selected] .tabClose,\n.tabClose:focus-visible { opacity: 1; }\n.tabClose:hover { background: var(--bg-hover); color: var(--text-primary); }\n@media (hover: none) {\n .tabClose { opacity: 1; }\n}\n\n.newTab { align-self: center; margin: 0 var(--space-1); }\n\n/* ---- toolbar -------------------------------------------------------------- */\n\n/* Height, padding, border and surface come from ../pane-chrome.module.css\n (the row every dock pane shares); the toolbar only lays out its parts. */\n/* Starts with icon buttons, so a smaller inset than a text title (and scoped\n under .pane so it outranks the shared padding regardless of CSS order). */\n.pane .toolbar { padding-left: var(--space-2); }\n\n.nav {\n display: flex;\n align-items: center;\n flex: none;\n}\n\n.addressForm {\n display: flex;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.address {\n width: 100%;\n min-width: 0;\n height: var(--control-h-sm);\n padding: 0 var(--space-3);\n border: 1px solid var(--border-default);\n border-radius: var(--radius-full);\n background: var(--bg-input);\n color: var(--text-primary);\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n}\n.address::placeholder { color: var(--text-tertiary); }\n.address:focus {\n outline: none;\n border-color: var(--border-focus);\n box-shadow: var(--shadow-focus-ring);\n}\n.address[readonly] { color: var(--text-secondary); }\n\n.external {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n flex: none;\n width: var(--density-row-sm);\n height: var(--density-row-sm);\n border-radius: var(--radius-sm);\n color: var(--text-secondary);\n}\n.external:hover { background: var(--bg-hover); color: var(--text-primary); }\n/* No page to open elsewhere: the slot keeps its width, so the address bar does not jump. */\n.external[data-placeholder] { visibility: hidden; }\n\n/* ---- notices -------------------------------------------------------------- */\n\n.addressNote,\n.notice,\n.waiting {\n display: flex;\n align-items: center;\n gap: var(--space-2);\n flex: none;\n padding: var(--space-2) var(--space-3);\n border-bottom: 1px solid var(--border-subtle);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n}\n.addressNote { background: var(--status-info-bg); color: var(--status-info-fg); }\n.notice { background: var(--status-danger-bg); color: var(--status-danger-fg); }\n.waiting { background: var(--status-running-bg); color: var(--status-running-fg); }\n.addressNote > span,\n.notice > span { flex: 1; min-width: 0; }\n.addressNote a { color: inherit; font-weight: var(--font-weight-semibold); }\n.addressNote code,\n.waiting code {\n font-family: var(--font-mono);\n font-size: var(--text-xs-size);\n}\n\n.waitingText {\n flex: 1;\n min-width: 0;\n font-variant-numeric: tabular-nums;\n}\n\n/* The 1.6 s running pulse (DESIGN §13.5); stops under reduced motion. */\n.pulse {\n flex: none;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n background: var(--status-running-solid);\n animation: pulse var(--duration-pulse) ease-in-out infinite;\n}\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.35; }\n}\n\n.noticeClose {\n display: inline-flex;\n flex: none;\n padding: var(--space-1);\n border: 0;\n border-radius: var(--radius-xs);\n background: transparent;\n color: inherit;\n cursor: pointer;\n}\n\n/* ---- body ----------------------------------------------------------------- */\n\n.body {\n position: relative;\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-height: 0;\n overflow: auto;\n}\n\n.loading {\n display: flex;\n flex-direction: column;\n gap: var(--space-2);\n padding: var(--card-pad);\n}\n\n.stage {\n display: flex;\n flex-direction: column;\n align-items: stretch;\n flex: 1 1 auto;\n min-height: 0;\n}\n.stage[data-device='phone'] {\n align-items: center;\n padding: var(--space-3) 0;\n}\n\n.frame {\n flex: 1 1 auto;\n width: 100%;\n min-height: 0;\n border: 0;\n background: var(--bg-surface);\n}\n.stage[data-device='phone'] .frame {\n flex: 1 1 auto;\n width: 375px;\n max-width: 100%;\n border: 1px solid var(--border-default);\n border-radius: var(--radius-lg);\n box-shadow: var(--shadow-md);\n}\n\n.frameHint {\n flex: none;\n margin: 0;\n padding: var(--space-1) var(--space-3);\n border-top: 1px solid var(--border-subtle);\n background: var(--bg-surface);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n color: var(--text-tertiary);\n}\n.stage[data-device='phone'] .frameHint { align-self: stretch; margin-top: var(--space-3); }\n.frameHint a { color: var(--text-link); }\n\n.imageStage {\n display: flex;\n align-items: center;\n justify-content: center;\n flex: 1 1 auto;\n min-height: 0;\n padding: var(--card-pad);\n background:\n repeating-conic-gradient(var(--bg-hover) 0 25%, transparent 0 50%) 0 0 / 16px 16px,\n var(--bg-surface);\n}\n.image {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n}\n\n.markdown {\n padding: var(--card-pad) var(--space-6);\n max-width: var(--measure-read);\n background: var(--bg-canvas);\n}\n\n/* ---- launcher ------------------------------------------------------------- */\n\n.launcher {\n display: flex;\n flex-direction: column;\n padding-bottom: var(--space-6);\n}\n\n.section { padding: var(--space-4) var(--card-pad) 0; }\n.section + .section {\n margin-top: var(--space-4);\n border-top: 1px solid var(--border-subtle);\n}\n\n.sectionTitle {\n margin: 0 0 var(--space-2);\n font-family: var(--font-display);\n font-size: var(--text-2xs-size);\n line-height: var(--text-2xs-line);\n font-weight: var(--font-weight-semibold);\n letter-spacing: var(--tracking-label);\n text-transform: uppercase;\n color: var(--text-tertiary);\n}\n\n.muted {\n margin: 0;\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-tertiary);\n}\n.muted code { font-family: var(--font-mono); font-size: var(--text-xs-size); }\n\n.rows {\n display: flex;\n flex-direction: column;\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.row {\n display: flex;\n align-items: center;\n gap: var(--space-3);\n min-height: var(--density-row);\n padding: var(--space-2) 0;\n}\n.row + .row { border-top: 1px solid var(--border-subtle); }\n\n.dot {\n flex: none;\n width: 8px;\n height: 8px;\n border: 1.5px solid var(--text-tertiary);\n border-radius: var(--radius-full);\n}\n.dot[data-running] {\n border-color: var(--status-success-solid);\n background: var(--status-success-solid);\n}\n\n.fileIcon { flex: none; color: var(--text-tertiary); }\n\n.rowMain {\n display: flex;\n flex-direction: column;\n flex: 1 1 auto;\n min-width: 0;\n}\n\n.rowTitle {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-family: var(--font-mono);\n font-size: var(--text-sm-size);\n line-height: var(--text-sm-line);\n color: var(--text-primary);\n}\n\n.rowMeta {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n font-size: var(--text-xs-size);\n line-height: var(--text-xs-line);\n color: var(--text-tertiary);\n}\n\n/* What Start will type (a launch.json row's label is only its name). */\n.rowCommand {\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 line-height: var(--text-xs-line);\n color: var(--text-secondary);\n}\n\n/* ---- compact (375) -------------------------------------------------------- */\n\n.pane[data-compact] .toolbar { flex-wrap: wrap; }\n.pane[data-compact] .addressForm { order: 3; flex-basis: 100%; }\n.pane[data-compact] .section { padding-left: var(--space-3); padding-right: var(--space-3); }\n.pane[data-compact] .markdown { padding: var(--space-3); }\n.pane[data-compact] .tab { max-width: 150px; }\n\n@media (prefers-reduced-motion: reduce) {\n .pulse { animation: none; }\n .tabClose { transition: none; }\n}\n","/**\n * dock/preview/PreviewPane.tsx — the chat dock's Preview (unit C4; SPEC-310C\n * §3). Rendered by C2's Dock through C0's `preview-pane` slot.\n *\n * WHAT IT SHOWS, in tabs:\n * - a LOOPBACK dev server (http://localhost / 127.0.0.1 only) in an iframe,\n * with back / forward / reload, an address bar, and a Desktop / 375 frame;\n * anything else typed in the bar is offered as \"Open in browser ↗\";\n * - a file this chat WROTE — HTML, SVG, image, PDF through a short-lived\n * frame ticket and a CSP sandbox (an opaque origin: its own script runs,\n * Verse's cookies and API stay out of reach); Markdown rendered here,\n * sanitised, like a chat message.\n * An empty pane (or the + tab) is the launcher: the dev servers found in the\n * chat's folders — launch.json, package.json scripts, and anything already\n * listening inside them — and the chat's files. Start runs the server in a\n * TERMINAL tab (through the dock, never directly), then waits for its port\n * and opens it.\n *\n * WHAT THE FRAMES MAY DO. A dev server is a different origin (another port),\n * so `allow-same-origin` gives it ITS origin, never Verse's; the sandbox\n * still withholds top navigation, so a page can never navigate Verse away.\n * Verse's own address is refused outright. Back/forward walk the addresses\n * opened HERE: a cross-origin frame's own history is not readable.\n */\nimport { useCallback, useEffect, useMemo, useRef, useState, type FormEvent, type KeyboardEvent as ReactKeyboardEvent } from 'react';\nimport type { VersePreviewArtifact, VersePreviewArtifactKind, VersePreviewDevServer, VersePreviewTargetsResponse } from '../../../../data/api-types.js';\nimport { ApiError } from '../../../../data/client.js';\nimport { Button, IconButton } from '../../../../components/primitives/Button.js';\nimport { EmptyState } from '../../../../components/primitives/EmptyState.js';\nimport { Segmented } from '../../../../components/primitives/Segmented.js';\nimport { SkeletonLine } from '../../../../components/primitives/Skeleton.js';\nimport { IconExternalLink, IconPlus, IconX } from '../../../../components/primitives/icons.js';\nimport { MessageMarkdown } from '../../MessageMarkdown.js';\nimport { usePollWhileVisible, useSectionVisible } from '../../shell/section-visibility.js';\nimport type { PreviewOpenRequest, PreviewPaneProps } from '../../shell/slots.js';\nimport { useViewport } from '../../shell/viewport.js';\nimport {\n ArrowLeftGlyph,\n ArrowRightGlyph,\n DesktopGlyph,\n FileGlyph,\n PhoneGlyph,\n PlayGlyph,\n PreviewGlyph,\n ReloadGlyph,\n ServerGlyph,\n} from '../terminal/terminal-icons.js';\nimport { formatBytes, parsePreviewAddress, previewApi, shortUrl, type PreviewAddress, type PreviewApi } from './preview-client.js';\nimport chrome from '../pane-chrome.module.css';\nimport styles from './PreviewPane.module.css';\n\n// ---------------------------------------------------------------------------\n// Model\n// ---------------------------------------------------------------------------\n\nexport type PreviewTab =\n | { id: string; kind: 'launcher' }\n | { id: string; kind: 'url'; history: string[]; index: number; reloadKey: number }\n | { id: string; kind: 'artifact'; path: string; artifactKind: VersePreviewArtifactKind; reloadKey: number };\n\ntype Device = 'desktop' | 'phone';\n\ninterface Waiting {\n server: VersePreviewDevServer;\n since: number;\n}\n\ntype ArtifactContent =\n | { status: 'loading' }\n | { status: 'frame'; src: string }\n | { status: 'text'; text: string }\n | { status: 'error'; message: string };\n\nexport interface PreviewPaneDeps {\n api: PreviewApi;\n /** `window.location.origin`: Verse's own address, which is never framed. */\n origin: () => string;\n now: () => number;\n}\n\nconst DEFAULT_DEPS: PreviewPaneDeps = {\n api: previewApi,\n origin: () => window.location.origin,\n now: () => Date.now(),\n};\n\n/** How long Start waits for the server's port before saying so. */\nexport const PREVIEW_START_TIMEOUT_MS = 120_000;\nconst WAIT_POLL_MS = 2_000;\nconst LAUNCHER_POLL_MS = 5_000;\nconst STORAGE_PREFIX = 'ashlr.verse.preview.v1:';\nconst SOURCE_LABEL: Readonly<Record<VersePreviewDevServer['source'], string>> = {\n 'launch-json': 'launch.json',\n 'package-json': 'package.json',\n listening: 'running',\n};\nconst KIND_LABEL: Readonly<Record<VersePreviewArtifactKind, string>> = {\n html: 'HTML',\n md: 'Markdown',\n svg: 'SVG',\n image: 'Image',\n pdf: 'PDF',\n};\n\nlet lastHandledNonce = 0;\nlet idCounter = 0;\nconst nextId = (): string => `p${++idCounter}`;\n\n/** Test hygiene. */\nexport function resetPreviewPaneForTest(): void {\n lastHandledNonce = 0;\n idCounter = 0;\n}\n\nfunction kindFromPath(path: string): VersePreviewArtifactKind | null {\n const ext = path.toLowerCase().slice(path.lastIndexOf('.'));\n if (ext === '.html' || ext === '.htm') return 'html';\n if (ext === '.md' || ext === '.markdown') return 'md';\n if (ext === '.svg') return 'svg';\n if (ext === '.pdf') return 'pdf';\n if (['.png', '.jpg', '.jpeg', '.gif', '.webp', '.avif', '.bmp', '.ico'].includes(ext)) return 'image';\n return null;\n}\n\nfunction baseName(path: string): string {\n return path.slice(path.lastIndexOf('/') + 1) || path;\n}\n\nfunction tabLabel(tab: PreviewTab): string {\n if (tab.kind === 'launcher') return 'New tab';\n if (tab.kind === 'url') return shortUrl(tab.history[tab.index] ?? '');\n return baseName(tab.path);\n}\n\nfunction currentUrl(tab: PreviewTab | null): string | null {\n return tab?.kind === 'url' ? tab.history[tab.index] ?? null : null;\n}\n\n/** Tabs worth restoring after a reload (per viewer, per chat; never shared). */\nfunction loadTabs(sessionId: string, origin: string): { tabs: PreviewTab[]; activeId: string | null; device: Device } | null {\n try {\n const raw = localStorage.getItem(`${STORAGE_PREFIX}${sessionId}`);\n if (!raw) return null;\n const parsed = JSON.parse(raw) as { tabs?: unknown; active?: unknown; device?: unknown };\n const tabs: PreviewTab[] = [];\n let activeId: string | null = null;\n if (Array.isArray(parsed.tabs)) {\n parsed.tabs.slice(0, 12).forEach((t: unknown, i: number) => {\n if (!t || typeof t !== 'object') return;\n const rec = t as Record<string, unknown>;\n const id = nextId();\n if (rec['url'] && typeof rec['url'] === 'string' && parsePreviewAddress(rec['url'], origin).kind === 'loopback') {\n tabs.push({ id, kind: 'url', history: [rec['url']], index: 0, reloadKey: 0 });\n } else if (typeof rec['path'] === 'string') {\n const kind = kindFromPath(rec['path']);\n if (kind) tabs.push({ id, kind: 'artifact', path: rec['path'], artifactKind: kind, reloadKey: 0 });\n else return;\n } else {\n return;\n }\n if (parsed.active === i) activeId = id;\n });\n }\n return { tabs, activeId: activeId ?? tabs.at(-1)?.id ?? null, device: parsed.device === 'phone' ? 'phone' : 'desktop' };\n } catch {\n return null;\n }\n}\n\nfunction saveTabs(sessionId: string, tabs: readonly PreviewTab[], activeId: string | null, device: Device): void {\n try {\n const kept = tabs.filter((t) => t.kind !== 'launcher');\n localStorage.setItem(`${STORAGE_PREFIX}${sessionId}`, JSON.stringify({\n tabs: kept.map((t) => (t.kind === 'url' ? { url: t.history[t.index] } : t.kind === 'artifact' ? { path: t.path } : {})),\n active: kept.findIndex((t) => t.id === activeId),\n device,\n }));\n } catch {\n /* storage unavailable: tabs last for this page only */\n }\n}\n\n// ---------------------------------------------------------------------------\n// Component\n// ---------------------------------------------------------------------------\n\nexport function PreviewPane({ sessionId, roots, request, onOpenTerminal, visible, deps: depsOverride }: PreviewPaneProps & { deps?: Partial<PreviewPaneDeps> }) {\n const deps = useMemo<PreviewPaneDeps>(() => ({ ...DEFAULT_DEPS, ...depsOverride }), [depsOverride]);\n const sectionVisible = useSectionVisible();\n const shown = visible && sectionVisible;\n const compact = useViewport().compact;\n\n const [restored] = useState(() => loadTabs(sessionId, deps.origin()));\n const [tabs, setTabs] = useState<PreviewTab[]>(() => restored?.tabs ?? []);\n const [activeId, setActiveId] = useState<string | null>(() => restored?.activeId ?? null);\n const [device, setDevice] = useState<Device>(() => restored?.device ?? 'desktop');\n // The dock keeps this pane mounted across chats: another chat brings ITS\n // tabs. Reset during render (not in an effect) so the save below never\n // writes one chat's tabs under another chat's key.\n const [owner, setOwner] = useState(sessionId);\n const [targets, setTargets] = useState<VersePreviewTargetsResponse | null>(null);\n const [targetsError, setTargetsError] = useState<string | null>(null);\n const [address, setAddress] = useState('');\n const [addressNote, setAddressNote] = useState<PreviewAddress | null>(null);\n const [waiting, setWaiting] = useState<Waiting | null>(null);\n const [notice, setNotice] = useState<string | null>(null);\n const [content, setContent] = useState<ReadonlyMap<string, ArtifactContent>>(() => new Map());\n const [clock, setClock] = useState(() => deps.now());\n const mounted = useRef(true);\n const tabRefs = useRef(new Map<string, HTMLButtonElement>());\n const addressRef = useRef<HTMLInputElement>(null);\n\n if (owner !== sessionId) {\n const next = loadTabs(sessionId, deps.origin());\n setOwner(sessionId);\n setTabs(next?.tabs ?? []);\n setActiveId(next?.activeId ?? null);\n setTargets(null);\n setWaiting(null);\n setNotice(null);\n }\n\n const active = tabs.find((t) => t.id === activeId) ?? null;\n const url = currentUrl(active);\n const showLauncher = !active || active.kind === 'launcher';\n\n useEffect(() => {\n mounted.current = true;\n return () => { mounted.current = false; };\n }, []);\n\n useEffect(() => {\n if (owner === sessionId) saveTabs(sessionId, tabs, activeId, device);\n }, [owner, sessionId, tabs, activeId, device]);\n\n // The address bar mirrors the tab shown.\n useEffect(() => {\n setAddress(active?.kind === 'url' ? (active.history[active.index] ?? '') : active?.kind === 'artifact' ? active.path : '');\n setAddressNote(null);\n }, [active]);\n\n // -------------------------------------------------------------------------\n // Targets\n // -------------------------------------------------------------------------\n\n const refreshTargets = useCallback(async (): Promise<VersePreviewTargetsResponse | null> => {\n try {\n const next = await deps.api.targets(sessionId);\n if (!mounted.current) return null;\n setTargets(next);\n setTargetsError(null);\n return next;\n } catch (err) {\n if (mounted.current) setTargetsError(err instanceof ApiError && err.detail ? err.detail : 'Dev servers and files could not be listed.');\n return null;\n }\n }, [deps.api, sessionId]);\n\n const fetchedFor = useRef<string | null>(null);\n useEffect(() => {\n if (!shown || fetchedFor.current === sessionId) return;\n fetchedFor.current = sessionId;\n void refreshTargets();\n }, [shown, sessionId, refreshTargets]);\n\n usePollWhileVisible(() => { void refreshTargets(); }, waiting ? WAIT_POLL_MS : LAUNCHER_POLL_MS, {\n enabled: visible && (waiting !== null || showLauncher),\n });\n\n // -------------------------------------------------------------------------\n // Tabs\n // -------------------------------------------------------------------------\n\n const openUrl = useCallback((href: string, opts: { newTab?: boolean } = {}) => {\n setNotice(null);\n const current = tabs.find((t) => t.id === activeId);\n // Reuse the launcher tab the operator is looking at; otherwise focus an\n // existing tab on that address, or open a new one.\n if (!opts.newTab && current?.kind === 'launcher') {\n setTabs(tabs.map((t) => (t.id === current.id ? { id: t.id, kind: 'url', history: [href], index: 0, reloadKey: 0 } : t)));\n return;\n }\n const existing = tabs.find((t) => t.kind === 'url' && t.history[t.index] === href);\n if (existing && !opts.newTab) {\n setActiveId(existing.id);\n return;\n }\n const id = nextId();\n setTabs([...tabs, { id, kind: 'url', history: [href], index: 0, reloadKey: 0 }]);\n setActiveId(id);\n }, [tabs, activeId]);\n\n const navigateActive = useCallback((href: string) => {\n if (!active || active.kind !== 'url') {\n openUrl(href);\n return;\n }\n setTabs((prev) => prev.map((t) => {\n if (t.id !== active.id || t.kind !== 'url') return t;\n const history = [...t.history.slice(0, t.index + 1), href].slice(-50);\n return { ...t, history, index: history.length - 1 };\n }));\n }, [active, openUrl]);\n\n const openArtifact = useCallback((path: string, kind: VersePreviewArtifactKind) => {\n setNotice(null);\n const existing = tabs.find((t) => t.kind === 'artifact' && t.path === path);\n if (existing) {\n setActiveId(existing.id);\n return;\n }\n const current = tabs.find((t) => t.id === activeId);\n if (current?.kind === 'launcher') {\n setTabs(tabs.map((t) => (t.id === current.id ? { id: t.id, kind: 'artifact', path, artifactKind: kind, reloadKey: 0 } : t)));\n return;\n }\n const id = nextId();\n setTabs([...tabs, { id, kind: 'artifact', path, artifactKind: kind, reloadKey: 0 }]);\n setActiveId(id);\n }, [tabs, activeId]);\n\n const newLauncherTab = () => {\n const existing = tabs.find((t) => t.kind === 'launcher');\n if (existing) {\n setActiveId(existing.id);\n } else {\n const id = nextId();\n setTabs((prev) => [...prev, { id, kind: 'launcher' }]);\n setActiveId(id);\n }\n void refreshTargets();\n };\n\n const closeTab = (tab: PreviewTab) => {\n const index = tabs.findIndex((t) => t.id === tab.id);\n const rest = tabs.filter((t) => t.id !== tab.id);\n setTabs(rest);\n setContent((prev) => { const next = new Map(prev); for (const key of prev.keys()) if (key.startsWith(`${tab.id}:`)) next.delete(key); return next; });\n if (activeId === tab.id) setActiveId((rest[index] ?? rest[index - 1] ?? null)?.id ?? null);\n };\n\n const onTabKeyDown = (event: ReactKeyboardEvent<HTMLButtonElement>, index: number) => {\n let next = -1;\n if (event.key === 'ArrowRight') next = (index + 1) % tabs.length;\n else if (event.key === 'ArrowLeft') next = (index - 1 + tabs.length) % tabs.length;\n else if (event.key === 'Home') next = 0;\n else if (event.key === 'End') next = tabs.length - 1;\n if (next < 0) return;\n event.preventDefault();\n const tab = tabs[next]!;\n setActiveId(tab.id);\n tabRefs.current.get(tab.id)?.focus();\n };\n\n // -------------------------------------------------------------------------\n // Dev servers: open, start, wait\n // -------------------------------------------------------------------------\n\n const startServer = useCallback((server: VersePreviewDevServer) => {\n setNotice(null);\n onOpenTerminal({ root: server.root, devServerId: server.id });\n setWaiting({ server, since: deps.now() });\n }, [deps, onOpenTerminal]);\n\n const openServer = useCallback((server: VersePreviewDevServer) => {\n if (server.running) openUrl(server.url);\n else startServer(server);\n }, [openUrl, startServer]);\n\n // Waiting for a started server: open it the moment its port answers.\n useEffect(() => {\n if (!waiting || !targets) return;\n const up = targets.devServers.find((s) => s.running && (s.id === waiting.server.id || s.port === waiting.server.port));\n if (up) {\n setWaiting(null);\n openUrl(waiting.server.url);\n return;\n }\n if (deps.now() - waiting.since > PREVIEW_START_TIMEOUT_MS) {\n setWaiting(null);\n setNotice(`Nothing answered on port ${waiting.server.port} within 2 minutes. Check the terminal for errors.`);\n }\n // `clock` ticks every second while waiting, so the timeout is noticed\n // even when a poll brings nothing new.\n }, [targets, waiting, openUrl, deps, clock]);\n\n // The elapsed-time label while waiting (display only; the poll is separate).\n useEffect(() => {\n if (!waiting) return;\n const id = setInterval(() => setClock(deps.now()), 1_000);\n return () => clearInterval(id);\n }, [waiting, deps]);\n\n // -------------------------------------------------------------------------\n // Requests from the dock\n // -------------------------------------------------------------------------\n\n const handleRequest = useCallback(async (req: PreviewOpenRequest) => {\n if (req.url) {\n const parsed = parsePreviewAddress(req.url, deps.origin());\n if (parsed.kind === 'loopback') openUrl(parsed.url);\n else setAddressNote(parsed);\n return;\n }\n if (req.artifactPath) {\n const listed = targets?.artifacts.find((a) => a.path === req.artifactPath);\n const kind = listed?.kind ?? kindFromPath(req.artifactPath);\n if (kind) openArtifact(req.artifactPath, kind);\n else setNotice('That file cannot be previewed.');\n return;\n }\n if (req.devServerId) {\n const list = (await refreshTargets()) ?? targets;\n const server = list?.devServers.find((s) => s.id === req.devServerId);\n if (server) openServer(server);\n else setNotice('That dev server is no longer listed for this chat.');\n }\n }, [deps, openArtifact, openServer, openUrl, refreshTargets, targets]);\n\n useEffect(() => {\n if (!request || request.nonce <= lastHandledNonce) return;\n lastHandledNonce = request.nonce;\n void handleRequest(request);\n }, [request, handleRequest]);\n\n // -------------------------------------------------------------------------\n // Artifact content (visible tab only)\n // -------------------------------------------------------------------------\n\n const contentKey = active?.kind === 'artifact' ? `${active.id}:${active.reloadKey}` : null;\n useEffect(() => {\n if (!shown || !active || active.kind !== 'artifact' || !contentKey || content.has(contentKey)) return;\n const tab = active;\n const key = contentKey;\n setContent((prev) => new Map(prev).set(key, { status: 'loading' }));\n const load = tab.artifactKind === 'md'\n ? deps.api.text(sessionId, tab.path).then((text): ArtifactContent => ({ status: 'text', text }))\n : deps.api.ticket(sessionId, tab.path).then((ticket): ArtifactContent => ({ status: 'frame', src: ticket.url }));\n load.then(\n (value) => { if (mounted.current) setContent((prev) => new Map(prev).set(key, value)); },\n (err: unknown) => {\n const message = err instanceof ApiError && err.status === 404\n ? 'This file is no longer in the chat\\'s folder.'\n : err instanceof ApiError && err.status === 413\n ? 'This file is larger than 5 MB, too large to preview.'\n : 'This file could not be loaded.';\n if (mounted.current) setContent((prev) => new Map(prev).set(key, { status: 'error', message }));\n },\n );\n }, [shown, active, contentKey, content, deps.api, sessionId]);\n\n // -------------------------------------------------------------------------\n // Toolbar\n // -------------------------------------------------------------------------\n\n const go = (delta: -1 | 1) => {\n if (!active || active.kind !== 'url') return;\n setTabs((prev) => prev.map((t) => (t.id === active.id && t.kind === 'url'\n ? { ...t, index: Math.min(t.history.length - 1, Math.max(0, t.index + delta)) }\n : t)));\n };\n\n const reload = () => {\n if (!active) return;\n if (active.kind === 'launcher') {\n void refreshTargets();\n return;\n }\n setTabs((prev) => prev.map((t) => (t.id === active.id && t.kind !== 'launcher' ? { ...t, reloadKey: t.reloadKey + 1 } : t)));\n };\n\n const submitAddress = (event: FormEvent) => {\n event.preventDefault();\n const parsed = parsePreviewAddress(address, deps.origin());\n if (parsed.kind === 'loopback') {\n setAddressNote(null);\n if (active?.kind === 'url') navigateActive(parsed.url);\n else openUrl(parsed.url);\n return;\n }\n setAddressNote(parsed);\n };\n\n const onAddressKeyDown = (event: ReactKeyboardEvent<HTMLInputElement>) => {\n if (event.key !== 'Escape') return;\n event.preventDefault();\n setAddress(url ?? (active?.kind === 'artifact' ? active.path : ''));\n setAddressNote(null);\n event.currentTarget.blur();\n };\n\n const canBack = active?.kind === 'url' && active.index > 0;\n const canForward = active?.kind === 'url' && active.index < active.history.length - 1;\n\n // -------------------------------------------------------------------------\n // Render\n // -------------------------------------------------------------------------\n\n return (\n <div className={styles.pane} data-compact={compact || undefined}>\n <div className={styles.strip}>\n <div className={styles.tabs} role=\"tablist\" aria-label=\"Previews\">\n {tabs.map((tab, index) => {\n const selected = tab.id === activeId;\n const label = tabLabel(tab);\n return (\n <div key={tab.id} className={styles.tab} data-selected={selected || undefined} role=\"presentation\">\n <button\n ref={(node) => { if (node) tabRefs.current.set(tab.id, node); else tabRefs.current.delete(tab.id); }}\n type=\"button\"\n role=\"tab\"\n id={`preview-tab-${tab.id}`}\n aria-selected={selected}\n aria-controls=\"preview-panel\"\n tabIndex={selected ? 0 : -1}\n className={styles.tabButton}\n title={tab.kind === 'url' ? tab.history[tab.index] : tab.kind === 'artifact' ? tab.path : 'Choose what to preview'}\n onClick={() => setActiveId(tab.id)}\n onKeyDown={(event) => onTabKeyDown(event, index)}\n >\n {tab.kind === 'artifact' ? <FileGlyph size={12} /> : tab.kind === 'url' ? <ServerGlyph size={12} /> : <PreviewGlyph size={12} />}\n <span className={styles.tabTitle}>{label}</span>\n </button>\n <button type=\"button\" className={styles.tabClose} aria-label={`Close preview ${label}`} title=\"Close\"\n onClick={() => closeTab(tab)}>\n <IconX size={12} />\n </button>\n </div>\n );\n })}\n </div>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<IconPlus />} aria-label=\"New preview tab\" title=\"New preview tab\"\n className={styles.newTab} onClick={newLauncherTab} />\n </div>\n\n <div className={`${chrome.header} ${styles.toolbar}`}>\n <div className={styles.nav}>\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ArrowLeftGlyph />} aria-label=\"Back\" title=\"Back\" disabled={!canBack} onClick={() => go(-1)} />\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ArrowRightGlyph />} aria-label=\"Forward\" title=\"Forward\" disabled={!canForward} onClick={() => go(1)} />\n <IconButton variant=\"ghost\" size=\"sm\" icon={<ReloadGlyph />} aria-label={showLauncher ? 'Refresh the list' : 'Reload'}\n title={showLauncher ? 'Refresh the list' : 'Reload'}\n disabled={!active && showLauncher && targets === null} onClick={reload} />\n </div>\n <form className={styles.addressForm} onSubmit={submitAddress} role=\"search\" aria-label=\"Preview address\">\n <input\n ref={addressRef}\n className={styles.address}\n value={address}\n onChange={(event) => setAddress(event.target.value)}\n onKeyDown={onAddressKeyDown}\n onFocus={(event) => event.currentTarget.select()}\n placeholder=\"localhost:5173\"\n aria-label=\"Address\"\n spellCheck={false}\n autoCapitalize=\"off\"\n autoCorrect=\"off\"\n inputMode=\"url\"\n readOnly={active?.kind === 'artifact'}\n />\n </form>\n <div className={chrome.actions}>\n {!compact ? (\n <Segmented<Device>\n aria-label=\"Frame width\"\n size=\"sm\"\n value={device}\n onChange={setDevice}\n options={[\n { value: 'desktop', label: <DesktopGlyph size={14} />, ariaLabel: 'Desktop width' },\n { value: 'phone', label: <PhoneGlyph size={14} />, ariaLabel: '375 px width' },\n ]}\n />\n ) : null}\n {url ? (\n <a className={styles.external} href={url} target=\"_blank\" rel=\"noopener noreferrer\" aria-label=\"Open in browser\" title=\"Open in browser\">\n <IconExternalLink />\n </a>\n ) : (\n // Holds the link's place so the address bar keeps its width when a\n // page opens or closes (no link to offer for a file or the launcher).\n <span className={styles.external} data-placeholder=\"true\" aria-hidden=\"true\" />\n )}\n </div>\n </div>\n\n {addressNote ? <AddressNote note={addressNote} onDismiss={() => setAddressNote(null)} /> : null}\n\n {waiting ? (\n <div className={styles.waiting} role=\"status\">\n <span className={styles.pulse} aria-hidden=\"true\" />\n <span className={styles.waitingText}>\n Starting <code>{waiting.server.command ?? waiting.server.label}</code> — waiting for {shortUrl(waiting.server.url)}\n {' · '}\n {Math.max(0, Math.round((clock - waiting.since) / 1000))}s\n </span>\n <Button size=\"sm\" variant=\"ghost\" onClick={() => setWaiting(null)}>Stop waiting</Button>\n </div>\n ) : null}\n\n {notice ? (\n <div className={styles.notice} role=\"alert\">\n <span>{notice}</span>\n <button type=\"button\" className={styles.noticeClose} aria-label=\"Dismiss\" title=\"Dismiss\" onClick={() => setNotice(null)}><IconX size={12} /></button>\n </div>\n ) : null}\n\n <div className={styles.body} id=\"preview-panel\" role=\"tabpanel\" aria-labelledby={active ? `preview-tab-${active.id}` : undefined}>\n {showLauncher ? (\n <Launcher\n targets={targets}\n error={targetsError}\n roots={roots}\n onOpenServer={openServer}\n onOpenArtifact={(a) => openArtifact(a.path, a.kind)}\n onRetry={() => void refreshTargets()}\n onOpenTerminal={() => onOpenTerminal(roots[0] ? { root: roots[0] } : {})}\n waitingId={waiting?.server.id ?? null}\n />\n ) : active?.kind === 'url' ? (\n <div className={styles.stage} data-device={device}>\n <iframe\n key={`${active.id}:${active.index}:${active.reloadKey}`}\n className={styles.frame}\n src={active.history[active.index]}\n title={`Preview of ${tabLabel(active)}`}\n // A dev server is another origin: allow-same-origin is ITS origin.\n // No allow-top-navigation: it can never navigate Verse away.\n sandbox=\"allow-scripts allow-same-origin allow-forms allow-popups allow-modals allow-downloads\"\n referrerPolicy=\"no-referrer\"\n />\n <p className={styles.frameHint}>\n Blank page? Some servers refuse to be framed.{' '}\n <a href={active.history[active.index]} target=\"_blank\" rel=\"noopener noreferrer\">Open in browser ↗</a>\n </p>\n </div>\n ) : active?.kind === 'artifact' ? (\n <ArtifactView tab={active} content={contentKey ? content.get(contentKey) ?? { status: 'loading' } : { status: 'loading' }} device={device}\n onRetry={reload} />\n ) : null}\n </div>\n </div>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Pieces\n// ---------------------------------------------------------------------------\n\nfunction AddressNote({ note, onDismiss }: { note: PreviewAddress; onDismiss: () => void }) {\n return (\n <div className={styles.addressNote} role=\"status\">\n {note.kind === 'external' ? (\n <span>\n Only local dev servers open here.{' '}\n <a href={note.url} target=\"_blank\" rel=\"noopener noreferrer\">Open in browser ↗</a>\n </span>\n ) : note.kind === 'self' ? (\n <span>That address is Verse itself.</span>\n ) : (\n <span>Enter a local address, like <code>localhost:5173</code>.</span>\n )}\n <button type=\"button\" className={styles.noticeClose} aria-label=\"Dismiss\" title=\"Dismiss\" onClick={onDismiss}><IconX size={12} /></button>\n </div>\n );\n}\n\nfunction ArtifactView({ tab, content, device, onRetry }: { tab: Extract<PreviewTab, { kind: 'artifact' }>; content: ArtifactContent; device: Device; onRetry: () => void }) {\n if (content.status === 'loading') {\n return <div className={styles.loading} aria-busy=\"true\"><SkeletonLine width=\"50%\" /><SkeletonLine width=\"80%\" /></div>;\n }\n if (content.status === 'error') {\n return <EmptyState compact tone=\"error\" title=\"Preview unavailable\" body={content.message}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={onRetry}>Try again</Button>} />;\n }\n if (content.status === 'text') {\n return (\n <article className={styles.markdown} aria-label={tab.path}>\n <MessageMarkdown text={content.text} />\n </article>\n );\n }\n if (tab.artifactKind === 'image') {\n return (\n <div className={styles.imageStage}>\n <img className={styles.image} src={content.src} alt={baseName(tab.path)} />\n </div>\n );\n }\n return (\n <div className={styles.stage} data-device={tab.artifactKind === 'pdf' ? 'desktop' : device}>\n <iframe\n key={content.src}\n className={styles.frame}\n src={content.src}\n title={`Preview of ${tab.path}`}\n // HTML and SVG run in a sandbox with NO same-origin (the server's CSP\n // says the same): their own script works, Verse stays out of reach.\n // PDF viewers refuse to run sandboxed (see preview.ts PDF_CSP).\n {...(tab.artifactKind === 'pdf' ? {} : { sandbox: 'allow-scripts' })}\n referrerPolicy=\"no-referrer\"\n />\n </div>\n );\n}\n\nfunction Launcher({ targets, error, roots, onOpenServer, onOpenArtifact, onRetry, onOpenTerminal, waitingId }: {\n targets: VersePreviewTargetsResponse | null;\n error: string | null;\n roots: readonly string[];\n onOpenServer: (server: VersePreviewDevServer) => void;\n onOpenArtifact: (artifact: VersePreviewArtifact) => void;\n onRetry: () => void;\n /** Opens a terminal (below this pane) in the chat's first folder, to start a server by hand. */\n onOpenTerminal: () => void;\n waitingId: string | null;\n}) {\n if (!targets) {\n if (error) {\n return <EmptyState compact tone=\"error\" title=\"Could not list what to preview\" body={error}\n action={<Button size=\"sm\" variant=\"subtle\" onClick={onRetry}>Try again</Button>} />;\n }\n return <div className={styles.loading} aria-busy=\"true\"><SkeletonLine width=\"35%\" /><SkeletonLine width=\"70%\" /><SkeletonLine width=\"60%\" /></div>;\n }\n const multiRoot = roots.length > 1;\n if (targets.devServers.length === 0 && targets.artifacts.length === 0) {\n return (\n <EmptyState\n compact\n icon={<PreviewGlyph size={20} />}\n title=\"Nothing to preview yet\"\n body=\"Start a dev server in the terminal, or ask for an HTML report. Local servers and the files this chat writes show up here.\"\n action={<Button size=\"sm\" variant=\"subtle\" onClick={onOpenTerminal}>Open a terminal</Button>}\n />\n );\n }\n return (\n <div className={styles.launcher}>\n <section className={styles.section} aria-labelledby=\"preview-servers-title\">\n <h3 className={styles.sectionTitle} id=\"preview-servers-title\">Dev servers</h3>\n {targets.devServers.length === 0 ? (\n <p className={styles.muted}>No dev server found in this chat's folders. Add one to <code>.claude/launch.json</code>, or start it in the terminal.</p>\n ) : (\n <ul className={styles.rows}>\n {targets.devServers.map((server) => (\n <li key={server.id} className={styles.row}>\n <span className={styles.dot} data-running={server.running || undefined} aria-hidden=\"true\" />\n <span className={styles.rowMain}>\n <span className={styles.rowTitle} title={server.label}>{server.label}</span>\n <span className={styles.rowMeta}\n title={`${shortUrl(server.url)} · ${server.running ? 'running' : 'stopped'} · ${SOURCE_LABEL[server.source]}${multiRoot ? ` · ${server.root}` : ''}`}>\n {shortUrl(server.url)} · {server.running ? 'running' : 'stopped'} · {SOURCE_LABEL[server.source]}\n {multiRoot ? ` · ${baseName(server.root)}` : ''}\n </span>\n {/* What Start will type, before the click — a launch.json row's\n label is only its name. Skipped when the label already is it. */}\n {!server.running && server.command && server.command !== server.label ? (\n <code className={styles.rowCommand} title={server.command}>{server.command}</code>\n ) : null}\n </span>\n {server.running ? (\n <Button size=\"sm\" variant=\"subtle\" onClick={() => onOpenServer(server)} aria-label={`Open ${server.label}`}>Open</Button>\n ) : (\n <Button size=\"sm\" variant=\"subtle\" icon={<PlayGlyph size={12} />} busy={waitingId === server.id}\n onClick={() => onOpenServer(server)} aria-label={`Start ${server.label}`}\n title={`Runs ${server.command ?? server.label} in a terminal tab`}>\n Start\n </Button>\n )}\n </li>\n ))}\n </ul>\n )}\n </section>\n <section className={styles.section} aria-labelledby=\"preview-files-title\">\n <h3 className={styles.sectionTitle} id=\"preview-files-title\">This chat's files</h3>\n {targets.artifacts.length === 0 ? (\n <p className={styles.muted}>Ask the chat for a report or a page: HTML, Markdown, SVG, images and PDFs it writes appear here.</p>\n ) : (\n <ul className={styles.rows}>\n {targets.artifacts.map((artifact) => {\n const tooBig = artifact.bytes > 5 * 1024 * 1024;\n return (\n <li key={artifact.path} className={styles.row}>\n <FileGlyph size={14} className={styles.fileIcon} />\n <span className={styles.rowMain}>\n <span className={styles.rowTitle} title={artifact.path}>{artifact.path}</span>\n <span className={styles.rowMeta}>{KIND_LABEL[artifact.kind]} · {formatBytes(artifact.bytes)}</span>\n </span>\n <Button size=\"sm\" variant=\"subtle\" disabled={tooBig} title={tooBig ? 'Larger than 5 MB' : undefined}\n onClick={() => onOpenArtifact(artifact)} aria-label={`Open ${artifact.path}`}>\n Open\n </Button>\n </li>\n );\n })}\n </ul>\n )}\n </section>\n </div>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{n as e}from"./index-DOAOxiKl.js";var t=e(),n={claude:{name:`Anthropic Claude`,fill:`#D97757`,rule:`nonzero`,d:`M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z`},codex:{name:`OpenAI`,fill:null,rule:`evenodd`,d:`M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z`},grok:{name:`xAI Grok`,fill:null,rule:`evenodd`,d:`M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815`},local:{name:`Ollama`,fill:null,rule:`evenodd`,d:`M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z`},devin:{name:`Cognition Devin`,viewBox:`0 0 425 425`,fill:null,rule:`nonzero`,d:`M70 159.333V91.3471C70 88.3592 71.594 85.5983 74.1816 84.1044L133.043 50.1205C135.631 48.6265 138.819 48.6265 141.407 50.1205L200.269 84.1044C202.856 85.5983 204.45 88.3592 204.45 91.3471V126.068C204.708 137.606 210.806 148.734 221.531 154.926C232.256 161.117 244.942 160.834 255.063 155.289L285.132 137.929C287.719 136.435 290.907 136.435 293.495 137.929L352.357 171.913C354.944 173.406 356.538 176.167 356.538 179.155V247.123C356.538 250.111 354.944 252.872 352.357 254.366L293.495 288.35C290.907 289.844 287.719 289.844 285.132 288.35L255.306 271.13C245.146 265.456 232.344 265.117 221.534 271.358C210.809 277.55 204.711 288.678 204.453 300.215V334.926C204.453 337.914 202.859 340.675 200.271 342.169L141.41 376.153C138.822 377.647 135.634 377.647 133.046 376.153L74.1845 342.169C71.5969 340.675 70.0028 337.914 70.0028 334.926V266.959C70.0029 263.971 71.5969 261.21 74.1845 259.716L133.046 225.732C135.634 224.238 138.822 224.238 141.41 225.732L171.547 243.132C181.656 248.638 194.306 248.906 205.005 242.729C215.815 236.488 221.922 225.231 222.088 213.595C221.83 202.057 215.732 189.737 205.008 183.545C194.283 177.353 181.597 177.636 171.476 183.181L141.269 200.72C138.67 202.229 135.461 202.228 132.864 200.716L74.1576 166.562C71.5835 165.065 70 162.311 70 159.333Z`}};function r({engine:e,size:r=16,className:i,style:a,title:o,x:s,y:c}){let l=n[e];return l?(0,t.jsx)(`svg`,{viewBox:l.viewBox??`0 0 24 24`,x:s,y:c,width:r,height:r,className:i,style:{flex:`none`,...a},role:o?`img`:void 0,"aria-hidden":!o||void 0,"aria-label":o,focusable:`false`,"data-provider":e,children:(0,t.jsx)(`path`,{d:l.d,fill:l.fill??`currentColor`,fillRule:l.rule})}):null}export{r as t};
2
- //# sourceMappingURL=ProviderLogo-BliSWEMw.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ProviderLogo-BliSWEMw.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/ProviderLogo.tsx"],"sourcesContent":["/**\n * Provider marks for the engines Verse runs on — Claude (Anthropic),\n * Codex (OpenAI), Grok (xAI), local models (Ollama) and (3.15) Devin\n * (Cognition).\n *\n * Claude/Codex/Grok/Ollama path data from @lobehub/icons (MIT, https://github.com/lobehub/lobe-icons),\n * inlined so the marks need no network and no runtime dependency. The marks\n * themselves are the owners' trademarks, used only to identify the provider\n * an account belongs to. Claude keeps its brand colour; the others draw in\n * currentColor so they follow the theme (light and dark) like any glyph.\n *\n * Decorative by default (aria-hidden): the provider NAME is always rendered\n * as text beside the mark. Pass `title` only where the mark stands alone.\n */\nimport type { CSSProperties } from 'react';\n\nexport type ProviderEngine = 'claude' | 'codex' | 'grok' | 'local' | 'devin';\n\ninterface Mark { viewBox?: string; d: string; fill: string | null; rule: 'evenodd' | 'nonzero'; name: string }\n\nconst MARKS: Readonly<Record<ProviderEngine, Mark>> = {\n claude: { name: 'Anthropic Claude', fill: \"#D97757\", rule: 'nonzero', d: \"M4.709 15.955l4.72-2.647.08-.23-.08-.128H9.2l-.79-.048-2.698-.073-2.339-.097-2.266-.122-.571-.121L0 11.784l.055-.352.48-.321.686.06 1.52.103 2.278.158 1.652.097 2.449.255h.389l.055-.157-.134-.098-.103-.097-2.358-1.596-2.552-1.688-1.336-.972-.724-.491-.364-.462-.158-1.008.656-.722.881.06.225.061.893.686 1.908 1.476 2.491 1.833.365.304.145-.103.019-.073-.164-.274-1.355-2.446-1.446-2.49-.644-1.032-.17-.619a2.97 2.97 0 01-.104-.729L6.283.134 6.696 0l.996.134.42.364.62 1.414 1.002 2.229 1.555 3.03.456.898.243.832.091.255h.158V9.01l.128-1.706.237-2.095.23-2.695.08-.76.376-.91.747-.492.584.28.48.685-.067.444-.286 1.851-.559 2.903-.364 1.942h.212l.243-.242.985-1.306 1.652-2.064.73-.82.85-.904.547-.431h1.033l.76 1.129-.34 1.166-1.064 1.347-.881 1.142-1.264 1.7-.79 1.36.073.11.188-.02 2.856-.606 1.543-.28 1.841-.315.833.388.091.395-.328.807-1.969.486-2.309.462-3.439.813-.042.03.049.061 1.549.146.662.036h1.622l3.02.225.79.522.474.638-.079.485-1.215.62-1.64-.389-3.829-.91-1.312-.329h-.182v.11l1.093 1.068 2.006 1.81 2.509 2.33.127.578-.322.455-.34-.049-2.205-1.657-.851-.747-1.926-1.62h-.128v.17l.444.649 2.345 3.521.122 1.08-.17.353-.608.213-.668-.122-1.374-1.925-1.415-2.167-1.143-1.943-.14.08-.674 7.254-.316.37-.729.28-.607-.461-.322-.747.322-1.476.389-1.924.315-1.53.286-1.9.17-.632-.012-.042-.14.018-1.434 1.967-2.18 2.945-1.726 1.845-.414.164-.717-.37.067-.662.401-.589 2.388-3.036 1.44-1.882.93-1.086-.006-.158h-.055L4.132 18.56l-1.13.146-.487-.456.061-.746.231-.243 1.908-1.312-.006.006z\" },\n codex: { name: 'OpenAI', fill: null, rule: 'evenodd', d: \"M9.205 8.658v-2.26c0-.19.072-.333.238-.428l4.543-2.616c.619-.357 1.356-.523 2.117-.523 2.854 0 4.662 2.212 4.662 4.566 0 .167 0 .357-.024.547l-4.71-2.759a.797.797 0 00-.856 0l-5.97 3.473zm10.609 8.8V12.06c0-.333-.143-.57-.429-.737l-5.97-3.473 1.95-1.118a.433.433 0 01.476 0l4.543 2.617c1.309.76 2.189 2.378 2.189 3.948 0 1.808-1.07 3.473-2.76 4.163zM7.802 12.703l-1.95-1.142c-.167-.095-.239-.238-.239-.428V5.899c0-2.545 1.95-4.472 4.591-4.472 1 0 1.927.333 2.712.928L8.23 5.067c-.285.166-.428.404-.428.737v6.898zM12 15.128l-2.795-1.57v-3.33L12 8.658l2.795 1.57v3.33L12 15.128zm1.796 7.23c-1 0-1.927-.332-2.712-.927l4.686-2.712c.285-.166.428-.404.428-.737v-6.898l1.974 1.142c.167.095.238.238.238.428v5.233c0 2.545-1.974 4.472-4.614 4.472zm-5.637-5.303l-4.544-2.617c-1.308-.761-2.188-2.378-2.188-3.948A4.482 4.482 0 014.21 6.327v5.423c0 .333.143.571.428.738l5.947 3.449-1.95 1.118a.432.432 0 01-.476 0zm-.262 3.9c-2.688 0-4.662-2.021-4.662-4.519 0-.19.024-.38.047-.57l4.686 2.71c.286.167.571.167.856 0l5.97-3.448v2.26c0 .19-.07.333-.237.428l-4.543 2.616c-.619.357-1.356.523-2.117.523zm5.899 2.83a5.947 5.947 0 005.827-4.756C22.287 18.339 24 15.84 24 13.296c0-1.665-.713-3.282-1.998-4.448.119-.5.19-.999.19-1.498 0-3.401-2.759-5.947-5.946-5.947-.642 0-1.26.095-1.88.31A5.962 5.962 0 0010.205 0a5.947 5.947 0 00-5.827 4.757C1.713 5.447 0 7.945 0 10.49c0 1.666.713 3.283 1.998 4.448-.119.5-.19 1-.19 1.499 0 3.401 2.759 5.946 5.946 5.946.642 0 1.26-.095 1.88-.309a5.96 5.96 0 004.162 1.713z\" },\n grok: { name: 'xAI Grok', fill: null, rule: 'evenodd', d: \"M9.27 15.29l7.978-5.897c.391-.29.95-.177 1.137.272.98 2.369.542 5.215-1.41 7.169-1.951 1.954-4.667 2.382-7.149 1.406l-2.711 1.257c3.889 2.661 8.611 2.003 11.562-.953 2.341-2.344 3.066-5.539 2.388-8.42l.006.007c-.983-4.232.242-5.924 2.75-9.383.06-.082.12-.164.179-.248l-3.301 3.305v-.01L9.267 15.292M7.623 16.723c-2.792-2.67-2.31-6.801.071-9.184 1.761-1.763 4.647-2.483 7.166-1.425l2.705-1.25a7.808 7.808 0 00-1.829-1A8.975 8.975 0 005.984 5.83c-2.533 2.536-3.33 6.436-1.962 9.764 1.022 2.487-.653 4.246-2.34 6.022-.599.63-1.199 1.259-1.682 1.925l7.62-6.815\" },\n local: { name: 'Ollama', fill: null, rule: 'evenodd', d: \"M7.905 1.09c.216.085.411.225.588.41.295.306.544.744.734 1.263.191.522.315 1.1.362 1.68a5.054 5.054 0 012.049-.636l.051-.004c.87-.07 1.73.087 2.48.474.101.053.2.11.297.17.05-.569.172-1.134.36-1.644.19-.52.439-.957.733-1.264a1.67 1.67 0 01.589-.41c.257-.1.53-.118.796-.042.401.114.745.368 1.016.737.248.337.434.769.561 1.287.23.934.27 2.163.115 3.645l.053.04.026.019c.757.576 1.284 1.397 1.563 2.35.435 1.487.216 3.155-.534 4.088l-.018.021.002.003c.417.762.67 1.567.724 2.4l.002.03c.064 1.065-.2 2.137-.814 3.19l-.007.01.01.024c.472 1.157.62 2.322.438 3.486l-.006.039a.651.651 0 01-.747.536.648.648 0 01-.54-.742c.167-1.033.01-2.069-.48-3.123a.643.643 0 01.04-.617l.004-.006c.604-.924.854-1.83.8-2.72-.046-.779-.325-1.544-.8-2.273a.644.644 0 01.18-.886l.009-.006c.243-.159.467-.565.58-1.12a4.229 4.229 0 00-.095-1.974c-.205-.7-.58-1.284-1.105-1.683-.595-.454-1.383-.673-2.38-.61a.653.653 0 01-.632-.371c-.314-.665-.772-1.141-1.343-1.436a3.288 3.288 0 00-1.772-.332c-1.245.099-2.343.801-2.67 1.686a.652.652 0 01-.61.425c-1.067.002-1.893.252-2.497.703-.522.39-.878.935-1.066 1.588a4.07 4.07 0 00-.068 1.886c.112.558.331 1.02.582 1.269l.008.007c.212.207.257.53.109.785-.36.622-.629 1.549-.673 2.44-.05 1.018.186 1.902.719 2.536l.016.019a.643.643 0 01.095.69c-.576 1.236-.753 2.252-.562 3.052a.652.652 0 01-1.269.298c-.243-1.018-.078-2.184.473-3.498l.014-.035-.008-.012a4.339 4.339 0 01-.598-1.309l-.005-.019a5.764 5.764 0 01-.177-1.785c.044-.91.278-1.842.622-2.59l.012-.026-.002-.002c-.293-.418-.51-.953-.63-1.545l-.005-.024a5.352 5.352 0 01.093-2.49c.262-.915.777-1.701 1.536-2.269.06-.045.123-.09.186-.132-.159-1.493-.119-2.73.112-3.67.127-.518.314-.95.562-1.287.27-.368.614-.622 1.015-.737.266-.076.54-.059.797.042zm4.116 9.09c.936 0 1.8.313 2.446.855.63.527 1.005 1.235 1.005 1.94 0 .888-.406 1.58-1.133 2.022-.62.375-1.451.557-2.403.557-1.009 0-1.871-.259-2.493-.734-.617-.47-.963-1.13-.963-1.845 0-.707.398-1.417 1.056-1.946.668-.537 1.55-.849 2.485-.849zm0 .896a3.07 3.07 0 00-1.916.65c-.461.37-.722.835-.722 1.25 0 .428.21.829.61 1.134.455.347 1.124.548 1.943.548.799 0 1.473-.147 1.932-.426.463-.28.7-.686.7-1.257 0-.423-.246-.89-.683-1.256-.484-.405-1.14-.643-1.864-.643zm.662 1.21l.004.004c.12.151.095.37-.056.49l-.292.23v.446a.375.375 0 01-.376.373.375.375 0 01-.376-.373v-.46l-.271-.218a.347.347 0 01-.052-.49.353.353 0 01.494-.051l.215.172.22-.174a.353.353 0 01.49.051zm-5.04-1.919c.478 0 .867.39.867.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zm8.706 0c.48 0 .868.39.868.871a.87.87 0 01-.868.871.87.87 0 01-.867-.87.87.87 0 01.867-.872zM7.44 2.3l-.003.002a.659.659 0 00-.285.238l-.005.006c-.138.189-.258.467-.348.832-.17.692-.216 1.631-.124 2.782.43-.128.899-.208 1.404-.237l.01-.001.019-.034c.046-.082.095-.161.148-.239.123-.771.022-1.692-.253-2.444-.134-.364-.297-.65-.453-.813a.628.628 0 00-.107-.09L7.44 2.3zm9.174.04l-.002.001a.628.628 0 00-.107.09c-.156.163-.32.45-.453.814-.29.794-.387 1.776-.23 2.572l.058.097.008.014h.03a5.184 5.184 0 011.466.212c.086-1.124.038-2.043-.128-2.722-.09-.365-.21-.643-.349-.832l-.004-.006a.659.659 0 00-.285-.239h-.004z\" },\n // Exact vendor geometry from https://devin.ai/favicon.svg, also retained\n // unchanged in site/assets/devin-mark.svg (SHA256 fe0753d2e3823bc1eb8a37943234fac63733b8c9e8abff0ca0402a6c7ddcd682).\n // Only the monochrome ink follows the theme, like the other provider marks.\n devin: { name: 'Cognition Devin', viewBox: '0 0 425 425', fill: null, rule: 'nonzero', d: \"M70 159.333V91.3471C70 88.3592 71.594 85.5983 74.1816 84.1044L133.043 50.1205C135.631 48.6265 138.819 48.6265 141.407 50.1205L200.269 84.1044C202.856 85.5983 204.45 88.3592 204.45 91.3471V126.068C204.708 137.606 210.806 148.734 221.531 154.926C232.256 161.117 244.942 160.834 255.063 155.289L285.132 137.929C287.719 136.435 290.907 136.435 293.495 137.929L352.357 171.913C354.944 173.406 356.538 176.167 356.538 179.155V247.123C356.538 250.111 354.944 252.872 352.357 254.366L293.495 288.35C290.907 289.844 287.719 289.844 285.132 288.35L255.306 271.13C245.146 265.456 232.344 265.117 221.534 271.358C210.809 277.55 204.711 288.678 204.453 300.215V334.926C204.453 337.914 202.859 340.675 200.271 342.169L141.41 376.153C138.822 377.647 135.634 377.647 133.046 376.153L74.1845 342.169C71.5969 340.675 70.0028 337.914 70.0028 334.926V266.959C70.0029 263.971 71.5969 261.21 74.1845 259.716L133.046 225.732C135.634 224.238 138.822 224.238 141.41 225.732L171.547 243.132C181.656 248.638 194.306 248.906 205.005 242.729C215.815 236.488 221.922 225.231 222.088 213.595C221.83 202.057 215.732 189.737 205.008 183.545C194.283 177.353 181.597 177.636 171.476 183.181L141.269 200.72C138.67 202.229 135.461 202.228 132.864 200.716L74.1576 166.562C71.5835 165.065 70 162.311 70 159.333Z\" },\n};\n\nexport function providerName(engine: ProviderEngine): string {\n return MARKS[engine].name;\n}\n\nexport function ProviderLogo({ engine, size = 16, className, style, title, x, y }: {\n engine: ProviderEngine;\n size?: number;\n /** Position when nested inside an SVG chart (e.g. a lane label). */\n x?: number;\n y?: number;\n className?: string;\n style?: CSSProperties;\n /** Accessible name; omit when the provider's name is shown as text nearby. */\n title?: string;\n}) {\n const mark = MARKS[engine];\n if (!mark) return null;\n return (\n <svg\n viewBox={mark.viewBox ?? '0 0 24 24'}\n x={x}\n y={y}\n width={size}\n height={size}\n className={className}\n style={{ flex: 'none', ...style }}\n role={title ? 'img' : undefined}\n aria-hidden={title ? undefined : true}\n aria-label={title}\n focusable=\"false\"\n data-provider={engine}\n >\n <path d={mark.d} fill={mark.fill ?? 'currentColor'} fillRule={mark.rule} />\n </svg>\n );\n}\n"],"mappings":"kDAoBM,EAAgD,CACpD,OAAQ,CAAE,KAAM,mBAAoB,KAAM,UAAW,KAAM,UAAW,EAAG,69CAA89C,EACviD,MAAO,CAAE,KAAM,SAAU,KAAM,KAAM,KAAM,UAAW,EAAG,+8CAAg9C,EACzgD,KAAM,CAAE,KAAM,WAAY,KAAM,KAAM,KAAM,UAAW,EAAG,8iBAA+iB,EACzmB,MAAO,CAAE,KAAM,SAAU,KAAM,KAAM,KAAM,UAAW,EAAG,khGAAmhG,EAI5kG,MAAO,CAAE,KAAM,kBAAmB,QAAS,cAAe,KAAM,KAAM,KAAM,UAAW,EAAG,0vCAA2vC,CACv1C,EAMA,SAAgB,EAAa,CAAE,SAAQ,OAAO,GAAI,YAAW,QAAO,QAAO,IAAG,KAU3E,CACD,IAAM,EAAO,EAAM,GAEnB,OADK,GAEH,EAAA,EAAA,IAAA,CAAC,MAAD,CACE,QAAS,EAAK,SAAW,YACtB,IACA,IACH,MAAO,EACP,OAAQ,EACG,YACX,MAAO,CAAE,KAAM,OAAQ,GAAG,CAAM,EAChC,KAAM,EAAQ,MAAQ,IAAA,GACtB,cAAa,IAAQ,IAAA,GACrB,aAAY,EACZ,UAAU,QACV,gBAAe,EAEf,UAAA,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,EAAG,EAAK,EAAG,KAAM,EAAK,MAAQ,eAAgB,SAAU,EAAK,IAAO,CAAA,CACvE,CAAA,EAjBW,IAmBpB"}
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{t as r}from"./percent-text-CSk89zQF.js";import{i}from"./CapacityStrip-B5Yj2PhZ.js";import{l as a,r as o}from"./capacity-strip-model-Wna9o0dS.js";var s=e(n(),1),c={count:`_count_16gc0_5`,dot:`_dot_16gc0_26`,pulse:`_pulse_16gc0_27`,autonomy:`_autonomy_16gc0_41`,ring:`_ring_16gc0_57`,ringTrack:`_ringTrack_16gc0_58`,ringFill:`_ringFill_16gc0_59`},l=t();function u(e){return e.stopped?`danger`:e.paused?`warning`:e.mode===`autonomous`?`success`:e.mode===`propose`?`info`:`neutral`}function d(e,t){if(!t)return null;switch(e){case`command`:{let e=t.counts.needsYou;return e>0?{kind:`count`,count:e,spoken:`, ${e} need${e===1?`s`:``} you`,tone:`warning`}:null}case`chat`:{let e=t.counts.running;if(e>0)return{kind:`pulse`,spoken:`, ${e} running`,tone:`running`};let n=t.counts.unread;return n>0?{kind:`dot`,spoken:`, ${n} unread`,tone:`info`}:null}case`fleet`:return t.autonomy?{kind:`autonomy`,spoken:`, ${t.autonomy.label}`,autonomy:t.autonomy,tone:u(t.autonomy)}:null;case`mind`:return t.mind?.unseen?{kind:`dot`,spoken:`, new memo`,tone:`info`}:null;default:return null}}function f({badge:e}){if(e.kind===`count`){let t=e.count??0;return(0,l.jsx)(`span`,{className:c.count,"data-tone":e.tone,"aria-hidden":`true`,"data-badge":`count`,children:t>99?`99+`:t})}if(e.kind===`autonomy`&&e.autonomy){let t=e.autonomy,n=t.stopped?`stopped`:t.paused?`paused`:t.mode;return(0,l.jsx)(`span`,{className:c.autonomy,"data-shape":n,"data-tone":e.tone,"aria-hidden":`true`,"data-badge":`autonomy`})}return(0,l.jsx)(`span`,{className:e.kind===`pulse`?c.pulse:c.dot,"data-tone":e.tone,"aria-hidden":`true`,"data-badge":e.kind})}function p(e){return e>=90?`critical`:e>=70?`tight`:`ok`}function m(e){if(!e)return null;let t=e.windows.find(e=>e.binding)??null,n=t?.limitReached===!0,r=e.cls===`blocked`||n?100:t?.usedPercent??null;return r===null?null:{seatId:e.seatId,label:e.label,windowLabel:t?.label??null,usedPercent:Math.max(0,Math.min(100,r)),limitReached:n,resetText:t?.resetText??null,word:e.word}}function h(e){let t=e.resetText?` · ${e.resetText}`:``;return e.limitReached?`${e.label}: ${e.windowLabel??`window`} limit reached${t}`:e.windowLabel===null?`${e.label}: ${e.word}`:`${e.label}: ${e.windowLabel} ${r(e.usedPercent)} used${t}`}function g(){let e=i({withBudget:!1});return(0,s.useMemo)(()=>m(a(o(e.seats,{health:e.health,local:`hide`}))),[e.seats,e.health])}var _=7,v=2*Math.PI*_;function y({badge:e}){let t=Math.max(0,Math.min(100,e.usedPercent)),n=p(t);return(0,l.jsxs)(`svg`,{className:c.ring,"data-tone":n,viewBox:`0 0 18 18`,width:18,height:18,"aria-hidden":`true`,focusable:`false`,children:[(0,l.jsx)(`circle`,{className:c.ringTrack,cx:`9`,cy:`9`,r:_}),(0,l.jsx)(`circle`,{className:c.ringFill,cx:`9`,cy:`9`,r:_,strokeDasharray:`${t/100*v} ${v}`,transform:`rotate(-90 9 9)`})]})}export{y as CapacityRing,f as RailBadgeMark,u as autonomyTone,p as capacityTone,h as describeRailCapacity,d as railBadgeFor,m as railCapacityFromRow,g as useRailCapacity};
2
- //# sourceMappingURL=RailStatus-SnrVxLnp.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RailStatus-SnrVxLnp.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/RailStatus.module.css","../../../../../../src/web-ui/routes/verse/shell/RailStatus.tsx"],"sourcesContent":["/* Rail badges: pinned to the icon's own 16px box (RailIcon), so they read the\n same in the 56px and the labelled rail. Shape carries meaning; colour\n confirms it. */\n\n.count {\n position: absolute;\n top: -6px;\n right: -9px;\n min-width: 16px;\n height: 16px;\n padding: 0 4px;\n border-radius: var(--radius-full);\n /* The status pair, not solid + ink: the bg/fg tokens are the ones tuned\n for text contrast in BOTH themes (the solid flips nothing). */\n background: var(--status-warning-bg);\n box-shadow: 0 0 0 2px var(--bg-canvas), inset 0 0 0 1px var(--status-warning-solid);\n color: var(--status-warning-fg);\n font-family: var(--font-ui);\n font-size: var(--text-2xs-size);\n font-weight: var(--font-weight-semibold);\n line-height: 16px;\n text-align: center;\n font-variant-numeric: tabular-nums;\n}\n\n.dot,\n.pulse {\n position: absolute;\n top: -3px;\n right: -3px;\n width: 7px;\n height: 7px;\n border-radius: var(--radius-full);\n box-shadow: 0 0 0 2px var(--bg-canvas);\n background: var(--status-info-solid);\n}\n.pulse { background: var(--status-running-solid); animation: pulse var(--duration-pulse) ease-in-out infinite; }\n\n/* Autonomy: off = hollow ring, propose = half, autonomous = full,\n paused = a bar, stopped = a square. */\n.autonomy {\n position: absolute;\n top: -3px;\n right: -4px;\n width: 8px;\n height: 8px;\n border-radius: var(--radius-full);\n box-shadow: 0 0 0 2px var(--bg-canvas);\n border: 1.5px solid var(--text-tertiary);\n background: transparent;\n}\n.autonomy[data-shape='propose'] { border-color: var(--status-info-solid); background: linear-gradient(90deg, var(--status-info-solid) 50%, transparent 50%); }\n.autonomy[data-shape='autonomous'] { border-color: var(--status-success-solid); background: var(--status-success-solid); }\n.autonomy[data-shape='paused'] { border-radius: 1px; border: 0; width: 8px; height: 3px; top: 0; background: var(--status-warning-solid); }\n.autonomy[data-shape='stopped'] { border-radius: 1px; border-color: var(--status-danger-solid); background: var(--status-danger-solid); }\n\n.ring { display: block; }\n.ringTrack { fill: none; stroke: var(--meter-track); stroke-width: 2.5; }\n.ringFill { fill: none; stroke: var(--data-seq-5); stroke-width: 2.5; stroke-linecap: round; }\n.ring[data-tone='tight'] .ringFill { stroke: var(--status-warning-solid); }\n.ring[data-tone='critical'] .ringFill { stroke: var(--status-danger-solid); }\n\n@keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.55; }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion='full']) .pulse { animation: none; }\n}\n:root[data-motion='reduce'] .pulse { animation: none; }\n","/**\n * routes/verse/shell/RailStatus.tsx — what the rail says without being\n * opened (unit C1; SPEC-310C §1 \"Rail badges\"):\n *\n * Command the Needs-you count\n * Chat a pulsing amber dot while chats run (the count rides the\n * accessible name); a quiet dot for unread replies\n * Fleet the autonomy state (off / propose / autonomous, paused, stopped)\n * Mind a dot when there is a memo the operator has not opened\n * foot a capacity ring for the scarcest seat — C6's `scarcestSeat`\n * over the shared capacity rows, so the ring and Apps & Accounts\n * can never describe the same seat two ways\n *\n * Every badge is a SHAPE plus words in the accessible name — never colour\n * alone — and an unknown state draws nothing at all: no dot is \"we do not\n * know\", never \"zero\" (the activity route may not be in this build yet).\n */\nimport { useMemo } from 'react';\nimport type {\n VerseActivityResponse,\n VerseAutonomyBadge,\n VerseCapacityBadge,\n} from '../../../../core/verse/workbench-types.js';\nimport { buildCapacityRows, scarcestSeat, type CapacityRow } from '../usage/capacity-strip-model.js';\nimport { useCapacityData } from '../usage/CapacityStrip.js';\nimport type { VerseSectionId } from '../verse-ui-store.js';\nimport styles from './RailStatus.module.css';\nimport { usedPercentText } from '../percent-text.js';\n\nexport interface RailBadge {\n /** Appended to the rail button's accessible name (\", 3 need you\"). */\n spoken: string;\n kind: 'count' | 'pulse' | 'dot' | 'autonomy';\n /** The visible count, for `count`. */\n count?: number;\n tone?: 'running' | 'info' | 'warning' | 'danger' | 'success' | 'neutral';\n autonomy?: VerseAutonomyBadge;\n}\n\nexport function autonomyTone(badge: VerseAutonomyBadge): NonNullable<RailBadge['tone']> {\n if (badge.stopped) return 'danger';\n if (badge.paused) return 'warning';\n if (badge.mode === 'autonomous') return 'success';\n if (badge.mode === 'propose') return 'info';\n return 'neutral';\n}\n\n/** The badge a rail item shows, or null (nothing to say, or not known). */\nexport function railBadgeFor(section: VerseSectionId, data: VerseActivityResponse | null): RailBadge | null {\n if (!data) return null;\n switch (section) {\n case 'command': {\n const n = data.counts.needsYou;\n return n > 0 ? { kind: 'count', count: n, spoken: `, ${n} need${n === 1 ? 's' : ''} you`, tone: 'warning' } : null;\n }\n case 'chat': {\n const running = data.counts.running;\n if (running > 0) return { kind: 'pulse', spoken: `, ${running} running`, tone: 'running' };\n const unread = data.counts.unread;\n return unread > 0 ? { kind: 'dot', spoken: `, ${unread} unread`, tone: 'info' } : null;\n }\n case 'fleet':\n return data.autonomy ? { kind: 'autonomy', spoken: `, ${data.autonomy.label}`, autonomy: data.autonomy, tone: autonomyTone(data.autonomy) } : null;\n case 'mind':\n return data.mind?.unseen ? { kind: 'dot', spoken: ', new memo', tone: 'info' } : null;\n default:\n return null;\n }\n}\n\nexport function RailBadgeMark({ badge }: { badge: RailBadge }) {\n if (badge.kind === 'count') {\n const n = badge.count ?? 0;\n return (\n <span className={styles.count} data-tone={badge.tone} aria-hidden=\"true\" data-badge=\"count\">\n {n > 99 ? '99+' : n}\n </span>\n );\n }\n if (badge.kind === 'autonomy' && badge.autonomy) {\n const a = badge.autonomy;\n const shape = a.stopped ? 'stopped' : a.paused ? 'paused' : a.mode;\n return <span className={styles.autonomy} data-shape={shape} data-tone={badge.tone} aria-hidden=\"true\" data-badge=\"autonomy\" />;\n }\n return <span className={badge.kind === 'pulse' ? styles.pulse : styles.dot} data-tone={badge.tone} aria-hidden=\"true\" data-badge={badge.kind} />;\n}\n\n// ---------------------------------------------------------------------------\n// Capacity ring\n// ---------------------------------------------------------------------------\n\nexport function capacityTone(usedPercent: number): 'ok' | 'tight' | 'critical' {\n if (usedPercent >= 90) return 'critical';\n if (usedPercent >= 70) return 'tight';\n return 'ok';\n}\n\n/**\n * What the rail foot shows for the scarcest seat: one CapacityRow (C6's\n * projection) reduced to a ring and a sentence. Built ONLY from a row that\n * `scarcestSeat` chose, so there is always a measured binding window or a\n * blocked seat behind it — never an invented percent.\n */\nexport interface RailCapacity {\n seatId: string;\n label: string;\n /** \"5-hour window\", \"weekly fable window\"; null when the seat is blocked with no window read. */\n windowLabel: string | null;\n /** 0–100 for the ring. A reached limit or a blocked seat fills it. */\n usedPercent: number;\n limitReached: boolean;\n /** Provider prose or a formatted instant; null when neither. */\n resetText: string | null;\n /** \"blocked\", \"tight\", … — C6's word for the class. */\n word: string;\n}\n\nexport function railCapacityFromRow(row: CapacityRow | null): RailCapacity | null {\n if (!row) return null;\n const binding = row.windows.find((w) => w.binding) ?? null;\n const limitReached = binding?.limitReached === true;\n // Blocked (signed out, out of usage) reads as a full ring whatever the last\n // window said: the engine will refuse a turn on it.\n const used = row.cls === 'blocked' || limitReached ? 100 : binding?.usedPercent ?? null;\n if (used === null) return null;\n return {\n seatId: row.seatId,\n label: row.label,\n windowLabel: binding?.label ?? null,\n usedPercent: Math.max(0, Math.min(100, used)),\n limitReached,\n resetText: binding?.resetText ?? null,\n word: row.word,\n };\n}\n\n/** \"Claude Max: weekly fable window 92% used · resets Sep 25\" — the tooltip and the accessible name. */\nexport function describeRailCapacity(c: RailCapacity): string {\n const reset = c.resetText ? ` · ${c.resetText}` : '';\n if (c.limitReached) return `${c.label}: ${c.windowLabel ?? 'window'} limit reached${reset}`;\n if (c.windowLabel === null) return `${c.label}: ${c.word}`;\n return `${c.label}: ${c.windowLabel} ${usedPercentText(c.usedPercent)} used${reset}`;\n}\n\n/**\n * The rail's scarcest seat, live. Reads the app-wide seat + health caches the\n * capacity strip uses (mounting it costs no extra request when Apps or Usage\n * is also mounted). Budget is NOT read: the reserve does not change which\n * seat is closest to running out, and the rail is on screen on every surface,\n * so it should not keep the 60 s budget poll alive by itself. Local seats are\n * left out — they have no quota to run out of.\n */\nexport function useRailCapacity(): RailCapacity | null {\n const data = useCapacityData({ withBudget: false });\n return useMemo(\n () => railCapacityFromRow(scarcestSeat(buildCapacityRows(data.seats, { health: data.health, local: 'hide' }))),\n [data.seats, data.health],\n );\n}\n\nconst R = 7;\nconst C = 2 * Math.PI * R;\n\nexport function CapacityRing({ badge }: { badge: Pick<VerseCapacityBadge, 'usedPercent'> }) {\n const used = Math.max(0, Math.min(100, badge.usedPercent));\n const tone = capacityTone(used);\n return (\n <svg className={styles.ring} data-tone={tone} viewBox=\"0 0 18 18\" width={18} height={18} aria-hidden=\"true\" focusable=\"false\">\n <circle className={styles.ringTrack} cx=\"9\" cy=\"9\" r={R} />\n <circle\n className={styles.ringFill}\n cx=\"9\"\n cy=\"9\"\n r={R}\n strokeDasharray={`${(used / 100) * C} ${C}`}\n transform=\"rotate(-90 9 9)\"\n />\n </svg>\n );\n}\n"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{t as r}from"./EmptyState-Cwpga8L9.js";import{r as i}from"./ThinkingBlock-CHRZX_fJ.js";import{t as a}from"./useVerseTranscript-BOhcfdp7.js";import{r as o,t as s}from"./stub-panes.module-blrN0yxn.js";var c=e(n(),1),l=t();function u(e){return e===null||!Number.isFinite(e)||e<=0?null:e<1e4?`${(e/1e3).toFixed(1)}s`:`${Math.round(e/1e3)}s`}function d({sessionId:e}){let t=a(e),n=(0,c.useMemo)(()=>o(t.items),[t.items]);return n.length===0?(0,l.jsx)(`div`,{className:s.pane,"aria-label":`Reasoning`,children:(0,l.jsx)(`section`,{className:s.section,children:(0,l.jsx)(r,{compact:!0,title:`No reasoning yet`,body:`When the model thinks before it answers, its reasoning streams here, turn by turn — so you can follow why without scrolling the answer away. Raise the effort in the composer for more of it.`})})}):(0,l.jsx)(`div`,{className:s.pane,"aria-label":`Reasoning`,children:(0,l.jsx)(`section`,{className:s.section,children:n.map(e=>(0,l.jsxs)(`article`,{className:s.turn,"aria-label":e.ask?`Reasoning for: ${e.ask}`:`Reasoning`,children:[e.ask?(0,l.jsx)(`p`,{className:s.ask,title:e.ask,children:e.ask}):null,e.blocks.map(e=>{let t=[u(e.durationMs),e.estimatedTokens===null?null:i(e.estimatedTokens)].filter(Boolean).join(` · `);return(0,l.jsxs)(`p`,{className:s.thought,children:[t?(0,l.jsx)(`span`,{className:s.thoughtMeta,children:t}):null,e.redacted?(0,l.jsx)(`em`,{children:`The model thought here; the provider withheld the text.`}):e.text]},e.key)})]},e.turnId))})})}export{d as ReasoningPane};
2
- //# sourceMappingURL=ReasoningPane-C04_bOAi.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReasoningPane-C04_bOAi.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/panes/builtin/ReasoningPane.tsx"],"sourcesContent":["/**\n * routes/verse/panes/builtin/ReasoningPane.tsx — the first-party Reasoning\n * pane (a registry STUB): the chat's thinking, turn by turn, newest first,\n * beside the answer instead of folded into it. The Reasoning + Sources unit\n * replaces it by registering the id `reasoning` (../README.md).\n */\nimport { useMemo } from 'react';\nimport { EmptyState } from '../../../../components/primitives/EmptyState.js';\nimport { formatThinkingTokens } from '../../chat/ThinkingBlock.js';\nimport { useVerseTranscript } from '../../useVerseTranscript.js';\nimport type { PaneProps } from '../pane-registry.js';\nimport { reasoningByTurn } from './pane-models.js';\nimport styles from './stub-panes.module.css';\n\nfunction seconds(ms: number | null): string | null {\n if (ms === null || !Number.isFinite(ms) || ms <= 0) return null;\n return ms < 10_000 ? `${(ms / 1000).toFixed(1)}s` : `${Math.round(ms / 1000)}s`;\n}\n\nexport function ReasoningPane({ sessionId }: PaneProps) {\n const transcript = useVerseTranscript(sessionId);\n const turns = useMemo(() => reasoningByTurn(transcript.items), [transcript.items]);\n if (turns.length === 0) {\n return (\n <div className={styles.pane} aria-label=\"Reasoning\">\n <section className={styles.section}>\n <EmptyState compact title=\"No reasoning yet\"\n body=\"When the model thinks before it answers, its reasoning streams here, turn by turn — so you can follow why without scrolling the answer away. Raise the effort in the composer for more of it.\" />\n </section>\n </div>\n );\n }\n return (\n <div className={styles.pane} aria-label=\"Reasoning\">\n <section className={styles.section}>\n {turns.map((turn) => (\n <article key={turn.turnId} className={styles.turn} aria-label={turn.ask ? `Reasoning for: ${turn.ask}` : 'Reasoning'}>\n {turn.ask ? <p className={styles.ask} title={turn.ask}>{turn.ask}</p> : null}\n {turn.blocks.map((block) => {\n const meta = [seconds(block.durationMs), block.estimatedTokens !== null ? formatThinkingTokens(block.estimatedTokens) : null]\n .filter(Boolean).join(' · ');\n return (\n <p key={block.key} className={styles.thought}>\n {meta ? <span className={styles.thoughtMeta}>{meta}</span> : null}\n {block.redacted ? <em>The model thought here; the provider withheld the text.</em> : block.text}\n </p>\n );\n })}\n </article>\n ))}\n </section>\n </div>\n );\n}\n"],"mappings":"oUAcA,SAAS,EAAQ,EAAkC,CAEjD,OADI,IAAO,MAAQ,CAAC,OAAO,SAAS,CAAE,GAAK,GAAM,EAAU,KACpD,EAAK,IAAS,IAAI,EAAK,IAAA,CAAM,QAAQ,CAAC,EAAE,GAAK,GAAG,KAAK,MAAM,EAAK,GAAI,EAAE,EAC/E,CAEA,SAAgB,EAAc,CAAE,aAAwB,CACtD,IAAM,EAAa,EAAmB,CAAS,EACzC,GAAA,EAAQ,EAAA,QAAA,KAAc,EAAgB,EAAW,KAAK,EAAG,CAAC,EAAW,KAAK,CAAC,EAWjF,OAVI,EAAM,SAAW,GAEjB,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,aAAW,YACtC,UAAA,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW,EAAO,QACzB,UAAA,EAAA,EAAA,IAAA,CAAC,EAAD,CAAY,QAAA,GAAQ,MAAM,mBACxB,KAAK,+LAAiM,CAAA,CACjM,CAAA,CACN,CAAA,GAIP,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,UAAW,EAAO,KAAM,aAAW,YACtC,UAAA,EAAA,EAAA,IAAA,CAAC,UAAD,CAAS,UAAW,EAAO,QACxB,SAAA,EAAM,IAAK,IACV,EAAA,EAAA,KAAA,CAAC,UAAD,CAA2B,UAAW,EAAO,KAAM,aAAY,EAAK,IAAM,kBAAkB,EAAK,MAAQ,YAAzG,SAAA,CACG,EAAK,KAAM,EAAA,EAAA,IAAA,CAAC,IAAD,CAAG,UAAW,EAAO,IAAK,MAAO,EAAK,IAAM,SAAA,EAAK,GAAO,CAAA,EAAI,KACvE,EAAK,OAAO,IAAK,GAAU,CAC1B,IAAM,EAAO,CAAC,EAAQ,EAAM,UAAU,EAAG,EAAM,kBAAoB,KAAqD,KAA9C,EAAqB,EAAM,eAAe,CAAQ,CAAC,CAC1H,OAAO,OAAO,CAAC,CAAC,KAAK,KAAK,EAC7B,OACE,EAAA,EAAA,KAAA,CAAC,IAAD,CAAmB,UAAW,EAAO,QAArC,SAAA,CACG,GAAO,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,YAAc,SAAA,CAAW,CAAA,EAAI,KAC5D,EAAM,UAAW,EAAA,EAAA,IAAA,CAAC,KAAD,CAAA,SAAI,yDAA2D,CAAA,EAAI,EAAM,IAC1F,CAHK,EAAA,EAAM,GAGX,CAEP,CAAC,CACM,CAZK,EAAA,EAAK,MAYV,CACV,CACM,CAAA,CACN,CAAA,CAET"}
@@ -1,2 +0,0 @@
1
- import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-DOAOxiKl.js";import{n as r,r as i,t as a}from"./SourcesPanel-DFyLfYBO.js";var o=e(n(),1),s=t(),c=[{id:`sources`,label:`Sources`},{id:`reasoning`,label:`Reasoning`}];function l({tab:e,onTab:t,onClose:n,turns:l,engine:u=null,session:d=null,openFile:f,jumpToTool:p,jumpToTurn:m}){let h=(0,o.useRef)(null);return(0,o.useEffect)(()=>{let e=document.activeElement instanceof HTMLElement?document.activeElement:null;return h.current?.querySelector(`[role="tab"][aria-selected="true"]`)?.focus(),()=>{e?.focus?.()}},[]),(0,o.useEffect)(()=>{let e=e=>{e.key===`Escape`&&!e.defaultPrevented&&(e.preventDefault(),n())};return document.addEventListener(`keydown`,e),()=>document.removeEventListener(`keydown`,e)},[n]),(0,s.jsxs)(`aside`,{ref:h,className:i.sheet,"aria-label":`Reasoning and sources for this chat`,children:[(0,s.jsxs)(`header`,{className:i.sheetHead,children:[(0,s.jsx)(`div`,{role:`tablist`,"aria-label":`Show`,className:i.tabs,children:c.map(n=>(0,s.jsx)(`button`,{type:`button`,role:`tab`,id:`verse-rs-tab-${n.id}`,"aria-selected":e===n.id,"aria-controls":`verse-rs-panel-${n.id}`,tabIndex:e===n.id?0:-1,className:i.tab,onClick:()=>t(n.id),onKeyDown:n=>{if(n.key===`ArrowRight`||n.key===`ArrowLeft`){n.preventDefault();let r=c[(c.findIndex(t=>t.id===e)+(n.key===`ArrowRight`?1:c.length-1))%c.length];t(r.id),requestAnimationFrame(()=>document.getElementById(`verse-rs-tab-${r.id}`)?.focus())}},children:n.label},n.id))}),(0,s.jsx)(`button`,{type:`button`,className:i.close,onClick:n,"aria-label":`Close reasoning and sources`,children:`Close`})]}),(0,s.jsx)(`div`,{id:`verse-rs-panel-${e}`,role:`tabpanel`,"aria-labelledby":`verse-rs-tab-${e}`,className:i.sheetBody,children:e===`sources`?(0,s.jsx)(a,{turns:l,session:d,openFile:f,jumpToTool:p,jumpToTurn:m}):(0,s.jsx)(r,{turns:l,engine:u,jumpToTurn:m})})]})}export{l as ReasoningSheet};
2
- //# sourceMappingURL=ReasoningSheet-BvNFwtuX.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ReasoningSheet-BvNFwtuX.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/reasoning/ReasoningSheet.tsx"],"sourcesContent":["/**\n * routes/verse/reasoning/ReasoningSheet.tsx — the Sources and Reasoning\n * panels, hosted by the transcript itself when there is no dock to open them\n * in (V3.15).\n *\n * In the chat, the transcript's Reasoning / Sources toggles open the dock\n * panes (reasoning.pane.tsx registers them for ⇧⌘Y / ⇧⌘S). A transcript\n * rendered where no dock handles those commands falls back to this sheet: a\n * panel over the right edge of the conversation, two tabs, Escape to close,\n * focus returned to the button that opened it. Lazy — nothing here loads\n * until it opens.\n */\nimport { useEffect, useRef } from 'react';\nimport type { VerseSession } from '../../../../core/verse/types.js';\nimport type { SourceActions } from '../chat/SourceList.js';\nimport type { TurnBlock } from '../chat/turn-model.js';\nimport { ReasoningPanel } from './ReasoningPanel.js';\nimport { SourcesPanel } from './SourcesPanel.js';\nimport styles from './reasoning.module.css';\n\nexport type ReasoningSheetTab = 'sources' | 'reasoning';\n\nexport interface ReasoningSheetProps extends SourceActions {\n tab: ReasoningSheetTab;\n onTab: (tab: ReasoningSheetTab) => void;\n onClose: () => void;\n turns: readonly TurnBlock[];\n engine?: string | null;\n session?: Pick<VerseSession, 'memoryEnabled' | 'projectPath'> | null;\n jumpToTurn: (turnKey: string) => void;\n}\n\nconst TABS: ReadonlyArray<{ id: ReasoningSheetTab; label: string }> = [\n { id: 'sources', label: 'Sources' },\n { id: 'reasoning', label: 'Reasoning' },\n];\n\nexport function ReasoningSheet({ tab, onTab, onClose, turns, engine = null, session = null, openFile, jumpToTool, jumpToTurn }: ReasoningSheetProps) {\n const root = useRef<HTMLElement>(null);\n\n useEffect(() => {\n const opener = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n root.current?.querySelector<HTMLElement>('[role=\"tab\"][aria-selected=\"true\"]')?.focus();\n // Mount/unmount only: the opener is whoever had focus when the sheet opened.\n return () => { opener?.focus?.(); };\n }, []);\n\n useEffect(() => {\n const onKey = (event: KeyboardEvent) => {\n if (event.key === 'Escape' && !event.defaultPrevented) {\n event.preventDefault();\n onClose();\n }\n };\n document.addEventListener('keydown', onKey);\n return () => document.removeEventListener('keydown', onKey);\n }, [onClose]);\n\n return (\n <aside ref={root} className={styles.sheet} aria-label=\"Reasoning and sources for this chat\">\n <header className={styles.sheetHead}>\n <div role=\"tablist\" aria-label=\"Show\" className={styles.tabs}>\n {TABS.map((t) => (\n <button key={t.id} type=\"button\" role=\"tab\" id={`verse-rs-tab-${t.id}`} aria-selected={tab === t.id}\n aria-controls={`verse-rs-panel-${t.id}`} tabIndex={tab === t.id ? 0 : -1} className={styles.tab}\n onClick={() => onTab(t.id)}\n onKeyDown={(e) => {\n if (e.key === 'ArrowRight' || e.key === 'ArrowLeft') {\n e.preventDefault();\n const next = TABS[(TABS.findIndex((x) => x.id === tab) + (e.key === 'ArrowRight' ? 1 : TABS.length - 1)) % TABS.length]!;\n onTab(next.id);\n requestAnimationFrame(() => document.getElementById(`verse-rs-tab-${next.id}`)?.focus());\n }\n }}>\n {t.label}\n </button>\n ))}\n </div>\n <button type=\"button\" className={styles.close} onClick={onClose} aria-label=\"Close reasoning and sources\">Close</button>\n </header>\n <div id={`verse-rs-panel-${tab}`} role=\"tabpanel\" aria-labelledby={`verse-rs-tab-${tab}`} className={styles.sheetBody}>\n {tab === 'sources'\n ? <SourcesPanel turns={turns} session={session} openFile={openFile} jumpToTool={jumpToTool} jumpToTurn={jumpToTurn} />\n : <ReasoningPanel turns={turns} engine={engine} jumpToTurn={jumpToTurn} />}\n </div>\n </aside>\n );\n}\n"],"mappings":"oLAgCM,EAAgE,CACpE,CAAE,GAAI,UAAW,MAAO,SAAU,EAClC,CAAE,GAAI,YAAa,MAAO,WAAY,CACxC,EAEA,SAAgB,EAAe,CAAE,MAAK,QAAO,UAAS,QAAO,SAAS,KAAM,UAAU,KAAM,WAAU,aAAY,cAAmC,CACnJ,IAAM,GAAA,EAAO,EAAA,OAAA,CAAoB,IAAI,EAoBrC,OAlBA,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAS,SAAS,yBAAyB,YAAc,SAAS,cAAgB,KAGxF,OAFA,EAAK,SAAS,cAA2B,oCAAoC,CAAC,EAAE,MAAM,MAEzE,CAAE,GAAQ,QAAQ,CAAG,CACpC,EAAG,CAAC,CAAC,GAEL,EAAA,EAAA,UAAA,KAAgB,CACd,IAAM,EAAS,GAAyB,CAClC,EAAM,MAAQ,UAAY,CAAC,EAAM,mBACnC,EAAM,eAAe,EACrB,EAAQ,EAEZ,EAEA,OADA,SAAS,iBAAiB,UAAW,CAAK,MAC7B,SAAS,oBAAoB,UAAW,CAAK,CAC5D,EAAG,CAAC,CAAO,CAAC,GAGV,EAAA,EAAA,KAAA,CAAC,QAAD,CAAO,IAAK,EAAM,UAAW,EAAO,MAAO,aAAW,sCAAtD,SAAA,EACE,EAAA,EAAA,KAAA,CAAC,SAAD,CAAQ,UAAW,EAAO,UAA1B,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,KAAK,UAAU,aAAW,OAAO,UAAW,EAAO,KACrD,SAAA,EAAK,IAAK,IACT,EAAA,EAAA,IAAA,CAAC,SAAD,CAAmB,KAAK,SAAS,KAAK,MAAM,GAAI,gBAAgB,EAAE,KAAM,gBAAe,IAAQ,EAAE,GAC/F,gBAAe,kBAAkB,EAAE,KAAM,SAAU,IAAQ,EAAE,GAAK,EAAI,GAAI,UAAW,EAAO,IAC5F,YAAe,EAAM,EAAE,EAAE,EACzB,UAAY,GAAM,CAChB,GAAI,EAAE,MAAQ,cAAgB,EAAE,MAAQ,YAAa,CACnD,EAAE,eAAe,EACjB,IAAM,EAAO,GAAM,EAAK,UAAW,GAAM,EAAE,KAAO,CAAG,GAAK,EAAE,MAAQ,aAAe,EAAI,EAAK,OAAS,IAAM,EAAK,QAChH,EAAM,EAAK,EAAE,EACb,0BAA4B,SAAS,eAAe,gBAAgB,EAAK,IAAI,CAAC,EAAE,MAAM,CAAC,CACzF,CACF,EACC,SAAA,EAAE,KACG,EAZK,EAAE,EAYP,CACT,CACE,CAAA,GACL,EAAA,EAAA,IAAA,CAAC,SAAD,CAAQ,KAAK,SAAS,UAAW,EAAO,MAAO,QAAS,EAAS,aAAW,8BAA8B,SAAA,OAAa,CAAA,CACjH,CACR,CAAA,GAAA,EAAA,EAAA,IAAA,CAAC,MAAD,CAAK,GAAI,kBAAkB,IAAO,KAAK,WAAW,kBAAiB,gBAAgB,IAAO,UAAW,EAAO,UACzG,SAAA,IAAQ,WACL,EAAA,EAAA,IAAA,CAAC,EAAD,CAAqB,QAAgB,UAAmB,WAAsB,aAAwB,YAAa,CAAA,GACnH,EAAA,EAAA,IAAA,CAAC,EAAD,CAAuB,QAAe,SAAoB,YAAa,CAAA,CACxE,CAAA,CACA,GAEX"}
@@ -1,2 +0,0 @@
1
- import{n as e}from"./index-DOAOxiKl.js";var t={root:`_root_1lgxn_1`,spinner:`_spinner_1lgxn_9`,spin:`_spin_1lgxn_9`},n=e();function r({label:e=`Refreshing`}){return(0,n.jsxs)(`span`,{className:t.root,role:`status`,"aria-live":`polite`,children:[(0,n.jsx)(`span`,{className:t.spinner,"aria-hidden":`true`}),(0,n.jsx)(`span`,{className:`visually-hidden`,children:e})]})}export{r as t};
2
- //# sourceMappingURL=RefreshIndicator-BNptNJiV.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RefreshIndicator-BNptNJiV.js","names":[],"sources":["../../../../../../src/web-ui/components/primitives/RefreshIndicator.module.css","../../../../../../src/web-ui/components/primitives/RefreshIndicator.tsx"],"sourcesContent":[".root {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n}\n\n.spinner {\n width: 12px;\n height: 12px;\n border-radius: var(--radius-full);\n border: 2px solid var(--border-strong);\n border-top-color: var(--accent-500);\n animation: spin 0.7s linear infinite;\n}\n\n@keyframes spin {\n to {\n transform: rotate(360deg);\n }\n}\n\n@media (prefers-reduced-motion: reduce) {\n :root:not([data-motion=\"full\"]) .spinner {\n animation: none;\n border-top-color: var(--border-strong);\n }\n}\n\n:root[data-motion=\"reduce\"] .spinner {\n animation: none;\n border-top-color: var(--border-strong);\n}\n","/**\n * components/primitives/RefreshIndicator.tsx — the \"stale data, quietly\n * refreshing\" signal (foundation brief item 4: never blank the screen on\n * refresh). Pair with a QueryEntry's `status`:\n *\n * loading -> render a Skeleton instead of the view\n * refreshing -> render the view with data, plus <RefreshIndicator />\n * success -> render the view with data, no indicator\n * error -> render the view's error state\n */\nimport styles from './RefreshIndicator.module.css';\n\nexport function RefreshIndicator({ label = 'Refreshing' }: { label?: string }) {\n return (\n <span className={styles.root} role=\"status\" aria-live=\"polite\">\n <span className={styles.spinner} aria-hidden=\"true\" />\n <span className=\"visually-hidden\">{label}</span>\n </span>\n );\n}\n"],"mappings":"2HCYA,SAAgB,EAAiB,CAAE,QAAQ,cAAoC,CAC7E,OACE,EAAA,EAAA,KAAA,CAAC,OAAD,CAAM,UAAW,EAAO,KAAM,KAAK,SAAS,YAAU,SAAtD,SAAA,EACE,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAW,EAAO,QAAS,cAAY,MAAQ,CAAA,GACrD,EAAA,EAAA,IAAA,CAAC,OAAD,CAAM,UAAU,kBAAmB,SAAA,CAAY,CAAA,CAC3C,GAEV"}