@ashlr/hub 3.22.0 → 3.22.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (929) hide show
  1. package/CHANGELOG.md +27 -0
  2. package/README.md +5 -5
  3. package/dist/authority-surface.json +16 -11
  4. package/dist/build-identity.json +2 -2
  5. package/dist/cli/verify-safety-sources.d.ts +4 -0
  6. package/dist/cli/verify-safety-sources.js +41 -0
  7. package/dist/cli/verify-safety-sources.js.map +1 -0
  8. package/dist/cli/verify-safety.js +16 -1
  9. package/dist/cli/verify-safety.js.map +1 -1
  10. package/dist/core/decide/needs-you.d.ts +3 -1
  11. package/dist/core/decide/needs-you.js +52 -28
  12. package/dist/core/decide/needs-you.js.map +1 -1
  13. package/dist/core/fleet/fleet-control-model.d.ts +2 -1
  14. package/dist/core/fleet/fleet-control-model.js +5 -0
  15. package/dist/core/fleet/fleet-control-model.js.map +1 -1
  16. package/dist/core/fleet/fleet-control-types.d.ts +11 -1
  17. package/dist/core/fleet/fleet-control.d.ts +4 -0
  18. package/dist/core/fleet/fleet-control.js +23 -1
  19. package/dist/core/fleet/fleet-control.js.map +1 -1
  20. package/dist/core/fleet/quota.js +1 -1
  21. package/dist/core/fleet/quota.js.map +1 -1
  22. package/dist/core/universe/builtins/preparation/manifest.json +1 -1
  23. package/dist/core/universe/builtins/preparation/preparation-bridge.mjs +4 -2
  24. package/dist/core/universe/builtins/preparation/preparation-verification-fixtures.mjs +3 -1
  25. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js +2 -0
  26. package/dist/core/web/public/next/assets/ActionMenu-Z14OhnFI.js.map +1 -0
  27. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js +2 -0
  28. package/dist/core/web/public/next/assets/Advanced-fUyq-fpH.js.map +1 -0
  29. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js +2 -0
  30. package/dist/core/web/public/next/assets/AgentDetailScreen-C8h--Nah.js.map +1 -0
  31. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js +2 -0
  32. package/dist/core/web/public/next/assets/AgentToolsSheet-BP3h-UbZ.js.map +1 -0
  33. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js +2 -0
  34. package/dist/core/web/public/next/assets/AgentToolsStrip--hf18knJ.js.map +1 -0
  35. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js +2 -0
  36. package/dist/core/web/public/next/assets/AgentsScreen-BR-j0Fzd.js.map +1 -0
  37. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js +3 -0
  38. package/dist/core/web/public/next/assets/AgentsSection-OKKOuYed.js.map +1 -0
  39. package/dist/core/web/public/next/assets/App-ttVrZYp5.js +8 -0
  40. package/dist/core/web/public/next/assets/App-ttVrZYp5.js.map +1 -0
  41. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js +2 -0
  42. package/dist/core/web/public/next/assets/AppsSection-sqsXqENO.js.map +1 -0
  43. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js +2 -0
  44. package/dist/core/web/public/next/assets/AreaTrend-LVgaB49b.js.map +1 -0
  45. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js +2 -0
  46. package/dist/core/web/public/next/assets/AutomationsSection-BITmxjuB.js.map +1 -0
  47. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js +3 -0
  48. package/dist/core/web/public/next/assets/AutonomyOffState-nO9lIcCv.js.map +1 -0
  49. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js +2 -0
  50. package/dist/core/web/public/next/assets/AutonomySection-DWYUPDP6.js.map +1 -0
  51. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js +2 -0
  52. package/dist/core/web/public/next/assets/AutonomyStatus-C4Yp1JTY.js.map +1 -0
  53. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js +2 -0
  54. package/dist/core/web/public/next/assets/BranchBar-CkiZSNqB.js.map +1 -0
  55. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js +7 -0
  56. package/dist/core/web/public/next/assets/BrowserPanel-CECVGJBS.js.map +1 -0
  57. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js +2 -0
  58. package/dist/core/web/public/next/assets/BudgetControl-De1TPzvX.js.map +1 -0
  59. package/dist/core/web/public/next/assets/Button-CstSJwha.js +2 -0
  60. package/dist/core/web/public/next/assets/Button-CstSJwha.js.map +1 -0
  61. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js +2 -0
  62. package/dist/core/web/public/next/assets/CapacityStrip-nIJcB_lA.js.map +1 -0
  63. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js +16 -0
  64. package/dist/core/web/public/next/assets/ChangesPaneHost-Bnj_NcRa.js.map +1 -0
  65. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js +2 -0
  66. package/dist/core/web/public/next/assets/ChartFrame-Dljee9y6.js.map +1 -0
  67. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js +2 -0
  68. package/dist/core/web/public/next/assets/ChatPanes-x_ySUIyR.js.map +1 -0
  69. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js +3 -0
  70. package/dist/core/web/public/next/assets/ChatSection-CXJa8QOi.js.map +1 -0
  71. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js +5 -0
  72. package/dist/core/web/public/next/assets/ChecksPanel-D9r8koxq.js.map +1 -0
  73. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js +2 -0
  74. package/dist/core/web/public/next/assets/CloudBudgetForm-D5ajpoMe.js.map +1 -0
  75. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js +3 -0
  76. package/dist/core/web/public/next/assets/CommandPalette-ONyqYZzt.js.map +1 -0
  77. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js +3 -0
  78. package/dist/core/web/public/next/assets/CommandSection-DxNIibnI.js.map +1 -0
  79. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js +9 -0
  80. package/dist/core/web/public/next/assets/CommandWorkflowForm-Bz3PuZXH.js.map +1 -0
  81. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js +3 -0
  82. package/dist/core/web/public/next/assets/CommandWorkflowPicker-COVyeer0.js.map +1 -0
  83. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js +4 -0
  84. package/dist/core/web/public/next/assets/CompareDialog-PVqv0Tx9.js.map +1 -0
  85. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js +2 -0
  86. package/dist/core/web/public/next/assets/ComputerControl-DkSIUrYm.js.map +1 -0
  87. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js +2 -0
  88. package/dist/core/web/public/next/assets/ConfirmDialog-CdCzzk0I.js.map +1 -0
  89. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js +2 -0
  90. package/dist/core/web/public/next/assets/DeleteChatDialog-BTzOgqho.js.map +1 -0
  91. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js +2 -0
  92. package/dist/core/web/public/next/assets/DevinStopDialog-CGsDqfan.js.map +1 -0
  93. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js +2 -0
  94. package/dist/core/web/public/next/assets/Dialog-DDHg9cuT.js.map +1 -0
  95. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js +2 -0
  96. package/dist/core/web/public/next/assets/DiffPane-BR3HU7pC.js.map +1 -0
  97. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js +2 -0
  98. package/dist/core/web/public/next/assets/DiffViewer-hJK75qko.js.map +1 -0
  99. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js +2 -0
  100. package/dist/core/web/public/next/assets/DockHost-DhOosHbo.js.map +1 -0
  101. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js +2 -0
  102. package/dist/core/web/public/next/assets/EmptyState-CGVr0VO2.js.map +1 -0
  103. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js +2 -0
  104. package/dist/core/web/public/next/assets/Epistemic-tp0ZNAKZ.js.map +1 -0
  105. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js +2 -0
  106. package/dist/core/web/public/next/assets/EvidenceTimeline-YmKIoxNx.js.map +1 -0
  107. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js +2 -0
  108. package/dist/core/web/public/next/assets/FilesPane-CoNjfkPP.js.map +1 -0
  109. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js +2 -0
  110. package/dist/core/web/public/next/assets/FleetScreen-CstwycnB.js.map +1 -0
  111. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js +5 -0
  112. package/dist/core/web/public/next/assets/FleetSection-D0xk0s5J.js.map +1 -0
  113. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js +2 -0
  114. package/dist/core/web/public/next/assets/Funnel-UPrk7fcy.js.map +1 -0
  115. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js +2 -0
  116. package/dist/core/web/public/next/assets/GearTray-BSjga1J_.js.map +1 -0
  117. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js +2 -0
  118. package/dist/core/web/public/next/assets/GitDialogs-ekwzxl76.js.map +1 -0
  119. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js +3 -0
  120. package/dist/core/web/public/next/assets/GrowthSection-Dh-gnkgc.js.map +1 -0
  121. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js +2 -0
  122. package/dist/core/web/public/next/assets/HandoffDialog-BDiyA3u-.js.map +1 -0
  123. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js +3 -0
  124. package/dist/core/web/public/next/assets/HomeBody-Ce3HBIEb.js.map +1 -0
  125. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js +2 -0
  126. package/dist/core/web/public/next/assets/HomeSeats-BFLCWCFp.js.map +1 -0
  127. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js +2 -0
  128. package/dist/core/web/public/next/assets/Input-Cpn9uYj2.js.map +1 -0
  129. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js +9 -0
  130. package/dist/core/web/public/next/assets/LaunchDialog-CrPEf652.js.map +1 -0
  131. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js +2 -0
  132. package/dist/core/web/public/next/assets/LeaderCard-Dhq-w_Mf.js.map +1 -0
  133. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js +3 -0
  134. package/dist/core/web/public/next/assets/LeaderConversation-CiWqhsoa.js.map +1 -0
  135. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js +2 -0
  136. package/dist/core/web/public/next/assets/LeaderScreen-Z5KPjxBV.js.map +1 -0
  137. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js +2 -0
  138. package/dist/core/web/public/next/assets/LessonsPanel-B6XVKAPE.js.map +1 -0
  139. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js +2 -0
  140. package/dist/core/web/public/next/assets/LiveTimer-B8t2iX5h.js.map +1 -0
  141. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js +2 -0
  142. package/dist/core/web/public/next/assets/LocalSeatBadge-HMxIrMiL.js.map +1 -0
  143. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js +2 -0
  144. package/dist/core/web/public/next/assets/MatrixHeatmap-BlFI5oao.js.map +1 -0
  145. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js +2 -0
  146. package/dist/core/web/public/next/assets/McpSection-snZNKexW.js.map +1 -0
  147. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js +3 -0
  148. package/dist/core/web/public/next/assets/MessageMarkdown-CS0mAtSs.js.map +1 -0
  149. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js +72 -0
  150. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-D5R-zr-W.js.map +1 -0
  151. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js +2 -0
  152. package/dist/core/web/public/next/assets/Meter-VXI75VNe.js.map +1 -0
  153. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js +2 -0
  154. package/dist/core/web/public/next/assets/MicButton-DORAXsUU.js.map +1 -0
  155. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js +3 -0
  156. package/dist/core/web/public/next/assets/MindSection-DZLHz29Q.js.map +1 -0
  157. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js +2 -0
  158. package/dist/core/web/public/next/assets/MobileComposer-B8nWsIJO.js.map +1 -0
  159. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js +2 -0
  160. package/dist/core/web/public/next/assets/MobileGuardSheet-BRwOfD9o.js.map +1 -0
  161. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js +3 -0
  162. package/dist/core/web/public/next/assets/MobileRuntime-kMob_MjB.js.map +1 -0
  163. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js +2 -0
  164. package/dist/core/web/public/next/assets/MoreScreen-92dC6Bj7.js.map +1 -0
  165. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js +7 -0
  166. package/dist/core/web/public/next/assets/MultiModelBar-BhAUUQOq.js.map +1 -0
  167. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js +2 -0
  168. package/dist/core/web/public/next/assets/MutationTokenDialog-DlY2VLVh.js.map +1 -0
  169. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js +3 -0
  170. package/dist/core/web/public/next/assets/NeedsYouDrawer-BH0ffbht.js.map +1 -0
  171. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js +2 -0
  172. package/dist/core/web/public/next/assets/NeedsYouList-CI_Dy-hi.js.map +1 -0
  173. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js +2 -0
  174. package/dist/core/web/public/next/assets/NeedsYouScreen-CvDiEphJ.js.map +1 -0
  175. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js +2 -0
  176. package/dist/core/web/public/next/assets/NewAgentScreen-BpTRKp9z.js.map +1 -0
  177. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js +4 -0
  178. package/dist/core/web/public/next/assets/NewChatDialog-O1LwwBc4.js.map +1 -0
  179. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js +3 -0
  180. package/dist/core/web/public/next/assets/OnboardingFlow-uMNBVHvK.js.map +1 -0
  181. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js +3 -0
  182. package/dist/core/web/public/next/assets/OnboardingGate-sdzxSPZF.js.map +1 -0
  183. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js +9 -0
  184. package/dist/core/web/public/next/assets/PlaybooksSection-CnWfwZv8.js.map +1 -0
  185. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js +2 -0
  186. package/dist/core/web/public/next/assets/PreviewPane-D1WaefIG.js.map +1 -0
  187. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js +2 -0
  188. package/dist/core/web/public/next/assets/ProviderLogo-g2YWCmNY.js.map +1 -0
  189. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js +2 -0
  190. package/dist/core/web/public/next/assets/RailStatus-OrvAuyzs.js.map +1 -0
  191. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js +2 -0
  192. package/dist/core/web/public/next/assets/ReasoningPane-BARDPl4-.js.map +1 -0
  193. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js +2 -0
  194. package/dist/core/web/public/next/assets/ReasoningSheet-rPTXyt-b.js.map +1 -0
  195. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js +2 -0
  196. package/dist/core/web/public/next/assets/RefreshIndicator-D96C9qiH.js.map +1 -0
  197. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js +2 -0
  198. package/dist/core/web/public/next/assets/RemoteMobileApp-DfDjiBTR.js.map +1 -0
  199. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js +7 -0
  200. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-CcfULh_p.js.map +1 -0
  201. package/dist/core/web/public/next/assets/ResourcesChrome-DuEa7WOo.css +1 -0
  202. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js +3 -0
  203. package/dist/core/web/public/next/assets/ResourcesChrome-e9ifgnWf.js.map +1 -0
  204. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js +3 -0
  205. package/dist/core/web/public/next/assets/ResourcesDrawer-DOv_mxpe.js.map +1 -0
  206. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js +2 -0
  207. package/dist/core/web/public/next/assets/ReviewMenu-Ba3saQlX.js.map +1 -0
  208. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js +2 -0
  209. package/dist/core/web/public/next/assets/RouteErrorBoundary-BaJ1ZePy.js.map +1 -0
  210. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js +2 -0
  211. package/dist/core/web/public/next/assets/RunInCloudAction-DRSX84Jy.js.map +1 -0
  212. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js +2 -0
  213. package/dist/core/web/public/next/assets/RunInDevinAction-BMji-YN2.js.map +1 -0
  214. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js +2 -0
  215. package/dist/core/web/public/next/assets/SchedulingEvidence-xxjV6HF_.js.map +1 -0
  216. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js +3 -0
  217. package/dist/core/web/public/next/assets/ScreenHost-Dv6z76Ta.js.map +1 -0
  218. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js +3 -0
  219. package/dist/core/web/public/next/assets/SeatSelector-YRNdNpP8.js.map +1 -0
  220. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js +2 -0
  221. package/dist/core/web/public/next/assets/Segmented-BA8RmKYq.js.map +1 -0
  222. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js +2 -0
  223. package/dist/core/web/public/next/assets/Select-B8GqZOX9.js.map +1 -0
  224. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js +2 -0
  225. package/dist/core/web/public/next/assets/SessionGate-CnASHl7g.js.map +1 -0
  226. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js +2 -0
  227. package/dist/core/web/public/next/assets/SessionInsightChip-DIKfih6i.js.map +1 -0
  228. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js +2 -0
  229. package/dist/core/web/public/next/assets/SessionSearch-K6lvMlji.js.map +1 -0
  230. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js +2 -0
  231. package/dist/core/web/public/next/assets/SettingsSection-C-c3f_6J.js.map +1 -0
  232. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js +2 -0
  233. package/dist/core/web/public/next/assets/SetupChecklist-DAbAdrX4.js.map +1 -0
  234. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js +3 -0
  235. package/dist/core/web/public/next/assets/ShadowDecisions-C41uRSw4.js.map +1 -0
  236. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js +2 -0
  237. package/dist/core/web/public/next/assets/Sheet-Bk64-Hlt.js.map +1 -0
  238. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js +2 -0
  239. package/dist/core/web/public/next/assets/ShortcutsOverlay-CcP96zqy.js.map +1 -0
  240. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js +3 -0
  241. package/dist/core/web/public/next/assets/Sidebar-sSNKd57n.js.map +1 -0
  242. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js +2 -0
  243. package/dist/core/web/public/next/assets/SkipToContent-BynsXs9i.js.map +1 -0
  244. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js +2 -0
  245. package/dist/core/web/public/next/assets/Slider-DS5HrVzl.js.map +1 -0
  246. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js +2 -0
  247. package/dist/core/web/public/next/assets/SourcesPane-QffcyDfA.js.map +1 -0
  248. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js +2 -0
  249. package/dist/core/web/public/next/assets/SourcesPanel-DlttePk7.js.map +1 -0
  250. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js +2 -0
  251. package/dist/core/web/public/next/assets/StatTile-mYm1GPj7.js.map +1 -0
  252. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js +2 -0
  253. package/dist/core/web/public/next/assets/StatusBadge-Yz7S3kZ2.js.map +1 -0
  254. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js +2 -0
  255. package/dist/core/web/public/next/assets/StepBand-Bdkv7iGd.js.map +1 -0
  256. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js +2 -0
  257. package/dist/core/web/public/next/assets/Surface-DVOAKl2g.js.map +1 -0
  258. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js +2 -0
  259. package/dist/core/web/public/next/assets/Swimlane-CeMBD_FC.js.map +1 -0
  260. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js +2 -0
  261. package/dist/core/web/public/next/assets/Switch-Cqc_bSoh.js.map +1 -0
  262. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js +2 -0
  263. package/dist/core/web/public/next/assets/Tag-BvOxSxYi.js.map +1 -0
  264. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js +3 -0
  265. package/dist/core/web/public/next/assets/TerminalPane-D3f02aI4.js.map +1 -0
  266. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js +26 -0
  267. package/dist/core/web/public/next/assets/TerminalPane-XZ5n3Pns.js.map +1 -0
  268. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js +2 -0
  269. package/dist/core/web/public/next/assets/ThinkingBlock-DZNlOGaV.js.map +1 -0
  270. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js +2 -0
  271. package/dist/core/web/public/next/assets/UniverseConsoleApp-CzBI6Upl.js.map +1 -0
  272. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js +9 -0
  273. package/dist/core/web/public/next/assets/UniverseView-Dsi3Kk8o.js.map +1 -0
  274. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js +3 -0
  275. package/dist/core/web/public/next/assets/UsageSection-rVvLat9z.js.map +1 -0
  276. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js +2 -0
  277. package/dist/core/web/public/next/assets/UsePlaybookAction-B4XAzSeI.js.map +1 -0
  278. package/dist/core/web/public/next/assets/VerseConsoleApp-BmckthwC.css +1 -0
  279. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js +3 -0
  280. package/dist/core/web/public/next/assets/VerseConsoleApp-DjPpZLo1.js.map +1 -0
  281. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js +3 -0
  282. package/dist/core/web/public/next/assets/VerseMobileApp-ePNuVERe.js.map +1 -0
  283. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js +2 -0
  284. package/dist/core/web/public/next/assets/VerseShared-Bf-XTHCh.js.map +1 -0
  285. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js +2 -0
  286. package/dist/core/web/public/next/assets/VoiceHud-BG5FV2h0.js.map +1 -0
  287. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js +2 -0
  288. package/dist/core/web/public/next/assets/VoiceInput-k3vB_FxV.js.map +1 -0
  289. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js +2 -0
  290. package/dist/core/web/public/next/assets/WikiSection-DeBKNqd6.js.map +1 -0
  291. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js +6 -0
  292. package/dist/core/web/public/next/assets/Workspace-CvwS2-RN.js.map +1 -0
  293. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js +2 -0
  294. package/dist/core/web/public/next/assets/actions-Dg6UJTLn.js.map +1 -0
  295. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js +2 -0
  296. package/dist/core/web/public/next/assets/agent-tools-client-DmJq7zlr.js.map +1 -0
  297. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js +2 -0
  298. package/dist/core/web/public/next/assets/agents-focus-B1LKhUVg.js.map +1 -0
  299. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js +2 -0
  300. package/dist/core/web/public/next/assets/app-version-Cb1z8iCO.js.map +1 -0
  301. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js +2 -0
  302. package/dist/core/web/public/next/assets/apps-model-_chbcQeN.js.map +1 -0
  303. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js +2 -0
  304. package/dist/core/web/public/next/assets/ask-seat-O60AydbV.js.map +1 -0
  305. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js +2 -0
  306. package/dist/core/web/public/next/assets/authority-model-BeDDHF22.js.map +1 -0
  307. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js +2 -0
  308. package/dist/core/web/public/next/assets/automations-focus-BXaRZ8nX.js.map +1 -0
  309. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js +2 -0
  310. package/dist/core/web/public/next/assets/budget-queries-Nvx0H2XE.js.map +1 -0
  311. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js +2 -0
  312. package/dist/core/web/public/next/assets/capacity-strip-model-CBMJ2U-w.js.map +1 -0
  313. package/dist/core/web/public/next/assets/charts-DT9PYS49.js +2 -0
  314. package/dist/core/web/public/next/assets/charts-DT9PYS49.js.map +1 -0
  315. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js +2 -0
  316. package/dist/core/web/public/next/assets/chat-pane-data-CfbpeAYX.js.map +1 -0
  317. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js +2 -0
  318. package/dist/core/web/public/next/assets/checkpoint-queries-BKD2evmX.js.map +1 -0
  319. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js +2 -0
  320. package/dist/core/web/public/next/assets/cloud-queries-CsU54eNn.js.map +1 -0
  321. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js +2 -0
  322. package/dist/core/web/public/next/assets/command-catalog-B0ApAGD0.js.map +1 -0
  323. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js +2 -0
  324. package/dist/core/web/public/next/assets/composer-queries-D1H4E0Ye.js.map +1 -0
  325. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js +2 -0
  326. package/dist/core/web/public/next/assets/connectivity-xQ0Nh0j3.js.map +1 -0
  327. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js +2 -0
  328. package/dist/core/web/public/next/assets/context-queries-bnI3P0Wt.js.map +1 -0
  329. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js +2 -0
  330. package/dist/core/web/public/next/assets/control-queries-BG53otwz.js.map +1 -0
  331. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js +2 -0
  332. package/dist/core/web/public/next/assets/copy-setup-COMDnur3.js.map +1 -0
  333. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js +2 -0
  334. package/dist/core/web/public/next/assets/deep-link-CqOP-JEm.js.map +1 -0
  335. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js +2 -0
  336. package/dist/core/web/public/next/assets/device-permissions-DpsJJcUW.js.map +1 -0
  337. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js +2 -0
  338. package/dist/core/web/public/next/assets/devin-queries-BSEOfLuZ.js.map +1 -0
  339. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js +2 -0
  340. package/dist/core/web/public/next/assets/dock-icons-DK7QcBXJ.js.map +1 -0
  341. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js +2 -0
  342. package/dist/core/web/public/next/assets/dock-panes-DvQ6t4Nl.js.map +1 -0
  343. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js +2 -0
  344. package/dist/core/web/public/next/assets/fleet-control-queries-BL-Vlf85.js.map +1 -0
  345. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js +2 -0
  346. package/dist/core/web/public/next/assets/fleet-queries-eacERnLm.js.map +1 -0
  347. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js +3 -0
  348. package/dist/core/web/public/next/assets/fleet-state-DfKcuo4A.js.map +1 -0
  349. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js +2 -0
  350. package/dist/core/web/public/next/assets/focus-trap-BZeH0rVB.js.map +1 -0
  351. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js +5 -0
  352. package/dist/core/web/public/next/assets/git-model-C1I4z_iQ.js.map +1 -0
  353. package/dist/core/web/public/next/assets/global-w7KDTTi0.js +3 -0
  354. package/dist/core/web/public/next/assets/global-w7KDTTi0.js.map +1 -0
  355. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js +3 -0
  356. package/dist/core/web/public/next/assets/guarded-action-J9umcJgI.js.map +1 -0
  357. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js +2 -0
  358. package/dist/core/web/public/next/assets/guarded-runners-Da5yA9Im.js.map +1 -0
  359. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js +2 -0
  360. package/dist/core/web/public/next/assets/health-queries-D3HgrdU_.js.map +1 -0
  361. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js +2 -0
  362. package/dist/core/web/public/next/assets/icons-C3G-y5j2.js.map +1 -0
  363. package/dist/core/web/public/next/assets/index-BC5Uslm5.js +11 -0
  364. package/dist/core/web/public/next/assets/index-BC5Uslm5.js.map +1 -0
  365. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js +2 -0
  366. package/dist/core/web/public/next/assets/jev-queries-D6JNU-s6.js.map +1 -0
  367. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js +2 -0
  368. package/dist/core/web/public/next/assets/ladder-queries-BnYWjJoi.js.map +1 -0
  369. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js +2 -0
  370. package/dist/core/web/public/next/assets/leader-focus-C6LVWgYI.js.map +1 -0
  371. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js +2 -0
  372. package/dist/core/web/public/next/assets/live-model-BPyZCTr1.js.map +1 -0
  373. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js +2 -0
  374. package/dist/core/web/public/next/assets/mobile-actions-avKNGddD.js.map +1 -0
  375. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js +2 -0
  376. package/dist/core/web/public/next/assets/mobile-toast-BqSzGmw1.js.map +1 -0
  377. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js +7 -0
  378. package/dist/core/web/public/next/assets/multimodel-flows-DOHsEKUG.js.map +1 -0
  379. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js +2 -0
  380. package/dist/core/web/public/next/assets/multimodel-queries-xmBBUT6n.js.map +1 -0
  381. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js +2 -0
  382. package/dist/core/web/public/next/assets/mutations-CdLi0erM.js.map +1 -0
  383. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js +2 -0
  384. package/dist/core/web/public/next/assets/nav-CUXtg-Iw.js.map +1 -0
  385. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js +2 -0
  386. package/dist/core/web/public/next/assets/needs-you-actions-B2tjWO-0.js.map +1 -0
  387. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js +2 -0
  388. package/dist/core/web/public/next/assets/needs-you-model-DL9EEd2L.js.map +1 -0
  389. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js +2 -0
  390. package/dist/core/web/public/next/assets/open-terminal-BfbxGoYQ.js.map +1 -0
  391. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js +2 -0
  392. package/dist/core/web/public/next/assets/open-terminal-request-BT1UE0fz.js.map +1 -0
  393. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js +2 -0
  394. package/dist/core/web/public/next/assets/overnight-queries-cjjogTzn.js.map +1 -0
  395. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js +2 -0
  396. package/dist/core/web/public/next/assets/palette-handoff-XL2WWc9I.js.map +1 -0
  397. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js +3 -0
  398. package/dist/core/web/public/next/assets/panes-5GU8cuI9.js.map +1 -0
  399. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js +2 -0
  400. package/dist/core/web/public/next/assets/path-display-ZSzKoo8T.js.map +1 -0
  401. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js +2 -0
  402. package/dist/core/web/public/next/assets/playbook-composer-D04tqOmU.js.map +1 -0
  403. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js +2 -0
  404. package/dist/core/web/public/next/assets/playbook-focus-DD1VIfkd.js.map +1 -0
  405. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js +2 -0
  406. package/dist/core/web/public/next/assets/playbooks-queries-X7NGzpIn.js.map +1 -0
  407. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js +2 -0
  408. package/dist/core/web/public/next/assets/preloaded-6hKNGuRp.js.map +1 -0
  409. package/dist/core/web/public/next/assets/primitives-6nAFZkcg.js +1 -0
  410. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js +2 -0
  411. package/dist/core/web/public/next/assets/pwa-BzXJXtDt.js.map +1 -0
  412. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js +2 -0
  413. package/dist/core/web/public/next/assets/queries-PgZlvFqO.js.map +1 -0
  414. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js +2 -0
  415. package/dist/core/web/public/next/assets/reasoning-pref-BS0PSZ8d.js.map +1 -0
  416. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js +3 -0
  417. package/dist/core/web/public/next/assets/remote-session-Bu-dtRcS.js.map +1 -0
  418. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js +2 -0
  419. package/dist/core/web/public/next/assets/resolved-store-UYN2k9My.js.map +1 -0
  420. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js +2 -0
  421. package/dist/core/web/public/next/assets/resources-queries-XfQ8w9In.js.map +1 -0
  422. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js +2 -0
  423. package/dist/core/web/public/next/assets/reveal-anchor-3ZUTtB8Q.js.map +1 -0
  424. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js +2 -0
  425. package/dist/core/web/public/next/assets/sheet-DP8ByDWU.js.map +1 -0
  426. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js +3 -0
  427. package/dist/core/web/public/next/assets/slots-DWlj_c7i.js.map +1 -0
  428. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js +4 -0
  429. package/dist/core/web/public/next/assets/sources-queries-Cjk1rpDU.js.map +1 -0
  430. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js +2 -0
  431. package/dist/core/web/public/next/assets/sse-Z3U8XhDI.js.map +1 -0
  432. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js +2 -0
  433. package/dist/core/web/public/next/assets/surface-data-hufdOfpz.js.map +1 -0
  434. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js +2 -0
  435. package/dist/core/web/public/next/assets/surface-prefetch-CFtP8imB.js.map +1 -0
  436. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js +2 -0
  437. package/dist/core/web/public/next/assets/terminal-client-CCSvMeEv.js.map +1 -0
  438. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js +2 -0
  439. package/dist/core/web/public/next/assets/terminal-icons-Dx6neM-J.js.map +1 -0
  440. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js +6 -0
  441. package/dist/core/web/public/next/assets/terminal-view-BSieiQvi.js.map +1 -0
  442. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js +2 -0
  443. package/dist/core/web/public/next/assets/thread-data-Cd2DZffn.js.map +1 -0
  444. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js +2 -0
  445. package/dist/core/web/public/next/assets/ui-parts-wvov2ktB.js.map +1 -0
  446. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js +2 -0
  447. package/dist/core/web/public/next/assets/usage-queries-nZjJ1aky.js.map +1 -0
  448. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js +2 -0
  449. package/dist/core/web/public/next/assets/use-chat-activity-_tBmEPPN.js.map +1 -0
  450. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js +2 -0
  451. package/dist/core/web/public/next/assets/use-guarded-action-DKKjhPKG.js.map +1 -0
  452. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js +2 -0
  453. package/dist/core/web/public/next/assets/use-ticker-w1c3SOqK.js.map +1 -0
  454. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js +2 -0
  455. package/dist/core/web/public/next/assets/use-token-gate-h5QAERLT.js.map +1 -0
  456. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js +2 -0
  457. package/dist/core/web/public/next/assets/useAutoSeat-Dpbn0XUv.js.map +1 -0
  458. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js +2 -0
  459. package/dist/core/web/public/next/assets/useOnboarding-VoV1LcuJ.js.map +1 -0
  460. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js +2 -0
  461. package/dist/core/web/public/next/assets/useSeatHealth-DuSaKdIs.js.map +1 -0
  462. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js +2 -0
  463. package/dist/core/web/public/next/assets/useSeatsRefresh-DFaR1jSz.js.map +1 -0
  464. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js +2 -0
  465. package/dist/core/web/public/next/assets/useVerseSession-BOsgJzT5.js.map +1 -0
  466. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js +2 -0
  467. package/dist/core/web/public/next/assets/useVerseTranscript-BN_fMz6x.js.map +1 -0
  468. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js +2 -0
  469. package/dist/core/web/public/next/assets/verse-bootstrap-query-B3vFD9XK.js.map +1 -0
  470. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js +2 -0
  471. package/dist/core/web/public/next/assets/verse-icons-vSkflmRB.js.map +1 -0
  472. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js +3 -0
  473. package/dist/core/web/public/next/assets/warmup-D9MjYs5S.js.map +1 -0
  474. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js +2 -0
  475. package/dist/core/web/public/next/assets/wiki-focus-De8-E48Z.js.map +1 -0
  476. package/dist/core/web/public/next/index.html +1 -1
  477. package/dist/release-dependency-inventory.json +1 -1
  478. package/package.json +1 -1
  479. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js +0 -2
  480. package/dist/core/web/public/next/assets/ActionMenu-CebJFKYy.js.map +0 -1
  481. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js +0 -2
  482. package/dist/core/web/public/next/assets/Advanced-Dr9aVbXV.js.map +0 -1
  483. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js +0 -2
  484. package/dist/core/web/public/next/assets/AgentDetailScreen-DCVf81Vo.js.map +0 -1
  485. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js +0 -2
  486. package/dist/core/web/public/next/assets/AgentToolsSheet-C3SbvEiV.js.map +0 -1
  487. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js +0 -2
  488. package/dist/core/web/public/next/assets/AgentToolsStrip-CZNxj_Iv.js.map +0 -1
  489. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js +0 -2
  490. package/dist/core/web/public/next/assets/AgentsScreen-zLj4gzPR.js.map +0 -1
  491. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js +0 -3
  492. package/dist/core/web/public/next/assets/AgentsSection-CIo_nRmi.js.map +0 -1
  493. package/dist/core/web/public/next/assets/App-CPKNuUdC.js +0 -8
  494. package/dist/core/web/public/next/assets/App-CPKNuUdC.js.map +0 -1
  495. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js +0 -2
  496. package/dist/core/web/public/next/assets/AppsSection-D2F2CM-E.js.map +0 -1
  497. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js +0 -2
  498. package/dist/core/web/public/next/assets/AreaTrend-DiZu8bjc.js.map +0 -1
  499. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js +0 -2
  500. package/dist/core/web/public/next/assets/AutomationsSection-B4rBNUyo.js.map +0 -1
  501. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js +0 -3
  502. package/dist/core/web/public/next/assets/AutonomyOffState-DEznxI-Q.js.map +0 -1
  503. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js +0 -2
  504. package/dist/core/web/public/next/assets/AutonomySection-Dq5n3gs7.js.map +0 -1
  505. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js +0 -2
  506. package/dist/core/web/public/next/assets/AutonomyStatus-Uydy6-pZ.js.map +0 -1
  507. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js +0 -2
  508. package/dist/core/web/public/next/assets/BranchBar-BzUmUM_j.js.map +0 -1
  509. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js +0 -7
  510. package/dist/core/web/public/next/assets/BrowserPanel-C_VI6Awi.js.map +0 -1
  511. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js +0 -2
  512. package/dist/core/web/public/next/assets/BudgetControl-B23rNAuC.js.map +0 -1
  513. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js +0 -2
  514. package/dist/core/web/public/next/assets/Button-DJY_Pu5B.js.map +0 -1
  515. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js +0 -2
  516. package/dist/core/web/public/next/assets/CapacityStrip-B5Yj2PhZ.js.map +0 -1
  517. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js +0 -16
  518. package/dist/core/web/public/next/assets/ChangesPaneHost-LsUonc7P.js.map +0 -1
  519. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js +0 -2
  520. package/dist/core/web/public/next/assets/ChartFrame-CakjKkPx.js.map +0 -1
  521. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js +0 -2
  522. package/dist/core/web/public/next/assets/ChatPanes-DgKskpXb.js.map +0 -1
  523. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js +0 -3
  524. package/dist/core/web/public/next/assets/ChatSection-DXpzV1NW.js.map +0 -1
  525. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js +0 -5
  526. package/dist/core/web/public/next/assets/ChecksPanel-BeCJVOJC.js.map +0 -1
  527. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js +0 -2
  528. package/dist/core/web/public/next/assets/CloudBudgetForm-4SWIGJLs.js.map +0 -1
  529. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js +0 -3
  530. package/dist/core/web/public/next/assets/CommandPalette-B4QaFGY5.js.map +0 -1
  531. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js +0 -3
  532. package/dist/core/web/public/next/assets/CommandSection-8TFjYitt.js.map +0 -1
  533. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js +0 -9
  534. package/dist/core/web/public/next/assets/CommandWorkflowForm-B2ooVjof.js.map +0 -1
  535. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js +0 -3
  536. package/dist/core/web/public/next/assets/CommandWorkflowPicker-C09vJiUG.js.map +0 -1
  537. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js +0 -4
  538. package/dist/core/web/public/next/assets/CompareDialog-CaopnGI0.js.map +0 -1
  539. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js +0 -2
  540. package/dist/core/web/public/next/assets/ComputerControl-BflC6wd1.js.map +0 -1
  541. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js +0 -2
  542. package/dist/core/web/public/next/assets/ConfirmDialog-CTeMFavv.js.map +0 -1
  543. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js +0 -2
  544. package/dist/core/web/public/next/assets/DeleteChatDialog-B2bUTuZ9.js.map +0 -1
  545. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js +0 -2
  546. package/dist/core/web/public/next/assets/DevinStopDialog-DPP34cna.js.map +0 -1
  547. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js +0 -2
  548. package/dist/core/web/public/next/assets/Dialog-r4j4R4b6.js.map +0 -1
  549. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js +0 -2
  550. package/dist/core/web/public/next/assets/DiffPane-CKnpzqaU.js.map +0 -1
  551. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js +0 -2
  552. package/dist/core/web/public/next/assets/DiffViewer-BzQ7245p.js.map +0 -1
  553. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js +0 -2
  554. package/dist/core/web/public/next/assets/DockHost-BCZtC_lm.js.map +0 -1
  555. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js +0 -2
  556. package/dist/core/web/public/next/assets/EmptyState-Cwpga8L9.js.map +0 -1
  557. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js +0 -2
  558. package/dist/core/web/public/next/assets/Epistemic-BBwXv-C1.js.map +0 -1
  559. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js +0 -2
  560. package/dist/core/web/public/next/assets/EvidenceTimeline-hAENJQCa.js.map +0 -1
  561. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js +0 -2
  562. package/dist/core/web/public/next/assets/FilesPane-CrPN5zlx.js.map +0 -1
  563. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js +0 -2
  564. package/dist/core/web/public/next/assets/FleetScreen-Cz9HQ-st.js.map +0 -1
  565. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js +0 -5
  566. package/dist/core/web/public/next/assets/FleetSection-CmZKQ1rr.js.map +0 -1
  567. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js +0 -2
  568. package/dist/core/web/public/next/assets/Funnel-Cfg55EZp.js.map +0 -1
  569. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js +0 -2
  570. package/dist/core/web/public/next/assets/GearTray-D-Mhc8TJ.js.map +0 -1
  571. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js +0 -2
  572. package/dist/core/web/public/next/assets/GitDialogs-e-7RQEGv.js.map +0 -1
  573. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js +0 -3
  574. package/dist/core/web/public/next/assets/GrowthSection-DsIrdTDd.js.map +0 -1
  575. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js +0 -2
  576. package/dist/core/web/public/next/assets/HandoffDialog-1MB2fmT1.js.map +0 -1
  577. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js +0 -3
  578. package/dist/core/web/public/next/assets/HomeBody-n_t3A58_.js.map +0 -1
  579. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js +0 -2
  580. package/dist/core/web/public/next/assets/HomeSeats-DA66aOWC.js.map +0 -1
  581. package/dist/core/web/public/next/assets/Input-Bt6fp051.js +0 -2
  582. package/dist/core/web/public/next/assets/Input-Bt6fp051.js.map +0 -1
  583. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js +0 -9
  584. package/dist/core/web/public/next/assets/LaunchDialog-BCd7XqCv.js.map +0 -1
  585. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js +0 -2
  586. package/dist/core/web/public/next/assets/LeaderCard-DFAFcyfZ.js.map +0 -1
  587. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js +0 -3
  588. package/dist/core/web/public/next/assets/LeaderConversation-LSenfZzT.js.map +0 -1
  589. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js +0 -2
  590. package/dist/core/web/public/next/assets/LeaderScreen-B2UxRWUm.js.map +0 -1
  591. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js +0 -2
  592. package/dist/core/web/public/next/assets/LessonsPanel-D86ZT0we.js.map +0 -1
  593. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js +0 -2
  594. package/dist/core/web/public/next/assets/LiveTimer-AtG5hPwV.js.map +0 -1
  595. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js +0 -2
  596. package/dist/core/web/public/next/assets/LocalSeatBadge-XfGRZCA3.js.map +0 -1
  597. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js +0 -2
  598. package/dist/core/web/public/next/assets/MatrixHeatmap-PSnyMJ2h.js.map +0 -1
  599. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js +0 -2
  600. package/dist/core/web/public/next/assets/McpSection-BG2FSkgH.js.map +0 -1
  601. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js +0 -3
  602. package/dist/core/web/public/next/assets/MessageMarkdown-CQEqoMvf.js.map +0 -1
  603. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js +0 -72
  604. package/dist/core/web/public/next/assets/MessageMarkdownRenderer-DU-VLDhb.js.map +0 -1
  605. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js +0 -2
  606. package/dist/core/web/public/next/assets/Meter-BfaE-BjY.js.map +0 -1
  607. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js +0 -2
  608. package/dist/core/web/public/next/assets/MicButton-BbGB7y_9.js.map +0 -1
  609. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js +0 -3
  610. package/dist/core/web/public/next/assets/MindSection-CX0VaHo1.js.map +0 -1
  611. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js +0 -2
  612. package/dist/core/web/public/next/assets/MobileComposer-CFeLWUCz.js.map +0 -1
  613. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js +0 -2
  614. package/dist/core/web/public/next/assets/MobileGuardSheet-cGW9RCTr.js.map +0 -1
  615. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js +0 -3
  616. package/dist/core/web/public/next/assets/MobileRuntime-BWTZ_QLr.js.map +0 -1
  617. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js +0 -2
  618. package/dist/core/web/public/next/assets/MoreScreen-BcHZhVrR.js.map +0 -1
  619. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js +0 -7
  620. package/dist/core/web/public/next/assets/MultiModelBar-COxIRv7m.js.map +0 -1
  621. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js +0 -2
  622. package/dist/core/web/public/next/assets/MutationTokenDialog-Dnf_rcnc.js.map +0 -1
  623. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js +0 -3
  624. package/dist/core/web/public/next/assets/NeedsYouDrawer-COrUlnd0.js.map +0 -1
  625. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js +0 -2
  626. package/dist/core/web/public/next/assets/NeedsYouList-AXzOe4EL.js.map +0 -1
  627. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js +0 -2
  628. package/dist/core/web/public/next/assets/NeedsYouScreen-HSXybHgd.js.map +0 -1
  629. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js +0 -2
  630. package/dist/core/web/public/next/assets/NewAgentScreen-BI849ZsG.js.map +0 -1
  631. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js +0 -4
  632. package/dist/core/web/public/next/assets/NewChatDialog-BHoCnP6Q.js.map +0 -1
  633. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js +0 -3
  634. package/dist/core/web/public/next/assets/OnboardingFlow-BVljU2uy.js.map +0 -1
  635. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js +0 -3
  636. package/dist/core/web/public/next/assets/OnboardingGate-DlI4L7Ki.js.map +0 -1
  637. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js +0 -9
  638. package/dist/core/web/public/next/assets/PlaybooksSection-hhNpXnsR.js.map +0 -1
  639. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js +0 -2
  640. package/dist/core/web/public/next/assets/PreviewPane-BbXr63u2.js.map +0 -1
  641. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js +0 -2
  642. package/dist/core/web/public/next/assets/ProviderLogo-BliSWEMw.js.map +0 -1
  643. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js +0 -2
  644. package/dist/core/web/public/next/assets/RailStatus-SnrVxLnp.js.map +0 -1
  645. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js +0 -2
  646. package/dist/core/web/public/next/assets/ReasoningPane-C04_bOAi.js.map +0 -1
  647. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js +0 -2
  648. package/dist/core/web/public/next/assets/ReasoningSheet-BvNFwtuX.js.map +0 -1
  649. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js +0 -2
  650. package/dist/core/web/public/next/assets/RefreshIndicator-BNptNJiV.js.map +0 -1
  651. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js +0 -2
  652. package/dist/core/web/public/next/assets/RemoteMobileApp-osaSEvnm.js.map +0 -1
  653. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js +0 -7
  654. package/dist/core/web/public/next/assets/ResourcePoolConsoleApp-LO31zjUR.js.map +0 -1
  655. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js +0 -3
  656. package/dist/core/web/public/next/assets/ResourcesChrome-ByZE532G.js.map +0 -1
  657. package/dist/core/web/public/next/assets/ResourcesChrome-p_VCkMZH.css +0 -1
  658. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js +0 -3
  659. package/dist/core/web/public/next/assets/ResourcesDrawer-BH9uwNE8.js.map +0 -1
  660. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js +0 -2
  661. package/dist/core/web/public/next/assets/ReviewMenu-B2A_YDPi.js.map +0 -1
  662. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js +0 -2
  663. package/dist/core/web/public/next/assets/RouteErrorBoundary-CVabFM97.js.map +0 -1
  664. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js +0 -2
  665. package/dist/core/web/public/next/assets/RunInCloudAction-BpNHE7m8.js.map +0 -1
  666. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js +0 -2
  667. package/dist/core/web/public/next/assets/RunInDevinAction-Bkf5Gb3a.js.map +0 -1
  668. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js +0 -2
  669. package/dist/core/web/public/next/assets/SchedulingEvidence-B08-qhhm.js.map +0 -1
  670. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js +0 -3
  671. package/dist/core/web/public/next/assets/ScreenHost-BGSxFyWK.js.map +0 -1
  672. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js +0 -3
  673. package/dist/core/web/public/next/assets/SeatSelector-B4lRZl0K.js.map +0 -1
  674. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js +0 -2
  675. package/dist/core/web/public/next/assets/Segmented-Dokzywy8.js.map +0 -1
  676. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js +0 -2
  677. package/dist/core/web/public/next/assets/Select-tf4lNvWD.js.map +0 -1
  678. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js +0 -2
  679. package/dist/core/web/public/next/assets/SessionGate-Bab2qO29.js.map +0 -1
  680. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js +0 -2
  681. package/dist/core/web/public/next/assets/SessionInsightChip-C-fj8h4A.js.map +0 -1
  682. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js +0 -2
  683. package/dist/core/web/public/next/assets/SessionSearch-CqjjwOW2.js.map +0 -1
  684. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js +0 -2
  685. package/dist/core/web/public/next/assets/SettingsSection-DfOsHzl6.js.map +0 -1
  686. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js +0 -2
  687. package/dist/core/web/public/next/assets/SetupChecklist-BsxCTcYY.js.map +0 -1
  688. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js +0 -3
  689. package/dist/core/web/public/next/assets/ShadowDecisions-B1ZPv7K-.js.map +0 -1
  690. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js +0 -2
  691. package/dist/core/web/public/next/assets/Sheet-DLlZ00Lu.js.map +0 -1
  692. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js +0 -2
  693. package/dist/core/web/public/next/assets/ShortcutsOverlay-CDwQdpGV.js.map +0 -1
  694. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js +0 -3
  695. package/dist/core/web/public/next/assets/Sidebar-H5WNri2S.js.map +0 -1
  696. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js +0 -2
  697. package/dist/core/web/public/next/assets/SkipToContent-BjJE6yOo.js.map +0 -1
  698. package/dist/core/web/public/next/assets/Slider-C68TumXj.js +0 -2
  699. package/dist/core/web/public/next/assets/Slider-C68TumXj.js.map +0 -1
  700. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js +0 -2
  701. package/dist/core/web/public/next/assets/SourcesPane-DHYs4YIg.js.map +0 -1
  702. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js +0 -2
  703. package/dist/core/web/public/next/assets/SourcesPanel-DFyLfYBO.js.map +0 -1
  704. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js +0 -2
  705. package/dist/core/web/public/next/assets/StatTile-CTUuhOLS.js.map +0 -1
  706. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js +0 -2
  707. package/dist/core/web/public/next/assets/StatusBadge-DrVbi5dF.js.map +0 -1
  708. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js +0 -2
  709. package/dist/core/web/public/next/assets/StepBand-CXDpnu2R.js.map +0 -1
  710. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js +0 -2
  711. package/dist/core/web/public/next/assets/Surface-DCL7uORg.js.map +0 -1
  712. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js +0 -2
  713. package/dist/core/web/public/next/assets/Swimlane-BAEjfoVU.js.map +0 -1
  714. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js +0 -2
  715. package/dist/core/web/public/next/assets/Switch-Z7RmRjWE.js.map +0 -1
  716. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js +0 -2
  717. package/dist/core/web/public/next/assets/Tag-Ciht3C94.js.map +0 -1
  718. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js +0 -26
  719. package/dist/core/web/public/next/assets/TerminalPane-BdIyhtzJ.js.map +0 -1
  720. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js +0 -3
  721. package/dist/core/web/public/next/assets/TerminalPane-DJKT600N.js.map +0 -1
  722. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js +0 -2
  723. package/dist/core/web/public/next/assets/ThinkingBlock-CHRZX_fJ.js.map +0 -1
  724. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js +0 -2
  725. package/dist/core/web/public/next/assets/UniverseConsoleApp-QSoaY_Fk.js.map +0 -1
  726. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js +0 -9
  727. package/dist/core/web/public/next/assets/UniverseView-ZXAOJ0Rq.js.map +0 -1
  728. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js +0 -3
  729. package/dist/core/web/public/next/assets/UsageSection-BEAa-W_q.js.map +0 -1
  730. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js +0 -2
  731. package/dist/core/web/public/next/assets/UsePlaybookAction-S7Yky_M8.js.map +0 -1
  732. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js +0 -3
  733. package/dist/core/web/public/next/assets/VerseConsoleApp-Cj6yPJo3.js.map +0 -1
  734. package/dist/core/web/public/next/assets/VerseConsoleApp-n6qr3lCF.css +0 -1
  735. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js +0 -3
  736. package/dist/core/web/public/next/assets/VerseMobileApp-BRayqF_2.js.map +0 -1
  737. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js +0 -2
  738. package/dist/core/web/public/next/assets/VerseShared-CH8mV5ew.js.map +0 -1
  739. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js +0 -2
  740. package/dist/core/web/public/next/assets/VoiceHud-CO4yGRlr.js.map +0 -1
  741. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js +0 -2
  742. package/dist/core/web/public/next/assets/VoiceInput-fSLnbGJ4.js.map +0 -1
  743. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js +0 -2
  744. package/dist/core/web/public/next/assets/WikiSection-CN-HansV.js.map +0 -1
  745. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js +0 -6
  746. package/dist/core/web/public/next/assets/Workspace-dufi6DmW.js.map +0 -1
  747. package/dist/core/web/public/next/assets/actions-gBplqbpY.js +0 -2
  748. package/dist/core/web/public/next/assets/actions-gBplqbpY.js.map +0 -1
  749. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js +0 -2
  750. package/dist/core/web/public/next/assets/agent-tools-client-ClFut2J1.js.map +0 -1
  751. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js +0 -2
  752. package/dist/core/web/public/next/assets/agents-focus-DjBz83BQ.js.map +0 -1
  753. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js +0 -2
  754. package/dist/core/web/public/next/assets/app-version-B0FcXqqB.js.map +0 -1
  755. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js +0 -2
  756. package/dist/core/web/public/next/assets/apps-model-C-SdWY0N.js.map +0 -1
  757. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js +0 -2
  758. package/dist/core/web/public/next/assets/ask-seat-DhGxiGSd.js.map +0 -1
  759. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js +0 -2
  760. package/dist/core/web/public/next/assets/authority-model-CoXAS-Z6.js.map +0 -1
  761. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js +0 -2
  762. package/dist/core/web/public/next/assets/automations-focus-CeneF7lP.js.map +0 -1
  763. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js +0 -2
  764. package/dist/core/web/public/next/assets/budget-queries-DCZevH2S.js.map +0 -1
  765. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js +0 -2
  766. package/dist/core/web/public/next/assets/capacity-strip-model-Wna9o0dS.js.map +0 -1
  767. package/dist/core/web/public/next/assets/charts-CzqC55eL.js +0 -2
  768. package/dist/core/web/public/next/assets/charts-CzqC55eL.js.map +0 -1
  769. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js +0 -2
  770. package/dist/core/web/public/next/assets/chat-pane-data-BBA55Pw-.js.map +0 -1
  771. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js +0 -2
  772. package/dist/core/web/public/next/assets/checkpoint-queries-gP6Vh70H.js.map +0 -1
  773. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js +0 -2
  774. package/dist/core/web/public/next/assets/cloud-queries-Bsqo7wye.js.map +0 -1
  775. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js +0 -2
  776. package/dist/core/web/public/next/assets/command-catalog-Dnx-iMLX.js.map +0 -1
  777. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js +0 -2
  778. package/dist/core/web/public/next/assets/composer-queries-DHGJlnFJ.js.map +0 -1
  779. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js +0 -2
  780. package/dist/core/web/public/next/assets/connectivity-BViMMNcD.js.map +0 -1
  781. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js +0 -2
  782. package/dist/core/web/public/next/assets/context-queries-Bsl-w0q-.js.map +0 -1
  783. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js +0 -2
  784. package/dist/core/web/public/next/assets/control-queries-CUNa6TAx.js.map +0 -1
  785. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js +0 -2
  786. package/dist/core/web/public/next/assets/copy-setup-C2goNcTZ.js.map +0 -1
  787. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js +0 -2
  788. package/dist/core/web/public/next/assets/deep-link-Dg_zaqAl.js.map +0 -1
  789. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js +0 -2
  790. package/dist/core/web/public/next/assets/device-permissions-CEXY0Vor.js.map +0 -1
  791. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js +0 -2
  792. package/dist/core/web/public/next/assets/devin-queries-Cu_YYhw2.js.map +0 -1
  793. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js +0 -2
  794. package/dist/core/web/public/next/assets/dock-icons-DGZoDN6N.js.map +0 -1
  795. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js +0 -2
  796. package/dist/core/web/public/next/assets/dock-panes-BgSO9q_f.js.map +0 -1
  797. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js +0 -2
  798. package/dist/core/web/public/next/assets/fleet-control-queries-clsJWanE.js.map +0 -1
  799. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js +0 -2
  800. package/dist/core/web/public/next/assets/fleet-queries-DX1AwHEt.js.map +0 -1
  801. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js +0 -3
  802. package/dist/core/web/public/next/assets/fleet-state-EgNiSDxu.js.map +0 -1
  803. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js +0 -2
  804. package/dist/core/web/public/next/assets/focus-trap-B1vuEhZX.js.map +0 -1
  805. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js +0 -5
  806. package/dist/core/web/public/next/assets/git-model-Bu59fz1m.js.map +0 -1
  807. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js +0 -3
  808. package/dist/core/web/public/next/assets/global-BJ_kVFpD.js.map +0 -1
  809. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js +0 -3
  810. package/dist/core/web/public/next/assets/guarded-action-CzvG7Qgc.js.map +0 -1
  811. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js +0 -2
  812. package/dist/core/web/public/next/assets/guarded-runners-BPM0KdoQ.js.map +0 -1
  813. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js +0 -2
  814. package/dist/core/web/public/next/assets/health-queries-CMxSsJKS.js.map +0 -1
  815. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js +0 -2
  816. package/dist/core/web/public/next/assets/icons-MYfI6vZr.js.map +0 -1
  817. package/dist/core/web/public/next/assets/index-DOAOxiKl.js +0 -11
  818. package/dist/core/web/public/next/assets/index-DOAOxiKl.js.map +0 -1
  819. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js +0 -2
  820. package/dist/core/web/public/next/assets/jev-queries-CS2A5uWe.js.map +0 -1
  821. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js +0 -2
  822. package/dist/core/web/public/next/assets/ladder-queries-CBoG3heV.js.map +0 -1
  823. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js +0 -2
  824. package/dist/core/web/public/next/assets/leader-focus-DDQlv0TB.js.map +0 -1
  825. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js +0 -2
  826. package/dist/core/web/public/next/assets/live-model-CCjYFk48.js.map +0 -1
  827. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js +0 -2
  828. package/dist/core/web/public/next/assets/mobile-actions-XqB_h7a8.js.map +0 -1
  829. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js +0 -2
  830. package/dist/core/web/public/next/assets/mobile-toast-eIrghd9o.js.map +0 -1
  831. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js +0 -7
  832. package/dist/core/web/public/next/assets/multimodel-flows-CzI-yHg5.js.map +0 -1
  833. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js +0 -2
  834. package/dist/core/web/public/next/assets/multimodel-queries-DxIT9AZY.js.map +0 -1
  835. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js +0 -2
  836. package/dist/core/web/public/next/assets/mutations-BlGALvmG.js.map +0 -1
  837. package/dist/core/web/public/next/assets/nav-ByibvQW1.js +0 -2
  838. package/dist/core/web/public/next/assets/nav-ByibvQW1.js.map +0 -1
  839. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js +0 -2
  840. package/dist/core/web/public/next/assets/needs-you-actions-Dp5UxM3X.js.map +0 -1
  841. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js +0 -2
  842. package/dist/core/web/public/next/assets/needs-you-model-DYsqHMqy.js.map +0 -1
  843. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js +0 -2
  844. package/dist/core/web/public/next/assets/open-terminal-dOVyLFvn.js.map +0 -1
  845. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js +0 -2
  846. package/dist/core/web/public/next/assets/open-terminal-request-BIhvirIl.js.map +0 -1
  847. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js +0 -2
  848. package/dist/core/web/public/next/assets/overnight-queries-KxqH6BRN.js.map +0 -1
  849. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js +0 -2
  850. package/dist/core/web/public/next/assets/palette-handoff-69pw9oBv.js.map +0 -1
  851. package/dist/core/web/public/next/assets/panes-CHt3427X.js +0 -3
  852. package/dist/core/web/public/next/assets/panes-CHt3427X.js.map +0 -1
  853. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js +0 -2
  854. package/dist/core/web/public/next/assets/path-display-DuIZF5G3.js.map +0 -1
  855. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js +0 -2
  856. package/dist/core/web/public/next/assets/playbook-composer-DipWgX7t.js.map +0 -1
  857. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js +0 -2
  858. package/dist/core/web/public/next/assets/playbook-focus-EXJPMBBI.js.map +0 -1
  859. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js +0 -2
  860. package/dist/core/web/public/next/assets/playbooks-queries-BlpGBpOV.js.map +0 -1
  861. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js +0 -2
  862. package/dist/core/web/public/next/assets/preloaded-TmpzuCEi.js.map +0 -1
  863. package/dist/core/web/public/next/assets/primitives-CDKCUR2v.js +0 -1
  864. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js +0 -2
  865. package/dist/core/web/public/next/assets/pwa-CTGMm-wR.js.map +0 -1
  866. package/dist/core/web/public/next/assets/queries--mGK10fL.js +0 -2
  867. package/dist/core/web/public/next/assets/queries--mGK10fL.js.map +0 -1
  868. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js +0 -2
  869. package/dist/core/web/public/next/assets/reasoning-pref-CWGL9MD2.js.map +0 -1
  870. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js +0 -3
  871. package/dist/core/web/public/next/assets/remote-session-I4RXlsas.js.map +0 -1
  872. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js +0 -2
  873. package/dist/core/web/public/next/assets/resolved-store-DwGn9hb_.js.map +0 -1
  874. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js +0 -2
  875. package/dist/core/web/public/next/assets/resources-queries-T6ER_hPN.js.map +0 -1
  876. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js +0 -2
  877. package/dist/core/web/public/next/assets/reveal-anchor-CHtvhrYm.js.map +0 -1
  878. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js +0 -2
  879. package/dist/core/web/public/next/assets/sheet-BlzGO1wo.js.map +0 -1
  880. package/dist/core/web/public/next/assets/slots-40edgV7X.js +0 -3
  881. package/dist/core/web/public/next/assets/slots-40edgV7X.js.map +0 -1
  882. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js +0 -4
  883. package/dist/core/web/public/next/assets/sources-queries-BrM41X16.js.map +0 -1
  884. package/dist/core/web/public/next/assets/sse-CAFwslNC.js +0 -2
  885. package/dist/core/web/public/next/assets/sse-CAFwslNC.js.map +0 -1
  886. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js +0 -2
  887. package/dist/core/web/public/next/assets/surface-data-D_oFOgkh.js.map +0 -1
  888. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js +0 -2
  889. package/dist/core/web/public/next/assets/surface-prefetch-wqfiATYQ.js.map +0 -1
  890. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js +0 -2
  891. package/dist/core/web/public/next/assets/terminal-client-iL4DagCN.js.map +0 -1
  892. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js +0 -2
  893. package/dist/core/web/public/next/assets/terminal-icons-BakeOpKV.js.map +0 -1
  894. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js +0 -6
  895. package/dist/core/web/public/next/assets/terminal-view-D6AAh08q.js.map +0 -1
  896. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js +0 -2
  897. package/dist/core/web/public/next/assets/thread-data-CSDZ514s.js.map +0 -1
  898. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js +0 -2
  899. package/dist/core/web/public/next/assets/ui-parts-DubQJIoq.js.map +0 -1
  900. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js +0 -2
  901. package/dist/core/web/public/next/assets/usage-queries-BONqdout.js.map +0 -1
  902. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js +0 -2
  903. package/dist/core/web/public/next/assets/use-chat-activity-BZjdPPNP.js.map +0 -1
  904. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js +0 -2
  905. package/dist/core/web/public/next/assets/use-guarded-action-xJ4rxyVo.js.map +0 -1
  906. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js +0 -2
  907. package/dist/core/web/public/next/assets/use-ticker-Bsu0cMvl.js.map +0 -1
  908. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js +0 -2
  909. package/dist/core/web/public/next/assets/use-token-gate-E-xzEAu6.js.map +0 -1
  910. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js +0 -2
  911. package/dist/core/web/public/next/assets/useAutoSeat-CXC9e4vx.js.map +0 -1
  912. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js +0 -2
  913. package/dist/core/web/public/next/assets/useOnboarding-Csw_AXrj.js.map +0 -1
  914. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js +0 -2
  915. package/dist/core/web/public/next/assets/useSeatHealth-B6AXxre9.js.map +0 -1
  916. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js +0 -2
  917. package/dist/core/web/public/next/assets/useSeatsRefresh-BIAa7Exn.js.map +0 -1
  918. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js +0 -2
  919. package/dist/core/web/public/next/assets/useVerseSession-BOyvOEDi.js.map +0 -1
  920. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js +0 -2
  921. package/dist/core/web/public/next/assets/useVerseTranscript-BOhcfdp7.js.map +0 -1
  922. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js +0 -2
  923. package/dist/core/web/public/next/assets/verse-bootstrap-query-D-fU89IT.js.map +0 -1
  924. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js +0 -2
  925. package/dist/core/web/public/next/assets/verse-icons-UKbUG3gv.js.map +0 -1
  926. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js +0 -3
  927. package/dist/core/web/public/next/assets/warmup-CZ-IBU5L.js.map +0 -1
  928. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js +0 -2
  929. package/dist/core/web/public/next/assets/wiki-focus-DhAvbMnX.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sources-queries-Cjk1rpDU.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/chat/turn-resource-evidence.ts","../../../../../../src/web-ui/routes/verse/chat/turn-model.ts","../../../../../../src/web-ui/routes/verse/reasoning/sources-queries.ts"],"sourcesContent":["/** Read-only, bounded metadata from this turn's reported calls. Never inspect payloads. */\nimport { baseToolName } from './tool-semantics.js';\n\nexport const MAX_RESOURCE_CALLS = 2048;\nexport const MAX_RESOURCE_SOURCES = 512;\nexport const MAX_RESOURCE_GROUPS = 12;\nexport const MAX_RESOURCE_CACHE = 2048;\n\nexport interface ReportedTool {\n label: string;\n mcp: boolean;\n state: 'completed' | 'pending' | 'failed' | 'unknown';\n}\nexport interface ResourceToolGroup {\n label: string;\n calls: number;\n pending: number;\n failed: number;\n unknown: number;\n}\nexport interface TurnResourceEvidence {\n calls: number;\n mcpCalls: number;\n pending: number;\n failed: number;\n unknown: number;\n sources: number;\n playbooks: number;\n partial: boolean;\n groups: ResourceToolGroup[];\n}\nexport interface ResourceEvidenceCacheEntry {\n name: unknown;\n pending: boolean | null;\n failed: boolean | null;\n evidence: ReportedTool;\n}\n\n// Tool/server names are provider-controlled too. Only these fixed labels may\n// leave the projection; arbitrary MCP names can contain secrets or local paths.\nconst TOOL_LABELS: Readonly<Record<string, string>> = {\n read: 'Read', read_file: 'Read', readfile: 'Read', view_file: 'Read',\n edit: 'Edit', multiedit: 'Edit', multi_edit: 'Edit', apply_patch: 'Edit',\n write: 'Write', write_file: 'Write', create_file: 'Write',\n bash: 'Command', shell: 'Command', exec_command: 'Command', run_command: 'Command',\n grep: 'Search', glob: 'Search', search: 'Search', tree: 'Search',\n webfetch: 'Web', web_fetch: 'Web', websearch: 'Web', web_search: 'Web',\n task: 'Delegate', agent: 'Delegate', subagent: 'Delegate',\n};\n\nfunction data(value: unknown, key: string): unknown {\n if (!value || typeof value !== 'object') return undefined;\n try { return Object.getOwnPropertyDescriptor(value, key)?.value; } catch { return undefined; }\n}\n\nfunction statusFlag(value: unknown, key: string): boolean | null {\n const flag = data(value, key);\n return typeof flag === 'boolean' ? flag : null;\n}\n\nfunction toolLabel(name: unknown): { label: string; mcp: boolean } {\n if (typeof name !== 'string' || name.length > 256) return { label: 'Unrecognized tool', mcp: false };\n const trimmed = name.trim();\n const mcp = /^mcp__[^\\s]+__[^\\s]+/i.test(trimmed) || /^mcp:[^\\s.]+\\.[^\\s]+/i.test(trimmed);\n const base = baseToolName(trimmed);\n const tool = Object.hasOwn(TOOL_LABELS, base) ? TOOL_LABELS[base]! : 'Other tool';\n if (!mcp) return { label: tool, mcp: false };\n // Recognize the transport envelope, not an executable/plugin identity.\n const server = /^mcp:/i.test(trimmed) ? trimmed.slice(4, trimmed.indexOf('.')) : trimmed.split('__')[1];\n const family = server === 'ashlr' || server === 'plugin_ashlr_ashlr' ? 'Ashlr MCP'\n : server === 'ashlr-efficiency' ? 'Ashlr efficiency MCP'\n : server === 'ashlr-verse' ? 'Verse MCP' : 'Other MCP';\n return { label: `${family}: ${tool}`, mcp: true };\n}\n\n/** Facts are already derived/cached by turn-model; only status booleans are consumed. */\nexport function reportedTool(name: unknown, facts: unknown): ReportedTool {\n const pending = statusFlag(facts, 'pending');\n const failed = statusFlag(facts, 'failed');\n return { ...toolLabel(name), state: pending === true ? 'pending'\n : failed === true ? 'failed' : pending === false && failed === false ? 'completed' : 'unknown' };\n}\n\nexport function cachedReportedTool(\n key: string, name: unknown, facts: unknown, cache: Map<string, ResourceEvidenceCacheEntry> | null,\n): ReportedTool {\n const pending = statusFlag(facts, 'pending');\n const failed = statusFlag(facts, 'failed');\n const hit = cache?.get(key);\n if (hit && hit.name === name && hit.pending === pending && hit.failed === failed) return hit.evidence;\n const evidence = reportedTool(name, facts);\n if (cache) {\n if (!cache.has(key) && cache.size >= MAX_RESOURCE_CACHE) cache.delete(cache.keys().next().value!);\n // Do not retain an arbitrary object supplied as a malformed name.\n cache.set(key, { name: typeof name === 'string' && name.length <= 256 ? name : null, pending, failed, evidence });\n }\n return evidence;\n}\n\nexport function emptyResourceEvidence(): TurnResourceEvidence {\n return { calls: 0, mcpCalls: 0, pending: 0, failed: 0, unknown: 0, sources: 0, playbooks: 0, partial: false, groups: [] };\n}\n\n/** Incremental projection piggybacks on the existing turn scan; no payload or extra log scan. */\nexport function addReportedTool(evidence: TurnResourceEvidence, tool: ReportedTool): void {\n if (evidence.calls >= MAX_RESOURCE_CALLS) { evidence.partial = true; return; }\n evidence.calls++;\n if (tool.mcp) evidence.mcpCalls++;\n if (tool.state !== 'completed') evidence[tool.state]++;\n let group = evidence.groups.find((entry) => entry.label === tool.label);\n if (!group && evidence.groups.length < MAX_RESOURCE_GROUPS) {\n group = { label: tool.label, calls: 0, pending: 0, failed: 0, unknown: 0 };\n evidence.groups.push(group);\n }\n if (!group) { evidence.partial = true; return; }\n group.calls++;\n if (tool.state !== 'completed') group[tool.state]++;\n}\n\nexport function setResourceContext(evidence: TurnResourceEvidence, sourceCount: number, playbooks: number): void {\n evidence.sources = Number.isSafeInteger(sourceCount) && sourceCount >= 0 ? Math.min(sourceCount, MAX_RESOURCE_SOURCES) : 0;\n evidence.playbooks = Number.isSafeInteger(playbooks) && playbooks >= 0 ? Math.min(playbooks, MAX_RESOURCE_CALLS) : 0;\n if (sourceCount > MAX_RESOURCE_SOURCES || playbooks > MAX_RESOURCE_CALLS) evidence.partial = true;\n}\n","/**\n * routes/verse/chat/turn-model.ts — a session as a list of TURNS.\n *\n * `verse-transcript.groupTranscriptItems()` already folds runs of tool calls into\n * one summary row; what it does not do is say where one exchange ends and\n * the next begins. Everything this file exists for needs that boundary: the\n * per-turn file-activity summary (the blast radius of one ask), the outline\n * that makes a fifty-turn session navigable, keyboard movement between\n * turns, and \"jump to the first error in this turn\".\n *\n * Pure over `groupTranscriptItems()`'s output — no React, no DOM, no\n * fetching — so the numbers in the summary can be tested directly against an\n * event log.\n */\nimport type { VerseSource } from '../../../../core/verse/types.js';\nimport { collateSources, describeTurnWork, emptyTurnStats, type VerseCitation, type VerseTurnStats } from '../../../../core/verse/trace.js';\nimport { parseUnifiedDiff } from '../../inbox/diff-parser.js';\nimport type { ToolGroupItem, TranscriptItem, TranscriptRenderItem } from '../verse-store.js';\nimport { readToolFacts, type ToolAction, type ToolFacts } from './tool-semantics.js';\nimport { addReportedTool, cachedReportedTool, emptyResourceEvidence, setResourceContext, type ResourceEvidenceCacheEntry, type TurnResourceEvidence } from './turn-resource-evidence.js';\n\nexport type TurnStatus = 'running' | 'ok' | 'error' | 'stopped';\n\n/**\n * Work that survives a transcript rebuild.\n *\n * `buildTurns` runs on EVERY streamed token: `useVerseSession` rebuilds\n * `state.events` per event, `buildTranscript` allocates fresh item objects from\n * it, and both of Transcript's memos therefore miss. Without this, every delta\n * re-derived the semantics of every tool call in the session — including a full\n * LCS diff per Edit payload, which allocates an `Int32Array` up to the 1200-line\n * cap. Fifty moderate edits cost hundreds of milliseconds of main-thread work\n * per frame, on the one surface whose frame budget is already spoken for.\n *\n * Caching is sound because `toolUseId` is a stable identity and a tool call's\n * `{name, input, result}` is immutable ONCE ITS RESULT HAS LANDED\n * (`verse-transcript.buildTranscript` replaces the item object exactly once, when the\n * `tool-result` event arrives). A cached entry derived while the call was still\n * pending is therefore the only one that can go stale, and it is the only one\n * recomputed.\n */\nexport interface TurnCache {\n facts: Map<string, ToolFacts>;\n /** `countDiffLines` over the same immutable diff text. */\n counts: Map<string, { additions: number; deletions: number }>;\n /** Flattened searchable text per tool call — the expensive half of the index. */\n toolText: Map<string, string>;\n resources: Map<string, ResourceEvidenceCacheEntry>;\n}\n\nexport function createTurnCache(): TurnCache {\n return { facts: new Map(), counts: new Map(), toolText: new Map(), resources: new Map() };\n}\n\n/** Native tool ids can repeat in another turn; caches must not reuse its facts. */\nfunction toolCacheKey(tool: { toolUseId: string; turnId?: string }): string {\n return JSON.stringify([tool.turnId ?? null, tool.toolUseId]);\n}\n\n/**\n * Facts for one tool call, reusing the cached instance whenever it is still\n * valid. Exported so a test can assert the second build recomputes nothing.\n */\nexport function cachedToolFacts(\n tool: { toolUseId: string; turnId?: string; name: string; input: unknown; result: { output: string; isError: boolean } | null },\n cache: TurnCache | null,\n): ToolFacts {\n const key = toolCacheKey(tool);\n const hit = cache?.facts.get(key);\n // A pending entry must be recomputed once the result lands; anything else is\n // derived from data that can no longer change.\n if (hit && !(hit.pending && tool.result !== null)) return hit;\n const fact = readToolFacts({ name: tool.name, input: tool.input, result: tool.result });\n if (cache) {\n cache.facts.set(key, fact);\n cache.counts.delete(key);\n cache.toolText.delete(key);\n }\n return fact;\n}\n\nexport interface TurnFileEntry {\n path: string;\n reads: number;\n edits: number;\n creates: number;\n deletes: number;\n /** The strongest thing that happened to it: delete > create > edit > read. */\n action: Extract<ToolAction, 'read' | 'edit' | 'create' | 'delete'>;\n /** Tool call to scroll to when the row is clicked. */\n anchorToolUseId: string;\n /** Summed from the diffs the calls carried; 0 when none did. */\n additions: number;\n deletions: number;\n /** At least one call touching this file failed. */\n failed: boolean;\n}\n\nexport interface TurnBlock {\n key: string;\n turnId: string | null;\n items: TranscriptRenderItem[];\n /** The ask that opened the turn, for the outline. */\n prompt: string | null;\n /** ISO stamp of the first item. */\n at: string;\n files: TurnFileEntry[];\n toolCount: number;\n commandCount: number;\n /** Failing tool calls plus logged errors. */\n errorCount: number;\n /** Id of the first failing thing in the turn, for jump-to-error. */\n firstErrorAnchor: string | null;\n status: TurnStatus;\n durationMs: number | null;\n /**\n * V3.15: what this turn drew on, numbered in order of first use — files\n * read (with line ranges), pages fetched, searches run, plus any source the\n * engine or seat reported. De-duplicated within the turn.\n */\n citations: VerseCitation[];\n /** V3.15: counts behind the turn's one-line summary. */\n stats: VerseTurnStats;\n /** V3.15: \"Read 8 files · edited 3 files (+42 −7) · ran 4 commands\" — empty when the turn did no tool work. */\n work: string;\n /** V3.15: the turn's reasoning, totalled. Unknown figures are null, never 0. */\n reasoning: TurnReasoning;\n /** Counts/allowlisted labels only; reported calls do not prove server or skill loading. */\n resources: TurnResourceEvidence;\n}\n\nexport interface TurnReasoning {\n /** Blocks with text. */\n shown: number;\n /** Blocks the provider withheld (redacted markers). */\n hidden: number;\n /** Summed over blocks that reported a duration; null when none did. */\n durationMs: number | null;\n /** Summed reasoning tokens (the CLI's estimate, else ~chars/4); null when nothing to count. */\n tokens: number | null;\n}\n\nexport interface TurnModel {\n turns: TurnBlock[];\n /** Facts keyed by toolUseId, so the cards do not re-derive them. */\n facts: Map<string, ToolFacts>;\n /** Every error anchor in document order — the transcript-level jump list. */\n errorAnchors: string[];\n}\n\n/** DOM id for a note (error / stopped / turn-done) so it can be scrolled to. */\nexport function noteAnchorId(key: string): string {\n return `verse-note-${key.replace(/[^A-Za-z0-9_-]/g, '')}`;\n}\n\n/** DOM id for one turn section. */\nexport function turnAnchorId(key: string): string {\n return `verse-turn-${key.replace(/[^A-Za-z0-9_-]/g, '')}`;\n}\n\nconst STRENGTH: Record<TurnFileEntry['action'], number> = { read: 0, edit: 1, create: 2, delete: 3 };\n\n/**\n * Additions/deletions for a unified diff, summed across every file in it.\n *\n * This was a flat scan that skipped any line starting with `---` or `+++` as a\n * file header. Inside a hunk those prefixes are CONTENT, not structure: a\n * deleted line reading `-- a/x` is emitted as `--- a/x`, a Markdown `---` rule\n * deleted is `----`, and a diff of a diff — what editing a `.patch` fixture or\n * running `git diff` over one produces — is made almost entirely of them. Every\n * such line was dropped, so the `+N −M` on the collapsed tool card undercounted\n * exactly the changes that are hardest to eyeball.\n *\n * Delegating to the shared parser (`routes/inbox/diff-parser.ts`) fixes that\n * and retires the second diff dialect: `DiffBlock` renders `file.additions` /\n * `file.deletions` out of this same parse, so the badge on the summary line and\n * the stats in the expanded block are now the same numbers by construction\n * rather than by two implementations happening to agree.\n *\n * Cost is real but bounded and paid once: `cachedDiffCounts` memoizes by\n * `toolUseId`, and the text is capped at `MAX_FACT_TEXT_CHARS` upstream.\n */\nexport function countDiffLines(text: string): { additions: number; deletions: number } {\n let additions = 0;\n let deletions = 0;\n for (const file of parseUnifiedDiff(text).files) {\n additions += file.additions;\n deletions += file.deletions;\n }\n return { additions, deletions };\n}\n\n/** `countDiffLines` over text that cannot change once cached. */\nfunction cachedDiffCounts(\n toolUseId: string,\n text: string,\n cache: TurnCache | null,\n): { additions: number; deletions: number } {\n const hit = cache?.counts.get(toolUseId);\n if (hit) return hit;\n const counts = countDiffLines(text);\n cache?.counts.set(toolUseId, counts);\n return counts;\n}\n\nfunction thinkingMembers(item: TranscriptRenderItem): Array<Extract<TranscriptItem, { kind: 'thinking' }>> {\n if (item.kind === 'thinking') return [item];\n if (item.kind === 'toolGroup') {\n return (item as ToolGroupItem).items.filter((m): m is Extract<TranscriptItem, { kind: 'thinking' }> => m.kind === 'thinking');\n }\n return [];\n}\n\nfunction toolMembers(item: TranscriptRenderItem): Array<Extract<TranscriptItem, { kind: 'tool' }>> {\n if (item.kind === 'tool') return [item];\n if (item.kind === 'toolGroup') {\n return (item as ToolGroupItem).items.filter((m): m is Extract<TranscriptItem, { kind: 'tool' }> => m.kind === 'tool');\n }\n return [];\n}\n\n/**\n * A new turn opens on a `user` item, or on any item whose turnId differs\n * from the one being accumulated. Items that arrive before the first user\n * message (a resumed session's tail, a session-level error with a null\n * turnId) collect into a leading block rather than being dropped.\n */\nexport function buildTurns(\n items: readonly TranscriptRenderItem[],\n cache: TurnCache | null = null,\n): TurnModel {\n const facts = new Map<string, ToolFacts>();\n const errorAnchors: string[] = [];\n const turns: TurnBlock[] = [];\n\n let current: TranscriptRenderItem[] = [];\n const flush = () => {\n if (current.length === 0) return;\n turns.push(makeTurn(current, facts, errorAnchors, cache));\n current = [];\n };\n\n let turnId: string | null | undefined;\n for (const item of items) {\n const itemTurn = 'turnId' in item ? item.turnId : null;\n const boundary = item.kind === 'user' || (turnId !== undefined && itemTurn !== null && itemTurn !== turnId);\n if (boundary) flush();\n if (item.kind === 'user' || turnId === undefined || itemTurn !== null) turnId = itemTurn;\n current.push(item);\n }\n flush();\n\n return { turns, facts, errorAnchors };\n}\n\nfunction makeTurn(\n items: TranscriptRenderItem[],\n facts: Map<string, ToolFacts>,\n errorAnchors: string[],\n cache: TurnCache | null,\n): TurnBlock {\n const first = items[0]!;\n const byPath = new Map<string, TurnFileEntry>();\n let toolCount = 0;\n let commandCount = 0;\n let errorCount = 0;\n let firstErrorAnchor: string | null = null;\n let status: TurnStatus = 'running';\n let durationMs: number | null = null;\n let prompt: string | null = null;\n\n const sources: VerseSource[] = [];\n const stats = emptyTurnStats();\n const reasoning: TurnReasoning = { shown: 0, hidden: 0, durationMs: null, tokens: null };\n const resources = emptyResourceEvidence();\n let playbooks = 0;\n\n const noteError = (anchor: string) => {\n errorCount++;\n if (!firstErrorAnchor) firstErrorAnchor = anchor;\n errorAnchors.push(anchor);\n };\n\n for (const item of items) {\n if (item.kind === 'user' && prompt === null) prompt = item.text;\n if (item.kind === 'user' && item.playbook) playbooks++;\n\n for (const thought of thinkingMembers(item)) {\n const hidden = thought.redacted || thought.text.trim().length === 0;\n if (hidden) reasoning.hidden++;\n else reasoning.shown++;\n if (thought.durationMs !== null) reasoning.durationMs = (reasoning.durationMs ?? 0) + thought.durationMs;\n const tokens = thought.estimatedTokens ?? (hidden ? null : Math.ceil(thought.text.trim().length / 4));\n if (tokens !== null) reasoning.tokens = (reasoning.tokens ?? 0) + tokens;\n }\n if (item.kind === 'source' && item.turnId !== null) sources.push(item.source);\n\n for (const tool of toolMembers(item)) {\n toolCount++;\n const fact = cachedToolFacts(tool, cache);\n addReportedTool(resources, cachedReportedTool(toolCacheKey(tool), tool.name, fact, cache?.resources ?? null));\n facts.set(tool.toolUseId, fact);\n if (fact.action === 'command') commandCount++;\n if (fact.failed) noteError(`verse-tool-${tool.toolUseId.replace(/[^A-Za-z0-9_-]/g, '')}`);\n for (const source of fact.sources) sources.push(source.toolUseId ? source : { ...source, toolUseId: tool.toolUseId });\n tallyAction(stats, fact);\n\n const action = fact.action;\n if (action !== 'read' && action !== 'edit' && action !== 'create' && action !== 'delete') continue;\n const counts = fact.diff ? cachedDiffCounts(toolCacheKey(tool), fact.diff.text, cache) : { additions: 0, deletions: 0 };\n for (const path of fact.paths) {\n const entry = byPath.get(path) ?? {\n path,\n reads: 0, edits: 0, creates: 0, deletes: 0,\n action,\n anchorToolUseId: tool.toolUseId,\n additions: 0, deletions: 0,\n failed: false,\n };\n if (action === 'read') entry.reads++;\n else if (action === 'edit') entry.edits++;\n else if (action === 'create') entry.creates++;\n else entry.deletes++;\n if (STRENGTH[action] > STRENGTH[entry.action]) {\n entry.action = action;\n // The row should land on the call that CHANGED the file, not on the\n // read that happened to come first.\n entry.anchorToolUseId = tool.toolUseId;\n }\n if (action !== 'read') {\n entry.additions += counts.additions;\n entry.deletions += counts.deletions;\n }\n if (fact.failed) entry.failed = true;\n byPath.set(path, entry);\n }\n }\n\n switch (item.kind) {\n case 'error':\n noteError(noteAnchorId(item.key));\n status = 'error';\n break;\n case 'cancelled':\n status = 'stopped';\n break;\n case 'turn-done':\n durationMs = item.durationMs > 0 ? item.durationMs : durationMs;\n // A stop already explained itself; `ok:false` after it is not a\n // second failure (the same rule Transcript's `explained` set uses).\n if (item.ok) status = status === 'running' ? 'ok' : status;\n else if (status === 'running') {\n status = 'error';\n noteError(noteAnchorId(item.key));\n }\n break;\n default:\n break;\n }\n }\n\n let additions = 0;\n let deletions = 0;\n for (const entry of byPath.values()) {\n if (entry.action === 'read') stats.filesRead++;\n else if (entry.action === 'edit') stats.filesEdited++;\n else if (entry.action === 'create') stats.filesCreated++;\n else stats.filesDeleted++;\n additions += entry.additions;\n deletions += entry.deletions;\n }\n if (additions > 0 || deletions > 0) {\n stats.additions = additions;\n stats.deletions = deletions;\n }\n const citations = collateSources(sources);\n setResourceContext(resources, citations.length, playbooks);\n stats.sources = citations.length;\n stats.thoughts = reasoning.shown;\n stats.hiddenThoughts = reasoning.hidden;\n\n return {\n key: first.key,\n turnId: 'turnId' in first ? first.turnId : null,\n items,\n prompt,\n at: first.at,\n citations,\n stats,\n work: describeTurnWork(stats),\n reasoning,\n resources,\n // Strongest action first. The map is in first-touch order, and an agentic\n // turn reads widely before editing narrowly — so in read order the three\n // edits in a 40-file turn sit behind \"Show 35 more files\", hiding exactly\n // the rows whose `+N −M` justified the summary in the first place.\n files: [...byPath.values()].sort(\n (a, b) =>\n STRENGTH[b.action] - STRENGTH[a.action] ||\n b.additions + b.deletions - (a.additions + a.deletions) ||\n a.path.localeCompare(b.path),\n ),\n toolCount,\n commandCount,\n errorCount,\n firstErrorAnchor,\n status,\n durationMs,\n };\n}\n\n/** Count one tool call into the turn's summary (files are counted from the per-path map). */\nfunction tallyAction(stats: VerseTurnStats, fact: ToolFacts): void {\n switch (fact.action) {\n case 'command':\n stats.commands++;\n if (fact.failed) stats.commandsFailed++;\n break;\n case 'search':\n stats.codeSearches++;\n break;\n case 'web':\n stats.webLookups++;\n break;\n case 'task':\n stats.subagents++;\n break;\n case 'other':\n stats.otherTools++;\n break;\n default:\n break;\n }\n if (fact.failed) stats.failed++;\n}\n\n/** `12 files · 4 edited, 8 read` — the one-line form for a collapsed summary. */\nexport function describeFiles(files: readonly TurnFileEntry[]): string {\n if (files.length === 0) return '';\n const counts = { edited: 0, created: 0, deleted: 0, read: 0 };\n for (const file of files) {\n if (file.action === 'edit') counts.edited++;\n else if (file.action === 'create') counts.created++;\n else if (file.action === 'delete') counts.deleted++;\n else counts.read++;\n }\n const parts: string[] = [];\n if (counts.created) parts.push(`${counts.created} created`);\n if (counts.edited) parts.push(`${counts.edited} edited`);\n if (counts.deleted) parts.push(`${counts.deleted} deleted`);\n if (counts.read) parts.push(`${counts.read} read`);\n return parts.join(', ');\n}\n\n// ---------------------------------------------------------------------------\n// In-session search\n// ---------------------------------------------------------------------------\n\n/**\n * Everything in a turn that is worth searching, flattened once and cached on\n * the turn object. A rebuilt transcript produces new objects, so the WeakMap\n * lets the old strings go with them.\n */\nconst SEARCH_TEXT = new WeakMap<TurnBlock, string>();\n\n/** Per tool call — a build log should not make one turn megabytes of index. */\nconst TOOL_TEXT_LIMIT = 4000;\n\n/**\n * One tool call flattened for search. Cached by `toolUseId` under the same\n * immutability rule as the facts: `JSON.stringify` of a 4000-char payload per\n * call per keystroke is what made an active query cost the whole session.\n */\nfunction toolSearchText(\n item: Extract<TranscriptItem, { kind: 'tool' }>,\n cache: TurnCache | null,\n): string {\n const key = toolCacheKey(item);\n const hit = cache?.toolText.get(key);\n if (hit !== undefined) return hit;\n const parts: string[] = [item.name];\n if (typeof item.input === 'string') parts.push(item.input.slice(0, TOOL_TEXT_LIMIT));\n else if (item.input) {\n try {\n parts.push(JSON.stringify(item.input).slice(0, TOOL_TEXT_LIMIT));\n } catch {\n /* a payload that will not stringify simply is not searchable */\n }\n }\n if (item.result) parts.push(item.result.output.slice(0, TOOL_TEXT_LIMIT));\n const text = parts.join('\\n');\n // Only cache a finished call: a pending one's output is still to come.\n if (cache && item.result) cache.toolText.set(key, text);\n return text;\n}\n\nexport function turnSearchText(turn: TurnBlock, cache: TurnCache | null = null): string {\n const cached = SEARCH_TEXT.get(turn);\n if (cached !== undefined) return cached;\n const parts: string[] = [];\n const visit = (item: TranscriptRenderItem | TranscriptItem): void => {\n switch (item.kind) {\n case 'user':\n case 'assistant':\n case 'thinking':\n parts.push(item.text);\n break;\n case 'error':\n parts.push(item.message);\n break;\n case 'tool':\n parts.push(toolSearchText(item, cache));\n break;\n case 'toolGroup':\n for (const member of (item as ToolGroupItem).items) visit(member);\n break;\n default:\n break;\n }\n };\n for (const item of turn.items) visit(item);\n const text = parts.join('\\n');\n SEARCH_TEXT.set(turn, text);\n return text;\n}\n\nexport interface TurnMatch {\n turnKey: string;\n /** Text around the first hit, for the outline row. */\n snippet: string;\n}\n\nconst SNIPPET_PAD = 48;\n\n/** Case-insensitive substring search across every turn, in document order. */\nexport function searchTurns(\n turns: readonly TurnBlock[],\n query: string,\n cache: TurnCache | null = null,\n): TurnMatch[] {\n const needle = query.trim().toLowerCase();\n if (needle.length === 0) return [];\n const out: TurnMatch[] = [];\n for (const turn of turns) {\n const haystack = turnSearchText(turn, cache);\n const at = haystack.toLowerCase().indexOf(needle);\n if (at === -1) continue;\n const from = Math.max(0, at - SNIPPET_PAD);\n const to = Math.min(haystack.length, at + needle.length + SNIPPET_PAD);\n const snippet = `${from > 0 ? '…' : ''}${haystack.slice(from, to).replace(/\\s+/g, ' ').trim()}${to < haystack.length ? '…' : ''}`;\n out.push({ turnKey: turn.key, snippet });\n }\n return out;\n}\n\n/** Turn title for the outline: the ask, trimmed to one line. */\nexport function turnTitle(turn: TurnBlock, max = 72): string {\n const source = turn.prompt?.replace(/\\s+/g, ' ').trim();\n if (source) return source.length > max ? `${source.slice(0, max - 1)}…` : source;\n if (turn.toolCount > 0) return `${turn.toolCount} tool call${turn.toolCount === 1 ? '' : 's'}`;\n return 'Session note';\n}\n","/**\n * routes/verse/reasoning/sources-queries.ts — the write behind a transcript\n * turn's \"Sources\" list (core/verse/sources-api.ts).\n *\n * POST /api/verse/sources/open {sessionId, path, line?} → {ok} (editor at a line)\n *\n * The server confines `path` to the chat's own folders; a refusal surfaces as\n * the apiPost error. Pulls the held mutation token and touches the hold.\n */\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { apiPost } from '../../../data/client.js';\nimport { VerseMutationLockedError } from '../verse-queries.js';\n\nexport const SOURCES_OPEN_PATH = '/api/verse/sources/open';\n\nfunction token(): string {\n const t = getMutationToken();\n if (!t) throw new VerseMutationLockedError();\n return t;\n}\n\nexport async function openSourceFile(sessionId: string, path: string, line?: number): Promise<void> {\n await apiPost<{ ok: true }>(SOURCES_OPEN_PATH, line === undefined ? { sessionId, path } : { sessionId, path, line }, token());\n touchMutationHold();\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{i as e}from"./index-BC5Uslm5.js";import{H as t,O as n,S as r,V as i,j as a,w as o}from"./global-w7KDTTi0.js";var s=[`runs`,`swarms`,`inbox`,`daemon`,`daemon-observation`,`fleet-activity-ping`,`fleet-activity-observation`,`snapshot`,`session-expired`],c={runs:[`runs`],swarms:[`swarms`],inbox:[`inbox`],daemon:[`daemon`,`control-snapshot`,`verse-control`,`verse-usage-control`,`verse-caps`],"daemon-observation":[`daemon`,`control-snapshot`,`verse-control`,`verse-usage-control`,`verse-caps`],"fleet-activity-ping":[`fleet-activity`,`fleet`],"fleet-activity-observation":[`fleet-activity`,`fleet`],snapshot:[`dashboard-snapshot`,`agent-os-snapshot`],"session-expired":[]},l=new Map,u=null,d=null,f=0;function p(){return Math.min(1e3*2**f,15e3)}function m(){u&&=(u.close(),null),d&&=(clearTimeout(d),null)}function h(){d||=setTimeout(()=>{d=null,f+=1,g()},p())}function g(){if(e()){m();return}if(r().phase!==`authenticated`)return;m();let a=`/api/events?client=${encodeURIComponent(o())}`,d=new EventSource(a,{withCredentials:!0});u=d,d.onopen=()=>{f=0};for(let e of s)d.addEventListener(e,r=>{let a=r,o;try{o=JSON.parse(a.data)}catch{o=void 0}for(let t of c[e])i(t);e===`inbox`&&(t(`inbox-list:`),t(`proposal-detail-`)),e===`session-expired`&&n();let s=l.get(e);if(s)for(let e of s)e(o)});d.onerror=()=>{d.close(),u===d&&(u=null),r().phase===`authenticated`&&h()}}function _(e,t){let n=l.get(e);return n||(n=new Set,l.set(e,n)),n.add(t),()=>n.delete(t)}a(()=>{r().phase===`authenticated`?(f=0,g()):m()}),r().phase===`authenticated`&&g();export{s as SSE_EVENT_NAMES,_ as onSseEvent};
2
+ //# sourceMappingURL=sse-Z3U8XhDI.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sse-Z3U8XhDI.js","names":[],"sources":["../../../../../../src/web-ui/data/sse.ts"],"sourcesContent":["/**\n * data/sse.ts — the live channel. One EventSource against /api/events for\n * the whole app, fanning out NAMED events (see api.ts handleSseEvents:\n * 'runs' | 'swarms' | 'inbox' | 'daemon' | 'daemon-observation' |\n * 'fleet-activity-ping' | 'fleet-activity-observation' | 'snapshot') to\n * subscribers, and invalidating the matching cache key so any mounted\n * useQuery(key) re-fetches in the background.\n *\n * The server polls disk at a fixed interval (api.ts SSE_POLL_MS, ~1.5s at\n * time of writing) — that is the real latency floor for \"live\". This layer\n * does not, and should not, try to beat that; it just makes sure the UI\n * never polls MORE often than the server already pushes.\n */\nimport { getReadClientProof, getAuthSnapshot, reportSessionExpired, subscribeAuth } from './auth-store.js';\nimport { invalidate, invalidatePrefix } from './cache.js';\nimport { isScopedConsolePath } from '../app/console-mode.js';\n\nexport const SSE_EVENT_NAMES = [\n 'runs',\n 'swarms',\n 'inbox',\n 'daemon',\n 'daemon-observation',\n 'fleet-activity-ping',\n 'fleet-activity-observation',\n 'snapshot',\n 'session-expired',\n] as const;\nexport type SseEventName = (typeof SSE_EVENT_NAMES)[number];\n\n/** Cache keys (see data/queries.ts) invalidated when a given SSE event fires. */\nconst EVENT_TO_CACHE_KEYS: Record<SseEventName, string[]> = {\n runs: ['runs'],\n swarms: ['swarms'],\n inbox: ['inbox'],\n // 'daemon' was previously mapped but nothing subscribed to a 'daemon'-keyed\n // query (control/daemon didn't exist yet) — now daemonObservationQuery\n // (data/queries.ts) does. Also refreshing 'control-snapshot' here so\n // /control/daemon and /control/security (both read off controlSnapshotQuery)\n // stay live on the same daemon-tick cadence instead of only on page load.\n // `/api/verse/control` and `/api/verse/audit` ARE the daemon projection, so\n // they ride the same signal. Without this the Autonomy cockpit — running\n // state, last tick outcome, today's spend against the cap — was frozen at\n // whatever was true when the section mounted, and DEFAULT_QUERY_FRESH_MS\n // then made a rail switch away and back inside 10s a no-op too.\n //\n // Deliberately NOT a coarse `verse-` prefix sweep: `verse-usage-accounts`\n // and `verse-usage-local-models` spawn provider probes, and firing those on\n // every daemon tick would turn a liveness fix into a process storm. Those\n // two poll on their own visibility-gated 30s cadence in UsageSection,\n // matching the collector's cycle.\n daemon: ['daemon', 'control-snapshot', 'verse-control', 'verse-usage-control', 'verse-caps'],\n 'daemon-observation': ['daemon', 'control-snapshot', 'verse-control', 'verse-usage-control', 'verse-caps'],\n // fleet-activity pings are the closest live signal fleet state changed;\n // 'fleet' (fleetStatusQuery, /control/fleet's queue depth + lease health)\n // has no dedicated SSE event of its own, so it rides these instead of only\n // refreshing on mount.\n 'fleet-activity-ping': ['fleet-activity', 'fleet'],\n 'fleet-activity-observation': ['fleet-activity', 'fleet'],\n // Agent OS snapshots are immutable records but their current authenticated\n // projection advances alongside the server's general snapshot signal.\n snapshot: ['dashboard-snapshot', 'agent-os-snapshot'],\n 'session-expired': [],\n};\n\ntype RawListener = (payload: unknown) => void;\nconst rawListeners = new Map<SseEventName, Set<RawListener>>();\n\nlet source: EventSource | null = null;\nlet reconnectTimer: ReturnType<typeof setTimeout> | null = null;\nlet reconnectAttempt = 0;\n\nfunction backoffMs(): number {\n // 1s, 2s, 4s, 8s, capped at 15s — the server's own poll floor is ~1.5s so\n // there is no benefit reconnecting faster than that even on attempt 0.\n return Math.min(1000 * 2 ** reconnectAttempt, 15_000);\n}\n\nfunction teardown(): void {\n if (source) {\n source.close();\n source = null;\n }\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n}\n\nfunction scheduleReconnect(): void {\n if (reconnectTimer) return;\n reconnectTimer = setTimeout(() => {\n reconnectTimer = null;\n reconnectAttempt += 1;\n connect();\n }, backoffMs());\n}\n\nfunction connect(): void {\n // Shared hooks import this module, but the dedicated console has no global\n // Hub event channel. Check on every reconnect, not just the initial import.\n if (isScopedConsolePath()) { teardown(); return; }\n if (getAuthSnapshot().phase !== 'authenticated') return;\n teardown();\n\n const url = `/api/events?client=${encodeURIComponent(getReadClientProof())}`;\n const es = new EventSource(url, { withCredentials: true });\n source = es;\n\n es.onopen = () => {\n reconnectAttempt = 0;\n };\n\n for (const name of SSE_EVENT_NAMES) {\n es.addEventListener(name, (evt) => {\n const messageEvent = evt as MessageEvent<string>;\n let payload: unknown = undefined;\n try {\n payload = JSON.parse(messageEvent.data);\n } catch {\n payload = undefined;\n }\n for (const key of EVENT_TO_CACHE_KEYS[name]) invalidate(key);\n if (name === 'inbox') {\n // Parameterized inbox queries (one cache key per filter combo / per\n // proposal id) aren't in EVENT_TO_CACHE_KEYS's static map — sweep\n // both prefixes so the list (any filter) and any open detail view\n // (proposalDetailQuery, data/queries.ts) live-update on the same\n // 'inbox' event as the unfiltered badge.\n invalidatePrefix('inbox-list:');\n invalidatePrefix('proposal-detail-');\n }\n if (name === 'session-expired') reportSessionExpired();\n const listeners = rawListeners.get(name);\n if (listeners) for (const l of listeners) l(payload);\n });\n }\n\n es.onerror = () => {\n // EventSource auto-retries on its own, but its built-in retry delay is\n // opaque and can hammer a server that just lost its read session. Close\n // it and drive reconnection ourselves so we stop entirely once\n // auth-store reports the session as expired (see the subscribeAuth\n // wiring at the bottom of this file).\n es.close();\n if (source === es) source = null;\n if (getAuthSnapshot().phase === 'authenticated') scheduleReconnect();\n };\n}\n\n/** Subscribe to one named SSE event's raw payload (rarely needed directly —\n * most views should prefer useQuery + the cache-key mapping above). */\nexport function onSseEvent(name: SseEventName, listener: RawListener): () => void {\n let set = rawListeners.get(name);\n if (!set) {\n set = new Set();\n rawListeners.set(name, set);\n }\n set.add(listener);\n return () => set!.delete(listener);\n}\n\n// Connect once authenticated; disconnect the instant the session drops so a\n// stale connection never masks a 401 the rest of the app needs to react to.\nsubscribeAuth(() => {\n const phase = getAuthSnapshot().phase;\n if (phase === 'authenticated') {\n reconnectAttempt = 0;\n connect();\n } else {\n teardown();\n }\n});\n\n// Dynamic loading may finish after the session probe. Join the live feed in\n// that case too; otherwise it would wait for the next auth state change.\nif (getAuthSnapshot().phase === 'authenticated') connect();\n"],"mappings":"oHAiBA,IAAa,EAAkB,CAC7B,OACA,SACA,QACA,SACA,qBACA,sBACA,6BACA,WACA,iBACF,EAIM,EAAsD,CAC1D,KAAM,CAAC,MAAM,EACb,OAAQ,CAAC,QAAQ,EACjB,MAAO,CAAC,OAAO,EAiBf,OAAQ,CAAC,SAAU,mBAAoB,gBAAiB,sBAAuB,YAAY,EAC3F,qBAAsB,CAAC,SAAU,mBAAoB,gBAAiB,sBAAuB,YAAY,EAKzG,sBAAuB,CAAC,iBAAkB,OAAO,EACjD,6BAA8B,CAAC,iBAAkB,OAAO,EAGxD,SAAU,CAAC,qBAAsB,mBAAmB,EACpD,kBAAmB,CAAC,CACtB,EAGM,EAAe,IAAI,IAErB,EAA6B,KAC7B,EAAuD,KACvD,EAAmB,EAEvB,SAAS,GAAoB,CAG3B,OAAO,KAAK,IAAI,IAAO,GAAK,EAAkB,IAAM,CACtD,CAEA,SAAS,GAAiB,CACxB,AAEE,KADA,EAAO,MAAM,EACJ,MAEX,AAEE,KADA,aAAa,CAAc,EACV,KAErB,CAEA,SAAS,GAA0B,CAC7B,AACJ,IAAiB,eAAiB,CAChC,EAAiB,KACjB,GAAoB,EACpB,EAAQ,CACV,EAAG,EAAU,CAAC,CAChB,CAEA,SAAS,GAAgB,CAGvB,GAAI,EAAoB,EAAG,CAAE,EAAS,EAAG,MAAQ,CACjD,GAAI,EAAgB,CAAC,CAAC,QAAU,gBAAiB,OACjD,EAAS,EAET,IAAM,EAAM,sBAAsB,mBAAmB,EAAmB,CAAC,IACnE,EAAK,IAAI,YAAY,EAAK,CAAE,gBAAiB,EAAK,CAAC,EACzD,EAAS,EAET,EAAG,WAAe,CAChB,EAAmB,CACrB,EAEA,IAAK,IAAM,KAAQ,EACjB,EAAG,iBAAiB,EAAO,GAAQ,CACjC,IAAM,EAAe,EACjB,EACJ,GAAI,CACF,EAAU,KAAK,MAAM,EAAa,IAAI,CACxC,MAAQ,CACN,EAAU,IAAA,EACZ,CACA,IAAK,IAAM,KAAO,EAAoB,GAAO,EAAW,CAAG,EACvD,IAAS,UAMX,EAAiB,aAAa,EAC9B,EAAiB,kBAAkB,GAEjC,IAAS,mBAAmB,EAAqB,EACrD,IAAM,EAAY,EAAa,IAAI,CAAI,EACvC,GAAI,EAAW,IAAK,IAAM,KAAK,EAAW,EAAE,CAAO,CACrD,CAAC,EAGH,EAAG,YAAgB,CAMjB,EAAG,MAAM,EACL,IAAW,IAAI,EAAS,MACxB,EAAgB,CAAC,CAAC,QAAU,iBAAiB,EAAkB,CACrE,CACF,CAIA,SAAgB,EAAW,EAAoB,EAAmC,CAChF,IAAI,EAAM,EAAa,IAAI,CAAI,EAM/B,OALK,IACH,EAAM,IAAI,IACV,EAAa,IAAI,EAAM,CAAG,GAE5B,EAAI,IAAI,CAAQ,MACH,EAAK,OAAO,CAAQ,CACnC,CAIA,MAAoB,CACJ,EAAgB,CAAC,CAAC,QAClB,iBACZ,EAAmB,EACnB,EAAQ,GAER,EAAS,CAEb,CAAC,EAIG,EAAgB,CAAC,CAAC,QAAU,iBAAiB,EAAQ"}
@@ -0,0 +1,2 @@
1
+ import{C as e,M as t,V as n,a as r,i,t as a}from"./global-w7KDTTi0.js";import{O as o}from"./VerseShared-Bf-XTHCh.js";import{n as s}from"./control-queries-BG53otwz.js";var c=`/api/verse/authority`,l=`/api/verse/authority/draft`,u=`/api/verse/fleet/live`,d=`/api/verse/leader`,f=`/api/verse/learning`,p=`/api/verse/fleet/history?days=90`;function m(e=new Date){return`${p}&tz=${e.getTimezoneOffset()}`}var h=`/api/reasoning/digest?days=30`,g=`/api/verse/budget/history?days=8`,_=Object.freeze({authority:`verse-authority`,authorityDraft:`verse-authority-draft`,authorityEliteDraft:`verse-authority-draft-elite`,fleetLive:`verse-fleet-live`,leader:`verse-leader`,learning:`verse-learning`,fleetHistory:`verse-fleet-history-90d`,reasoningDigest:`verse-reasoning-digest-30d`,seatHistory:`verse-seat-history-8d`});function v(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var y={authority(e){return v(e)&&e.v===1&&typeof e.switch==`string`&&v(e.grant)?e:null},draft(e){return v(e)&&v(e.payload)&&typeof e.digest==`string`?e:null},fleetLive(e){return v(e)&&e.v===1&&Array.isArray(e.runs)&&Array.isArray(e.repos)&&Array.isArray(e.lanes)&&v(e.summary)?e:null},leader(e){return v(e)&&e.v===1&&Array.isArray(e.timeline)&&Array.isArray(e.actions)&&v(e.hitRate)?e:null},learning(e){return v(e)&&e.v===1&&Array.isArray(e.versions)&&Array.isArray(e.experiments)?e:null},activity(e){return v(e)&&Array.isArray(e.needsYou)&&Array.isArray(e.running)&&v(e.sources)?e:null},fleetHistory(e){return v(e)&&Array.isArray(e.days)&&v(e.sources)&&v(e.funnel)?e:null},reasoningDigest(e){return v(e)&&Array.isArray(e.insights)&&Array.isArray(e.trends)&&v(e.totals)?e:null},seatHistory(e){return v(e)&&e.v===1&&Array.isArray(e.series)?e:null}};function b(e,t){return t instanceof a?t.status===404?`${e} is not in this build yet, so this card has no source.`:t.status===503?`${e} failed to load on the server.`:t.detail&&t.status<500?/[.!?]$/.test(t.detail)?t.detail:`${t.detail}.`:`${e} answered HTTP ${t.status}.`:`${e} could not be reached.`}function x(e,t,n,r){return{key:e,fetch:async e=>{try{let n=r(await i(typeof t==`function`?t():t,e));return n===null?{value:null,available:!0,reason:`Unrecognized response — update Ashlr.`}:{value:n,available:!0,reason:null}}catch(e){if(e instanceof a&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{value:null,available:!1,reason:b(n,e),code:e instanceof a?e.code:null}}}}}var S=x(_.authority,c,`The authority service`,y.authority),C=x(_.authorityDraft,l,`The grant draft`,y.draft),w=x(_.authorityEliteDraft,`${l}?eliteDirect=1`,`The elite-direct grant draft`,y.draft),T=x(_.fleetLive,u,`The live fleet view`,y.fleetLive),E=x(_.leader,d,`The Leader`,y.leader),D=x(_.learning,f,`Self-improvement`,y.learning),O=x(_.fleetHistory,()=>m(),`Fleet history`,y.fleetHistory),k=x(_.reasoningDigest,h,`The reasoning digest`,y.reasoningDigest),A=x(_.seatHistory,g,`Seat history`,y.seatHistory);async function j(n,i){let a=e();if(!a)throw new s;let o=await r(n,i,a);return t(),o}async function M(e){let t=await j(c,e);return n(_.authority),n(_.fleetLive),o(),(e.action===`grant`||e.action===`re-approve`)&&(n(_.authorityDraft),n(_.authorityEliteDraft)),y.authority(t)}async function N(e){let t=await j(u,e);return n(_.fleetLive),o(),t}async function P(e){let t=await j(d,e);return n(_.leader),o(),t}async function F(e,t){if(!/^\/api\/[^\s\\]*$/.test(e)||e.startsWith(`//`)||e.includes(`..`))throw Error(`That action points outside this app, so it was not sent.`);let r=await j(e,t);return o(),n(_.fleetLive),n(_.leader),n(_.authority),r}export{S as a,E as c,M as d,N as f,A as g,k as h,w as i,D as l,F as m,_ as n,O as o,P as p,C as r,T as s,l as t,x as u};
2
+ //# sourceMappingURL=surface-data-hufdOfpz.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-data-hufdOfpz.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/command/surface-data.ts"],"sourcesContent":["/**\n * routes/verse/command/surface-data.ts — every read and write behind the\n * four 3.10 surfaces (Command, Fleet, Growth, Mind), in one place (unit C7).\n *\n * GET /api/verse/authority AuthorityStatusV1 (B-U1)\n * GET /api/verse/authority/draft AuthorityGrantDraft (B-U1)\n * POST /api/verse/authority AuthorityActionRequest\n * GET /api/verse/fleet/live FleetLiveSnapshotV1 (B-U5)\n * POST /api/verse/fleet/live FleetLiveActionRequest\n * GET /api/verse/leader LeaderStateV1 (B-U8)\n * POST /api/verse/leader LeaderActionRequest\n * GET /api/verse/learning LearningStateV1 (B-U9)\n * GET /api/verse/activity VerseActivityResponse (C1 — read through\n * the shell's ONE useActivity poll, never a\n * second loop from here)\n * GET /api/verse/fleet/history FleetHistoryResponse (A8)\n * GET /api/reasoning/digest ReasoningDigest (A7)\n * GET /api/verse/budget BudgetView (A9 — budget-queries.ts)\n * GET /api/verse/budget/history CapacityHistoryResponse (3.10.1 — recorded\n * seat window history for the burn-downs)\n * GET /api/models per-model ROI (data/queries.ts)\n *\n * WHY every read is OPTIONAL: Track B's modules land in parallel with these\n * surfaces (SPEC-310BC-COORD), and C0's mount answers 404 for a family that\n * has not landed. A 404 is \"this card has no source yet\", never \"Command is\n * broken\" — so a read resolves to `{ value: null, available: false, reason }`\n * and the card renders a designed not-available state from `reason`. A body\n * this client cannot narrow is treated the same way (available, but nothing\n * shown rather than guessed). 401 and aborts still propagate: an expired\n * read session is the whole app's state, not one card's.\n *\n * Writes pull the held mutation token (VerseControlLockedError without one —\n * the surfaces route every write through useGuardedAction, which opens the\n * token dialog first) and invalidate exactly the keys they change.\n */\nimport { ApiError, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport type { QueryDef } from '../../../data/queries.js';\nimport { VerseControlLockedError } from '../autonomy/control-queries.js';\nimport { refreshActivity } from '../shell/useActivity.js';\nimport type { OptionalFleetRead } from '../autonomy/fleet-contract.js';\nimport type {\n AuthorityActionRequest,\n AuthorityGrantDraft,\n AuthorityStatusV1,\n} from '../../../../core/authority/types.js';\nimport type { FleetLiveActionRequest, FleetLiveSnapshotV1 } from '../../../../core/fleet/fleet-types.js';\nimport type { LeaderActionRequest, LeaderStateV1 } from '../../../../core/vision/leader-types.js';\nimport type { LearningStateV1 } from '../../../../core/learn/harness-types.js';\nimport type { VerseActivityResponse } from '../../../../core/verse/workbench-types.js';\nimport type { FleetHistoryResponse } from '../../../../core/verse/fleet-history-types.js';\nimport type { ReasoningDigest } from '../../../../core/reasoning/types.js';\nimport type { CapacityHistoryResponse } from '../../../../core/routing/capacity-history-types.js';\n\n/** A read that is allowed to be absent (the autonomy folder's shape, reused). */\nexport type OptionalRead<T> = OptionalFleetRead<T>;\n\nexport const AUTHORITY_PATH = '/api/verse/authority';\nexport const AUTHORITY_DRAFT_PATH = '/api/verse/authority/draft';\nexport const FLEET_LIVE_PATH = '/api/verse/fleet/live';\nexport const LEADER_PATH = '/api/verse/leader';\nexport const LEARNING_PATH = '/api/verse/learning';\nexport const FLEET_HISTORY_PATH = '/api/verse/fleet/history?days=90';\n\n/**\n * FLEET_HISTORY_PATH plus the viewer's zone (`tz`, Date#getTimezoneOffset\n * minutes, which the route accepts). Without it the server bucketed runs by\n * the UTC day (tz defaults to 0), so a Sep 25 evening's runs sat in a\n * \"Sep 26\" column west of UTC. Read at fetch time, so a DST change between\n * polls is picked up.\n */\nexport function fleetHistoryPath(now: Date = new Date()): string {\n return `${FLEET_HISTORY_PATH}&tz=${now.getTimezoneOffset()}`;\n}\nexport const REASONING_DIGEST_PATH = '/api/reasoning/digest?days=30';\n/** Eight days: the whole weekly window plus the day before it opened. */\nexport const SEAT_HISTORY_PATH = '/api/verse/budget/history?days=8';\n\nexport const SURFACE_KEYS = Object.freeze({\n authority: 'verse-authority',\n authorityDraft: 'verse-authority-draft',\n authorityEliteDraft: 'verse-authority-draft-elite',\n fleetLive: 'verse-fleet-live',\n leader: 'verse-leader',\n learning: 'verse-learning',\n fleetHistory: 'verse-fleet-history-90d',\n reasoningDigest: 'verse-reasoning-digest-30d',\n seatHistory: 'verse-seat-history-8d',\n});\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * Structural guards: just enough to know the body is the contract's shape\n * (version tag + the arrays the cards iterate), so a mismatched server can\n * never crash a render with `undefined.map`. Field-level honesty (null =\n * unknown) is the cards' job.\n */\nexport const narrow = {\n authority(raw: unknown): AuthorityStatusV1 | null {\n return isRecord(raw) && raw['v'] === 1 && typeof raw['switch'] === 'string' && isRecord(raw['grant']) ? (raw as unknown as AuthorityStatusV1) : null;\n },\n draft(raw: unknown): AuthorityGrantDraft | null {\n return isRecord(raw) && isRecord(raw['payload']) && typeof raw['digest'] === 'string' ? (raw as unknown as AuthorityGrantDraft) : null;\n },\n fleetLive(raw: unknown): FleetLiveSnapshotV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['runs']) && Array.isArray(raw['repos']) && Array.isArray(raw['lanes']) && isRecord(raw['summary'])\n ? (raw as unknown as FleetLiveSnapshotV1)\n : null;\n },\n leader(raw: unknown): LeaderStateV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['timeline']) && Array.isArray(raw['actions']) && isRecord(raw['hitRate'])\n ? (raw as unknown as LeaderStateV1)\n : null;\n },\n learning(raw: unknown): LearningStateV1 | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['versions']) && Array.isArray(raw['experiments']) ? (raw as unknown as LearningStateV1) : null;\n },\n activity(raw: unknown): VerseActivityResponse | null {\n return isRecord(raw) && Array.isArray(raw['needsYou']) && Array.isArray(raw['running']) && isRecord(raw['sources']) ? (raw as unknown as VerseActivityResponse) : null;\n },\n fleetHistory(raw: unknown): FleetHistoryResponse | null {\n return isRecord(raw) && Array.isArray(raw['days']) && isRecord(raw['sources']) && isRecord(raw['funnel']) ? (raw as unknown as FleetHistoryResponse) : null;\n },\n reasoningDigest(raw: unknown): ReasoningDigest | null {\n return isRecord(raw) && Array.isArray(raw['insights']) && Array.isArray(raw['trends']) && isRecord(raw['totals']) ? (raw as unknown as ReasoningDigest) : null;\n },\n /** Series and points are re-checked one by one where they are merged (command-model mergeSeatHistory). */\n seatHistory(raw: unknown): CapacityHistoryResponse | null {\n return isRecord(raw) && raw['v'] === 1 && Array.isArray(raw['series']) ? (raw as unknown as CapacityHistoryResponse) : null;\n },\n};\n\n/** Operator words for a source that did not answer (never a path, never a trace). */\nfunction absence(what: string, err: unknown): string {\n if (err instanceof ApiError) {\n if (err.status === 404) return `${what} is not in this build yet, so this card has no source.`;\n if (err.status === 503) return `${what} failed to load on the server.`;\n // A refusal the route explained (409 with a sentence): say it, not the status.\n if (err.detail && err.status < 500) return /[.!?]$/.test(err.detail) ? err.detail : `${err.detail}.`;\n return `${what} answered HTTP ${err.status}.`;\n }\n return `${what} could not be reached.`;\n}\n\n/** A QueryDef whose value is an OptionalRead: 404 / unreachable / unrecognised all resolve, never throw. */\nexport function optionalQuery<T>(key: string, path: string | (() => string), what: string, guard: (raw: unknown) => T | null): QueryDef<OptionalRead<T>> {\n return {\n key,\n fetch: async (signal) => {\n try {\n const raw = await apiGet<unknown>(typeof path === 'function' ? path() : path, signal);\n const value = guard(raw);\n if (value === null) {\n // Nothing is shown rather than guessed from an unknown shape.\n return { value: null, available: true, reason: 'Unrecognized response — update Ashlr.' };\n }\n return { value, available: true, reason: null };\n } catch (err) {\n if (err instanceof ApiError && err.status === 401) throw err;\n if (err instanceof DOMException && err.name === 'AbortError') throw err;\n return { value: null, available: false, reason: absence(what, err), code: err instanceof ApiError ? err.code : null };\n }\n },\n };\n}\n\nexport const authorityQuery = optionalQuery(SURFACE_KEYS.authority, AUTHORITY_PATH, 'The authority service', narrow.authority);\nexport const authorityDraftQuery = optionalQuery(SURFACE_KEYS.authorityDraft, AUTHORITY_DRAFT_PATH, 'The grant draft', narrow.draft);\n/** 3.15: the same draft with the one `elite-direct` rung (elite models land on green tests, no judge). */\nexport const authorityEliteDraftQuery = optionalQuery(SURFACE_KEYS.authorityEliteDraft, `${AUTHORITY_DRAFT_PATH}?eliteDirect=1`, 'The elite-direct grant draft', narrow.draft);\nexport const fleetLiveQuery = optionalQuery(SURFACE_KEYS.fleetLive, FLEET_LIVE_PATH, 'The live fleet view', narrow.fleetLive);\nexport const leaderQuery = optionalQuery(SURFACE_KEYS.leader, LEADER_PATH, 'The Leader', narrow.leader);\nexport const learningQuery = optionalQuery(SURFACE_KEYS.learning, LEARNING_PATH, 'Self-improvement', narrow.learning);\nexport const fleetHistoryQuery = optionalQuery(SURFACE_KEYS.fleetHistory, () => fleetHistoryPath(), 'Fleet history', narrow.fleetHistory);\nexport const reasoningDigestQuery = optionalQuery(SURFACE_KEYS.reasoningDigest, REASONING_DIGEST_PATH, 'The reasoning digest', narrow.reasoningDigest);\n/** Optional like every surface read: a server without the route leaves the burn-downs on this page's own readings. */\nexport const seatHistoryQuery = optionalQuery(SURFACE_KEYS.seatHistory, SEAT_HISTORY_PATH, 'Seat history', narrow.seatHistory);\n\n// ---------------------------------------------------------------------------\n// Writes\n// ---------------------------------------------------------------------------\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new VerseControlLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\n/**\n * One authority action. The server answers the new AuthorityStatusV1 for\n * every form; raising past the grant is its 409 `grant-required` (the page\n * opens the Touch ID sheet BEFORE ever sending that, but the server is the\n * authority — a stale page gets the refusal, not a raise).\n */\nexport async function postAuthority(action: AuthorityActionRequest): Promise<AuthorityStatusV1 | null> {\n const result = await post<unknown>(AUTHORITY_PATH, action);\n invalidate(SURFACE_KEYS.authority);\n invalidate(SURFACE_KEYS.fleetLive);\n void refreshActivity();\n if (action.action === 'grant' || action.action === 're-approve') {\n invalidate(SURFACE_KEYS.authorityDraft);\n invalidate(SURFACE_KEYS.authorityEliteDraft);\n }\n return narrow.authority(result);\n}\n\nexport async function postFleetLive(action: FleetLiveActionRequest): Promise<unknown> {\n const result = await post<unknown>(FLEET_LIVE_PATH, action);\n invalidate(SURFACE_KEYS.fleetLive);\n void refreshActivity();\n return result;\n}\n\nexport async function postLeader(action: LeaderActionRequest): Promise<unknown> {\n const result = await post<unknown>(LEADER_PATH, action);\n invalidate(SURFACE_KEYS.leader);\n void refreshActivity();\n return result;\n}\n\n/**\n * A Needs-you item's own action. `path` was validated by the producer\n * (isNeedsYouItem → isSafeApiRoute) and is re-checked here: the mutation\n * token must never be aimed anywhere but this origin's /api/.\n */\nexport async function postNeedsYouAction(path: string, body: Record<string, unknown>): Promise<unknown> {\n if (!/^\\/api\\/[^\\s\\\\]*$/.test(path) || path.startsWith('//') || path.includes('..')) {\n throw new Error('That action points outside this app, so it was not sent.');\n }\n const result = await post<unknown>(path, body);\n void refreshActivity();\n invalidate(SURFACE_KEYS.fleetLive);\n invalidate(SURFACE_KEYS.leader);\n invalidate(SURFACE_KEYS.authority);\n return result;\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{z as e}from"./global-w7KDTTi0.js";import{p as t}from"./queries-PgZlvFqO.js";import{T as n,w as r}from"./VerseShared-Bf-XTHCh.js";import{n as i}from"./verse-bootstrap-query-B3vFD9XK.js";import{n as a,t as o}from"./budget-queries-Nvx0H2XE.js";import{r as s}from"./cloud-queries-CsU54eNn.js";import{a as c,c as l,h as u,l as d,o as f,s as p}from"./surface-data-hufdOfpz.js";import{r as m}from"./overnight-queries-cjjogTzn.js";import{a as h,o as g}from"./thread-data-Cd2DZffn.js";import{n as _,r as v}from"./fleet-control-queries-BL-Vlf85.js";var y={command:[c,p,l,d,f,a,s,g,_],fleet:[p,c,m,a,o,_,v],growth:[f,d,t(`30d`),c,p],mind:[l,g,h,u,i,n,c,p],chat:[i,r,n]},b=6e4;async function x(t,n={}){let r=n.ensure??e;for(let e of y[t]??[])try{if(n.beforeEach&&!await n.beforeEach())return;await r(e.key,()=>e.fetch(),b)}catch{}}export{b as PREFETCH_FRESH_MS,y as SURFACE_PREFETCH,x as prefetchSurfaceData};
2
+ //# sourceMappingURL=surface-prefetch-CFtP8imB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-prefetch-CFtP8imB.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/shell/surface-prefetch.ts"],"sourcesContent":["/**\n * routes/verse/shell/surface-prefetch.ts — the reads each rail surface opens\n * with, so the shell can warm them while the operator is still reading chat\n * (shell/warmup.ts, once the operator is idle after first paint). A first\n * visit to Command, Fleet, Growth or Mind then paints from the cache instead\n * of a skeleton; the surface's own useQuery still refreshes whatever is older\n * than it accepts.\n *\n * LAZY ONLY. shell/warmup.ts loads this module with import(): these query\n * defs pull in the surfaces' data modules, none of which may cost chat\n * first-paint bytes (VerseApp.first-paint.test.ts pins it). The QueryDefs\n * themselves are the surfaces' own — same keys, same fetchers — so a warmed\n * entry IS the entry the surface reads.\n *\n * Keep each list in step with its surface's useQuery calls:\n * surface-prefetch.test.ts renders Command, Growth and Mind and fails when\n * they read something this table does not warm.\n */\nimport { ensureQuery } from '../../../data/cache.js';\nimport { modelsQuery, type QueryDef } from '../../../data/queries.js';\nimport { overnightQuery } from '../autonomy/overnight-queries.js';\nimport { budgetPreviewQuery, budgetQuery } from '../budget/budget-queries.js';\nimport { cloudQuery } from '../cloud/cloud-queries.js';\nimport {\n authorityQuery,\n fleetHistoryQuery,\n fleetLiveQuery,\n leaderQuery,\n learningQuery,\n reasoningDigestQuery,\n} from '../command/surface-data.js';\nimport { leaderDirectivesQuery, leaderThreadQuery } from '../leader/thread-data.js';\nimport { fleetControlQuery, fleetQueueQuery } from '../fleet/fleet-control-queries.js';\nimport { verseBootstrapQuery, verseSessionsQuery, verseWorkspacesQuery } from '../verse-queries.js';\nimport type { VerseSectionId } from '../verse-ui-store.js';\n\ntype AnyQuery = QueryDef<unknown>;\n\n/** What each rail surface reads the moment it mounts. */\nexport const SURFACE_PREFETCH: Readonly<Partial<Record<VerseSectionId, readonly AnyQuery[]>>> = {\n // No seat history: the burn-downs that drew it moved to Usage (audit 14);\n // Command's seat strip reads the budget and the rail's warm seat caches.\n // cloudQuery (3.11): the Cloud card's overview — without it a first visit\n // paints \"Reading the cloud lane…\" under the seat strip.\n // leaderThreadQuery: the Leader card's latest-message line (leader/LeaderLine).\n // fleetControlQuery (3.15): Command's one line about the fleet (fleet/FleetStatusLink).\n command: [authorityQuery, fleetLiveQuery, leaderQuery, learningQuery, fleetHistoryQuery, budgetQuery, cloudQuery, leaderThreadQuery, fleetControlQuery],\n // authorityQuery + fleetLiveQuery on Fleet, Growth and Mind: the shared\n // \"Autonomy is off\" state (autonomy/AutonomyOffState) reads both.\n // fleetControlQuery + fleetQueueQuery (3.15): the control surface and the steer panel.\n fleet: [fleetLiveQuery, authorityQuery, overnightQuery, budgetQuery, budgetPreviewQuery, fleetControlQuery, fleetQueueQuery],\n growth: [fleetHistoryQuery, learningQuery, modelsQuery('30d'), authorityQuery, fleetLiveQuery],\n // The conversation (leader/LeaderConversation) reads the thread and the directives.\n mind: [leaderQuery, leaderThreadQuery, leaderDirectivesQuery, reasoningDigestQuery, verseBootstrapQuery, verseWorkspacesQuery, authorityQuery, fleetLiveQuery],\n chat: [verseBootstrapQuery, verseSessionsQuery, verseWorkspacesQuery],\n};\n\n/**\n * A cached answer younger than this is left alone. The surfaces accept 10–60 s\n * old data on mount, so anything fresher than a minute is already as good as\n * a warm-up can make it.\n */\nexport const PREFETCH_FRESH_MS = 60_000;\n\ntype Ensure = (key: string, fetcher: () => Promise<unknown>, maxAgeMs: number) => Promise<void>;\n\nexport interface PrefetchOptions {\n /** The cache's mount path (a seam for tests). */\n ensure?: Ensure;\n /**\n * Awaited before EACH read (the warm-up's idle gate). Resolving false stops\n * the warm-up there — the gate was cancelled.\n */\n beforeEach?: () => Promise<boolean> | boolean;\n}\n\n/**\n * Warm one surface's reads through the shared cache (joins an in-flight read,\n * skips a fresh one, and goes through the cache's concurrency gate).\n *\n * ONE AT A TIME: each read is awaited before the next is even considered, so\n * the warm-up never holds more than one of the gate's slots, and the operator\n * (who gets the other three, and whose reads the next `beforeEach` waits out)\n * is never queued behind a burst of it.\n *\n * Never rejects: a read that fails leaves the surface to load it as it always did.\n */\nexport async function prefetchSurfaceData(id: VerseSectionId, options: PrefetchOptions = {}): Promise<void> {\n const ensure = options.ensure ?? ensureQuery;\n for (const def of SURFACE_PREFETCH[id] ?? []) {\n try {\n if (options.beforeEach && !(await options.beforeEach())) return;\n await ensure(def.key, () => def.fetch(), PREFETCH_FRESH_MS);\n } catch {\n // A warm-up read that fails (or cannot even start) is not worth surfacing.\n }\n }\n}\n"],"mappings":"kiBAuCA,IAAa,EAAmF,CAO9F,QAAS,CAAC,EAAgB,EAAgB,EAAa,EAAe,EAAmB,EAAa,EAAY,EAAmB,CAAiB,EAItJ,MAAO,CAAC,EAAgB,EAAgB,EAAgB,EAAa,EAAoB,EAAmB,CAAe,EAC3H,OAAQ,CAAC,EAAmB,EAAe,EAAY,KAAK,EAAG,EAAgB,CAAc,EAE7F,KAAM,CAAC,EAAa,EAAmB,EAAuB,EAAsB,EAAqB,EAAsB,EAAgB,CAAc,EAC7J,KAAM,CAAC,EAAqB,EAAoB,CAAoB,CACtE,EAOa,EAAoB,IAyBjC,eAAsB,EAAoB,EAAoB,EAA2B,CAAC,EAAkB,CAC1G,IAAM,EAAS,EAAQ,QAAU,EACjC,IAAK,IAAM,KAAO,EAAiB,IAAO,CAAC,EACzC,GAAI,CACF,GAAI,EAAQ,YAAc,CAAE,MAAM,EAAQ,WAAW,EAAI,OACzD,MAAM,EAAO,EAAI,QAAW,EAAI,MAAM,EAAG,CAAiB,CAC5D,MAAQ,CAER,CAEJ"}
@@ -0,0 +1,2 @@
1
+ import{C as e,M as t,a as n,i as r}from"./global-w7KDTTi0.js";import{ot as i}from"./VerseShared-Bf-XTHCh.js";var a=class extends Error{constructor(){super(`Unlock actions with the mutation token to use the terminal.`),this.name=`TerminalLockedError`}};async function o(r,i){let o=e();if(!o)throw new a;let s=await n(r,i,o);return t(),s}function s(e,t){return`${i}/${encodeURIComponent(e)}/${t}`}var c={list:e=>r(i,e),create:async e=>(await o(i,e)).tab,input:(e,t)=>o(s(e,`input`),{dataBase64:t}),resize:(e,t,n)=>o(s(e,`resize`),{cols:t,rows:n}),kill:async e=>{await o(s(e,`kill`),{})},openExternal:async(e,t)=>{await o(`${i}/open-external`,t===void 0?{sessionId:e}:{sessionId:e,root:t})}};function l(e,t){let n=Number.isSafeInteger(t)&&t>0?`?after=${t}`:``;return`${s(e,`stream`)}${n}`}function u(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function d(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function f(e){let t=e.replace(/\s+$/,``),n=Math.max(0,...Array.from(t.matchAll(/`+/g),e=>e[0].length)),r="`".repeat(Math.max(3,n+1));return`${r}\n${t}\n${r}`}export{c as a,f as i,d as n,l as o,u as r,a as t};
2
+ //# sourceMappingURL=terminal-client-CCSvMeEv.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-client-CCSvMeEv.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-client.ts"],"sourcesContent":["/**\n * dock/terminal/terminal-client.ts — the Terminal pane's HTTP calls (unit C4).\n *\n * Writes carry the held mutation token (auth-store), exactly like\n * verse-queries' writes; the stream is read with fetch() + the read-client\n * header rather than EventSource (see terminal-stream.ts for why).\n */\nimport type {\n VerseTerminalCreateRequest,\n VerseTerminalListResponse,\n VerseTerminalTab,\n} from '../../../../data/api-types.js';\nimport { getMutationToken, touchMutationHold } from '../../../../data/auth-store.js';\nimport { apiGet, apiPost } from '../../../../data/client.js';\nimport { VERSE_TERMINAL_PATH } from '../../../../../core/verse/workbench-types.js';\n\n/** Raised when a write is attempted with no mutation token held. */\nexport class TerminalLockedError extends Error {\n constructor() {\n super('Unlock actions with the mutation token to use the terminal.');\n this.name = 'TerminalLockedError';\n }\n}\n\nasync function post<T>(path: string, body: unknown): Promise<T> {\n const token = getMutationToken();\n if (!token) throw new TerminalLockedError();\n const result = await apiPost<T>(path, body, token);\n touchMutationHold();\n return result;\n}\n\nfunction tabPath(id: string, action: 'input' | 'resize' | 'kill' | 'stream'): string {\n return `${VERSE_TERMINAL_PATH}/${encodeURIComponent(id)}/${action}`;\n}\n\nexport interface TerminalApi {\n list(signal?: AbortSignal): Promise<VerseTerminalListResponse>;\n create(req: VerseTerminalCreateRequest): Promise<VerseTerminalTab>;\n input(id: string, dataBase64: string): Promise<void>;\n resize(id: string, cols: number, rows: number): Promise<void>;\n kill(id: string): Promise<void>;\n openExternal(sessionId: string, root?: string): Promise<void>;\n}\n\nexport const terminalApi: TerminalApi = {\n list: (signal) => apiGet<VerseTerminalListResponse>(VERSE_TERMINAL_PATH, signal),\n create: async (req) => (await post<{ tab: VerseTerminalTab }>(VERSE_TERMINAL_PATH, req)).tab,\n input: (id, dataBase64) => post<void>(tabPath(id, 'input'), { dataBase64 }),\n resize: (id, cols, rows) => post<void>(tabPath(id, 'resize'), { cols, rows }),\n kill: async (id) => { await post<unknown>(tabPath(id, 'kill'), {}); },\n openExternal: async (sessionId, root) => {\n await post<unknown>(`${VERSE_TERMINAL_PATH}/open-external`, root === undefined ? { sessionId } : { sessionId, root });\n },\n};\n\nexport function terminalStreamPath(id: string, after: number): string {\n const cursor = Number.isSafeInteger(after) && after > 0 ? `?after=${after}` : '';\n return `${tabPath(id, 'stream')}${cursor}`;\n}\n\n// ---------------------------------------------------------------------------\n// Bytes\n// ---------------------------------------------------------------------------\n\n/** Standard base64 of bytes (btoa over a binary string, chunked to stay off the arg-count limit). */\nexport function bytesToBase64(bytes: Uint8Array): string {\n let binary = '';\n for (let i = 0; i < bytes.length; i += 0x8000) {\n binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));\n }\n return btoa(binary);\n}\n\nexport function base64ToBytes(b64: string): Uint8Array {\n const binary = atob(b64);\n const out = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) out[i] = binary.charCodeAt(i);\n return out;\n}\n\n/**\n * The fence for \"Send selection to chat\": one backtick longer than the\n * longest run inside the text (at least three), so a selection that itself\n * contains a fenced block cannot close ours early.\n */\nexport function fenceSelection(text: string): string {\n const trimmed = text.replace(/\\s+$/, '');\n const longest = Math.max(0, ...Array.from(trimmed.matchAll(/`+/g), (m) => m[0].length));\n const fence = '`'.repeat(Math.max(3, longest + 1));\n return `${fence}\\n${trimmed}\\n${fence}`;\n}\n"],"mappings":"6GAiBA,IAAa,EAAb,cAAyC,KAAM,CAC7C,aAAc,CACZ,MAAM,6DAA6D,EACnE,KAAK,KAAO,qBACd,CACF,EAEA,eAAe,EAAQ,EAAc,EAA2B,CAC9D,IAAM,EAAQ,EAAiB,EAC/B,GAAI,CAAC,EAAO,MAAM,IAAI,EACtB,IAAM,EAAS,MAAM,EAAW,EAAM,EAAM,CAAK,EAEjD,OADA,EAAkB,EACX,CACT,CAEA,SAAS,EAAQ,EAAY,EAAwD,CACnF,MAAO,GAAG,EAAoB,GAAG,mBAAmB,CAAE,EAAE,GAAG,GAC7D,CAWA,IAAa,EAA2B,CACtC,KAAO,GAAW,EAAkC,EAAqB,CAAM,EAC/E,OAAQ,KAAO,KAAS,MAAM,EAAgC,EAAqB,CAAG,EAAA,CAAG,IACzF,OAAQ,EAAI,IAAe,EAAW,EAAQ,EAAI,OAAO,EAAG,CAAE,YAAW,CAAC,EAC1E,QAAS,EAAI,EAAM,IAAS,EAAW,EAAQ,EAAI,QAAQ,EAAG,CAAE,OAAM,MAAK,CAAC,EAC5E,KAAM,KAAO,IAAO,CAAE,MAAM,EAAc,EAAQ,EAAI,MAAM,EAAG,CAAC,CAAC,CAAG,EACpE,aAAc,MAAO,EAAW,IAAS,CACvC,MAAM,EAAc,GAAG,EAAoB,gBAAiB,IAAS,IAAA,GAAY,CAAE,WAAU,EAAI,CAAE,YAAW,MAAK,CAAC,CACtH,CACF,EAEA,SAAgB,EAAmB,EAAY,EAAuB,CACpE,IAAM,EAAS,OAAO,cAAc,CAAK,GAAK,EAAQ,EAAI,UAAU,IAAU,GAC9E,MAAO,GAAG,EAAQ,EAAI,QAAQ,IAAI,GACpC,CAOA,SAAgB,EAAc,EAA2B,CACvD,IAAI,EAAS,GACb,IAAK,IAAI,EAAI,EAAG,EAAI,EAAM,OAAQ,GAAK,MACrC,GAAU,OAAO,aAAa,GAAG,EAAM,SAAS,EAAG,EAAI,KAAM,CAAC,EAEhE,OAAO,KAAK,CAAM,CACpB,CAEA,SAAgB,EAAc,EAAyB,CACrD,IAAM,EAAS,KAAK,CAAG,EACjB,EAAM,IAAI,WAAW,EAAO,MAAM,EACxC,IAAK,IAAI,EAAI,EAAG,EAAI,EAAO,OAAQ,IAAK,EAAI,GAAK,EAAO,WAAW,CAAC,EACpE,OAAO,CACT,CAOA,SAAgB,EAAe,EAAsB,CACnD,IAAM,EAAU,EAAK,QAAQ,OAAQ,EAAE,EACjC,EAAU,KAAK,IAAI,EAAG,GAAG,MAAM,KAAK,EAAQ,SAAS,KAAK,EAAI,GAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAChF,EAAQ,IAAI,OAAO,KAAK,IAAI,EAAG,EAAU,CAAC,CAAC,EACjD,MAAO,GAAG,EAAM,IAAI,EAAQ,IAAI,GAClC"}
@@ -0,0 +1,2 @@
1
+ import{n as e}from"./index-BC5Uslm5.js";var t=e();function n({size:e=16,children:n,...r}){return(0,t.jsx)(`svg`,{width:e,height:e,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.5,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":`true`,focusable:`false`,...r,children:n})}function r(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`m4.5 6.25 2 1.75-2 1.75M8.25 10h3`})]})}function i(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`10.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01`})]})}function a(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`m4.5 6.5 3.5 3.5 3.5-3.5`})})}function o(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M2.5 6v4h2.5l3.5 3V3L5 6H2.5Z`}),(0,t.jsx)(`path`,{d:`M11 5.5a3.5 3.5 0 0 1 0 5M12.75 3.75a6 6 0 0 1 0 8.5`})]})}function s(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M13 8H3.5M7.5 4 3.5 8l4 4`})})}function c(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M3 8h9.5M8.5 4l4 4-4 4`})})}function l(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M13 8a5 5 0 1 1-1.46-3.54`}),(0,t.jsx)(`path`,{d:`M13 2.75v2.5h-2.5`})]})}function u(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`1.75`,y:`2.75`,width:`12.5`,height:`8.5`,rx:`1.25`}),(0,t.jsx)(`path`,{d:`M6 13.75h4M8 11.25v2.5`})]})}function d(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`4.75`,y:`1.75`,width:`6.5`,height:`12.5`,rx:`1.5`}),(0,t.jsx)(`path`,{d:`M7.25 12h1.5`})]})}function f(e){return(0,t.jsx)(n,{...e,children:(0,t.jsx)(`path`,{d:`M5 3.5v9l7-4.5-7-4.5Z`})})}function p(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`path`,{d:`M9 1.75H4.25a1 1 0 0 0-1 1v10.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1V5.5L9 1.75Z`}),(0,t.jsx)(`path`,{d:`M9 1.75V5.5h3.75`})]})}function m(e){return(0,t.jsxs)(n,{...e,children:[(0,t.jsx)(`rect`,{x:`2.25`,y:`2.25`,width:`11.5`,height:`4.5`,rx:`1`}),(0,t.jsx)(`rect`,{x:`2.25`,y:`9.25`,width:`11.5`,height:`4.5`,rx:`1`}),(0,t.jsx)(`path`,{d:`M4.75 4.5h.01M4.75 11.5h.01`})]})}export{p as a,i as c,m as d,r as f,u as i,l,c as n,d as o,a as r,f as s,s as t,o as u};
2
+ //# sourceMappingURL=terminal-icons-Dx6neM-J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"terminal-icons-Dx6neM-J.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-icons.tsx"],"sourcesContent":["/**\n * dock/terminal/terminal-icons.tsx — the Terminal / Preview panes' own 16px\n * glyphs (unit C4). Same grammar as components/primitives/icons.tsx (16-unit\n * box, 1.5 stroke, round caps, currentColor, decorative) so they sit beside\n * the shared set; kept here because the shared set is not this unit's file.\n */\nimport type { ReactNode, SVGProps } from 'react';\n\nexport interface GlyphProps extends Omit<SVGProps<SVGSVGElement>, 'children' | 'viewBox'> {\n size?: number;\n}\n\nfunction Glyph({ size = 16, children, ...rest }: GlyphProps & { children: ReactNode }) {\n return (\n <svg width={size} height={size} viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5}\n strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" focusable=\"false\" {...rest}>\n {children}\n </svg>\n );\n}\n\nexport function TerminalGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"m4.5 6.25 2 1.75-2 1.75M8.25 10h3\" /></Glyph>;\n}\n\nexport function PreviewGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"10.5\" rx=\"1.5\" /><path d=\"M1.75 5.75h12.5M4 4.25h.01M5.75 4.25h.01\" /></Glyph>;\n}\n\nexport function ChevronDownGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"m4.5 6.5 3.5 3.5 3.5-3.5\" /></Glyph>;\n}\n\n/** Screen-reader mode: a speaker with sound lines. */\nexport function ScreenReaderGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M2.5 6v4h2.5l3.5 3V3L5 6H2.5Z\" /><path d=\"M11 5.5a3.5 3.5 0 0 1 0 5M12.75 3.75a6 6 0 0 1 0 8.5\" /></Glyph>;\n}\n\nexport function ArrowLeftGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M13 8H3.5M7.5 4 3.5 8l4 4\" /></Glyph>;\n}\n\nexport function ArrowRightGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M3 8h9.5M8.5 4l4 4-4 4\" /></Glyph>;\n}\n\nexport function ReloadGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M13 8a5 5 0 1 1-1.46-3.54\" /><path d=\"M13 2.75v2.5h-2.5\" /></Glyph>;\n}\n\nexport function DesktopGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"1.75\" y=\"2.75\" width=\"12.5\" height=\"8.5\" rx=\"1.25\" /><path d=\"M6 13.75h4M8 11.25v2.5\" /></Glyph>;\n}\n\nexport function PhoneGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"4.75\" y=\"1.75\" width=\"6.5\" height=\"12.5\" rx=\"1.5\" /><path d=\"M7.25 12h1.5\" /></Glyph>;\n}\n\nexport function PlayGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M5 3.5v9l7-4.5-7-4.5Z\" /></Glyph>;\n}\n\nexport function FileGlyph(p: GlyphProps) {\n return <Glyph {...p}><path d=\"M9 1.75H4.25a1 1 0 0 0-1 1v10.5a1 1 0 0 0 1 1h7.5a1 1 0 0 0 1-1V5.5L9 1.75Z\" /><path d=\"M9 1.75V5.5h3.75\" /></Glyph>;\n}\n\nexport function ServerGlyph(p: GlyphProps) {\n return <Glyph {...p}><rect x=\"2.25\" y=\"2.25\" width=\"11.5\" height=\"4.5\" rx=\"1\" /><rect x=\"2.25\" y=\"9.25\" width=\"11.5\" height=\"4.5\" rx=\"1\" /><path d=\"M4.75 4.5h.01M4.75 11.5h.01\" /></Glyph>;\n}\n"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/xterm-B1njb2Cr.css"])))=>i.map(i=>d[i]);
2
+ import{t as e}from"./index-BC5Uslm5.js";import{D as t,w as n}from"./global-w7KDTTi0.js";import"./VerseShared-Bf-XTHCh.js";import{o as r,r as i}from"./terminal-client-CCSvMeEv.js";function a(e,t={}){let n=t.maxBytes??16384,r=new TextEncoder,a=[],o=0,s=null,c=!1,l=()=>{let e=new Uint8Array(o),t=0;for(let n of a)e.set(n,t),t+=n.length;let r=e.subarray(0,Math.min(n,e.length)),i=e.subarray(r.length);return a=i.length>0?[i]:[],o=i.length,r},u=async()=>{for(;!c&&o>0;){let n=l();try{await e(i(n))}catch(e){a=[],o=0,t.onError?.(e)}}s=null},d=e=>{c||e.length===0||(a.push(e),o+=e.length,s||=u())};return{pushText(e){d(r.encode(e))},pushBinary(e){let t=new Uint8Array(e.length);for(let n=0;n<e.length;n++)t[n]=e.charCodeAt(n)&255;d(t)},idle(){return s??Promise.resolve()},dispose(){c=!0,a=[],o=0}}}function o(e){return Math.min(250*2**e,8e3)}function s(e){let t=``;for(let n of e.split(`
3
+ `))n.startsWith(`data:`)&&(t+=n.slice(n.startsWith(`data: `)?6:5));if(!t)return null;let n;try{n=JSON.parse(t)}catch{return null}if(typeof n!=`object`||!n)return null;let r=n;return r.type===`output`&&typeof r.seq==`number`&&typeof r.dataBase64==`string`?{type:`output`,seq:r.seq,dataBase64:r.dataBase64}:r.type===`title`&&typeof r.title==`string`?{type:`title`,title:r.title}:r.type===`exit`?{type:`exit`,code:typeof r.code==`number`?r.code:null,signal:typeof r.signal==`string`?r.signal:null}:null}function c(e,i,a,c={}){let l=c.fetch??((e,t)=>fetch(e,t)),u=c.renew??t,d=c.proof??n,f=c.backoffMs??o,p=!1,m=null,h=null,g=0,_=!1,v=e=>{(!p||e===`closed`)&&a.onState?.(e)},y=()=>{p||(v(`reconnecting`),h=setTimeout(()=>{h=null,b()},f(g++)))};async function b(){if(p)return;m=new AbortController;let t;try{t=await l(r(e,i()),{method:`GET`,credentials:`same-origin`,headers:{"x-ashlr-read-client":d(),Accept:`text/event-stream`},signal:m.signal,cache:`no-store`})}catch{y();return}if(p)return;if(t.status===404){v(`gone`),p=!0;return}if(t.status===401){if(!_&&await u().catch(()=>!1)){_=!0,b();return}v(`expired`),p=!0;return}if(!t.ok||!t.body){y();return}_=!1,v(`open`);let n=t.body.getReader(),o=new TextDecoder,c=``;try{for(;;){let{value:e,done:t}=await n.read();if(t)break;g=0,c+=o.decode(e,{stream:!0});let r;for(;(r=c.indexOf(`
4
+
5
+ `))!==-1;){let e=c.slice(0,r);c=c.slice(r+2);let t=s(e);t&&!p&&a.onFrame(t)}}}catch{}y()}return v(`connecting`),b(),{close(){p||(p=!0,h&&clearTimeout(h),m?.abort(),a.onState?.(`closed`))}}}var l=5e3,u=null;function d(){return u||(u=Promise.all([e(()=>import(`./xterm-ScmBfeDI.js`),[]),e(()=>import(`./addon-fit-DIOBYJe3.js`),[]),e(()=>Promise.resolve({}),__vite__mapDeps([0]))]).then(([e,t])=>[e,t]),u.catch(()=>{u=null})),u}var f=async e=>{let[{Terminal:t},{FitAddon:n}]=await d(),r=new t({fontFamily:e.fontFamily,fontSize:e.fontSize,lineHeight:1.2,cursorBlink:!0,cursorStyle:`bar`,scrollback:l,theme:e.theme,screenReaderMode:e.screenReaderMode,macOptionIsMeta:!0,minimumContrastRatio:3,allowProposedApi:!1}),i=new n;r.loadAddon(i);let a=!1;return{get cols(){return r.cols},get rows(){return r.rows},open(e){a||(a=!0,r.open(e))},write(e){r.write(e)},reset(){r.reset()},focus(){r.focus()},fit(){let e=i.proposeDimensions();return!e||!Number.isFinite(e.cols)||!Number.isFinite(e.rows)||e.cols<2||e.rows<2?null:(i.fit(),{cols:r.cols,rows:r.rows})},onData:e=>r.onData(e),onBinary:e=>r.onBinary(e),onSelectionChange:e=>r.onSelectionChange(e),hasSelection:()=>r.hasSelection(),getSelection:()=>r.getSelection(),paste(e){r.paste(e)},bracketedPaste:()=>r.modes.bracketedPasteMode,setTheme(e){r.options.theme=e},setScreenReaderMode(e){r.options.screenReaderMode=e},setKeyFilter(e){r.attachCustomKeyEventHandler(e)},dispose(){r.dispose()}}},p={foreground:`--term-fg`,background:`--term-bg`,cursor:`--term-cursor`,cursorAccent:`--term-bg`,selectionBackground:`--term-selection`,selectionForeground:`--term-fg`,selectionInactiveBackground:`--term-selection-inactive`,scrollbarSliderBackground:`--term-scrollbar`,scrollbarSliderHoverBackground:`--term-scrollbar-hover`,scrollbarSliderActiveBackground:`--term-scrollbar-hover`,overviewRulerBorder:`--term-bg`,black:`--term-black`,red:`--term-red`,green:`--term-green`,yellow:`--term-yellow`,blue:`--term-blue`,magenta:`--term-magenta`,cyan:`--term-cyan`,white:`--term-white`,brightBlack:`--term-bright-black`,brightRed:`--term-bright-red`,brightGreen:`--term-bright-green`,brightYellow:`--term-bright-yellow`,brightBlue:`--term-bright-blue`,brightMagenta:`--term-bright-magenta`,brightCyan:`--term-bright-cyan`,brightWhite:`--term-bright-white`},m;function h(e){if(typeof document>`u`)return e;if(m===void 0)try{let e=document.createElement(`canvas`);e.width=1,e.height=1,m=e.getContext(`2d`,{willReadFrequently:!0})}catch{m=null}let t=m;if(!t)return e;try{t.clearRect(0,0,1,1),t.fillStyle=e,t.fillRect(0,0,1,1);let[n,r,i,a]=t.getImageData(0,0,1,1).data;return a===void 0?e:a===255?`rgb(${n}, ${r}, ${i})`:`rgba(${n}, ${r}, ${i}, ${(a/255).toFixed(3)})`}catch{return e}}function g(e){let t=document.createElement(`span`);t.style.display=`none`,e.appendChild(t);let n={};try{for(let[r,i]of Object.entries(p)){if(!getComputedStyle(e).getPropertyValue(i).trim())continue;t.style.color=``,t.style.color=`var(${i})`;let a=getComputedStyle(t).color;a&&(n[r]=h(a))}}finally{t.remove()}return n}function _(e){let t=getComputedStyle(e),n=Number.parseFloat(t.fontSize);return{fontFamily:t.fontFamily||`ui-monospace, Menlo, monospace`,fontSize:Number.isFinite(n)&&n>=11?n:13}}function v(e){if(typeof window>`u`)return()=>{};let t=document.documentElement,n=typeof MutationObserver==`function`?new MutationObserver(()=>e()):null;n?.observe(t,{attributes:!0,attributeFilter:[`data-theme`,`data-accent`,`class`,`style`]});let r=typeof window.matchMedia==`function`?window.matchMedia(`(prefers-color-scheme: dark)`):null,i=()=>e();return r?.addEventListener?.(`change`,i),()=>{n?.disconnect(),r?.removeEventListener?.(`change`,i)}}export{c as a,v as i,_ as n,s as o,g as r,a as s,f as t};
6
+ //# sourceMappingURL=terminal-view-BSieiQvi.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"mappings":"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","names":[],"ignoreList":[],"sources":["../../../../../../src/web-ui/routes/verse/dock/terminal/input-queue.ts","../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-stream.ts","../../../../../../src/web-ui/routes/verse/dock/terminal/terminal-view.ts"],"sourcesContent":["/**\n * dock/terminal/input-queue.ts — keystrokes to the shell, in order (unit C4).\n *\n * Every keystroke is a POST. Two POSTs in flight at once may arrive in either\n * order, and a shell that receives `sl` for `ls` runs the wrong command. So\n * input is SINGLE-FLIGHT: while one request is out, everything typed after it\n * accumulates and goes as the next request — in order, and coalesced (a burst\n * of typing or a paste becomes one or a few requests, not hundreds). The\n * server takes at most 16 KB per request, so a long paste is sent in 16 KB\n * slices, one after another.\n */\nimport { VERSE_TERMINAL_INPUT_MAX_BYTES } from '../../../../../core/verse/workbench-types.js';\nimport { bytesToBase64 } from './terminal-client.js';\n\nexport interface InputQueue {\n /** Text as xterm reports it (a JS string — encoded as UTF-8). */\n pushText(text: string): void;\n /** xterm `onBinary` data: one char per byte (0–255). */\n pushBinary(binary: string): void;\n /** Resolves once everything pushed so far has been sent (or dropped on error). */\n idle(): Promise<void>;\n /** Stop sending; anything queued is dropped. */\n dispose(): void;\n}\n\nexport function createInputQueue(\n send: (dataBase64: string) => Promise<void>,\n opts: { maxBytes?: number; onError?: (err: unknown) => void } = {},\n): InputQueue {\n const maxBytes = opts.maxBytes ?? VERSE_TERMINAL_INPUT_MAX_BYTES;\n const encoder = new TextEncoder();\n let pending: Uint8Array[] = [];\n let pendingBytes = 0;\n let running: Promise<void> | null = null;\n let disposed = false;\n\n const take = (): Uint8Array => {\n const all = new Uint8Array(pendingBytes);\n let offset = 0;\n for (const chunk of pending) {\n all.set(chunk, offset);\n offset += chunk.length;\n }\n const head = all.subarray(0, Math.min(maxBytes, all.length));\n const rest = all.subarray(head.length);\n pending = rest.length > 0 ? [rest] : [];\n pendingBytes = rest.length;\n return head;\n };\n\n const pump = async (): Promise<void> => {\n while (!disposed && pendingBytes > 0) {\n const slice = take();\n try {\n await send(bytesToBase64(slice));\n } catch (err) {\n // A failed keystroke is not retried: replaying it later, after newer\n // input, is exactly the reordering this queue exists to prevent.\n pending = [];\n pendingBytes = 0;\n opts.onError?.(err);\n }\n }\n running = null;\n };\n\n const push = (bytes: Uint8Array): void => {\n if (disposed || bytes.length === 0) return;\n pending.push(bytes);\n pendingBytes += bytes.length;\n if (!running) running = pump();\n };\n\n return {\n pushText(text) {\n push(encoder.encode(text));\n },\n pushBinary(binary) {\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i) & 0xff;\n push(bytes);\n },\n idle() {\n return running ?? Promise.resolve();\n },\n dispose() {\n disposed = true;\n pending = [];\n pendingBytes = 0;\n },\n };\n}\n","/**\n * dock/terminal/terminal-stream.ts — one terminal tab's live output (unit C4).\n *\n * WHY fetch() AND NOT EventSource. The server's read boundary accepts the\n * per-tab client proof as a query parameter ONLY on the three EventSource\n * paths it knows (read-session.ts); everywhere else it must be the\n * `x-ashlr-read-client` header, which EventSource cannot send. fetch() can,\n * and a streamed body reads the same `text/event-stream` frames. It also\n * lets the pane keep exactly ONE connection open — the visible tab's — which\n * matters because a browser allows about six per origin and Verse already\n * holds two (the app events and the open chat).\n *\n * RESUME. Each (re)connect asks for `?after=<the last seq written>`; the\n * server replays only newer frames from its 256 KB scrollback. A dropped\n * connection reconnects with backoff; a 401 renews the read session once;\n * a 404 means the tab is gone (killed, idle-closed, server restarted).\n */\nimport type { VerseTerminalFrame } from '../../../../data/api-types.js';\nimport { getReadClientProof, renewReadSession } from '../../../../data/auth-store.js';\nimport { terminalStreamPath } from './terminal-client.js';\n\nexport type TerminalStreamState = 'connecting' | 'open' | 'reconnecting' | 'gone' | 'expired' | 'closed';\n\nexport interface TerminalStreamHandlers {\n onFrame: (frame: VerseTerminalFrame) => void;\n onState?: (state: TerminalStreamState) => void;\n}\n\nexport interface TerminalStreamDeps {\n fetch?: typeof fetch;\n renew?: () => Promise<boolean>;\n proof?: () => string;\n /** Backoff before reconnect attempt `n` (0-based). */\n backoffMs?: (attempt: number) => number;\n}\n\nexport interface TerminalStream {\n close(): void;\n}\n\nfunction defaultBackoff(attempt: number): number {\n return Math.min(250 * 2 ** attempt, 8_000);\n}\n\n/** Parse one SSE block (`event:` / `data:` lines) into a frame; null for comments and junk. */\nexport function parseTerminalSseBlock(block: string): VerseTerminalFrame | null {\n let data = '';\n for (const line of block.split('\\n')) {\n if (line.startsWith('data:')) data += line.slice(line.startsWith('data: ') ? 6 : 5);\n }\n if (!data) return null;\n let parsed: unknown;\n try {\n parsed = JSON.parse(data);\n } catch {\n return null;\n }\n if (parsed === null || typeof parsed !== 'object') return null;\n const frame = parsed as Record<string, unknown>;\n if (frame['type'] === 'output' && typeof frame['seq'] === 'number' && typeof frame['dataBase64'] === 'string') {\n return { type: 'output', seq: frame['seq'], dataBase64: frame['dataBase64'] };\n }\n if (frame['type'] === 'title' && typeof frame['title'] === 'string') return { type: 'title', title: frame['title'] };\n if (frame['type'] === 'exit') {\n return {\n type: 'exit',\n code: typeof frame['code'] === 'number' ? frame['code'] : null,\n signal: typeof frame['signal'] === 'string' ? frame['signal'] : null,\n };\n }\n return null;\n}\n\n/**\n * Stream `tabId`'s frames, resuming after `after()` on every (re)connect.\n * Returns a handle whose close() aborts the request and stops reconnecting.\n */\nexport function openTerminalStream(\n tabId: string,\n after: () => number,\n handlers: TerminalStreamHandlers,\n deps: TerminalStreamDeps = {},\n): TerminalStream {\n const doFetch = deps.fetch ?? ((input: RequestInfo | URL, init?: RequestInit) => fetch(input, init));\n const renew = deps.renew ?? renewReadSession;\n const proof = deps.proof ?? getReadClientProof;\n const backoff = deps.backoffMs ?? defaultBackoff;\n let closed = false;\n let controller: AbortController | null = null;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let attempt = 0;\n let renewedOnce = false;\n\n const setState = (state: TerminalStreamState): void => {\n if (!closed || state === 'closed') handlers.onState?.(state);\n };\n\n const schedule = (): void => {\n if (closed) return;\n setState('reconnecting');\n timer = setTimeout(() => {\n timer = null;\n void connect();\n }, backoff(attempt++));\n };\n\n async function connect(): Promise<void> {\n if (closed) return;\n controller = new AbortController();\n let res: Response;\n try {\n res = await doFetch(terminalStreamPath(tabId, after()), {\n method: 'GET',\n credentials: 'same-origin',\n headers: { 'x-ashlr-read-client': proof(), Accept: 'text/event-stream' },\n signal: controller.signal,\n cache: 'no-store',\n });\n } catch {\n schedule();\n return;\n }\n if (closed) return;\n if (res.status === 404) {\n setState('gone');\n closed = true;\n return;\n }\n if (res.status === 401) {\n if (!renewedOnce && (await renew().catch(() => false))) {\n renewedOnce = true;\n void connect();\n return;\n }\n setState('expired');\n closed = true;\n return;\n }\n if (!res.ok || !res.body) {\n schedule();\n return;\n }\n renewedOnce = false;\n setState('open');\n const reader = res.body.getReader();\n const decoder = new TextDecoder();\n let buffer = '';\n try {\n for (;;) {\n const { value, done } = await reader.read();\n if (done) break;\n attempt = 0;\n buffer += decoder.decode(value, { stream: true });\n let idx: number;\n while ((idx = buffer.indexOf('\\n\\n')) !== -1) {\n const block = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n const frame = parseTerminalSseBlock(block);\n if (frame && !closed) handlers.onFrame(frame);\n }\n }\n } catch {\n /* aborted, or the connection dropped: reconnect below unless closed */\n }\n // The server ends the stream when the tab is removed; the next connect\n // then answers 404 and reports 'gone'.\n schedule();\n }\n\n setState('connecting');\n void connect();\n\n return {\n close() {\n if (closed) return;\n closed = true;\n if (timer) clearTimeout(timer);\n controller?.abort();\n handlers.onState?.('closed');\n },\n };\n}\n","/**\n * dock/terminal/terminal-view.ts — the one seam between the Terminal pane and\n * xterm.js (unit C4).\n *\n * LAZY. `@xterm/xterm` (≈ 345 KB minified) and its stylesheet load only when\n * a terminal is first shown, as their own chunk — never on the chat's\n * critical path (SPEC-310C budget: chat critical JS ≤ 350 KB). The pane talks\n * to a small `TerminalView` interface, so tests inject a fake (jsdom has no\n * layout or canvas for xterm) and the pane never imports xterm itself.\n *\n * THEME FROM TOKENS. xterm wants concrete colours; the design system forbids\n * raw hex in new UI files and wants every colour to follow the theme. So the\n * palette is declared as CSS custom properties on the pane\n * (TerminalPane.module.css, mapped to design tokens for both themes) and\n * resolved here at runtime — a probe element turns `var(--x)` into a computed\n * colour, a 1×1 canvas normalises any colour syntax to rgb — and re-resolved\n * when the theme changes.\n */\nimport type { ITheme, Terminal as XtermTerminal } from '@xterm/xterm';\n\nexport interface TerminalViewDisposable {\n dispose(): void;\n}\n\nexport interface TerminalView {\n readonly cols: number;\n readonly rows: number;\n open(host: HTMLElement): void;\n write(data: Uint8Array): void;\n reset(): void;\n focus(): void;\n /** Fit to the host; returns the new size (or null when the host has no size — hidden). */\n fit(): { cols: number; rows: number } | null;\n onData(cb: (data: string) => void): TerminalViewDisposable;\n onBinary(cb: (data: string) => void): TerminalViewDisposable;\n onSelectionChange(cb: () => void): TerminalViewDisposable;\n hasSelection(): boolean;\n getSelection(): string;\n /** Paste as if typed (bracketed when the program asked for it). Never adds Enter. */\n paste(text: string): void;\n /** True while the program in the terminal has bracketed paste on (shells at a prompt do). */\n bracketedPaste(): boolean;\n setTheme(theme: TerminalTheme): void;\n setScreenReaderMode(on: boolean): void;\n /** Return false from `filter` to let a key pass to the page (app shortcuts). */\n setKeyFilter(filter: (event: KeyboardEvent) => boolean): void;\n dispose(): void;\n}\n\nexport type TerminalTheme = ITheme;\n\nexport interface TerminalViewOptions {\n fontFamily: string;\n fontSize: number;\n theme: TerminalTheme;\n screenReaderMode: boolean;\n}\n\nexport type TerminalViewFactory = (opts: TerminalViewOptions) => Promise<TerminalView>;\n\n/** Scrollback kept by the VIEW (lines). The server keeps its own 256 KB for reattach. */\nconst VIEW_SCROLLBACK_LINES = 5_000;\n\nlet xtermModules: Promise<[typeof import('@xterm/xterm'), typeof import('@xterm/addon-fit')]> | null = null;\n\nfunction loadXtermModules() {\n if (!xtermModules) {\n xtermModules = Promise.all([\n import('@xterm/xterm'),\n import('@xterm/addon-fit'),\n import('@xterm/xterm/css/xterm.css'),\n ]).then(([xterm, fit]) => [xterm, fit] as [typeof import('@xterm/xterm'), typeof import('@xterm/addon-fit')]);\n // A failed chunk load must be retryable (the pane offers \"Try again\").\n xtermModules.catch(() => { xtermModules = null; });\n }\n return xtermModules;\n}\n\n/** The real xterm.js view. */\nexport const createXtermView: TerminalViewFactory = async (opts) => {\n const [{ Terminal }, { FitAddon }] = await loadXtermModules();\n const term: XtermTerminal = new Terminal({\n fontFamily: opts.fontFamily,\n fontSize: opts.fontSize,\n lineHeight: 1.2,\n cursorBlink: true,\n cursorStyle: 'bar',\n scrollback: VIEW_SCROLLBACK_LINES,\n theme: opts.theme,\n screenReaderMode: opts.screenReaderMode,\n // ⌥ as Meta: word motions (⌥←/⌥→ → ESC b / ESC f) work as in Terminal.app\n // with \"Use Option as Meta key\".\n macOptionIsMeta: true,\n // Keep dim ANSI text legible on our surfaces in both themes.\n minimumContrastRatio: 3,\n allowProposedApi: false,\n });\n const fit = new FitAddon();\n term.loadAddon(fit);\n let opened = false;\n\n return {\n get cols() { return term.cols; },\n get rows() { return term.rows; },\n open(host) {\n if (opened) return;\n opened = true;\n term.open(host);\n },\n write(data) { term.write(data); },\n reset() { term.reset(); },\n focus() { term.focus(); },\n fit() {\n const dims = fit.proposeDimensions();\n if (!dims || !Number.isFinite(dims.cols) || !Number.isFinite(dims.rows) || dims.cols < 2 || dims.rows < 2) return null;\n fit.fit();\n return { cols: term.cols, rows: term.rows };\n },\n onData: (cb) => term.onData(cb),\n onBinary: (cb) => term.onBinary(cb),\n onSelectionChange: (cb) => term.onSelectionChange(cb),\n hasSelection: () => term.hasSelection(),\n getSelection: () => term.getSelection(),\n paste(text) { term.paste(text); },\n bracketedPaste: () => term.modes.bracketedPasteMode,\n setTheme(theme) { term.options.theme = theme; },\n setScreenReaderMode(on) { term.options.screenReaderMode = on; },\n setKeyFilter(filter) { term.attachCustomKeyEventHandler(filter); },\n dispose() { term.dispose(); },\n };\n};\n\n// ---------------------------------------------------------------------------\n// Theme resolution\n// ---------------------------------------------------------------------------\n\n/** ITheme key → the custom property TerminalPane.module.css declares for it. */\nexport const TERMINAL_THEME_VARS: Readonly<Record<keyof Omit<ITheme, 'extendedAnsi'>, string>> = {\n foreground: '--term-fg',\n background: '--term-bg',\n cursor: '--term-cursor',\n cursorAccent: '--term-bg',\n selectionBackground: '--term-selection',\n selectionForeground: '--term-fg',\n selectionInactiveBackground: '--term-selection-inactive',\n scrollbarSliderBackground: '--term-scrollbar',\n scrollbarSliderHoverBackground: '--term-scrollbar-hover',\n scrollbarSliderActiveBackground: '--term-scrollbar-hover',\n overviewRulerBorder: '--term-bg',\n black: '--term-black',\n red: '--term-red',\n green: '--term-green',\n yellow: '--term-yellow',\n blue: '--term-blue',\n magenta: '--term-magenta',\n cyan: '--term-cyan',\n white: '--term-white',\n brightBlack: '--term-bright-black',\n brightRed: '--term-bright-red',\n brightGreen: '--term-bright-green',\n brightYellow: '--term-bright-yellow',\n brightBlue: '--term-bright-blue',\n brightMagenta: '--term-bright-magenta',\n brightCyan: '--term-bright-cyan',\n brightWhite: '--term-bright-white',\n};\n\nlet canvasCtx: CanvasRenderingContext2D | null | undefined;\n\n/**\n * Any CSS colour → `rgb(r, g, b)` / `rgba(…)`, by painting one pixel. Canvas\n * accepts every syntax the browser does (hsl, color-mix, oklch) and the pixel\n * is plain sRGB, which is what xterm parses. Falls back to the input.\n */\nexport function normalizeCssColor(value: string): string {\n if (typeof document === 'undefined') return value;\n if (canvasCtx === undefined) {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n canvasCtx = canvas.getContext('2d', { willReadFrequently: true });\n } catch {\n canvasCtx = null;\n }\n }\n const ctx = canvasCtx;\n if (!ctx) return value;\n try {\n ctx.clearRect(0, 0, 1, 1);\n ctx.fillStyle = value;\n ctx.fillRect(0, 0, 1, 1);\n const [r, g, b, a] = ctx.getImageData(0, 0, 1, 1).data;\n if (a === undefined) return value;\n return a === 255 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${(a! / 255).toFixed(3)})`;\n } catch {\n return value;\n }\n}\n\n/**\n * Read the pane's `--term-*` properties as concrete colours. A probe child\n * with `color: var(--x)` makes the browser resolve every var() and\n * color-mix() for us; unset properties are left out (xterm keeps its default).\n */\nexport function resolveTerminalTheme(host: HTMLElement): TerminalTheme {\n const probe = document.createElement('span');\n probe.style.display = 'none';\n host.appendChild(probe);\n const theme: Record<string, string> = {};\n try {\n for (const [key, prop] of Object.entries(TERMINAL_THEME_VARS)) {\n const declared = getComputedStyle(host).getPropertyValue(prop).trim();\n if (!declared) continue;\n probe.style.color = '';\n probe.style.color = `var(${prop})`;\n const computed = getComputedStyle(probe).color;\n if (computed) theme[key] = normalizeCssColor(computed);\n }\n } finally {\n probe.remove();\n }\n return theme as TerminalTheme;\n}\n\n/** The host's computed monospace family and size (so the display-size setting reaches the terminal). */\nexport function resolveTerminalFont(host: HTMLElement): { fontFamily: string; fontSize: number } {\n const style = getComputedStyle(host);\n const size = Number.parseFloat(style.fontSize);\n return {\n fontFamily: style.fontFamily || 'ui-monospace, Menlo, monospace',\n fontSize: Number.isFinite(size) && size >= 11 ? size : 13,\n };\n}\n\n/** Call `onChange` when the effective colour theme changes (explicit toggle or OS appearance). */\nexport function watchThemeChanges(onChange: () => void): () => void {\n if (typeof window === 'undefined') return () => {};\n const root = document.documentElement;\n const observer = typeof MutationObserver === 'function'\n ? new MutationObserver(() => onChange())\n : null;\n observer?.observe(root, { attributes: true, attributeFilter: ['data-theme', 'data-accent', 'class', 'style'] });\n const media = typeof window.matchMedia === 'function' ? window.matchMedia('(prefers-color-scheme: dark)') : null;\n const onMedia = () => onChange();\n media?.addEventListener?.('change', onMedia);\n return () => {\n observer?.disconnect();\n media?.removeEventListener?.('change', onMedia);\n };\n}\n"],"file":"terminal-view-BSieiQvi.js"}
@@ -0,0 +1,2 @@
1
+ import{C as e,M as t,V as n,a as r,i,r as a}from"./global-w7KDTTi0.js";import{O as o}from"./VerseShared-Bf-XTHCh.js";import{n as s}from"./control-queries-BG53otwz.js";import{n as c,u as l}from"./surface-data-hufdOfpz.js";import{a as u,i as d,n as f,o as p,r as m,s as h}from"./leader-thread-types-CDb-VPPO.js";function g(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}var _=e=>typeof e==`string`&&e.length>0?e:null;function v(e){if(!g(e))return null;let{id:t,at:n,from:r,channel:i,kind:a,text:o}=e;if(typeof t!=`string`||t.length===0||typeof n!=`string`||!Number.isFinite(Date.parse(n))||r!==`mason`&&r!==`leader`||typeof o!=`string`)return null;let s={id:t,at:n,from:r,channel:f.includes(i)?i:`verse`,kind:m.includes(a)?a:`message`,text:o},c=_(e.replyTo),l=_(e.memoId),u=_(e.questionId);c&&(s.replyTo=c),l&&(s.memoId=l),u&&(s.questionId=u);let d=Array.isArray(e.actionIds)?e.actionIds.filter(e=>typeof e==`string`&&e.length>0):[];d.length&&(s.actionIds=d);let p=e.delivery;if(g(p)){let e=p.telegram;(e===`pending`||e===`sent`||e===`failed`)&&(s.delivery={telegram:e,..._(p.sentAt)?{sentAt:p.sentAt}:{}})}return s}function y(e){let t=Array.isArray(e)?e:g(e)&&Array.isArray(e.messages)?e.messages:null;return t?{messages:t.flatMap(e=>v(e)??[])}:null}function b(e){if(!g(e))return null;let{id:t,text:n}=e;if(typeof t!=`string`||t.length===0||typeof n!=`string`||n.trim().length===0||_(e.retiredAt)!==null)return null;let r=f.includes(e.channel)?e.channel:null;return{id:t,text:n.trim(),createdAt:_(e.createdAt),channel:r}}function x(e){let t=g(e)&&Array.isArray(e.directives)?e.directives:null;return t?t.flatMap(e=>b(e)??[]).sort((e,t)=>(Date.parse(e.createdAt??``)||0)-(Date.parse(t.createdAt??``)||0)):null}function S(e){if(!g(e))return null;let t=v(e.message);return t?{message:t,reply:v(e.reply),directive:b(e.directive)}:null}var C=12e4,w=e=>e.replace(/\s+/g,` `).trim();function T(e,t){return e.from!==`mason`||w(e.text)!==w(t.text)||t.kind===`answer`&&t.questionId&&e.questionId&&e.questionId!==t.questionId?!1:Date.parse(e.at)>=Date.parse(t.at)-C}var E=(e,t)=>Date.parse(e.at)-Date.parse(t.at)||0;function D(e,t=[],n=[]){let r=new Map;for(let e of t)r.set(e.id,e);for(let t of e)for(let e of t)r.set(e.id,e);let i=[...r.values()],a=new Set,o=[];for(let e of n){let t=e.state===`sending`?i.find(t=>!a.has(t.id)&&T(t,e)):void 0;t?a.add(t.id):o.push(e)}return[...i.map(e=>({type:`message`,key:e.id,at:e.at,message:e})),...o.map(e=>({type:`pending`,key:e.clientId,at:e.at,pending:e}))].map((e,t)=>({e,i:t})).sort((e,t)=>E(e.e,t.e)||e.i-t.i).map(({e})=>e)}function O(e){return e.type===`pending`?`mason`:e.message.from}function k(e){return e.type===`pending`?`verse`:e.message.channel}function A(e){return e.type===`message`&&(e.message.kind===`memo`||e.message.kind===`directive`)}function j(e){let t=new Date(e);return`${t.getFullYear()}-${t.getMonth()}-${t.getDate()}`}function M(e,t=Date.now()){let n=Date.parse(e);if(!Number.isFinite(n))return`—`;if(j(n)===j(t))return`Today`;if(j(n)===j(t-864e5))return`Yesterday`;let r=new Date(n),i=r.getFullYear()===new Date(t).getFullYear();return r.toLocaleDateString(`en-US`,{weekday:`short`,month:`short`,day:`numeric`,...i?{}:{year:`numeric`}})}function N(e,t=Date.now()){let n=[],r=null,i=null,a=0;for(let o of e){let e=Date.parse(o.at),s=j(e);if(s!==r&&(r=s,n.push({type:`day`,key:`day-${s}`,label:M(o.at,t)}),i=null),o.type===`message`&&o.message.channel===`system`){n.push({type:`system`,key:o.key,entry:o}),i=null;continue}let c=O(o),l=k(o);i!==null&&!A(o)&&!A(i.entries[i.entries.length-1])&&i.from===c&&i.channel===l&&e-a<=3e5&&i?i.entries.push(o):(i={type:`group`,key:`g-${o.key}`,from:c,channel:l,at:o.at,entries:[o]},n.push(i)),a=e}return n}function P(e){let t=e.filter(e=>e.kind===`question`),n=new Map;for(let r of e){if(r.from!==`mason`||r.kind!==`answer`&&!r.replyTo)continue;let e=t.find(e=>r.questionId&&e.questionId===r.questionId||r.replyTo&&e.id===r.replyTo);e&&!n.has(e.id)&&n.set(e.id,r)}return n}function F(e,t){return t.questionId?e.find(e=>e.kind===`question`&&e.questionId===t.questionId)??null:null}var I=18e4;function L(e,t,n=Date.now()){if(e.some(e=>e.type===`pending`&&e.pending.state===`sending`))return!0;for(let r=e.length-1;r>=0;--r){let i=e[r];if(i.type===`message`&&i.message.channel!==`system`){if(i.message.from===`leader`)return!1;if(t.has(i.message.id))return n-Date.parse(i.message.at)<I}}return!1}var R={verse:`Verse`,telegram:`Telegram`,cli:`CLI`,system:`System`};function z(e){let t=null;for(let n of e)n.from===`leader`&&n.channel!==`system`&&(!t||Date.parse(n.at)>=Date.parse(t.at))&&(t=n);return t}function B(e,t=140){let n=e.replace(/```[\s\S]*?(```|$)/g,` `).replace(/!?\[([^\]]*)\]\([^)]*\)/g,`$1`).replace(/^\s{0,3}(#{1,6}|>|[-*+]|\d+\.)\s+/gm,``).replace(/[*_`~]+/g,``).replace(/\s+/g,` `).trim();if(n.length<=t)return n;let r=n.slice(0,t-1),i=r.lastIndexOf(` `);return`${(i>t*.6?r.slice(0,i):r).replace(/[\s,.;:–—-]+$/,``)}…`}function V(e){let t=Date.parse(e);return Number.isFinite(t)?new Date(t).toLocaleTimeString(`en-US`,{hour:`numeric`,minute:`2-digit`}):``}var H=4e3,U=Object.freeze({thread:`verse-leader-thread`,directives:`verse-leader-directives`}),W=l(U.thread,`${h}?limit=50`,`The Leader conversation`,y),G=l(U.directives,u,`Leader directives`,x);async function K(e,t){return y(await i(`${h}?limit=50&before=${encodeURIComponent(e)}`,t))?.messages??[]}function q(e){return encodeURIComponent(e).replace(/%3A/gi,`:`)}function J(){let t=e();if(!t)throw new s;return t}async function Y(e,n){let i=await r(e,n,J());return t(),i}async function X(e,t=null){let r=S(await Y(h,t?{text:e,replyTo:t}:{text:e}));return r?.directive&&n(U.directives),r}async function Z(e,t){let n=S(await Y(`${p}/${q(e)}/answer`,{text:t}));return o(),n}async function Q(e){let t=await Y(`${d}/${q(e)}/approve`,{});return n(c.leader),n(U.thread),o(),t}async function $(e){let t=await Y(u,{text:e});return n(U.directives),n(U.thread),b(typeof t==`object`&&t&&`directive`in t?t.directive:t)}async function ee(e){await a(`${u}/${q(e)}`,J()),t(),n(U.directives),n(U.thread)}export{D as _,G as a,X as c,P as d,L as f,z as g,N as h,K as i,R as l,F as m,Z as n,W as o,V as p,Q as r,ee as s,$ as t,H as u,B as v};
2
+ //# sourceMappingURL=thread-data-Cd2DZffn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thread-data-Cd2DZffn.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/leader/thread-model.ts","../../../../../../src/web-ui/routes/verse/leader/thread-data.ts"],"sourcesContent":["/**\n * routes/verse/leader/thread-model.ts — pure helpers behind the Leader\n * conversation on Mind (and its one-line preview on Command).\n *\n * narrow* every body the page reads, checked field by field: a\n * message the page cannot read is dropped, never guessed;\n * mergeThread server pages + replies this tab already received + the\n * optimistic sends still in flight, in time order, each\n * message once (an optimistic send disappears as soon as its\n * server copy is in any of the lists);\n * groupThread day separators and runs of consecutive messages from one\n * sender on one channel (Linear-style: one header per run);\n * questions which question messages are answered, and which one a\n * Needs-you item means;\n * awaitingReply \"Leader is thinking…\" — honest: only for a message THIS\n * tab sent that the server said it would answer later.\n *\n * Framework-free; tested directly (thread-model.test.ts).\n */\nimport {\n LEADER_THREAD_CHANNELS,\n LEADER_THREAD_KINDS,\n type LeaderSendResult,\n type LeaderThreadChannel,\n type LeaderThreadKind,\n type LeaderThreadMessage,\n type LeaderThreadPage,\n type DirectiveChip,\n} from './thread-types.js';\n\n// ---------------------------------------------------------------------------\n// Narrowing\n// ---------------------------------------------------------------------------\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\nconst optString = (v: unknown): string | null => (typeof v === 'string' && v.length > 0 ? v : null);\n\n/** One message, or null when a required field is missing or out of vocabulary. */\nexport function narrowMessage(raw: unknown): LeaderThreadMessage | null {\n if (!isRecord(raw)) return null;\n const { id, at, from, channel, kind, text } = raw;\n if (typeof id !== 'string' || id.length === 0) return null;\n if (typeof at !== 'string' || !Number.isFinite(Date.parse(at))) return null;\n if (from !== 'mason' && from !== 'leader') return null;\n if (typeof text !== 'string') return null;\n // An unknown channel or kind from a newer server still reads as a message.\n const ch = LEADER_THREAD_CHANNELS.includes(channel as LeaderThreadChannel) ? (channel as LeaderThreadChannel) : 'verse';\n const k = LEADER_THREAD_KINDS.includes(kind as LeaderThreadKind) ? (kind as LeaderThreadKind) : 'message';\n const out: LeaderThreadMessage = { id, at, from, channel: ch, kind: k, text };\n // Optional fields are present only when the server sent a usable value.\n const replyTo = optString(raw['replyTo']);\n const memoId = optString(raw['memoId']);\n const questionId = optString(raw['questionId']);\n if (replyTo) out.replyTo = replyTo;\n if (memoId) out.memoId = memoId;\n if (questionId) out.questionId = questionId;\n const actionIds = Array.isArray(raw['actionIds']) ? raw['actionIds'].filter((a): a is string => typeof a === 'string' && a.length > 0) : [];\n if (actionIds.length) out.actionIds = actionIds;\n const delivery = raw['delivery'];\n if (isRecord(delivery)) {\n const telegram = delivery['telegram'];\n if (telegram === 'pending' || telegram === 'sent' || telegram === 'failed') {\n out.delivery = { telegram, ...(optString(delivery['sentAt']) ? { sentAt: delivery['sentAt'] as string } : {}) };\n }\n }\n return out;\n}\n\n/** `{ messages: [...] }` (or a bare array); null when neither. Unreadable messages are dropped. */\nexport function narrowThreadPage(raw: unknown): LeaderThreadPage | null {\n const list = Array.isArray(raw) ? raw : isRecord(raw) && Array.isArray(raw['messages']) ? raw['messages'] : null;\n if (!list) return null;\n return { messages: list.flatMap((m) => narrowMessage(m) ?? []) };\n}\n\n/** An OperatorDirective in force, as a chip; null when unreadable or retired (`retiredAt` set). */\nexport function narrowDirective(raw: unknown): DirectiveChip | null {\n if (!isRecord(raw)) return null;\n const { id, text } = raw;\n if (typeof id !== 'string' || id.length === 0 || typeof text !== 'string' || text.trim().length === 0) return null;\n // A retired directive is history, not a chip.\n if (optString(raw['retiredAt']) !== null) return null;\n const channel = LEADER_THREAD_CHANNELS.includes(raw['channel'] as LeaderThreadChannel) ? (raw['channel'] as LeaderThreadChannel) : null;\n return { id, text: text.trim(), createdAt: optString(raw['createdAt']), channel };\n}\n\n/** GET /directives `{ directives, retired }` → the ones in force, oldest first (`retired` is history). */\nexport function narrowDirectives(raw: unknown): DirectiveChip[] | null {\n const list = isRecord(raw) && Array.isArray(raw['directives']) ? raw['directives'] : null;\n if (!list) return null;\n const out = list.flatMap((d) => narrowDirective(d) ?? []);\n return out.sort((a, b) => (Date.parse(a.createdAt ?? '') || 0) - (Date.parse(b.createdAt ?? '') || 0));\n}\n\nexport function narrowSendResult(raw: unknown): LeaderSendResult | null {\n if (!isRecord(raw)) return null;\n const message = narrowMessage(raw['message']);\n if (!message) return null;\n return { message, reply: narrowMessage(raw['reply']), directive: narrowDirective(raw['directive']) };\n}\n\n/**\n * POST /actions/<id>/approve → the approval's thread messages (Mason's\n * approval and the Leader's acknowledgement), readable ones only.\n */\nexport function narrowApprovalThread(raw: unknown): LeaderThreadMessage[] {\n if (!isRecord(raw) || !isRecord(raw['thread'])) return [];\n const t = raw['thread'];\n return [narrowMessage(t['message']), narrowMessage(t['reply'])].filter((m): m is LeaderThreadMessage => m !== null);\n}\n\n// ---------------------------------------------------------------------------\n// Optimistic sends and the merge\n// ---------------------------------------------------------------------------\n\nexport interface PendingMessage {\n /** Local id (\"local-3\"); never a server id. */\n clientId: string;\n kind: 'message' | 'answer';\n text: string;\n /** Local ISO time the send started. */\n at: string;\n replyTo: string | null;\n /** For an answer: the question it answers. */\n questionId: string | null;\n state: 'sending' | 'failed';\n /** Operator sentence for a failed send. */\n error: string | null;\n}\n\nexport type ThreadEntry =\n | { type: 'message'; key: string; at: string; message: LeaderThreadMessage }\n | { type: 'pending'; key: string; at: string; pending: PendingMessage };\n\n/**\n * A server message that is the delivered copy of an optimistic send: from\n * Mason, the same words, not older than the send (allowing CLOCK_SLACK_MS\n * for a server clock a little behind this tab's).\n */\nconst CLOCK_SLACK_MS = 2 * 60_000;\nconst norm = (t: string) => t.replace(/\\s+/g, ' ').trim();\n\nfunction isCopyOf(m: LeaderThreadMessage, p: PendingMessage): boolean {\n if (m.from !== 'mason') return false;\n if (norm(m.text) !== norm(p.text)) return false;\n if (p.kind === 'answer' && p.questionId && m.questionId && m.questionId !== p.questionId) return false;\n return Date.parse(m.at) >= Date.parse(p.at) - CLOCK_SLACK_MS;\n}\n\nconst byTime = (a: { at: string; key: string }, b: { at: string; key: string }) => Date.parse(a.at) - Date.parse(b.at) || 0;\n\n/**\n * Everything known, oldest first, each message once. `pages` are server\n * reads (newest page first or last — order does not matter); `received` are\n * messages this tab got back from a send (its own message and the reply)\n * before the next read; `pending` are sends still in flight or failed.\n */\nexport function mergeThread(\n pages: readonly (readonly LeaderThreadMessage[])[],\n received: readonly LeaderThreadMessage[] = [],\n pending: readonly PendingMessage[] = [],\n): ThreadEntry[] {\n const byId = new Map<string, LeaderThreadMessage>();\n // Server reads win over a send's echo: they are newer (a status may have moved).\n for (const m of received) byId.set(m.id, m);\n for (const page of pages) for (const m of page) byId.set(m.id, m);\n const messages = [...byId.values()];\n const claimed = new Set<string>();\n const live: PendingMessage[] = [];\n for (const p of pending) {\n // A failed send stays until retried or discarded: its words never arrived.\n const copy = p.state === 'sending' ? messages.find((m) => !claimed.has(m.id) && isCopyOf(m, p)) : undefined;\n if (copy) claimed.add(copy.id);\n else live.push(p);\n }\n // Stable: equal times keep server order, and pending sends sit after the messages of their instant.\n const entries: ThreadEntry[] = [\n ...messages.map((message) => ({ type: 'message' as const, key: message.id, at: message.at, message })),\n ...live.map((p) => ({ type: 'pending' as const, key: p.clientId, at: p.at, pending: p })),\n ];\n return entries.map((e, i) => ({ e, i })).sort((x, y) => byTime(x.e, y.e) || x.i - y.i).map(({ e }) => e);\n}\n\n// ---------------------------------------------------------------------------\n// Grouping\n// ---------------------------------------------------------------------------\n\nexport const GROUP_GAP_MS = 5 * 60_000;\n\nexport type ThreadRow =\n | { type: 'day'; key: string; label: string }\n | { type: 'group'; key: string; from: 'mason' | 'leader'; channel: LeaderThreadChannel; at: string; entries: ThreadEntry[] }\n /** A system line (a channel note, an update from `system`), centred and quiet. */\n | { type: 'system'; key: string; entry: ThreadEntry & { type: 'message' } };\n\nfunction entryFrom(e: ThreadEntry): 'mason' | 'leader' {\n return e.type === 'pending' ? 'mason' : e.message.from;\n}\nfunction entryChannel(e: ThreadEntry): LeaderThreadChannel {\n return e.type === 'pending' ? 'verse' : e.message.channel;\n}\n/** Memos and directives are cards and chips: each stands alone, never folded into a run. */\nfunction standsAlone(e: ThreadEntry): boolean {\n return e.type === 'message' && (e.message.kind === 'memo' || e.message.kind === 'directive');\n}\n\nfunction dayKey(t: number): string {\n const d = new Date(t);\n return `${d.getFullYear()}-${d.getMonth()}-${d.getDate()}`;\n}\n\n/** \"Today\", \"Yesterday\", \"Thu, Sep 24\" (local). */\nexport function dayLabel(iso: string, now: number = Date.now()): string {\n const t = Date.parse(iso);\n if (!Number.isFinite(t)) return '—';\n if (dayKey(t) === dayKey(now)) return 'Today';\n if (dayKey(t) === dayKey(now - 86_400_000)) return 'Yesterday';\n const d = new Date(t);\n const sameYear = d.getFullYear() === new Date(now).getFullYear();\n return d.toLocaleDateString('en-US', { weekday: 'short', month: 'short', day: 'numeric', ...(sameYear ? {} : { year: 'numeric' }) });\n}\n\nexport function groupThread(entries: readonly ThreadEntry[], now: number = Date.now()): ThreadRow[] {\n const rows: ThreadRow[] = [];\n let day: string | null = null;\n let run: Extract<ThreadRow, { type: 'group' }> | null = null;\n let lastAt = 0;\n for (const e of entries) {\n const t = Date.parse(e.at);\n const k = dayKey(t);\n if (k !== day) {\n day = k;\n rows.push({ type: 'day', key: `day-${k}`, label: dayLabel(e.at, now) });\n run = null;\n }\n if (e.type === 'message' && e.message.channel === 'system') {\n rows.push({ type: 'system', key: e.key, entry: e });\n run = null;\n continue;\n }\n const from = entryFrom(e);\n const channel = entryChannel(e);\n const joins = run !== null && !standsAlone(e) && !standsAlone(run.entries[run.entries.length - 1]!) && run.from === from && run.channel === channel && t - lastAt <= GROUP_GAP_MS;\n if (joins && run) run.entries.push(e);\n else {\n run = { type: 'group', key: `g-${e.key}`, from, channel, at: e.at, entries: [e] };\n rows.push(run);\n }\n lastAt = t;\n }\n return rows;\n}\n\n// ---------------------------------------------------------------------------\n// Questions\n// ---------------------------------------------------------------------------\n\n/** question message id → the answer that closed it. */\nexport function answeredQuestions(messages: readonly LeaderThreadMessage[]): Map<string, LeaderThreadMessage> {\n const questions = messages.filter((m) => m.kind === 'question');\n const out = new Map<string, LeaderThreadMessage>();\n for (const a of messages) {\n if (a.from !== 'mason' || (a.kind !== 'answer' && !a.replyTo)) continue;\n const q = questions.find((q) => (a.questionId && q.questionId === a.questionId) || (a.replyTo && q.id === a.replyTo));\n if (q && !out.has(q.id)) out.set(q.id, a);\n }\n return out;\n}\n\nexport interface QuestionTarget {\n /** The thread's questionId, `<memoId>:<index>` (question-id.ts derives it from a Needs-you item). */\n questionId: string | null;\n}\n\n/**\n * The question message a target means: the one whose questionId is exactly\n * the target's (the server keys both off `<memoId>:<index>`). Null when the\n * thread does not carry it — the caller then answers as a quoted message.\n */\nexport function findQuestion(messages: readonly LeaderThreadMessage[], target: QuestionTarget): LeaderThreadMessage | null {\n if (!target.questionId) return null;\n return messages.find((m) => m.kind === 'question' && m.questionId === target.questionId) ?? null;\n}\n\n// ---------------------------------------------------------------------------\n// Waiting, previews, words\n// ---------------------------------------------------------------------------\n\n/** How long \"Leader is thinking…\" may show for a send the server said it would answer later. */\nexport const AWAIT_REPLY_MS = 3 * 60_000;\n\n/**\n * True while a send is in flight, or while a message this tab sent (with no\n * inline reply) is still the newest thing Mason said and nothing from the\n * Leader has come after it — for at most AWAIT_REPLY_MS.\n */\nexport function awaitingReply(entries: readonly ThreadEntry[], awaiting: ReadonlySet<string>, now: number = Date.now()): boolean {\n if (entries.some((e) => e.type === 'pending' && e.pending.state === 'sending')) return true;\n for (let i = entries.length - 1; i >= 0; i -= 1) {\n const e = entries[i]!;\n if (e.type !== 'message' || e.message.channel === 'system') continue;\n if (e.message.from === 'leader') return false;\n if (awaiting.has(e.message.id)) return now - Date.parse(e.message.at) < AWAIT_REPLY_MS;\n }\n return false;\n}\n\nexport const CHANNEL_LABEL: Readonly<Record<LeaderThreadChannel, string>> = {\n verse: 'Verse',\n telegram: 'Telegram',\n cli: 'CLI',\n system: 'System',\n};\n\n/** The newest message from the Leader (Command's preview line). */\nexport function latestLeaderMessage(messages: readonly LeaderThreadMessage[]): LeaderThreadMessage | null {\n let best: LeaderThreadMessage | null = null;\n for (const m of messages) {\n if (m.from !== 'leader' || m.channel === 'system') continue;\n if (!best || Date.parse(m.at) >= Date.parse(best.at)) best = m;\n }\n return best;\n}\n\n/**\n * One line of plain text from a message that may be Markdown: fences, marks\n * and link targets dropped, whitespace collapsed, clipped on a word.\n */\nexport function previewText(text: string, max = 140): string {\n const plain = text\n .replace(/```[\\s\\S]*?(```|$)/g, ' ')\n .replace(/!?\\[([^\\]]*)\\]\\([^)]*\\)/g, '$1')\n .replace(/^\\s{0,3}(#{1,6}|>|[-*+]|\\d+\\.)\\s+/gm, '')\n .replace(/[*_`~]+/g, '')\n .replace(/\\s+/g, ' ')\n .trim();\n if (plain.length <= max) return plain;\n const cut = plain.slice(0, max - 1);\n const space = cut.lastIndexOf(' ');\n return `${(space > max * 0.6 ? cut.slice(0, space) : cut).replace(/[\\s,.;:–—-]+$/, '')}…`;\n}\n\n/** \"9:14 AM\" */\nexport function clockTime(iso: string): string {\n const t = Date.parse(iso);\n return Number.isFinite(t) ? new Date(t).toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit' }) : '';\n}\n\n/** Longest message the composer sends (the server may cap lower and say so). */\nexport const LEADER_MESSAGE_MAX = 4_000;\n","/**\n * routes/verse/leader/thread-data.ts — every read and write behind the\n * Leader conversation (Mind) and its preview line (Command). Paths and\n * shapes: thread-types.ts.\n *\n * Reads are OPTIONAL reads (command/surface-data.ts optionalQuery): a server\n * without the conversation routes answers 404, which is \"not in this build\n * yet\" on the card — never a broken Mind. Writes pull the held mutation\n * token (VerseControlLockedError without one; the panel opens the token\n * dialog first) and invalidate exactly what they change.\n */\nimport { apiDelete, apiGet, apiPost } from '../../../data/client.js';\nimport { getMutationToken, touchMutationHold } from '../../../data/auth-store.js';\nimport { invalidate } from '../../../data/cache.js';\nimport { VerseControlLockedError } from '../autonomy/control-queries.js';\nimport { optionalQuery, SURFACE_KEYS } from '../command/surface-data.js';\nimport { refreshActivity } from '../shell/useActivity.js';\nimport { narrowDirective, narrowDirectives, narrowSendResult, narrowThreadPage } from './thread-model.js';\nimport {\n LEADER_ACTIONS_PATH,\n LEADER_DIRECTIVES_PATH,\n LEADER_QUESTIONS_PATH,\n LEADER_THREAD_PATH,\n type LeaderSendResult,\n type LeaderThreadMessage,\n type DirectiveChip,\n} from './thread-types.js';\n\n/** One page: enough for a day of conversation; older pages load on request. */\nexport const THREAD_PAGE_SIZE = 50;\n\nexport const LEADER_THREAD_KEYS = Object.freeze({\n thread: 'verse-leader-thread',\n directives: 'verse-leader-directives',\n});\n\nexport const leaderThreadQuery = optionalQuery(LEADER_THREAD_KEYS.thread, `${LEADER_THREAD_PATH}?limit=${THREAD_PAGE_SIZE}`, 'The Leader conversation', narrowThreadPage);\nexport const leaderDirectivesQuery = optionalQuery(LEADER_THREAD_KEYS.directives, LEADER_DIRECTIVES_PATH, 'Leader directives', narrowDirectives);\n\n/** The page before `beforeId` (the oldest message on screen). Throws like any read. */\nexport async function fetchOlderThread(beforeId: string, signal?: AbortSignal): Promise<LeaderThreadMessage[]> {\n const raw = await apiGet<unknown>(`${LEADER_THREAD_PATH}?limit=${THREAD_PAGE_SIZE}&before=${encodeURIComponent(beforeId)}`, signal);\n return narrowThreadPage(raw)?.messages ?? [];\n}\n\n/**\n * One path segment. The server matches ids on the RAW path (no decoding), so\n * a questionId's `:` (`<memoId>:<index>`) must go as-is — `:` is legal in a\n * path segment; anything else unusual is still escaped.\n */\nexport function pathSegment(id: string): string {\n return encodeURIComponent(id).replace(/%3A/gi, ':');\n}\n\nfunction token(): string {\n const t = getMutationToken();\n if (!t) throw new VerseControlLockedError();\n return t;\n}\n\nasync function post(path: string, body: unknown): Promise<unknown> {\n const result = await apiPost<unknown>(path, body, token());\n touchMutationHold();\n return result;\n}\n\n/**\n * A send the server accepted but answered in a shape this page cannot read\n * is still a send: the next read shows it. Null tells the caller \"refetch\".\n */\nexport async function sendLeaderMessage(text: string, replyTo: string | null = null): Promise<LeaderSendResult | null> {\n const result = narrowSendResult(await post(LEADER_THREAD_PATH, replyTo ? { text, replyTo } : { text }));\n if (result?.directive) invalidate(LEADER_THREAD_KEYS.directives);\n return result;\n}\n\nexport async function answerLeaderQuestion(questionId: string, text: string): Promise<LeaderSendResult | null> {\n const result = narrowSendResult(await post(`${LEADER_QUESTIONS_PATH}/${pathSegment(questionId)}/answer`, { text }));\n // The question's Needs-you row closes with its answer.\n void refreshActivity();\n return result;\n}\n\n/**\n * Approve a class-B action now (skip the window) or a class-C ask.\n * `{ ok, code, outcome, message, action, thread }`: a 409 (nothing to\n * approve, or refused now) throws with the server's `message` as its reason\n * (client.ts readRefusal); the approval and the Leader's acknowledgement\n * reach the conversation through the thread refetch.\n */\nexport async function approveLeaderAction(actionId: string): Promise<unknown> {\n const result = await post(`${LEADER_ACTIONS_PATH}/${pathSegment(actionId)}/approve`, {});\n invalidate(SURFACE_KEYS.leader);\n invalidate(LEADER_THREAD_KEYS.thread);\n void refreshActivity();\n return result;\n}\n\n/**\n * POST /directives → `{ directive, duplicate }` (201 new, 200 when the same\n * words are already in force — either way the chip is there after the refetch).\n */\nexport async function addLeaderDirective(text: string): Promise<DirectiveChip | null> {\n const raw = await post(LEADER_DIRECTIVES_PATH, { text });\n invalidate(LEADER_THREAD_KEYS.directives);\n invalidate(LEADER_THREAD_KEYS.thread);\n const record = raw !== null && typeof raw === 'object' && 'directive' in raw ? (raw as { directive: unknown }).directive : raw;\n return narrowDirective(record);\n}\n\n/** DELETE /directives/<id> → `{ directive }` (now retired). */\nexport async function retireLeaderDirective(id: string): Promise<void> {\n await apiDelete<unknown>(`${LEADER_DIRECTIVES_PATH}/${pathSegment(id)}`, token());\n touchMutationHold();\n invalidate(LEADER_THREAD_KEYS.directives);\n invalidate(LEADER_THREAD_KEYS.thread);\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{r as e}from"./rolldown-runtime-hePW80VL.js";import{n as t,s as n}from"./index-BC5Uslm5.js";import{c as r,o as i,r as a,s as o}from"./VerseMobileApp-ePNuVERe.js";import{t as s}from"./parts.module-CBkHcD6w.js";var c=e(n(),1),l=t(),u={...o,...s},d=u;function f({title:e,trailing:t,footer:n,children:r,flat:i=!1}){let a=(0,c.useId)();return(0,l.jsxs)(`section`,{className:d.section,"aria-labelledby":e?a:void 0,children:[e?(0,l.jsxs)(`div`,{className:d.sectionHeader,children:[(0,l.jsx)(`h2`,{id:a,style:{margin:0,font:`inherit`},children:e}),t]}):null,i?r:(0,l.jsx)(`div`,{className:d.group,children:r}),n?(0,l.jsx)(`p`,{className:d.sectionFooter,children:n}):null]})}function p({title:e,subtitle:t,leading:n,trailing:i,onClick:a,chevron:o=!!a,label:s}){let c=(0,l.jsxs)(l.Fragment,{children:[n?(0,l.jsx)(`span`,{className:d.rowLead,children:n}):null,(0,l.jsxs)(`span`,{className:d.rowBody,children:[(0,l.jsx)(`span`,{className:d.rowTitle,children:e}),t?(0,l.jsx)(`span`,{className:d.rowSub,children:t}):null]}),i||o?(0,l.jsxs)(`span`,{className:d.rowTrail,children:[i,o?(0,l.jsx)(r,{size:14,className:d.chevron}):null]}):null]});return a?(0,l.jsx)(`button`,{type:`button`,className:d.row,onClick:a,"aria-label":s,children:c}):(0,l.jsx)(`div`,{className:d.row,children:c})}function m({tone:e=`neutral`,dot:t=!1,pulse:n=!1,children:r}){return(0,l.jsxs)(`span`,{className:i(d.badge,d[`tone-${e}`]),children:[t?(0,l.jsx)(`span`,{className:i(d.dot,n&&d.pulse),"aria-hidden":`true`}):null,r]})}function h(e){return e===null?`unknown`:e>=90?`danger`:e>=70?`warning`:`ok`}function g({label:e,percent:t,valueText:n,note:r}){let i=t===null?null:Math.max(0,Math.min(100,t)),a=n??(i===null?`unknown`:`${Math.round(i)}% used`);return(0,l.jsxs)(`div`,{className:d.meter,children:[(0,l.jsxs)(`div`,{className:d.meterHead,children:[(0,l.jsx)(`span`,{className:d.meterLabel,children:e}),(0,l.jsx)(`span`,{className:d.meterValue,children:a})]}),(0,l.jsx)(`div`,{className:d.meterTrack,role:`meter`,"aria-label":typeof e==`string`?e:void 0,"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":i??void 0,"aria-valuetext":a,children:(0,l.jsx)(`div`,{className:d.meterFill,"data-tone":h(i),style:{width:`${i??0}%`}})}),r?(0,l.jsx)(`span`,{className:d.meterNote,children:r}):null]})}function _({tone:e=`warning`,children:t}){return(0,l.jsx)(`div`,{className:d.banner,"data-tone":e,role:e===`danger`?`alert`:`status`,children:t})}function v({title:e,body:t,action:n}){return(0,l.jsxs)(`div`,{className:d.empty,children:[(0,l.jsx)(`p`,{className:d.emptyTitle,children:e}),t?(0,l.jsx)(`p`,{className:d.emptyBody,children:t}):null,n]})}function y({title:e,reason:t,onRetry:n}){return(0,l.jsxs)(`div`,{className:d.empty,role:`alert`,children:[(0,l.jsx)(`p`,{className:d.emptyTitle,children:e}),t?(0,l.jsx)(`p`,{className:d.emptyBody,children:t}):null,n?(0,l.jsx)(a,{variant:`tinted`,onClick:n,children:`Try again`}):null]})}export{g as a,u as c,y as i,_ as n,p as o,v as r,f as s,m as t};
2
+ //# sourceMappingURL=ui-parts-wvov2ktB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ui-parts-wvov2ktB.js","names":[],"sources":["../../../../../../src/web-ui/routes/verse/mobile/ui-parts.tsx"],"sourcesContent":["/**\n * routes/verse/mobile/ui-parts.tsx — inset-grouped lists, badges, meters,\n * banners and the empty / error states every phone screen shares (styling:\n * ui.module.css). Off the first paint: the Home frame needs none of them.\n */\nimport { useId, type ReactNode } from 'react';\nimport { ChevronGlyph } from './mobile-icons.js';\nimport partStyles from './parts.module.css';\nimport { Button, cx, ui as coreStyles } from './ui.js';\n\n/** Every phone class: the frame's (ui.module.css) and the parts' (parts.module.css). */\nexport const ui: Readonly<Record<string, string>> = { ...coreStyles, ...partStyles };\nconst styles = ui;\n\n// ---------------------------------------------------------------------------\n// Lists\n// ---------------------------------------------------------------------------\n\nexport function Section({ title, trailing, footer, children, flat = false }: { title?: ReactNode; trailing?: ReactNode; footer?: ReactNode; children: ReactNode; flat?: boolean }) {\n const id = useId();\n return (\n <section className={styles.section} aria-labelledby={title ? id : undefined}>\n {title ? (\n <div className={styles.sectionHeader}>\n <h2 id={id} style={{ margin: 0, font: 'inherit' }}>{title}</h2>\n {trailing}\n </div>\n ) : null}\n {flat ? children : <div className={styles.group}>{children}</div>}\n {footer ? <p className={styles.sectionFooter}>{footer}</p> : null}\n </section>\n );\n}\n\nexport interface RowProps {\n title: ReactNode;\n subtitle?: ReactNode;\n leading?: ReactNode;\n trailing?: ReactNode;\n onClick?: () => void;\n chevron?: boolean;\n /** Accessible name when the visible title is not enough. */\n label?: string;\n}\n\nexport function Row({ title, subtitle, leading, trailing, onClick, chevron = Boolean(onClick), label }: RowProps) {\n const body = (\n <>\n {leading ? <span className={styles.rowLead}>{leading}</span> : null}\n <span className={styles.rowBody}>\n <span className={styles.rowTitle}>{title}</span>\n {subtitle ? <span className={styles.rowSub}>{subtitle}</span> : null}\n </span>\n {trailing || chevron ? (\n <span className={styles.rowTrail}>\n {trailing}\n {chevron ? <ChevronGlyph size={14} className={styles.chevron} /> : null}\n </span>\n ) : null}\n </>\n );\n if (!onClick) return <div className={styles.row}>{body}</div>;\n return (\n <button type=\"button\" className={styles.row} onClick={onClick} aria-label={label}>\n {body}\n </button>\n );\n}\n\n// ---------------------------------------------------------------------------\n// Status\n// ---------------------------------------------------------------------------\n\nexport type Tone = 'running' | 'success' | 'warning' | 'danger' | 'info' | 'neutral';\n\nexport function Badge({ tone = 'neutral', dot = false, pulse = false, children }: { tone?: Tone; dot?: boolean; pulse?: boolean; children: ReactNode }) {\n return (\n <span className={cx(styles.badge, styles[`tone-${tone}`])}>\n {dot ? <span className={cx(styles.dot, pulse && styles.pulse)} aria-hidden=\"true\" /> : null}\n {children}\n </span>\n );\n}\n\nexport interface MeterProps {\n label: ReactNode;\n /** 0–100; null = unknown (an empty track and \"unknown\", never 0%). */\n percent: number | null;\n /** Right-hand text; defaults to the percent. */\n valueText?: string;\n note?: ReactNode;\n}\n\nexport function meterTone(percent: number | null): 'ok' | 'warning' | 'danger' | 'unknown' {\n if (percent === null) return 'unknown';\n if (percent >= 90) return 'danger';\n if (percent >= 70) return 'warning';\n return 'ok';\n}\n\nexport function Meter({ label, percent, valueText, note }: MeterProps) {\n const clamped = percent === null ? null : Math.max(0, Math.min(100, percent));\n const text = valueText ?? (clamped === null ? 'unknown' : `${Math.round(clamped)}% used`);\n return (\n <div className={styles.meter}>\n <div className={styles.meterHead}>\n <span className={styles.meterLabel}>{label}</span>\n <span className={styles.meterValue}>{text}</span>\n </div>\n <div\n className={styles.meterTrack}\n role=\"meter\"\n aria-label={typeof label === 'string' ? label : undefined}\n aria-valuemin={0}\n aria-valuemax={100}\n aria-valuenow={clamped ?? undefined}\n aria-valuetext={text}\n >\n <div className={styles.meterFill} data-tone={meterTone(clamped)} style={{ width: `${clamped ?? 0}%` }} />\n </div>\n {note ? <span className={styles.meterNote}>{note}</span> : null}\n </div>\n );\n}\n\nexport function Banner({ tone = 'warning', children }: { tone?: 'warning' | 'danger' | 'info'; children: ReactNode }) {\n return (\n <div className={styles.banner} data-tone={tone} role={tone === 'danger' ? 'alert' : 'status'}>\n {children}\n </div>\n );\n}\n\nexport function EmptyState({ title, body, action }: { title: string; body?: ReactNode; action?: ReactNode }) {\n return (\n <div className={styles.empty}>\n <p className={styles.emptyTitle}>{title}</p>\n {body ? <p className={styles.emptyBody}>{body}</p> : null}\n {action}\n </div>\n );\n}\n\nexport function ErrorState({ title, reason, onRetry }: { title: string; reason: string | null; onRetry?: () => void }) {\n return (\n <div className={styles.empty} role=\"alert\">\n <p className={styles.emptyTitle}>{title}</p>\n {reason ? <p className={styles.emptyBody}>{reason}</p> : null}\n {onRetry ? <Button variant=\"tinted\" onClick={onRetry}>Try again</Button> : null}\n </div>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import{i as e,t}from"./global-w7KDTTi0.js";var n=`2.1.280`;function r(e){return typeof e==`object`&&e&&!Array.isArray(e)?e:null}function i(e,t){let n=e[t];return typeof n==`string`&&n.length>0?n:null}function a(e,t){let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:null}function o(e,t,n=!1){let r=e[t];return typeof r==`boolean`?r:n}function s(e){return Array.isArray(e)?e:[]}var c=/(launcher\.mjs|native-profiles|account-connections|console-startup|\/\.ashlr\b|Bearer\s|--token\b)/i;function l(e){if(typeof e!=`string`)return null;let t=e.trim();return t.length===0||t.length>200||c.test(t)||/[\r\n]/.test(t)?null:t}function u(e){return e===null?null:Math.max(0,Math.min(100,e))}function d(e){let t=r(e);if(!t)return null;let n=i(t,`id`)??i(t,`label`);if(n===null)return null;let s=r(t.nativeReport),c=o(t,`limitReached`)||o(t,`rateLimitReached`),l=t.measured;return{id:n,label:i(t,`label`),usedPercent:u(a(t,`usedPercent`)??a(t,`used_percent`)),resetsAt:i(t,`resetsAt`)??i(t,`resets_at`),resetDescription:(s?i(s,`resetDescription`):null)??i(t,`resetDescription`),limitReached:c,measured:typeof l==`boolean`?l:!c}}function f(e){let t=r(e);if(!t)return null;let n=i(t,`balance`),s=n===null?a(t,`balance`):Number.parseFloat(n);return{hasCredits:o(t,`hasCredits`)||o(t,`has_credits`),unlimited:o(t,`unlimited`),balance:n,balanceValue:typeof s==`number`&&Number.isFinite(s)?s:null}}var p=[`claude`,`codex`,`grok`];function m(e){let t=r(e);if(!t)return null;let n=i(t,`id`),a=i(t,`provider`);if(n===null||a===null||!p.includes(a))return null;let o=s(t.windows).map(d).filter(e=>e!==null),c=i(t,`state`),u=i(t,`authentication`),m=r(t.unsupported);return{id:n,label:i(t,`label`)??n,provider:a,state:c===`checking`||c===`observed`||c===`signed-out`||c===`unavailable`?c:`unavailable`,authentication:u===`signed-in`||u===`signed-out`?u:`unknown`,health:i(t,`health`),planType:i(t,`planType`)??i(t,`plan_type`),observedAt:i(t,`observedAt`),windows:o,binding:d(t.binding),credits:f(t.credits),reason:i(t,`reason`),unsupported:h(t,m),reconnectCommand:l(t.reconnectCommand),notes:s(t.notes).filter(e=>typeof e==`string`)}}function h(e,t){if(t)return{code:i(t,`code`)??`usage-version-unsupported`,pinnedVersion:i(t,`pinnedVersion`)??i(t,`version`)};let r=i(e,`reason`);return r===`usage-version-unsupported`?{code:r,pinnedVersion:n}:null}function g(e){let t=i(e,`collectorNote`);if(t)return t;let n=r(e.collector);return!n||i(n,`owner`)!==`another-collector`?null:i(n,`note`)??`Another collector process owns the quota-refresh lease, so these readings are read-only and may be staler than this server’s poll interval.`}function _(e){let t=r(e);if(!t)return null;let n=Array.isArray(t.accounts)?t.accounts:Array.isArray(e)?e:null;return n===null?null:{sampledAt:i(t,`sampledAt`),refreshing:o(t,`refreshing`),accounts:n.map(m).filter(e=>e!==null),collectorNote:g(t)}}function v(e){let t=r(e);if(!t)return null;let n=i(t,`day`);return n===null||!/^\d{4}-\d{2}-\d{2}$/.test(n)?null:{day:n,tokensIn:a(t,`tokensIn`)??0,tokensOut:a(t,`tokensOut`)??0,estCostUsd:a(t,`estCostUsd`)??0,sessions:a(t,`sessions`)??0,cacheRead:a(t,`cacheRead`),cacheWrite:a(t,`cacheWrite`),cacheHitRate:a(t,`cacheHitRate`)}}function y(e,t){let n=r(e),a=n?Array.isArray(n.byDay)?n.byDay:Array.isArray(n.days)?n.days:null:Array.isArray(e)?e:null;if(a===null)return null;let c=n?i(n,`window`):null;return{window:c===`7d`||c===`30d`?c:t,days:a.map(v).filter(e=>e!==null).sort((e,t)=>e.day.localeCompare(t.day)),generatedAt:n?i(n,`generatedAt`):null,estimated:!n||o(n,`estimated`,!0),caveats:n?s(n.caveats).filter(e=>typeof e==`string`):[]}}function b(e,t){let n=r(e);if(!n)return null;let s=i(n,`label`)??i(n,`id`)??i(n,`name`)??i(n,`model`);if(s===null)return null;let c=n.capabilities,l=i(n,`state`),d=n.supportsTools,f=a(n,`nativeContextLength`)??a(n,`nativeContext`),p=a(n,`contextLength`)??a(n,`configuredContext`),m=i(n,`placement`);return{name:s,runtime:t,loaded:l===null?o(n,`loaded`)||o(n,`resident`):l===`loaded`,sizeBytes:a(n,`sizeBytes`)??a(n,`size`),sizeVramBytes:a(n,`sizeVramBytes`)??a(n,`size_vram`),placement:m===`gpu`||m===`cpu`||m===`split`?m:`unknown`,gpuPercent:u(a(n,`gpuPercent`)),memoryPercent:u(a(n,`memoryPercent`)),family:i(n,`family`),arch:i(n,`arch`),expiresAt:i(n,`expiresAt`)??i(n,`expires_at`),parameterSize:i(n,`parameterSize`)??i(n,`parameter_size`),quantization:i(n,`quantization`)??i(n,`quantization_level`),nativeContext:f,configuredContext:p!==null&&f!==null&&p===f?null:p,capabilities:Array.isArray(c)?c.filter(e=>typeof e==`string`):null,supportsTools:typeof d==`boolean`?d:null}}function x(e,t){let n=r(e);if(!n)return null;let s=Array.isArray(n.models)?n.models:null;if(s===null)return null;let c=s.map(e=>b(e,t)).filter(e=>e!==null),l=o(n,`stale`),u=r(n.detailInspection),d=u?a(u,`attempted`):null,f=u?a(u,`pending`):null,p=d!==null&&f!==null&&Number.isInteger(d)&&Number.isInteger(f)&&d>=0&&f>0&&d+f===c.length?{attempted:d,pending:f}:void 0;return{models:c,status:{runtime:t,reachable:o(n,`reachable`),reason:i(n,`reason`),stale:l,staleForMs:l?a(n,`staleForMs`):null,modelCount:c.length,...p?{detailInspection:p}:{}}}}function S(e){let t=r(e);if(!t)return null;let n=x(t.ollama,`ollama`),c=x(t.lmStudio??t.lmstudio,`lmstudio`);if(n!==null||c!==null){let e=[n,c].filter(e=>e!==null),o=e.some(e=>e.status.reachable),l=r(t.machine);return{reachable:o,models:e.flatMap(e=>e.models),memoryBudgetBytes:(l?a(l,`totalMemoryBytes`):null)??a(t,`memoryBudgetBytes`)??a(t,`memoryBudget`),freeMemoryBytes:l?a(l,`freeMemoryBytes`):null,reason:o?null:e.map(e=>e.status.reason).find(e=>e!==null)??null,runtimes:e.map(e=>e.status),notes:s(t.notes).filter(e=>typeof e==`string`),sampledAt:i(t,`sampledAt`)}}let l=Array.isArray(t.models)?t.models:null;return l===null?null:{reachable:o(t,`reachable`,!0),models:l.map(e=>b(e,null)).filter(e=>e!==null),memoryBudgetBytes:a(t,`memoryBudgetBytes`)??a(t,`memoryBudget`),freeMemoryBytes:a(t,`freeMemoryBytes`),reason:i(t,`reason`),runtimes:[],notes:s(t.notes).filter(e=>typeof e==`string`),sampledAt:i(t,`sampledAt`)}}var C=`verse-usage-frontier`,w=`verse-usage-control`,T={key:C,fetch:t=>e(`/api/usage`,t)};function E(e){return e instanceof t?e.status===404?`This server does not expose /api/verse/control, so configured caps and today’s spend are unavailable here.`:`Configured caps unavailable (HTTP ${e.status}).`:`Configured caps unavailable: the request failed.`}var D={key:w,fetch:async n=>{try{return{raw:await e(`/api/verse/control`,n),available:!0,reason:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{raw:null,available:!1,reason:E(e)}}}},O=`verse-usage-accounts`,k=`verse-usage-local-models`,A=`verse-usage-series`;function j(e,n){return n instanceof t?n.status===404?`This server does not expose ${e} yet, so this panel has no source.`:`${e} answered HTTP ${n.status}.`:`${e} could not be reached.`}function M(n){return async r=>{try{return{raw:await e(n,r),available:!0,reason:null}}catch(e){if(e instanceof t&&e.status===401||e instanceof DOMException&&e.name===`AbortError`)throw e;return{raw:null,available:!1,reason:j(n,e)}}}}var N={key:O,fetch:M(`/api/verse/accounts`)},P=[350,1200],F=M(`/api/verse/local-models`);function I(e){if(!e.available)return!1;let t=S(e.raw);return t!==null&&!t.reachable}function L(e,t){return new Promise((n,r)=>{if(t?.aborted){r(new DOMException(`Aborted`,`AbortError`));return}let i=()=>{clearTimeout(a),r(new DOMException(`Aborted`,`AbortError`))},a=setTimeout(()=>{t?.removeEventListener(`abort`,i),n()},e);t?.addEventListener(`abort`,i,{once:!0})})}var R={key:k,fetch:async e=>{let t=await F(e);for(let n of P){if(!I(t))return t;await L(n,e),t=await F(e)}return t}},z={"7d":{key:`${A}:7d`,fetch:M(`/api/verse/usage-series?window=7d`)},"30d":{key:`${A}:30d`,fetch:M(`/api/verse/usage-series?window=30d`)}};function B(e){return z[e]}export{R as a,y as c,D as i,B as n,_ as o,N as r,S as s,T as t};
2
+ //# sourceMappingURL=usage-queries-nZjJ1aky.js.map